แƒ’แƒแƒ›แƒแƒ แƒ—แƒ”แƒ— แƒแƒ“แƒ’แƒ˜แƒšแƒแƒ‘แƒ แƒ˜แƒ•แƒ˜ แƒ™แƒแƒœแƒกแƒแƒšแƒ˜ x11vnc-แƒ˜แƒก แƒ’แƒแƒ›แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒ˜แƒกแƒแƒก

แƒ’แƒแƒฃแƒ›แƒแƒ แƒฏแƒแƒก แƒงแƒ•แƒ”แƒšแƒแƒก,

แƒ˜แƒœแƒขแƒ”แƒ แƒœแƒ”แƒขแƒจแƒ˜ แƒแƒ แƒ˜แƒก แƒ‘แƒ”แƒ•แƒ แƒ˜ แƒกแƒขแƒแƒขแƒ˜แƒ แƒ˜แƒ›แƒ˜แƒก แƒจแƒ”แƒกแƒแƒฎแƒ”แƒ‘, แƒ—แƒฃ แƒ แƒแƒ’แƒแƒ  แƒฃแƒœแƒ“แƒ แƒ“แƒแƒแƒงแƒ”แƒœแƒแƒ— แƒ“แƒ˜แƒกแƒขแƒแƒœแƒชแƒ˜แƒฃแƒ แƒ˜ แƒ™แƒแƒ•แƒจแƒ˜แƒ แƒ˜ แƒแƒ แƒกแƒ”แƒ‘แƒฃแƒš Xorg แƒกแƒ”แƒกแƒ˜แƒแƒ–แƒ” x11vnc-แƒ˜แƒก แƒกแƒแƒจแƒฃแƒแƒšแƒ”แƒ‘แƒ˜แƒ—, แƒ›แƒแƒ’แƒ แƒแƒ› แƒ›แƒ” แƒ•แƒ”แƒ แƒกแƒแƒ“ แƒ•แƒ˜แƒžแƒแƒ•แƒ”, แƒ แƒแƒ’แƒแƒ  แƒ“แƒแƒ•แƒ—แƒ แƒ’แƒฃแƒœแƒ แƒแƒ“แƒ’แƒ˜แƒšแƒแƒ‘แƒ แƒ˜แƒ•แƒ˜ แƒ›แƒแƒœแƒ˜แƒขแƒแƒ แƒ˜ แƒ“แƒ แƒจแƒ”แƒงแƒ•แƒแƒœแƒ แƒ˜แƒกแƒ”, แƒ แƒแƒ› แƒ“แƒ˜แƒกแƒขแƒแƒœแƒชแƒ˜แƒฃแƒ แƒ˜ แƒ™แƒแƒ›แƒžแƒ˜แƒฃแƒขแƒ”แƒ แƒ˜แƒก แƒ’แƒ•แƒ”แƒ แƒ“แƒ˜แƒ— แƒ›แƒฏแƒ“แƒแƒ›แƒ›แƒ แƒ’แƒแƒแƒ™แƒ”แƒ—แƒแƒก. แƒ•แƒ”แƒ  แƒฎแƒ”แƒ“แƒแƒ•แƒก แƒ แƒแƒก แƒแƒ™แƒ”แƒ—แƒ”แƒ‘ แƒ“แƒ แƒแƒ  แƒแƒญแƒ”แƒ แƒก แƒฆแƒ˜แƒšแƒแƒ™แƒ”แƒ‘แƒก แƒกแƒ”แƒกแƒ˜แƒแƒ–แƒ”. แƒญแƒ แƒ˜แƒšแƒ˜แƒก แƒฅแƒ•แƒ”แƒ›แƒแƒ— แƒแƒ แƒ˜แƒก แƒฉแƒ”แƒ›แƒ˜ แƒ›แƒ”แƒ—แƒแƒ“แƒ˜, แƒ แƒแƒ› x11vnc แƒ’แƒแƒ•แƒฎแƒแƒ“แƒแƒ— Windows-แƒ—แƒแƒœ แƒ“แƒแƒ™แƒแƒ•แƒจแƒ˜แƒ แƒ”แƒ‘แƒ RDP-แƒ˜แƒก แƒกแƒแƒจแƒฃแƒแƒšแƒ”แƒ‘แƒ˜แƒ—.

