ΠΡΠΈΡΠΊΠΈ ΠΎΠ±ΠΈΡΠ°ΠΌΠ΅ Ansible, Π½ΠΎ Ansible Π΅ YAML. ΠΠ° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΎΠ½Π½ΠΈ ΡΠ°ΠΉΠ»ΠΎΠ²Π΅ ΡΡΡΠ΅ΡΡΠ²ΡΠ²Π°Ρ ΠΌΠ½ΠΎΠ³ΠΎ ΡΠΎΡΠΌΠ°ΡΠΈ: ΡΠΏΠΈΡΡΡΠΈ ΠΎΡ ΡΡΠΎΠΉΠ½ΠΎΡΡΠΈ, Π΄Π²ΠΎΠΉΠΊΠΈ βΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡ-ΡΡΠΎΠΉΠ½ΠΎΡΡβ, INI ΡΠ°ΠΉΠ»ΠΎΠ²Π΅, YAML, JSON, XML ΠΈ ΠΌΠ½ΠΎΠ³ΠΎ Π΄ΡΡΠ³ΠΈ. ΠΡΠΏΡΠ΅ΠΊΠΈ ΡΠΎΠ²Π°, ΠΏΠΎ Π½ΡΠΊΠΎΠ»ΠΊΠΎ ΠΏΡΠΈΡΠΈΠ½ΠΈ, ΠΎΡ Π²ΡΠΈΡΠΊΠΈ ΡΡΡ YAML ΡΠ΅ΡΡΠΎ ΡΠ΅ ΡΠΌΡΡΠ° Π·Π° ΠΎΡΠΎΠ±Π΅Π½ΠΎ ΡΡΡΠ΄Π΅Π½. ΠΠΎ-ΡΠΏΠ΅ΡΠΈΠ°Π»Π½ΠΎ, Π½Π΅Π·Π°Π²ΠΈΡΠΈΠΌΠΎ ΠΎΡ Π½Π΅Π³ΠΎΠ²ΠΈΡ ΠΎΡΠ²Π΅ΠΆΠ°Π²Π°Ρ ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΠΈΠ·ΡΠΌ ΠΈ Π²ΠΏΠ΅ΡΠ°ΡΠ»ΡΠ²Π°ΡΠΈΡΠ΅ ΠΌΡ Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ Π·Π° ΡΠ°Π±ΠΎΡΠ° Ρ ΠΉΠ΅ΡΠ°ΡΡ ΠΈΡΠ½ΠΈ ΡΡΠΎΠΉΠ½ΠΎΡΡΠΈ, ΡΠΈΠ½ΡΠ°ΠΊΡΠΈΡΡΡ Π½Π° YAML ΠΌΠΎΠΆΠ΅ Π΄Π° Π±ΡΠ΄Π΅ Π΄ΡΠ°Π·Π½Π΅Ρ ΡΡΡ ΡΠ²ΠΎΡ ΠΏΠΎΠ΄Ρ ΠΎΠ΄, ΠΏΠΎΠ΄ΠΎΠ±Π΅Π½ Π½Π° Python, ΠΊΡΠΌ ΠΎΡΡΡΡΠΏΠΈΡΠ΅.

ΠΠΊΠΎ YAML Π²ΠΈ Π΄ΡΠ°Π·Π½ΠΈ, ΠΌΠΎΠΆΠ΅ΡΠ΅ β ΠΈ ΡΡΡΠ±Π²Π°! β Π΄Π° ΠΏΡΠ΅Π΄ΠΏΡΠΈΠ΅ΠΌΠ΅ΡΠ΅ ΡΠ»Π΅Π΄Π½ΠΈΡΠ΅ 10 ΡΡΡΠΏΠΊΠΈ, Π·Π° Π΄Π° Π½Π°ΠΌΠ°Π»ΠΈΡΠ΅ Π²Π°ΡΠ΅ΡΠΎ ΡΠ°Π·Π΄ΡΠ°Π·Π½Π΅Π½ΠΈΠ΅ Π΄ΠΎ ΠΏΡΠΈΠ΅ΠΌΠ»ΠΈΠ²ΠΎ Π½ΠΈΠ²ΠΎ ΠΈ Π΄Π° ΠΎΠ±ΠΈΠΊΠ½Π΅ΡΠ΅ YAML. ΠΠ°ΠΊΡΠΎ ΡΠ΅ ΠΏΠΎΠ»Π°Π³Π° Π½Π° ΠΈΡΡΠΈΠ½ΡΠΊΠΈ ΡΠΏΠΈΡΡΠΊ, Π½Π°ΡΠ°ΡΠ° Π΄Π΅ΡΠ΅ΡΠΊΠ° ΡΡΠ²Π΅ΡΠΈ Π·Π°ΠΏΠΎΡΠ²Π° ΠΎΡ Π½ΡΠ»Π°; ΠΌΠ΅Π΄ΠΈΡΠ°ΡΠΈΡΡΠ° ΠΈ Π΄ΡΡ
ΠΎΠ²Π½ΠΈΡΠ΅ ΠΏΡΠ°ΠΊΡΠΈΠΊΠΈ Π΄ΠΎΠ±Π°Π²ΡΠΌΠ΅ ΠΏΠΎ ΠΆΠ΅Π»Π°Π½ΠΈΠ΅ π
0. ΠΠ°ΠΊΠ°ΡΠ°ΠΉΡΠ΅ ΡΠ΅Π΄Π°ΠΊΡΠΎΡΠ° ΡΠΈ Π΄Π° ΡΠ°Π±ΠΎΡΠΈ
ΠΠ΅Π·Π°Π²ΠΈΡΠΈΠΌΠΎ ΠΊΠ°ΠΊΡΠ² ΡΠ΅ΠΊΡΡΠΎΠ² ΡΠ΅Π΄Π°ΠΊΡΠΎΡ ΠΈΠΌΠ°ΡΠ΅, Π·Π° Π½Π΅Π³ΠΎ ΡΡΡ ΡΠΈΠ³ΡΡΠ½ΠΎΡΡ ΡΡΡΠ΅ΡΡΠ²ΡΠ²Π° ΠΏΠΎΠ½Π΅ Π΅Π΄ΠΈΠ½ ΠΏΠ»ΡΠ³ΠΈΠ½ Π·Π° ΡΠ°Π±ΠΎΡΠ° Ρ YAML. ΠΠΊΠΎ Π½ΡΠΌΠ°ΡΠ΅ ΡΠ°ΠΊΡΠ², Π½Π΅Π·Π°Π±Π°Π²Π½ΠΎ Π³ΠΎ Π½Π°ΠΌΠ΅ΡΠ΅ΡΠ΅ ΠΈ ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°ΠΉΡΠ΅. ΠΡΠ΅ΠΌΠ΅ΡΠΎ, ΠΏΡΠ΅ΠΊΠ°ΡΠ°Π½ΠΎ Π² ΡΡΡΡΠ΅Π½Π΅ ΠΈ Π½Π°ΡΡΡΠΎΠΉΠΊΠ°, ΡΠ΅ ΡΠ΅ Π²ΡΠ·Π²ΡΡΠ½Π΅ ΠΌΠ½ΠΎΠ³ΠΎΠΊΡΠ°ΡΠ½ΠΎ Π²ΡΠ΅ΠΊΠΈ ΠΏΡΡ, ΠΊΠΎΠ³Π°ΡΠΎ ΡΡΡΠ±Π²Π° Π΄Π° ΡΠ΅Π΄Π°ΠΊΡΠΈΡΠ°ΡΠ΅ YAML.
ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, ΡΠ΅Π΄Π°ΠΊΡΠΎΡΡΡ ΠΏΠΎΠ΄Π΄ΡΡΠΆΠ° YAML ΠΏΠΎ ΠΏΠΎΠ΄ΡΠ°Π·Π±ΠΈΡΠ°Π½Π΅, Π° Π·Π° GNU Emacs ΡΡΡΠ±Π²Π° Π΄Π° ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°ΡΠ΅ Π΄ΠΎΠΏΡΠ»Π½ΠΈΡΠ΅Π»Π½ΠΈ ΠΏΠ°ΠΊΠ΅ΡΠΈ, ΠΊΠ°ΡΠΎ Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, .

