ã³ãŒããã·ã¹ãã ãŠãŒãã£ãªãã£ãå®éšããããšã¯ãããŸããïŒ Linux ã€ãŸããrootæš©éã§å®è¡ããå¿ èŠã®ããã³ãŒãã«ãšã©ãŒãçºçããå Žåã§ããåºç€ãšãªãã·ã¹ãã ãå¿é ãããããã¹ãŠãç Žå£ãããããå¿ èŠããªããšããããšã§ããïŒ
ããšãã°ãåäžã®ãã·ã³äžã§ããŸããŸãªãã€ã¯ããµãŒãã¹ã®ã¯ã©ã¹ã¿ãŒå šäœããã¹ããŸãã¯å®è¡ããå¿ èŠãããå Žåã¯ã©ãã§ãããã? 100 åãããã㯠1,000 åã§ãããã?
ãã€ããŒãã€ã¶ã§ç®¡çãããä»®æ³ãã·ã³ã¯ããããåé¡ã解決ã§ãããããããªããããã®ä»£åã¯ã©ãã»ã©å€§ããã ãããïŒäŸãã°ãAlpineãã£ã¹ããªãã¥ãŒã·ã§ã³ã«åºã¥ãLXDã³ã³ããã®å Žåã Linux æ¶è²»ãšãã«ã®ãŒã¯ãããããã§ã 7.60MB RAMãããã³èµ·ååŸã«ã«ãŒãããŒãã£ã·ã§ã³ãå ããå Žæ 9.5MBïŒã©ãæããŸãããã€ãŒãã³ã»ãã¹ã¯ããïŒãã²èªãã§ã¿ãŠãã ãã LXDã®åºæ¬æ©èœ - ã³ã³ããã·ã¹ãã Linux
LXD ã³ã³ãããŒã®æŠèŠãããã£ãã®ã§ã次ã«ããã¹ã ã³ãŒããå®å šã«å®è¡ããã°ã©ããçæããUI ãŠã£ãžã§ãããã³ãŒãã«åç (察話å) ã«ãã€ã³ãããããã¹ãããã©ãã¯ãžã£ãã¯ãªã©ã®æžåŒèšå®ã䜿çšããŠã³ãŒããæ¡åŒµã§ãããã©ãããã©ãŒã ã®çµã¿åããããã£ããã©ããªãããèããŠã¿ãŸããããã€ã³ã¿ã©ã¯ãã£ããªããã°ã®ãããªãã®ã§ãã?ããâŠæ¬²ããïŒæ¬²ããïŒ ð
ã³ã³ããã§çºå°ããã«ããã®äžãèŠãŠãã ãã ãžã¥ãã¿ãŒã©ã â æä»£é ãã®Jupyter Notebookã«ä»£ããæ¬¡äžä»£ã®ãŠãŒã¶ãŒã€ã³ã¿ãŒãã§ãŒã¹ããããŠæ¬¡ã®ãããªPythonã¢ãžã¥ãŒã«ãã€ã³ã¹ããŒã«ã§ããŸãã NumPy, ãã³ã, matplotlib, IPyWidgets ããã«ãããäžèšã®ãã¹ãŠãå®è¡ãããã¹ãŠãç¹å¥ãªãã¡ã€ã« (IPython ã©ããããã) ã«ä¿åã§ããããã«ãªããŸãã

ããã²ãŒã·ã§ã³
- è»éé¢éžèšç»
- åºæ¬ã·ã¹ãã ã®ã€ã³ã¹ããŒã«ãšèšå®
- åºæ¬ãœãããŠã§ã¢ã®ã€ã³ã¹ããŒã«ãšã·ã¹ãã ã®èšå®
- JupyterLabã®ã€ã³ã¹ããŒã«ãšèšå®
- ãã¹ããšããŒã¿ãå ±æãã
- ããã«ã¡ã¯äžçïŒ
- Pythonã®æ©èœæ¡åŒµ
- JupyterLabã§ã®ã¢ãžã¥ãŒã«ã®ãã¹ã
- ä»ã«äœããããŸããïŒ
è»éé¢éžèšç» ^

