рд▓рд┐рдирдХреНрд╕ рдХреЗ рд▓рд┐рдП рдкреБрдВрдЯреЛ рд╕реНрд╡рд┐рдЪрд░ рдХрд╛ рдирдпрд╛ рдПрдирд╛рд▓реЙрдЧ: xswitcher

рдкрд┐рдЫрд▓реЗ рдЫрд╣ рдорд╣реАрдиреЛрдВ рдореЗрдВ рдПрдХреНрд╕рдиреЗрд░ рд╕рдкреЛрд░реНрдЯ рдмрдВрдж рд╣реЛрдиреЗ рд╕реЗ рдореБрдЭреЗ рдХреБрдЫ рдкрд░реЗрд╢рд╛рдиреА рд╣реБрдИ рд╣реИред (рдореЗрд░реЗ рдбреЗрд╕реНрдХрдЯреЙрдк рдкрд░ OpenSUSE 15.1 рдХреЗ рдЖрдЧрдорди рдХреЗ рд╕рд╛рде: xneur рд╕рдХреНрд╖рдо рд╣реЛрдиреЗ рдХреЗ рд╕рд╛рде, рд╡рд┐рдВрдбреЛрдЬрд╝ рдлреЛрдХрд╕ рдЦреЛ рджреЗрддреА рд╣реИ рдФрд░ рдХреАрдмреЛрд░реНрдб рдЗрдирдкреБрдЯ рдХреЗ рд╕рд╛рде рд╕рдордп рдореЗрдВ рдЭрд┐рд▓рдорд┐рд▓рд╛рд╣рдЯ рдЕрдЬреАрдм рд╣реЛ рдЬрд╛рддреА рд╣реИ).

"рдУрд╣, рд▓рд╛рдирдд рд╣реИ, рдореИрдВрдиреЗ рдлрд┐рд░ рд╕реЗ рдЧрд▓рдд рд▓реЗрдЖрдЙрдЯ рдореЗрдВ рдЯрд╛рдЗрдк рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░ рджрд┐рдпрд╛" - рдореЗрд░реЗ рдХрд╛рдо рдореЗрдВ рдпрд╣ рдЕрдХреНрд╕рд░ рдЕрд╢реЛрднрдиреАрдп рд░реВрдк рд╕реЗ рд╣реЛрддрд╛ рд╣реИред рдФрд░ рдпрд╣ рдХреБрдЫ рднреА рд╕рдХрд╛рд░рд╛рддреНрдордХ рдирд╣реАрдВ рдЬреЛрдбрд╝рддрд╛.

рд▓рд┐рдирдХреНрд╕ рдХреЗ рд▓рд┐рдП рдкреБрдВрдЯреЛ рд╕реНрд╡рд┐рдЪрд░ рдХрд╛ рдирдпрд╛ рдПрдирд╛рд▓реЙрдЧ: xswitcher
рд╕рд╛рде рд╣реА, рдореИрдВ (рдПрдХ рдбрд┐рдЬрд╝рд╛рдЗрди рдЗрдВрдЬреАрдирд┐рдпрд░ рдХреЗ рд░реВрдк рдореЗрдВ) рдЬреЛ рдореИрдВ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдЙрд╕реЗ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рддреИрдпрд╛рд░ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВред рд▓реЗрдХрд┐рди рдореИрдВ рдЪрд╛рд╣рддрд╛ рдерд╛ (рдкрд╣рд▓реЗ рдкреБрдВрдЯреЛ рд╕реНрд╡рд┐рдЪрд░ рд╕реЗ, рдФрд░ рдлрд┐рд░, рд╡рд┐рдВрдбреЛрдЬ рд╡рд┐рд╕реНрдЯрд╛ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж, рдЕрдВрдд рдореЗрдВ xneur рд╕реЗ рд▓рд┐рдирдХреНрд╕ рдкрд░ рд╕реНрд╡рд┐рдЪ рдХрд░рдирд╛) рдмрд┐рд▓реНрдХреБрд▓ рдПрдХ рдЪреАрдЬрд╝ред рдпрд╣ рдорд╣рд╕реВрд╕ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рдХрд┐ рд╕реНрдХреНрд░реАрди рдкрд░ рдХрдЪрд░рд╛ рдЧрд▓рдд рд▓реЗрдЖрдЙрдЯ рдореЗрдВ рд╣реИ (рдпрд╣ рдЖрдорддреМрд░ рдкрд░ рдПрдХ рдирдпрд╛ рд╢рдмреНрдж рдЯрд╛рдЗрдк рдХрд░рдиреЗ рдХреЗ рдЕрдВрдд рдореЗрдВ рд╣реЛрддрд╛ рд╣реИ), "рд░реЛрдХреЗрдВ/рдмреНрд░реЗрдХ" рдкрд░ рдЬреЛрд░ рджреЗрдВред рдФрд░ рдЬреЛ рдЖрдкрдиреЗ рдореБрджреНрд░рд┐рдд рдХрд┐рдпрд╛ рд╣реИ рдЙрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВред

рдлрд┐рд▓рд╣рд╛рд▓, рдЙрддреНрдкрд╛рдж рдореЗрдВ рдЗрд╖реНрдЯрддрдо (рдореЗрд░реЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ) рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛/рдЬрдЯрд┐рд▓рддрд╛ рдЕрдиреБрдкрд╛рдд рд╣реИред рдпрд╣ рд╕рд╛рдЭрд╛ рдХрд░рдиреЗ рдХрд╛ рд╕рдордп рд╣реИ.

рдЯреАрдПрд▓.рдбреАрдЖрд░

рд╕рднреА рдкреНрд░рдХрд╛рд░ рдХреА рддрдХрдиреАрдХреА рдЬрд╛рдирдХрд╛рд░реА рдмрд╛рдж рдореЗрдВ рд╣реЛрдЧреА, рдЗрд╕рд▓рд┐рдП рдкрд╣рд▓реЗ - рд▓рд┐рдВрдХ "рд╕реНрдкрд░реНрд╢ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП" рдЕрдзреАрд░ рдХреЗ рд▓рд┐рдП.

рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╡реНрдпрд╡рд╣рд╛рд░ рд╣рд╛рд░реНрдбрдХреЛрдб рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:

  • "рд░реЛрдХреЗрдВ/рдмреНрд░реЗрдХ рдХрд░реЗрдВ": рдЕрдВрддрд┐рдо рд╢рдмреНрдж рдХреЛ рдмреИрдХрд╕реНрдкреЗрд╕ рдХрд░рддрд╛ рд╣реИ, рд╕рдХреНрд░рд┐рдп рд╡рд┐рдВрдбреЛ рдореЗрдВ рд▓реЗрдЖрдЙрдЯ рд╕реНрд╡рд┐рдЪ рдХрд░рддрд╛ рд╣реИ (0 рдФрд░ 1 рдХреЗ рдмреАрдЪ) рдФрд░ рдлрд┐рд░ рд╕реЗ рдбрд╛рдпрд▓ рдХрд░рддрд╛ рд╣реИред
  • "рдмрд┐рдирд╛ рдХреБрдЫ рдЫреЛрдбрд╝реЗ Ctrl": рд╕рдХреНрд░рд┐рдп рд╡рд┐рдВрдбреЛ рдореЗрдВ рд▓реЗрдЖрдЙрдЯ рд╕реНрд╡рд┐рдЪ рдХрд░рддрд╛ рд╣реИ (0 рдФрд░ 1 рдХреЗ рдмреАрдЪ)ред
  • "рдмрд┐рдирд╛ рдХреБрдЫ рдЫреЛрдбрд╝реЗ рд╢рд┐рдлреНрдЯ рдХрд░реЗрдВ": рд╕рдХреНрд░рд┐рдп рд╡рд┐рдВрдбреЛ рдореЗрдВ рд▓реЗрдЖрдЙрдЯ рдирдВрдмрд░ 0 рдЪрд╛рд▓реВ рдХрд░рддрд╛ рд╣реИред
  • "рдмрд┐рдирд╛ рдХрд┐рд╕реА рдЪреАрдЬрд╝ рдХреЗ рд░рд╛рдЗрдЯ рд╢рд┐рдлреНрдЯ": рд╕рдХреНрд░рд┐рдп рд╡рд┐рдВрдбреЛ рдореЗрдВ рд▓реЗрдЖрдЙрдЯ рдирдВрдмрд░ 1 рдЪрд╛рд▓реВ рдХрд░рддрд╛ рд╣реИред