Emacs Π² ΡΠ΅ΠΆΠΈΠΌ YAML ΠΈ ΠΏΠΎΠΊΠ°Π·Π²Π°Π½Π΅ Π½Π° ΠΎΡΡΡΡΠΏΠΈ.
ΠΠΊΠΎ Π² Π»ΡΠ±ΠΈΠΌΠΈΡ Π²ΠΈ ΡΠ΅Π΄Π°ΠΊΡΠΎΡ Π½ΡΠΌΠ° ΡΠ΅ΠΆΠΈΠΌ YAML, ΡΠ°ΡΡ ΠΎΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠΈΡΠ΅ ΠΌΠΎΠ³Π°Ρ Π΄Π° Π±ΡΠ΄Π°Ρ ΡΠ΅ΡΠ΅Π½ΠΈ, ΠΊΠ°ΡΠΎ ΡΠ°Π±ΠΎΡΠΈΡΠ΅ Ρ Π½Π°ΡΡΡΠΎΠΉΠΊΠΈΡΠ΅. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΠΈΡΡ ΡΠ΅ΠΊΡΡΠΎΠ² ΡΠ΅Π΄Π°ΠΊΡΠΎΡ Gedit Π·Π° GNOME Π½ΡΠΌΠ° ΡΠ΅ΠΆΠΈΠΌ YAML, Π½ΠΎ ΠΏΠΎ ΠΏΠΎΠ΄ΡΠ°Π·Π±ΠΈΡΠ°Π½Π΅ ΠΎΡΠ²Π΅ΡΡΠ²Π° ΡΠΈΠ½ΡΠ°ΠΊΡΠΈΡΠ° Π½Π° YAML ΠΈ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ²Π° Π½Π°ΡΡΡΠΎΠΉΠΊΠ° Π½Π° ΡΠ°Π±ΠΎΡΠ°ΡΠ° Ρ ΠΎΡΡΡΡΠΏΠΈΡΠ΅:

ΠΠ°ΡΡΡΠΎΠΉΠΊΠ° Π½Π° ΠΎΡΡΡΡΠΏΠΈΡΠ΅ Π² Gedit.
Π ΠΏΠ»ΡΠ³ΠΈΠ½ΡΡ Π·Π° Gedit ΠΏΠΎΠΊΠ°Π·Π²Π° ΠΎΡΡΡΡΠΏΠΈΡΠ΅ ΠΊΠ°ΡΠΎ ΡΠΎΡΠΊΠΈ, ΠΏΡΠ΅ΠΌΠ°Ρ Π²Π°ΠΉΠΊΠΈ Π½Π΅ΡΡΠ½ΠΎΡΠΈΡΠ΅ Ρ Π½ΠΈΠ²Π°ΡΠ° Π½Π° ΠΎΡΡΡΡΠΏ.
Π‘ Π΄ΡΡΠ³ΠΈ Π΄ΡΠΌΠΈ, ΠΎΡΠ΄Π΅Π»Π΅ΡΠ΅ Π²ΡΠ΅ΠΌΠ΅ Π΄Π° ΠΈΠ·ΡΡΠΈΡΠ΅ Π»ΡΠ±ΠΈΠΌΠΈΡ ΡΠΈ ΡΠ΅Π΄Π°ΠΊΡΠΎΡ. Π Π°Π·Π±Π΅ΡΠ΅ΡΠ΅ ΠΊΠ°ΠΊΠ²ΠΎ ΠΏΡΠ΅Π΄Π»Π°Π³Π° ΡΠΎΠΉ ΠΈΠ»ΠΈ Π½Π΅Π³ΠΎΠ²Π°ΡΠ° ΡΠ°Π·ΡΠ°Π±ΠΎΡΠ²Π°ΡΠ° ΠΎΠ±ΡΠ½ΠΎΡΡ Π·Π° ΡΠ°Π±ΠΎΡΠ° Ρ YAML, ΠΈ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΉΡΠ΅ ΡΠ΅Π·ΠΈ Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ. Π‘ΠΈΠ³ΡΡΠ½ΠΎ Π½ΡΠΌΠ° Π΄Π° ΡΡΠΆΠ°Π»ΡΠ²Π°ΡΠ΅ Π·Π° ΡΠΎΠ²Π°.
1. ΠΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΉΡΠ΅ Π»ΠΈΠ½ΡΠ΅Ρ (linter)
Π ΠΈΠ΄Π΅Π°Π»Π½ΠΈΡ ΡΠ»ΡΡΠ°ΠΉ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠ½ΠΈΡΠ΅ Π΅Π·ΠΈΡΠΈ ΠΈ Π΅Π·ΠΈΡΠΈΡΠ΅ Π·Π° ΠΌΠ°ΡΠΊΠΈΡΠ°Π½Π΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ ΠΏΡΠ΅Π΄ΡΠΊΠ°Π·ΡΠ΅ΠΌ ΡΠΈΠ½ΡΠ°ΠΊΡΠΈΡ. ΠΠΎΠΌΠΏΡΡΡΠΈΡΠ΅ Π΄ΠΎΠ±ΡΠ΅ ΡΠ΅ ΡΠΏΡΠ°Π²ΡΡ Ρ ΠΏΡΠ΅Π΄ΡΠΊΠ°Π·ΡΠ΅ΠΌΠΎΡΡΡΠ°, Π·Π°ΡΠΎΠ²Π° ΠΊΠΎΠ½ΡΠ΅ΠΏΡΠΈΡΡΠ° Π·Π° Π²ΡΠ·Π½ΠΈΠΊΠ½Π° ΠΎΡΠ΅ ΠΏΡΠ΅Π· 1978 Π³ΠΎΠ΄ΠΈΠ½Π°. ΠΠΊΠΎ ΠΏΡΠ΅Π· ΡΠ΅Π·ΠΈ 40 Π³ΠΎΠ΄ΠΈΠ½ΠΈ ΡΡ Π΅ ΠΌΠΈΠ½Π°Π»Π° ΠΏΠΎΠΊΡΠ°ΠΉ Π²Π°Ρ ΠΈ Π²ΡΠ΅ ΠΎΡΠ΅ Π½Π΅ ΠΏΠΎΠ»Π·Π²Π°ΡΠ΅ YAML Π»ΠΈΠ½ΡΠ΅Ρ, ΡΠ΅Π³Π° Π΅ ΠΌΠΎΠΌΠ΅Π½ΡΡΡ Π΄Π° ΠΎΠΏΠΈΡΠ°ΡΠ΅ yamllint.
ΠΠ½ΡΡΠ°Π»ΠΈΡΠ°ΠΉΡΠ΅ ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ Π½Π°ΠΏΡΠ°Π²ΠΈ Ρ ΠΏΠΎΠΌΠΎΡΡΠ° Π½Π° ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΠΈΡ ΠΏΠ°ΠΊΠ΅ΡΠ΅Π½ ΠΌΠ΅Π½ΠΈΠ΄ΠΆΡΡ Π½Π° Linux. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, Π² 8 ΠΈΠ»ΠΈ ΡΠΎΠ²Π° ΡΠ΅ ΠΏΡΠ°Π²ΠΈ ΡΠ°ΠΊΠ°:
$ sudo dnf install yamllint
Π‘Π»Π΅Π΄ ΡΠΎΠ²Π° ΠΏΡΠΎΡΡΠΎ ΡΡΠ°ΡΡΠΈΡΠ°ΡΠ΅ yamllint, ΠΊΠ°ΡΠΎ ΠΌΡ ΠΏΡΠ΅Π΄Π°Π΄Π΅ΡΠ΅ YAML ΡΠ°ΠΉΠ» Π·Π° ΠΏΡΠΎΠ²Π΅ΡΠΊΠ°. ΠΡΠΎ ΠΊΠ°ΠΊ ΠΈΠ·Π³Π»Π΅ΠΆΠ΄Π°, Π°ΠΊΠΎ ΠΏΡΠ΅Π΄Π°Π΄Π΅ΡΠ΅ Π»ΠΈΠ½ΡΠ΅ΡΠ° ΡΠ°ΠΉΠ» Ρ Π³ΡΠ΅ΡΠΊΠ°:
$ yamllint errorprone.yaml
errorprone.yaml
23:10 Π³ΡΠ΅ΡΠΊΠ° ΡΠΈΠ½ΡΠ°ΠΊΡΠΈΡΠ½Π° Π³ΡΠ΅ΡΠΊΠ°: ΠΌΠ°ΠΏΠΈΠ½Π³ ΡΡΠΎΠΉΠ½ΠΎΡΡΠΈ Π½Π΅ Π΅ ΡΠ°Π·ΡΠ΅ΡΠ΅Π½ ΡΡΠΊ
23:11 Π³ΡΠ΅ΡΠΊΠ° Π·Π°Π΄Π½ΠΈ ΠΏΡΠΎΡΡΡΠ°Π½ΡΡΠ²Π° (trailing-spaces)
Π§ΠΈΡΠ»Π°ΡΠ° ΠΎΡΠ»ΡΠ²ΠΎ Π½Π΅ ΡΠ° Π²ΡΠ΅ΠΌΠ΅ΡΠΎ, Π° ΠΊΠΎΠΎΡΠ΄ΠΈΠ½Π°ΡΠΈΡΠ΅ Π½Π° Π³ΡΠ΅ΡΠΊΠ°ΡΠ°: Π½ΠΎΠΌΠ΅Ρ Π½Π° ΡΠ΅Π΄Π° ΠΈ ΠΊΠΎΠ»ΠΎΠ½Π°. ΠΠΏΠΈΡΠ°Π½ΠΈΠ΅ΡΠΎ Π½Π° Π³ΡΠ΅ΡΠΊΠ°ΡΠ° ΠΌΠΎΠΆΠ΅ Π΄Π° Π½Π΅ Π²ΠΈ Π³ΠΎΠ²ΠΎΡΠΈ Π½ΠΈΡΠΎ, Π½ΠΎ Π²ΠΈΠ΅ ΡΠΎΡΠ½ΠΎ Π·Π½Π°Π΅ΡΠ΅ ΠΊΡΠ΄Π΅ ΡΠ΅ Π½Π°ΠΌΠΈΡΠ°. ΠΡΠΎΡΡΠΎ ΠΏΠΎΠ³Π»Π΅Π΄Π½Π΅ΡΠ΅ Π½Π° ΡΠΎΠ²Π° ΠΌΡΡΡΠΎ Π² ΠΊΠΎΠ΄Π° ΠΈ Π²Π΅ΡΠΎΡΡΠ½ΠΎ Π²ΡΠΈΡΠΊΠΎ ΡΠ΅ ΡΡΠ°Π½Π΅ ΡΡΠ½ΠΎ.
ΠΠΎΠ³Π°ΡΠΎ yamllint Π½Π΅ Π½Π°ΠΌΠ΅ΡΠΈ Π³ΡΠ΅ΡΠΊΠΈ Π² ΡΠ°ΠΉΠ»Π°, Π½Π΅ ΡΠ΅ ΠΈΠ·Π²Π΅ΠΆΠ΄Π° Π½ΠΈΡΠΎ Π½Π° Π΅ΠΊΡΠ°Π½Π°. ΠΠΊΠΎ ΡΠΎΠ²Π° ΠΌΡΠ»ΡΠ°Π½ΠΈΠ΅ Π²ΠΈ ΠΏΠ»Π°ΡΠΈ ΠΈ ΠΈΡΠΊΠ°ΡΠ΅ ΠΌΠ°Π»ΠΊΠΎ ΠΏΠΎΠ²Π΅ΡΠ΅ ΠΎΠ±ΡΠ°ΡΠ½Π° Π²ΡΡΠ·ΠΊΠ°, ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΡΡΠ°ΡΡΠΈΡΠ°ΡΠ΅ Π»ΠΈΠ½ΡΠ΅ΡΠ° Ρ ΡΡΠ»ΠΎΠ²Π½Π° ΠΊΠΎΠΌΠ°Π½Π΄Π° echo, ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΉΠΊΠΈ Π΄Π²ΠΎΠΉΠ½ΠΈ Π°ΠΌΠΏΠ΅ΡΡΠ°Π½Π΄ (&&), ΠΏΠΎ ΡΠ»Π΅Π΄Π½ΠΈΡ Π½Π°ΡΠΈΠ½:
$ yamllint perfect.yaml && echo "OK"
OK
Π POSIX Π΄Π²ΠΎΠΉΠ½ΠΈΡΡ Π°ΠΌΠΏΠ΅ΡΡΠ°Π½Π΄ ΡΡΠ°Π±ΠΎΡΠ²Π° ΡΠΎΠ³Π°Π²Π° ΠΈ ΡΠ°ΠΌΠΎ ΡΠΎΠ³Π°Π²Π°, ΠΊΠΎΠ³Π°ΡΠΎ ΠΏΡΠ΅Π΄ΡΠ΅ΡΡΠ²ΡΠ²Π°ΡΠ°ΡΠ° ΠΊΠΎΠΌΠ°Π½Π΄Π° Π²ΡΡΡΠ° 0. Π yamllint ΡΠΎΡΠ½ΠΎ Π²ΡΡΡΠ° Π±ΡΠΎΡ Π½Π° Π½Π°ΠΌΠ΅ΡΠ΅Π½ΠΈΡΠ΅ Π³ΡΠ΅ΡΠΊΠΈ, Π·Π°ΡΠΎΠ²Π° ΡΡΠ»Π°ΡΠ° ΡΠ°Π·ΠΈ ΡΡΠ»ΠΎΠ²Π½Π° ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΈΡ ΡΠ°Π±ΠΎΡΠΈ.
2. ΠΠΈΡΠ΅ΡΠ΅ Π½Π° Python, Π° Π½Π΅ Π½Π° YAML
ΠΠΊΠΎ Π½Π°ΠΈΡΡΠΈΠ½Π° Π²ΠΈ Π΄ΡΠ°Π·Π½ΠΈ YAML, ΠΏΡΠΎΡΡΠΎ Π½Π΅ ΠΏΠΈΡΠ΅ΡΠ΅ Π½Π° Π½Π΅Π³ΠΎ, Π² Π±ΡΠΊΠ²Π°Π»Π½ΠΈΡ ΡΠΌΠΈΡΡΠ». ΠΠΎΠ½ΡΠΊΠΎΠ³Π° YAML Π΅ Π΅Π΄ΠΈΠ½ΡΡΠ²Π΅Π½ΠΈΡΡ ΡΠΎΡΠΌΠ°Ρ, ΠΊΠΎΠΉΡΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ ΠΏΡΠΈΠ΅ΠΌΠ°. ΠΠΎ Π΄ΠΎΡΠΈ ΠΈ ΡΠΎΠ³Π°Π²Π° Π½Π΅ Π΅ Π·Π°Π΄ΡΠ»ΠΆΠΈΡΠ΅Π»Π½ΠΎ Π΄Π° ΡΡΠ·Π΄Π°Π²Π°ΡΠ΅ YAML ΡΠ°ΠΉΠ». ΠΠΈΡΠ΅ΡΠ΅ Π½Π° ΡΠΎΠ²Π°, ΠΊΠΎΠ΅ΡΠΎ Π²ΠΈ Ρ Π°ΡΠ΅ΡΠ²Π°, Π° ΡΠ»Π΅Π΄ ΡΠΎΠ²Π° ΠΊΠΎΠ½Π²Π΅ΡΡΠΈΡΠ°ΠΉΡΠ΅. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, Π·Π° Python ΠΈΠΌΠ° ΡΡΡΠ°Ρ ΠΎΡΠ½Π° Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ° ΠΈ ΡΠ΅Π»ΠΈ Π΄Π²Π° Π½Π°ΡΠΈΠ½Π° Π·Π° ΠΊΠΎΠ½Π²Π΅ΡΡΠΈΡΠ°Π½Π΅: ΡΠ°ΠΌΠΎΠΊΠΎΠ½Π²Π΅ΡΡΠΈΡΠ°Π½Π΅ ΠΈ ΠΊΠΎΠ½Π²Π΅ΡΡΠΈΡΠ°Π½Π΅ ΡΡΠ΅Π· ΡΠΊΡΠΈΠΏΡΠΎΠ²Π΅.
Π‘Π°ΠΌΠΎΠΊΠΎΠ½Π²Π΅ΡΡΠΈΡΠ°Π½Π΅
Π ΡΠΎΠ·ΠΈ ΡΠ»ΡΡΠ°ΠΉ ΡΠ°ΠΉΠ»ΡΡ ΡΡΡ Π΄Π°Π½Π½ΠΈ Π΅ ΡΡΡΠΎ ΠΈ Python ΡΠΊΡΠΈΠΏΡ, ΠΊΠΎΠΉΡΠΎ Π³Π΅Π½Π΅ΡΠΈΡΠ° YAML. Π’ΠΎΠ·ΠΈ ΠΌΠ΅ΡΠΎΠ΄ Π΅ Π½Π°ΠΉ-ΠΏΠΎΠ΄Ρ ΠΎΠ΄ΡΡ Π·Π° ΠΌΠ°Π»ΠΊΠΈ Π½Π°Π±ΠΎΡΠΈ ΠΎΡ Π΄Π°Π½Π½ΠΈ. ΠΡΠΎΡΡΠΎ ΠΏΠΈΡΠ΅ΡΠ΅ JSON Π΄Π°Π½Π½ΠΈ Π² Python ΠΏΡΠΎΠΌΠ΅Π½Π»ΠΈΠ²Π°, ΠΏΡΠ΅Π΄ΡΠ΅ΡΡΠ²Π°Π½ΠΎ ΠΎΡ Π΄ΠΈΡΠ΅ΠΊΡΠΈΠ²Π°ΡΠ° import, Π° Π² ΠΊΡΠ°Ρ Π½Π° ΡΠ°ΠΉΠ»Π° Π΄ΠΎΠ±Π°Π²ΡΡΠ΅ ΡΡΠΈ ΡΠ΅Π΄Π° Π·Π° ΠΈΠ·ΠΏΡΠ»Π½Π΅Π½ΠΈΠ΅ Π½Π° ΠΈΠ·Π²ΠΎΠ΄Π°.
#!/usr/bin/python3
import yaml
d={
"glossary": {
"title": "example glossary",
"GlossDiv": {
"title": "S",
"GlossList": {
"GlossEntry": {
"ID": "SGML",
"SortAs": "SGML",
"GlossTerm": "Standard Generalized Markup Language",
"Acronym": "SGML",
"Abbrev": "ISO 8879:1986",
"GlossDef": {
"para": "A meta-markup language, used to create markup languages such as DocBook.",
"GlossSeeAlso": ["GML", "XML"]
},
"GlossSee": "markup"
}
}
}
}
}
f=open('output.yaml','w')
f.write(yaml.dump(d))
f.close
Π‘Π΅Π³Π° ΡΡΠ°ΡΡΠΈΡΠ°ΠΌΠ΅ ΡΠ°ΠΉΠ»Π° Π½Π° Python ΠΈ ΠΏΠΎΠ»ΡΡΠ°Π²Π°ΠΌΠ΅ ΡΠ°ΠΉΠ» output.yaml:
$ python3 .\/example.json
$ cat output.yaml
glossary:
GlossDiv:
GlossList:
GlossEntry:
Abbrev: ISO 8879:1986
Acronym: SGML
GlossDef:
GlossSeeAlso: [GML, XML]
para: A meta-markup language, used to create markup languages such as DocBook.
GlossSee: markup
GlossTerm: Standard Generalized Markup Language
ID: SGML
SortAs: SGML
title: S
title: example glossary
Π’ΠΎΠ²Π° Π΅ Π°Π±ΡΠΎΠ»ΡΡΠ½ΠΎ ΠΊΠΎΡΠ΅ΠΊΡΠ΅Π½ YAML, Π½ΠΎ yamllint ΡΠ΅ ΠΈΠ·Π΄Π°Π΄Π΅ ΠΏΡΠ΅Π΄ΡΠΏΡΠ΅ΠΆΠ΄Π΅Π½ΠΈΠ΅, ΡΠ΅ Π½Π΅ Π·Π°ΠΏΠΎΡΠ²Π° Ρ β. Π, ΡΠΎΠ²Π° ΠΌΠΎΠΆΠ΅ Π»Π΅ΡΠ½ΠΎ Π΄Π° ΡΠ΅ ΠΏΠΎΠΏΡΠ°Π²ΠΈ ΡΡΡΠ½ΠΎ ΠΈΠ»ΠΈ Π»Π΅ΠΊΠΎ Π΄Π° ΡΠ΅ Π΄ΠΎΡΠ°Π±ΠΎΡΠΈ Python ΡΠΊΡΠΈΠΏΡ.
ΠΠΎΠ½Π²Π΅ΡΡΠΈΡΠ°Π½Π΅ ΡΡΠ΅Π· ΡΠΊΡΠΈΠΏΡΠΎΠ²Π΅
Π ΡΠ°ΠΊΡΠ² ΡΠ»ΡΡΠ°ΠΉ ΠΏΡΡΠ²ΠΎ ΠΏΠΈΡΠ΅ΠΌ Π½Π° JSON, Π° ΡΠ»Π΅Π΄ ΡΠΎΠ²Π° ΡΡΠ°ΡΡΠΈΡΠ°ΠΌΠ΅ ΠΊΠΎΠ½Π²Π΅ΡΡΠΎΡΠ° ΠΊΠ°ΡΠΎ ΠΎΡΠ΄Π΅Π»Π΅Π½ Python ΡΠΊΡΠΈΠΏΡ, ΠΊΠΎΠΉΡΠΎ ΠΈΠ·Π²Π΅ΠΆΠ΄Π° YAML. Π ΡΡΠ°Π²Π½Π΅Π½ΠΈΠ΅ Ρ ΠΏΡΠ΅Π΄ΠΈΡΠ½ΠΈΡ, ΡΠΎΠ·ΠΈ ΠΌΠ΅ΡΠΎΠ΄ Π΅ ΠΏΠΎ-ΠΌΠ°ΡΡΡΠ°Π±ΠΈΡΡΠ΅ΠΌ, ΡΡΠΉ ΠΊΠ°ΡΠΎ ΠΊΠΎΠ½Π²Π΅ΡΡΠΈΡΠ°Π½Π΅ΡΠΎ Π΅ ΠΎΡΠ΄Π΅Π»Π΅Π½ΠΎ ΠΎΡ Π΄Π°Π½Π½ΠΈΡΠ΅.
ΠΠ΅ΠΊΠ° ΠΏΡΡΠ²ΠΎ ΡΡΠ·Π΄Π°Π΄Π΅ΠΌ JSON ΡΠ°ΠΉΠ» example.json. ΠΠΎΠΆΠ΅ Π΄Π° Π³ΠΎ Π²Π·Π΅ΠΌΠ΅ΠΌ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, ΠΎΡ :
{
"glossary": {
"title": "ΠΏΡΠΈΠΌΠ΅ΡΠ΅Π½ Π³Π»ΠΎΡΠ°Ρ",
"GlossDiv": {
"title": "S",
"GlossList": {
"GlossEntry": {
"ID": "SGML",
"SortAs": "SGML",
"GlossTerm": "Π‘ΡΠ°Π½Π΄Π°ΡΡΠ΅Π½ Π³Π΅Π½Π΅ΡΠ°Π»ΠΈΠ·ΠΈΡΠ°Π½ Π·Π½Π°ΠΊ Π·Π° ΠΌΠ°ΡΠΊΠΈΡΠ°Π½Π΅",
"Acronym": "SGML",
"Abbrev": "ISO 8879:1986",
"GlossDef": {
"para": "ΠΠ΅ΡΠ°Π·Π½Π°ΠΊΠΎΠ²Π° Π΅Π·ΠΈΠΊ, ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π° Π·Π° ΡΡΠ·Π΄Π°Π²Π°Π½Π΅ Π½Π° ΠΌΠ°ΡΠΊΠΈΡΠ°Π½ΠΈ Π΅Π·ΠΈΡΠΈ ΠΊΠ°ΡΠΎ DocBook.",
"GlossSeeAlso": ["GML", "XML"]
},
"GlossSee": "ΠΌΠ°ΡΠΊΠΈΡΠ°Π½Π΅"
}
}
}
}
}
Π‘Π»Π΅Π΄ ΡΠΎΠ²Π° ΡΠ΅ ΡΡΠ·Π΄Π°Π΄Π΅ΠΌ ΠΏΡΠΎΡΡ ΠΊΠΎΠ½Π²Π΅ΡΡΠΎΡΡΠΊΠΈ ΡΠΊΡΠΈΠΏΡ ΠΈ ΡΠ΅ Π³ΠΎ Π·Π°ΠΏΠ°Π·ΠΈΠΌ ΠΏΠΎΠ΄ ΠΈΠΌΠ΅ΡΠΎ json2yaml.py. Π’ΠΎΠ·ΠΈ ΡΠΊΡΠΈΠΏΡ ΠΈΠΌΠΏΠΎΡΡΠΈΡΠ° ΠΈ Π΄Π²Π°ΡΠ° ΠΌΠΎΠ΄ΡΠ»Π° β YAML ΠΈ JSON Python, Π° ΡΡΡΠΎ ΡΠ°ΠΊΠ° Π·Π°ΡΠ΅ΠΆΠ΄Π° ΡΠΊΠ°Π·Π°Π½ΠΈΡ ΠΎΡ ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»Ρ JSON ΡΠ°ΠΉΠ», ΠΈΠ·Π²ΡΡΡΠ²Π° ΠΊΠΎΠ½Π²Π΅ΡΡΠΈΡΠ°Π½Π΅ ΠΈ Π·Π°ΠΏΠΈΡΠ²Π° Π΄Π°Π½Π½ΠΈΡΠ΅ Π² output.yaml.
#!/usr/bin/python3
import yaml
import sys
import json
OUT=open('output.yaml','w')
IN=open(sys.argv[1], 'r')
JSON = json.load(IN)
IN.close()
yaml.dump(JSON, OUT)
OUT.close()
ΠΠ°ΠΏΠ°Π·Π΅ΡΠ΅ ΡΠΎΠ·ΠΈ ΡΠΊΡΠΈΠΏΡ Π² ΡΠΈΡΡΠ΅ΠΌΠ½ΠΈΡ ΠΏΡΡ ΠΈ Π³ΠΎ ΠΈΠ·ΠΏΡΠ»Π½ΡΠ²Π°ΠΉΡΠ΅ ΠΏΡΠΈ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎΡΡ:
$ ~/bin/json2yaml.py example.json
3. ΠΠ°ΡΡΠ²Π°ΠΉΡΠ΅ ΡΠ΅ΡΡΠΎ ΠΈ ΠΌΠ½ΠΎΠ³ΠΎ
ΠΠΎΠ½ΡΠΊΠΎΠ³Π° Π΅ ΠΏΠΎΠ»Π΅Π·Π½ΠΎ Π΄Π° ΡΠ΅ ΠΏΠΎΠ³Π»Π΅Π΄Π½Π΅ Π½Π° ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ° ΠΎΡ Π΄ΡΡΠ³Π° ΠΏΠ΅ΡΡΠΏΠ΅ΠΊΡΠΈΠ²Π°. ΠΠΊΠΎ Π²ΠΈ Π΅ ΡΡΡΠ΄Π½ΠΎ Π΄Π° ΡΠΈ ΠΏΡΠ΅Π΄ΡΡΠ°Π²ΠΈΡΠ΅ Π²ΡΡΠ·ΠΊΠΈΡΠ΅ ΠΌΠ΅ΠΆΠ΄Ρ Π΄Π°Π½Π½ΠΈΡΠ΅ Π² YAML, ΠΌΠΎΠΆΠ΅ΡΠ΅ Π²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎ Π΄Π° Π³ΠΈ ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΡΠ²Π°ΡΠ΅ Π² Π½Π΅ΡΠΎ ΠΏΠΎ-ΠΏΠΎΠ·Π½Π°ΡΠΎ.
ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, Π°ΠΊΠΎ ΠΏΡΠ΅Π΄ΠΏΠΎΡΠΈΡΠ°ΡΠ΅ Π΄Π° ΡΠ°Π±ΠΎΡΠΈΡΠ΅ ΡΡΡ ΡΠΏΠΈΡΡΡΠΈ ΠΎΡ Π΄ΡΠΌΠΈ ΠΈΠ»ΠΈ Ρ JSON, YAML ΠΌΠΎΠΆΠ΅ Π΄Π° Π±ΡΠ΄Π΅ ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΡΠ²Π°Π½ Π² JSON ΡΠ°ΠΌΠΎ Ρ Π΄Π²Π΅ ΠΊΠΎΠΌΠ°Π½Π΄ΠΈ Π² ΠΈΠ½ΡΠ΅ΡΠ°ΠΊΡΠΈΠ²Π½Π°ΡΠ° ΡΡΠ΅Π΄Π° Π½Π° Python. ΠΠ° ΠΊΠ°ΠΆΠ΅ΠΌ, ΡΠ΅ ΠΈΠΌΠ°ΡΠ΅ YAML ΡΠ°ΠΉΠ» mydata.yaml, Π΅ΡΠΎ ΠΊΠ°ΠΊ ΡΠ΅ ΠΈΠ·Π³Π»Π΅ΠΆΠ΄Π°:
$ python3
>>> f=open('mydata.yaml','r')
>>> yaml.load(f)
{'document': 34843, 'date': datetime.date(2019, 5, 23), 'bill-to': {'given': 'Seth', 'family': 'Kenlon', 'address': {'street': '51b Mornington Roadn', 'city': 'Brooklyn', 'state': 'Wellington', 'postal': 6021, 'country': 'NZ'}}, 'words': 938, 'comments': 'ΠΠΎΠ±ΡΠ° ΡΡΠ°ΡΠΈΡ. ΠΠΎΠΆΠ΅ Π΄Π° Π±ΡΠ΄Π΅ ΠΏΠΎ-Π΄ΠΎΠ±ΡΠ°.'}
ΠΠΎΠΆΠ΅ΡΠ΅ Π΄Π° Π½Π°ΠΌΠ΅ΡΠΈΡΠ΅ ΠΌΠ½ΠΎΠ³ΠΎ Π΄ΡΡΠ³ΠΈ ΠΏΡΠΈΠΌΠ΅ΡΠΈ ΠΏΠΎ ΡΠ°Π·ΠΈ ΡΠ΅ΠΌΠ°. ΠΡΠ²Π΅Π½ ΡΠΎΠ²Π°, ΡΡΡΠ΅ΡΡΠ²ΡΠ²Π°Ρ ΠΌΠ½ΠΎΠ³ΠΎ ΠΎΠ½Π»Π°ΠΉΠ½ ΠΊΠΎΠ½Π²Π΅ΡΡΠΎΡΠΈ ΠΈ Π»ΠΎΠΊΠ°Π»Π½ΠΈ ΠΏΠ°ΡΡΠ΅ΡΠΈ. ΠΠ΅ ΡΠ΅ ΠΊΠΎΠ»Π΅Π±Π°ΠΉΡΠ΅ Π΄Π° ΠΏΡΠ΅ΡΠΎΡΠΌΠ°ΡΠΈΡΠ°ΡΠ΅ Π΄Π°Π½Π½ΠΈΡΠ΅, ΠΊΠΎΠ³Π°ΡΠΎ Π²ΠΈΠΆΠ΄Π°ΡΠ΅ Π² ΡΡΡ ΡΠ°ΠΌΠΎ Π½Π΅ΡΠ°Π·Π±ΠΎΡΠΈΡ.
4. Π§Π΅ΡΠ΅ΡΠ΅ ΡΠΏΠ΅ΠΊΠΈΡΠ΅
ΠΡΡΡΠ°ΠΉΠΊΠΈ ΡΠ΅ ΠΊΡΠΌ YAML ΡΠ»Π΅Π΄ Π΄ΡΠ»Π³Π° ΠΏΠ°ΡΠ·Π°, ΠΏΠΎΠ»Π΅Π·Π½ΠΎ Π΅ Π΄Π° ΠΏΠΎΡΠ΅ΡΠΈΡΠ΅ ΠΈ Π΄Π° ΠΏΡΠ΅Π³Π»Π΅Π΄Π°ΡΠ΅ ΡΠΏΠ΅ΡΠΈΡΠΈΠΊΠ°ΡΠΈΠΈΡΠ΅. ΠΠΊΠΎ ΠΈΠΌΠ°ΡΠ΅ ΡΡΡΠ΄Π½ΠΎΡΡΠΈ Ρ YAML, Π½ΠΎ Π²ΡΠ΅ ΠΎΡΠ΅ Π½Π΅ ΡΡΠ΅ ΡΠ΅ Π·Π°ΠΏΠΎΠ·Π½Π°Π»ΠΈ ΡΡΡ ΡΠΏΠ΅ΡΠΈΡΠΈΠΊΠ°ΡΠΈΠΈΡΠ΅, Π΅ Π²ΡΠ΅ΠΌΠ΅ Π΄Π° ΠΏΡΠΎΠΌΠ΅Π½ΠΈΡΠ΅ ΡΠΎΠ²Π°. Π‘ΠΏΠ΅ΠΊΠΈΡΠ΅ ΡΠ° ΡΠ΄ΠΈΠ²ΠΈΡΠ΅Π»Π½ΠΎ Π΄ΠΎΠ±ΡΠ΅ Π½Π°ΠΏΠΈΡΠ°Π½ΠΈ, Π° ΠΈΠ·ΠΈΡΠΊΠ²Π°Π½ΠΈΡΡΠ° Π·Π° ΡΠΈΠ½ΡΠ°ΠΊΡΠΈΡ ΡΠ° ΠΈΠ»ΡΡΡΡΠΈΡΠ°Π½ΠΈ Ρ ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²ΠΎ ΠΏΡΠΈΠΌΠ΅ΡΠΈ Π² .
5. ΠΡΠ΅Π²Π΄ΠΎΠΊΠΎΠ½ΡΠΈΠ³urations
ΠΡΠΈ Π½Π°ΠΏΠΈΡΠ²Π°Π½Π΅ΡΠΎ Π½Π° ΠΊΠ½ΠΈΠ³Π° ΠΈΠ»ΠΈ ΡΡΠ°ΡΠΈΡ Π²ΠΈΠ½Π°Π³ΠΈ Π΅ ΠΏΠΎΠ»Π΅Π·Π½ΠΎ ΠΏΡΡΠ²ΠΎ Π΄Π° Π½Π°ΡΠ΅ΡΡΠ°Π΅ΡΠ΅ ΠΏΡΠ΅Π΄Π²Π°ΡΠΈΡΠ΅Π»Π΅Π½ ΠΏΠ»Π°Π½, ΠΏΠΎΠ½Π΅ ΠΏΠΎΠ΄ ΡΠΎΡΠΌΠ°ΡΠ° Π½Π° ΡΡΠ΄ΡΡΠΆΠ°Π½ΠΈΠ΅. Π‘ΡΡΠΎΡΠΎ Π²Π°ΠΆΠΈ ΠΈ Π·Π° YAML. ΠΠ΅ΡΠΎΡΡΠ½ΠΎ ΠΈΠΌΠ°ΡΠ΅ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π° ΠΊΠ°ΠΊΠ²ΠΈ Π΄Π°Π½Π½ΠΈ ΡΡΡΠ±Π²Π° Π΄Π° Π·Π°ΠΏΠΈΡΠ΅ΡΠ΅ Π² YAML ΡΠ°ΠΉΠ»Π°, Π½ΠΎ Π½Π΅ ΡΠ°Π·Π±ΠΈΡΠ°ΡΠ΅ ΠΌΠ½ΠΎΠ³ΠΎ ΠΊΠ°ΠΊ Π΄Π° Π³ΠΈ ΡΠ²ΡΡΠΆΠ΅ΡΠ΅ ΠΏΠΎΠΌΠ΅ΠΆΠ΄Ρ ΡΠΈ. ΠΠ°ΡΠΎΠ²Π° ΠΏΡΠ΅Π΄ΠΈ Π΄Π° Π·Π°ΠΏΠΎΡΠ½Π΅ΡΠ΅ Ρ YAML, Π½Π°ΡΠΈΡΡΠ²Π°ΠΉΡΠ΅ ΠΏΡΠ΅Π²Π΄ΠΎΠΊΠΎΠ½ΡΠΈΠ³.
ΠΡΠ΅Π²Π΄ΠΎΠΊΠΎΠ½ΡΠΈΠ³ΡΡ Π΅ ΠΏΠΎΠ΄ΠΎΠ±Π΅Π½ Π½Π° ΠΏΡΠ΅Π²Π΄ΠΎΠΊΠΎΠ΄, ΠΏΡΠΈ ΠΊΠΎΠΉΡΠΎ Π½Π΅ Π΅ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ Π΄Π° ΡΠ΅ ΠΏΡΠΈΡΠ΅ΡΠ½ΡΠ²Π°ΡΠ΅ Π·Π° ΡΡΡΡΠΊΡΡΡΠ°ΡΠ° ΠΈΠ»ΠΈ ΠΎΡΡΡΡΠΏΠΈΡΠ΅, Π²Π·Π°ΠΈΠΌΠΎΠΎΡΠ½ΠΎΡΠ΅Π½ΠΈΡΡΠ° "ΡΠΎΠ΄ΠΈΡΠ΅Π»-ΠΏΠΎΡΠΎΠΌΡΠΊ", Π½Π°ΡΠ»Π΅Π΄ΡΡΠ²ΠΎΡΠΎ ΠΈ Π²Π»ΠΎΠΆΠ΅Π½ΠΎΡΡΡΠ°. Π’Π°ΠΊΠ° ΡΠ΅ ΠΈ ΡΡΠΊ: ΡΠΈΡΡΠ²Π°ΡΠ΅ ΠΈΡΠ΅ΡΠ°ΡΠΈΠΈ Π½Π° Π΄Π°Π½Π½ΠΈ, Π΄ΠΎΠΊΠ°ΡΠΎ ΡΠ΅ Π²ΡΠ·Π½ΠΈΠΊΠ²Π°Ρ Π²ΡΠ² Π²Π°ΡΠ΅ΡΠΎ ΡΡΠ·Π½Π°Π½ΠΈΠ΅.