äžèšã®èšç»ãããç°¡åã«å®è¡ã§ããããã«ãç°¡åãªè¡åèšç»ãæŠèª¬ããŸãããã
- ãã£ã¹ããªãã¥ãŒã·ã§ã³ã«åºã¥ããŠã³ã³ãããã€ã³ã¹ããŒã«ããŠå®è¡ããŠã¿ãŸããã é«å±± Linuxããã®ãã£ã¹ããªãã¥ãŒã·ã§ã³ã䜿çšããçç±ã¯ãããããªãºã ãç®çãšããŠãããæãå¿ èŠãªãœãããŠã§ã¢ã®ã¿ãã€ã³ã¹ããŒã«ããäœåãªãã®ã¯ã€ã³ã¹ããŒã«ããªãããã§ãã
- ã³ã³ããã«ä»®æ³ãã£ã¹ã¯ã远å ããŠååãä»ããŸãããã
hostfsãããã«ãŒã FS ã«ããŠã³ãããŸãããã®ãã£ã¹ã¯ã䜿çšãããšãã³ã³ããå ã®æå®ããããã£ã¬ã¯ããªãããã¹ãäžã®ãã¡ã€ã«ã䜿çšã§ããããã«ãªããŸãããã®æ¹æ³ã§ã¯ãããŒã¿ã¯ã³ã³ããããç¬ç«ããŸããã³ã³ãããåé€ãããŠããããŒã¿ã¯ãã¹ãäžã«æ®ããŸãããŸãããã®ã¹ããŒã ã¯ãã³ã³ãããã£ã¹ããªãã¥ãŒã·ã§ã³ã®æšæºãããã¯ãŒã¯ã¡ã«ããºã ã䜿çšããã«ãå€ãã®ã³ã³ããéã§åãããŒã¿ãå ±æããå Žåã«ã圹ç«ã¡ãŸãã - Bashãsudoãå¿ èŠãªã©ã€ãã©ãªãã€ã³ã¹ããŒã«ããã·ã¹ãã ãŠãŒã¶ãŒã远å ããŠæ§æããŸãã
- Pythonãšã¢ãžã¥ãŒã«ãã€ã³ã¹ããŒã«ãããããã®ãã€ããªäŸåé¢ä¿ãã³ã³ãã€ã«ããŸããã
- ã€ã³ã¹ããŒã«ããŠå®è¡ããŠã¿ãŸããã ãžã¥ãã¿ãŒã©ããå€èгãã«ã¹ã¿ãã€ãºããæ¡åŒµæ©èœãã€ã³ã¹ããŒã«ããŸãã
ãã®èšäºã§ã¯ãã³ã³ããã®èµ·åããå§ããŸããLXDã®ã€ã³ã¹ããŒã«ãšèšå®ã«ã€ããŠã¯èæ ®ããŸããããããã«ã€ããŠã¯å¥ã®èšäºã§è©³ãã説æããŸãã LXDã¯ã³ã³ããã·ã¹ãã ã§ããããã®åºæ¬çãªæ©èœã¯ä»¥äžã®ãšããã§ãã Linux.
åºæ¬ã·ã¹ãã ã®ã€ã³ã¹ããŒã«ãšèšå® ^
ã€ã¡ãŒãžãæå®ããã³ãã³ãã§ã³ã³ãããäœæããŸãã alpine3ãã³ã³ããèå¥å â jupyterlab å¿
èŠã«å¿ããŠæ§æãããã¡ã€ã«:
lxc init alpine3 jupyterlab --profile=default --profile=hddrootããã§ã¯æ§æãããã¡ã€ã«ã䜿çšããŸã hddroot ããã¯ã«ãŒãããŒãã£ã·ã§ã³ãæã€ã³ã³ãããäœæããããã«æå®ããŸã ã¹ãã¬ãŒãžããŒã« ç©ç 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ããã«ãããSSDãã£ã¹ã¯ã®ãªãœãŒã¹ãç¯çŽããªããHDDãã£ã¹ã¯äžã®ã³ã³ãããè©Šãæ©äŒãåŸãããŸããSSDãã£ã¹ã¯ãç§ã®ã·ã¹ãã ã«ãããŸã:)ãã®ããã«å¥ã®æ§æãããã¡ã€ã«ãäœæããŸããã ssdroot.
ã³ã³ãããäœæããããšããã®ç¶æ
㯠STOPPEDãã®ãããinit ã·ã¹ãã ãå®è¡ããŠèµ·åããå¿
èŠããããŸãã
lxc start jupyterlabLXDã§ã³ã³ããããªã¹ãããã«ã¯ãããŒã䜿çšããŸãã -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 |
+------------+---------+------------------+--------------+åºæ¬ãœãããŠã§ã¢ã®ã€ã³ã¹ããŒã«ãšã·ã¹ãã ã®èšå® ^
ã³ã³ããã管çããã«ã¯ã次ã®ãœãããŠã§ã¢ãã€ã³ã¹ããŒã«ããå¿ èŠããããŸãã
ããã±ãŒãž
詳现説æ
bash
GNU Bourne Againã·ã§ã«
bash-è£å®
bash ã·ã§ã«ã®ããã°ã©ã å¯èœãªè£å®
sudo
ç¹å®ã®ãŠãŒã¶ãŒã«ãrootãšããŠã³ãã³ããå®è¡ããæš©éãäžãã
圱
ã·ã£ããŠãã¡ã€ã«ãšPAMããµããŒããããã¹ã¯ãŒãããã³ã¢ã«ãŠã³ã管çããŒã«ã¹ã€ãŒã
ãããŒã¿
ã¿ã€ã ãŸãŒã³ãšå€æéããŒã¿ã®ãœãŒã¹
ãã¯ãŒã
æ©èœåŒ·åãããPicoãšãã£ã¿ã¯ããŒã³
ããã«ã以äžã®ããã±ãŒãžãã€ã³ã¹ããŒã«ããããšã§ãããã¥ã¢ã«ããŒãžã·ã¹ãã ã®ãµããŒããã€ã³ã¹ããŒã«ããããšãã§ããŸãã 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 ååãšããŠãã¢ã«ãã€ã³ã«é©åããŸã 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ã¢ã«ãã¹ã® 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 åŸã§èšå®ããŸã ãžã¥ãã¿ãŒã©ã:
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次ã«ã2ã€ã®ã³ãã³ããå®è¡ããŸããæåã®ã³ãã³ãã¯ã·ã¹ãã ã°ã«ãŒããäœæããŸãã sudo2çªç®ã¯ãŠãŒã¶ãŒã远å ããŸã 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ã®ã€ã³ã¹ããŒã«ãšèšå® ^
ãžã¥ãã¿ãŒã©ã ãã㯠Python ã¢ããªã±ãŒã·ã§ã³ãªã®ã§ããŸããã®ã€ã³ã¿ãŒããªã¿ãŒãã€ã³ã¹ããŒã«ããå¿
èŠããããŸãããŸãã ãžã¥ãã¿ãŒã©ã Pythonããã±ãŒãžãããŒãžã£ãŒã䜿çšããŠã€ã³ã¹ããŒã«ããŸã pipã·ã¹ãã ã®ãªããžããªã§ã¯å€ããã®ã«ãªã£ãŠããå¯èœæ§ããããããã·ã¹ãã ã®ãªããžããªã§ã¯ãªããæ¬¡ã®ããã±ãŒãžãã€ã³ã¹ããŒã«ããŠäŸåé¢ä¿ãæåã§è§£æ±ºããå¿
èŠããããŸãã python3 python3-dev gcc libc-dev zeromq-dev:
lxc exec jupyterlab -- apk add python3 python3-dev gcc libc-dev zeromq-devPythonã¢ãžã¥ãŒã«ãšããã±ãŒãžãããŒãžã£ãŒãæŽæ°ããŸããã pip çŸåšã®ããŒãžã§ã³:
lxc exec jupyterlab -- python3 -m pip install --upgrade pip setuptools wheelã»ãã ãžã¥ãã¿ãŒã©ã ããã±ãŒãžãããŒãžã£ãŒçµç± pip:
lxc exec jupyterlab -- python3 -m pip install jupyterlabæ¡åŒµæ©èœã¯ ãžã¥ãã¿ãŒã©ã ãããã¯å®éšçãªãã®ã§ãããjupyterlab ããã±ãŒãžã«ã¯æ£åŒã«ã¯å梱ãããŠããªããããæåã§ã€ã³ã¹ããŒã«ããŠèšå®ããå¿ èŠããããŸãã
NodeJSãšãã®ããã±ãŒãžãããŒãžã£ã§ããNPMãã€ã³ã¹ããŒã«ããŸãããã ãžã¥ãã¿ãŒã©ã æ¡åŒµæ©èœã«äœ¿çšããŸã:
lxc exec jupyterlab -- apk add nodejs npmæ¡åŒµæ©èœãž ãžã¥ãã¿ãŒã©ã ã€ã³ã¹ããŒã«ãããã®ã¯åäœããŸãããã¢ããªã±ãŒã·ã§ã³ã¯ãŠãŒã¶ãŒããèµ·åãããããããŠãŒã¶ãŒãã£ã¬ã¯ããªã«ã€ã³ã¹ããŒã«ããå¿
èŠããããŸãã jupyterãåé¡ã¯ãèµ·åã³ãã³ãã«ãã£ã¬ã¯ããªãæž¡ãããšãã§ãããã©ã¡ãŒã¿ããªããã¢ããªã±ãŒã·ã§ã³ã¯ç°å¢å€æ°ã®ã¿ãåãå
¥ããããããããå®çŸ©ããå¿
èŠãããããšã§ãããããå®è¡ããã«ã¯ã倿°ãšã¯ã¹ããŒãã³ãã³ããèšè¿°ããŸãã JUPYTERLAB_DIR ãŠãŒã¶ãŒã®ç°å¢ã«ãã㊠jupyterããã¡ã€ã«ãž .bashrcããã¯ãŠãŒã¶ãŒããã°ã€ã³ãããã³ã«å®è¡ãããŸãã
lxc exec jupyterlab -- su -l jupyter -c "echo -e "nexport JUPYTERLAB_DIR=$HOME/.local/share/jupyter/lab" >> .bashrc"次ã®ã³ãã³ãã¯ç¹å¥ãªæ¡åŒµæ©èœãã€ã³ã¹ããŒã«ããŸããæ¡åŒµæ©èœãããŒãžã£ã¯ ãžã¥ãã¿ãŒã©ã:
lxc exec jupyterlab -- su -l jupyter -c "export JUPYTERLAB_DIR=$HOME/.local/share/jupyter/lab; jupyter labextension install --no-build @jupyter-widgets/jupyterlab-manager"ããã§ãæåã®èµ·åã®æºåããã¹ãŠæŽããŸããã ãžã¥ãã¿ãŒã©ããã ããããã€ãã®äŸ¿å©ãªæ¡åŒµæ©èœãã€ã³ã¹ããŒã«ããããšãã§ããŸãã
tocâ ç®æ¬¡ãèšäº/ããŒãããã¯ã®èŠåºãã®ãªã¹ããçæããŸãjupyterlab-horizon-themeâ UIããŒãjupyterlab_neon_themeâ UIããŒã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"æåã®å®è¡ã§ã¯æ¬¡ã®2ã€ã®ã³ãã³ããå®è¡ããŸãã ãžã¥ãã¿ãŒã©ãã 1 ã€ã®ã³ãã³ãã§èµ·åããããšãå¯èœã§ããããã®å ŽåãèŠããŠããã®ãé£ããèµ·åã³ãã³ãã¯ãå±¥æŽã«æžã蟌ãã®ã«ååãªã³ãã³ãããã§ã«ååšãããã¹ãã§ã¯ãªããã³ã³ããå ã® bash ã«ãã£ãŠèšæ¶ãããŸã ð
ãŠãŒã¶ãŒãšããŠã³ã³ããã«ãã°ã€ã³ãã jupyter:
lxc exec jupyterlab -- su -l jupyter次ã«å®è¡ ãžã¥ãã¿ãŒã©ã ããŒãšãã©ã¡ãŒã¿ã¯æ¬¡ã®ãšããã§ã:
[jupyter@jupyterlab ~]$ jupyter lab --ip=0.0.0.0 --no-browserãŠã§ããã©ãŠã¶ã§æ¬¡ã®ã¢ãã¬ã¹ã«ã¢ã¯ã»ã¹ããŠãã ãã http://10.0.5.5:8888 éããããŒãžã§ã ããŒã¯ã³ ã³ã³ãœãŒã«ã«è¡šç€ºãããã¢ã¯ã»ã¹æš©ãã³ããŒããŠããŒãžã«è²Œãä»ããã¯ãªãã¯ããŸã ãã°ã€ã³ããã°ã€ã³ããããäžã®ç»åã«ç€ºãããã«ãå·ŠåŽã®æ¡åŒµæ©èœã¡ãã¥ãŒã«ç§»åããŸããæ¡åŒµæ©èœãããŒãžã£ãŒãèµ·åãããšããµãŒãããŒãã£ã®æ¡åŒµæ©èœãã€ã³ã¹ããŒã«ããããšã§ã»ãã¥ãªãã£ãªã¹ã¯ãåãå ¥ããããã«æ±ããããŸãã JupyterLabéçº è²¬ä»»ãè² ããªããã®ãšããã

