ΠΠΎΠ±ΡΡ Π΄Π΅Π½ Π½Π° Π²ΡΠΈΡΠΊΠΈ!
29 ΡΠ΅Π²ΡΡΠ°ΡΠΈ 2020 Π³ΠΎΠ΄ΠΈΠ½Π° ΡΠ΅ ΠΏΡΠΎΠ²Π΅Π΄Π΅ ΠΎΡΠΈΡΠΈΠ°Π»Π½ΠΎ ΠΌΠΈΠΊΡΠΎΠΈΠ·Π΄Π°Π²Π°Π½Π΅ Π½Π° Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ smart-env ΠΈ python-shell. ΠΠ° ΡΠ΅Π·ΠΈ, ΠΊΠΎΠΈΡΠΎ Π½Π΅ ΡΠ° Π½Π°ΡΡΠ½ΠΎ, ΠΏΡΠ΅Π΄Π»Π°Π³Π°ΠΌ Π΄Π° Π³ΠΎ ΠΏΡΠΎΡΠ΅ΡΠ΅ΡΠ΅ ΠΏΡΡΠ²ΠΎ
ΠΠ°ΠΊΡΠ°ΡΠΊΠΎ, ΠΏΡΠΎΠΌΠ΅Π½ΠΈΡΠ΅ Π²ΠΊΠ»ΡΡΠ²Π°Ρ Π·Π°Π²ΡΡΡΠ²Π°Π½Π΅ Π½Π° ΠΊΠΎΠΌΠ°Π½Π΄ΠΈ, ΡΠ°Π·ΡΠΈΡΠ΅Π½ΠΈ Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ Π·Π° ΠΈΠ·ΠΏΡΠ»Π½Π΅Π½ΠΈΠ΅ Π½Π° ΠΊΠΎΠΌΠ°Π½Π΄ΠΈ, Π½ΡΠΊΠΎΠΈ ΠΏΡΠ΅ΡΠ°Π±ΠΎΡΠΊΠΈ ΠΈ ΠΊΠΎΡΠ΅ΠΊΡΠΈΠΈ Π½Π° Π³ΡΠ΅ΡΠΊΠΈ.
ΠΠ° ΠΏΠΎΠ΄ΡΠΎΠ±Π½ΠΎΡΡΠΈ Π²ΠΈΠΆΡΠ΅ ΠΊΠ°Ρ.
ΠΠ°ΠΊΠ²ΠΎ Π΅ Π½ΠΎΠ²ΠΎΡΠΎ Π² python-shell?
ΠΠ°ΠΏΠΎΡΠ²Π°ΠΌ Π²Π΅Π΄Π½Π°Π³Π° Ρ Π΄Π΅ΡΠ΅ΡΡΠ°.
ΠΠ°Π²ΡΡΡΠ²Π°Π½Π΅ Π½Π° ΠΊΠΎΠΌΠ°Π½Π΄Π°ΡΠ°
Π‘ΡΠ³Π»Π°ΡΠ΅ΡΠ΅ ΡΠ΅ - ΡΠ΄ΠΎΠ±Π½ΠΎ Π΅, ΠΊΠΎΠ³Π°ΡΠΎ ΡΠ΅Π΄Π°ΠΊΡΠΎΡΡΡ/IDE/ΡΠ΅ΡΠΌΠΈΠ½Π°Π»ΡΡ Π²ΠΈ ΠΏΠΎΠ΄ΠΊΠ°Π½ΠΈ Π·Π° ΠΈΠΌΠ΅ΡΠΎ Π½Π° ΠΊΠΎΠΌΠ°Π½Π΄Π°ΡΠ°, Π° ΠΏΠΎΠ½ΡΠΊΠΎΠ³Π° Π΄ΠΎΡΠΈ ΠΈ Π·Π° ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΈΡΠ΅ Π½Π° ΠΏΠΎΠ²ΠΈΠΊΠ²Π°Π½Π΅ΡΠΎ? Π’Π°ΠΊΠ° ΡΠ΅ Python-shell ΠΏΠΎΡΡΠ΅ΠΏΠ΅Π½Π½ΠΎ Π½Π°ΠΏΡΠ΅Π΄Π²Π° Π² ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²ΡΠ½Π΅ΡΠΎ Π½Π° ΠΏΠΎΠ΄ΠΎΠ±Π½Π° ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»Π½ΠΎΡΡ. ΠΠΎΡΠ°Π΄ΠΈ ΡΠ°ΠΊΡΠ°, ΡΠ΅ ΠΏΠΎΠ»Π΅ΡΠ°ΡΠ° Π½Π° ΠΊΠ»Π°ΡΠ° Shell ΠΏΠΎΠ΄ ΠΊΠ°ΠΏΠ°ΠΊΠ° Π΄Π΅ ΡΠ°ΠΊΡΠΎ Π½Π΅ ΡΠ° Π½Π΅Π³ΠΎΠ²ΠΈ ΠΏΠΎΠ»Π΅ΡΠ° (Π²Π΅Π·Π΄Π΅ΡΡΡΠΈΡΡ __getattr__), Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ½ΠΎΡΠΎ Π΄ΠΎΠ²ΡΡΡΠ²Π°Π½Π΅ ΡΡΡΠΎ Π΅ ΡΡΠ·Π΄Π°Π΄Π΅Π½ΠΎ ΠΎΡ Π½ΡΠ»Π°ΡΠ° (ΡΡΠΎΡΠ²Π΅ΡΠ½ΠΎ ΡΡΠ΅Π· ΠΏΡΠ΅ΡΠΎΠ²Π°ΡΠ²Π°Π½Π΅ Π½Π° ΠΌΠ΅ΡΠΎΠ΄Π° __dir__). ΠΠΎΠ½Π°ΡΡΠΎΡΡΠ΅ΠΌ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ½ΠΎΡΠΎ Π΄ΠΎΠ²ΡΡΡΠ²Π°Π½Π΅ ΡΠ°Π±ΠΎΡΠΈ Π² ΡΡΠ΅Π΄ΠΈ Π½Π° BPython ΠΈ IPython. Π Π°Π·Π±ΠΈΡΠ° ΡΠ΅, Π±ΠΈΡ ΠΈΡΠΊΠ°Π» Π΄Π° Π²ΠΈΠ΄Ρ ΠΈΠ½ΡΠ΅Π³ΡΠ°ΡΠΈΡ Ρ ΠΏΠΎ-ΡΠ²Π°ΠΆΠ°Π²Π°Π½ΠΈ ΠΏΡΠΎΠ΄ΡΠΊΡΠΈ ΠΊΠ°ΡΠΎ PyCharm ΠΈ Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈΡΠ΅ Π·Π° Π²Π½Π΅Π΄ΡΡΠ²Π°Π½Π΅ ΡΠ΅ ΠΏΡΠΎΡΡΠ²Π°Ρ Π² ΡΠ°Π·ΠΈ ΠΏΠΎΡΠΎΠΊΠ°.
ΠΠΎΠ±Π°Π²ΡΠ½Π΅ Π½Π° ΡΠ²ΠΎΠΉΡΡΠ²Π°
ΠΠ°ΡΠΎ ΡΠ°ΡΡ ΠΎΡ ΠΈΠ·Π΄Π°Π½ΠΈΠ΅ΡΠΎ ΠΊΠ»Π°ΡΡΡ Shell ΠΏΠΎΠ»ΡΡΠΈ Π½ΠΎΠ²ΠΎ ΡΠ²ΠΎΠΉΡΡΠ²ΠΎ last_command. ΠΠ΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎΡΡΡΠ° ΠΎΡ Π½Π΅Π³ΠΎ Π²ΡΠ·Π½ΠΈΠΊΠ½Π°, Π·Π°ΡΠΎΡΠΎ ΠΊΠΎΠ³Π°ΡΠΎ ShellException Π±Π΅ΡΠ΅ Ρ Π²ΡΡΠ»Π΅Π½ ΠΎΡ ΠΊΠΎΠΌΠ°Π½Π΄Π° Ρ Π½Π΅Π½ΡΠ»Π΅Π² ΠΊΠΎΠ΄ Π·Π° Π²ΡΡΡΠ°Π½Π΅, ΠΎΠ±Π΅ΠΊΡΡΡ Command Π½Π΅ Π±Π΅ΡΠ΅ Π²ΡΡΠ½Π°Ρ ΠΎΡ ΠΈΠ·Π²ΠΈΠΊΠ²Π°Π½Π΅ΡΠΎ __call__() ΠΊΡΠΌ ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΈΡ ΠΎΠ±Π΅ΠΊΡ. Π‘Π΅Π³Π° ΠΈΠΌΠ° Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ Π΄Π° Π½Π°ΠΏΡΠ°Π²ΠΈΡΠ΅ ΡΠΎΠ²Π°:
try:
command = Shell.touch('/foo.txt')
except ShellException:
command = Shell.last_command
Π‘ΠΏΠΈΡΡΠΊΡΡ ΡΡΡ ΡΠ²ΠΎΠΉΡΡΠ²Π° Π½Π° ΠΎΠ±Π΅ΠΊΡΠ° Command ΡΡΡΠΎ Π΅ ΡΠ°Π·ΡΠΈΡΠ΅Π½. ΠΠΎΠ±Π°Π²Π΅Π½ΠΎ Π΅ ΠΏΠΎΠ»Π΅ Π·Π° Π³ΡΠ΅ΡΠΊΠΈ, ΠΊΠΎΠ΅ΡΠΎ Π²ΡΡΡΠ° ΠΈΠ·Ρ ΠΎΠ΄Π° Π½Π° ΠΊΠΎΠΌΠ°Π½Π΄Π°ΡΠ° Π² ΠΏΠΎΡΠΎΠΊΠ° Π·Π° Π³ΡΠ΅ΡΠΊΠΈ.
ΠΠ·ΠΏΡΠ»Π½Π΅Π½ΠΈΠ΅ Π½Π° ΠΊΠΎΠΌΠ°Π½Π΄ΠΈ Ρ Π½Π΅Π²Π°Π»ΠΈΠ΄Π½ΠΈ ΠΈΠΌΠ΅Π½Π° Π½Π° Python
ΠΠΎΡΡΠΈ Π²ΡΡΠΊΠ° ΡΠΈΡΡΠ΅ΠΌΠ° ΠΈΠΌΠ° ΠΏΠΎΠ½Π΅ Π΅Π΄Π½Π° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠ°, ΡΠΈΠ΅ΡΠΎ ΠΈΠΌΠ΅ Π½Π΅ Π΅ ΠΏΠΎΠ΄Ρ ΠΎΠ΄ΡΡΠΎ ΠΊΠ°ΡΠΎ ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡ Π² Python (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ Π΄ΠΎΠ±ΡΠ΅ ΠΏΠΎΠ·Π½Π°ΡΠ°ΡΠ° ΠΏΠΎΠΌΠΎΡΠ½Π° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠ° 2to3). ΠΠ±Π°Π΄Π΅ΡΠ΅ ΠΉ ΡΠ΅ Ρ
Shell.2to3()
ΠΠΊΠΎ Π½Π΅ ΡΠ°Π±ΠΎΡΠΈ, ΠΏΡΠ΅Π²ΠΎΠ΄Π°ΡΡΡ Π½ΡΠΌΠ° Π΄Π° Π³ΠΎ ΠΏΡΠΎΠΏΡΡΠ½Π΅.
Π Π΅ΡΠ΅Π½ΠΈΠ΅ΡΠΎ Π΅ Π΄Π° ΠΈΠ·Π²ΠΈΠΊΠ°ΡΠ΅ ΠΊΠΎΠΌΠ°Π½Π΄Π°ΡΠ° ΠΏΠΎ Π·Π°ΠΎΠ±ΠΈΠΊΠΎΠ»Π΅Π½ Π½Π°ΡΠΈΠ½:
Shell("2to3") # Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ ΠΎΠ±ΡΠ΅ΠΊΡ ΠΊΠΎΠΌΠ°Π½Π΄Ρ
Π‘ΡΡΡΠ²Π° ΡΠΈ Π΄Π° ΡΠ΅ ΠΎΡΠ±Π΅Π»Π΅ΠΆΠΈ, ΡΠ΅ ΠΏΠΎ ΡΡΡΠΈΡ Π½Π°ΡΠΈΠ½ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΠΈΠ·ΠΏΡΠ»Π½ΡΠ²Π°ΡΠ΅ ΠΊΠΎΠΌΠ°Π½Π΄ΠΈ, ΠΊΠΎΠΈΡΠΎ ΡΠ° Π²Π°Π»ΠΈΠ΄Π½ΠΈ ΠΎΡ Π³Π»Π΅Π΄Π½Π° ΡΠΎΡΠΊΠ° Π½Π° ΠΈΠ½ΡΠ΅ΡΠΏΡΠ΅ΡΠ°ΡΠΎΡΠ°, ΠΊΠΎΠ΅ΡΠΎ ΠΎΡΡΠ°Π²Ρ Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ Π·Π° ΡΡΠ·Π΄Π°Π²Π°Π½Π΅ Π½Π° Π³ΡΠ²ΠΊΠ°Π²ΠΈ ΡΠΊΡΠΈΠΏΡΠΎΠ²Π΅ ΠΊΠ°ΡΠΎ
cmd = "python{}".format(sys.version_info[0])
Shell(cmd)(*args, **kwargs)
ΠΠ°Π»ΠΊΠΈ ΠΏΡΠΎΠΌΠ΅Π½ΠΈ
- ΠΡΡ Π° Π²Π½Π΅Π΄ΡΠ΅Π½ΠΈ ΠΌΠ΅ΡΠΎΠ΄ΠΈΡΠ΅ __repr__() ΠΈ __str__() Π½Π° ΠΎΠ±Π΅ΠΊΡΠ° ΠΎΡ ΠΊΠ»Π°Ρ Command, ΠΊΠΎΠΈΡΠΎ Π²Π΅ΡΠ΅ ΠΏΡΠΎΠΈΠ·Π²Π΅ΠΆΠ΄Π°Ρ ΠΈΠ½ΡΡΠΈΡΠΈΠ²Π½ΠΈ ΡΡΠΎΠΉΠ½ΠΎΡΡΠΈ (ΡΡΠΎΡΠ²Π΅ΡΠ½ΠΎ ΠΊΠΎΠΌΠ°Π½Π΄Π° Ρ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΈ ΠΈ Π½Π΅ΠΉΠ½ΠΈΡ stdout ΠΈΠ·Ρ ΠΎΠ΄).
- ΠΠ΅Π·Π½Π°ΡΠΈΡΠ΅Π»Π½ΠΈ ΠΊΠΎΡΠ΅ΠΊΡΠΈΠΈ Π½Π° ΠΊΠΎΠ΄Π°.
- ΠΠΎΠ±Π°Π²ΡΠ½Π΅ Π½Π° ΡΠ΅ΡΡΠΎΠ²ΠΎ ΠΏΠΎΠΊΡΠΈΡΠΈΠ΅, ΠΊΠ°ΠΊΡΠΎ ΠΈ ΡΠ΅ΠΎΡΠ³Π°Π½ΠΈΠ·ΠΈΡΠ°Π½Π΅ Π½Π° ΡΡΡΠ΅ΡΡΠ²ΡΠ²Π°ΡΠΈ.
- ΠΠΎΠ±Π°Π²ΡΠ½Π΅ Π½Π° ΠΊΠ»Π°ΡΠΎΠ²Π΅ΡΠ΅ Subprocess ΠΈ Process, ΡΠΈΡΡΠΎ ΡΠ΅Π» Π΅ Π΄Π° ΡΡΠ·Π΄Π°Π΄Π°Ρ Π΄ΠΎΠΏΡΠ»Π½ΠΈΡΠ΅Π»Π½ΠΎ Π½ΠΈΠ²ΠΎ Π½Π° Π°Π±ΡΡΡΠ°ΠΊΡΠΈΡ ΠΏΡΠΈ ΡΠ°Π±ΠΎΡΠ° Ρ ΠΌΠΎΠ΄ΡΠ»Π° subprocess. ΠΠ°ΠΉ-Π²Π΅ΡΠ΅ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌ Π·Π° ΠΏΡΠ΅ΠΌΠ°Ρ Π²Π°Π½Π΅ Π½Π° Π΄ΡΠ±Π»ΠΈΡΠ°Π½Π΅ Π½Π° ΠΊΠΎΠ΄ ΠΏΡΠΈ ΡΠ°Π±ΠΎΡΠ° Ρ Python 2/3, Π½ΠΎ ΠΏΠΎΡΠ΅Π½ΡΠΈΠ°Π»Π½ΠΎ ΠΌΠΎΠΆΠ΅ Π΄Π° ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²ΠΈ ΠΈ Π΄ΡΡΠ³ΠΈ Π±ΠΎΠ½ΡΡΠΈ.
ΠΠ°ΠΊΠ²ΠΎ Π΅ Π½ΠΎΠ²ΠΎΡΠΎ Π² smart-env?
ΠΠ° ΡΠ°Π·Π»ΠΈΠΊΠ° ΠΎΡ python-shell, ΠΈΠΌΠ° ΠΏΠΎ-ΠΌΠ°Π»ΠΊΠΎ ΠΏΡΠΎΠΌΠ΅Π½ΠΈ Π² Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ°ΡΠ° smart-env. ΠΡΠΈΡΠΈΠ½Π°ΡΠ° Π·Π° ΡΠΎΠ²Π° Π΅ ΠΏΡΠΎΡΡΠ° - Π»ΠΈΠΏΡΠ° Π½Π° ΡΠ²ΠΎΠ±ΠΎΠ΄Π½ΠΎ Π²ΡΠ΅ΠΌΠ΅, ΠΏΡΠ΅Π· ΠΊΠΎΠ΅ΡΠΎ Π½ΡΠΊΠΎΠΈ ΠΏΠΎΡΠ΅Π½ΡΠΈΠ°Π»Π½ΠΈ ΠΏΠΎΠ΄ΠΎΠ±ΡΠ΅Π½ΠΈΡ (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ½ΠΎ Π΄ΠΎΠ²ΡΡΡΠ²Π°Π½Π΅ Π½Π° ΠΏΡΠΎΠΌΠ΅Π½Π»ΠΈΠ²ΠΈ Π½Π° ΡΡΠ΅Π΄Π°ΡΠ°) Π±ΡΡ Π° ΠΏΡΠ΅ΠΌΠ΅ΡΡΠ΅Π½ΠΈ Π² ΡΠ»Π΅Π΄Π²Π°ΡΠΎΡΠΎ ΠΈΠ·Π΄Π°Π½ΠΈΠ΅.
ΠΡΡΡΠ½ΠΎΡΡ Π² Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ°ΡΠ° ΡΠ° Π½Π°ΠΏΡΠ°Π²Π΅Π½ΠΈ ΡΠ»Π΅Π΄Π½ΠΈΡΠ΅ ΠΏΡΠΎΠΌΠ΅Π½ΠΈ:
- ΠΠ΅Π·Π½Π°ΡΠΈΡΠ΅Π»Π½ΠΈ ΠΊΠΎΡΠ΅ΠΊΡΠΈΠΈ Π½Π° ΠΊΠΎΠ΄Π°.
- Π Π΅ΡΠ°ΠΊΡΠΎΡΠΈΠ½Π³.
- Π Π΅ΠΎΡΠ³Π°Π½ΠΈΠ·Π°ΡΠΈΡ ΠΈ ΡΡΡΠ²ΡΡΡΠ΅Π½ΡΡΠ²Π°Π½Π΅ Π½Π° ΡΡΡΠ΅ΡΡΠ²ΡΠ²Π°ΡΠΈ ΡΠ΅ΡΡΠΎΠ²Π΅.
ΠΠ»Π°Π½ΠΎΠ²Π΅ Π·Π° ΡΠ»Π΅Π΄Π²Π°ΡΠΈΡΠ΅ ΠΈΠ·Π΄Π°Π½ΠΈΡ
Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ° Π½Π° python-shell
- ΠΠΎΠ±Π°Π²ΡΠ½Π΅ Π½Π° ΠΏΠΎΠ΄Π΄ΡΡΠΆΠΊΠ° Π·Π° Π½Π΅Π±Π»ΠΎΠΊΠΈΡΠ°ΡΠΈ ΠΈΠ·Π²ΠΈΠΊΠ²Π°Π½ΠΈΡ Π½Π° ΠΊΠΎΠΌΠ°Π½Π΄ΠΈ (ΠΏΠ°ΡΠ°Π»Π΅Π»ΠΈΠ·ΠΈΡΠ°Π½Π΅ Π½Π° ΠΈΠ·ΠΏΡΠ»Π½Π΅Π½ΠΈΠ΅ΡΠΎ).
Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ° smart-env
- ΠΠ½Π΅Π΄ΡΡΠ²Π°Π½Π΅ Π½Π° Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ½ΠΎ Π΄ΠΎΠ²ΡΡΡΠ²Π°Π½Π΅ Π½Π° ΠΏΡΠΎΠΌΠ΅Π½Π»ΠΈΠ²ΠΈ Π½Π° ΡΡΠ΅Π΄Π°ΡΠ° Π² ENV ΠΊΠ»Π°ΡΠ°.
- ΠΠΎΠ΄Π΄ΡΡΠΆΠΊΠ° Π½Π° ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡΠ° in Π·Π° ΠΏΡΠΎΠ²Π΅ΡΠΊΠ° Π½Π° ΡΡΡΠ΅ΡΡΠ²ΡΠ²Π°Π½Π΅ΡΠΎ Π½Π° ΠΏΡΠΎΠΌΠ΅Π½Π»ΠΈΠ²Π° env.
- ΠΠ½Π΅Π΄ΡΡΠ²Π°Π½Π΅ Π½Π° ΠΏΠΎΠ΄Π΄ΡΡΠΆΠΊΠ° Π·Π° ΡΡΠ½ΠΊΡΠΈΠΈΡΠ΅ str() ΠΈ repr() Π·Π° ΠΊΠ»Π°ΡΠ° ENV.
ΠΠ°ΡΠΈΡΠ΅ Π½Π° ΡΠ»Π΅Π΄Π²Π°ΡΠΈΡΠ΅ ΠΈΠ·Π΄Π°Π½ΠΈΡ ΡΠ΅ Π±ΡΠ΄Π°Ρ Π΄ΠΎΠΏΡΠ»Π½ΠΈΡΠ΅Π»Π½ΠΎ ΠΎΠ±ΡΠ²Π΅Π½ΠΈ Π² ΡΠ»Π΅Π΄Π½ΠΈΡΠ΅ ΠΊΠΎΠΌΡΠ½ΠΈΠΊΠ°ΡΠΈΠΎΠ½Π½ΠΈ ΠΊΠ°Π½Π°Π»ΠΈ:
Π’Π΅Π»Π΅Π³ΡΠ°ΠΌ ΠΊΠ°Π½Π°Π» (ΠΏΡΠ±Π»ΠΈΡΠ΅Π½) Twitter - ΠΠΊΡΡΠ°Π»ΠΈΠ·Π°ΡΠΈΡ Π² ΡΠ°Π·ΠΈ ΡΡΠ°ΡΠΈΡ.
ΠΠ·ΡΠΎΡΠ½ΠΈΠΊ: www.habr.com