en
Feedback
ToCode

ToCode

Open in Telegram

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

Show more
1 419
Subscribers
No data24 hours
No data7 days
+130 days
Posts Archive
ToCode
1 419
        <input type="text" value={text} onChange={handleChange} />
        <button onClick={reset}>Reset</button>
        <button onClick={deleteLastChar}>Delete Last Char</button>
        <button onClick={deleteTwoChars}>Delete Two Chars</button>
      </div>
    </div>
  );
}
ื”ื ื™ืกื™ื•ืŸ ืœื—ืกื•ืš ืืช ื” render ืฉืœ useEffect ื ืจืื” ื›ืžื• ืชื‘ื ื™ืช ื”ื’ื™ื•ื ื™ืช, ืื‘ืœ ืžืกืชื‘ืจ ืฉื”ื•ื ืขื•ื‘ื“ ื ื’ื“ ื”ื”ื’ื™ื•ืŸ ืฉืœ ืจื™ืืงื˜. ืื•ืชื• ืงื•ื“ ืขื useEffect ื”ื™ื” ื›ื‘ืจ ื›ืžืขื˜ ืขื•ื‘ื“:
export default function App() {
  const [text, setText] = React.useState("");
  const [resetCount, setResetCount] = React.useState(0);

  React.useEffect(() => {
    if (text === "") {
      setResetCount((c) => c + 1);
    }
  }, [text]);

  function handleChange(e) {
    setText(e.target.value);
  }

  function reset() {
    setText("");
  }

  function deleteLastChar() {
    setText((t) => t.slice(0, -1));
  }

  function deleteTwoChars() {
    deleteLastChar();
    deleteLastChar();
  }

  return (
    <div className="App">
      <h1>Hello CodeSandbox</h1>
      <div>
        <p>reset count = {resetCount}</p>
        <input type="text" value={text} onChange={handleChange} />
        <button onClick={reset}>Reset</button>
        <button onClick={deleteLastChar}>Delete Last Char</button>
        <button onClick={deleteTwoChars}>Delete Two Chars</button>
      </div>
    </div>
  );
}
ื•ืœืžื” ื›ืžืขื˜? ื›ื™ ืขื›ืฉื™ื• ืื ื—ื ื• ืžืงื‘ืœื™ื ื”ืคืขืœื” ืื—ืช ืžื™ื•ืชืจืช ืฉืœ ื”ืืคืงื˜ ื‘ืคืขื ื”ืจืืฉื•ื ื” ืฉื”ืงื•ืžืคื•ื ื ื˜ื” ืžื•ืคื™ืขื” ืขืœ ื”ืžืกืš, ื›ืœื•ืžืจ ื”ืขืจืš ืฉืœ resetCount ืžืชื—ื™ืœ ืžืื—ื“. ื”ื“ืจืš ื”ืžืงื•ื‘ืœืช ืœื”ืชืขืœื ืžื”ืืคืงื˜ ื”ืจืืฉื•ืŸ ื”ื™ื ืœื”ื•ืกื™ืฃ ืžืฉืชื ื” ref:
export default function App() {
  const [text, setText] = React.useState("");
  const [resetCount, setResetCount] = React.useState(0);
  const isFirstEffect = React.useRef(true);

  React.useEffect(() => {
    // skip the first time
    if (isFirstEffect.current) {
      isFirstEffect.current = false;
      return;
    }

    if (text === "") {
      setResetCount((c) => c + 1);
    }
  }, [text]);

  function handleChange(e) {
    setText(e.target.value);
  }

  function reset() {
    setText("");
  }

  function deleteLastChar() {
    setText((t) => t.slice(0, -1));
  }

  function deleteTwoChars() {
    deleteLastChar();
    deleteLastChar();
  }

  return (
    <div className="App">
      <h1>Hello CodeSandbox</h1>
      <div>
        <p>reset count = {resetCount}</p>
        <input type="text" value={text} onChange={handleChange} />
        <button onClick={reset}>Reset</button>
        <button onClick={deleteLastChar}>Delete Last Char</button>
        <button onClick={deleteTwoChars}>Delete Two Chars</button>
      </div>
    </div>
  );
}
ืžื•ื–ืžื ื™ื ืœืจืื•ืช ืืช ื”ื’ื™ืจืกื” ื”ืื—ืจื•ื ื” ืขื•ื‘ื“ืช ื‘ืงื•ื“ืกื ื“ื‘ื•ืงืก ื‘ืงื™ืฉื•ืจ ื”ื‘ื: https://codesandbox.io/s/affectionate-lamport-ddrc3y?file=/src/App.js.