ããããç§ãã¡ã¯ãŸãã«ãã®ç®çã®ããã«å
šäœãåé¢ããŠããŸãã ãžã¥ãã¿ãŒã©ã ãããŠãNodeJS ãå¿
èŠãšã䜿çšãããµãŒãããŒãã£ã®æ¡åŒµæ©èœããå°ãªããšããã³ã³ããå
ã§éããããŒã¿ä»¥å€ã®ãã£ã¹ã¯äžã®ããŒã¿ãçãããšãã§ããªãããã«ãã³ã³ããã«é
眮ããŸãããã¹ãäžã®ãã©ã€ããŒãææžã«ã¢ã¯ã»ã¹ãã /home ã³ã³ããããã®ããã»ã¹ã¯æåããå¯èœæ§ã¯äœããæåãããšããŠããã³ã³ããããã¹ãã·ã¹ãã å
ã§å®è¡ããŠããããããã¹ãã·ã¹ãã å
ã®ãã¡ã€ã«ã«å¯Ÿããæš©éãå¿
èŠã§ãã éç¹æš©ã¢ãŒãããã®æ
å ±ã«åºã¥ããŠãæ¡åŒµæ©èœãçµã¿èŸŒããªã¹ã¯ãè©äŸ¡ã§ããŸãã ãžã¥ãã¿ãŒã©ã.
IPythonããŒãããã¯ãäœæããŸããïŒããŒãžã¯ ãžã¥ãã¿ãŒã©ãïŒããŠãŒã¶ãŒã®ããŒã ãã£ã¬ã¯ããªã«äœæãããŸã - /home/jupyterãããããã¹ããšã³ã³ããéã§ããŒã¿ãåå²ïŒå
±æïŒããäºå®ãªã®ã§ãã³ã³ãœãŒã«ã«æ»ã£ãŠåæ¢ããŸãã ãžã¥ãã¿ãŒã©ã ãããããŒãå®è¡ããããšã§ CTRL+C ãããŠçãã y ãªã¯ãšã¹ãã«å¿ããŠã次ã«ããŠãŒã¶ãŒã®å¯Ÿè©±åã»ãã·ã§ã³ãçµäºããŸãã jupyter ãããããŒãå®è¡ããããšã§ CTRL+D.
ãã¹ããšããŒã¿ãå ±æãã ^
ãã¹ããšããŒã¿ãå ±æããã«ã¯ãã³ã³ããå ã«ãããå¯èœã«ããããã€ã¹ãäœæããå¿ èŠããããŸãããã®ããã«ã¯ã以äžã®ããŒãæå®ããŠæ¬¡ã®ã³ãã³ããå®è¡ããŸãã
lxc config device addâ ã³ãã³ãã¯ããã€ã¹æ§æã远å ããŸãjupyterâ æ§æã远å ãããã³ã³ããã®èå¥åhostfsâ ããã€ã¹èå¥åãä»»æã®ååãæå®ã§ããŸããdiskâ ããã€ã¹ã®çš®é¡ã衚瀺ãããŸãpathâ LXDããã®ããã€ã¹ãããŠã³ãããã³ã³ããå ã®ãã¹ãæå®ããŸãsourceâ ã³ã³ãããšå ±æãããã¹ãäžã®ãã£ã¬ã¯ããªãžã®ãã¹ã§ãããœãŒã¹ãæå®ããŸãã奜ã¿ã«å¿ããŠãã¹ãæå®ããŸã
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ããã«ã¡ã¯äžçïŒ ^
ã³ã³ããå
ã§ã³ã³ãœãŒã«ã»ãã·ã§ã³ããŸã éããŠããå Žåã¯ã ãžã¥ãã¿ãŒã©ãæ°ããããŒã§åèµ·åããŠãã ãã --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 ãŸãã¯ãäžéšã®ããŒã«ããŒã®ãåçããã¿ã³ãã¯ãªãã¯ããŠãJupyterLab ã«æ¬¡ã®æäœãå®è¡ãããŸãã

