uz
Feedback
ToCode

ToCode

Kanalga Telegramโ€™da oโ€˜tish

ื˜ื™ืคื™ื ืงืฆืจื™ื ืœืžืชื›ื ืชื™ื ืžืืช ื™ื ื•ืŸ ืคืจืง

Ko'proq ko'rsatish
1 419
Obunachilar
Ma'lumot yo'q24 soatlar
Ma'lumot yo'q7 kunlar
+130 kunlar
Postlar arxiv
ToCode
1 419
# ืื™ืš ืœื”ืฉืชืžืฉ ื‘ Web Worker ื›ื“ื™ ืœืฉืคืจ ื‘ื™ืฆื•ืขื™ื ื‘ืงื•ืžืคื•ื ื ื˜ืช ืจื™ืืงื˜ ืจื•ื‘ ื”ื–ืžืŸ ื™ื™ืฉื•ืžื™ Front End ืœื ืขื•ืฉื™ื ืขื‘ื•ื“ื” ื—ื™ืฉื•ื‘ื™ืช ื™ื•ืชืจ ืžื“ื™ ืงืฉื”, ื•ืœื›ืŸ ืืช ืจื•ื‘ ืฉื™ืคื•ืจื™ ื”ื‘ื™ืฆื•ืขื™ื ื‘ืจื™ืืงื˜ ืืคืฉืจ ืœืคืชื•ืจ ืขื ืฆืžืฆื•ื ืงืจื™ืื•ืช ืžื”ืฉืจืช ืื• ืฆืžืฆื•ื render-ื™ื. ืื‘ืœ ืžื“ื™ ืคืขื ื›ืŸ ื™ืฉ ืœื ื• ืงื•ืžืคื•ื ื ื˜ื” ืฉืฆืจื™ื›ื” ืœืขืฉื•ืช ืขื‘ื•ื“ื” ื—ื™ืฉื•ื‘ื™ืช, ื•ื›ืฉื–ื” ืงื•ืจื” ื›ื“ืื™ ืœื“ืขืช ืžื” ืœืขืฉื•ืช - ื•ื”ืชืฉื•ื‘ื” ื”ืคืฉื•ื˜ื” ื”ื™ื Web Worker. ื ื™ืงื— ืœื“ื•ื’ืžื” ืืช ื”ืงื•ืžืคื•ื ื ื˜ื” ื”ื‘ืื” ืฉืžืฆื™ื’ื” ืืช ืžืกืคืจ ื”ืžืกืคืจื™ื ื”ืจืืฉื•ื ื™ื™ื ืขื“ ืžื™ืœื™ื•ืŸ:
import { useState } from 'react';

function isPrime(n) {
  for (let i=2; i < n/2; i++) {
    if (n % i === 0) {
      return false;
    }
  }
  return true;
}

function calculatePrimesUntilMillion() {
  let count = 0;
  console.log('Start');

  for (let i=2; i < 1000000; i++) {
    if (isPrime(i)) {
      count += 1;
    }
  }
  console.log('Ready');
  return count;
}

function App() {
  const [_, forceRender] = useState(0);

  return (
    <div className="App">
      <p>There are {calculatePrimesUntilMillion()} prime numbers &lt; 1,000,000</p>
      <button onClick={() => forceRender(v => !v)}>Calculate again</button>
    </div>
  );
}

export default App;
ืื ื™ ื›ืชื‘ืชื™ ืœื‘ื“ ืืช ื”ืงื•ื“ ืฉืกื•ืคืจ ื•ืื ื™ ืืขืฉื” ืœื›ื ืกืคื•ื™ืœืจ - ื–ืืช ืžืžืฉ ืœื ื”ื“ืจืš ื”ื›ื™ ื™ืขื™ืœื” ืœืกืคื•ืจ ืžืกืคืจื™ื ืจืืฉื•ื ื™ื™ื. ืœืžืขืฉื” ื”ื™ื ืžืกืคื™ืง ืœื ื™ืขื™ืœื” ื›ื“ื™ ืฉืื ืชืจื™ืฆื• ืืช ื”ืงื•ืžืคื•ื ื ื˜ื” ื”ื–ืืช ืขืœ ื”ืžื—ืฉื‘ ืชื•ื›ืœื• ืœื”ืจื’ื™ืฉ ื›ืžื” ืฉื ื™ื•ืช ื˜ื•ื‘ื•ืช ืฉื”ื“ืคื“ืคืŸ ืžืžืฉ "ืชืงื•ืข", ื•ืืคื™ืœื• ืœื ืžื’ื™ื‘ ื›ืฉืžืฉื ื™ื ืืช ื’ื•ื“ืœ ื”ื—ืœื•ืŸ. ืื ื™ื”ื™ื” ืœื›ื ืžื–ืœ ืชืงื‘ืœื• ืžื›ืจื•ื ืืช ื”ื”ื•ื“ืขื” ืฉื”ื˜ืื‘ ื ืชืงืข ื•ื”ื•ื ืžืฆื™ืข ืœื›ื ืœืกื’ื•ืจ ืื•ืชื•. ื›ืœ ื–ื” ืงื•ืจื” ื‘ื’ืœืœ ืฉืœืคื•ื ืงืฆื™ื” calculatePrimesUntilMillion ืœื•ืงื— ื™ื•ืชืจ ืžื“ื™ ื–ืžืŸ ืœืจื•ืฅ, ื•ื‘ื–ืžืŸ ื”ื–ื” ื”ื™ื ืชื•ืงืขืช ืืช ื›ืœ ืžืžืฉืง ื”ืžืฉืชืžืฉ. ื‘ืจื•ืจ ืฉื”ื“ืจืš ื”ื›ื™ ื˜ื•ื‘ื” ืœืคืชื•ืจ ืืช ื”ื‘ืขื™ื” ื‘ืžืงืจื” ื”ื–ื” ื”ื™ื ืœืชืงืŸ ืืช ื”ืงื•ื“ ื›ืš ืฉื™ืจื•ืฅ ื™ื•ืชืจ ืžื”ืจ, ืื‘ืœ ื‘ืžืงืจื” ื”ื›ืœืœื™ ืœืคืขืžื™ื ืืชื ื‘ืืžืช ืฆืจื™ื›ื™ื ืœืขืฉื•ืช ื”ืจื‘ื” ืขื‘ื•ื“ื”. ื‘ืฉื‘ื™ืœ ื–ื” ื‘ื“ื™ื•ืง ื™ืฉ ืœื ื• ืืช ื” Web Worker. ื•ื•ื‘ ื•ื•ืจืงืจ ื”ื•ื ื“ืจืš ืœื”ืคืขื™ืœ ืงื•ื“ ื—ื™ืฉื•ื‘ื™ ื‘ Thread ืื—ืจ ื•ืœืงื‘ืœ ืžืžื ื• ืชืฉื•ื‘ื”. ื‘ืจื™ืืงื˜ ืื ื—ื ื• ื ืฉืชืžืฉ ื‘ useEffect ื›ื“ื™ ืœืฉืœื•ื— ื”ื•ื“ืขื” ืœ Worker ืฉืœื ื•, ื” Worker ื™ืขืฉื” ืืช ื”ื—ื™ืฉื•ื‘ ื‘ืฆื•ืจื” ืืกื™ื ื›ืจื•ื ื™ืช ื•ื‘ืกื•ืฃ ื ืฉืชืžืฉ ื‘ืžืฉืชื ื” State ื›ื“ื™ ืœืฉืžื•ืจ ืืช ื”ืชื•ืฆืื” ื•ืœื”ืฆื™ื’ ืื•ืชื”. ื‘ืขืฆื Web Worker ื™ื”ืคื•ืš ืืช ื”ืงื•ื“ ืฉืœื ื• ืžื›ื–ื” ืฉ"ืชื•ืงืข" ืืช ื”ื“ืคื“ืคืŸ ืœืงื•ื“ ืืกื™ื ื›ืจื•ื ื™ ืจื’ื™ืœ ืฉืžื—ื›ื” ืœืžืฉื”ื• ืฉื™ืงืจื”. ืื ื™ ืžืฉืชืžืฉ ื‘ create-react-app ื‘ื’ื™ืจืกื” ื”ื—ื“ืฉื” ื‘ื™ื•ืชืจ ื•ื”ื•ื ืžืฉืชืžืฉ ื‘ webpack 5 ื•ืฉื ื”ืชืžื™ื›ื” ืž Web Worker ื”ื™ื ืžื•ื‘ื ื™ืช. ื‘ืฉื‘ื™ืœ ืœื”ืคื•ืš ืืช ื”ืคืจื•ื™ืงื˜ ืฉืœื™ ืœื”ืฉืชืžืฉ ื‘ Web Worker ืื ื™ ืฆืจื™ืš: 1. ืœื™ืฆื•ืจ ืงื•ื‘ืฅ ื—ื“ืฉ ื‘ืฉื primes.js ืขื ื”ืชื•ื›ืŸ ื”ื‘ื:
function isPrime(n) {
  for (let i=2; i < n/2; i++) {
    if (n % i === 0) {
      return false;
    }
  }
  return true;
}

function calculatePrimesUntilMillion() {
  let count = 0;
  console.log('Start');

  for (let i=2; i < 1000000; i++) {
    if (isPrime(i)) {
      count += 1;
      postMessage({ count });
    }
  }
  console.log('Ready');
  return count;
}

onmessage = function(_ev) {
  const count = calculatePrimesUntilMillion();
  postMessage({ count });
}