рдЕрдм рд╕реЗ рдореИрдВ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░рдиреЗ рдХреА рдпреЛрдЬрдирд╛ рдмрдирд╛ рд░рд╣рд╛ рд╣реВрдВред рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЗ рдмрд┐рдирд╛, рдпрд╣ рджрд┐рд▓рдЪрд╕реНрдк рдирд╣реАрдВ рд╣реИ (рд╡реИрд╕реЗ рднреА рдореБрдЭреЗ рдЗрд╕рд╕реЗ рдХреЛрдИ рджрд┐рдХреНрдХрдд рдирд╣реАрдВ рд╣реИ)ред рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛрд╣реИ рдХрд┐ рд╣реИрдмреЗ рдкрд░ рд╕рдорд╛рди рд╕рдорд╕реНрдпрд╛рдУрдВ рд╡рд╛рд▓реЗ рджрд░реНрд╢рдХреЛрдВ рдХрд╛ рдкрд░реНрдпрд╛рдкреНрдд рдкреНрд░рддрд┐рд╢рдд рд╣реЛрдЧрд╛ред

рдПрдирдмреА рдХреНрдпреЛрдВрдХрд┐ рд╡рд░реНрддрдорд╛рди рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ, рдХреАрд▓реЙрдЧрд░ "/dev/input/" рд╕реЗ рдЬреБрдбрд╝рд╛ рд╣реБрдЖ рд╣реИ, xswitcher рдХреЛ рд░реВрдЯ рдЕрдзрд┐рдХрд╛рд░реЛрдВ рдХреЗ рд╕рд╛рде рд▓реЙрдиреНрдЪ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП:

chown root:root xswitcher
chmod +xs xswitcher

рдХреГрдкрдпрд╛ рдзреНрдпрд╛рди рджреЗрдВ: Suid рд╡рд╛рд▓реА рдлрд╝рд╛рдЗрд▓ рдХрд╛ рд╕реНрд╡рд╛рдореА рд░реВрдЯ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдХреНрдпреЛрдВрдХрд┐ рдЬреЛ рдХреЛрдИ рднреА рдорд╛рд▓рд┐рдХ рд╣реИ рдЙрд╕реЗ рд╕реНрдЯрд╛рд░реНрдЯрдЕрдк рдкрд░ рд╕реВрджрдЦреЛрд░ рдореЗрдВ рдмрджрд▓ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

рдкреИрд░рд╛рдиреЙрдпрдбреНрд╕ (рдореИрдВ рдХреЛрдИ рдЕрдкрд╡рд╛рдж рдирд╣реАрдВ рд╣реВрдВ) рд╕реЗ рдХреНрд▓реЛрди рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ GIT рдФрд░ рд╕рд╛рдЗрдЯ рдкрд░ рдЗрдХрдЯреНрдард╛ рдХрд░реЗрдВред рдЙрд╕ рддрд░рд╣:

go get "github.com/micmonay/keybd_event"
go get "github.com/gvalkov/golang-evdev"

### X11 headers for OpenSUSE/deb-based
zypper install libX11-devel libXmu-devel
apt-get install libx11-dev libxmu-dev

