ΠΠΌΠ°Π»ΠΈ Π»ΠΈ ΡΡΠ΅ Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ Π΄Π° Π΅ΠΊΡΠΏΠ΅ΡΠΈΠΌΠ΅Π½ΡΠΈΡΠ°ΡΠ΅ Ρ ΠΊΠΎΠ΄ ΠΈΠ»ΠΈ ΡΠΈΡΡΠ΅ΠΌΠ½ΠΈ ΡΡΠΈΠ»ΠΈΡΠΈ Π² Linux ΡΠ°ΠΊΠ°, ΡΠ΅ Π΄Π° Π½Π΅ ΡΠ΅ ΡΡΠ΅Π²ΠΎΠΆΠΈΡΠ΅ Π·Π° ΠΎΡΠ½ΠΎΠ²Π½Π°ΡΠ° ΡΠΈΡΡΠ΅ΠΌΠ° ΠΈ Π΄Π° Π½Π΅ ΡΠ½ΠΈΡΠΎΠΆΠΈΡΠ΅ Π²ΡΠΈΡΠΊΠΎ Π² ΡΠ»ΡΡΠ°ΠΉ Π½Π° Π³ΡΠ΅ΡΠΊΠ° Π½Π° ΠΊΠΎΠ΄Π°, ΠΊΠΎΠΉΡΠΎ ΡΡΡΠ±Π²Π° Π΄Π° ΡΠ΅ ΠΈΠ·ΠΏΡΠ»Π½ΠΈ Ρ root-ΠΏΡΠΈΠ²ΠΈΠ»Π΅Π³ΠΈΠΈ?
Π ΠΊΠ°ΠΊΠ²ΠΎ ΡΠ΅ ΠΊΠ°ΠΆΠ΅ΡΠ΅ Π·Π° ΡΠΎΠ²Π°, Π°ΠΊΠΎ Π΅ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ Π΄Π° ΡΠ΅ΡΡΠ²Π°ΡΠ΅ ΠΈΠ»ΠΈ ΡΡΠ°ΡΡΠΈΡΠ°ΡΠ΅ ΡΠ΅Π»ΠΈΡ ΠΊΠ»Π°ΡΡΠ΅Ρ ΠΎΡ ΡΠ°Π·Π½ΠΎΠΎΠ±ΡΠ°Π·Π½ΠΈ ΠΌΠΈΠΊΡΠΎΡΠ΅ΡΠ²ΠΈΠ·ΠΈ Π½Π° Π΅Π΄Π½Π° ΠΌΠ°ΡΠΈΠ½Π°? Π‘ΡΠΎ ΠΈΠ»ΠΈ Π΄ΠΎΡΠΈ Ρ ΠΈΠ»ΡΠ΄Π°?
Π‘ Π²ΠΈΡΡΡΠ°Π»Π½ΠΈ ΠΌΠ°ΡΠΈΠ½ΠΈ, ΡΠΏΡΠ°Π²Π»ΡΠ²Π°Π½ΠΈ ΠΎΡ Ρ
ΠΈΠΏΠ΅ΡΠ²ΠΈΠ·ΠΎΡ, ΡΠ΅Π·ΠΈ Π·Π°Π΄Π°ΡΠΈ ΠΌΠΎΠ³Π°Ρ Π΄Π° ΡΠ΅ ΡΠ΅ΡΠ°Ρ, Π½ΠΎ ΠΊΠ°ΠΊΠ²Π° Π΅ ΡΠ΅Π½Π°ΡΠ°? ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅Ρ Π² LXD Π½Π° Π±Π°Π·Π°ΡΠ° Π½Π° Π΄ΠΈΡΡΡΠΈΠ±ΡΡΠΈΡΡΠ° Alpine Linux ΠΌΠΈΠ½ΠΈΠΌΠ°Π»Π½ΠΎ ΠΈΠ·ΠΈΡΠΊΠ²Π° ΡΠ°ΠΌΠΎ 7.60MB ΠΠΠ£, ΠΈ ΠΊΡΠ΄Π΅ΡΠΎ ΠΊΠΎΡΠ΅Π½ΠΎΠ²ΠΈΡΡ Π΄ΡΠ» ΡΠ»Π΅Π΄ ΡΡΠ°ΡΡΠΈΡΠ°Π½Π΅ Π·Π°Π΅ΠΌΠ° 9.5MB! ΠΠ°ΠΊ ΡΠΈ ΡΠ΅ ΡΡΡΡΠ²Π°, ΠΠ»ΠΎΠ½ ΠΠ°ΡΠΊ? ΠΡΠ΅ΠΏΠΎΡΡΡΠ²Π°ΠΌ Π΄Π° ΡΠ΅ Π·Π°ΠΏΠΎΠ·Π½Π°Π΅Ρ Ρ ΠΎΡΠ½ΠΎΠ²Π½ΠΈΡΠ΅ Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ Π½Π° LXD β ΡΠΈΡΡΠ΅ΠΌΠ°ΡΠ° Π·Π° ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠΈ Π² Linux
Π‘Π»Π΅Π΄ ΠΊΠ°ΡΠΎ ΠΎΠ±ΡΠΎ ΡΡΠ°Π½Π° ΡΡΠ½ΠΎ ΠΊΠ°ΠΊΠ²ΠΎ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»ΡΠ²Π°Ρ LXD ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠΈΡΠ΅, Π½Π΅ΠΊΠ° ΠΏΡΠΎΠ΄ΡΠ»ΠΆΠΈΠΌ Π½Π°ΠΏΡΠ΅Π΄ ΠΈ Π΄Π° ΠΏΠΎΠΌΠΈΡΠ»ΠΈΠΌ ΠΊΠ°ΠΊΠ²ΠΎ, Π°ΠΊΠΎ ΠΈΠΌΠ°ΡΠ΅ ΡΠ°ΠΊΠ°Π²Π° ΠΏΠ»Π°ΡΡΠΎΡΠΌΠ°-ΠΊΠΎΠΌΠ±Π°ΠΉΠ½, ΠΊΡΠ΄Π΅ΡΠΎ Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎ Π΄Π° ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ ΡΡΠ°ΡΡΠΈΡΠ° ΠΊΠΎΠ΄ Π·Π° Ρ ΠΎΡΡΠ°, Π΄Π° ΡΠ΅ Π³Π΅Π½Π΅ΡΠΈΡΠ°Ρ Π³ΡΠ°ΡΠΈΠΊΠΈ, Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ½ΠΎ (ΠΈΠ½ΡΠ΅ΡΠ°ΠΊΡΠΈΠ²Π½ΠΎ) Π΄Π° ΡΠ΅ ΡΠ²ΡΡΠ·Π²Π°Ρ UI-Π²ΠΈΠ΄ΠΆΠ΅ΡΠΈ Ρ Π²Π°ΡΠΈΡ ΠΊΠΎΠ΄, Π΄Π° ΡΠ΅ Π΄ΠΎΠΏΡΠ»Π²Π° ΠΊΠΎΠ΄ΡΡ Ρ ΡΠ΅ΠΊΡΡ ΠΈ Ρ Π±ΠΎΠ½ΡΡ... ΡΠΎΡΠΌΠ°Ρ? ΠΠ΅ΡΠΎ ΠΊΠ°ΡΠΎ ΠΈΠ½ΡΠ΅ΡΠ°ΠΊΡΠΈΠ²Π΅Π½ Π±Π»ΠΎΠ³? ΠΠ°ΡΡβ¦ ΠΡΠΊΠ°ΠΌ! ΠΡΠΊΠ°ΠΌ! π
ΠΠΎΠ³Π»Π΅Π΄Π½ΠΈ ΠΏΠΎΠ΄ ΠΊΠ°Ρ ΠΊΡΠ΄Π΅ ΡΠ΅ ΡΡΠ°ΡΡΠΈΡΠ°ΠΌΠ΅ Π² ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ° JupyterLab β ΡΠ»Π΅Π΄Π²Π°ΡΠΎΡΠΎ ΠΏΠΎΠΊΠΎΠ»Π΅Π½ΠΈΠ΅ Π½Π° ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»ΡΠΊΠΈΡ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ Π²ΠΌΠ΅ΡΡΠΎ ΠΎΡΡΠ°ΡΠ΅Π»ΠΈΡ Jupyter Notebook, Π° ΡΡΡΠΎ ΡΠ°ΠΊΠ° ΡΠ΅ ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°ΠΌΠ΅ ΡΠ°ΠΊΠΈΠ²Π° ΠΌΠΎΠ΄ΡΠ»ΠΈ Python ΠΊΠ°ΡΠΎ NumPy, Pandas, Matplotlib, IPyWidgets , ΠΊΠΎΠΈΡΠΎ ΡΠ΅ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡ Π΄Π° ΡΠ΅ ΠΈΠ·ΠΏΡΠ»Π½ΡΠ²Π° Π²ΡΠΈΡΠΊΠΎ ΠΈΠ·Π±ΡΠΎΠ΅Π½ΠΎ ΠΏΠΎ-Π³ΠΎΡΠ΅ ΠΈ Π΄Π° ΡΠ΅ Π·Π°ΠΏΠ°Π·ΠΈ Π²ΡΠΈΡΠΊΠΎ ΡΠΎΠ²Π° Π² ΡΠΏΠ΅ΡΠΈΠ°Π»Π΅Π½ ΡΠ°ΠΉΠ» β IPython-Π½ΠΎΡΡΠ±ΡΠΊ.

ΠΠ°Π²ΠΈΠ³Π°ΡΠΈΡ
- ΠΠ»Π°Π½ Π·Π° ΡΡΠ°ΡΡΠΈΡΠ°Π½Π΅ Π² ΠΎΡΠ±ΠΈΡΠ°
- ΠΠ½ΡΡΠ°Π»ΠΈΡΠ°Π½Π΅ ΠΈ Π½Π°ΡΡΡΠΎΠΉΠΊΠ° Π½Π° ΠΎΡΠ½ΠΎΠ²Π½Π°ΡΠ° ΡΠΈΡΡΠ΅ΠΌΠ°
- ΠΠ½ΡΡΠ°Π»ΠΈΡΠ°Π½Π΅ Π½Π° ΠΎΡΠ½ΠΎΠ²Π΅Π½ ΡΠΎΡΡΡΠ΅Ρ ΠΈ Π½Π°ΡΡΡΠΎΠΉΠΊΠ° Π½Π° ΡΠΈΡΡΠ΅ΠΌΠ°ΡΠ°
- ΠΠ½ΡΡΠ°Π»ΠΈΡΠ°Π½Π΅ ΠΈ Π½Π°ΡΡΡΠΎΠΉΠΊΠ° Π½Π° JupyterLab
- Π‘ΠΏΠΎΠ΄Π΅Π»ΡΠΌΠ΅ Π΄Π°Π½Π½ΠΈ Ρ Ρ ΠΎΡΡΠ°
- ΠΠ΄ΡΠ°Π²Π΅ΠΉ, ΡΠ²ΡΡ!
- Π Π°Π·ΡΠΈΡΡΠ²Π°ΠΌΠ΅ Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈΡΠ΅ Π½Π° Python
- Π’Π΅ΡΡΠ²Π°Π½Π΅ Π½Π° ΠΌΠΎΠ΄ΡΠ»ΠΈ Π² JupyterLab
- ΠΠ°ΠΊΠ²ΠΎ ΠΎΡΠ΅?
ΠΠ»Π°Π½ Π·Π° ΡΡΠ°ΡΡΠΈΡΠ°Π½Π΅ Π² ΠΎΡΠ±ΠΈΡΠ° ^