2. ืœืขื“ื›ืŸ ืืช ืงื•ื“ ื”ืงื•ืžืคื•ื ื ื˜ื” ื›ื“ื™ ืœื˜ืขื•ืŸ ืืช ื” Worker:
const worker = new Worker(new URL('./primes.js', import.meta.url));
ืœืขื“ื›ืŸ ืืช ื”ืงื•ืžืคื•ื ื ื˜ื” ืขืฆืžื” ื›ืš ืฉืชืฉืชืžืฉ ื‘ Worker, ื›ืœื•ืžืจ ืชืฉืœื— ืœื• ื”ื•ื“ืขื•ืช ื•ืชืงื‘ืœ ืžืžื ื• ืขื“ื›ื•ื ื™ื:
function App() {
  const [forceRender, setForceRender] = useState(0);
  const [primesCount, setPrimesCount] = useState(0);

  useEffect(() => {
    worker.onmessage = function(ev) {
      setPrimesCount(ev.data.count);
    };

    worker.postMessage({});
  }, [forceRender]);

  return (
    <div className="App">
      <p>There are {primesCount} prime numbers &lt; 1,000,000</p>
      <button onClick={() => setForceRender(v => !v)}>Calculate again</button>
    </div>
  );
}
ื‘ื”ืคืขืœื” ื‘ื’ื™ืจืกื” ื”ื—ื“ืฉื” ืœื ืจืง ืฉื”ื“ืคื“ืคืŸ ืžืžืฉื™ืš ืœื”ื’ื™ื‘ ื‘ื–ืžืŸ ื”ื—ื™ืฉื•ื‘, ืืœื ืฉืื ื—ื ื• ื’ื ืจื•ืื™ื ืืช ื”ืžืกืคืจื™ื ืขื•ืœื™ื - ื›ื™ ื›ืœ ืคืขื ืฉื” Worker ืžื•ืฆื ืžืกืคืจ ืจืืฉื•ื ื™ ื—ื“ืฉ ื”ื•ื ืฉื•ืœื— Post Message ืฉืžื’ื™ืข ืœืงื•ืžืคื•ื ื ื˜ื” ื•ื’ื•ืจื ืœืขื“ื›ื•ืŸ ื”ืžืฉืชื ื” primesCount. ืื ืืชื ืขื•ื‘ื“ื™ื ื‘ื’ื™ืจืกืื•ืช ื™ืฉื ื•ืช ื™ื•ืชืจ ืฉืœ create-react-app ืื• ื•ื•ื‘ืคืืง, ืฉื•ื•ื” ืœื‘ื“ื•ืง ืืช ื”ืกืคืจื™ื” https://github.com/developit/workerize-loader ืฉืžืืคืฉืจืช ืœื˜ืขื•ืŸ Web Worker ื’ื ื‘ื•ื•ื‘ืคืืง 4.

ToCode
1 419
# ืžืขืœื” ื”ื™ืœื•ืš ื›ืฉืื ื—ื ื• ืžืงืฉื™ื‘ื™ื ืœืžื” ืฉืงื•ืจื” ื‘ืชืขืฉื™ื” ืื• ืžืกืชื›ืœื™ื ื‘ืจืฉืช ืขืœ ื›ืœ ืžื™ื ื™ Best Practices ืื ื—ื ื• ืขืœื•ืœื™ื ืœื˜ืขื•ืช ื•ืœื—ืฉื•ื‘ ืฉ- 1. ื›ื•ืœื ื›ื•ืชื‘ื™ื Micro Services, ืžื•ื ื•ืœื™ื˜ ื–ื” ืžื™ื•ืฉืŸ. 2. ืืฆืœ ื›ื•ืœื ื™ืฉ ื‘ื“ื™ืงื•ืช (ื™ื—ื™ื“ื” + ืงืฆื” ืœืงืฆื”). 3. ื›ื•ืœื ืขื•ื‘ื“ื™ื ืขื ื”ื’ื™ืจืกืื•ืช ื”ื—ื“ืฉื•ืช ื‘ื™ื•ืชืจ ืฉืœ ื”ืชืœื•ื™ื•ืช, ืžืชืงื™ื ื™ื ื˜ืœืื™ ืื‘ื˜ื—ื” ื‘ื–ืžืŸ ื•ืžื‘ืฆืขื™ื Pen Testing ืœืคื™ ื”ื•ืจืื•ืช ื”ื™ืฆืจืŸ. 4. ืœื›ื•ืœื ื™ืฉ ื’ื™ื‘ื•ื™ื™ื ืžืชื•ืงืชืงื™ื ื•ืคืขื ื‘ื—ื•ื“ืฉ ื”ื ืขื•ืฉื™ื ืชืจื’ื™ืœ ืฉื—ื–ื•ืจ ืžื’ื™ื‘ื•ื™. 5. ื›ื•ืœื ืžืฉืชืžืฉื™ื ื‘ CI ื•ืžื—ื–ื™ืงื™ื ืžื ื’ื ื•ืŸ Deployment ืื•ื˜ื•ืžื˜ื™ ืฉื™ื•ื“ืข ืœื”ืจื™ืฅ ืืช ื”ื‘ื“ื™ืงื•ืช ื•ืœื”ืขื‘ื™ืจ ื’ื™ืจืกืื•ืช ืœืคืจื•ื“ืงืฉืŸ ืœืœื ืžื’ืข ื™ื“. 6. ืœื›ื•ืœื ื™ืฉ ืžืขืจื›ื•ืช ื ื™ื˜ื•ืจ ืžืชื•ื—ื›ืžื•ืช ืฉืžื–ื”ื•ืช ืคื™ืจืฆื•ืช ืœืฉืจืชื™ื ื‘ื–ืžืŸ ืืžืช. 7. ื›ื•ืœื ืžื—ื–ื™ืงื™ื ืชื™ืขื•ื“ ืขื“ื›ื ื™ ืฉืœ ื”ืžืขืจื›ืช ื›ืš ืฉืžืชื›ื ืชื™ื ื—ื“ืฉื™ื ื™ื›ื•ืœื™ื ื‘ืงืœื•ืช ืœื”ื™ื›ื ืก ืœืงื•ื“. 8. ื›ื•ืœื ืžื•ื—ืงื™ื ืงื•ื“ ืฉืœื ืžืฉืชืžืฉื™ื ื‘ื•. 9. ื›ื•ืœื ืฉื•ืœื˜ื™ื ื‘ื˜ื›ื ื•ืœื•ื’ื™ื•ืช ื‘ื”ืŸ ื”ื ืขื•ื‘ื“ื™ื. ืื ื™ ื‘ื˜ื•ื— ืฉื™ืฉ ืžืชื›ื ืชื™ื ืฉื™ื›ื•ืœื™ื ืœืกืžืŸ "ื•ื™" ืขืœ ื›ืœ ื”ืจืฉื™ืžื” ื›ืืŸ, ืื‘ืœ ื”ืืžืช ืฉืžืขื•ืœื ืœื ืคื’ืฉืชื™ ืื•ืชื. ื”ืžื˜ืจื” ืฉืœ ื›ืœ ื”ื›ืชื‘ื•ืช ื”ืืœื” ื‘ืื™ื ื˜ืจื ื˜ ื”ื™ื ืœื ืฉื ืจื’ื™ืฉ ืจืข, ืืœื ืฉืชืžื™ื“ ื™ื”ื™ื” ืœื ื• ืžื•ืœ ื”ืขื™ื ื™ื™ื ืจืขื™ื•ืŸ ืœืฆืขื“ ื”ื‘ื. ืื‘ืœ ื–ื” ืœื ืื•ืžืจ ืฉื—ื™ื™ื‘ื™ื ืขื›ืฉื™ื• ืœืงื—ืช ืื•ืชื•. ืœื›ืœ ืกืขื™ืฃ ื›ืืŸ ื™ืฉ ืขืœื•ืช. ื›ืžื• ืฉืื™ ืืคืฉืจ ืœื”ืชื—ื™ืœ ื ืกื™ืขื” ื‘ื”ื™ืœื•ืš ื—ืžื™ืฉื™, ื’ื ืคืจื•ื™ืงื˜ ืฆืจื™ืš ืืช ื”ืงืฆื‘ ื•ื”ื–ืžืŸ ืฉืœื•. ืขื“ ืฉืฆื•ื‘ืจื™ื ืžื”ื™ืจื•ืช ืžืกืคื™ืง ืœื”ืฉืื™ืจ ืืช ื”ืจืฉื™ืžื” ืžื•ืœ ื”ืขื™ื ื™ื™ื ื•ืœื”ื—ืœื™ื˜ ืขื ืขืฆืžื›ื ื•ืžืจืืฉ ืžื” ื™ื”ื™ื” ื”ื”ื™ืœื•ืš ื”ื‘ื.