แƒแƒกแƒ” แƒ แƒแƒ›, แƒ“แƒแƒ•แƒฃแƒจแƒ•แƒแƒ—, แƒ แƒแƒ› แƒ—แƒฅแƒ•แƒ”แƒœ แƒฃแƒ™แƒ•แƒ” แƒ˜แƒชแƒ˜แƒ— x11vnc-แƒ˜แƒก แƒ’แƒแƒ›แƒแƒงแƒ”แƒœแƒ”แƒ‘แƒ, แƒ—แƒฃ แƒแƒ แƒ, แƒจแƒ”แƒ’แƒ˜แƒซแƒšแƒ˜แƒแƒ— Google-แƒจแƒ˜ แƒแƒœ แƒฌแƒแƒ˜แƒ™แƒ˜แƒ—แƒฎแƒแƒ— แƒ›แƒแƒ’แƒแƒšแƒ˜แƒ—แƒแƒ“ แƒแƒฅ.

แƒ›แƒแƒ˜แƒกแƒ˜ แƒฉแƒ•แƒ”แƒœ แƒ’แƒแƒ•แƒฃแƒจแƒ•แƒ˜แƒ— x11nvc, แƒ•แƒฃแƒ™แƒแƒ•แƒจแƒ˜แƒ แƒ“แƒ”แƒ‘แƒ˜แƒ— แƒ›แƒแƒก แƒ™แƒšแƒ˜แƒ”แƒœแƒขแƒ—แƒแƒœ, แƒงแƒ•แƒ”แƒšแƒแƒคแƒ”แƒ แƒ˜ แƒ›แƒฃแƒจแƒแƒแƒ‘แƒก, แƒ›แƒแƒ’แƒ แƒแƒ› แƒ™แƒแƒ›แƒžแƒ˜แƒฃแƒขแƒ”แƒ แƒ˜แƒก แƒšแƒแƒ™แƒแƒšแƒฃแƒ แƒ˜ แƒ™แƒแƒœแƒกแƒแƒšแƒ˜ แƒแƒกแƒ”แƒ•แƒ” แƒฎแƒ”แƒšแƒ›แƒ˜แƒกแƒแƒฌแƒ•แƒ“แƒแƒ›แƒ˜แƒ แƒกแƒแƒœแƒแƒฎแƒแƒ•แƒแƒ“ แƒ“แƒ แƒจแƒ”แƒกแƒแƒงแƒ•แƒแƒœแƒแƒ“.

แฒฉแƒ•แƒ”แƒœ แƒ’แƒ•แƒ˜แƒœแƒ“แƒ: แƒ’แƒแƒ›แƒแƒ แƒ—แƒ”แƒ— แƒšแƒแƒ™แƒแƒšแƒฃแƒ แƒ˜ แƒ™แƒแƒœแƒกแƒแƒšแƒ˜ (แƒ›แƒแƒœแƒ˜แƒขแƒแƒ แƒ˜ + แƒ™แƒšแƒแƒ•แƒ˜แƒแƒขแƒฃแƒ แƒ + แƒ›แƒแƒฃแƒกแƒ˜) แƒ แƒแƒ› แƒแƒ แƒแƒคแƒ”แƒ แƒ˜ แƒฉแƒแƒœแƒ“แƒ”แƒก แƒแƒœ แƒจแƒ”แƒ˜แƒงแƒ•แƒแƒœแƒแƒ—.

แƒ›แƒแƒœแƒ˜แƒขแƒแƒ แƒ”แƒ‘แƒ˜แƒก แƒ’แƒแƒ›แƒแƒ แƒ—แƒ•แƒ

แƒžแƒ˜แƒ แƒ•แƒ”แƒšแƒ˜ แƒ แƒแƒช แƒ’แƒแƒ›แƒแƒฎแƒกแƒ”แƒœแƒ“แƒ แƒ˜แƒงแƒ แƒฃแƒ‘แƒ แƒแƒšแƒแƒ“ แƒ›แƒแƒœแƒ˜แƒขแƒแƒ แƒ˜แƒก แƒ’แƒแƒ›แƒแƒ แƒ—แƒ•แƒ xrandr-แƒ˜แƒก แƒกแƒแƒจแƒฃแƒแƒšแƒ”แƒ‘แƒ˜แƒ—, แƒ›แƒแƒ’แƒแƒšแƒ˜แƒ—แƒแƒ“ แƒแƒกแƒ”:

$ xrandr --output CRT1 --off