ΠΠ΅ΠΊΠ° ΠΎΡΠ΅ΡΡΠ°Π΅ΠΌ ΠΊΡΠ°ΡΡΠΊ ΠΏΠ»Π°Π½ Π½Π° Π΄Π΅ΠΉΡΡΠ²ΠΈΡΡΠ°, Π·Π° Π΄Π° Π½ΠΈ Π±ΡΠ΄Π΅ ΠΏΠΎ-Π»Π΅ΡΠ½ΠΎ Π΄Π° ΡΠ΅Π°Π»ΠΈΠ·ΠΈΡΠ°ΠΌΠ΅ ΡΡ Π΅ΠΌΠ°ΡΠ° ΠΏΠΎ-Π³ΠΎΡΠ΅:
- Π©Π΅ ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°ΠΌΠ΅ ΠΈ ΡΡΠ°ΡΡΠΈΡΠ°ΠΌΠ΅ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅Ρ Π½Π° Π±Π°Π·Π°ΡΠ° Π½Π° Π΄ΠΈΡΡΡΠΈΠ±ΡΡΠΈΡΡΠ° Alpine Linux. Π©Π΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ ΡΠ°Π·ΠΈ Π΄ΠΈΡΡΡΠΈΠ±ΡΡΠΈΡ, ΡΡΠΉ ΠΊΠ°ΡΠΎ Π΅ Π½Π°ΡΠΎΡΠ΅Π½Π° ΠΊΡΠΌ ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΠΈΠ·ΠΌΠ° ΠΈ ΡΠ΅ ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°ΠΌΠ΅ ΡΠ°ΠΌΠΎ Π½Π°ΠΉ-Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΈΡ ΡΠΎΡΡΡΠ΅Ρ, Π±Π΅Π· ΠΈΠ·Π»ΠΈΡΠ½ΠΎ.
- ΠΠΎΠ±Π°Π²ΠΈΠΌ Π΄ΠΎΠΏΡΠ»Π½ΠΈΡΠ΅Π»Π΅Π½ Π²ΠΈΡΡΡΠ°Π»Π΅Π½ Π΄ΠΈΡΠΊ Π² ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ°, Π½Π° ΠΊΠΎΠΉΡΠΎ ΡΠ΅ Π·Π°Π΄Π°Π΄Π΅ΠΌ ΠΈΠΌΠ΅ β
hostfsΠΈ ΡΠ΅ ΠΌΠΎΠ½ΡΠΈΡΠ°ΠΌΠ΅ ΠΊΡΠΌ ΠΊΠΎΡΠ΅Π½ΠΎΠ²Π°ΡΠ° ΡΠ°ΠΉΠ»ΠΎΠ²Π° ΡΠΈΡΡΠ΅ΠΌΠ°. Π’ΠΎΠ·ΠΈ Π΄ΠΈΡΠΊ ΡΠ΅ ΠΎΡΠΈΠ³ΡΡΠΈ Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ Π·Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ Π½Π° ΡΠ°ΠΉΠ»ΠΎΠ²Π΅ Π½Π° Ρ ΠΎΡΡΠ° ΠΎΡ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π° Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΡ Π²ΡΡΡΠ΅ Π² ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ°. ΠΠΎ ΡΠΎΠ·ΠΈ Π½Π°ΡΠΈΠ½ Π΄Π°Π½Π½ΠΈΡΠ΅ ΡΠ΅ ΠΎΡΡΠ°Π½Π°Ρ Π½Π΅Π·Π°Π²ΠΈΡΠΈΠΌΠΈ ΠΎΡ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ°. Π ΡΠ»ΡΡΠ°ΠΉ Π½Π° ΠΏΡΠ΅ΠΌΠ°Ρ Π²Π°Π½Π΅ Π½Π° ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ°, Π΄Π°Π½Π½ΠΈΡΠ΅ ΡΠ΅ ΠΎΡΡΠ°Π½Π°Ρ Π½Π° Ρ ΠΎΡΡΠ°. ΠΡΠ²Π΅Π½ ΡΠΎΠ²Π°, ΡΠ°Π·ΠΈ ΡΡ Π΅ΠΌΠ° Π΅ ΠΏΠΎΠ»Π΅Π·Π½Π° Π·Π° ΡΠ°Π·Π΄Π΅Π»ΡΠ½Π΅ Π½Π° Π΄Π°Π½Π½ΠΈ ΠΌΠ΅ΠΆΠ΄Ρ ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²ΠΎ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠΈ, Π±Π΅Π· Π΄Π° ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΠΈΡΠ΅ ΠΌΡΠ΅ΠΆΠΎΠ²ΠΈ ΠΌΠ΅Ρ Π°Π½ΠΈΠ·ΠΌΠΈ Π½Π° Π΄ΠΈΡΡΡΠΈΠ±ΡΡΠΈΡΡΠ° Π½Π° ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ°. - Π©Π΅ ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°ΠΌΠ΅ Bash, sudo, Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΈΡΠ΅ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ, ΡΠ΅ Π΄ΠΎΠ±Π°Π²ΠΈΠΌ ΠΈ Π½Π°ΡΡΡΠΎΠΉΠ²Π°ΠΌΠ΅ ΡΠΈΡΡΠ΅ΠΌΠ΅Π½ ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π».
- Π©Π΅ ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°ΠΌΠ΅ Python, ΠΌΠΎΠ΄ΡΠ»ΠΈΡΠ΅ ΠΈ ΡΠ΅ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΠ°ΠΌΠ΅ Π±ΠΈΠ½Π°ΡΠ½ΠΈΡΠ΅ ΠΈΠΌ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ.
- Π©Π΅ ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°ΠΌΠ΅ ΠΈ ΡΡΠ°ΡΡΠΈΡΠ°ΠΌΠ΅ JupyterLab, ΡΠ΅ Π½Π°ΡΡΡΠΎΠΈΠΌ Π²ΡΠ½ΡΠ½ΠΈΡ Π²ΠΈΠ΄, ΡΠ΅ ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°ΠΌΠ΅ ΡΠ°Π·ΡΠΈΡΠ΅Π½ΠΈΡ Π·Π° Π½Π΅Π³ΠΎ.
Π ΡΠ°Π·ΠΈ ΡΡΠ°ΡΠΈΡ ΡΠ΅ Π·Π°ΠΏΠΎΡΠ½Π΅ΠΌ Ρ ΠΏΡΡΠΊΠ°Π½Π΅ΡΠΎ Π½Π° ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ°, Π½ΡΠΌΠ° Π΄Π° ΠΎΠ±ΡΡΠΆΠ΄Π°ΠΌΠ΅ ΠΈΠ½ΡΡΠ°Π»Π°ΡΠΈΡΡΠ° ΠΈ Π½Π°ΡΡΡΠΎΠΉΠΊΠ°ΡΠ° Π½Π° LXD, Π²ΡΠΈΡΠΊΠΎ ΡΠΎΠ²Π° ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° Π½Π°ΠΌΠ΅ΡΠΈΡΠ΅ Π² Π΄ΡΡΠ³Π° ΡΡΠ°ΡΠΈΡ β ΠΡΠ½ΠΎΠ²Π½ΠΈ Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ Π½Π° LXD β ΡΠΈΡΡΠ΅ΠΌΠΈ Π·Π° ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠΈ Π² Linux.
ΠΠ½ΡΡΠ°Π»ΠΈΡΠ°Π½Π΅ ΠΈ Π½Π°ΡΡΡΠΎΠΉΠΊΠ° Π½Π° ΠΎΡΠ½ΠΎΠ²Π½Π°ΡΠ° ΡΠΈΡΡΠ΅ΠΌΠ° ^
Π‘ΡΠ·Π΄Π°Π²Π°ΠΌΠ΅ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅Ρ Ρ ΠΊΠΎΠΌΠ°Π½Π΄Π°, Π² ΠΊΠΎΡΡΠΎ ΡΠΊΠ°Π·Π²Π°ΠΌΠ΅ ΠΎΠ±ΡΠ°Π·Π° β alpine3, ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡ Π·Π° ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ° β jupyterlab ΠΈ ΠΏΡΠΈ Π½Π΅ΠΎΠ±Ρ
ΠΎΠ΄ΠΈΠΌΠΎΡΡ ΠΏΡΠΎΡΠΈΠ»ΠΈ Π½Π° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ:
lxc init alpine3 jupyterlab --profile=default --profile=hddrootΠ’ΡΠΊ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌ ΠΏΡΠΎΡΠΈΠ» Π½Π° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ hddroot , ΠΊΠΎΠΉΡΠΎ ΡΠΊΠ°Π·Π²Π° Π΄Π° ΡΠ΅ ΡΡΠ·Π΄Π°Π΄Π΅ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅Ρ Ρ root-ΡΠ°Π·Π΄Π΅Π» Π² Storage Pool ΡΠ°Π·ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ Π½Π° ΡΠΈΠ·ΠΈΡΠ΅ΡΠΊΠΈ HDD Π΄ΠΈΡΠΊ:
lxc profile show hddroot
config: {}
description: ""
devices:
root:
path: \/
pool: hddpool
type: disk
name: hddroot
used_by: []lxc storage show hddpool
config:
size: 10GB
source: \/dev\/loop1
volatile.initial_source: \/dev\/loop1
description: ""
name: hddpool
driver: btrfs
used_by:
- \/1.0\/images\/ebd565585223487526ddb3607f5156e875c15a89e21b61ef004132196da6a0a3
- \/1.0\/profiles\/hddroot
status: Created
locations:
- noneΠ’ΠΎΠ²Π° ΠΌΠΈ Π΄Π°Π²Π° Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ Π΄Π° Π΅ΠΊΡΠΏΠ΅ΡΠΈΠΌΠ΅Π½ΡΠΈΡΠ°ΠΌ Ρ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠΈ Π½Π° HDD Π΄ΠΈΡΠΊ, ΡΠΏΠ΅ΡΡΡΠ²Π°ΠΉΠΊΠΈ ΡΠ΅ΡΡΡΡΠΈ ΠΎΡ SSD Π΄ΠΈΡΠΊ, ΠΊΠΎΠΉΡΠΎ ΡΡΡΠΎ ΠΏΡΠΈΡΡΡΡΠ²Π° Π² ΠΌΠΎΡΡΠ° ΡΠΈΡΡΠ΅ΠΌΠ° π Π·Π° ΠΊΠΎΠΉΡΠΎ ΠΈΠΌΠ°ΠΌ ΡΡΠ·Π΄Π°Π΄Π΅Π½ ΠΎΡΠ΄Π΅Π»Π΅Π½ ΠΏΡΠΎΡΠΈΠ» Π½Π° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ ssdroot.
Π‘Π»Π΅Π΄ ΡΡΠ·Π΄Π°Π²Π°Π½Π΅ Π½Π° ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ°, ΡΠΎΠΉ ΡΠ΅ Π½Π°ΠΌΠΈΡΠ° Π² ΡΡΡΡΠΎΡΠ½ΠΈΠ΅ STOPPED, Π·Π°ΡΠΎΠ²Π° ΡΡΡΠ±Π²Π° Π΄Π° Π³ΠΎ ΡΡΠ°ΡΡΠΈΡΠ°ΠΌΠ΅, ΠΊΠ°ΡΠΎ ΡΡΠ°ΡΡΠΈΡΠ°ΠΌΠ΅ Π² Π½Π΅Π³ΠΎ init-ΡΠΈΡΡΠ΅ΠΌΠ°ΡΠ°:
lxc start jupyterlabΠ©Π΅ ΠΈΠ·Π²Π΅Π΄Π΅ΠΌ ΡΠΏΠΈΡΡΠΊ Π½Π° ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠΈΡΠ΅ Π² LXD, ΠΊΠ°ΡΠΎ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ ΠΊΠ»ΡΡ -c ΠΊΠΎΠΉΡΠΎ ΡΠΊΠ°Π·Π²Π° ΠΊΠ°ΠΊΠ²ΠΈ cΠΊΠΎΠ»ΠΎΠ½ΠΈ Π΄Π° ΠΈΠ·Π²Π΅Π΄Π΅ΠΌ Π½Π° Π΅ΠΊΡΠ°Π½Π°:
lxc list -c ns4b
+------------+---------+-------------------+--------------+
| NAME | STATE | IPV4 | STORAGE POOL |
+------------+---------+-------------------+--------------+
| jupyterlab | RUNNING | 10.0.5.198 (eth0) | hddpool |
+------------+---------+-------------------+--------------+ΠΡΠΈ ΡΡΠ·Π΄Π°Π²Π°Π½Π΅ΡΠΎ Π½Π° ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ° IP Π°Π΄ΡΠ΅ΡΡΡ Π±Π΅ΡΠ΅ ΠΈΠ·Π±ΡΠ°Π½ ΡΠ»ΡΡΠ°ΠΉΠ½ΠΎ, ΡΡΠΉ ΠΊΠ°ΡΠΎ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ
ΠΌΠ΅ ΠΏΡΠΎΡΠΈΠ» Π½Π° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ default , ΠΊΠΎΠΉΡΠΎ Π±Π΅ΡΠ΅ ΠΏΡΠ΅Π΄Π²Π°ΡΠΈΡΠ΅Π»Π½ΠΎ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠΈΡΠ°Π½ Π² ΡΡΠ°ΡΠΈΡΡΠ°. ΠΡΠ½ΠΎΠ²Π½ΠΈ Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ Π½Π° LXD β ΡΠΈΡΡΠ΅ΠΌΠΈ Π·Π° ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠΈ Π² Linux.
Π©Π΅ ΡΠΌΠ΅Π½ΠΈΠΌ ΡΠΎΠ·ΠΈ IP Π°Π΄ΡΠ΅Ρ Ρ ΠΏΠΎ-Π·Π°ΠΏΠΎΠΌΠ½ΡΡ ΡΠ΅, ΠΊΠ°ΡΠΎ ΡΡΠ·Π΄Π°Π΄Π΅ΠΌ ΠΌΡΠ΅ΠΆΠΎΠ² ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ Π½Π° Π½ΠΈΠ²ΠΎ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅Ρ, Π° Π½Π΅ Π½Π° Π½ΠΈΠ²ΠΎ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΎΠ½Π΅Π½ ΠΏΡΠΎΡΠΈΠ», ΠΊΠ°ΠΊΡΠΎ Π΅ Π² ΡΠ΅ΠΊΡΡΠ°ΡΠ° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ. ΠΠ΅ Π΅ Π·Π°Π΄ΡΠ»ΠΆΠΈΡΠ΅Π»Π½ΠΎ Π΄Π° Π³ΠΎ ΠΏΡΠ°Π²ΠΈΡΠ΅, ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΠΏΡΠΎΠΏΡΡΠ½Π΅ΡΠ΅ ΡΠΎΠ²Π°.
Π‘ΡΠ·Π΄Π°Π²Π°ΠΌΠ΅ ΠΌΡΠ΅ΠΆΠΎΠ² ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ eth0 ΠΊΠΎΠΉΡΠΎ ΡΠ²ΡΡΠ·Π²Π°ΠΌΠ΅ Ρ ΡΡΠΈΡ (ΠΌΡΠ΅ΠΆΠΎΠ² ΠΌΠΎΡΡ) lxdbr0 Π² ΠΊΠΎΠΉΡΠΎ Π²ΠΊΠ»ΡΡΠΈΡ
ΠΌΠ΅ NAT Π² ΠΏΡΠ΅Π΄ΠΈΡΠ½Π°ΡΠ° ΡΡΠ°ΡΠΈΡ ΠΈ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΡΡ ΡΠ΅Π³Π° ΡΠ΅ ΠΈΠΌΠ° Π΄ΠΎΡΡΡΠΏ Π΄ΠΎ ΠΈΠ½ΡΠ΅ΡΠ½Π΅Ρ, Π° ΡΡΡΠΎ ΡΠ°ΠΊΠ° Π½Π° ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ° ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠΌΠ΅ ΡΡΠ°ΡΠΈΡΠ΅Π½ IP Π°Π΄ΡΠ΅Ρ β 10.0.5.5:
lxc config device add jupyterlab eth0 nic name=eth0 nictype=bridged parent=lxdbr0 ipv4.address=10.0.5.5Π‘Π»Π΅Π΄ Π΄ΠΎΠ±Π°Π²ΡΠ½Π΅ Π½Π° ΡΡΡΡΠΎΠΉΡΡΠ²ΠΎΡΠΎ, ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΡΡ ΡΡΡΠ±Π²Π° Π΄Π° Π±ΡΠ΄Π΅ ΡΠ΅ΡΡΠ°ΡΡΠΈΡΠ°Π½:
lxc restart jupyterlabΠΡΠΎΠ²Π΅ΡΡΠ²Π°ΠΌΠ΅ ΡΡΠ°ΡΡΡΠ° Π½Π° ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ°:
lxc list -c ns4b
+------------+---------+------------------+--------------+
| NAME | STATE | IPV4 | STORAGE POOL |
+------------+---------+------------------+--------------+
| jupyterlab | RUNNING | 10.0.5.5 (eth0) | hddpool |
+------------+---------+------------------+--------------+ΠΠ½ΡΡΠ°Π»ΠΈΡΠ°Π½Π΅ Π½Π° ΠΎΡΠ½ΠΎΠ²Π΅Π½ ΡΠΎΡΡΡΠ΅Ρ ΠΈ Π½Π°ΡΡΡΠΎΠΉΠΊΠ° Π½Π° ΡΠΈΡΡΠ΅ΠΌΠ°ΡΠ° ^
ΠΠ° Π°Π΄ΠΌΠΈΠ½ΠΈΡΡΡΠΈΡΠ°Π½Π΅ Π½Π° Π½Π°ΡΠΈΡ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅Ρ Π΅ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ Π΄Π° ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°ΠΌΠ΅ ΡΠ»Π΅Π΄Π½ΠΈΡ ΡΠΎΡΡΡΠ΅Ρ:
Package
ΠΠΏΠΈΡΠ°Π½ΠΈΠ΅
bash
GNU Bourne Again shell
bash-completion
ΠΡΠΎΠ³ΡΠ°ΠΌΠΈΡΡΠ΅ΠΌΠΎ Π·Π°Π²ΡΡΡΠ²Π°Π½Π΅ Π·Π° bash shell
sudo
ΠΠ°ΠΉΡΠ΅ Π½Π° ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈ ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»ΠΈ Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡΠ° Π΄Π° ΠΈΠ·ΠΏΡΠ»Π½ΡΠ²Π°Ρ Π½ΡΠΊΠΎΠΈ ΠΊΠΎΠΌΠ°Π½Π΄ΠΈ ΠΊΠ°ΡΠΎ root
shadow
ΠΠ½ΡΡΡΡΠΌΠ΅Π½Ρ Π·Π° ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ Π½Π° ΠΏΠ°ΡΠΎΠ»ΠΈ ΠΈ Π°ΠΊΠ°ΡΠ½ΡΠΈ Ρ ΠΏΠΎΠ΄Π΄ΡΡΠΆΠΊΠ° Π½Π° shadow ΡΠ°ΠΉΠ»ΠΎΠ²Π΅ ΠΈ PAM
tzdata
ΠΠ·ΡΠΎΡΠ½ΠΈΡΠΈ Π·Π° Π΄Π°Π½Π½ΠΈ Π·Π° ΡΠ°ΡΠΎΠ²ΠΈ Π·ΠΎΠ½ΠΈ ΠΈ Π»ΡΡΠ½ΠΎ ΡΠ°ΡΠΎΠ²ΠΎ Π²ΡΠ΅ΠΌΠ΅
nano
ΠΠ»ΠΎΠ½ΠΈΠ½Π³ Π½Π° ΡΠ΅Π΄Π°ΠΊΡΠΎΡΠ° Pico Ρ ΠΏΠΎΠ΄ΠΎΠ±ΡΠ΅Π½ΠΈΡ
ΠΡΠ²Π΅Π½ ΡΠΎΠ²Π°, ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°ΡΠ΅ ΠΏΠΎΠ΄Π΄ΡΡΠΆΠΊΠ° Π½Π° ΡΠΈΡΡΠ΅ΠΌΠ°ΡΠ° man-pages, ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°ΠΉΠΊΠΈ ΡΠ»Π΅Π΄Π½ΠΈΡΠ΅ ΠΏΠ°ΠΊΠ΅ΡΠΈ β man man-pages mdocml-apropos less
lxc exec jupyterlab -- apk add bash bash-completion sudo shadow tzdata nanoΠΠ΅ΠΊΠ° ΡΠ°Π·Π³Π»Π΅Π΄Π°ΠΌΠ΅ ΠΊΠΎΠΌΠ°Π½Π΄ΠΈΡΠ΅ ΠΈ ΠΊΠ»ΡΡΠΎΠ²Π΅ΡΠ΅, ΠΊΠΎΠΈΡΠΎ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ ΠΌΠ΅:
lxcβ ΠΠ·Π²ΠΈΠΊΠ²Π°Π½Π΅ Π½Π° LXD ΠΊΠ»ΠΈΠ΅Π½ΡΠ°execβ ΠΠ΅ΡΠΎΠ΄ Π½Π° ΠΊΠ»ΠΈΠ΅Π½ΡΠ° LXD, ΠΊΠΎΠΉΡΠΎ ΠΈΠ·ΠΏΡΠ»Π½ΡΠ²Π° ΠΊΠΎΠΌΠ°Π½Π΄Π° Π² ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ°jupyterlabβ ΠΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡ Π½Π° ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ°--β Π‘ΠΏΠ΅ΡΠΈΠ°Π»Π΅Π½ ΠΊΠ»ΡΡ, ΠΊΠΎΠΉΡΠΎ ΡΠΊΠ°Π·Π²Π° Π΄Π° Π½Π΅ ΡΠ΅ ΠΈΠ½ΡΠ΅ΡΠΏΡΠ΅ΡΠΈΡΠ° Π΄ΠΎΠΏΡΠ»Π½ΠΈΡΠ΅Π»Π½ΠΎ ΠΊΠ»ΡΡΠΎΠ²Π΅ΡΠ΅ ΠΊΠ°ΡΠΎ ΡΠ°ΠΊΠΈΠ²Π°lxcΠΈ Π΄Π° ΠΏΡΠ΅Π΄Π°Π΄Π΅ ΡΡΠ»Π°ΡΠ° ΠΎΡΡΠ°Π½Π°Π»Π° ΡΡΡΠΎΠΊΠ°, ΡΠ°ΠΊΠ° ΠΊΠ°ΠΊΡΠΎ Π΅ Π² ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ°apkβ ΠΠ΅Π½ΠΈΠ΄ΠΆΡΡ Π½Π° ΠΏΠ°ΠΊΠ΅ΡΠΈ Π½Π° Π΄ΠΈΡΡΡΠΈΠ±ΡΡΠΈΡ Alpine Linuxaddβ ΠΠ΅ΡΠΎΠ΄ Π½Π° ΠΌΠ΅Π½ΠΈΠ΄ΠΆΡΡΠ° Π½Π° ΠΏΠ°ΠΊΠ΅ΡΠΈ, ΠΊΠΎΠΉΡΠΎ ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ° ΠΏΠΎΡΠΎΡΠ΅Π½ΠΈΡΠ΅ ΡΠ»Π΅Π΄ ΠΊΠΎΠΌΠ°Π½Π΄Π°ΡΠ° ΠΏΠ°ΠΊΠ΅ΡΠΈ
Π‘Π΅Π³Π° ΡΠ΅ Π½Π°ΡΡΡΠΎΠΈΠΌ Π²ΡΠ΅ΠΌΠ΅Π²Π°ΡΠ° Π·ΠΎΠ½Π° Π² ΡΠΈΡΡΠ΅ΠΌΠ°ΡΠ° Europe/Moscow:
lxc exec jupyterlab -- cp /usr/share/zoneinfo/Europe/Moscow /etc/localtimeΠ‘Π»Π΅Π΄ ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°Π½Π΅ΡΠΎ Π½Π° Π²ΡΠ΅ΠΌΠ΅Π²Π°ΡΠ° Π·ΠΎΠ½Π°, ΠΏΠ°ΠΊΠ΅ΡΡΡ tzdata Π² ΡΠΈΡΡΠ΅ΠΌΠ°ΡΠ° Π²Π΅ΡΠ΅ Π½Π΅ Π΅ Π½Π΅ΠΎΠ±Ρ
ΠΎΠ΄ΠΈΠΌ, ΡΠΎΠΉ ΡΠ΅ Π·Π°Π΅ΠΌΠ° ΠΌΡΡΡΠΎ, Π·Π°ΡΠΎΠ²Π° ΡΠ΅ Π³ΠΎ ΠΈΠ·ΡΡΠΈΠ΅ΠΌ:
lxc exec jupyterlab -- apk del tzdataΠΡΠΎΠ²Π΅ΡΡΠ²Π°ΠΌΠ΅ Π²ΡΠ΅ΠΌΠ΅Π²Π°ΡΠ° Π·ΠΎΠ½Π°:
lxc exec jupyterlab -- date
Wed Apr 15 10:49:56 MSK 2020ΠΠ° Π΄Π° Π½Π΅ Π³ΡΠ±ΠΈΠΌ ΠΌΠ½ΠΎΠ³ΠΎ Π²ΡΠ΅ΠΌΠ΅ Π·Π° Π½Π°ΡΡΡΠΎΠΉΠΊΠ° Π½Π° Bash Π·Π° Π½ΠΎΠ²ΠΈ ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»ΠΈ Π² ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ°, ΡΠ»Π΅Π΄Π²Π°ΡΠΈΡΠ΅ Π΄Π΅ΠΉΡΡΠ²ΠΈΡ ΡΠ΅ ΠΊΠΎΠΏΠΈΡΠ°Ρ Π³ΠΎΡΠΎΠ²ΠΈΡΠ΅ skel ΡΠ°ΠΉΠ»ΠΎΠ²Π΅ ΠΎΡ Ρ
ΠΎΡΡΠΎΠ²Π°ΡΠ° ΡΠΈΡΡΠ΅ΠΌΠ°. Π’ΠΎΠ²Π° ΡΠ΅ Π½Π°ΠΏΡΠ°Π²ΠΈ Bash Π² ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ° ΠΈΠ½ΡΠ΅ΡΠ°ΠΊΡΠΈΠ²Π΅Π½. ΠΠΎΡΡΠ° Ρ
ΠΎΡΡΠΎΠ²Π° ΡΠΈΡΡΠ΅ΠΌΠ° Π΅ Manjaro Linux ΠΈ ΡΠ°ΠΉΠ»ΠΎΠ²Π΅ΡΠ΅, ΠΊΠΎΠΈΡΠΎ ΠΊΠΎΠΏΠΈΡΠ°ΠΌΠ΅ /etc/skel/.bash_profile, /etc/skel/.bashrc, /etc/skel/.dir_colors Π² ΠΏΡΠΈΠ½ΡΠΈΠΏΠ΅ ΡΠ° ΠΏΠΎΠ΄Ρ
ΠΎΠ΄ΡΡΠΈ Π·Π° Alpine Linux ΠΈ Π½Π΅ ΠΏΡΠ΅Π΄ΠΈΠ·Π²ΠΈΠΊΠ²Π°Ρ ΠΊΡΠΈΡΠΈΡΠ½ΠΈ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠΈ, Π½ΠΎ ΠΏΡΠΈ Π²Π°Ρ ΠΌΠΎΠΆΠ΅ Π΄Π° Π΅ ΡΠ°Π·Π»ΠΈΡΠ΅Π½ Π΄ΠΈΡΡΡΠΈΠ±ΡΡΠΈΠ² ΠΈ Π΅ Π½Π΅ΠΎΠ±Ρ
ΠΎΠ΄ΠΈΠΌΠΎ ΡΠ°ΠΌΠΈ Π΄Π° ΡΠ΅ ΡΠΏΡΠ°Π²ΠΈΡΠ΅ Π² ΡΠ»ΡΡΠ°ΠΉ Π½Π° Π³ΡΠ΅ΡΠΊΠ° ΠΏΡΠΈ ΡΡΠ°ΡΡΠΈΡΠ°Π½Π΅ Π½Π° Bash Π² ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ°.
ΠΠΎΠΏΠΈΡΠ°ΠΌΠ΅ skel ΡΠ°ΠΉΠ»ΠΎΠ²Π΅ΡΠ΅ Π² ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ°. ΠΠ»ΡΡ --create-dirs ΡΠ΅ ΡΡΠ·Π΄Π°Π΄Π΅ Π½Π΅ΠΎΠ±Ρ
ΠΎΠ΄ΠΈΠΌΠΈΡΠ΅ Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΠΈ, Π°ΠΊΠΎ ΡΠ΅ Π½Π΅ ΡΡΡΠ΅ΡΡΠ²ΡΠ²Π°Ρ:
lxc file push /etc/skel/.bash_profile jupyterlab/etc/skel/.bash_profile --create-dirs
lxc file push /etc/skel/.bashrc jupyterlab/etc/skel/.bashrc
lxc file push /etc/skel/.dir_colors jupyterlab/etc/skel/.dir_colorsΠΠ° Π²Π΅ΡΠ΅ ΡΡΡΠ΅ΡΡΠ²ΡΠ²Π°ΡΠΈΡ root ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π» ΡΠ΅ ΠΊΠΎΠΏΠΈΡΠ°ΠΌΠ΅ Π² Π΄ΠΎΠΌΠ°ΡΠ½Π°ΡΠ° Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΡ ΡΠΎΠΊΡ-ΡΠΎ ΠΊΠΎΠΏΠΈΡΠ°Π½ΠΈΡΠ΅ skel ΡΠ°ΠΉΠ»ΠΎΠ²Π΅ Π² ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ°:
lxc exec jupyterlab -- cp /etc/skel/.bash_profile /root/.bash_profile
lxc exec jupyterlab -- cp /etc/skel/.bashrc /root/.bashrc
lxc exec jupyterlab -- cp /etc/skel/.dir_colors /root/.dir_colorsΠ Alpine Linux Π½Π° ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»ΠΈΡΠ΅ ΡΠ΅ Π·Π°Π΄Π°Π²Π° ΡΠΈΡΡΠ΅ΠΌΠ½Π°ΡΠ° ΠΎΠ±Π²ΠΈΠ²ΠΊΠ° /bin/sh, Π½ΠΈΠ΅ ΡΠ΅ Ρ Π·Π°ΠΌΠ΅Π½ΠΈΠΌ Π½Π° root ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»Ρ Ρ Bash:
lxc exec jupyterlab -- usermod --shell=/bin/bash rootΠΠ° Π΄Π° root Π°ΠΊΠΎ ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»ΡΡ Π½Π΅ Π΅ Π±ΠΈΠ» Π±Π΅Π·ΠΏΠ°ΡΠΎΠ»Π΅Π½, ΡΠΎΠΉ ΡΡΡΠ±Π²Π° Π΄Π° Π·Π°Π΄Π°Π΄Π΅ ΠΏΠ°ΡΠΎΠ»Π°. Π‘Π»Π΅Π΄Π²Π°ΡΠ°ΡΠ° ΠΊΠΎΠΌΠ°Π½Π΄Π° ΡΠ΅ Π³Π΅Π½Π΅ΡΠΈΡΠ° ΠΈ Π·Π°Π΄Π°Π΄Π΅ Π½ΠΎΠ²Π° ΡΠ»ΡΡΠ°ΠΉΠ½Π° ΠΏΠ°ΡΠΎΠ»Π°, ΠΊΠΎΡΡΠΎ ΡΠ΅ Π²ΠΈΠ΄ΠΈΡΠ΅ Π½Π° Π΅ΠΊΡΠ°Π½Π° Π½Π° ΠΊΠΎΠ½Π·ΠΎΠ»Π°ΡΠ° ΡΠ»Π΅Π΄ Π½Π΅ΠΉΠ½ΠΎΡΠΎ ΠΈΠ·ΠΏΡΠ»Π½Π΅Π½ΠΈΠ΅:
lxc exec jupyterlab -- /bin/bash -c "PASSWD=$(head /dev/urandom | tr -dc A-Za-z0-9 | head -c 12); echo "root:$PASSWD" | chpasswd && echo "New Password: $PASSWD""
New Password: sFiXEvBswuWAΠ‘ΡΡΠΎ ΡΠ°ΠΊΠ°, ΡΠ΅ ΡΡΠ·Π΄Π°Π΄Π΅ΠΌ Π½ΠΎΠ² ΡΠΈΡΡΠ΅ΠΌΠ΅Π½ ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π» β jupyter Π·Π° ΠΊΠΎΠΉΡΠΎ ΠΏΠΎ-ΠΊΡΡΠ½ΠΎ ΡΠ΅ Π½Π°ΡΡΡΠΎΠΈΠΌ JupyterLab:
lxc exec jupyterlab -- useradd --create-home --shell=/bin/bash jupyterΠ©Π΅ Π³Π΅Π½Π΅ΡΠΈΡΠ°ΠΌΠ΅ ΠΈ Π·Π°Π΄Π°Π΄Π΅ΠΌ ΠΏΠ°ΡΠΎΠ»Π° Π·Π° Π½Π΅Π³ΠΎ:
lxc exec jupyterlab -- /bin/bash -c "PASSWD=$(head /dev/urandom | tr -dc A-Za-z0-9 | head -c 12); echo "jupyter:$PASSWD" | chpasswd && echo "New Password: $PASSWD""
New Password: ZIcbzWrF8tkiΠ‘Π»Π΅Π΄ ΡΠΎΠ²Π° ΡΠ΅ ΠΈΠ·ΠΏΡΠ»Π½ΠΈΠΌ Π΄Π²Π΅ ΠΊΠΎΠΌΠ°Π½Π΄ΠΈ, ΠΏΡΡΠ²Π°ΡΠ° ΡΠ΅ ΡΡΠ·Π΄Π°Π΄Π΅ ΡΠΈΡΡΠ΅ΠΌΠ½Π° Π³ΡΡΠΏΠ° sudo, Π° Π²ΡΠΎΡΠ°ΡΠ° ΡΠ΅ Π΄ΠΎΠ±Π°Π²ΠΈ ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»Ρ Π² Π½Π΅Ρ jupyter:
lxc exec jupyterlab -- groupadd --system sudo
lxc exec jupyterlab -- groupmems --group sudo --add jupyterΠΠ° Π²ΠΈΠ΄ΠΈΠΌ Π² ΠΊΠΎΠΈ Π³ΡΡΠΏΠΈ Π΅ ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»ΡΡ jupyter:
lxc exec jupyterlab -- id -Gn jupyter
jupyter sudoΠΡΠΈΡΠΊΠΎ Π΅ ΠΎΠΊ, ΠΏΡΠΎΠ΄ΡΠ»ΠΆΠ°Π²Π°ΠΌΠ΅ Π½Π°ΠΏΡΠ΅Π΄.
Π©Π΅ ΡΠ°Π·ΡΠ΅ΡΠΈΠΌ Π½Π° Π²ΡΠΈΡΠΊΠΈ ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»ΠΈ, ΠΊΠΎΠΈΡΠΎ Π²Π»ΠΈΠ·Π°Ρ Π² Π³ΡΡΠΏΠ°ΡΠ° sudo Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ ΠΊΠΎΠΌΠ°Π½Π΄Π°ΡΠ° sudo. ΠΠ° ΡΠ΅Π»ΡΠ° ΠΈΠ·ΠΏΡΠ»Π½Π΅ΡΠ΅ ΡΠ»Π΅Π΄Π½ΠΈΡ ΡΠΊΡΠΈΠΏΡ, ΠΊΠΎΠΉΡΠΎ sed ΡΠ°Π·ΠΊΠΎΠΌΠ΅Π½ΡΠΈΡΠ° ΡΠ΅Π΄Π° Π½Π° ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡΠ° Π² ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΎΠ½Π½ΠΈΡ ΡΠ°ΠΉΠ» /etc/sudoers:
lxc exec jupyterlab -- /bin/bash -c "sed --in-place -e ' /^#[ t]*%sudo[ t]*ALL=(ALL)[ t]*ALL$/ s/^[# ]*// ' /etc/sudoers"ΠΠ½ΡΡΠ°Π»ΠΈΡΠ°Π½Π΅ ΠΈ Π½Π°ΡΡΡΠΎΠΉΠΊΠ° Π½Π° JupyterLab ^
JupyterLab β ΡΠΎΠ²Π° Π΅ Python ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, Π·Π°ΡΠΎΠ²Π° ΠΏΡΡΠ²ΠΎ ΡΡΡΠ±Π²Π° Π΄Π° ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°ΠΌΠ΅ ΡΠΎΠ·ΠΈ ΠΈΠ½ΡΠ΅ΡΠΏΡΠ΅ΡΠ°ΡΠΎΡ. Π‘ΡΡΠΎ ΡΠ°ΠΊΠ°, JupyterLab ΡΠ΅ ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°ΠΌΠ΅ Ρ ΠΏΠΎΠΌΠΎΡΡΠ° Π½Π° ΠΏΠ°ΠΊΠ΅ΡΠ½ΠΈΡ ΠΌΠ΅Π½ΠΈΠ΄ΠΆΡΡ Π½Π° Python pip, Π° Π½Π΅ ΡΠΈΡΡΠ΅ΠΌΠ½ΠΈΡ, Π·Π°ΡΠΎΡΠΎ Π² ΡΠΈΡΡΠ΅ΠΌΠ½ΠΈΡ ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΠΉ ΡΠΎΠΉ ΠΌΠΎΠΆΠ΅ Π΄Π° Π΅ ΠΎΡΡΠ°ΡΡΠ», Π·Π°ΡΠΎΠ²Π° ΡΡΡΠ±Π²Π° ΡΡΡΠ½ΠΎ Π΄Π° ΡΠ°Π·ΡΠ΅ΡΠΈΠΌ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈΡΠ΅, ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°ΠΉΠΊΠΈ ΡΠ»Π΅Π΄Π½ΠΈΡΠ΅ ΠΏΠ°ΠΊΠ΅ΡΠΈ β python3 python3-dev gcc libc-dev zeromq-dev:
lxc exec jupyterlab -- apk add python3 python3-dev gcc libc-dev zeromq-devΠΠ±Π½ΠΎΠ²ΠΈΠΌ python-ΠΌΠΎΠ΄ΡΠ»ΠΈΡΠ΅ ΠΈ ΠΏΠ°ΠΊΠ΅ΡΠ½ΠΈΡ ΠΌΠ΅Π½ΠΈΠ΄ΠΆΡΡ pip Π΄ΠΎ Π°ΠΊΡΡΠ°Π»Π½Π°ΡΠ° Π²Π΅ΡΡΠΈΡ:
lxc exec jupyterlab -- python3 -m pip install --upgrade pip setuptools wheelΠΠ½ΡΡΠ°Π»ΠΈΡΠ°ΠΌΠ΅ JupyterLab ΡΡΠ΅Π· ΠΏΠ°ΠΊΠ΅ΡΠ½ΠΈΡ ΠΌΠ΅Π½ΠΈΠ΄ΠΆΡΡ pip:
lxc exec jupyterlab -- python3 -m pip install jupyterlabΠ’ΡΠΉ ΠΊΠ°ΡΠΎ ΡΠ°Π·ΡΠΈΡΠ΅Π½ΠΈΡΡΠ° Π² JupyterLab ΡΠ° Π΅ΠΊΡΠΏΠ΅ΡΠΈΠΌΠ΅Π½ΡΠ°Π»Π½ΠΈ ΠΈ ΠΎΡΠΈΡΠΈΠ°Π»Π½ΠΎ Π½Π΅ ΡΠ΅ ΠΏΡΠ΅Π΄Π»Π°Π³Π°Ρ Ρ ΠΏΠ°ΠΊΠ΅ΡΠ° jupyterlab, Π·Π°ΡΠΎΠ²Π° ΡΡΡΠ±Π²Π° Π΄Π° Π³ΠΈ ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°ΠΌΠ΅ ΠΈ Π½Π°ΡΡΡΠΎΠΈΠΌ ΡΡΡΠ½ΠΎ.
Π©Π΅ ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°ΠΌΠ΅ NodeJS ΠΈ ΠΌΠ΅Π½ΠΈΠ΄ΠΆΡΡΠ° Π½Π° ΠΏΠ°ΠΊΠ΅ΡΠΈ Π·Π° Π½Π΅Π³ΠΎ β NPM, ΡΡΠΉ ΠΊΠ°ΡΠΎ JupyterLab Π³ΠΈ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° Π·Π° ΡΠ²ΠΎΠΈΡΠ΅ ΡΠ°Π·ΡΠΈΡΠ΅Π½ΠΈΡ:
lxc exec jupyterlab -- apk add nodejs npmΠΠ° Π΄Π° ΡΠ°Π±ΠΎΡΡΡ ΡΠ°Π·ΡΠΈΡΠ΅Π½ΠΈΡΡΠ° Π·Π° JupyterLab ΠΊΠΎΠΈΡΠΎ ΡΠ΅ ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°ΠΌΠ΅, ΡΠ΅ ΡΡΡΠ±Π²Π° Π΄Π° ΡΠ΅ ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°Ρ Π² ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»ΡΠΊΠ°ΡΠ° Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΡ, ΡΡΠΉ ΠΊΠ°ΡΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ ΡΠ΅ ΡΠ΅ ΡΡΠ°ΡΡΠΈΡΠ° ΠΎΡ ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»Ρ jupyter. ΠΡΠΎΠ±Π»Π΅ΠΌΡΡ Π΅, ΡΠ΅ Π½ΡΠΌΠ° ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡ Π² ΠΊΠΎΠΌΠ°Π½Π΄ΠΈ Π·Π° ΡΡΠ°ΡΡΠΈΡΠ°Π½Π΅, Ρ ΠΊΠΎΠΉΡΠΎ Π΄Π° Π·Π°Π΄Π°Π΄Π΅ΠΌ Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΡΡΠ°, ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ ΠΏΡΠΈΠ΅ΠΌΠ° ΡΠ°ΠΌΠΎ ΠΏΡΠΎΠΌΠ΅Π½Π»ΠΈΠ²Π°ΡΠ° Π½Π° ΡΡΠ΅Π΄Π°ΡΠ° ΠΈ Π·Π°ΡΠΎΠ²Π° ΡΡΡΠ±Π²Π° Π΄Π° Ρ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΠΌ. ΠΠ° ΡΠ΅Π»ΡΠ° ΡΠ΅ Π·Π°ΠΏΠΈΡΠ΅ΠΌ ΠΊΠΎΠΌΠ°Π½Π΄Π°ΡΠ° Π·Π° Π΅ΠΊΡΠΏΠΎΡΡΠΈΡΠ°Π½Π΅ Π½Π° ΠΏΡΠΎΠΌΠ΅Π½Π»ΠΈΠ²Π°ΡΠ° JUPYTERLAB_DIR Π² ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»ΡΠΊΠ°ΡΠ° ΡΡΠ΅Π΄Π° jupyter, Π² ΡΠ°ΠΉΠ» .bashrc, ΠΊΠΎΠΉΡΠΎ ΡΠ΅ ΠΈΠ·ΠΏΡΠ»Π½ΡΠ²Π° Π²ΡΠ΅ΠΊΠΈ ΠΏΡΡ, ΠΊΠΎΠ³Π°ΡΠΎ ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»ΡΡ Π²Π»ΠΈΠ·Π° Π² ΡΠΈΡΡΠ΅ΠΌΠ°ΡΠ°:
lxc exec jupyterlab -- su -l jupyter -c "echo -e "nexport JUPYTERLAB_DIR=$HOME/.local/share/jupyter/lab" >> .bashrc"Π‘ ΠΏΠΎΠΌΠΎΡΡΠ° Π½Π° ΡΠ»Π΅Π΄Π½Π°ΡΠ° ΠΊΠΎΠΌΠ°Π½Π΄Π° ΡΠ΅ ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°ΠΌΠ΅ ΡΠΏΠ΅ΡΠΈΠ°Π»Π½ΠΎ ΡΠ°Π·ΡΠΈΡΠ΅Π½ΠΈΠ΅ β ΠΌΠ΅Π½ΠΈΠ΄ΠΆΡΡ Π½Π° ΡΠ°Π·ΡΠΈΡΠ΅Π½ΠΈΡ Π² JupyterLab:
lxc exec jupyterlab -- su -l jupyter -c "export JUPYTERLAB_DIR=$HOME/.local/share/jupyter/lab; jupyter labextension install --no-build @jupyter-widgets/jupyterlab-manager"Π‘Π΅Π³Π° Π²ΡΠΈΡΠΊΠΎ Π΅ Π³ΠΎΡΠΎΠ²ΠΎ Π·Π° ΠΏΡΡΠ²ΠΎ ΡΡΠ°ΡΡΠΈΡΠ°Π½Π΅ JupyterLab, Π½ΠΎ ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°ΠΌΠ΅ ΠΈ Π½ΡΠΊΠΎΠ»ΠΊΠΎ ΠΏΠΎΠ»Π΅Π·Π½ΠΈ ΡΠ°Π·ΡΠΈΡΠ΅Π½ΠΈΡ:
tocβ Π‘ΡΠ΄ΡΡΠΆΠ°Π½ΠΈΠ΅, Π³Π΅Π½Π΅ΡΠΈΡΠ° ΡΠΏΠΈΡΡΠΊ Ρ Π·Π°Π³Π»Π°Π²ΠΈΡ Π² ΡΡΠ°ΡΠΈΡΡΠ°/Π½ΠΎΡΡΠ±ΡΠΊΠ°jupyterlab-horizon-themeβ Π’Π΅ΠΌΠ° Π½Π° ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ°jupyterlab_neon_themeβ Π’Π΅ΠΌΠ° Π½Π° ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ°jupyterlab-ubu-themeβ ΠΡΠ΅ Π΅Π΄Π½Π° ΡΠ΅ΠΌΠ° Π½Π° ΠΎΡΠΎΡΠΌΠ»Π΅Π½ΠΈΠ΅ΡΠΎ ΠΎΡ Π°Π²ΡΠΎΡΠ° Π½Π° ΡΠ°Π·ΠΈ ΡΡΠ°ΡΠΈΡ π ΠΠΎ Π² ΡΠΎΠ·ΠΈ ΡΠ»ΡΡΠ°ΠΉ ΡΠ΅ Π±ΡΠ΄Π΅ ΠΏΠΎΠΊΠ°Π·Π°Π½Π° ΠΈΠ½ΡΡΠ°Π»Π°ΡΠΈΡ ΠΎΡ ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΡ Π½Π° GitHub.
Π ΡΠ°ΠΊΠ°, ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»Π½ΠΎ ΠΈΠ·ΠΏΡΠ»Π½Π΅ΡΠ΅ ΡΠ»Π΅Π΄Π½ΠΈΡΠ΅ ΠΊΠΎΠΌΠ°Π½Π΄ΠΈ, Π·Π° Π΄Π° ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°ΡΠ΅ ΡΠ΅Π·ΠΈ ΡΠ°Π·ΡΠΈΡΠ΅Π½ΠΈΡ:
lxc exec jupyterlab -- su -l jupyter -c "export JUPYTERLAB_DIR=$HOME/.local/share/jupyter/lab; jupyter labextension install --no-build @jupyterlab/toc @mohirio/jupyterlab-horizon-theme @yeebc/jupyterlab_neon_theme"lxc exec jupyterlab -- su -l jupyter -c "wget -c https://github.com/microcoder/jupyterlab-ubu-theme/archive/master.zip"lxc exec jupyterlab -- su -l jupyter -c "unzip -q master.zip && rm master.zip"lxc exec jupyterlab -- su -l jupyter -c "export JUPYTERLAB_DIR=$HOME/.local/share/jupyter/lab; jupyter labextension install --no-build jupyterlab-ubu-theme-master"lxc exec jupyterlab -- su -l jupyter -c "rm -r jupyterlab-ubu-theme-master"Π‘Π»Π΅Π΄ ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°Π½Π΅ΡΠΎ Π½Π° ΡΠ°Π·ΡΠΈΡΠ΅Π½ΠΈΡΡΠ° ΡΡΡΠ±Π²Π° Π΄Π° Π³ΠΈ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΠ°ΠΌΠ΅, ΡΡΠΉ ΠΊΠ°ΡΠΎ ΠΏΡΠ΅Π΄ΠΈ ΡΠΎΠ²Π° ΠΏΡΠΈ ΠΈΠ½ΡΡΠ°Π»Π°ΡΠΈΡΡΠ° ΡΠΊΠ°Π·Π°Ρ
ΠΌΠ΅ ΠΊΠ»ΡΡΠ° --no-build Π·Π° ΡΠΏΠ΅ΡΡΡΠ²Π°Π½Π΅ Π½Π° Π²ΡΠ΅ΠΌΠ΅. Π‘Π΅Π³Π° Π·Π½Π°ΡΠΈΡΠ΅Π»Π½ΠΎ ΡΠ΅ ΡΠ΅ ΡΡΠΊΠΎΡΠΈ, ΠΊΠ°ΡΠΎ Π³ΠΈ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΠ°ΠΌΠ΅ Π·Π°Π΅Π΄Π½ΠΎ Π½Π°Π²Π΅Π΄Π½ΡΠΆ:
lxc exec jupyterlab -- su -l jupyter -c "export JUPYTERLAB_DIR=$HOME/.local/share/jupyter/lab; jupyter lab build"Π‘Π΅Π³Π° ΠΈΠ·ΠΏΡΠ»Π½Π΅ΡΠ΅ ΡΠ»Π΅Π΄Π½ΠΈΡΠ΅ Π΄Π²Π΅ ΠΊΠΎΠΌΠ°Π½Π΄ΠΈ Π·Π° ΠΏΡΡΠ²ΠΎ ΡΡΠ°ΡΡΠΈΡΠ°Π½Π΅ JupyterLab. ΠΠΎΠΆΠ΅ΡΠ΅ Π΄Π° Π³ΠΎ ΡΡΠ°ΡΡΠΈΡΠ°ΠΌΠ΅ Ρ Π΅Π΄Π½Π° ΠΊΠΎΠΌΠ°Π½Π΄Π°, Π½ΠΎ Π² ΡΠΎΠ·ΠΈ ΡΠ»ΡΡΠ°ΠΉ, ΠΊΠΎΠΌΠ°Π½Π΄Π°ΡΠ° Π·Π° ΡΡΠ°ΡΡΠΈΡΠ°Π½Π΅, ΠΊΠΎΡΡΠΎ ΡΠ΅ ΡΡΡΠ±Π²Π° Π΄Π° ΠΏΠΎΠΌΠ½ΠΈΡΠ΅, ΡΠ΅ ΡΠ΅ Π·Π°ΠΏΠΎΠΌΠ½Ρ ΠΎΡ bash Π² ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ°, Π° Π½Π΅ Π½Π° Ρ ΠΎΡΡΠ°, ΠΊΡΠ΄Π΅ΡΠΎ ΠΊΠΎΠΌΠ°Π½Π΄ΠΈΡΠ΅ Π²Π΅ΡΠ΅ ΡΠ° Π΄ΠΎΡΡΠ°ΡΡΡΠ½ΠΈ Π·Π° Π·Π°ΠΏΠΈΡ Π² ΠΈΡΡΠΎΡΠΈΡΡΠ° π
ΠΠ»ΠΈΠ·Π°ΠΌΠ΅ Π² ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ° ΠΊΠ°ΡΠΎ ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π» jupyter:
lxc exec jupyterlab -- su -l jupyterΠ‘Π»Π΅Π΄ ΡΠΎΠ²Π° ΡΡΠ°ΡΡΠΈΡΠ°ΠΉΡΠ΅ JupyterLab Ρ ΠΊΠ»ΡΡΠΎΠ²Π΅ΡΠ΅ ΠΈ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΈΡΠ΅, ΠΊΠ°ΠΊΡΠΎ Π΅ ΡΠΊΠ°Π·Π°Π½ΠΎ:
[jupyter@jupyterlab ~]$ jupyter lab --ip=0.0.0.0 --no-browserΠΡΠ²ΠΎΡΠ΅ΡΠ΅ ΡΠ΅Π± Π±ΡΠ°ΡΠ·ΡΡΠ° Π½Π° Π°Π΄ΡΠ΅ΡΠ° http://10.0.5.5:8888 ΠΈ Π½Π° ΠΎΡΠ²ΠΎΡΠ΅Π½Π°ΡΠ° ΡΡΡΠ°Π½ΠΈΡΠ° Π²ΡΠ²Π΅Π΄Π΅ΡΠ΅ token Π΄ΠΎΡΡΡΠΏΠ°, ΠΊΠΎΠΉΡΠΎ ΡΠ΅ Π²ΠΈΠ΄ΠΈΡΠ΅ Π² ΠΊΠΎΠ½Π·ΠΎΠ»Π°ΡΠ°. ΠΠΎΠΏΠΈΡΠ°ΠΉΡΠ΅ Π³ΠΎ ΠΈ Π³ΠΎ ΠΏΠΎΡΡΠ°Π²Π΅ΡΠ΅ Π½Π° ΡΡΡΠ°Π½ΠΈΡΠ°ΡΠ°, ΡΠ»Π΅Π΄ ΡΠΎΠ²Π° Π½Π°ΡΠΈΡΠ½Π΅ΡΠ΅ ΠΡ ΠΎΠ΄. Π‘Π»Π΅Π΄ Π²Π»ΠΈΠ·Π°Π½Π΅ΡΠΎ, ΠΎΡΠΈΠ΄Π΅ΡΠ΅ ΠΎΡΠ»ΡΠ²ΠΎ Π² ΠΌΠ΅Π½ΡΡΠΎ Π½Π° ΡΠ°Π·ΡΠΈΡΠ΅Π½ΠΈΡΡΠ°, ΠΊΠ°ΠΊΡΠΎ Π΅ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π½Π° ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ ΠΏΠΎ-Π΄ΠΎΠ»Ρ, ΠΊΡΠ΄Π΅ΡΠΎ ΡΠ΅ Π²ΠΈ ΠΏΡΠ΅Π΄Π»ΠΎΠΆΠ°Ρ, ΠΏΡΠΈ Π°ΠΊΡΠΈΠ²ΠΈΡΠ°Π½Π΅ Π½Π° ΠΌΠ΅Π½ΠΈΠ΄ΠΆΡΡΠ° Π½Π° ΡΠ°Π·ΡΠΈΡΠ΅Π½ΠΈΡΡΠ°, Π΄Π° ΠΏΠΎΠ΅ΠΌΠ΅ΡΠ΅ ΡΠΈΡΠΊΠΎΠ²Π΅ΡΠ΅ ΠΏΠΎ ΡΠΈΠ³ΡΡΠ½ΠΎΡΡΡΠ°, ΠΊΠ°ΡΠΎ ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°ΡΠ΅ ΡΠ°Π·ΡΠΈΡΠ΅Π½ΠΈΡ ΠΎΡ ΡΡΠ΅ΡΠΈ ΡΡΡΠ°Π½ΠΈ, Π·Π° ΠΊΠΎΠΈΡΠΎ Π΅ΠΊΠΈΠΏΡΡ JupyterLab development Π½Π΅ Π½ΠΎΡΠΈ ΠΎΡΠ³ΠΎΠ²ΠΎΡΠ½ΠΎΡΡ:

ΠΠ±Π°ΡΠ΅, ΡΠΎΡΠ½ΠΎ Π·Π° ΡΠΎΠ²Π° ΠΈΠ·ΠΎΠ»ΠΈΡΠ°ΠΌΠ΅ ΠΈΠ·ΡΡΠ»ΠΎ JupyterLab ΠΈ Π³ΠΎ ΠΏΠΎΡΡΠ°Π²ΡΠΌΠ΅ Π² ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅Ρ, ΡΠ°ΠΊΠ° ΡΠ΅ ΡΡΡΠ°Π½ΠΈΡΠ½ΠΈ ΡΠ°Π·ΡΠΈΡΠ΅Π½ΠΈΡ, ΠΈΠ·ΠΈΡΠΊΠ²Π°ΡΠΈ ΠΈ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΡΠΈ NodeJS, Π½Π΅ ΠΌΠΎΠ³Π°Ρ Π΄Π° ΠΎΡΠΊΡΠ°Π΄Π½Π°Ρ Π΄Π°Π½Π½ΠΈ Π½Π° Π΄ΠΈΡΠΊΠ°, ΠΎΡΠ²Π΅Π½ ΡΠ΅Π·ΠΈ, ΠΊΠΎΠΈΡΠΎ ΡΠ΅ ΠΎΡΠ²ΠΎΡΠΈΠΌ Π² ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ°. ΠΠΎΡΡΡΠΏΡΡ Π΄ΠΎ Π²Π°ΡΠΈΡΠ΅ Π»ΠΈΡΠ½ΠΈ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠΈ Π½Π° Ρ
ΠΎΡΡΠ° /home ΠΎΡ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ° Π΅Π΄Π²Π° Π»ΠΈ Π±ΠΈ Π±ΠΈΠ» Π²ΡΠ·ΠΌΠΎΠΆΠ΅Π½, Π° Π°ΠΊΠΎ Π΅ Π²ΡΠ·ΠΌΠΎΠΆΠ΅Π½, Π·Π° ΡΠΎΠ²Π° ΡΡΡΠ±Π²Π° Π΄Π° ΠΈΠΌΠ°ΡΠ΅ ΠΏΡΠ°Π²Π° Π²ΡΡΡ
Ρ ΡΠ°ΠΉΠ»ΠΎΠ²Π΅ΡΠ΅ Π² Ρ
ΠΎΡΡΠΎΠ²Π°ΡΠ° ΡΠΈΡΡΠ΅ΠΌΠ°, ΡΡΠΉ ΠΊΠ°ΡΠΎ ΡΡΠ°ΡΡΠΈΡΠ°ΠΌΠ΅ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ° Π² Π½Π΅ΠΏΡΠΈΠ²ΠΈΠ»Π΅Π³ΠΈΡΠΎΠ²Π°Π½ ΡΠ΅ΠΆΠΈΠΌ. ΠΠ° Π±Π°Π·Π° Π½Π° ΡΠ°Π·ΠΈ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΠΎΡΠ΅Π½ΠΈΡΠ΅ ΡΠΈΡΠΊΠ° ΠΎΡ Π²ΠΊΠ»ΡΡΠ²Π°Π½Π΅ΡΠΎ Π½Π° ΡΠ°Π·ΡΠΈΡΠ΅Π½ΠΈΡ Π² JupyterLab.
Π‘ΡΠ·Π΄Π°Π΄Π΅Π½ΠΈΡΠ΅ IPython Π±Π΅Π»Π΅ΠΆΠ½ΠΈΡΠΈ (ΡΡΡΠ°Π½ΠΈΡΠΈ Π² JupyterLab) Π² ΠΌΠΎΠΌΠ΅Π½ΡΠ° ΡΠ΅ ΡΠ΅ ΡΡΠ·Π΄Π°Π²Π°Ρ Π² Π΄ΠΎΠΌΠ°ΡΠ½Π°ΡΠ° Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΡ Π½Π° ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»Ρ β /home/jupyter, Π½ΠΎ Π² Π½Π°ΡΠΈΡΠ΅ ΠΏΠ»Π°Π½ΠΎΠ²Π΅ Π΅ Π΄Π° ΡΠ°Π·Π΄Π΅Π»ΠΈΠΌ Π΄Π°Π½Π½ΠΈΡΠ΅ (Π΄Π° Π³ΠΈ ΡΠΏΠΎΠ΄Π΅Π»ΠΈΠΌ) ΠΌΠ΅ΠΆΠ΄Ρ Ρ
ΠΎΡΡΠ° ΠΈ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ°, Π·Π°ΡΠΎΠ²Π° ΡΠ΅ Π²ΡΡΠ½Π΅ΡΠ΅ Π² ΠΊΠΎΠ½Π·ΠΎΠ»Π°ΡΠ° ΠΈ ΡΠΏΠΈΡΠ°ΠΉΡΠ΅ JupyterLab ΠΈΠ·Π²ΡΡΡΠ²Π°ΠΉΠΊΠΈ Ρ
ΠΎΡΠΊΠ΅ΠΉ β CTRL+C ΠΈ ΠΎΡΠ³ΠΎΠ²ΠΎΡΠ΅ΡΠ΅ y Π½Π° Π·Π°ΠΏΠΈΡΠ²Π°Π½Π΅ΡΠΎ. Π‘Π»Π΅Π΄ ΡΠΎΠ²Π° ΠΏΡΠ΅ΠΊΡΠ°ΡΠ΅ΡΠ΅ ΠΈΠ½ΡΠ΅ΡΠ°ΠΊΡΠΈΠ²Π½Π°ΡΠ° ΡΠ΅ΡΠΈΡ Π½Π° ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»Ρ jupyter ΠΈΠ·Π²ΡΡΡΠ²Π°ΠΉΠΊΠΈ Ρ
ΠΎΡΠΊΠ΅ΠΉ CTRL+D.
Π‘ΠΏΠΎΠ΄Π΅Π»ΡΠΌΠ΅ Π΄Π°Π½Π½ΠΈ Ρ Ρ ΠΎΡΡΠ° ^
ΠΠ° Π΄Π° ΡΠΏΠΎΠ΄Π΅Π»ΠΈΡΠ΅ Π΄Π°Π½Π½ΠΈ Ρ Ρ ΠΎΡΡΠ°, ΡΡΡΠ±Π²Π° Π΄Π° ΡΡΠ·Π΄Π°Π΄Π΅ΡΠ΅ Π² ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ° ΡΡΡΡΠΎΠΉΡΡΠ²ΠΎ, ΠΊΠΎΠ΅ΡΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ²Π° ΡΠΎΠ²Π°, ΠΈ Π·Π° ΡΠΎΠ²Π° ΠΈΠ·ΠΏΡΠ»Π½Π΅ΡΠ΅ ΡΠ»Π΅Π΄Π½Π°ΡΠ° ΠΊΠΎΠΌΠ°Π½Π΄Π°, ΠΊΡΠ΄Π΅ΡΠΎ ΠΏΠΎΡΠΎΡΠ²Π°ΠΌΠ΅ ΡΠ»Π΅Π΄Π½ΠΈΡΠ΅ ΠΊΠ»ΡΡΠΎΠ²Π΅:
lxc config device addβ ΠΠΎΠΌΠ°Π½Π΄Π°ΡΠ° Π΄ΠΎΠ±Π°Π²Ρ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ Π½Π° ΡΡΡΡΠΎΠΉΡΡΠ²ΠΎΡΠΎjupyterβ ΠΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡ Π½Π° ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ°, Π² ΠΊΠΎΠΉΡΠΎ ΡΠ΅ Π΄ΠΎΠ±Π°Π²Ρ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΡΠ°hostfsβ ΠΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡ Π½Π° ΡΡΡΡΠΎΠΉΡΡΠ²ΠΎΡΠΎ. ΠΠΎΠΆΠ΅ΡΠ΅ Π΄Π° Π·Π°Π΄Π°Π΄Π΅ΡΠ΅ Π²ΡΡΠΊΠ°ΠΊΠ²ΠΎ ΠΈΠΌΠ΅.Π΄ΠΈΡΠΊβ ΠΠΎΡΠΎΡΠ²Π° ΡΠ΅ ΡΠΈΠΏΡΡ Π½Π° ΡΡΡΡΠΎΠΉΡΡΠ²ΠΎΡΠΎΠΏΡΡβ ΠΠΎΡΠΎΡΠ²Π° ΡΠ΅ ΠΏΡΡΡΡ Π² ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ°, ΠΊΡΠ΄Π΅ΡΠΎ LXD ΡΠ΅ ΠΌΠΎΠ½ΡΠΈΡΠ° ΡΠΎΠ²Π° ΡΡΡΡΠΎΠΉΡΡΠ²ΠΎΠΈΠ·ΡΠΎΡΠ½ΠΈΠΊβ ΠΠΎΡΠΎΡΠ²Π° ΡΠ΅ ΠΈΠ·ΡΠΎΡΠ½ΠΈΠΊ, ΠΏΡΡΡΡ ΠΊΡΠΌ Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΡ Π½Π° Ρ ΠΎΡΡΠ°, ΠΊΠΎΡΡΠΎ ΠΈΡΠΊΠ°ΡΠ΅ Π΄Π° ΡΠΏΠΎΠ΄Π΅Π»ΠΈΡΠ΅ Ρ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ°. Π£ΠΊΠ°ΠΆΠ΅ΡΠ΅ ΠΏΡΡΡ ΡΠΏΠΎΡΠ΅Π΄ Π²Π°ΡΠΈΡΠ΅ ΠΏΡΠ΅Π΄ΠΏΠΎΡΠΈΡΠ°Π½ΠΈΡ
lxc config device add jupyterlab hostfs disk path=\/mnt\/hostfs source=\/home\/dv\/projects\/ipython-notebooksΠΠ° Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΡ /home/dv/projects/ipython-notebooks ΡΡΡΠ±Π²Π° Π΄Π° Π±ΡΠ΄Π΅ Π·Π°Π΄Π°Π΄Π΅Π½ΠΎ ΡΠ°Π·ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ Π½Π° ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ½ΠΈΡ ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π», ΠΊΠΎΠΉΡΠΎ Π² ΠΌΠΎΠΌΠ΅Π½ΡΠ° ΠΈΠΌΠ° UID ΡΠ°Π²Π΅Π½ Π½Π° SubUID + UID, Π²ΠΈΠΆΡΠ΅ Π³Π»Π°Π²Π° Π‘ΠΈΠ³ΡΡΠ½ΠΎΡΡ. ΠΡΠΈΠ²ΠΈΠ»Π΅Π³ΠΈΠΈ Π½Π° ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠΈΡΠ΅ Π² ΡΡΠ°ΡΠΈΡΡΠ° ΠΡΠ½ΠΎΠ²Π½ΠΈ Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ Π½Π° LXD β ΡΠΈΡΡΠ΅ΠΌΠΈ Π·Π° ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠΈ Π² Linux.
ΠΠ°ΡΡΡΠΎΠΉΠ²Π°ΠΌΠ΅ ΡΠ°Π·ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ Π½Π° Ρ
ΠΎΡΡΠ°, ΠΊΡΠ΄Π΅ΡΠΎ ΡΠΎΠ±ΡΡΠ²Π΅Π½ΠΈΠΊΡΡ ΡΠ΅ Π±ΡΠ΄Π΅ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ½ΠΈΡΡ ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π» jupyter, Π° ΠΏΡΠΎΠΌΠ΅Π½Π»ΠΈΠ²Π°ΡΠ° $USER ΡΠ΅ Π·Π°Π΄Π°Π΄Π΅ Π²Π°ΡΠΈΡ Ρ
ΠΎΡΡΠΎΠ² ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π» ΠΊΠ°ΡΠΎ Π³ΡΡΠΏΠ°:
sudo chown 1001000:$USER \/home\/dv\/projects\/ipython-notebooksΠΠ΄ΡΠ°Π²Π΅ΠΉ, ΡΠ²ΡΡ! ^
ΠΠΊΠΎ ΠΈΠΌΠ°ΡΠ΅ ΠΎΡΠ²ΠΎΡΠ΅Π½Π° ΠΊΠΎΠ½Π·ΠΎΠ»Π½Π° ΡΠ΅ΡΠΈΡ Π² ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ° Ρ JupyterLab, ΡΠ΅ΡΡΠ°ΡΡΠΈΡΠ°ΠΉΡΠ΅ Ρ Ρ Π½ΠΎΠ²ΠΈΡ ΠΊΠ»ΡΡ --notebook-dir Π·Π°Π΄Π°Π²Π°ΠΉΠΊΠΈ ΡΡΠΎΠΉΠ½ΠΎΡΡ /mnt/hostfs ΠΊΠ°ΡΠΎ ΠΏΡΡ Π΄ΠΎ ΠΊΠΎΡΠ΅Π½Π° Π½Π° Π½ΠΎΡΡΠ±ΡΡΠΈΡΠ΅ Π² ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ° Π·Π° ΡΡΡΡΠΎΠΉΡΡΠ²ΠΎΡΠΎ, ΠΊΠΎΠ΅ΡΠΎ ΡΡΠ·Π΄Π°Π΄ΠΎΡ
ΠΌΠ΅ Π² ΠΏΡΠ΅Π΄ΠΈΡΠ½Π°ΡΠ° ΡΡΡΠΏΠΊΠ°:
jupyter lab --ip=0.0.0.0 --no-browser --notebook-dir=\/mnt\/hostfsΠ‘Π»Π΅Π΄ ΡΠΎΠ²Π° ΠΎΡΠΈΠ΄Π΅ΡΠ΅ Π½Π° ΡΡΡΠ°Π½ΠΈΡΠ°ΡΠ° http://10.0.5.5:8888 ΠΈ ΡΡΠ·Π΄Π°ΠΉΡΠ΅ ΠΏΡΡΠ²ΠΈΡ ΡΠΈ Π½ΠΎΡΡΠ±ΡΠΊ, Π½Π°ΡΠΈΡΠΊΠ°ΠΉΠΊΠΈ Π±ΡΡΠΎΠ½Π° Π½Π° ΡΡΡΠ°Π½ΠΈΡΠ°ΡΠ°, ΠΊΠ°ΠΊΡΠΎ Π΅ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π½Π° ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ ΠΏΠΎ-Π΄ΠΎΠ»Ρ:

Π‘Π»Π΅Π΄ ΡΠΎΠ²Π° Π² ΠΏΠΎΠ»Π΅ΡΠΎ Π½Π° ΡΡΡΠ°Π½ΠΈΡΠ°ΡΠ° Π²ΡΠ²Π΅Π΄Π΅ΡΠ΅ ΠΊΠΎΠ΄ Π½Π° Python, ΠΊΠΎΠΉΡΠΎ ΡΠ΅ ΠΈΠ·Π²Π΅Π΄Π΅ ΠΊΠ»Π°ΡΠΈΡΠ΅ΡΠΊΠΈΡ Hello World!. Π‘Π»Π΅Π΄ Π·Π°Π²ΡΡΡΠ²Π°Π½Π΅ Π½Π° Π²ΡΠ²Π΅ΠΆΠ΄Π°Π½Π΅ΡΠΎ, Π½Π°ΡΠΈΡΠ½Π΅ΡΠ΅ CTRL+ENTER ΠΈΠ»ΠΈ Π±ΡΡΠΎΠ½Π° βplayβ Π½Π° Π»Π΅Π½ΡΠ°ΡΠ° Ρ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΠΈ ΠΎΡΠ³ΠΎΡΠ΅, Π·Π° Π΄Π° JupyterLab ΠΈΠ·ΠΏΡΠ»Π½ΠΈ ΡΠΎΠ²Π°:

ΠΡΠΈ ΡΠΎΠ²Π° ΠΏΠΎΡΡΠΈ Π²ΡΠΈΡΠΊΠΎ Π΅ Π³ΠΎΡΠΎΠ²ΠΎ Π·Π° ΡΠΏΠΎΡΡΠ΅Π±Π°, Π½ΠΎ ΡΠ΅ Π±ΡΠ΄Π΅ ΠΌΠ°Π»ΠΊΠΎ ΡΠΊΡΡΠ½ΠΎ, Π°ΠΊΠΎ Π½Π΅ ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°ΠΌΠ΅ Π΄ΠΎΠΏΡΠ»Π½ΠΈΡΠ΅Π»Π½ΠΈ Python ΠΌΠΎΠ΄ΡΠ»ΠΈ (ΠΏΡΠ»Π½ΠΎΡΠ΅Π½Π½ΠΈ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ), ΠΊΠΎΠΈΡΠΎ Π·Π½Π°ΡΠΈΡΠ΅Π»Π½ΠΎ ΡΠ°Π·ΡΠΈΡΡΠ²Π°Ρ ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΠΈΡΠ΅ Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ Π½Π° Python Π² JupyterLab, Π·Π°ΡΠΎΠ²Π° ΠΏΡΠΎΠ΄ΡΠ»ΠΆΠ°Π²Π°ΠΌΠ΅ Π½Π°ΠΏΡΠ΅Π΄ π
P.S. ΠΠ½ΡΠ΅ΡΠ΅ΡΠ½ΠΎΡΠΎ Π΅, ΡΠ΅ ΡΡΠ°ΡΠ°ΡΠ° Π²Π΅ΡΡΠΈΡ Jupyter Ρ ΠΊΠΎΠ΄ΠΎΠ²ΠΎ ΠΈΠΌΠ΅ Jupyter Notebook Π½Π΅ Π΅ ΠΈΠ·ΡΠ΅Π·Π½Π°Π»Π° ΠΈ ΡΡΡΠ΅ΡΡΠ²ΡΠ²Π° ΠΏΠ°ΡΠ°Π»Π΅Π»Π½ΠΎ Ρ JupyterLab. ΠΠ° Π΄Π° ΠΏΡΠ΅ΠΌΠΈΠ½Π΅ΡΠ΅ ΠΊΡΠΌ ΡΡΠ°ΡΠ°ΡΠ° Π²Π΅ΡΡΠΈΡ, ΠΎΡΠΈΠ΄Π΅ΡΠ΅ Π½Π° Π»ΠΈΠ½ΠΊΠ°, Π΄ΠΎΠ±Π°Π²ΡΠΉΠΊΠΈ ΡΡΡΠΈΠΊΡ Π² Π°Π΄ΡΠ΅ΡΠ°/tree, Π° ΠΏΡΠ΅ΠΌΠΈΠ½Π°Π²Π°Π½Π΅ΡΠΎ ΠΊΡΠΌ Π½ΠΎΠ²Π°ΡΠ° Π²Π΅ΡΡΠΈΡ ΡΡΠ°Π²Π° Ρ ΡΡΡΠΈΠΊΡ /lab, Π½ΠΎ Π½Π΅ Π΅ Π·Π°Π΄ΡΠ»ΠΆΠΈΡΠ΅Π»Π½ΠΎ Π΄Π° ΡΠ΅ ΠΏΠΎΡΠΎΡΠ²Π°:
- Jupyter Notebook β http://10.0.5.5:8888/tree
- Jupyter Lab β http://10.0.5.5:8888/lab
Π Π°Π·ΡΠΈΡΡΠ²Π°ΠΌΠ΅ Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈΡΠ΅ Π½Π° Python ^
Π ΡΠΎΠ·ΠΈ ΡΠ°Π·Π΄Π΅Π» ΡΠ΅ ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°ΠΌΠ΅ ΠΌΠΎΡΠ½ΠΈ ΠΌΠΎΠ΄ΡΠ»ΠΈ Π½Π° Π΅Π·ΠΈΠΊΠ° Python ΠΊΠ°ΡΠΎ NumPy, Pandas, Matplotlib, IPyWidgets ΡΠ΅Π·ΡΠ»ΡΠ°ΡΠΈΡΠ΅ ΠΎΡ ΡΠ°Π±ΠΎΡΠ°ΡΠ° Π½Π° ΠΊΠΎΠΈΡΠΎ ΡΠ΅ ΠΈΠ½ΡΠ΅Π³ΡΠΈΡΠ°Ρ Π² Π½ΠΎΡΡΠ±ΡΡΠΈΡΠ΅ JupyterLab.
ΠΡΠ΅Π΄ΠΈ Π΄Π° ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°ΠΌΠ΅ ΠΈΠ·Π±ΡΠΎΠ΅Π½ΠΈΡΠ΅ ΠΌΠΎΠ΄ΡΠ»ΠΈ Python ΡΡΠ΅Π· ΠΏΠ°ΠΊΠ΅ΡΠ½ΠΈΡ ΠΌΠ΅Π½ΠΈΠ΄ΠΆΡΡ pip ΠΏΡΡΠ²ΠΎ ΡΡΡΠ±Π²Π° Π΄Π° ΡΠ°Π·ΡΠ΅ΡΠΈΠΌ ΡΠΈΡΡΠ΅ΠΌΠ½ΠΈΡΠ΅ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ Π² Alpine Linux:
g++β ΠΠ΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌ Π·Π° ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΠ°Π½Π΅ Π½Π° ΠΌΠΎΠ΄ΡΠ»ΠΈΡΠ΅, ΡΡΠΉ ΠΊΠ°ΡΠΎ Π½ΡΠΊΠΎΠΈ ΠΎΡ ΡΡΡ ΡΠ° ΡΠ΅Π°Π»ΠΈΠ·ΠΈΡΠ°Π½ΠΈ Π½Π° Π΅Π·ΠΈΠΊ C++ ΠΈ ΡΠ΅ ΡΠ²ΡΡΠ·Π²Π°Ρ Ρ Python Π² ΡΠ΅Π°Π»Π½ΠΎ Π²ΡΠ΅ΠΌΠ΅ ΠΊΠ°ΡΠΎ Π±ΠΈΠ½Π°ΡΠ½ΠΈ ΠΌΠΎΠ΄ΡΠ»ΠΈfreetype-devβ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡ Π·Π° Python ΠΌΠΎΠ΄ΡΠ»Π° Matplotlib
ΠΠ½ΡΡΠ°Π»ΠΈΡΠ°ΠΌΠ΅ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈΡΠ΅:
lxc exec jupyterlab -- apk add g++ freetype-devΠΠΌΠ° Π΅Π΄ΠΈΠ½ ΠΏΡΠΎΠ±Π»Π΅ΠΌ, Π² ΡΠ΅ΠΊΡΡΠΎΡΠΎ ΡΡΡΡΠΎΡΠ½ΠΈΠ΅ Π½Π° Π΄ΠΈΡΡΡΠΈΠ±ΡΡΠΈΡΡΠ° Alpine Linux Π½Π΅ ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΠ° Π½ΠΎΠ²Π° Π²Π΅ΡΡΠΈΡ Π½Π° NumPy, ΠΏΠΎΠ»ΡΡΠ°Π²Π° ΡΠ΅ ΠΊΠΎΠΌΠΏΠΈΠ»Π°ΡΠΈΠΎΠ½Π½Π° Π³ΡΠ΅ΡΠΊΠ°, ΠΊΠΎΡΡΠΎ Π½Π΅ ΡΡΠΏΡΡ Π΄Π° ΡΠ°Π·ΡΠ΅ΡΠ°:
ΠΠ ΠΠ¨ΠΠ: ΠΠ΅ ΠΌΠΎΠΆΠ° Π΄Π° Π±ΡΠ΄Π°Ρ ΠΈΠ·Π³ΡΠ°Π΄Π΅Π½ΠΈ ΠΊΠΎΠ»Π΅Π»Π° Π·Π° numpy, ΠΊΠΎΠΈΡΠΎ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ PEP 517 ΠΈ Π½Π΅ ΠΌΠΎΠ³Π°Ρ Π΄Π° Π±ΡΠ΄Π°Ρ ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°Π½ΠΈ Π΄ΠΈΡΠ΅ΠΊΡΠ½ΠΎ
Π‘Π»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»Π½ΠΎ, ΡΠΎΠ·ΠΈ ΠΌΠΎΠ΄ΡΠ» ΡΠ΅ Π³ΠΎ ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°ΠΌΠ΅ ΠΊΠ°ΡΠΎ ΡΠΈΡΡΠ΅ΠΌΠ΅Π½ ΠΏΠ°ΠΊΠ΅Ρ, ΠΊΠΎΠΉΡΠΎ ΡΠ°Π·ΠΏΡΠΎΡΡΡΠ°Π½ΡΠ²Π° Π²Π΅ΡΠ΅ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΠ°Π½Π° Π²Π΅ΡΡΠΈΡ, Π½ΠΎ ΠΌΠ°Π»ΠΊΠΎ ΠΏΠΎ-ΡΡΠ°ΡΠ° ΠΎΡ ΡΠ°Π·ΠΈ, ΠΊΠΎΡΡΠΎ Π΅ Π½Π°Π»ΠΈΡΠ½Π° Π² ΠΌΠΎΠΌΠ΅Π½ΡΠ° Π½Π° ΡΠ°ΠΉΡΠ°:
lxc exec jupyterlab -- apk add py3-numpy py3-numpy-devΠ‘Π»Π΅Π΄ ΡΠΎΠ²Π° ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°ΠΌΠ΅ Python ΠΌΠΎΠ΄ΡΠ»ΠΈΡΠ΅ ΡΡΠ΅Π· ΠΏΠ°ΠΊΠ΅ΡΠ½ΠΈΡ ΠΌΠ΅Π½ΠΈΠ΄ΠΆΡΡ pip. ΠΡΠ΄Π΅ΡΠ΅ ΡΡΡΠΏΠ΅Π»ΠΈΠ²ΠΈ, ΡΡΠΉ ΠΊΠ°ΡΠΎ Π½ΡΠΊΠΎΠΈ ΠΌΠΎΠ΄ΡΠ»ΠΈ ΡΠ΅ ΡΠ΅ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΠ°Ρ ΠΈ ΡΠΎΠ²Π° ΡΠ΅ ΠΎΡΠ½Π΅ΠΌΠ΅ Π½ΡΠΊΠΎΠ»ΠΊΠΎ ΠΌΠΈΠ½ΡΡΠΈ. ΠΠ° ΠΌΠΎΡΡΠ° ΠΌΠ°ΡΠΈΠ½Π° ΠΊΠΎΠΌΠΏΠΈΠ»Π°ΡΠΈΡΡΠ° ΠΎΡΠ½Π΅ ΠΎΠΊΠΎΠ»ΠΎ 15 ΠΌΠΈΠ½ΡΡΠΈ:
lxc exec jupyterlab -- python3 -m pip install pandas ipywidgets matplotlibΠΠΎΡΠΈΡΡΠ²Π°ΠΌΠ΅ ΠΊΠ΅ΡΠ° Π½Π° ΠΈΠ½ΡΡΠ°Π»Π°ΡΠΈΠΈΡΠ΅:
lxc exec jupyterlab -- rm -rf /home/*/.cache/pip/*
lxc exec jupyterlab -- rm -rf /root/.cache/pip/*Π’Π΅ΡΡΠ²Π°Π½Π΅ Π½Π° ΠΌΠΎΠ΄ΡΠ»ΠΈ Π² JupyterLab ^
ΠΠΊΠΎ ΠΈΠΌΠ°ΡΠ΅ ΡΡΠ°ΡΡΠΈΡΠ°Π½ JupyterLab, ΡΠ΅ΡΡΠ°ΡΡΠΈΡΠ°ΠΉΡΠ΅ Π³ΠΎ, Π·Π° Π΄Π° ΡΠ΅ Π°ΠΊΡΠΈΠ²ΠΈΡΠ°Ρ Π½ΠΎΠ²ΠΎΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°Π½ΠΈΡΠ΅ ΠΌΠΎΠ΄ΡΠ»ΠΈ. ΠΠ° ΡΠ΅Π»ΡΠ° Π² ΠΊΠΎΠ½Π·ΠΎΠ»Π½Π°ΡΠ° ΡΠ΅ΡΠΈΡ Π½Π°ΡΠΈΡΠ½Π΅ΡΠ΅ CTRL+C ΡΠ°ΠΌ, ΠΊΡΠ΄Π΅ΡΠΎ Π΅ ΡΡΠ°ΡΡΠΈΡΠ°Π½ ΠΈ Π²ΡΠ²Π΅Π΄Π΅ΡΠ΅ y Π½Π° Π·Π°ΠΏΠΈΡΠ²Π°Π½Π΅ΡΠΎ Π·Π° ΡΠΏΠΈΡΠ°Π½Π΅, Π° ΡΠ»Π΅Π΄ ΡΠΎΠ²Π° ΡΡΠ°ΡΡΠΈΡΠ°ΠΉΡΠ΅ ΠΎΡΠ½ΠΎΠ²ΠΎ JupyterLab ΠΊΠ°ΡΠΎ Π½Π°ΡΠΈΡΠ½Π΅ΡΠ΅ ΡΡΡΠ΅Π»ΠΊΠ°ΡΠ° Π½Π°Π³ΠΎΡΠ΅ Π½Π° ΠΊΠ»Π°Π²ΠΈΠ°ΡΡΡΠ°ΡΠ°, Π·Π° Π΄Π° Π½Π΅ Π²ΡΠ²Π΅ΠΆΠ΄Π°ΡΠ΅ ΠΊΠΎΠΌΠ°Π½Π΄Π°ΡΠ° ΠΎΡΠ½ΠΎΠ²ΠΎ ΠΈ ΡΠ»Π΅Π΄ ΡΠΎΠ²Π° Enter Π·Π° Π΄Π° ΡΡΠ°ΡΡΠΈΡΠ°ΡΠ΅:
jupyter lab --ip=0.0.0.0 --no-browser --notebook-dir=\/mnt\/hostfsΠΡΠΈΠ΄Π΅ΡΠ΅ Π½Π° ΡΡΡΠ°Π½ΠΈΡΠ°ΡΠ° http://10.0.5.5:8888/lab ΠΈΠ»ΠΈ ΠΎΠ±Π½ΠΎΠ²Π΅ΡΠ΅ ΡΡΡΠ°Π½ΠΈΡΠ°ΡΠ° Π² Π±ΡΠ°ΡΠ·ΡΡΠ°, Π° ΡΠ»Π΅Π΄ ΡΠΎΠ²Π° Π²ΡΠ²Π΅Π΄Π΅ΡΠ΅ ΡΠ»Π΅Π΄Π½ΠΈΡ ΠΊΠΎΠ΄ Π² Π½ΠΎΠ²Π° ΠΊΠ»Π΅ΡΠΊΠ° Π½Π° ΡΠ΅ΡΡΠ°Π΄ΠΊΠ°ΡΠ°:
%matplotlib inline
from ipywidgets import interactive
import matplotlib.pyplot as plt
import numpy as np
def f(m, b):
plt.figure(2)
x = np.linspace(-10, 10, num=1000)
plt.plot(x, m * x + b)
plt.ylim(-5, 5)
plt.show()
interactive_plot = interactive(f, m=(-2.0, 2.0), b=(-3, 3, 0.5))
output = interactive_plot.children[-1]
output.layout.height = '350px'
interactive_plotΠ’ΡΡΠ±Π²Π° Π΄Π° ΠΏΠΎΠ»ΡΡΠΈΡΠ΅ ΡΠ΅Π·ΡΠ»ΡΠ°Ρ, ΠΊΠ°ΡΠΎ Π½Π° ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ ΠΏΠΎ-Π΄ΠΎΠ»Ρ, ΠΊΡΠ΄Π΅ΡΠΎ IPyWidgets Π³Π΅Π½Π΅ΡΠΈΡΠ° UI Π΅Π»Π΅ΠΌΠ΅Π½Ρ Π½Π° ΡΡΡΠ°Π½ΠΈΡΠ°ΡΠ°, ΠΊΠΎΠΉΡΠΎ ΠΈΠ½ΡΠ΅ΡΠ°ΠΊΡΠΈΠ²Π½ΠΎ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²Π° Ρ ΠΈΠ·Ρ ΠΎΠ΄Π½ΠΈΡ ΠΊΠΎΠ΄, Π° ΡΡΡΠΎ ΡΠ°ΠΊΠ° Matplotlib ΠΈΠ·Π²Π΅ΠΆΠ΄Π° ΡΠ΅Π·ΡΠ»ΡΠ°ΡΠ° ΠΎΡ ΠΊΠΎΠ΄Π° ΠΏΠΎΠ΄ ΡΠΎΡΠΌΠ°ΡΠ° Π½Π° ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅, ΠΊΠ°ΡΠΎ Π³ΡΠ°ΡΠΈΠΊ Π½Π° ΡΡΠ½ΠΊΡΠΈΡΡΠ°:

ΠΠ½ΠΎΠ³ΠΎ ΠΏΡΠΈΠΌΠ΅ΡΠΈ IPyWidgets ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° Π½Π°ΠΌΠ΅ΡΠΈΡΠ΅ Π² ΡΡΠΎΡΠΈΡΠ΅ ΡΡΠΊ
ΠΠ°ΠΊΠ²ΠΎ ΠΎΡΠ΅? ^
ΠΡΠ°Π²ΠΎ Π½Π° Π²Π°Ρ, Π°ΠΊΠΎ ΡΡΠ΅ ΠΎΡΡΠ°Π½Π°Π»ΠΈ ΠΈ ΡΡΠΈΠ³Π½Π°Π»ΠΈ Π΄ΠΎ ΠΊΡΠ°Ρ Π½Π° ΡΡΠ°ΡΠΈΡΡΠ°. Π£ΠΌΠΈΡΠ»Π΅Π½ΠΎ Π½Π΅ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²ΠΈΡ Π³ΠΎΡΠΎΠ² ΡΠΊΡΠΈΠΏΡ Π² ΠΊΡΠ°Ρ Π½Π° ΡΡΠ°ΡΠΈΡΡΠ°, ΠΊΠΎΠΉΡΠΎ Π΄Π° ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ° JupyterLab Ρ βΠ΅Π΄ΠΈΠ½ ΠΊΠ»ΠΈΠΊβ, Π·Π° Π΄Π° ΠΏΠΎΠΎΡΡΡ ΡΠ°Π±ΠΎΡΠ΅ΡΠΈΡΠ΅ π ΠΠΎ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° Π½Π°ΠΏΡΠ°Π²ΠΈΡΠ΅ ΡΠΎΠ²Π° ΡΠ°ΠΌΠΈ, ΡΡΠΉ ΠΊΠ°ΡΠΎ Π²Π΅ΡΠ΅ Π·Π½Π°Π΅ΡΠ΅ ΠΊΠ°ΠΊ, ΡΡΠ±ΠΈΡΠ°ΠΉΠΊΠΈ ΠΊΠΎΠΌΠ°Π½Π΄ΠΈΡΠ΅ Π² Π΅Π΄ΠΈΠ½ Bash ΡΠΊΡΠΈΠΏΡ π
Π‘ΡΡΠΎ ΡΠ°ΠΊΠ°, ΠΌΠΎΠΆΠ΅ΡΠ΅:
- ΠΠ° Π·Π°Π΄Π°Π΄Π΅ΡΠ΅ ΠΌΡΠ΅ΠΆΠΎΠ²ΠΎ ΠΈΠΌΠ΅ Π·Π° ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ° Π²ΠΌΠ΅ΡΡΠΎ IP Π°Π΄ΡΠ΅Ρ, Π²ΡΠ²Π΅Π΄Π΅ΡΠ΅ Π³ΠΎ Π² ΠΏΡΠΎΡΡ
/etc/hostsΠΈ Π² Π±ΡΠ°ΡΠ·ΡΡΠ° Π΄Π° ΠΏΠΈΡΠ΅ΡΠ΅ Π°Π΄ΡΠ΅ΡΠ° http://jupyter.local:8888 - ΠΠ³ΡΠ°ΠΉΡΠ΅ Ρ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΡΡΠ° Π½Π° ΡΠ΅ΡΡΡΡΠΈΡΠ΅ Π·Π° ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ°, Π·Π° ΠΊΠΎΠ΅ΡΠΎ ΠΏΡΠΎΡΠ΅ΡΠ΅ΡΠ΅ Π³Π»Π°Π²Π°ΡΠ° Π² ΠΎΡΠ½ΠΎΠ²Π½ΠΈΡΠ΅ Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ Π½Π° LXD ΠΈΠ»ΠΈ ΠΏΠΎΠ»ΡΡΠ΅ΡΠ΅ ΠΏΠΎΠ²Π΅ΡΠ΅ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ Π½Π° ΡΠ°ΠΉΡΠ° Π½Π° ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΠ° LXD.
- Π‘ΠΌΠ΅Π½Π΅ΡΠ΅ ΡΠ΅ΠΌΠ°ΡΠ° Π½Π° ΠΎΡΠΎΡΠΌΠ»Π΅Π½ΠΈΠ΅ΡΠΎ:

Π ΠΌΠ½ΠΎΠ³ΠΎ Π΄ΡΡΠ³ΠΈ Π½Π΅ΡΠ°, ΠΊΠΎΠΈΡΠΎ ΠΌΠΎΠΆΠ΅ΡΠ΅! Π’ΠΎΠ²Π° Π΅ Π²ΡΠΈΡΠΊΠΎ. ΠΠ΅Π»Π°Ρ Π²ΠΈ ΡΡΠΏΠ΅Ρ !
ΠΠΠ’Π£ΠΠΠΠΠΠ¦ΠΠ―: 15.04.2020 18:30 β ΠΠΎΠΏΡΠ°Π²ΠΈΡ
Π³ΡΠ΅ΡΠΊΠΈΡΠ΅ Π² Π³Π»Π°Π²Π° Β«ΠΠ΄ΡΠ°Π²Π΅ΠΉ, ΡΠ²ΡΡ!Β»
ΠΠΠ’Π£ΠΠΠΠΠΠ¦ΠΠ―: 16.04.2020 10:00 β ΠΠΎΡΠΈΠ³ΠΈΡΠ°Ρ
ΠΈ Π΄ΠΎΠ±Π°Π²ΠΈΡ
ΡΠ΅ΠΊΡΡ Π² ΠΎΠΏΠΈΡΠ°Π½ΠΈΠ΅ΡΠΎ Π½Π° Π°ΠΊΡΠΈΠ²Π°ΡΠΈΡΡΠ° Π½Π° ΠΌΠ΅Π½ΠΈΠ΄ΠΆΡΡΠ° Π½Π° ΡΠ°Π·ΡΠΈΡΠ΅Π½ΠΈΡ JupyterLab
ΠΠΠ’Π£ΠΠΠΠΠΠ¦ΠΠ―: 16.04.2020 10:40 β ΠΠΎΠΏΡΠ°Π²ΠΈΡ
ΠΎΡΠΊΡΠΈΡΠΈΡΠ΅ Π³ΡΠ΅ΡΠΊΠΈ Π² ΡΠ΅ΠΊΡΡΠ° ΠΈ ΠΌΠ°Π»ΠΊΠΎ ΠΏΠΎΠ΄ΠΎΠ±ΡΠΈΡ
Π³Π»Π°Π²Π°ΡΠ° Β«ΠΠ½ΡΡΠ°Π»ΠΈΡΠ°Π½Π΅ Π½Π° ΠΎΡΠ½ΠΎΠ²Π½ΠΈΡ ΡΠΎΡΡΡΠ΅Ρ ΠΈ Π½Π°ΡΡΡΠΎΠΉΠΊΠ° Π½Π° ΡΠΈΡΡΠ΅ΠΌΠ°ΡΠ°Β»
ΠΠ·ΡΠΎΡΠ½ΠΈΠΊ: habr.com