ToCode
1 419
# ื”ื›ื— ืœืงื•ื ื‘ื‘ื•ืงืจ ื‘ืฉื‘ื™ืœ ืœืœืžื•ื“ ืžืฉื”ื• ื—ื“ืฉ, ืœื‘ื ื•ืช ืžืฉื”ื• ื—ื“ืฉ ืื• ืœืืžืฅ ื”ืจื’ืœ ื—ื“ืฉ ืฆืจื™ืš ืื ืจื’ื™ื”. ืื ืจื’ื™ื”, ื›ืœื•ืžืจ ื”ื›ื— ืœืขืฉื•ืช ืืช ื”ื“ื‘ืจ ื”ื–ื” ืฉืฆืจื™ืš ืœืขืฉื•ืช ื›ืœ ื™ื•ื ื‘ืฉื‘ื™ืœ ืœื”ื’ื™ืข ืœืžื˜ืจื” ืฉืื•ืชื” ืจื•ืฆื™ื ืœื”ืฉื™ื’. ืืช ื”ืื ืจื’ื™ื” ืืคืฉืจ ืœื”ืฉื™ื’ ืžืื—ื“ ืื• ื™ื•ืชืจ ืžื”ืžืงื•ืจื•ืช ื”ื‘ืื™ื: 1. ื—ืœื•ืžื•ืช - ื”ื—ืœื•ื ืขืœ ืื™ืš ื”ื—ื™ื™ื ื™ืจืื• ืื—ืจื™ ืฉืื“ืข ืืช ื”ื“ื‘ืจ ื”ื–ื” ืฉืื ื™ ืœื•ืžื“ (ื—ืœื•ื ืขืœ ื”ืขื‘ื•ื“ื” ืฉืชื”ื™ื” ืœื™, ืขืœ ื”ื˜ื™ื•ืœ ืฉืื•ื›ืœ ืœืขืฉื•ืช) 2. ืœื—ืฅ ื—ื‘ืจืชื™ - ื›ืœ ื”ื—ื‘ืจื™ื ื ืจืฉืžื• ืœื—ื•ื’ ื›ื“ื•ืจื’ืœ ื•ืžืฉื—ืงื™ื ื™ื—ื“ ื‘ื”ืคืกืงื•ืช, ืื– ื›ื“ืื™ ืฉื’ื ืื ื™ ืืฆื˜ืจืฃ... 3. ื”ื‘ื•ืก ืืžืจ ืœื™ - ื›ืฉื™ืฉ ืžื˜ืจื” ืงื•ื ืงืจื˜ื™ืช ืฉืฆืจื™ืš ืœื‘ืฆืข, ืœื“ื•ื’ืžื” ืคืจื•ื™ืงื˜ ื‘ืขื‘ื•ื“ื”. 4. ื–ื” ืžืขื ื™ื™ืŸ ืื•ืชื™ - ื›ื™ ื›ืฉืื ื™ ืžืชืขื ื™ื™ืŸ ื‘ืžืฉื”ื• ื”ื”ืฉืงืขื” ื ืจืื™ืช ื”ืจื‘ื” ื™ื•ืชืจ ืงืœื”. 5. ืจืฆื•ืŸ ืœื”ืจืฉื™ื ื•ืœื”ืคืชื™ืข - ื›ืฉื’ื•ืจื ื—ื™ืฆื•ื ื™ ืฉื—ืฉื•ื‘ ืœื™ ืžืื•ื“ ืžืขืจื™ืš ื”ื™ืฉื’ ืžืกื•ื™ื, ื™ืฉ ืกื™ื›ื•ื™ ื˜ื•ื‘ ืฉืืฆืœื™ื— ืœื”ืชืžื™ื“ ื›ื“ื™ ืœื”ืจืฉื™ื ืื•ืชื•/ืื•ืชื”. 6. ื›ื™ ืื ืฉื™ื ื›ืžื•ื ื™ ืขื•ืฉื™ื ื“ื‘ืจื™ื ื›ืืœื” - ื›ืฉืื ื™ ืžืฆืคื” ืžืขืฆืžื™ ืœื”ืชื ื”ื’ื•ืช ืžืกื•ื™ืžืช ืฉืžืชืื™ืžื” ืœื“ื™ืžื•ื™ ื”ืขืฆืžื™ ืฉืœื™. ืื ืืชื ืžื ืกื™ื ืœืขืฉื•ืช ืฉื™ื ื•ื™ ื•ืœื ืžืฆืœื™ื—ื™ื ืœื”ืชืžื™ื“, ื”ื˜ืจื™ืง ื›ืืŸ ื”ื•ื ืœื—ืคืฉ ืžืงื•ืจื•ืช ืื ืจื’ื™ื” ื ื•ืกืคื™ื (ืืคืฉืจ ื™ื•ืชืจ ืžืื—ื“) ืฉื™ืขื–ืจื• ืœื ื• ืœืขื‘ื•ืจ ืืช ื”ืงื•ืฉื™ ื”ืจืืฉื•ื ื™.

ToCode
1 419
# ืื•ืคื˜ื™ืžื™ื•ืช ื‘ื˜ืขื•ืช ืงื ื™ืชื™ ื”ื™ื•ื ืืช ื”ืกืคืจ ื”ืœื ื ื›ื•ืŸ ื‘ืื•ื“ื™ื‘ืœ. ื ื•, ืจืฆื™ืชื™ ืœืงื ื•ืช ืกืคืจ ืžืกื•ื™ื ื•ืื™ื›ืฉื”ื• ื”ื™ื™ืชื™ ื‘ื˜ื•ื— ืฉืื ื™ ื‘ืขืžื•ื“ ืฉืœื• ืืคื™ืœื• ืฉื”ื™ื™ืชื™ ื‘ืขืžื•ื“ ืฉืœ ืกืคืจ ืื—ืจ ื•ืžืคื” ืœืฉื ืฉื™ืœืžืชื™ ืขืœ ื”ืกืคืจ ืฉืœื ืจืฆื™ืชื™. ืขื›ืฉื™ื• ืœื ื ืขื™ื ืœื”ื’ื™ื“ ืื‘ืœ ื–ืืช ืœื ื”ืคืขื ื”ืจืืฉื•ื ื” ืฉื–ื” ืงื•ืจื” ืœื™. ืื ื™ ืžื›ื™ืจ ืืช ืืžื–ื•ืŸ ื•ืื•ื“ื™ื‘ืœ, ื•ืงื™ื‘ืœืชื™ ืžื”ื ื›ื‘ืจ ืœื ืžืขื˜ ื”ื—ื–ืจื™ื ื‘ืขื‘ืจ ืืคื™ืœื• ืขืœ ื“ื‘ืจื™ื ื”ืจื‘ื” ื™ื•ืชืจ ืžื•ื–ืจื™ื. ืœื›ืŸ ื‘ืœื™ ืœื—ืฉื•ื‘ ืคืขืžื™ื™ื ืฉืœื—ืชื™ ืื™ืžื™ื™ืœ ืœืชืžื™ื›ื” ืœื”ืกื‘ื™ืจ ืืช ื”ืžืฆื‘ ื•ื”ืžืฉื›ืชื™ ืœืงื ื•ืช ืืช ื”ืกืคืจ ืฉืจืฆื™ืชื™, ื‘ืœื™ ืœื—ื›ื•ืช ืœืชืฉื•ื‘ื” ืฉืœ ื”ืชืžื™ื›ื” ืื• ืœื–ื™ื›ื•ื™. ื”ื›ืœ ื˜ื•ื‘ ื”ื–ื™ื›ื•ื™ ื™ื’ื™ืข. ื”ื™ื›ื•ืœืช ืœื”ืชืงื“ื ื‘ืœื™ ืœื—ื›ื•ืช ืœืจืื•ืช ืฉื”ืฆืขื“ ื”ืงื•ื“ื ื”ืฆืœื™ื— ื”ื™ื ื—ืœืง ืžืžื” ืฉืื ื—ื ื• ืงื•ืจืื™ื ืื•ืคื˜ื™ืžื™ื•ืช. ื›ื›ืœ ืฉื™ืฉ ืœื ื• ืคื—ื•ืช ื ืกื™ื•ืŸ ื‘ื ื•ืฉื ืžืกื•ื™ื ื›ืš ื ื“ืจืฉืช ืžื ื” ื’ื“ื•ืœื” ื™ื•ืชืจ ืฉืœ ืื•ืคื˜ื™ืžื™ื•ืช ื›ื“ื™ ืœื”ืชืงื“ื, ื•ื”ื™ื ืจืง ื”ื•ืคื›ืช ื™ื•ืชืจ ื—ืฉื•ื‘ื” ื›ืฉืื ื—ื ื• ืžืกืชื›ืœื™ื ืขืœ ื“ื‘ืจื™ื ื’ื“ื•ืœื™ื ื™ื•ืชืจ ืžืกืคืจื™ื ืงื•ืœื™ื™ื: 1. ืื•ืคื˜ื™ืžื™ื•ืช ืžืืคืฉืจืช ืœื™ ืœื”ืžืฉื™ืš ืœื”ืฉืงื™ืข ื‘ืคื™ืชื•ื— ื”ืคืจื•ื™ืงื˜ ืฉืœื™, ื’ื ืื ื”ื•ื ืขื“ื™ื™ืŸ ืœื ื”ื›ื ื™ืก ืืฃ ืœืงื•ื—. ืื ื™ ื™ื•ื“ืข ืฉื‘ืกื•ืฃ ืืžืฆื ืืช ื”ื“ืจืš ืœืžื›ื™ืจื•ืช, ื•ื›ื“ืื™ ืฉื”ืคืจื•ื™ืงื˜ ื™ื”ื™ื” ืžื•ื›ืŸ ื›ืฉื–ื” ื™ืงืจื”. 2. ืื•ืคื˜ื™ืžื™ื•ืช ืžืืคืฉืจืช ืœื™ ืœื”ืžืฉื™ืš ืœืœืžื•ื“ ื•ืœืชืจื’ืœ JavaScript, ื’ื ืื ื”ืงื•ืจื•ืช ื—ื™ื™ื ืฉืœื™ ืขื“ื™ื™ืŸ ืœื ืžืกืคื™ืง ื˜ื•ื‘ื™ื ื›ื“ื™ ืœื”ื’ื™ืข ืœืจืื™ื•ืŸ ืขื‘ื•ื“ื”. ืื ื™ ื™ื•ื“ืข ืฉื‘ืกื•ืฃ ืืฆืœื™ื— ืœืžืฆื•ื ืืช ื”ื“ืจืš ืœืจืื™ื•ื ื•ืช ื•ื›ื“ืื™ ืฉืื’ื™ืข ืžื•ื›ืŸ ื›ืฉื–ื” ื™ืงืจื”. 3. ืื•ืคื˜ื™ืžื™ื•ืช ืžืืคืฉืจืช ืœื™ ืœื—ืงื•ืจ ืœืขื•ืžืง ื›ื™ื•ื•ืŸ ืžืกื•ื™ื ืœืคื™ืชืจื•ืŸ ื‘ืœื™ ืœื“ืื•ื’ ืฉืื•ืœื™ ื–ื” ืœื ื”ื›ื™ื•ื•ืŸ ื”ื ื›ื•ืŸ. ืื ื™ ื™ื•ื“ืข ืฉื‘ืกื•ืฃ ืืžืฆื ืืช ื”ื‘ืื’ ื•ื”ื“ืจืš ืœื”ื’ื™ืข ืืœื™ื• ื”ื™ื ืœื”ื™ื›ื ืก ืœืขื•ื‘ื™ ื”ืงื•ืจื”. ื‘ืงืฆืจื” ืื•ืคื˜ื™ืžื™ื•ืช ืžืืคืฉืจืช ืœื ื• ืœื”ืชืงื“ื ืขื ื”ืชื”ืœื™ืš ืฉืขื›ืฉื™ื• ื“ื•ืจืฉ ืืช ืชืฉื•ืžืช ื”ืœื‘ ืฉืœื ื• (ืงื ื™ื™ืช ื”ืกืคืจ ื”ื ื›ื•ืŸ), ื•ืœื”ื ื™ื— ืฉืชื”ืœื™ื›ื™ื ืื—ืจื™ื ื™ืกืชื“ืจื• (ืืคื™ืœื• ืฉืื•ืœื™ ืœื ืœื’ืžืจื™ ื‘ืจื•ืจ ืขื›ืฉื™ื• ืื™ืš). ื•ืžืจื’ืข ืฉื”ื‘ื ื• ืื™ืš ื”ืื•ืคื˜ื™ืžื™ื•ืช ืžืฉืคื™ืขื” ืขืœ ื”ื”ืชื ื”ื’ื•ืช ื‘ื™ื•ื ื™ื•ื ืืคืฉืจ ืœื”ืชื—ื™ืœ ืœืชืจื’ืœ ืื•ืชื”: ื’ื ืื ืืชื” ืœื ื‘ื˜ื•ื— ื‘ื›ืœืœ ืฉืชืงื‘ืœ ื–ื™ื›ื•ื™, ื‘ื›ืœ ื–ืืช ืœืงื ื•ืช ืืช ื”ืกืคืจ ื”ื ื›ื•ืŸ. ื’ื ืื ืืช ืžืจื’ื™ืฉื” ืฉืœืขื•ืœื ืœื ื™ื–ืžื™ื ื• ืื•ืชืš ืœืจืื™ื•ืŸ ืขื‘ื•ื“ื”, ื‘ื›ืœ ื–ืืช ืœื”ืžืฉื™ืš ืœืœืžื•ื“ ื›ืœ ื™ื•ื ืœืคื™ ืฉืขื•ืŸ ื•ืœื ืœืคื™ ืžื•ื˜ื™ื‘ืฆื™ื”. ื›ื™ ื”ื”ืชื ื”ื’ื•ืช ืžืฉืคื™ืขื” ืขืœ ื”ื’ื™ืฉื”, ื•ืœืื•ืจืš ื–ืžืŸ ื”ื”ืชื ื”ื’ื•ืช ื”ืื•ืคื˜ื™ืžื™ืช ื•ื”ื’ื™ืฉื” ื”ืื•ืคื˜ื™ืžื™ืช ืขื•ื–ืจื•ืช ืœื ื• ืœื”ืฉืงื™ืข ื‘ืชื”ืœื™ื›ื™ื ื”ื ื›ื•ื ื™ื ื•ื‘ื›ืžื•ืช ื”ื ื“ืจืฉืช ื‘ืฉื‘ื™ืœ ืœื”ืชืงื“ื.