แƒ›แƒแƒ’แƒ แƒแƒ› แƒแƒ›แƒแƒ•แƒ“แƒ แƒแƒฃแƒšแƒแƒ“, windowing แƒ’แƒแƒ แƒ”แƒ›แƒ (แƒ›แƒ” แƒ›แƒแƒฅแƒ•แƒก KDE) แƒ˜แƒฌแƒงแƒ”แƒ‘แƒก แƒคแƒ˜แƒฅแƒ แƒก, แƒ แƒแƒ› แƒ›แƒแƒœแƒ˜แƒขแƒแƒ แƒ˜ แƒ›แƒแƒ แƒ—แƒšแƒแƒช แƒ’แƒแƒ›แƒแƒ แƒ—แƒฃแƒšแƒ˜แƒ แƒ“แƒ แƒ˜แƒฌแƒงแƒ”แƒ‘แƒก แƒคแƒแƒœแƒฏแƒ แƒ”แƒ‘แƒ˜แƒก แƒ“แƒ แƒžแƒแƒœแƒ”แƒšแƒ”แƒ‘แƒ˜แƒก แƒกแƒ แƒแƒšแƒแƒก, แƒงแƒ•แƒ”แƒšแƒแƒคแƒ”แƒ แƒ˜ แƒ›แƒแƒซแƒ แƒแƒแƒ‘แƒก แƒ“แƒ แƒฎแƒ“แƒ”แƒ‘แƒ แƒกแƒ”แƒ•แƒ“แƒ˜แƒแƒœแƒ˜.
แƒแƒ แƒกแƒ”แƒ‘แƒแƒ‘แƒก แƒฃแƒคแƒ แƒ แƒกแƒแƒ˜แƒœแƒขแƒ”แƒ แƒ”แƒกแƒ แƒ’แƒ–แƒ, แƒ แƒแƒ›แƒ”แƒšแƒ˜แƒช แƒแƒ แƒ˜แƒก แƒ›แƒแƒœแƒ˜แƒขแƒแƒ แƒ˜แƒก แƒฐแƒ˜แƒ‘แƒ”แƒ แƒœแƒแƒชแƒ˜แƒแƒจแƒ˜ แƒ’แƒแƒ’แƒ–แƒแƒ•แƒœแƒ, แƒแƒ›แƒ˜แƒก แƒ’แƒแƒ™แƒ”แƒ—แƒ”แƒ‘แƒ แƒจแƒ”แƒ’แƒ˜แƒซแƒšแƒ˜แƒแƒ— แƒ›แƒแƒ’แƒแƒšแƒ˜แƒ—แƒแƒ“ แƒแƒกแƒ”:

$ xset dpms force off

แƒ›แƒแƒ’แƒ แƒแƒ› แƒแƒฅแƒแƒช แƒงแƒ•แƒ”แƒšแƒแƒคแƒ”แƒ แƒ˜ แƒแƒ  แƒแƒ แƒ˜แƒก แƒ’แƒšแƒฃแƒ•แƒ˜. แƒกแƒ˜แƒกแƒขแƒ”แƒ›แƒ แƒแƒฆแƒ•แƒ˜แƒซแƒ”แƒ‘แƒก แƒ›แƒแƒœแƒ˜แƒขแƒแƒ แƒก แƒžแƒ˜แƒ แƒ•แƒ”แƒš แƒฆแƒแƒœแƒ˜แƒกแƒซแƒ˜แƒ”แƒ‘แƒแƒ–แƒ”. แƒฃแƒ›แƒแƒ แƒขแƒ˜แƒ•แƒ”แƒกแƒ˜ แƒงแƒแƒ•แƒแƒ แƒฏแƒ”แƒœแƒ˜ แƒชแƒ˜แƒ™แƒšแƒ˜แƒก แƒกแƒแƒฎแƒ˜แƒ— แƒ”แƒฎแƒ›แƒแƒ แƒ”แƒ‘แƒ:

while :
do
    xset dpms force off
    sleep .5
done

แƒแƒฆแƒแƒ  แƒ›แƒ˜แƒคแƒ˜แƒฅแƒ แƒ˜แƒ - แƒ“แƒแƒ•แƒ˜แƒ–แƒแƒ แƒ”, แƒ”แƒก แƒ—แƒแƒ•แƒ˜แƒก แƒ›แƒ˜แƒ–แƒแƒœแƒก แƒ”แƒ›แƒกแƒแƒฎแƒฃแƒ แƒ”แƒ‘แƒ - แƒ›แƒแƒœแƒ˜แƒขแƒแƒ แƒ”แƒ‘แƒ˜ แƒแƒ แƒแƒคแƒ”แƒ แƒก แƒแƒฉแƒ•แƒ”แƒœแƒ”แƒ‘แƒก, แƒ—แƒฃแƒœแƒ“แƒแƒช แƒฆแƒ˜แƒšแƒแƒ™แƒ”แƒ‘แƒก แƒ“แƒแƒ•แƒแƒญแƒ˜แƒ แƒ, แƒ›แƒแƒฃแƒกแƒ˜แƒก แƒ’แƒแƒ“แƒแƒขแƒแƒœแƒ แƒ“แƒ แƒ.แƒจ.