ΠΡΠ΅Π²Π΄ΠΎΠΊΠΎΠ½ΡΠΈΠ³ Ρ ΠΈΠ·Π±ΡΠΎΡΠ²Π°Π½Π΅ Π½Π° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΈΡΡΠΈ (Martin ΠΈ Tabitha) ΠΈ ΡΠ΅Ρ Π½ΠΈΡΠ΅ ΡΠΌΠ΅Π½ΠΈΡ (ΠΏΡΠΎΠ³ΡΠ°ΠΌΠ΅Π½ Π΅Π·ΠΈΠΊ: Python, Perl, Pascal ΠΈ Lisp, Fortran, Erlang, ΡΡΠΎΡΠ²Π΅ΡΠ½ΠΎ).
Π‘Π»Π΅Π΄ ΠΊΠ°ΡΠΎ Π½Π°ΡΠΈΡΡΠ²Π°ΡΠ΅ ΠΏΡΠ΅Π²Π΄ΠΎΠΊΠΎΠ½ΡΠΈΠ³ Π½Π° Π»ΠΈΡΡ Ρ Π°ΡΡΠΈΡ, Π²Π½ΠΈΠΌΠ°ΡΠ΅Π»Π½ΠΎ Π³ΠΎ Π°Π½Π°Π»ΠΈΠ·ΠΈΡΠ°ΠΉΡΠ΅ ΠΈ, Π°ΠΊΠΎ Π²ΡΠΈΡΠΊΠΎ Π΅ Π½Π°ΡΠ΅Π΄, Π³ΠΎ ΠΎΡΠΎΡΠΌΠ΅ΡΠ΅ Π² ΡΡΡΠΎΠ³ΠΎ Π²Π°Π»ΠΈΠ΄Π΅Π½ YAML ΡΠ°ΠΉΠ».
6. ΠΠΈΠ»Π΅ΠΌΠ°ΡΠ° "ΡΠ°Π±ΡΠ»ΡΡΠΈΡ ΠΈΠ»ΠΈ ΠΈΠ½ΡΠ΅ΡΠ²Π°Π»ΠΈ"
Π©Π΅ ΡΡΡΠ±Π²Π° Π΄Π° ΡΠ΅ΡΠΈΡΠ΅ Π΄ΠΈΠ»Π΅ΠΌΠ°ΡΠ° . ΠΠ΅ Π² Π³Π»ΠΎΠ±Π°Π»Π΅Π½ ΡΠΌΠΈΡΡΠ», Π° ΡΠ°ΠΌΠΎ Π½Π° Π½ΠΈΠ²ΠΎΡΠΎ Π½Π° Π²Π°ΡΠ°ΡΠ° ΠΎΡΠ³Π°Π½ΠΈΠ·Π°ΡΠΈΡ, ΠΈΠ»ΠΈ ΠΏΠΎΠ½Π΅ Π½Π° ΠΏΡΠΎΠ΅ΠΊΡΠ°. ΠΠ΅ Π΅ Π²Π°ΠΆΠ½ΠΎ Π΄Π°Π»ΠΈ ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΡΠ΅ ΠΏΠΎΡΡ-ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠ° Ρ ΡΠΊΡΠΈΠΏΡΠ° sed, ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠΈΡΠ°Π½Π΅ Π½Π° ΡΠ΅ΠΊΡΡΠΎΠ²ΠΈΡΠ΅ ΡΠ΅Π΄Π°ΠΊΡΠΎΡΠΈ Π½Π° ΠΌΠ°ΡΠΈΠ½ΠΈΡΠ΅ Π½Π° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΈΡΡΠΈΡΠ΅ ΠΈΠ»ΠΈ ΠΏΡΠΊ ΡΠ΅ Π²Π·Π΅ΠΌΠ°ΡΠ΅ ΠΏΠΎΠ΄ΠΏΠΈΡΠΊΠΈ Π·Π° ΡΡΡΠΎΠ³ΠΎ ΡΠΏΠ°Π·Π²Π°Π½Π΅ Π½Π° ΡΠΊΠ°Π·Π°Π½ΠΈΡΡΠ° Π½Π° Π»ΠΈΠ½ΡΠ΅ΡΠ° ΠΏΠΎΠ΄ Π·Π°ΠΏΠ»Π°Ρ Π° ΠΎΡ ΡΠ²ΠΎΠ»Π½Π΅Π½ΠΈΠ΅, Π½ΠΎ Π²ΡΠΈΡΠΊΠΈ ΡΠ»Π΅Π½ΠΎΠ²Π΅ Π½Π° Π²Π°ΡΠΈΡ Π΅ΠΊΠΈΠΏ, ΠΊΠΎΠΈΡΠΎ ΠΏΠΎ Π½ΡΠΊΠ°ΠΊΡΠ² Π½Π°ΡΠΈΠ½ ΡΠ΅ Π·Π°Π½ΠΈΠΌΠ°Π²Π°Ρ Ρ YAML, Π·Π°Π΄ΡΠ»ΠΆΠΈΡΠ΅Π»Π½ΠΎ ΡΡΡΠ±Π²Π° Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ ΡΠ°ΠΌΠΎ ΠΈΠ½ΡΠ΅ΡΠ²Π°Π»ΠΈ (ΠΊΠ°ΠΊΡΠΎ ΠΈΠ·ΠΈΡΠΊΠ²Π° ΡΠΏΠ΅ΡΠΈΡΠΈΠΊΠ°ΡΠΈΡΡΠ° Π½Π° YAML).
ΠΡΠ² Π²ΡΠ΅ΠΊΠΈ Π½ΠΎΡΠΌΠ°Π»Π΅Π½ ΡΠ΅ΠΊΡΡΠΎΠ² ΡΠ΅Π΄Π°ΠΊΡΠΎΡ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° Π½Π°ΡΡΡΠΎΠΈΡΠ΅ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ½ΠΎ Π·Π°ΠΌΠ΅ΡΡΠ²Π°Π½Π΅ Π½Π° ΡΠ°Π±ΡΠ»Π°ΡΠΈΡΡΠ° Ρ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ Π±ΡΠΎΠΉ ΠΈΠ½ΡΠ΅ΡΠ²Π°Π»ΠΈ, Π·Π°ΡΠΎΠ²Π° Π½Π΅ Π΅ Π½ΡΠΆΠ½ΠΎ Π΄Π° ΡΠ΅ ΡΡΡΠ°Ρ ΡΠ²Π°ΡΠ΅ ΠΎΡ Π±ΡΠ½ΡΠ° Π½Π° ΠΏΡΠΈΠ²ΡΡΠΆΠ΅Π½ΠΈΡΠΈΡΠ΅ Π½Π° ΠΊΠ»Π°Π²ΠΈΡΠ° Tab .
ΠΠ°ΠΊΡΠΎ Π²ΡΠ΅ΠΊΠΈ Π½Π΅Π½Π°Π²ΠΈΡΡΠ½ΠΈΠΊ Π½Π° YAML Π·Π½Π°Π΅, Π½Π° Π΅ΠΊΡΠ°Π½Π° Π½Π΅ ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ ΡΠ°Π·Π»ΠΈΡΠΈ ΡΠ°Π·Π»ΠΈΠΊΠ°ΡΠ° ΠΌΠ΅ΠΆΠ΄Ρ ΡΠ°Π±ΡΠ»Π°ΡΠΈΠΈ ΠΈ ΠΈΠ½ΡΠ΅ΡΠ²Π°Π»ΠΈ. Π ΠΊΠΎΠ³Π°ΡΠΎ Π½Π΅ΡΠΎ Π½Π΅ ΡΠ΅ Π²ΠΈΠΆΠ΄Π°, Π·Π° Π½Π΅Π³ΠΎ ΠΎΠ±ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΎ ΡΠ΅ ΡΠ΅ΡΠ°Ρ Π² ΠΏΠΎΡΠ»Π΅Π΄Π½ΠΈΡ ΠΌΠΎΠΌΠ΅Π½Ρ, ΡΠ»Π΅Π΄ ΠΊΠ°ΡΠΎ ΡΠ° ΠΏΡΠΎΠ²Π΅ΡΠΈΠ»ΠΈ ΠΈ ΠΏΡΠ΅ΠΌΠ°Ρ Π½Π°Π»ΠΈ Π²ΡΠΈΡΠΊΠΈ ΠΎΡΡΠ°Π½Π°Π»ΠΈ Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΈ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠΈ. Π§Π°Ρ Π²ΡΠ΅ΠΌΠ΅, ΡΠ±ΠΈΡ Π² ΡΡΡΡΠ΅Π½Π΅ Π½Π° Π½Π΅ΠΏΡΠ°Π²ΠΈΠ»Π½ΠΈ ΡΠ°Π±ΡΠ»Π°ΡΠΈΠΈ ΠΈΠ»ΠΈ Π±Π»ΠΎΠΊΠΎΠ²Π΅ ΠΎΡ ΠΈΠ½ΡΠ΅ΡΠ²Π°Π»ΠΈ, ΠΏΡΠΎΡΡΠΎ Π²ΠΈΠΊΠ° Π·Π° ΡΠΏΠ΅ΡΠ½ΠΎ ΡΡΠ·Π΄Π°Π²Π°Π½Π΅ Π½Π° ΠΏΠΎΠ»ΠΈΡΠΈΠΊΠ° Π·Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ Π½Π° Π΅Π΄Π½ΠΎ ΠΈΠ»ΠΈ Π΄ΡΡΠ³ΠΎ, Π° ΡΠ»Π΅Π΄ ΡΠΎΠ²Π° ΡΠ»Π΅Π΄Π²Π° Π΄Π° ΡΠ΅ ΡΠ΅Π°Π»ΠΈΠ·ΠΈΡΠ° ΡΡΡΠΈΠΊΡΠ΅Π½ ΠΊΠΎΠ½ΡΡΠΎΠ» Π·Π° Π½Π΅ΠΉΠ½ΠΎΡΠΎ ΡΠΏΠ°Π·Π²Π°Π½Π΅ (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, ΡΡΠ΅Π· Git hook Π·Π° ΠΏΡΠΈΠ½ΡΠ΄ΠΈΡΠ΅Π»Π½ΠΎ ΠΏΡΠ΅ΠΌΠΈΠ½Π°Π²Π°Π½Π΅ ΠΏΡΠ΅Π· Π»ΠΈΠ½ΡΠ΅Ρ).
7. ΠΠΎ-Π΄ΠΎΠ±ΡΠ΅ ΠΏΠΎ-ΠΌΠ°Π»ΠΊΠΎ, Π½ΠΎ ΠΏΠΎ-Π΄ΠΎΠ±ΡΠ΅ (ΠΈΠ»ΠΈ ΠΏΠΎΠ²Π΅ΡΠ΅ β ΡΠΎΠ²Π° Π΅ ΠΏΠΎ-ΠΌΠ°Π»ΠΊΠΎ)
ΠΡΠΊΠΎΠΈ Ρ ΠΎΡΠ° ΠΎΠ±ΠΈΡΠ°Ρ Π΄Π° ΠΏΠΈΡΠ°Ρ Π½Π° YAML, Π·Π°ΡΠΎΡΠΎ ΠΏΠΎΠ΄ΡΠ΅ΡΡΠ°Π²Π° ΡΡΡΡΠΊΡΡΡΠ°ΡΠ°. Π’Π΅ Π°ΠΊΡΠΈΠ²Π½ΠΎ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ ΠΎΡΡΡΡΠΏΠΈ, Π·Π° Π΄Π° ΠΎΡΠΊΡΠΎΡΡ Π±Π»ΠΎΠΊΠΎΠ²Π΅ΡΠ΅ Π΄Π°Π½Π½ΠΈ. Π’ΠΎΠ²Π° Π΅ ΡΠΎΡΠΌΠ° Π½Π° ΠΈΠ·ΠΌΠ°ΠΌΠ°, Π·Π° Π΄Π° ΠΈΠΌΠΈΡΠΈΡΠ° Π΅Π·ΠΈΡΠΈΡΠ΅ Π·Π° ΠΌΠ°ΡΠΊΠΈΡΠ°Π½Π΅, Π² ΠΊΠΎΠΈΡΠΎ ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ ΡΠ²Π½ΠΈ ΡΠ°Π·Π΄Π΅Π»ΠΈΡΠ΅Π»ΠΈ.
ΠΡΠΎ ΠΏΡΠΈΠΌΠ΅Ρ Π·Π° ΡΠ°ΠΊΠ°Π²Π° ΡΡΡΡΠΊΡΡΡΠΈΡΠ°Π½ΠΎΡΡ ΠΎΡ :
# Employee records
- martin:
name: Martin D'vloper
job: Developer
skills:
- python
- perl
- pascal
- tabitha:
name: Tabitha Bitumen
job: Developer
skills:
- lisp
- fortran
- erlang
ΠΠ° Π½ΡΠΊΠΎΠ³ΠΎ ΡΠΎΠ·ΠΈ Π²Π°ΡΠΈΠ°Π½Ρ ΠΏΠΎΠΌΠ°Π³Π° Π΄Π° ΠΏΠΎΠ΄ΡΠ΅Π΄ΠΈ ΡΡΡΡΠΊΡΡΡΠ°ΡΠ° Π½Π° YAML Π² Π³Π»Π°Π²Π°ΡΠ° ΡΠΈ, Π° Π½Π° Π΄ΡΡΠ³ΠΈ ΡΠΎΠΉ Π½Π°ΠΏΡΠΎΡΠΈΠ², Π΄ΡΠ°Π·Π½ΠΈ Ρ ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²ΠΎΡΠΎ Π½Π΅Π½ΡΠΆΠ½ΠΈ, ΠΎΡ ΡΡΡ Π½Π° Π³Π»Π΅Π΄Π½Π° ΡΠΎΡΠΊΠ°, ΠΎΡΡΡΡΠΏΠΈ.
ΠΠΎ Π°ΠΊΠΎ Π²ΠΈΠ΅ ΡΡΠ΅ ΡΠΎΠ±ΡΡΠ²Π΅Π½ΠΈΠΊΡΡ Π½Π° YAML Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ° ΠΈ ΠΎΡΠ³ΠΎΠ²Π°ΡΡΡΠ΅ Π·Π° Π½Π΅Π³ΠΎΠ²ΠΎΡΠΎ ΠΏΠΎΠ΄Π΄ΡΡΠΆΠ°Π½Π΅, ΡΠΎ Π²ΠΈΠ΅ ΠΈ ΡΠ°ΠΌΠΎ Π²ΠΈΠ΅ ΡΡΡΠ±Π²Π° Π΄Π° ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΡΠ΅ ΠΊΠ°ΠΊ Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΡΠ΅ ΠΎΡΡΡΡΠΏΠΈΡΠ΅. ΠΠΊΠΎ Π³ΠΎΠ»Π΅ΠΌΠΈΡΠ΅ ΠΎΡΡΡΡΠΏΠΈ Π²ΠΈ Π΄ΡΠ°ΡΡΡ, ΡΠ²Π΅Π΄Π΅ΡΠ΅ Π³ΠΈ Π΄ΠΎ ΠΌΠΈΠ½ΠΈΠΌΡΠΌ, ΠΊΠΎΠΉΡΠΎ Π΅ Π²ΡΠ·ΠΌΠΎΠΆΠ΅Π½ ΡΠΏΠΎΡΠ΅Π΄ ΡΠΏΠ΅ΡΠΈΡΠΈΠΊΠ°ΡΠΈΡΡΠ° Π½Π° YAML. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, Π³ΠΎΡΠ΅ΠΏΠΎΡΠΎΡΠ΅Π½ΠΈΡΡ ΡΠ°ΠΉΠ» ΠΎΡ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΡΡΠ° Π½Π° Ansible ΠΌΠΎΠΆΠ΅ Π΄Π° Π±ΡΠ΄Π΅ ΠΏΡΠ΅Π½Π°ΠΏΠΈΡΠ°Π½ ΡΠ°ΠΊΠ°:
---
- martin:
name: Martin D'vloper
job: Developer
skills:
- python
- perl
- pascal
- tabitha:
name: Tabitha Bitumen
job: Developer
skills:
- lisp
- fortran
- erlang
8. ΠΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΉΡΠ΅ ΡΠ°Π±Π»ΠΎΠ½ΠΈ
ΠΠΊΠΎ ΠΏΡΠΈ ΠΏΠΎΠΏΡΠ»Π²Π°Π½Π΅ Π½Π° YAML ΡΠ°ΠΉΠ»Π° ΠΏΠΎΡΡΠΎΡΠ½Π½ΠΎ ΠΏΠΎΠ²ΡΠ°ΡΡΡΠ΅ Π΅Π΄Π½ΠΈ ΠΈ ΡΡΡΠΈ Π³ΡΠ΅ΡΠΊΠΈ, ΠΈΠΌΠ° ΡΠΌΠΈΡΡΠ» Π΄Π° ΠΏΠΎΡΡΠ°Π²ΠΈΡΠ΅ Π² Π½Π΅Π³ΠΎ ΡΠ°Π±Π»ΠΎΠ½-ΡΠ°Π±Π»ΠΎΠ½ ΠΏΠΎΠ΄ ΡΠΎΡΠΌΠ°ΡΠ° Π½Π° ΠΊΠΎΠΌΠ΅Π½ΡΠ°Ρ. Π’ΠΎΠ³Π°Π²Π° ΡΠ»Π΅Π΄Π²Π°ΡΠΈΡ ΠΏΡΡ ΠΏΡΠΎΡΡΠΎ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΠΊΠΎΠΏΠΈΡΠ°ΡΠ΅ ΡΠΎΠ·ΠΈ ΡΠ°Π±Π»ΠΎΠ½ ΠΈ Π΄Π° Π²ΠΏΠΈΡΠ΅ΡΠ΅ ΡΠ΅Π°Π»Π½ΠΈΡΠ΅ Π΄Π°Π½Π½ΠΈ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ:
---
# - <ΠΎΠ±ΡΠΎ ΠΈΠΌΠ΅>:
# name: ΠΡΠ΅Π²Π΄ΠΎΠ½ΠΈΠΌ
# job: Π ΠΠΠΠ’Π
# skills:
# - ΠΠΠΠ
- martin:
name: Martin D'vloper
job: Developer
skills:
- python
- perl
- pascal
- tabitha:
name: Tabitha Bitumen
job: Developer
skills:
- lisp
- fortran
- erlang
9. ΠΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΉΡΠ΅ Π½Π΅ΡΠΎ Π΄ΡΡΠ³ΠΎ
ΠΠΊΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ Π½Π΅ Π²ΠΈ Π΄ΡΡΠΆΠΈ ΠΌΡΡΡΡΠ² Ρ Π²Π°Ρ, ΠΌΠΎΠΆΠ΅ Π±ΠΈ Π΅ Π²ΡΠ΅ΠΌΠ΅ Π΄Π° ΡΠΌΠ΅Π½ΠΈΡΠ΅ YAML Ρ Π΄ΡΡΠ³ ΡΠΎΡΠΌΠ°Ρ. Π‘ Π²ΡΠ΅ΠΌΠ΅ΡΠΎ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΎΠ½Π½ΠΈΡΠ΅ ΡΠ°ΠΉΠ»ΠΎΠ²Π΅ ΠΌΠΎΠ³Π°Ρ Π΄Π° ΡΠ΅ ΡΠ°Π·ΡΠ°ΡΠ½Π°Ρ ΠΈ ΡΠΎΠ³Π°Π²Π° Π΅ ΠΏΠΎ-Π΄ΠΎΠ±ΡΠ΅ Π΄Π° Π³ΠΈ ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΡΠ²Π°ΡΠ΅ Π² ΠΏΡΠΎΡΡΠΈ ΡΠΊΡΠΈΠΏΡΠΎΠ²Π΅ Π½Π° Lua ΠΈΠ»ΠΈ Python.
YAML Π΅ ΡΡΠ΄Π΅ΡΠ½Π° Π²Π΅Ρ, ΠΊΠΎΡΠΎΡΡΡ ΠΌΠ½ΠΎΠ³ΠΎ Ρ ΠΎΡΠ° ΠΎΠ±ΠΈΡΠ°Ρ Π·Π° ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΠΈΠ·ΠΌΠ° ΠΈ ΠΏΡΠΎΡΡΠΎΡΠ°ΡΠ°, Π½ΠΎ ΡΠΎΠ²Π° Π΄Π°Π»Π΅Ρ Π½Π΅ Π΅ Π΅Π΄ΠΈΠ½ΡΡΠ²Π΅Π½ΠΈΡΡ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½Ρ Π² Π°ΡΡΠ΅Π½Π°Π»Π° Π²ΠΈ. Π’Π°ΠΊΠ° ΡΠ΅ ΠΏΠΎΠ½ΡΠΊΠΎΠ³Π° ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΡΠ΅ ΠΎΡΠΊΠ°ΠΆΠ΅ΡΠ΅ ΠΎΡ Π½Π΅Π³ΠΎ. ΠΠ° YAML Π»Π΅ΡΠ½ΠΎ ΡΠ΅ Π½Π°ΠΌΠΈΡΠ°Ρ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ Π·Π° ΠΏΠ°ΡΡΠΈΠ½Π³, ΡΠ°ΠΊΠ° ΡΠ΅, Π°ΠΊΠΎ ΠΏΡΠ΅Π΄Π»ΠΎΠΆΠΈΡΠ΅ ΡΠ΄ΠΎΠ±Π½ΠΈ ΠΎΠΏΡΠΈΠΈ Π·Π° ΠΌΠΈΠ³ΡΠ°ΡΠΈΡ, Π²Π°ΡΠΈΡΠ΅ ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»ΠΈ ΡΠ΅ ΠΏΡΠ΅ΠΌΠΈΠ½Π°Ρ ΠΏΡΠ΅Π· ΡΠΎΠ·ΠΈ ΠΎΡΠΊΠ°Π· ΠΎΡΠ½ΠΎΡΠΈΡΠ΅Π»ΡΠ½ΠΎ Π±Π΅Π·Π±ΠΎΠ»Π΅Π·Π½Π΅Π½ΠΎ.
ΠΠΎ Π°ΠΊΠΎ Π½Π΅ ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ ΠΌΠΈΠ½Π΅ Π±Π΅Π· YAML, ΡΠΎΠ³Π°Π²Π° Π²Π·Π΅ΠΌΠ΅ΡΠ΅ ΡΠ΅Π·ΠΈ 10 ΡΡΠ²Π΅ΡΠ° Π½Π° ΡΠΏΠ°ΡΠ΅Π½ΠΈΠ΅ ΠΈ ΠΏΠΎΠ±Π΅Π΄Π΅ΡΠ΅ Π½Π΅ΠΏΡΠΈΡΠ·ΡΠ½ΡΠ° ΡΠΈ ΠΊΡΠΌ YAML Π²Π΅Π΄Π½ΡΠΆ Π·Π°Π²ΠΈΠ½Π°Π³ΠΈ!
ΠΠ·ΡΠΎΡΠ½ΠΈΠΊ: habr.com