cd "x switcher/src/"
go build -o xswitcher -ldflags "-s -w" --tags static_all src/*.go

рд╕реНрд╡рд╛рдж рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдСрдЯреЛрд╕реНрдЯрд╛рд░реНрдЯ рдЬреЛрдбрд╝реЗрдВ (рдбреАрдИ рдХреЗ рдЖрдзрд╛рд░ рдкрд░)ред

рдпрд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, "рджрд▓рд┐рдпрд╛ рдирд╣реАрдВ рдорд╛рдВрдЧрддрд╛" (рдкреНрд░рддрд┐ рджрд┐рди тЙИ30 рд╕реЗрдХрдВрдб рд╕реАрдкреАрдпреВ, рдЖрд░рдПрд╕рдПрд╕ рдореЗрдВ тЙИ12 рдПрдордмреА)ред

рд╡рд┐рд╡рд░рдг

рдЕрдм - рд╡рд┐рд╡рд░рдг.

рд╕рдВрдкреВрд░реНрдг рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдореВрд▓ рд░реВрдк рд╕реЗ рдореЗрд░реЗ рдкрд╕рдВрджреАрджрд╛ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдкрд┐рдд рдереА, рдФрд░ рдореИрдВ рдПрдХ рдФрд░ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдЖрд▓рд╕реА рд╣реВрдВред рддреЛ, рд╕рдм рдХреБрдЫ рдвреЗрд░ рд╣реЛ рдЧрдпрд╛ рд╣реИ (рдХреЗрд╡рд▓ рдлрд╝реЛрд▓реНрдбрд░реЛрдВ рдореЗрдВ) рдФрд░ рдПрдЬреАрдкреАрдПрд▓ ("рд░рд┐рд╡рд░реНрд╕ рдкреЗрдЯреЗрдВрдЯ") рджреНрд╡рд╛рд░рд╛ рдХрд╡рд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

рдПрдХреНрд╕рд╕реНрд╡рд┐рдЪрд░ рдХреЛрдб рдЧреЛрд▓рд╛рдВрдЧ рдореЗрдВ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рд╕реА рдХрд╛ рдиреНрдпреВрдирддрдо рд╕рдорд╛рд╡реЗрд╢ рд╣реИред рдпрд╣ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рдХрдо рд╕реЗ рдХрдо рдкреНрд░рдпрд╛рд╕ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ (рдЕрдм рддрдХ рдРрд╕рд╛ рд╣реБрдЖ рд╣реИ)ред рд╕реАрдЬреАрдУ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЬреЛ рдЧрд╛рдпрдм рд╣реИ рдЙрд╕реЗ рдЬреЛрдбрд╝рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдмрдирд╛рдП рд░рдЦрддреЗ рд╣реБрдПред

рдкрд╛рда рдореЗрдВ рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ рд╣реИрдВ рдХрд┐ рдЗрд╕реЗ рдХрд╣рд╛рдБ рд╕реЗ рдФрд░ рдХреНрдпреЛрдВ рдЙрдзрд╛рд░ рд▓рд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдХреНрдпреЛрдВрдХрд┐ xneur рдХреЛрдб рдиреЗ "рдореБрдЭреЗ рдкреНрд░реЗрд░рд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛", рдореИрдВрдиреЗ рдЗрд╕реЗ рд╢реБрд░реБрдЖрддреА рдмрд┐рдВрджреБ рдХреЗ рд░реВрдк рдореЗрдВ рд▓рд┐рдпрд╛ loloswitcher.

"/dev/input/" рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдЕрдкрдиреЗ рдлрд╛рдпрджреЗ (рджрдмрд╛рдП рдЧрдП рдСрдЯреЛ-рд░рд┐рдкреАрдЯ рдХреБрдВрдЬреА рд╕рд╣рд┐рдд рд╕рдм рдХреБрдЫ рджрд┐рдЦрд╛рдИ рджреЗрддрд╛ рд╣реИ) рдФрд░ рдиреБрдХрд╕рд╛рди рджреЛрдиреЛрдВ рд╣реИрдВред рдиреБрдХрд╕рд╛рди рдпреЗ рд╣реИрдВ:

  • рдСрдЯреЛ-рд░рд┐рдкреАрдЯ (рдХреЛрдб "2" рд╡рд╛рд▓реА рдШрдЯрдирд╛рдПрдБ) x рдХреЗ рд╕рд╛рде рджреЛрд╣рд░рд╛рд╡ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдирд╣реАрдВ рд╣реИред
  • X11 рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЗрдирдкреБрдЯ рджрд┐рдЦрд╛рдИ рдирд╣реАрдВ рджреЗрддрд╛ рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, VNC рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ)ред
  • рдЬрдбрд╝ рдЪрд╛рд╣рд┐рдП.

рджреВрд╕рд░реА рдУрд░, "XSelectExtensionEvent()" рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдПрдХреНрд╕ рдЗрд╡реЗрдВрдЯ рдХреА рд╕рджрд╕реНрдпрддрд╛ рд▓реЗрдирд╛ рд╕рдВрднрд╡ рд╣реИред рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ xinput рдХреЛрдб. рдореБрдЭреЗ рдлрд┐рд▓рд╣рд╛рд▓ рдРрд╕рд╛ рдХреБрдЫ рдирд╣реАрдВ рдорд┐рд▓рд╛, рдФрд░ рдореЛрдЯреЗ рддреМрд░ рдкрд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ рддреБрд░рдВрдд рд╕реА рдХреЛрдб рдХреА рд╕реМ рд▓рд╛рдЗрдиреЗрдВ рд▓рдЧ рдЧрдИрдВред рдЗрд╕реЗ рдЕрднреА рдХреЗ рд▓рд┐рдП рдПрдХ рддрд░рдл рд░рдЦ рджреЗрдВ.

"рд░рд┐рд╡рд░реНрд╕" рдЖрдЙрдЯрдкреБрдЯ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рд╡рд░реНрдЪреБрдЕрд▓ рдХреАрдмреЛрд░реНрдб рдХреЛ рд╕реНрдХреНрд░реВ рдХрд░рдХреЗ рдмрдирд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред keybd_event рдХреЗ рд▓реЗрдЦрдХ рдХреЛ рдзрдиреНрдпрд╡рд╛рдж, рд▓реЗрдХрд┐рди рд╡рд╣рд╛рдВ рдЕрдореВрд░реНрддрддрд╛ рдмрд╣реБрдд рдЙрдЪреНрдЪ рд╕реНрддрд░реАрдп рд╣реИ рдФрд░ рдЗрд╕реЗ рдЖрдЧреЗ рдлрд┐рд░ рд╕реЗ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдореИрдВ рддреАрд╕рд░реА рдкрдВрдХреНрддрд┐ рдХрд╛ рдЪрдпрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд╣реА рд╡рд┐рди рдХреБрдВрдЬреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВред рдФрд░ рдХреЗрд╡рд▓ рдмрд╛рдИрдВ рдУрд░ рдХреА рдЬреАрдд рд╡рд╛рдкрд╕ рдкреНрд░реЗрд╖рд┐рдд рдХреА рдЬрд╛рддреА рд╣реИред

рдЬреНрдЮрд╛рдд рдХреАрдбрд╝реЗ

  • рд╣рдо "рд╕рдордЧреНрд░" рдЗрдирдкреБрдЯ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рдирд╣реАрдВ рдЬрд╛рдирддреЗ (рдЙрджрд╛рд╣рд░рдг: ┬╜)ред рдЕрднреА рдЗрд╕рдХреА рдЬрд░реВрд░рдд рдирд╣реАрдВ рд╣реИ.
  • рд╣рдо рд╕рд╣реА рдЦреЗрд▓ рд░рд╣реЗ рд╣реИрдВ рдФрд░ рдЧрд▓рдд рдЬреАрдд рд░рд╣реЗ рд╣реИрдВред рдореЗрд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдпрд╣ рдЬреЛрд░ рддреЛрдбрд╝рддрд╛ рд╣реИред
  • рдХреЛрдИ рд╕реНрдкрд╖реНрдЯ рдЗрдирдкреБрдЯ рдкрд╛рд░реНрд╕рд┐рдВрдЧ рдирд╣реАрдВ рд╣реИ. рдЗрд╕рдХреЗ рдмрдЬрд╛рдп, рдХрдИ рдлрд╝рдВрдХреНрд╢рди рд╣реИрдВ: рддреБрд▓рдирд╛(), CtrlSequence(), рд░рд┐рдкреАрдЯSequence(), SpaceSequence()ред рдзрдиреНрдпрд╡рд╛рдж nsmcan рдЖрдкрдХреА рджреЗрдЦрднрд╛рд▓ рдХреЗ рд▓рд┐рдП: рдЗрд╕реЗ рдХреЛрдб рдФрд░ рдпрд╣рд╛рдВ рдкрд░ рд╕рд╣реА рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рд╕рдВрднрд╛рд╡рдирд╛ рдХреЗ рд╕рд╛рде, рдЖрдк рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд░рддреЗ рд╕рдордп рдмрдЧ рдкрдХрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВред
    рдЗрд╕ рдмрд┐рдВрджреБ рдкрд░ рдореИрдВ рдирд╣реАрдВ рдЬрд╛рдирддрд╛ рдХрд┐ "рдХреИрд╕реЗ рдХрд░реЗрдВ" рдФрд░ рдХрд┐рд╕реА рднреА рд╕реБрдЭрд╛рд╡ рдХрд╛ рд╕реНрд╡рд╛рдЧрдд рдХрд░реВрдВрдЧрд╛ред
  • (рд╣рд╛рдп рднрдЧрд╡рд╛рдиреН) рдЪреИрдирд▓реЛрдВ рдХрд╛ рдкреНрд░рддрд┐рд╕реНрдкрд░реНрдзреА рдЙрдкрдпреЛрдЧ (рдХреАрдмреЛрд░реНрдбрдЗрд╡реЗрдВрдЯреНрд╕, рдорд╛рдЗрд╕рдЗрд╡реЗрдВрдЯреНрд╕)ред

рдирд┐рд╖реНрдХрд░реНрд╖

рдХреЛрдб рд╕рдмрд╕реЗ рд╕рд░рд▓ рдкреНрд░рдХреНрд░рд┐рдпрд╛рддреНрдордХ рд╣реИ. рдФрд░ рдореЗрд░реЗ рдЬреИрд╕рд╛ рдореВрд░реНрдЦ. рдЗрд╕рд▓рд┐рдП, рдореИрдВ рдЗрд╕ рдЙрдореНрдореАрдж рдХреЗ рд╕рд╛рде рдЦреБрдж рдХреЛ рд╕рдВрддреБрд╖реНрдЯ рдХрд░рддрд╛ рд╣реВрдВ рдХрд┐ рд▓рдЧрднрдЧ рдХреЛрдИ рднреА рддрдХрдиреАрд╢рд┐рдпрди рд╡рд╣ рдкреВрд░рд╛ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдЧрд╛ рдЬреЛ рд╡рд╣ рдЪрд╛рд╣рддрд╛ рд╣реИред рдФрд░ рдЗрд╕рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж, рдпрд╣ рдЙрддреНрдкрд╛рдж рд╕рдорд░реНрдерди рдХреЗ рдмрд┐рдирд╛ рдирд╖реНрдЯ рдирд╣реАрдВ рд╣реЛрдЧрд╛, рдЬреИрд╕реЗ рдЕрдзрд┐рдХрд╛рдВрд╢ рдордиреЛрд░рдВрдЬрди рдХреЗ рд▓рд┐рдПред

рднрд╛рдЧреНрдп рдЕрдЪреНрдЫрд╛ рд╣реИ!

рд╕реНрд░реЛрдд: www.habr.com

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдЬреЛрдбрд╝реЗрдВ