ãã®æç¹ã§ãã»ãŒãã¹ãŠã䜿çšå¯èœã«ãªã£ãŠããŸãããPythonã®æšæºæ©èœãå€§å¹ ã«æ¡åŒµã§ãã远å ã®Pythonã¢ãžã¥ãŒã«ïŒæ¬æ Œçãªã¢ããªã±ãŒã·ã§ã³ïŒãã€ã³ã¹ããŒã«ããªããšé¢çœããããŸããã ãžã¥ãã¿ãŒã©ãã§ã¯ã次ã«é²ã¿ãŸããã ð
远䌞è峿·±ãã®ã¯ãå€ãå®è£
ã ãžã¥ãã¿ãŒ ã³ãŒãããŒã ã§ Jupyter Notebook ã©ãã«ãè¡ããã䞊è¡ããŠååšãã ãžã¥ãã¿ãŒã©ããå€ãããŒãžã§ã³ã«åãæ¿ããã«ã¯ãã¢ãã¬ã¹ã«æ¥å°ŸèŸã远å ããŠãªã³ã¯ããã©ã£ãŠãã ãã/treeãæ°ããããŒãžã§ã³ãžã®ç§»è¡ã¯æ¥å°ŸèŸã§å®è¡ãããŸã /labãã ããæå®ããå¿
èŠã¯ãããŸããã
- JupyterããŒããã㯠â http://10.0.5.5:8888/tree
- ãžã¥ãã¿ãŒã©ã â http://10.0.5.5:8888/lab
Pythonã®æ©èœæ¡åŒµ ^
ãã®ã»ã¯ã·ã§ã³ã§ã¯ã次ã®ãããªåŒ·åãªPythonã¢ãžã¥ãŒã«ãã€ã³ã¹ããŒã«ããŸãã NumPy, ãã³ã, matplotlib, IPyWidgets ãã®ä»äºã®ææã¯ã©ãããããã«çµ±åãããŠãã ãžã¥ãã¿ãŒã©ã.
ããã±ãŒãžãããŒãžã£ãŒçµç±ã§ãªã¹ããããPythonã¢ãžã¥ãŒã«ãã€ã³ã¹ããŒã«ããåã« pip ãŸããAlpineã«ãããã·ã¹ãã äŸåé¢ä¿ã解決ããå¿
èŠããããŸãã Linux:
g++â ã¢ãžã¥ãŒã«ã®äžéšã¯èšèªã§å®è£ ãããŠãããããã³ã³ãã€ã«ããå¿ èŠããã C + + å®è¡æã«ãã€ããªã¢ãžã¥ãŒã«ãšããŠPythonã«æ¥ç¶ãããfreetype-devâ Pythonã¢ãžã¥ãŒã«ãžã®äŸåé¢ä¿ matplotlib
äŸåé¢ä¿ãã€ã³ã¹ããŒã«ããŸã:
lxc exec jupyterlab -- apk add g++ freetype-devçŸåšã®ã¢ã«ãã€ã³ãã£ã¹ããªãã¥ãŒã·ã§ã³ã«ã¯ã1ã€ã®åé¡ç¹ããããŸãã Linux æ°ããããŒãžã§ã³ã®NumPyãã³ã³ãã€ã«ã§ããŸããã解決ã§ããªãã³ã³ãã€ã«ãšã©ãŒãçºçããŸãã
ERROR: PEP 517 ã䜿çšãã numpy çšã®ãã€ãŒã«ããã«ãã§ãããçŽæ¥ã€ã³ã¹ããŒã«ã§ããŸãã
ãããã£ãŠããã®ã¢ãžã¥ãŒã«ã¯ããã§ã«ã³ã³ãã€ã«ãããããŒãžã§ã³ãé åžããã·ã¹ãã ããã±ãŒãžãšããŠã€ã³ã¹ããŒã«ããŸãããããã¯çŸåšãµã€ãã§å ¥æå¯èœãªãã®ãããå°ãå€ããã®ã§ãã
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ã§ã®ã¢ãžã¥ãŒã«ã®ãã¹ã ^
å®è¡äžã®å Žå ãžã¥ãã¿ãŒã©ãæ°ããã€ã³ã¹ããŒã«ãããã¢ãžã¥ãŒã«ãæå¹ã«ãªãããã«åèµ·åããŸãããããè¡ãã«ã¯ãã³ã³ãœãŒã«ã»ãã·ã§ã³ã§ã CTRL+C å®è¡ããŠããå Žæã§å
¥åããŠãã ãã y åæ¢èŠæ±ã«å¿ããŠåèµ·åãã ãžã¥ãã¿ãŒã©ã ã³ãã³ããåå
¥åããªãããã«ããŒããŒãã®äžç¢å°ããŒãæŒããŠãã 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 ãã¥ãŒããªã¢ã«ã§èŠã€ããããšãã§ããŸã ããã§
ä»ã«äœããããŸããïŒ ^
èšäºã®æåŸãŸã§èªãã§ãã ãã£ãæ¹ã¯ãããã§ãšãããããŸããç§ã¯æå³çã«èšäºã®æåŸã«ã€ã³ã¹ããŒã«ããæ¢è£œã®ã¹ã¯ãªãããæ²èŒããŸããã§ãã ãžã¥ãã¿ãŒã©ã ãã¯ã³ã¯ãªãã¯ãã§åŽåè ã奚å±ããŸã ð ãããããã§ã«æ¹æ³ã¯ããã£ãŠããã®ã§ãåäžã® Bash ã¹ã¯ãªããã«ã³ãã³ããåéããããšã§ãèªåã§å®è¡ã§ããŸã ð
ãŸããæ¬¡ã®ããšãã§ããŸãã
- ã³ã³ããã®ãããã¯ãŒã¯åãIPã¢ãã¬ã¹ã®ä»£ããã«åçŽãªåœ¢åŒã§èšå®ããŸãã
/etc/hostsãã©ãŠã¶ã«ã¢ãã¬ã¹ãå ¥åããŸã http://jupyter.local:8888 - ã³ã³ããã®ãªãœãŒã¹å¶éã詊ããŠã¿ãŠãã ãããããã«ã€ããŠã¯ã LXDã®åºæ¬æ©èœ ãŸãã¯ãLXD éçºè Web ãµã€ãã§è©³çްæ å ±ãå ¥æããŠãã ããã
- ããŒãã倿Žãã:

ä»ã«ãã§ããããšã¯ãããããããŸã!ããã ãã§ããæåããç¥ãããŸãïŒ
æŽæ°: 15.04.2020 幎 18 æ 30 æ¥ååŸ XNUMX æ XNUMX å âãHello, World!ãã®ç« ã®ãšã©ãŒãä¿®æ£ããŸããã
æŽæ°: 16.04.2020幎10æ00æ¥ååXNUMXæ â æ¡åŒµæ©èœãããŒãžã£ãŒã®æå¹åã®èª¬ææãä¿®æ£ããã³è¿œå ããŸãã ãžã¥ãã¿ãŒã©ã
æŽæ°: 16.04.2020幎10æ40æ¥ååXNUMXæXNUMXå â ããã¹ãå
ã®èª€ããä¿®æ£ãããåºæ¬ãœãããŠã§ã¢ã®ã€ã³ã¹ããŒã«ãšã·ã¹ãã ã®æ§æãã®ç« ãå°ã倿ŽããŸããã
åºæïŒ habr.com