ToCode
1 419
# ื”ื–ืžืŸ ื”ื›ื™ ื˜ื•ื‘ ืœืชืงืŸ ื‘ื“ื™ืงื” ื”ื–ืžืŸ ื”ื›ื™ ื˜ื•ื‘ ืœืชืงืŸ ื‘ื“ื™ืงื” ื”ื•ื ื‘ื“ื™ื•ืง ื‘ืจื’ืข ืฉื›ืชื‘ืช ืืช ื”ืงื•ื“ ืฉืฉื‘ืจ ืื•ืชื”. ื›ื›ืœ ืฉืžืชืจื—ืงื™ื ืžืื•ืชื• ื”ืจื’ืข ืงื•ืจื™ื ืฉื ื™ ื“ื‘ืจื™ื ืจืขื™ื: 1. ืืชื” ืฉื•ื›ื— ืžื” ืขืฉื™ืช ื•ืœืžื” ื–ื” ืฉื‘ืจ ืืช ื”ื‘ื“ื™ืงื”. 2. ื‘ื“ื™ืงื•ืช ื ื•ืกืคื•ืช ื ืฉื‘ืจื•ืช ื‘ื’ืœืœ ืฉื™ื ื•ื™ื™ื ื—ื“ืฉื™ื. ื›ืžืขื˜ ื‘ื›ืœ ืคืจื•ื™ืงื˜, ืื ืื ื™ ืžืขื‘ื™ืจ ื—ื•ื“ืฉื™ื™ื ื‘ืœื™ ืœื”ืจื™ืฅ ืืช ื”ื‘ื“ื™ืงื•ืช - ืืคื™ืœื• ืื ื‘ืืžืช ืœื ืฉื‘ืจืชื™ ื›ืœื•ื ืžื‘ื—ื™ื ืช ื”ืœื•ื’ื™ืงื” ืฉืœ ื”ืžืขืจื›ืช - ืขื“ื™ื™ืŸ ื™ื”ื™ื• ืœื™ ืœื ืžืขื˜ ื‘ื“ื™ืงื•ืช ืฉื‘ื•ืจื•ืช ืœืชืงืŸ. ื‘ืขื‘ื•ื“ื” ืขื ื’ื™ื˜ ืงืœ ืœื™ื™ืฆืจ ืชื”ืœื™ืš ืขื‘ื•ื“ื” ืื•ื˜ื•ืžื˜ื™ ืฉืžืจื™ืฅ ืืช ื”ื‘ื“ื™ืงื•ืช ืœืคื ื™ ื”ืงื•ืžื™ื˜. ื‘ื”ื ื—ื” ืฉืืชื ื‘ืคืจื•ื™ืงื˜ node ื•ืžืจื™ืฆื™ื ืืช ื”ื‘ื“ื™ืงื•ืช ืขื npm test ื›ืœ ืžื” ืฉืฆืจื™ืš ืœืขืฉื•ืช ื–ื” ืœื™ืฆื•ืจ ืกืงืจื™ืคื˜ ื—ื“ืฉ ื‘ืชื™ืงื™ื™ืช .git/hooks ื•ืœืงืจื•ื ืœื• ื‘ืฉื pre-commit, ื‘ืชื•ื›ื• ืœื›ืชื•ื‘ ืืช ื”ืชื•ื›ืŸ:
#!/bin/sh

echo "*****Running unit tests******"

git stash -q --keep-index

npm test

status=$?

git stash pop -q

exit $status
ื•ืœืชืช ืœื• ื”ืจืฉืื•ืช ื”ืจืฆื”:
$ chmod +x .git/hooks/pre-commit
ื‘ืคืขื ื”ื‘ืื” ืฉืชื ืกื• ืœืขืฉื•ืช commit ืœืงื•ื“ ื’ื™ื˜ ืงื•ื“ื ื›ืœ ื™ืจื™ืฅ ืืช ื”ื‘ื“ื™ืงื•ืช ื•ื™ืฆืขืง ืขืœื™ื›ื ืื ืžืฉื”ื• ื ื›ืฉืœ. ื .ื‘. ื‘ืคืจื•ื™ืงื˜ ืฉื ื•ืฆืจ ืขื create-react-app ืฆืจื™ืš ืœื”ืคืขื™ืœ ืืช ืฉื•ืจืช ื”ืจืฆืช ื”ื‘ื“ื™ืงื•ืช ื•ื‘ืžืงื•ื ืœื›ืชื•ื‘ npm test ื ื›ืชื•ื‘ ืฉื npm test -- --watchAll=false ื›ื“ื™ ืœื”ืจื™ืฅ ืืช ื”ื‘ื“ื™ืงื•ืช ืคืขื ืื—ืช ื•ืœื ืœืขืงื•ื‘ ืื—ืจื™ ืฉื™ื ื•ื™ื™ื ื‘ืงื‘ืฆื™ื.