UPD:

แƒ›แƒแƒ“แƒšแƒแƒ‘แƒ แƒแƒ›แƒแƒ แƒแƒ แƒกแƒฎแƒ•แƒ แƒ›แƒ”แƒ—แƒแƒ“แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก แƒกแƒ˜แƒ™แƒแƒจแƒ™แƒแƒจแƒ˜แƒก แƒœแƒฃแƒšแƒ–แƒ” แƒ’แƒแƒ“แƒแƒฅแƒชแƒ”แƒ•แƒ˜แƒ—:

$ xrandr --output CRT1 --brightness 0

แƒจแƒ”แƒงแƒ•แƒแƒœแƒ˜แƒก แƒแƒ›แƒแƒญแƒ แƒ

แƒจแƒ”แƒงแƒ•แƒแƒœแƒ˜แƒก แƒ’แƒแƒกแƒแƒ—แƒ˜แƒจแƒแƒ“ แƒ›แƒ” แƒ’แƒแƒ›แƒแƒ•แƒ˜แƒงแƒ”แƒœแƒ” xinput. แƒžแƒแƒ แƒแƒ›แƒ”แƒขแƒ แƒ”แƒ‘แƒ˜แƒก แƒ’แƒแƒ แƒ”แƒจแƒ” แƒ’แƒแƒจแƒ•แƒ”แƒ‘แƒ˜แƒกแƒแƒก, แƒ˜แƒก แƒแƒฉแƒ•แƒ”แƒœแƒ”แƒ‘แƒก แƒ›แƒแƒฌแƒงแƒแƒ‘แƒ˜แƒšแƒแƒ‘แƒ”แƒ‘แƒ˜แƒก แƒกแƒ˜แƒแƒก:

$ xinput
โŽก Virtual core pointer                          id=2    [master pointer  (3)]
โŽœ   โ†ณ Virtual core XTEST pointer                id=4    [slave  pointer  (2)]
โŽœ   โ†ณ Logitech USB Laser Mouse                  id=9    [slave  pointer  (2)]
โŽฃ Virtual core keyboard                         id=3    [master keyboard (2)]
    โ†ณ Virtual core XTEST keyboard               id=5    [slave  keyboard (3)]
    โ†ณ Power Button                              id=6    [slave  keyboard (3)]
    โ†ณ Power Button                              id=7    [slave  keyboard (3)]
    โ†ณ Sleep Button                              id=8    [slave  keyboard (3)]
    โ†ณ USB 2.0 Camera: HD 720P Webcam            id=10   [slave  keyboard (3)]
    โ†ณ HID 041e:30d3                             id=11   [slave  keyboard (3)]
    โ†ณ AT Translated Set 2 keyboard              id=12   [slave  keyboard (3)]

แƒ›แƒแƒฌแƒงแƒแƒ‘แƒ˜แƒšแƒแƒ‘แƒ”แƒ‘แƒ˜ แƒ•แƒ˜แƒ แƒขแƒฃแƒแƒšแƒฃแƒ แƒ˜ แƒ‘แƒ˜แƒ แƒ—แƒ•แƒ˜... แƒ—แƒฅแƒ•แƒ”แƒœ แƒแƒ  แƒจแƒ”แƒ’แƒ˜แƒซแƒšแƒ˜แƒแƒ— แƒ›แƒ˜แƒกแƒ˜ แƒ’แƒแƒ›แƒแƒ แƒ—แƒ•แƒ - แƒ’แƒแƒ›แƒแƒฉแƒœแƒ“แƒ”แƒ‘แƒ แƒจแƒ”แƒชแƒ“แƒแƒ›แƒ, แƒ›แƒแƒ’แƒ แƒแƒ› แƒ“แƒแƒœแƒแƒ แƒฉแƒ”แƒœแƒ˜ แƒจแƒ”แƒ˜แƒซแƒšแƒ”แƒ‘แƒ แƒฉแƒแƒ แƒ—แƒแƒ— แƒ“แƒ แƒ’แƒแƒ›แƒแƒ แƒ—แƒแƒ—, แƒ›แƒแƒ’แƒแƒšแƒ˜แƒ—แƒแƒ“, แƒแƒกแƒ” แƒจแƒ”แƒ’แƒ˜แƒซแƒšแƒ˜แƒแƒ— แƒ“แƒแƒ แƒฉแƒ”แƒ— แƒ›แƒแƒฃแƒกแƒ˜แƒก แƒ’แƒแƒ แƒ”แƒจแƒ” แƒ”แƒ แƒ—แƒ˜ แƒฌแƒฃแƒ—แƒ˜แƒก แƒ’แƒแƒœแƒ›แƒแƒ•แƒšแƒแƒ‘แƒแƒจแƒ˜:

xinput disable 9; sleep 60; xinput enable 9

แƒแƒœแƒแƒ–แƒ แƒแƒฃแƒ แƒ”แƒ‘แƒ˜แƒก แƒ’แƒแƒ›แƒแƒกแƒแƒ•แƒแƒšแƒ˜

แƒฉแƒ”แƒ›แƒ˜ แƒจแƒ”แƒ›แƒ—แƒฎแƒ•แƒ”แƒ•แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก แƒ›แƒ” แƒ’แƒแƒ•แƒแƒ™แƒ”แƒ—แƒ” แƒกแƒ™แƒ แƒ˜แƒžแƒขแƒ˜, แƒ แƒแƒ›แƒ”แƒšแƒกแƒแƒช แƒ•แƒแƒฌแƒแƒ แƒ›แƒแƒ”แƒ‘ ssh แƒกแƒ”แƒกแƒ˜แƒแƒ–แƒ”. แƒ˜แƒก แƒ—แƒ แƒ’แƒฃแƒœแƒแƒ•แƒก แƒแƒ“แƒ’แƒ˜แƒšแƒแƒ‘แƒ แƒ˜แƒ• แƒจแƒ”แƒงแƒ•แƒแƒœแƒแƒก แƒ“แƒ แƒแƒ›แƒแƒฆแƒšแƒ”แƒ‘แƒก x11vnc แƒกแƒ”แƒ แƒ•แƒ”แƒ แƒก แƒ“แƒ แƒกแƒ™แƒ แƒ˜แƒžแƒขแƒ˜แƒก แƒ“แƒแƒกแƒ แƒฃแƒšแƒ”แƒ‘แƒ˜แƒก แƒจแƒ”แƒ›แƒ“แƒ”แƒ’ แƒงแƒ•แƒ”แƒšแƒแƒคแƒ”แƒ แƒ˜ แƒ‘แƒ แƒฃแƒœแƒ“แƒ”แƒ‘แƒ แƒ แƒแƒ’แƒแƒ แƒช แƒ˜แƒงแƒ. แƒจแƒ”แƒ“แƒ”แƒ’แƒแƒ“, แƒฉแƒ•แƒ”แƒœ แƒ›แƒ˜แƒ•แƒ˜แƒฆแƒ”แƒ— แƒกแƒแƒ›แƒ˜ แƒกแƒ™แƒ แƒ˜แƒžแƒขแƒ˜, แƒแƒฅ แƒแƒ แƒ˜แƒก แƒ˜แƒกแƒ˜แƒœแƒ˜ (แƒ’แƒแƒœแƒแƒฎแƒšแƒ”แƒ‘แƒฃแƒšแƒ˜แƒ).

switch_local_console:

#!/bin/sh

case $1 in
    1|on)
    desired=1
    ;;
    0|off)
    desired=0
    ;;
    *)
    echo "USAGE: $0 0|1|on|off"
    exit 1
    ;;
esac

keyboards=`xinput | grep -v "XTEST" | grep "slave  keyboard" | sed -re 's/^.*sid=([0-9]+)s.*$/1/'`
mouses=`xinput | grep -v "XTEST" | grep "slave  pointer" | sed -re 's/^.*sid=([0-9]+)s.*$/1/'`
monitors=`xrandr | grep " connected" | sed -re 's/^(.+) connected.*$/1/'`

for device in $mouses
do
    xinput --set-prop $device "Device Enabled" $desired
done

for device in $keyboards
do
    xinput --set-prop $device "Device Enabled" $desired
done

for device in $monitors
do
    xrandr --output $device --brightness $desired
done

disable_local_console:

#!/bin/sh

trap "switch_local_console 1" EXIT