ToCode
1 419
# ืื™ืš ืœื™ืจื•ืช ืœืขืฆืžืš ื‘ืจื’ืœ ื‘ืจื™ืืงื˜ ื‘ืชื›ื ื•ืช ืœื™ืจื•ืช ืœืขืฆืžืš ื‘ืจื’ืœ ื–ื” ืžื” ืฉืงื•ืจื” ื›ืฉืืชื” ืžืฉืชืžืฉ ื›ืœ ื›ืš ืœื ื ื›ื•ืŸ ื‘ืฉืคื” ืฉืืชื” ืขื•ืฉื” ืœืขืฆืžืš ื ื–ืง. ื‘ืจื™ืืงื˜ ื–ื” ืงื•ืจื” ืœื™ ื‘ื›ืœ ืžื” ืฉืงืฉื•ืจ ืœืขื“ื›ื•ืŸ ืกื˜ื™ื™ื˜ ื•ื‘ืžื™ื•ื—ื“ ื‘ื”ืขื‘ืจืช ื”ืขืจืš ื”ืœื ื ื›ื•ืŸ ืœืคื•ื ืงืฆื™ื™ืช ื” setState. ื ื™ืงื— ืงื•ืžืคื•ื ื ื˜ื” ืœื“ื•ื’ืžื” ืฉืžืฆื™ื’ื” ืชื™ื‘ืช ื˜ืงืกื˜ ื•ืกื•ืคืจืช ื›ืžื” ืคืขืžื™ื ื”ื˜ืงืกื˜ ื‘ืชื™ื‘ื” ืžืชืืคืก, ื›ืœื•ืžืจ ื›ืœ ืคืขื ืฉืžื™ืฉื”ื• ืžื•ื—ืง ืืช ื›ืœ ื”ื˜ืงืกื˜ ืžื”ืชื™ื‘ื” ืขืจืš ื”ืžื•ื ื” ืขื•ืœื” ื‘-1. ื™ื•ื“ืขื™ื ืžื”, ื•ื‘ืฉื‘ื™ืœ ืฉื™ื”ื™ื” ืžืขื ื™ื™ืŸ, ื ื™ืชืŸ ื’ื ื›ืคืชื•ืจ ืฉื‘ืœื—ื™ืฆื” ืขืœื™ื• ื”ื˜ืงืกื˜ ืžืชืืคืก:
export default function App() {
  const [text, setText] = React.useState("");
  const [resetCount, setResetCount] = React.useState(0);

  function handleChange(e) {
    setText(e.target.value);
    if (e.target.value === "") {
      setResetCount(resetCount + 1);
    }
  }

  function reset() {
    setText("");
    setResetCount(resetCount + 1);
  }

  return (
    <div className="App">
      <h1>Hello CodeSandbox</h1>
      <div>
        <p>reset count = {resetCount}</p>
        <input type="text" value={text} onChange={handleChange} />
        <button onClick={reset}>Reset</button>
      </div>
    </div>
  );
}
ืฉื™ืžื• ืœื‘ ืœืงื•ื“ ื”ื›ืคื•ืœ ื‘ืฉืชื™ ื”ืคื•ื ืงืฆื™ื•ืช handleChange ื• reset. ื™ืฉ ืฉืชื™ ื“ืจื›ื™ื ืงืœื•ืช ืœื›ืชื•ื‘ ืื•ืชื• ื‘ืฆื•ืจื” ื™ื•ืชืจ ื’ื ืจื™ืช: 1. ืืคืฉืจ ืœื›ืชื•ื‘ ืคื•ื ืงืฆื™ื” ืื—ืช ืฉืฉืชื™ ื”ืคื•ื ืงืฆื™ื•ืช ื™ืงืจืื• ืœื”, ื•ื”ื™ื ื’ื ืชืคืขื™ืœ ืืช setText ื•ื’ื ืชื‘ื“ื•ืง ืื ื”ื˜ืงืกื˜ ืจื™ืง ื•ืชืขืœื” ืืช ื”ืžื•ื ื”. 2. ืืคืฉืจ ืœื”ืฉืชืžืฉ ื‘ useEffect ืฉื™ื‘ื“ื•ืง ืื ื”ื˜ืงืกื˜ ื”ืชืจื•ืงืŸ ื•ื™ืขื“ื›ืŸ ืืช ื”ืžื•ื ื”. ื”ื™ืชืจื•ืŸ ื‘ื’ื™ืฉื” ื”ืจืืฉื•ื ื” ื”ื•ื ื‘ื™ืฆื•ืขื™ื. ื‘ืžืงื•ื ืœืฉื ื•ืช ืืช ื”ื˜ืงืกื˜, ืœืงืจื•ื ืœ render, ืœื’ืœื•ืช ืฉื”ื˜ืงืกื˜ ื”ืชืขื“ื›ืŸ ื•ืื– ืœืฉื ื•ืช ืืช ื”ืžื•ื ื” ื•ืฉื•ื‘ ืœืงืจื•ื ืœ render, ืื ื—ื ื• ืขื•ืฉื™ื ืืช ื”ื›ืœ ื‘ืคืขื ืื—ืช. ื”ืงื•ื“ ืื—ืจื™ ืขื™ื“ื›ื•ืŸ ื ืจืื” ื›ืš:
export default function App() {
  const [text, _setText] = React.useState("");
  const [resetCount, setResetCount] = React.useState(0);

  function setText(newText) {
    _setText(newText);
    if (text !== "" && newText === "") {
      setResetCount(resetCount + 1);
    }
  }

  function handleChange(e) {
    setText(e.target.value);
  }

  function reset() {
    setText("");
  }

  return (
    <div className="App">
      <h1>Hello CodeSandbox</h1>
      <div>
        <p>reset count = {resetCount}</p>
        <input type="text" value={text} onChange={handleChange} />
        <button onClick={reset}>Reset</button>
      </div>
    </div>
  );
}
ืขื•ื‘ื“? ืขื•ื‘ื“. ืื‘ืœ ื‘ืžืงื•ื ืœืงื‘ืœ ืคื™ืชืจื•ืŸ ื’ื ืจื™, ื”ื˜ืžื ื• ื‘ืงื•ื“ ืžื•ืงืฉ. ื›ื™ ืขื›ืฉื™ื• ื‘ื•ืื• ื ื•ืกื™ืฃ ื›ืคืชื•ืจ ืฉืžื•ื—ืง ืืช ื”ืชื• ื”ืื—ืจื•ืŸ ืžื”ื˜ืงืกื˜. ื‘ื™ื•ื ืจื’ื™ืœ ืื ื™ ื™ื•ื“ืข ืฉื‘ืงืจื™ืื” ืœ setter ืฉืชืœื•ื™ ื‘ืขืจืš ื”ืงื•ื“ื ื›ื“ืื™ ืœื™ ืœื”ืขื‘ื™ืจ ืœ setter ืคื•ื ืงืฆื™ื”, ืื‘ืœ ื”ืคืขื ื›ื‘ืจ ื™ืฉ ืœื™ ืคื•ื ืงืฆื™ื™ืช setText ืฉื™ื•ื“ืขืช ืœื˜ืคืœ ื‘ืงืฉืจ ื‘ื™ืŸ ืฉื ื™ ืžืฉืชื ื™ ื”ืกื˜ื™ื™ื˜, ื•ืื ื™ ืจื•ืฆื” ืœื”ืžืฉื™ืš ืœื”ืฉืชืžืฉ ื‘ื”, ืื– ืื ื™ ืขืœื•ืœ ืœืงื—ืช ืืช ื”ืฆืขื“ ื”ืจืืฉื•ืŸ ืœื›ื™ื•ื•ืŸ ื”ืื‘ื“ื•ืŸ:
  function deleteLastChar() {
    setText(text.slice(0, -1));
  }

  return (
    <div className="App">
      <h1>Hello CodeSandbox</h1>
      <div>
        <p>reset count = {resetCount}</p>
        <input type="text" value={text} onChange={handleChange} />
        <button onClick={reset}>Reset</button>
        <button onClick={deleteLastChar}>Delete Last Char</button>
      </div>
    </div>
  );