ToCode
1 419
# ืื™ืš ืœื‘ื“ื•ืง Custom Hook ื‘ืจื™ืืงื˜ ืกืคืจื™ื™ืช react-testing-library ืžืกืคืงืช ื›ืœื™ื ืžืฆื•ื™ื ื™ื ืœื‘ื“ื™ืงืช ืงื•ืžืคื•ื ื ื˜ื•ืช - ืื‘ืœ ืžื” ืขื•ืฉื™ื ืขื Custom Hooks? ื”ืื ืขืœื™ื ื• ืœื”ืฉืื™ืจ ืื•ืชื ืœื’ื•ืจืœื ืœื”ื™ืฉื‘ืจ ืœืœื ื‘ื“ื™ืงื•ืช? ืžืกืชื‘ืจ ืฉื™ืฉ ืคื™ืชืจื•ืŸ ื•ืืคื™ืœื• ืคืฉื•ื˜ - ื‘ืžืงื•ื ืœื›ืชื•ื‘ ืงื•ื“ ืฉื‘ื•ื“ืง ืืช ื” Hook, ืื ื—ื ื• ื›ื•ืชื‘ื™ื ืงื•ืžืคื•ื ื ื˜ื” ืฉืžืฉืชืžืฉืช ื‘ Hook ื•ื‘ื•ื“ืงื™ื ืืช ื”ืงื•ืžืคื•ื ื ื˜ื”. ื‘ื•ืื• ื ืจืื” ื“ื•ื’ืžื”. ## ื” Hook ืฉืื ื™ ืจื•ืฆื” ืœื‘ื“ื•ืง: useLocalStorage ืื—ื“ ื”ื”ื•ืงื™ื ื”ืื”ื•ื‘ื™ื ืขืœื™ื™ ื‘ืจื™ืืงื˜ ื ืจืื” ื›ืžื• useState ืื‘ืœ ืžื•ืกื™ืฃ ืขืœื™ื• ืืคืงื˜ ื›ืš ืฉื”ืžื™ื“ืข ื’ื ื™ื™ืฉืžืจ ื‘ Local Storage. ื‘ืคืขื ื”ื‘ืื” ืฉื™ืคืขื™ืœื• ืืช ื”ืงื•ืžืคื•ื ื ื˜ื” ื”ื™ื ืชื•ื›ืœ ืœื˜ืขื•ืŸ ืืช ื”ืžื™ื“ืข ืžื” local storage ื•ื”ืžืฉืชืžืฉ ื™ื•ื›ืœ ืœื”ืžืฉื™ืš ืืช ื”ืขื‘ื•ื“ื” ืžืื•ืชื” ื ืงื•ื“ื”. ื”ื ื” ื”ืงื•ื“:
import { useEffect, useState, useCallback } from 'react';

export function useLocalStorage(key, initialValue) {
  const oldValue = localStorage.getItem(key);
  const [value, setValue] = useState(oldValue ? JSON.parse(oldValue) : initialValue);
  useEffect(() => {
    localStorage.setItem(key, JSON.stringify(value));
  }, [value]);

  const clearValue = useCallback(function clearValue() {
    localStorage.removeItem(key);
  }, [key]);

  return [value, setValue, clearValue];
}
ื” Hook ืžื—ื–ื™ืจ ืฉืœื•ืฉ ืคื•ื ืงืฆื™ื•ืช: ืฉืชื™ื™ื ืจืืฉื•ื ื•ืช ื–ื”ื•ืช ืœืžื” ืฉ useState ืžื—ื–ื™ืจ ื•ื”ืฉืœื™ืฉื™ืช ื”ื™ื ืคื•ื ืงืฆื™ื” ืฉืžื•ื—ืงืช ืืช ื”ืขืจืš ืžื” local storage. ื”ืขืจืš ืขื•ื‘ืจ JSON.stringify ืœืคื ื™ ื”ืฉืžื™ืจื” ื›ื“ื™ ืฉืืคืฉืจ ื™ื”ื™ื” ืœืฉืžื•ืจ ืžื™ื“ืข ืžื›ืœ ื˜ื™ืคื•ืก ื ืชื•ื ื™ื. ## ืงื•ื“ ื”ื‘ื“ื™ืงื”: ืงื•ืžืคื•ื ื ื˜ืช ืขื–ืจ ื‘ืฉื‘ื™ืœ ืœื‘ื“ื•ืง ืืช ื” Hook ืื ื™ ืคื•ืชื— ืงื•ื‘ืฅ ื—ื“ืฉ ื‘ืฉื useLocalStorage.test.js ื•ื‘ืชื•ื›ื• ืžื’ื“ื™ืจ ืงื•ืžืคื•ื ื ื˜ื” ืคืฉื•ื˜ื” ืคื ื™ืžื™ืช ืฉืชืฉืชืžืฉ ื‘ Hook:
import { render } from '@testing-library/react';
import { useLocalStorage } from './useLocalStorage';
import userEvent from '@testing-library/user-event'


function Dummy() {
  const [text, setText, clearText] = useLocalStorage('__test_text', 'hello world');
  return (
    <div>
      <p>dummy app: {text}</p>
      <button onClick={() => setText('Ouch!')}>set</button>
      <button onClick={() => clearText()}>clear</button>
    </div>
  );
}
ืžื” ืฉื—ืฉื•ื‘ ืฉื”ืงื•ืžืคื•ื ื ื˜ื” ืชืฉืชืžืฉ ื‘ื›ืœ ื”ื™ื›ื•ืœื•ืช ืฉืœ ื” Hook. ื‘ืขื•ืœื ื”ืืžื™ืชื™ ื”ื™ื™ืชื™ ื™ื•ืฆืจ ืขื•ื“ ื›ืžื” ืงื•ืžืคื•ื ื ื˜ื•ืช ื›ืืœื”, ืื—ืช ืฉืชืฉืžื•ืจ ืžืกืคืจื™ื, ืื—ืช ืฉืชืฉืžื•ืจ ืžืขืจืš ื•ื›ืš ื”ืœืื”. ืืช ืงื•ื“ ื”ื‘ื“ื™ืงื” ืื ื™ ื›ื•ืชื‘ ื‘ื”ืžืฉืš ื”ืงื•ื‘ืฅ ื•ื”ื•ื ื‘ืกืš ื”ื›ืœ ืžืฉืชืžืฉ ื‘ื›ืคืชื•ืจื™ื ืฉืœ ื”ืงื•ืžืคื•ื ื ื˜ื” ื•ื‘ื•ื“ืง ืฉื”ื›ืœ ืžืชื ื”ื’ ื›ืžื• ืฉืฆืจื™ืš. ื‘ื“ื•ื’ืžื” ืฉืœื ื• ืืคืฉืจ ืœื‘ื“ื•ืง ืฉืฉื™ื ื•ื™ื™ื ื‘ืขืจืš ื’ื ื ื›ืชื‘ื™ื ืœ Local Storage:
test('initial value is saved in local storage', () => {
  const screen = render(<Dummy />);
  const textElement = screen.getByText(/hello world/i);
  expect(textElement).toBeInTheDocument();
  expect(JSON.parse(localStorage.getItem('__test_text'))).toEqual('hello world');
});

test('changed value is saved in local storage', () => {
  const screen = render(<Dummy />);
  const setButton = screen.getByText(/set/i);
  userEvent.click(setButton);
  expect(JSON.parse(localStorage.getItem('__test_text'))).toEqual('Ouch!');
});

test('clear value removes the value from local storage', () => {
  const screen = render(<Dummy />);
  const clearButton = screen.getByText(/clear/i);
  userEvent.click(clearButton);
  expect(localStorage.getItem('__test_text')).toBe(null);
});
ืื• ืฉืื ื™ืฉ ื›ื‘ืจ ืขืจืš ื‘ Local Storage ืื– ื ื˜ืขืŸ ืื•ืชื• ื•ื ืฉืชืžืฉ ื‘ื• ืœืชืฆื•ื’ื”:
test('existing value is read', () => {
  localStorage.setItem('__test_text', JSON.stringify('lazy dog'));
  const screen = render(<Dummy />);
  const textElement = screen.getByText(/lazy dog/i);
  expect(textElement).toBeInTheDocument();
});
ื›ื›ืœ ืฉืชื’ื“ื™ืจื• ื™ื•ืชืจ ืงื•ืžืคื•ื ื ื˜ื•ืช ื‘ื“ื™ืงื” ืคื ื™ืžื™ื•ืช (ื•ืชืžื™ื“ ื‘ืื•ืชื• ืงื•ื‘ืฅ ื”ื‘ื“ื™ืงื”) ื›ืš ืชื•ื›ืœื• ืœื‘ื“ื•ืง ื™ื•ืชืจ ื”ืชื ื”ื’ื•ื™ื•ืช ืฉื•ื ื•ืช ืฉืœ ื” Hook ืฉืœื›ื ื•ืœื”ื™ื•ืช ื‘ื˜ื•ื—ื™ื ืฉื”ื•ื ื™ืขื‘ื•ื“ ื‘ื›ืœ ืกื™ื˜ื•ืืฆื™ื”.

ToCode
1 419
# ื™ืฉ'ืš ื‘ืื’ - "ืื™ืŸ ืžืฆื‘, ืืฆืœื™ ื–ื” ืขื•ื‘ื“" - "ื›ื›ื” ื–ื” ื›ืฉืœื ืžืฉืื™ืจื™ื ื–ืžืŸ ืœื‘ื“ื™ืงื•ืช" - "ื›ื›ื” ื–ื” ื›ืฉืื™ืŸ ืชื”ืœื™ื›ื™ ืขื‘ื•ื“ื” ืžืกื•ื“ืจื™ื" - "ืื™ืš ืœื ืžืฆืื• ืืช ื–ื” ื‘ QA??" - "ื–ื” ืœื ื‘ืื’ ื–ื” ืคื™ืฆ'ืจ" - "ื”ื™ ื”ื™ ืืฃ ืื—ื“ ื‘ืื™ืคื™ื•ืŸ ืœื ื“ื™ื‘ืจ ืขืœ ื” Use Case ื”ื–ื”" - "ืœื ื”ืฆืœื—ืชื™ ืœืฉื—ื–ืจ ื ืžืฉื™ืš ืœืขืงื•ื‘" - "ืžืขื ื™ื™ืŸ! ืืคืฉืจ ืœืจืื•ืช?" ืืชื ืœื ื‘ื•ื—ืจื™ื ื›ืžื” ื‘ืื’ื™ื ืœื™ื™ืฆืจ ืื‘ืœ ื›ืŸ ื‘ื•ื—ืจื™ื ืื™ืš ืœื”ื’ื™ื‘ ื›ืฉืžื’ืœื™ื ืื—ื“. ื•ื”ื”ืฉืคืขื” ืฉืœ ื”ื‘ื—ื™ืจื” ื”ื™ื ื”ืจื‘ื” ื™ื•ืชืจ ืžืฉืžืขื•ืชื™ืช ืžืžื” ืฉื™ืงืจื” ืขื ื”ื‘ืื’ ื”ืกืคืฆื™ืคื™.