while :
do
    switch_local_console 0
    sleep 1
done

แƒคแƒแƒฅแƒขแƒแƒ‘แƒ แƒ˜แƒ•แƒแƒ“, แƒ›แƒ—แƒแƒ•แƒแƒ แƒ˜ แƒกแƒ™แƒ แƒ˜แƒžแƒขแƒ˜ (แƒ›แƒ” แƒ›แƒแƒฅแƒ•แƒก แƒแƒ แƒ˜ แƒ›แƒแƒœแƒ˜แƒขแƒแƒ แƒ˜, แƒ“แƒแƒ•แƒแƒงแƒ”แƒœแƒ” แƒ”แƒ แƒ—แƒ˜ แƒกแƒแƒ”แƒ แƒ—แƒ แƒกแƒ”แƒ แƒ•แƒ”แƒ แƒ˜ แƒ“แƒ แƒ”แƒ แƒ—แƒ˜ แƒ—แƒ˜แƒ—แƒแƒ”แƒฃแƒšแƒ˜ แƒ›แƒแƒœแƒ˜แƒขแƒแƒ แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก).

vnc_server:

#!/bin/bash

[[ ":0" == "$DISPLAY" ]] && echo "Should be run under ssh session" && exit 1

export DISPLAY=:0

killall x11vnc

rm -r /tmp/x11vnc
mkdir -p /tmp/x11vnc/{5900,5901,5902}

params="-fixscreen V=5 -forever -usepw -noxkb -noxdamage -repeat -nevershared"

echo "Starting VNC servers"

x11vnc -rfbport 5900 $params 2>&1 | tinylog -k 2 -r /tmp/x11vnc/5900 &
x11vnc -rfbport 5901 $params -clip 1920x1080+0+0 2>&1 | tinylog -k 2 -r /tmp/x11vnc/5901 &
x11vnc -rfbport 5902 $params -clip 1920x1080+1920+0 2>&1 | tinylog -k 2 -r /tmp/x11vnc/5902 &

echo "Waiting VNC servers"
while [ `ps afx | grep -c "x11vnc -rfbport"` -ne "4" ]
do
    sleep .5
done

echo "Disabling local console"
disable_local_console

echo "Killing VNC servers"
killall x11vnc

แฒกแƒฃแƒš แƒ”แƒก แƒแƒ แƒ˜แƒก. แƒจแƒ”แƒ“แƒ˜แƒ— ssh-แƒ˜แƒก แƒกแƒแƒจแƒฃแƒแƒšแƒ”แƒ‘แƒ˜แƒ— แƒ“แƒ แƒ’แƒแƒฃแƒจแƒ•แƒ˜แƒ— vnc_server, แƒกแƒแƒœแƒแƒ› แƒ˜แƒก แƒชแƒแƒชแƒฎแƒแƒšแƒ˜แƒ, แƒฉแƒ•แƒ”แƒœ แƒ’แƒ•แƒแƒฅแƒ•แƒก แƒฌแƒ•แƒ“แƒแƒ›แƒ vnc-แƒ˜แƒก แƒกแƒแƒจแƒฃแƒแƒšแƒ”แƒ‘แƒ˜แƒ— แƒ“แƒ แƒแƒ“แƒ’แƒ˜แƒšแƒแƒ‘แƒ แƒ˜แƒ•แƒ˜ แƒ™แƒแƒœแƒกแƒแƒšแƒ˜ แƒฉแƒแƒฅแƒ แƒ”แƒ‘แƒ.

แƒ’แƒ›แƒแƒ“แƒšแƒแƒ‘แƒ— แƒงแƒฃแƒ แƒแƒ“แƒฆแƒ”แƒ‘แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก, แƒ›แƒ˜แƒกแƒแƒกแƒแƒšแƒ›แƒ”แƒ‘แƒ”แƒšแƒ˜แƒ แƒ“แƒแƒ›แƒแƒขแƒ”แƒ‘แƒ”แƒ‘แƒ˜ แƒ“แƒ แƒ’แƒแƒฃแƒ›แƒฏแƒแƒ‘แƒ”แƒกแƒ”แƒ‘แƒ”แƒ‘แƒ˜.

แƒฌแƒงแƒแƒ แƒ: www.habr.com

แƒแƒฎแƒแƒšแƒ˜ แƒ™แƒแƒ›แƒ”แƒœแƒขแƒแƒ แƒ˜แƒก แƒ“แƒแƒ›แƒแƒขแƒ”แƒ‘แƒ