ื•ืœืžื” ืฆืขื“ ืœื›ื™ื•ื•ืŸ ื”ืื‘ื“ื•ืŸ? ื›ื™ ื”ืงื•ื“ ืขื“ื™ื™ืŸ ืขื•ื‘ื“ ืื‘ืœ ื”ืžื•ืงืฉื™ื ืจืง ืžืชืจื‘ื™ื. ืื ืขื›ืฉื™ื• ืื ื™ ืจื•ืฆื” ืœื”ื•ืกื™ืฃ ื›ืคืชื•ืจ ืœืžื—ื™ืงืช ืฉื ื™ ืชื•ื•ื™ื - ืฉื›ืžื•ื‘ืŸ ื™ืฉืชืžืฉ ื‘ืคื•ื ืงืฆื™ื” ืฉื›ื‘ืจ ื™ืฉ ืœื™ - ืื– ื”ืงื•ื“ ื™ืคืกื™ืง ืœืขื‘ื•ื“:
export default function App() {
  const [text, _setText] = React.useState("");
  const [resetCount, setResetCount] = React.useState(0);

  function setText(newText) {
    _setText(newText);
    if (text !== "" && newText === "") {
      setResetCount(resetCount + 1);
    }
  }

  function handleChange(e) {
    setText(e.target.value);
  }

  function reset() {
    setText("");
  }

  function deleteLastChar() {
    setText(text.slice(0, -1));
  }

  function deleteTwoChars() {
    deleteLastChar();
    deleteLastChar();
  }

  return (
    <div className="App">
      <h1>Hello CodeSandbox</h1>
      <div>
        <p>reset count = {resetCount}</p>

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

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

ToCode
1 419
# ื˜ื™ืค ืงื•ื“ ืจื™ื•ื•ื™ื•: ื”ืชืžืงื“ื• ื‘ื“ื‘ืจ ืื—ื“ ื”ืจื‘ื” ืคืขืžื™ื ื›ืฉื—ื‘ืจื™ื ืื• ืชืœืžื™ื“ื™ื ื”ื’ื™ืขื• ืœื”ืจืื•ืช ืœื™ ืงื˜ืข ืงื•ื“ ืžืกื•ื™ื ื”ืกืชื›ืœืชื™ ื‘ื˜ืขื•ืช ืงื•ื“ื ื›ืœ ืขืœ ืขืฆืžื™, ื•ื”ืชื™ื—ืกืชื™ ืœื–ื” ื›ืžื• ืžืฉื—ืง: ื”ืื ืื ื™ ืžืกื•ื’ืœ ืœืžืฆื•ื ืืช ื›ืœ ื”ื‘ืขื™ื•ืช ื‘ืงื•ื“? ื”ืื ื™ื”ื™ื• ืœื™ ืจืขื™ื•ื ื•ืช ืžืกืคื™ืง ื˜ื•ื‘ื™ื ืœืชื™ืงื•ืŸ ืื• ืฉื™ืคื•ืจ? ืื• ืœืคืขืžื™ื "ื‘ื•ืื• ื ืžืฆื ืืช ื›ืœ ื”ื“ืจื›ื™ื ื‘ื”ืŸ ืืคืฉืจ ืœืฉืคืจ ืืช ื”ืงื•ื“". ื—ืฉื‘ืชื™ ื’ื ืฉืื ืฉื™ื ืžืขื“ื™ืคื™ื ืœืงื‘ืœ ืคื™ื“ื‘ืง ื›ืžื” ืฉื™ื•ืชืจ ืžืคื•ืจื˜, ื•ืฉื”ื ื›ื‘ืจ ื™ืืจื’ื ื• ืœืขืฆืžื ืืช ื”ื–ืžืŸ ื•ื”ื”ืชืžื•ื“ื“ื•ืช ืขื ืื•ืชื• ืคื™ื“ื‘ืง. ื›ืžื• ืžื•ื›ืจ ืชืคื•ื—ื™ื ืฉืžืกื™ื™ื ืืช ื”ืขื‘ื•ื“ื” ืฉืœื• ืื—ืจื™ ืฉื”ื•ื ื ื•ืชืŸ ืœืš ืืช ื”ืชืคื•ื—ื™ื. ื–ืืช ืœื ื‘ืขื™ื” ืฉืœื• ืื ืืชื” ื™ื•ื“ืข ืื• ืœื ื™ื•ื“ืข ืื™ืš ืžื›ื™ื ื™ื ืขื•ื’ื”. ื”ื‘ืขื™ื” ืขื ื”ื“ืจืš ื”ื–ืืช ื”ื™ื ื”ื”ืชืžืงื“ื•ืช ื‘ืื™ื ื˜ืจืงืฆื™ื” ืื—ืช ื•ื”ืžื—ืฉื‘ื” ืฉื”ืื™ื ื˜ืจืงืฆื™ื” ืชื”ื™ื” ื—ื“-ืคืขืžื™ืช. ื–ื” ืœื ืชืžื™ื“ ื‘ืจื™ื ื‘ืงื•ื ื˜ืงืกื˜ ืฉืœ ืงื•ืจืก, ื•ื–ื” ืžืื•ื“ ืœื ื‘ืจื™ื ื‘ืงื•ื ื˜ืงืกื˜ ืฉืœ ืžื ื˜ื•ืจื™ื ื’ ืื• ืขื‘ื•ื“ื” ืขื ืžืชื›ื ืชื™ื ืฆืขื™ืจื™ื ืืฆืœื›ื ื‘ื—ื‘ืจื”. ืจืขื™ื•ืŸ ืฉืื ื™ ืžืฉื—ืง ืื™ืชื• ืœืื—ืจื•ื ื” ื•ื‘ื™ื ืชื™ื™ื ืขื•ื‘ื“ ืœื ืจืข ื”ื•ื ืœื”ืกืชื›ืœ ืขืœ Code Review ื‘ืชื•ืจ ืชื”ืœื™ืš ื•ืœื”ืชืžืงื“ ื›ืœ ืคืขื ื‘ื ืงื•ื“ื” ืื—ืช. ื–ื” ืื•ืžืจ ืฉืื ืืชื ื™ื•ืฉื‘ื™ื ืœืขื‘ื•ืจ ืขืœ ืงื•ื“ ืฉืœ ื—ื‘ืจ ื•ืจื•ืื™ื ื‘ื• ื’ื ืฉื™ืžื•ืฉ ื‘ืืœื’ื•ืจื™ืชื ืœื ืžืกืคื™ืง ื™ืขื™ืœ, ื’ื ื—ื•ืกืจ ืขืงื‘ื™ื•ืช ื‘ืฉืžื•ืช ืžืฉืชื ื™ื, ื’ื ื—ืœื•ืงื” ืœื ืžืกืคื™ืง ื˜ื•ื‘ื” ืœืคื•ื ืงืฆื™ื•ืช, ื’ื ื‘ืขื™ื™ืช ืื‘ื˜ื—ื” ื•ื’ื ืฉืื•ืชื• ื—ื‘ืจ ืฉื›ื— ืœื›ืชื•ื‘ ื‘ื“ื™ืงื•ืช - ืืชื ืœื ืชื’ื™ื“ื• ืืช ื›ืœ ื”ื“ื‘ืจื™ื ื‘ Code Review. ื‘ืžืงื•ื ื–ื”, ืชื‘ื—ืจื• ื“ื‘ืจ ืื—ื“ ืฉืืคืฉืจ ืœืชืงืŸ ื•ืชื’ื™ื‘ื• ืจืง ืขืœื™ื•. ื‘ืคืขื ื”ื‘ืื” ืชืžืฉื™ื›ื• ืœื“ื‘ืจ ืขืœ ืื•ืชื• ื“ื‘ืจ ืขื“ ืฉื”ื‘ืขื™ื” ื”ื–ืืช ื ืคืชืจืช ื‘ื›ืœ ืงื•ื“ ืขืชื™ื“ื™ ืฉื”ื—ื‘ืจ ื”ืฆืขื™ืจ ืฉืœื›ื ื›ื•ืชื‘, ื•ืจืง ืื– ืชืžืฉื™ื›ื• ืœื“ื‘ืจ ืขืœ ื”ื“ื‘ืจ ื”ื‘ื. ื”ืื ื–ื” ื™ืคืชื•ืจ ืืช ื›ืœ ื‘ืขื™ื•ืช ื”ืขื•ืœื? ื›ื ืจืื” ืฉืœื. ืื‘ืœ ื™ื›ื•ืœ ืœื”ื™ื•ืช ืฉื’ื™ืฉื” ื›ื–ืืช ืชืฉืคืจ ื‘ืงืฆืช ืืช ื”ื“ื™ื ืžื™ืงื” ืืฆืœื›ื ื‘ื—ื‘ืจื” ื•ืชื’ืจื•ื ืœืื ืฉื™ื ืœืจืฆื•ืช ื™ื•ืชืจ ืœืฉืžื•ืข ืืช ื”ื“ืขื” ืฉืœื›ื. (ื•ืžืฆื“ ืฉื ื™ ื’ื ื™ื›ื•ืœ ืœื”ื™ื•ืช ืฉืœื. ืื ื™ ืจืง ืžืฉื—ืง ืขื ื”ืจืขื™ื•ืŸ ื”ื–ื” ื›ืžื” ืฉื‘ื•ืขื•ืช. ืื ืืชื ื’ื ืžื ืกื™ื ืื• ื ื™ืกื™ืชื ืžืฉื”ื• ื“ื•ืžื” ืืฉืžื— ืœืฉืžื•ืข ืื™ืš ื”ืœืš ืœื›ื ื‘ืชื’ื•ื‘ื•ืช).

ToCode
1 419
# ื“ื‘ืจื™ื ืฉื”ื™ื• ืงืฉื™ื ื•ืขื›ืฉื™ื• ืงืœื™ื ื•ืื ื—ื ื• ื’ืณื•ืœื™ื” ืื‘ื ืก ืคื™ืจืกืžื” ืืชืžื•ืœ ืคื•ืกื˜ ืžื•ืฆืœื— ืขืœ ื“ื‘ืจื™ื ืฉืคืขื ื”ื™ื• ืงืฉื™ื ื•ืขื›ืฉื™ื• ืงืœื™ื. ืืœื” ืขื™ืงืจื™ ื”ื“ื‘ืจื™ื ืขื ื›ืžื” ืชื•ืกืคื•ืช ืฉืœื™: ืชืขื•ื“ื•ืช SSL (ื˜ื™ืจื•ืฃ) ื–ื™ื”ื•ื™ ืชืžื•ื ื” (ื”ื‘ื“ื™ื—ื” ื”ื–ืืช ืœืžืฉืœ ื›ื‘ืจ ืœื ืจืœื•ื•ื ื˜ื™ืช) ืœื”ืจื™ื ืฉืจืช ื‘ืขื ืŸ ืคื™ืชื•ื— ืžืžืฉืง ืžืฉืชืžืฉ ื—ื•ืฆื” ืคืœื˜ืคื•ืจืžื•ืช ื”ืขื‘ืจืช ืงื•ื“ ื›ื•ืœืœ ื›ืœ ื”ืชืœื•ื™ื•ืช ืžืžื›ื•ื ื” ืœืžื›ื•ื ื” (ื”ื™ื•ืฉ ื“ื•ืงืจ) ื”ืงืžืช ืชืฉืชื™ืช CI/CD ืžืœืื” ื‘ื—ื™ื ื (ื”ื™ื•ืฉ ื’ื™ื˜ื”ืื‘) ื™ื™ืฉื•ืžื™ ื•ื•ื‘ ื‘ื–ืžืŸ ืืžืช (ื–ื•ื›ืจื™ื ื›ืฉื”ืฆ'ื˜ ื‘ื’'ื™ืžื™ื™ืœ ื”ื™ื” ื ืจืื” ื›ืžื• ื”ื‘ืจืงื” ื˜ื›ื ื•ืœื•ื’ื™ืช?) ื–ื™ืจื• ื“ืื•ื ื˜ื™ื™ื ื“ื™ืคืœื•ื™ืžื ื˜ืก ืœืžืจื›ื– ื“ื‘ืจื™ื ื‘ CSS ืชืžื™ื›ื” ื‘ื“ืคื“ืคื ื™ื ื™ืฉื ื™ื (ื›ืŸ ื”ื™ื” ืคืขื ื“ื‘ืจ ืฉื ืงืจื IE) ืžื” ืฉืžืขื ื™ื™ืŸ ืœืจืื•ืช ื›ืืŸ ื–ื” ืื™ืš ื”ืฉื™ื ื•ื™ื™ื ื”ื˜ื›ื ื•ืœื•ื’ื™ื™ื ื”ืืœื” ืื•ืžื ื ืฉื™ื ื• ืืช ื”ืžื•ืฆืจื™ื ืฉืื ื—ื ื• ื‘ื•ื ื™ื, ืื‘ืœ ืœื ืฉื™ื ื• ืืช ื”ืขื‘ื•ื“ื” ืฉืœื ื•. ื–ื” ืœื ืฉืขื›ืฉื™ื• ืžืชื›ื ืชื™ื ื™ื›ื•ืœื™ื ืœืฉื‘ืช ื‘ื™ื ื•ื”ืงื•ื“ ื›ื•ืชื‘ ืืช ืขืฆืžื•. ืื ื—ื ื• ืขื“ื™ื™ืŸ ืคื•ืชืจื™ื ืืช ืื•ืชื ื‘ืื’ื™ื, ืžืชืžื•ื“ื“ื™ื ืขื ืื•ืชื ื“ื“ืœื™ื™ื ื™ื ื•ืขื ืื•ืชื ื“ืžื•ืื™ื ืฉืžืชืจืกืงื™ื ืชืžื™ื“ ื‘ืจื’ืข ื”ืœื ื ื›ื•ืŸ. ื•ืื•ืœื™ ื™ืฉ ื‘ื–ื” ืžืฉื”ื• ืžืขื•ื“ื“. ื›ืŸ, ื™ื”ื™ื• ืขื•ื“ ืื™ื ืกื•ืฃ ื˜ื›ื ื•ืœื•ื’ื™ื•ืช ื—ื“ืฉื•ืช ืฉื ืฆื˜ืจืš ืœืœืžื•ื“, ืื‘ืœ ื”ื ื™ืกื™ื•ืŸ ืฉืื ื—ื ื• ืฆื•ื‘ืจื™ื ื”ื•ื ื‘ืขืœ ืขืจืš. ื”ืขื‘ื•ื“ื” ื”ืืžื™ืชื™ืช - ืฉื”ื™ื ื”ื™ื›ื•ืœืช ืœื”ืชืžื•ื“ื“ ืขื ืืชื’ืจื™ื, ืœืœืžื•ื“, ืœืคืชื•ืจ ื‘ืขื™ื•ืช ื—ื›ืžื•ืช ื‘ื“ืจื›ื™ื ื™ืฆื™ืจืชื™ื•ืช - ื–ื” ืœื ื”ื•ืœืš ืœืฉื•ื ืžืงื•ื. ืจืง ื”ื›ืœื™ื ื™ืฉืชื ื•.

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

ToCode
1 419
# ืฉื›ืชื•ื‘ ื“ื•ื’ืžืช ืชืงืฉื•ืจืช ื‘ ClojureScript ืฉื›ืชื‘ืชื™ ืœืคื ื™ ืฉื ืชื™ื™ื ื‘ืคื•ืกื˜ ืืจื‘ืข ืชื‘ื ื™ื•ืช ืœืงื•ืžืคื•ื ื ื˜ื•ืช React ืžืชื•ืจื’ืžื•ืช ืœ ClojureScript ื• Reagent ื”ืจืื™ืชื™ ืื™ืš ืœืขื‘ื•ื“ ืขื ืจื™ืื™ื™ื’'ื ื˜ ื•ืœื›ืชื•ื‘ ืงื•ืžืคื•ื ื ื˜ื•ืช ืจื™ืืงื˜ ื‘ clojurescript. ื”ื“ื•ื’ืžื” ื”ืื—ืจื•ื ื” ื‘ืื•ืชื• ืคื•ืกื˜, ื•ื–ื• ืฉื‘ื’ืœืœื” ืฉืžืจืชื™ ืžืจื—ืง ืžืจื™ืื™ื™ื’'ื ื˜ ื‘ืฉื ืชื™ื™ื ื”ืื—ืจื•ื ื•ืช ื”ื™ืชื” ื“ื•ื’ืžื” ืœืชืงืฉื•ืจืช ajax. ื”ื™ื ื”ื™ืชื” ืฉื•ื ื” ืžืงื•ื“ ืฉืื ื™ ืจื’ื™ืœ ืœื›ืชื•ื‘ ื‘ืจื™ืืงื˜, ื•ืื•ืœื™ ื‘ื’ืœืœื™ ื•ืื•ืœื™ ื‘ื’ืœืœ ืจื™ืื™ื™ื’'ื ื˜ ืขื‘ื“ื” ืคื—ื•ืช ื˜ื•ื‘ ืžืงื•ื“ ื’'ืื•ื•ื”ืกืงืจื™ืคื˜ ืžืงื‘ื™ืœ ืฉื”ื™ื™ืชื™ ื›ื•ืชื‘. ื”ืงื•ืฉื™ ื”ืขื™ืงืจื™ ืฉืœื™ ื‘ืชืจื’ื•ื ื”ืงื•ื“ ืž JavaScript ืœืจื™ืื™ื™ื’'ื ื˜ ื”ื™ืชื” ื—ื•ืกืจ ื”ืชืžื™ื›ื” ื‘ Hooks, ื•ื‘ืคืจื˜ useEffect ืฉื”ื™ื” ืœื™ ืžืื•ื“ ื—ืกืจ. ืฉื ืชื™ื™ื ืขื‘ืจื• ื• Hooks ืงื™ื‘ืœื• ืชืžื™ื›ื” ืžืœืื” ื•ืžืคื ืงืช ื‘ืจื™ืื™ื™ื’'ื ื˜ ื•ื–ืืช ื”ื™ืชื” ื‘ืฉื‘ื™ืœื™ ื”ื–ื“ืžื ื•ืช ืœื›ืชื•ื‘ ืžื—ื“ืฉ ืืช ื”ื“ื•ื’ืžื” ื”ื”ื™ื ื‘ืงื•ื“ ืฉื™ืจืื” ื”ืจื‘ื” ื™ื•ืชืจ ื™ื“ื™ื“ื•ืชื™ ืœืžืชื›ื ืชื™ JavaScript. ืื– ื‘ืœื™ ื™ื•ืชืจ ืžื“ื™ ื”ืงื“ืžื•ืช ื‘ื•ืื• ื ืจืื” ืืช ืฉืชื™ ื”ื’ื™ืจืกืื•ืช. ## ื’ื™ืจืกื” ื™ืฉื ื” ืฉืœื ืขื‘ื“ื” ืžืœืคื ื™ ืฉื ืชื™ื™ื ื‘ืคื•ืกื˜ ืฉื›ืชื‘ืชื™ ืœืคื ื™ ืฉื ืชื™ื™ื ื”ืจืื™ืชื™ ืืช ื”ื’ื™ืจืกื” ื”ื‘ืื” ืฉืœื ืขื‘ื“ื”:
(defn pokemon-character [{id :id}]
  (r/with-let [
               data (r/atom {})
               active (r/atom true)
               request (go
                         (let [response (<! (http/get 
                                              (str "https://pokeapi.co/api/v2/pokemon/" @id)
                                              {:with-credentials? false}))]
                           (if (true? @active) (reset! data (:body response)) nil)))
               ]
    [:div
     [:p "ID: " @id]
     [:p "Name: " (str (get @data :name))]]))
ื”ื‘ืขื™ื” ืื™ืชื” ื”ื™ื ืฉื”ืคืงื•ื“ื” with-let ืงื•ืจื™ืช ืจืง ืคืขื ืื—ืช, ื•ืœื›ืŸ ื›ืฉื” id ื™ืฉืชื ื” ืœื ืชืฆื ื‘ืงืฉืช ืชืงืฉื•ืจืช ื—ื“ืฉื”. ื‘ืขื™ื” ืงื˜ื ื” ื ื•ืกืคืช ื”ื™ื ื”ืฉื™ืžื•ืฉ ื‘ request ืฉื–ื• ืกืคืจื™ื™ืช ืชืงืฉื•ืจืช ืฉืœ cljs, ื‘ืžืงื•ื ื‘ืงื•ื“ ื”ืชืงืฉื•ืจืช ื”ืžื•ื›ืจ ืฉืœ ื”ื“ืคื“ืคืŸ. ## ื’ื™ืจืกื” ืฉืขื•ื‘ื“ืช ื”ื™ื•ื ืขื ื”ืชืžื™ื›ื” ื‘ hooks ื•ืฉื™ืคื•ืจ ื”ื—ื™ื‘ื•ืจ ื‘ื™ืŸ clojurescript ืœื“ืคื“ืคืŸ ื”ืฆืœื—ืชื™ ืœืฉื›ืชื‘ ืืช ื”ืงื•ื“ ื•ืœื”ื’ื™ืข ืœื’ื™ืจืกื” ื”ื‘ืื” ืฉืื ื™ ื“ื™ ืื•ื”ื‘:
(defn use-pokemon [id]
  (let [[data set-data] (react/useState {})
        active? (r/atom true)]
    (react/useEffect (fn []
                       (go
                         (let [response (<p! (js/fetch
                                               (str "https://pokeapi.co/api/v2/pokemon/" id)))
                               data (<p! (.json response))]
                           (if @active? (set-data data))))
                       (fn []
                         (reset! active? false)))
                     (array id))
    data))
ื‘ื•ืื• ื ืจืื” ืžื” ื™ืฉ ืคื”: 1. ืฉื™ืžื•ืฉ ื‘ useState ื›ื“ื™ ืœืฉืžื•ืจ ืืช ื”ืžื™ื“ืข ืฉื—ื•ื–ืจ ืžื”ืฉืจืช, ืขื•ื‘ื“ ื‘ื“ื™ื•ืง ื›ืžื• ื‘ JavaScript. 2. ื”ืžืฉืชื ื” active? ืžื•ื’ื“ืจ ื‘ืชื•ืจ ืื˜ื•ื ื›ื“ื™ ืฉืืคืฉืจ ื™ื”ื™ื” ืœืฉื ื•ืช ืืช ื”ืขืจืš ืฉืœื•. ื‘ื“ืจืš ื›ืœืœ ืžืฉืชื ื™ื ื‘ Clojure ื”ื Immutable, ืื‘ืœ ืคื” ื‘ืืžืช ื”ื™ื™ืชื™ ืฆืจื™ืš Mutable Data ื‘ืฉื‘ื™ืœ ืœืืคืฉืจ ื‘ื™ื˜ื•ืœ ืฉืœ ื”ืืคืงื˜ ืœืคื™ ื”ืžืžืฉืง ืฉืœ useEffect. 3. ื”ืงืจื™ืื” ืœ useEffect ื ืจืื™ืช ื‘ื“ื™ื•ืง ื›ืžื• ื‘ JavaScript. ื”ืคืจืžื˜ืจ ื”ืจืืฉื•ืŸ ื”ื•ื ืคื•ื ืงืฆื™ื™ืช ื”ืืคืงื˜, ืฉืžื—ื–ื™ืจื” ืคื•ื ืงืฆื™ื™ืช ื‘ื™ื˜ื•ืœ, ื•ื”ืคืจืžื˜ืจ ื”ืฉื ื™ ื”ื•ื ืžืขืจืš ื”ืชืœื•ื™ื•ืช. 4. ืงื•ื“ ื”ืชืงืฉื•ืจืช ืžืฉืชืžืฉ ื‘ fetch API ื”ืจื’ื™ืœ ืฉืœ ื”ื“ืคื“ืคืŸ. ื”ืžืืงืจื• go ื”ื•ื ื”ืžืงื‘ื™ืœื” ื”ืงืœื•ื–'ืจืกืงืจื™ืคื˜ื™ืช ืœ async ื•ื”ืžืืงืจื• "ืงื˜ืŸ ืž p ื•ืื– ืกื™ืžืŸ ืงืจื™ืื”" ื”ื•ื ื”ืžืงื‘ื™ืœื” ื”ืงืœื•ื–'ืจืกืงืจื™ืคื˜ื™ืช ืœ await. ื•ื–ื” ื‘ืกืš ื”ื›ืœ ื™ืคื” ื›ื™ ืขื›ืฉื™ื• ืื ื™ ื™ื›ื•ืœ ืœื”ืฉืชืžืฉ ื‘ืคื•ื ืงืฆื™ื” use-pokemon ื‘ืชื•ืš ืงื•ืžืคื•ื ื ื˜ื” ื‘ืื•ืคืŸ ื”ื‘ื:
(defn pokemon [id]
  (let [
        data (use-pokemon id)
        ]
      [:div
       [:p "ID: " (.stringify js/JSON id)]
       [:p "Name " (aget data "name")]]))
ื•ื”ื›ืœ ืขื•ื‘ื“ ื•ื”ืงื•ืžืคื•ื ื ื˜ื” ื ืฉืืจืช ื ืงื™ื” ื•ืžืžื•ืงื“ืช. ืžื•ื–ืžื ื™ื ืœืจืื•ืช ืืช ื”ืงื•ื“ ื”ืžืœื ืขื ื›ืœ ื” require-ื™ื ื‘ื’ื™ืกื˜: https://gist.github.com/ynonp/57c429315d282a82b145a0b94db92cb7

ToCode
1 419
1. ื”ืคืงื•ื“ื” r/atom ื™ื•ืฆืจืช ืื˜ื•ื, ืฉื–ื” ื“ื‘ืจ ืฉืฉื•ืžืจ ืžื™ื“ืข ืฉื™ื›ื•ืœ ืœื”ืฉืชื ื•ืช. ืจื•ื‘ ื”ืžื™ื“ืข ื‘ืงืœื•ื–'ืจ ื”ื•ื Immutable, ื•ื‘ื“ืจืš ื›ืœืœ ื™ื”ื™ื” ืœื ื• ืื˜ื•ื ื’ื“ื•ืœ ืื• ืžืกืคืจ ืื˜ื•ืžื™ื ื›ื“ื™ ืœื”ื—ื–ื™ืง ืืช ื”ืžื™ื“ืข ื”ืžืฉืชื ื” ืฉืœ ื”ื™ื™ืฉื•ื. ืืคืฉืจ ืœื—ืฉื•ื‘ ืขืœ ื”ืื˜ื•ื ื›ืžื• Store ื‘ืจื™ื“ืืงืก ืื• ืžื•ื‘ืืงืก. 2. ื”ืื˜ื•ื ื”ืžืจื›ื–ื™ ืืฆืœื™ ื‘ืชื•ื›ื ื™ืช ื”ื•ื ืจืฉื™ืžืช ื”ืงืœืคื™ื. ื™ืฉ ื’ื ืื˜ื•ื ืฉืžื˜ืคืœ ื‘ timeout ื›ื“ื™ ืฉื‘ืœื—ื™ืฆื” ืขืœ ืงืœืฃ ืื—ืจื™ ืฉื›ื‘ืจ ื™ืฉ ืฉื ื™ื™ื ื’ืœื•ื™ื™ื ื ืงืฆืจ ืืช ื” timeout ื•ืžื™ื“ ื ืกืชื™ืจ ืืช ืžื” ืฉื’ืœื•ื™. 3. ื”ืคื•ื ืงืฆื™ื” click-on, ืฉื›ื ืจืื” ื”ื™ืชื” ืฆืจื™ื›ื” ืœื”ื™ืงืจื handle-click, ื”ื™ื ื ืงื•ื“ืช ื”ื›ื ื™ืกื” ืœืงื•ื“ ื•ื”ื™ื ื ืงืจืืช ื›ืฉืžืฉืชืžืฉ ืœื•ื—ืฅ ืขืœ ืงืœืฃ. ื”ื™ื ืžืงื‘ืœืช ืืช ื” id ืฉืœ ื”ืงืœืฃ, ื‘ื•ื“ืงืช ืžื” ืžืฆื‘ ื”ืขื ื™ื™ื ื™ื ื‘ืžืฉื—ืง ื•ืžืขื“ื›ื ืช ืืช ืžืืคื™ื™ื ื™ ื”ืงืœืคื™ื. ื”ื™ื ื ืขื–ืจืช ื‘ืคื•ื ืงืฆื™ื•ืช ื”ืขื–ืจ ื”ืื—ืจื•ืช ืฉื›ืชื•ื‘ื•ืช ื‘ืงื•ื‘ืฅ. ื‘ืงื•ื‘ืฅ ื” UI ืขื“ื›ื ืชื™ ืืช ื”ืงื•ื“ ืœ home-page ื›ืš ืฉื™ืฆื™ื’ ืืช ืจืฉื™ืžืช ื”ืงืœืคื™ื ื•ืื—ืจื™ ื”ืฉื™ื ื•ื™ ื”ื•ื ื ืจืื” ื›ืš:
(defn home-page []
  (fn []
    [:span.main
     [:h1 "Welcome to my-reagent-app"]
     [:ul {:class "cards"}
      (for [item @cards/cards]
        ^{:key (:id item)}
        [:li {
              :class [(if (:visible item) "visible" "hidden")
                      (when (:found item) "found")]
              :on-click #(cards/click-on (:id item))
              } (:value item)])]]))

ืื ื™ ืžืื•ื“ ืื”ื‘ืชื™ ืืช ื”ื›ืชื™ื‘ ืฉืœ reagent. ืื ื™ ื—ื•ืฉื‘ ืฉื”ื•ื ื”ืจื‘ื” ื™ื•ืชืจ ื ืงื™ ื•ืงืœ ืœืชื—ื–ื•ืงื” ื‘ื”ืฉื•ื•ืื” ืœ jsx. ื›ืœ ืงื•ืžืคื•ื ื ื˜ื” ืžื™ื•ืฆื’ืช ืขืœ ื™ื“ื™ ืจืฉื™ืžื” ืฉืžืชื—ื™ืœื” ื‘ keyword ื›ืœืฉื”ื•, ืื—ืจ ื›ืš hash-map ืฉืœ ืžืืคื™ื™ื ื™ื ื•ื‘ืกื•ืฃ ื”ื˜ืงืกื˜ ืื• ื”ื™ืœื“ื™ื ืฉืœ ื”ืืœืžื ื˜. ## ืžื” ื”ืœืื” ืืชื ื™ื›ื•ืœื™ื ืœืžืฆื•ื ืืช ืžืฉื—ืง ื”ื–ื™ื›ืจื•ืŸ ื”ืžืœื ืฉืœื™ ื‘ื’ื™ื˜ื”ืื‘ ื‘ืงื™ืฉื•ืจ: https://github.com/ynonp/cljs-memory-game. ื•ืื ืืชื ืจื•ืฆื™ื ืœื“ืขืช ื™ื•ืชืจ ืขืœ ืจื™ืื™ื™ื’'ื ื˜ ืฉื•ื•ื” ืœืงืจื•ื ืืช ื”ืžื“ืจื™ืš ื”ืงืฆืจ ืฉืœื”ื ื‘ืงื™ืฉื•ืจ: https://reagent-project.github.io/.

ToCode
1 419
# ืžืฉื—ืง ื–ื™ื›ืจื•ืŸ ื‘ ClojureScript ื‘ืคืขื ื”ืงื•ื“ืžืช ืฉืฉื™ื—ืงืชื™ ืขื ืงืœื•ื–'ืจืกืงืจื™ืคื˜ ื•ืจื™ืื™ื™ื’'ื ื˜ ื™ืจื“ืชื™ ืžืžื ื• ื‘ื’ืœืœ ืฉืœื ื”ื™ืชื” ืชืžื™ื›ื” ื‘ Hooks. ืžืื– ื”ื‘ื ืชื™ ืฉื”ื•ืกื™ืคื• ืชืžื™ื›ื” (ืœืžืจื•ืช ืฉืœื ื ื™ืกื™ืชื™ ืขื“ื™ื™ืŸ), ื•ืจืฆื™ืชื™ ืœื ืฆืœ ืงืฆืช ื–ืžืŸ ืคื ื•ื™ ื›ื“ื™ ืœื”ืขื™ืฃ ืžื‘ื˜ ื ื•ืกืฃ ื‘ื›ืœื™ื. ื”ืชื•ืฆืื” ื”ื™ืชื” ืžืฉื—ืง ื–ื™ื›ืจื•ืŸ ืฉืขื‘ื“ ืœื ืจืข ื‘ื›ืœืœ ื•ืืคื™ืœื• ื”ื™ื” ื ืขื™ื ืœืคืชื—. ื‘ื•ืื• ื ืจืื” ืืช ื”ืงื•ื“. ## ืื™ืš ืžืชื—ื™ืœื™ื ื‘ืฉื‘ื™ืœ ืœืงื‘ืœ ืกื˜ืืจื˜ืจ ืœื›ืชื™ื‘ืช ืืคืœื™ืงืฆื™ื™ืช ืจื™ืื™ื™ื’'ื ื˜ (ืฉื–ื” ื”ืจื™ืืงื˜ ืฉืœ ืงืœื•ื–'ืจืกืงืจื™ืคื˜) ืืชื ืฆืจื™ื›ื™ื ืœื”ืชืงื™ืŸ ื›ืœื™ ื‘ืฉื lein ืžื›ืืŸ: https://leiningen.org/ ื•ืื—ืจ ื›ืš ืžื”ืžืกื•ืฃ ื›ื•ืชื‘ื™ื:
$ lein new reagent my-reagent-app
ื–ื” ื ื•ืชืŸ ืชื‘ื ื™ืช ืœืคืจื•ื™ืงื˜ ืขื ืžืกืคืจ ื“ืคื™ื. ืงื•ื‘ืฅ ื”ืžืžืฉืง ื ืงืจื src/cljs/my_reagent_app/core.cljs. ื‘ื”ืชื—ืœื” ื™ืฉ ื‘ื• ื”ืจื‘ื” ืชื•ื›ืŸ ืœื ืจืœื•ื•ื ื˜ื™ ื•ืืคืฉืจ ืœืžื—ื•ืง ืืช ื”ืจื•ื‘ ื•ืœื”ื™ืฉืืจ ืขื ื”ืงื•ื“ ื”ื–ื” ื‘ืฉื‘ื™ืœ ืœืงื‘ืœ ื™ื™ืฉื•ื ืคืฉื•ื˜:
(ns my-reagent-app.core
  (:require
   [reagent.core :as reagent :refer [atom]]
   [reagent.dom :as rdom]
   [my-reagent-app.util :as util]
   [my-reagent-app.lib.cards :as cards]))

(defn home-page []
  (fn []
    [:span.main
     [:h1 "Hello World"]]))

(defn mount-root []
  (rdom/render [home-page] (.getElementById js/document "app")))

(defn init! []
  (mount-root))
ืžืชื™ืงื™ื™ืช ื”ืคืจื•ื™ืงื˜ ืฉื ื•ืฆืจ ืžืคืขื™ืœื™ื:
$ npm install
$ npx shadow-cljs watch app
ื•ืื– ืืคืฉืจ ืœื”ื™ื›ื ืก ื‘ื“ืคื“ืคืŸ ืœืคื•ืจื˜ 3000 ืขืœ localhost ื›ื“ื™ ืœืจืื•ืช ืืช ื”ื“ืฃ ื”ืจืืฉื•ืŸ ื•ื”ืคืฉื•ื˜ ืžื”ืืคืœื™ืงืฆื™ื” ืฉื‘ืกืš ื”ื›ืœ ื›ื•ืชื‘ Hello World. ## ืงื•ื“ ืœืžืฉื—ืง ื–ื™ื›ืจื•ืŸ ืื—ืจื™ ืฉื”ื™ืชื” ืœื™ ืืช ื”ืชื‘ื ื™ืช ื”ืžืฉื›ืชื™ ืœื›ืชื•ื‘ ืืช ืงื•ื“ ื”ืงืœื•ื–'ืจ ืœืžืฉื—ืง ื•ืฉืžืจืชื™ ืื•ืชื• ื‘ืงื•ื‘ืฅ src/cljs/my_reagent_app/lib/cards.cljs. ืžืฉื—ืง ื–ื™ื›ืจื•ืŸ ื›ื•ืœืœ ื—ื‘ื™ืœื” ืฉืœ ืงืœืคื™ื, ื›ืš ืฉื›ืœ ืงืœืฃ ื”ื•ื ืื•ื‘ื™ืงื˜ ืขื ื”ืžืคืชื—ื•ืช id, value, found ื• visible. ื”ืžืฉืžืขื•ืช ืฉืœ value ื”ื™ื ื”ืžืกืคืจ ืฉื›ืชื•ื‘ ืขืœ ื”ืงืœืฃ (ื‘ืžืฉื—ืง ื–ื™ื›ืจื•ืŸ ื™ืฉ ื–ื•ื’ื•ืช ืฉืœ ืงืœืคื™ื ืขื ืื•ืชื• ืžืกืคืจ), ื”ืžืคืชื— visible ืžืชืืจ ื”ืื ืขื›ืฉื™ื• ื”ืงืœืฃ ื’ืœื•ื™ ืื• ืžื•ื—ื‘ื, ื”ืžืคืชื— found ืžืชืืจ ื”ืื ืžืฆืืชื™ ืืช ื”ืงืœืฃ ื”ื–ื” ื•ืืช ื”ื–ื•ื’ ืฉืœื• ื•ื”ืžืคืชื— id ื›ื•ืœืœ ืžื–ื”ื” ื™ื™ื—ื•ื“ื™ ืœืงืœืฃ. ื›ืœ ื”ืงืœืคื™ื ืžืชื—ื™ืœื™ื ืžื•ืกืชืจื™ื, ืœื—ื™ืฆื” ืขืœ ืงืœืฃ ืžืฆื™ื’ื” ืื•ืชื•, ืœื—ื™ืฆื” ืขืœ ืงืœืฃ ื ื•ืกืฃ ืžืฆื™ื’ื” ื’ื ืื•ืชื•, ื•ืื– ืื ืฉื ื™ ื”ืงืœืคื™ื ื–ื”ื™ื ื”ื ื™ื™ืฉืืจื• ื’ืœื•ื™ื™ื ื•ื” found ืฉืœ ืฉื ื™ื”ื ื™ื•ื’ื“ืจ ืœ true, ื•ืื ื”ื ืฉื•ื ื™ื ืื– ืฉื ื™ื”ื ื™ื•ืกืชืจื• ื—ื–ืจื” ืื—ืจื™ ืฉืชื™ ืฉื ื™ื•ืช. ื–ื” ื”ืงื•ื“ ื‘ืงืœื•ื–'ืจ ืœืžืฉื—ืง:
(ns my-reagent-app.lib.cards
  (:require [reagent.core :as r]))

(def cards (r/atom (shuffle 
                     (map-indexed (fn [id v]
                                    {
                                     :id id
                                     :value v
                                     :found false
                                     :visible false})
                          (flatten (take 2 (repeat (range 5))))))))

(def timeout (r/atom nil))

(defn show [id]
  (fn [item]
    (if (== (:id item) id)
      (conj item {:visible true})
      item)))

(defn new-turn [cards]
  (map #(conj % {:visible false}) cards))

(defn reveal [card1 card2]
  (fn [cards]
    (map #(if (or
                (== (:id %) (:id card1))
                (== (:id %) (:id card2)))
            (conj % {:found true :visible false})
            %) cards)))


(defn check-pairs [id]
  (let [other (first (filter :visible @cards))
        this  (first (filter #(== (:id %) id) @cards))]
    (if (== (:value  other) (:value this))
      (swap! cards (reveal other this))
      (do
        (swap! cards #(map (show id) %))
        (reset! timeout (js/setTimeout #(swap! cards new-turn) 2000))))))

(defn click-on [id]
    (if (== 2 (count (filter :visible @cards))) (do
                     (js/clearTimeout @timeout)
                     (swap! cards new-turn)))
                     
    (let [card (first (filter #(== (:id %) id) @cards))
          in-turn (some :visible @cards)]
      (cond
        in-turn (check-pairs id)
        (:found card) false
        (:visible card) false
        :else (swap! cards #(map (show id) %)))))
ืื– ื ื›ื•ืŸ ื–ื” ืจืง 54 ืฉื•ืจื•ืช ืื‘ืœ ื‘ื›ืœ ื–ืืช ืื ืœื ืžื›ื™ืจื™ื ืงืœื•ื–'ืจ ื—ืœืง ืžื”ืงื•ื“ ื™ื›ื•ืœ ืœื‘ืœื‘ืœ. ืืœื” ืขื™ืงืจื™ ื”ื“ื‘ืจื™ื ื•ื‘ืงืฆืจื”:

ToCode
1 419
# ืืจื’ื•ืŸ ืžื—ื“ืฉ ื‘ื•ืื• ื ื ื™ื— ืฉืืชื ืฆืจื™ื›ื™ื ืœื›ืชื•ื‘ ืงื•ื“ ืฉืงื•ืจื url-ื™ื ืฉืœ ื“ื•ืงืจื”ืื‘ ื•ืžื“ืคื™ืก ืืช ืฉื ื”ืžื—ื‘ืจ ื•ืฉื ื”ืจื™ืคื• ืžื” url. ื›ืœื•ืžืจ ืืชื ืชืชื ื• ืœื• ืืช ื”ืžื—ืจื•ื–ืช:
https://hub.docker.com/r/bitnami/postgresql
ื•ื”ืงื•ื“ ื™ื—ื–ื™ืจ ืืช ื”ืžื™ืœื•ืŸ:
{ 'author': 'bitnami', 'repo': 'postgresql' }
ื™ื•ื“ืขื™ื ืžื”? ืขื–ื‘ื•, ื”ื ื” ื—ืกื›ืชื™ ืœื›ื ืืช ื”ืžืืžืฅ, ื–ืืช ื”ืคื•ื ืงืฆื™ื”:
import re
import sys

def parse_dockerhub_url(url: str):
    res = re.search(r'https://hub.docker.com/r/([\w%-]+)/([\w%-]+)', url)
    if res:
        author, repo = res.groups()
        return { 'author': author, 'repo': repo }

print(parse_dockerhub_url(sys.argv[1]))
ื›ื•ืœื ืžืจื•ืฆื™ื ื”ืงื•ื“ ื”ื’ื™ืข ืœืคืจื•ื“ืงืฉืŸ ื•ืื– ืœืงื•ื— ื’ื“ื•ืœ ืžืชืงืฉืจ ืœื”ืชืœื•ื ืŸ ืขืœ ื‘ืื’. ืžืกืชื‘ืจ ืฉืืฆืœื ืžืฉืชืžืฉื™ื ื”ืจื‘ื” ื‘ Official Images, ืฉื–ื” ืื™ืžื’'ื™ื ืฉื” url ืฉืœื”ื ื ืจืื” ื›ื›ื”:
https://hub.docker.com/_/ubuntu
ื”ืงื•ื“ ืฉืœื™ ืœื ืžื–ื”ื” ืืช ื”ืžื‘ื ื” ื›ื™ ืื ื™ ืžื—ืคืฉ ืืช ื” /r/ ืœืคื ื™ ืฉื ื”ืจื™ืคื•, ื•ืœื›ืŸ ื”ื ืœื ืžืฆืœื™ื—ื™ื ืœื”ื–ื™ืŸ ืืช ื”ื ืชื™ื‘ื™ื ืฉืœื”ื ื‘ืชื•ื›ื ื”. ืžื” ืขื•ืฉื™ื? ื”ืจื‘ื” ืžืชื›ื ืชื™ื ืฉืžืงื‘ืœื™ื ืžืฉื™ืžื” ื›ื–ืืช ืžื—ืคืฉื™ื ืืช ื”ื“ืจืš ื”ืžื”ื™ืจื” ื‘ื™ื•ืชืจ ืœืคื™ืชืจื•ืŸ. ื‘ืžืงืจื” ืฉืœื ื• ื”ื›ื™ ืงืœ ืœืฉื›ืคืœ ืืช ื”ืงื•ื“ ื‘ืคื•ื ืงืฆื™ื” ื•ืœืฉื ื•ืช ืืช ื”ืชื ืื™:
import re
import sys

def parse_dockerhub_url(url: str):
    res = re.search(r'https://hub.docker.com/r/([\w%-]+)/([\w%-]+)', url)
    if res:
        author, repo = res.groups()
        return { 'author': author, 'repo': repo }

    res = re.search(r'https://hub.docker.com/_/([\w%-]+)', url)
    if res:
        author, repo = ["Official Image", res.group(1)]
        return { 'author': author, 'repo': repo }

        

print(parse_dockerhub_url(sys.argv[1]))
ื–ื” ืขื•ื‘ื“ ื•ืืคืฉืจ ืœื”ืžืฉื™ืš ืœืชืงืœื” ื”ื‘ืื”. ื›ืŸ? ืจื’ืข. ืื•ืžื ื ืชื™ืงื ืชื ืืช ื”ื‘ืื’ ืื‘ืœ ื ืจืื” ืœื™ ืฉืฉื‘ืจืชื ืืช ื”ืคื•ื ืงืฆื™ื”. ื‘ื’ื™ืจืกื” ื”ืงื•ื“ืžืช, ืื ืžื™ืฉื”ื• ื”ื™ื” ืจื•ืฆื” ืœืฉื ื•ืช ืืช ื”ืžืคืชื—ื•ืช ื‘ืžื™ืœื•ืŸ ืฉื”ืคื•ื ืงืฆื™ื” ืžื—ื–ื™ืจื” ื”ื™ื” ืขืœื™ื• ืœืฉื ื•ืช ืจืง ื‘ืžืงื•ื ืื—ื“. ื‘ื’ื™ืจืกื” ื”ื—ื“ืฉื” ืื ื‘ืžืงื•ื author ื ืจืฆื” ืœื›ืชื•ื‘ owner ื ืฆื˜ืจืš ืœืฉื ื•ืช ื‘ืฉื ื™ ืžืงื•ืžื•ืช. ื•ืžื” ืฉื™ื•ืชืจ ื’ืจื•ืข, ืฉื™ืฆืจืชื ื›ืืŸ ืชื‘ื ื™ืช. ื”ื‘ืŸ ืื“ื ื”ื‘ื ืฉื™ืฆื˜ืจืš ืœื”ื•ืกื™ืฃ ืขื•ื“ url ืฉืฉื›ื—ืชื™ ืœื˜ืคืœ ื‘ื• ื’ื ื™ืขืชื™ืง ืืช ื”ืงื•ื“ ื•ืจืง ื™ื”ืคื•ืš ืืช ืฉื™ื ื•ื™ ืฉืžื•ืช ื”ืžืคืชื—ื•ืช ืœืขื•ื“ ื™ื•ืชืจ ืงืฉื”. ืื ื™ ืžื‘ื™ืŸ ืœื’ืžืจื™ ืืช ื”ื“ื—ื™ืคื•ืช ืœืชืงืŸ ืืช ื”ื‘ืื’. ืื ื™ ืžื‘ื™ืŸ ื’ื ืฉื‘ื–ืžืŸ ืฉื”ืœืงื•ื— ืฆืœืฆืœ ืœื”ืชืœื•ื ืŸ ืขืœ ื”ืชืงืœื” ื”ื–ืืช ืขื‘ื“ืชื ืขืœ 5 ื“ื‘ืจื™ื ืื—ืจื™ื, ืื•ืœื™ ื™ื•ืชืจ ื—ืฉื•ื‘ื™ื. ืื ื™ ืžื‘ื™ืŸ ืฉืงืฉื” ืœืชืงืŸ ืงื•ื“ ื•ื’ื ืœืืจื’ืŸ ืื•ืชื• ืžื—ื“ืฉ ื‘ืื•ืชื• PR, ื•ืฉืื•ืœื™ ื›ืจื’ืข ืื™ืŸ ืœื›ื ืจืขื™ื•ืŸ ืื™ืš ืœืชืงืŸ ืืช ื–ื” ื‘ืฆื•ืจื” ืฉืชืฉืžืจ ืืช ื”ืจื•ื— ืฉืœ ื”ืคื•ื ืงืฆื™ื” ื”ืžืงื•ืจื™ืช. ื•ืขื ื›ืœ ื–ื” ืื ื™ ื—ื•ืฉื‘ ืฉื™ืฉ ืคื” ืจืง ืฉืชื™ ืืคืฉืจื•ื™ื•ืช ืฉื™ืขื‘ื“ื• ืœื˜ื•ื•ื— ื”ืจื—ื•ืง: 1. ืืคืฉืจ ืœื”ื—ืœื™ื˜ ืฉืื ื—ื ื• ืžืืจื’ื ื™ื ืžื—ื“ืฉ ืืช ื”ืงื•ื“ ื›ืฉืื ื—ื ื• ืžืชืงื ื™ื ื‘ืื’ื™ื, ื•ืื– "ืชื™ืงื•ืŸ" ื›ืžื• ืฉื›ืชื‘ืชื™ ืงื•ื“ื ื‘ื›ืœืœ ืœื ื ื›ื ืก ืœืžืขืจื›ืช. 2. ืืคืฉืจ ืœื”ื—ืœื™ื˜ ืฉืื ื—ื ื• ืžื›ื ื™ืกื™ื ืชื™ืงื•ื ื™ื ืžื”ื™ืจื™ื, ืื‘ืœ ืžืงื“ื™ืฉื™ื ื›ืžื” ืฉืขื•ืช ื‘ืฉื‘ื•ืข ื›ื“ื™ ืœืชืงืŸ ืืช ื”ืชื™ืงื•ื ื™ื, ื•ืœื”ื—ื–ื™ืจ ืื•ืชื ืœืจื•ื— ื”ืžืงื•ืจื™ืช ืฉืœ ื”ืงื•ื“. ืงื•ื“ ื”ื•ืคืš ืœื”ืจื’ืœ. ืืฃ ืื—ื“ ืœื ื™ืฆื ืœ"ืคืจื•ื™ืงื˜ ืจื™ืคืงื˜ื•ืจื™ื ื’" ื‘ืฉื‘ื™ืœ ืœืชืงืŸ ื›ืคืœ ืงื•ื“ ืฉืœ ืฉืชื™ ืฉื•ืจื•ืช, ืื‘ืœ ื”ื“ื‘ืจื™ื ื”ืืœื” ืžืฆื˜ื‘ืจื™ื ื•ืœืื•ืจืš ื–ืžืŸ ืงืฉื” ืœืชืงืŸ ืื•ืชื. ื .ื‘. ื™ืฉ ืœื›ื ื”ืžื•ืŸ ืจืขื™ื•ื ื•ืช ืื™ืš ืœืืจื’ืŸ ืžื—ื“ืฉ ืืช ื”"ืชื™ืงื•ืŸ"? ืืœ ืชืฉืžืจื• ืื•ืชื ื‘ืœื‘ - ืขื•ืคื• ืขืœ ืขืฆืžื›ื ื•ืฉืชืคื• ื‘ืชื’ื•ื‘ื•ืช. ืื ื™ ื‘ื›ื•ื•ื ื” ืœื ืžืฉืชืฃ ืืช ื”ืจืขื™ื•ื ื•ืช ืฉืœื™ ื›ื“ื™ ืœื ืœืงืœืงืœ.

ToCode - Statistics & analytics of Telegram channel @tocodeil