ToCode
1 419
## ื‘ืื’ Goto Fail ื‘ืžื ื’ื ื•ืŸ SSL ืฉืœ ืืคืœ ื•ืื ื—ืฉื‘ืชื ืฉืืคืœ ืชืฆื ื ืงื™ื” ืžื”ืจืฉื™ืžื” ื”ื–ืืช ืื– ื›ื ืจืื” ืฉื›ื—ืชื ืืช ืื—ื“ ื”ื‘ืื’ื™ื ื”ืžื‘ื™ื›ื™ื ืฉืœ ื”ืขืฉื•ืจ - ื” Goto Fail. ื‘ 2014 ื”ืชื’ืœื” ื‘ืื’ ืงืจื™ื˜ื™ ื‘ืื•ืคืŸ ืฉื‘ื• ืžื›ืฉื™ืจื™ ืืคืœ ืžืคืขื ื—ื™ื ืชืขื•ื“ื•ืช SSL, ื‘ืื’ ืฉืื™ืคืฉืจ ืœื›ืœ ืื—ื“ ืœื–ื™ื™ืฃ ืžื ืขื•ืœ SSL ื•ืกืคืืจื™ ื™ืฆื™ื’ ืืช ื”ืžื ืขื•ืœ ื›ืžื• ืชืงืฉื•ืจืช ืžืื•ื‘ื˜ื—ืช ืจื’ื™ืœื” ืœื’ืžืจื™. ื”ื‘ืื’ ื”ื–ื” ื–ื›ื” ืœืชื”ื•ื“ื” ืงื•ื“ื ื›ืœ ื›ื™ ื”ื™ื” ืžืื•ื“ ืงืœ ืœืจืื•ืช ืื•ืชื•: ืคืฉื•ื˜ ืชื’ืœื•ืฉ ืœืืชืจ ื”ื“ื•ื’ืžื” ื•ืื ืืชื” ืจื•ืื” ืืช ื”ืžื ืขื•ืœ ืฉืžืกืžืŸ ืชืงืฉื•ืจืช ืžืื•ื‘ื˜ื—ืช ืืชื” ื™ื•ื“ืข ืฉืขื‘ื“ื• ืขืœื™ืš; ืื‘ืœ ื™ื•ืชืจ ืžื–ื” ื”ื•ื ื–ื›ื” ืœืชื”ื•ื“ื” ื›ื™ ื”ืงื•ื“ ืฉื’ืจื ืœื• ื”ื™ื” ื–ืžื™ืŸ ื‘ืงื•ื“ ืคืชื•ื— ื•ื”ื•ืคืฅ ื™ื—ื“ ืขื ื›ืœ ื”ื“ื™ื•ื•ื— ืขืœ ื”ื‘ืื’. ื”ื™ื›ื•ืœืช ืฉืœื ื• ืœืจืื•ืช ื‘ืขื™ื ื™ื™ื ืืช ื”ืงื•ื“ ืฉื’ืจื ืœื—ื•ืœืฉื” ื”ืคื›ื” ืืช ื”ืกื™ืคื•ืจ ืœืคื™ืงื ื˜ื™ ื•ื›ืœ ืื—ื“ ื ื™ืกื” ืœื—ืฉื•ื‘ ืื ื”ื•ื ื”ื™ื” ืžืฆืœื™ื— ืœื–ื”ื•ืช ืืช ื”ื‘ืขื™ื” ื‘ืงื•ื“. ืœืงืจื™ืืช ื”ืงื•ื“ ืขื ื”ืชืงืœื” ื•ืคืจื˜ื™ื ื ื•ืกืคื™ื ืขืœ ื”ืกื™ืคื•ืจ ืฉื•ื•ื” ืœืงืคื•ืฅ ืœ: https://nakedsecurity.sophos.com/2014/02/24/anatomy-of-a-goto-fail-apples-ssl-bug-explained-plus-an-unofficial-patch/

ToCode
1 419
# ืชื–ื›ื•ืจืช: 5 ืชืงืœื•ืช ืื‘ื˜ื—ื” ื™ื•ืชืจ ื’ืจื•ืขื•ืช ืž log4j ื‘ื™ืžื™ื ื”ืื—ืจื•ื ื™ื ื›ื•ืœื ืžื“ื‘ืจื™ื ืขืœ ื”ืคื™ืจืฆื” ื”ื ื•ืจืื™ืช ื‘ log4j, ื•ืœืคืขืžื™ื ืื ื™ ืžืจื’ื™ืฉ ืฉืงืœ ืœืฉื›ื•ื— ืฉื”ื”ื™ืกื˜ืจื™ื” ื”ื–ืืช ื”ื™ืชื” ืคื” ื‘ืขื‘ืจ ื•ืชื”ื™ื” ืฉื•ื‘ ื‘ืขืชื™ื“. ืื– ื”ื ื” ืชื–ื›ื•ืจืช ืœ-5 ื‘ืขื™ื•ืช ืื‘ื˜ื—ื” ืžื”ืขื‘ืจ ืฉืœื™ื“ืŸ log4j ื ื“ืžื™ืช ื›ืžื• ื˜ื™ื•ืœ ื‘ืคืืจืง. ## ืกืคืงื˜ืจ ืกืคืงื˜ืจ ื”ื•ื ืฉื ื›ื•ืœืœ ืœืกื™ื“ืจื” ืฉืœ ื‘ืขื™ื•ืช ืื‘ื˜ื—ื” ื‘ืžืขื‘ื“ื™ื ืฉืžืฉืชืžืฉื™ื ื‘ืžื ื’ื ื•ืŸ ืฉื ืงืจื branch prediction, ืฉื–ื” ื‘ืขืฆื ืจื•ื‘ ื”ืžืขื‘ื“ื™ื ื‘ืขื•ืœื. ื”ื‘ื’ื“ื•ืœ ืฉืœ ืกืคืงื˜ืจ ื”ื•ื ืฉืชื•ื›ื ื™ืช ืื—ืช ื™ื›ื•ืœื” ืœืงื‘ืœ ืžื”ืžืขื‘ื“ ืžื™ื“ืข ืฉื”ื™ื ืœื ืฆืจื™ื›ื” ืœืจืื•ืช ืœื’ื‘ื™ ื”ืชื ื”ื’ื•ืช ืฉืœ ืชื•ื›ื ื™ื•ืช ืื—ืจื•ืช ืขืœ ื”ืžื›ื•ื ื”, ื•ื”ื”ืฉืคืขื” ื”ืคืจืงื˜ื™ืช ื”ืจืืฉื•ื ื” ื”ื™ืชื” ื”ืืคืฉืจื•ืช ืฉืœ ืืชืจื™ื ืฉื ืคืชื—ื™ื ื‘ื˜ืื‘ ืื—ื“ ื‘ื“ืคื“ืคืŸ ื›ืจื•ื ืœื“ืขืช ืžื” ืงื•ืจื” ื‘ื›ืœ ื”ื˜ืื‘ื™ื ื”ืื—ืจื™ื ืฉืœื›ื. ืžืื– ืฉื”ืชื’ืœื” ื‘ 2018, ื›ืœ ื”ื—ื‘ืจื•ืช ื”ื’ื“ื•ืœื•ืช ื”ื•ืฆื™ืื• ื˜ืœืื™ ืื‘ื˜ื—ื” ืฉื ื•ืขื“ื• ืœื”ืชืžื•ื“ื“ ืขื ืกืคืงื˜ืจ: ื›ืœ ื”ื“ืคื“ืคื ื™ื ื›ื•ืœืœื™ื ื”ื™ื•ื ืžื ื’ื ื•ื ื™ ื”ื’ื ื” ืกืคืฆื™ืคื™ื™ื ืœื‘ืื’ ื–ื”, ืžืขืจื›ื•ืช ื”ืคืขืœื” ื›ื•ืœืœื•ืช ื”ื’ื ื” ืกืคืฆื™ืคื™ืช ื ื’ื“ ืชื•ื›ื ื™ื•ืช ืฉืžื ืกื•ืช ืœื ืฆืœ ืืช ืกืคืงื˜ืจ, ื•ืืคื™ืœื• ื”ืžืขื‘ื“ื™ื ืขืฆืžื ืžื’ื™ืขื™ื ืขื ืžื ื’ื ื•ื ื™ ื”ื’ื ื” ืฉืžื–ื”ื™ื ืื• ืžื ืกื™ื ืœื–ื”ื•ืช ื ื™ืฆื•ืœ ืœืจืขื” ืฉืœ ื”ืชื ื”ื’ื•ืช ื”ื—ื™ื–ื•ื™ ืฉืœื”ื. ืœืžืจื•ืช ื›ืœ ื”ื”ืฉืงืขื” ื”ื”ื’ื ื•ืช ืฉื™ืฉ ืœื ื• ื”ื™ื•ื ืžืกืคืงื˜ืจ ืžืชื‘ืกืกื•ืช ื›ื•ืœืŸ ืขืœ "ืœืชื—ืžืŸ" ืืช ื”ืชื•ืงืฃ ื•ืœื ืœืืคืฉืจ ืœื• ืœื ืฆืœ ืืช ื”ื—ื•ืœืฉื” ืžืชื•ืš ื”ื‘ื ื” ืฉื”ื—ื•ืœืฉื” ืขืฆืžื” ื”ื™ื ืžืฉื”ื• ืฉืžืื•ื“ ืงืฉื” ืœืชืงืŸ. ืœืงืจื™ืื” ื ื•ืกืคืช ืขืœ ืกืคืงื˜ืจ ืฉื•ื•ื” ืœื‘ืงืจ ื‘ื“ืฃ ื”ืคื™ืจืฆื”: https://spectreattack.com ## ื”ืืจื˜ื‘ืœื™ื“ ื—ืœืง ื’ื“ื•ืœ ืžืชืฉืชื™ืช ื”ืชืงืฉื•ืจืช ื”ืžืื•ื‘ื˜ื—ืช ื‘ืื™ื ื˜ืจื ื˜ ืžืฉืชืžืฉ ื‘ืกืคืจื™ืช ืงื•ื“ ืคืชื•ื— ื‘ืฉื OpenSSH. ื‘ืฉื ืช 2012 ืฉื™ื ื•ื™ ื‘ืงื•ื“ ืฉื”ื•ื›ื ืก ืœืกืคืจื™ื” ื–ื• ื’ืจื ืœื›ืš ืฉื›ืœ ืฉืจืช ืฉื”ืฉืชืžืฉ ื‘ืกืคืจื™ื” ื”ื™ื” ืคื’ื™ืข ื•ืชื•ืงืคื™ื ื”ื™ื• ื™ื›ื•ืœื™ื ืœืงืจื•ื ืืช ื›ืœ ื”ื–ื™ื›ืจื•ืŸ ืฉืœ ื”ืฉืจืช, ื›ื•ืœืœ ืืช ื›ืœ ืžืคืชื—ื•ืช ื”ื”ืฆืคื ื” ื”ืคืจื˜ื™ื™ื. ื”ืชื™ืงื•ืŸ ื‘ืกืคืจื™ื™ืช OpenSSH ื™ื—ื“ ืขื ื’ื™ืœื•ื™ ื”ืคื™ืจืฆื” ื”ืชืจื—ืฉื• ืจืง ื‘ 2014, ื›ืœื•ืžืจ ืฉื ืชื™ื™ื ืžืื•ื—ืจ ื™ื•ืชืจ, ื•ื—ืฉืคื• ืืช ื”ืขื•ืœื ืœืกื›ื ื•ืช ื‘ืฉื™ืžื•ืฉ ื‘ืกืคืจื™ื•ืช ืงื•ื“ ืคืชื•ื—. ืืฃ ืื—ื“ ืœื ื™ื•ื“ืข ืื™ื–ื” ืืจื’ื•ื ื™ื ื•ื’ื•ืจืžื™ื ื”ื›ื™ืจื• ืืช ื”ืคื™ืจืฆื” ื‘ืฉื ืชื™ื™ื ื‘ื™ืŸ 2012 ืœ 2014 ื•ื”ืฉืชืžืฉื• ื‘ื” ื›ื“ื™ ืœืจื’ืœ ืื—ืจื™ ืžืฉืชืžืฉื™ื ื•ืœืคืจื•ืฅ ืชืงืฉื•ืจืช ืฉื ื—ืฉื‘ื” ืžืื•ื‘ื˜ื—ืช. ื‘ื–ืžืŸ ื’ื™ืœื•ื™ ื”ืคื™ืจืฆื” ืžืขืจื™ื›ื™ื ื›ื™ ื‘ืื–ื•ืจ ื” 17% ืžืกืš ื”ืฉืจืชื™ื ื‘ืื™ื ื˜ืจื ื˜ ื”ืจื™ืฆื• ื’ื™ืจืกื” ืคื’ื™ืขื” ืฉืœ OpenSSH. ืžื” ืฉืžืคื—ื™ื“ ื‘ืืžืช ื‘ Heartbleed ื–ื” ืฉืœืžืจื•ืช ืฉื”ื‘ืื’ ืชื•ืงืŸ, ืื™ืŸ ืœื ื• ื“ืจืš ืœื“ืขืช ื›ืžื” ื‘ืขื™ื•ืช ืื‘ื˜ื—ื” ื ื•ืกืคื•ืช ืงื™ื™ืžื•ืช ื‘ืžื•ืฆืจื™ ืงื•ื“ ืคืชื•ื— ื”ืžื”ื•ื•ื™ื ืืช ื”ืชืฉืชื™ืช ืฉืœ ื”ืจืฉืช - ื•ื›ืŸ ื’ื ื”ื‘ืื’ ื‘ log4j ื”ื•ื ืขื•ื“ ื“ื•ื’ืžื” ืœืชืงืœื•ืช ืžืกื•ื’ ื–ื”. ืœืงืจื™ืื” ื ื•ืกืคืช ืขืœ hearbleed ืืคืฉืจ ืœื‘ืงืจ ื‘ื“ืฃ ื”ืคื™ืจืฆื”: https://heartbleed.com ## ื˜ืจื™ื“ื ื˜ ืื—ืžื“ ืžื ืกื•ืจ ื”ื™ื” ืคืขื™ืœ ืคื•ืœื™ื˜ื™ ืฉื ื™ื”ืœ ื‘ืœื•ื’ ื”ืงื•ืจื ืœืจืคื•ืจืžื•ืช ื‘ื–ื›ื•ื™ื•ืช ืื“ื ื‘ืื™ื—ื•ื“ ื”ืืžื™ืจื•ื™ื•ืช. ื‘ืื•ื’ื•ืกื˜ 2016 ื”ื•ื ืงื™ื‘ืœ ื”ื•ื“ืขืช ืกืžืก ืฉืžื‘ื˜ื™ื—ื” ื’ื™ืœื•ื™ื™ื ื—ื“ืฉื™ื ืขืœ ืขื™ื ื•ื™ื™ื ื‘ื‘ืชื™ ื”ื›ืœื ืฉืœ ืื™ื—ื•ื“ ื”ืืžื™ืจื•ื™ื•ืช ื‘ืœื™ื ืง ื”ืžืฆื•ืจืฃ. ื‘ืžืงื•ื ืœืœื—ื•ืฅ ืขืœ ื”ืœื™ื ืง ืžื ืกื•ืจ ืฉืœื— ืืช ื”ื”ื•ื“ืขื” ืœื‘ื“ื™ืงื” ื‘ืžืขื‘ื“ืช ืื‘ื˜ื—ืช ืžื™ื“ืข, ืฉื ื”ืฆืœื™ื—ื• ืœื’ืœื•ืช ืฉื”ืœื™ื ืง ืฉื™ื™ืš ืœื—ื‘ืจืช NSO, ื•ืื ืžื ืกื•ืจ ื”ื™ื” ืœื•ื—ืฅ ืื– ื”ืื™ื™ืคื•ืŸ 6 ืฉืœื• ื”ื™ื” ื ืคืจืฅ ื•ืชื•ื›ื ืช ื”ืจื™ื’ื•ืœ ืคืจืกื•ืก ื”ื™ืชื” ืžื•ืชืงื ืช ืขืœื™ื• ื‘ืื•ืคืŸ ืื•ื˜ื•ืžื˜ื™ ื•ื‘ืœื™ ื™ื“ื™ืขืชื• ืฉืœ ื”ืคืขื™ืœ. ืฉืœื•ืฉืช ื‘ืขื™ื•ืช ื”ืื‘ื˜ื—ื” ื”ืงืจื™ื˜ื™ื•ืช ืฉืื™ืคืฉืจื• ื”ืชืงื ืช ืชื•ื›ื ืช ืจื™ื’ื•ืœ ื“ืจืš ืœื—ื™ืฆื” ืขืœ ืœื™ื ืง ื–ื›ื• ืœืฉื Trident, ื•ื—ืฉืคื• ืืช ื”ืขื•ืœื ืœืขื•ืœื ื”ืืคืœ ืฉืœ ืจื™ื’ื•ืœ ื“ืจืš ื˜ืœืคื•ื ื™ื. ืžืื– NSO ื•ืชื•ื›ื ืช ืคื’ืกื•ืก ื”ืคื›ื• ืžืคื•ืจืกืžื•ืช ื•ืื™ืŸ ืœื“ืขืช ื›ืžื” ื‘ืขื™ื•ืช ืื‘ื˜ื—ื” ืงืจื™ื˜ื™ื•ืช ื‘ืžืขืจื›ื•ืช ื”ืคืขืœื” ืฉืœ ื˜ืœืคื•ื ื™ื ืขื•ื“ ื ืžืฆืื•ืช ืืฆืœื ื‘ืžื—ืกื ื™ื ื•ืžืฉืžืฉื•ืช ืœื”ืชืงื ืช ืชื•ื›ื ื•ืช ืจื™ื’ื•ืœ ื‘ืœื™ ื™ื“ื™ืขืช ื‘ืขืœื™ ื”ื˜ืœืคื•ื ื™ื. ื‘ื›ืชื‘ื” ื”ื‘ืื” ืชื•ื›ืœื• ืœืžืฆื•ื ืืช ื›ืœ ื”ืคืจื˜ื™ื ื”ืขืกื™ืกื™ื™ื ืขืœ ื”ืกื™ืคื•ืจ: https://citizenlab.ca/2016/08/million-dollar-dissident-iphone-zero-day-nso-group-uae/ ## ืคืจื™ื ื˜ ื ื™ื™ื˜ืžื™ื™ืจ ื‘ืชื—ื™ืœืช ื™ื•ืœื™ ื”ืฉื ื” ืžื™ื™ืงืจื•ืกื•ืคื˜ ื“ื—ืคื” ืขื“ื›ื•ืŸ ืื‘ื˜ื—ื” ื“ื—ื•ืฃ ืœืžืขืจื›ืช ื”ืคืขืœื” Windows ื›ื“ื™ ืœืชืงืŸ ื‘ืื’ ื‘ืกืจื‘ื™ืก ืฉื ืงืจื Print Spooler. ื”ื‘ืื’ ืืคืฉืจ ืœืชื•ืงืคื™ื ืœื”ืจื™ืฅ ืงื•ื“ ืžืจื—ื•ืง ืขืœ ื›ืœ ืžื›ื•ื ืช Windows ื•ื”ืฉืคื™ืข ืขืœ ื›ืœ ื”ื’ื™ืจืกืื•ืช ืฉืœ Windows. ื”ื‘ืื’ ื”ื–ื” ื–ื›ื” ืœืชื”ื•ื“ื” ื‘ื’ืœืœ ืฉื”ื ื™ืกื™ื•ืŸ ื”ืจืืฉื•ืŸ ืฉืœ Microsoft ืœืชืงืŸ ืื•ืชื• ืœื ื”ืฆืœื™ื—, ื•ื—ื•ืงืจื™ ืื‘ื˜ื—ื” ื”ืžืฉื™ื›ื• ืœื ืฆืœ ืื•ืชื• ื•ืœื”ืขืœื•ืช Exploits ื ื•ืกืคื™ื ื’ื ืื—ืจื™ ื”ืชื™ืงื•ืŸ, ื•ื–ื” ืœืงื— ื›ืžื” ืกื‘ื‘ื™ื ืขื“ ืฉ Microsoft ืกื’ืจื” ืกื•ืคื™ืช ืืช ื”ืคื™ืจืฆื”. ืคืจื™ื ื˜ ื ื™ื™ื˜ืžื™ื™ืจ ื”ื–ื›ื™ืจ ืœื ื• ืฉื’ื ืžืขืจื›ื•ืช ื”ื”ืคืขืœื” ืฉืœ ื”ืžื—ืฉื‘ื™ื ืฉืœื ื• ืคื’ื™ืขื•ืช ื•ืฉื‘ื“ื™ื•ืง ื›ืžื• ื‘ื˜ืœืคื•ื ื™ื, ื”ื—ื•ืœืฉื•ืช ื‘ืžืขืจื›ืช ื”ื”ืคืขืœื” ื”ืŸ ื”ื‘ื•ื ื ื–ื” ืฉืœ ื”ืกื™ื™ื‘ืจ ื”ื”ืชืงืคื™. (ื–ื™ื›ืจื• ืฉืคื™ืจืฆื” ื–ื• ื”ื™ืชื” ืงื™ื™ืžืช ื‘ื—ืœื•ื ื•ืช ื‘ื›ืœ ื”ื’ื™ืจืกืื•ืช, ื•ืจืง ื“ืžื™ื™ื ื• ื›ืžื” ืฉื ื™ื ื”ื™ื ืžืืคืฉืจืช ื’ื™ืฉื” ืคืชื•ื—ื” ืœื›ืœ ืžืขืจื›ืช ื—ืœื•ื ื•ืช ื‘ืขื•ืœื ืœืคื ื™ ืฉื”ืคื™ืจืฆื” ืชื•ืงื ื”, ื•ื›ืžื” ืคื™ืจืฆื•ืช ื›ืืœื” ืขื•ื“ ื™ืฉ ืฉืื ื—ื ื• ืœื ื™ื•ื“ืขื™ื ืขืœื™ื”ืŸ). ืืคืฉืจ ืœืžืฆื•ื ืขื•ื“ ืžื™ื“ืข ืขืœ Print Nightmare ื‘ืชื–ื›ื™ืจ ืฉืžื™ื™ืงืจื•ืกื•ืคื˜ ื”ื•ืฆื™ืื” ื›ืืŸ: https://msrc.microsoft.com/update-guide/vulnerability/CVE-2021-34527

ToCode
1 419
# ืœื ืžืืžื™ืŸ ืฉืœื ืขืฉื™ืชื™ Save ื‘ื™ืŸ ื›ืœ ื”ื‘ืื’ื™ื ืฉืืคืฉืจ ืœืคื’ื•ืฉ ืืœื” ืฉืงืฉื•ืจื™ื ืœื“ื‘ืจื™ื ื˜ืคืฉื™ื™ื ืžื—ื•ืฅ ืœืงื•ื“ ื”ื ื”ืžืจื’ื™ื–ื™ื ื‘ื™ื•ืชืจ- ื›ืฉืืชื” ืžื’ืœื” ืฉื”ืชื™ืงื•ืŸ ืฉืขืฉื™ืช ื‘ืงื•ื“ ืœื ื‘ืืžืช ื ืงืœื˜ ื›ื™ ื•ื•ื‘ืคืืง ื ืชืงืข, ืื—ืจื™ ื—ืฆื™ ืฉืขื” ืฉืืชื” ืžื ืกื” ืœื”ื‘ื™ืŸ ืœืžื” ื’ื ืื—ืจื™ ื”ืชื™ืงื•ืŸ ื“ื‘ืจื™ื ืœื ืขื•ื‘ื“ื™ื. ื›ืฉืืชื” ืžื’ืœื” ืฉืืชื” ืžื“ื‘ื’ ืืช ื”ื“ื‘ืจ ื”ืœื ื ื›ื•ืŸ, ื›ื™ ืฉื›ื—ืช ืœืœื—ื•ืฅ Save. ื›ืฉืืชื” ืžื’ืœื” ืฉื”ืžืขืจื›ืช ืœื ืขื•ื‘ื“ืช ื›ื™ ื”ืฉืชืžืฉืช ื‘ ^ ื‘ package.json ื•ื”ื•ืชืงื ื” ื’ื™ืจืกื” ื—ื“ืฉื” ืžื“ื™ ืฉืœ ืื—ืช ื”ืชืœื•ื™ื•ืช. ื›ืฉืืชื” ืžื’ืœื” ืฉื›ืœ ื”ื–ืžืŸ ื”ื–ื” ืฉื—ื™ืคืฉืช ืืช ื”ื‘ืขื™ื” ื‘ืขืฆื ื”ื™ื™ืช ืžื—ื•ื‘ืจ ืœืฉืจืช ื”ืœื ื ื›ื•ืŸ. ืžื” ืฉื›ืœ ื›ืš ืžืจื’ื™ื– ื‘ื‘ืื’ื™ื ื”ืืœื” ื”ื•ื ืฉืžืžืฉ ื‘ืงืœื•ืช ื”ื™ื” ืืคืฉืจ ืœื’ืœื•ืช ืื•ืชื, ืื ืจืง ื”ื™ื™ืชื™ ื—ื•ืฉื‘ ืขืœ ืœื‘ื“ื•ืง ืืช ื”ื“ื‘ืจ ื”ื ื›ื•ืŸ ืžื”ื”ืชื—ืœื”. ื•ื”ืื•ืคื˜ื™ืžื™ื•ืช ื‘ืžืคื’ืฉ ืขื ื›ืœ ื‘ืื’ ืžื”ืกื•ื’ ื”ื–ื” ื‘ืื” ืžื”ืฉื™ืขื•ืจ ืฉื”ื•ื ืžืœืžื“- ื›ืฉื“ื‘ืจื™ื ืžื•ื–ืจื™ื ืงื•ืจื™ื, ืงื•ื“ื ื›ืœ ืœืกื’ื•ืจ ื•ืœืคืชื•ื— ืืช webpack ืœืคื ื™ ืฉืžืžืฉื™ื›ื™ื. ื›ืฉื“ื‘ืจื™ื ืžื•ื–ืจื™ื ืงื•ืจื™ื, ืงื•ื“ื ื›ืœ ืœืขืฉื•ืช Save. ื›ืฉื“ื‘ืจื™ื ืžื•ื–ืจื™ื ืงื•ืจื™ื, ืงื•ื“ื ื›ืœ ืœื”ืฉื•ื•ืช ื’ื™ืจืกืื•ืช ืฉื”ื•ืชืงื ื• ืขื npm ls ื›ืฉื“ื‘ืจื™ื ืžื•ื–ืจื™ื ืงื•ืจื™ื, ืงื•ื“ื ื›ืœ ืœื”ืกืชื›ืœ ืขืœ ืื™ื–ื” ืฉืจืช ืื ื™ ืขื•ื‘ื“. ื›ื›ืœ ืฉืจืฉื™ืžืช ื”ื‘ื“ื™ืงื•ืช ื”ืžื”ื™ืจื•ืช ืฉืœื›ื ืžื“ื•ื™ืงืช ื™ื•ืชืจ ื•ืžืชืื™ืžื” ื™ื•ืชืจ ืœืžืฆื‘ื™ื ืฉืื ื—ื ื• ื ืชืงืœื™ื ื‘ื”ื ื‘ื™ื•ื ื™ื•ื, ื›ืš ืขื•ืœื” ืกื™ื›ื•ื™ ืœื—ืกื•ืš ืืช ื”ื”ืชื‘ืจื‘ืจื•ืช ื‘ืคืขื ื”ื‘ืื”.