Jupyterãã©ãããã©ãŒã ã䜿çšãããšãåå¿è
ã®éçºè
ãããŒã¿ã¢ããªã¹ããåŠçãPythonã§ããã°ã©ãã³ã°ãããã«éå§ã§ããŸãã ããªãã®ããŒã ãæé·ãããšããŸã-ä»ã§ã¯ããã°ã©ããŒã ãã§ãªãããããŒãžã£ãŒãã¢ããªã¹ããç 究è
ãå«ãŸããŠããŸãã é
ããæ©ãããå
±æäœæ¥ç°å¢ã®æ¬ åŠãšèšå®ã®è€éãã«ãããäœæ¥ãé
ããªãå§ããŸãã JupyterHubã¯ããã¿ã³1ã€ã§Jupyterãèµ·åã§ãããã«ããŠãŒã¶ãŒãµãŒããŒã§ããããã®åé¡ã«å¯ŸåŠããã®ã«åœ¹ç«ã¡ãŸãã Pythonãæãã人ã ãã§ãªããã¢ããªã¹ãã«ãæé©ã§ãã ãŠãŒã¶ãŒã¯ãã©ãŠã¶ã®ã¿ãå¿
èŠãšããŸããã©ããããããžã®ãœãããŠã§ã¢ã®ã€ã³ã¹ããŒã«ãäºææ§ãããã±ãŒãžã«åé¡ã¯ãããŸããã Jupyterã¡ã³ããã¯ãJupyterLabããã³nteractãšãšãã«JupyterHubãç©æ¥µçã«éçºããŠããŸãã
ç§ã®ååã¯Andrey Petrinã§ããYandexã®æé·åæã°ã«ãŒãã®è²¬ä»»è
ã§ãã Moscow Python Meetupã§ã®ã¬ããŒãã§ãJupyterã®å©ç¹ãæãåºããJupyterHubã®ã¢ãŒããã¯ãã£ãšååãããã³ãããã®ã·ã¹ãã ãYandexã§äœ¿çšããçµéšã«ã€ããŠè©±ããŸããã æåŸã«ãä»»æã®ã³ã³ãã¥ãŒã¿ãŒã§JupyterHubãäžããæ¹æ³ãåŠã³ãŸãã
-ãŸããYandexã®ã¢ããªã¹ãã¯èª°ã§ããã ããã¯ãäžåºŠã«å€ãã®ç°ãªãããšãå®è¡ã§ããå€ãã®åœ¹å²ãå
Œãåããå€è
ã·ãŽã¡ã§ãããšããã¢ãããžãŒããããŸãã
ã¿ãªããããã«ã¡ã¯ïŒ ç§ã®ååã¯Andrey Petrinã§ããYandexã®æé·åæã°ã«ãŒãã®è²¬ä»»è
ã§ãã JupyterHubã©ã€ãã©ãªã«ã€ããŠèª¬æããŸããJupyterHubã©ã€ãã©ãªã¯ããã€ãŠYandexã¢ããªãã£ã¯ã¹ã®äººçã倧å¹
ã«ç°¡çŽ åããŸããããæåéããå€æ°ã®ããŒã ã®çç£æ§ã®åäžãæããŸããã

ããšãã°ãYandexã®ã¢ããªã¹ãã¯å°ããªãããŒãžã£ãŒã§ãã ã¢ããªã¹ãã¯åžžã«ãããã»ã¹ã®ã¿ã€ãã³ã°ãã¿ã€ã ã©ã€ã³ãã©ã®æç¹ã§äœãè¡ãå¿
èŠãããããç¥ã£ãŠããŸãã
ãããã¯å°ããªéçºè
ã§ãããããŒã¿åŠçã®ããŸããŸãªæ¹æ³ã«ç²ŸéããŠããŸãã ããšãã°ãShivaã®æã«ããã¹ã©ã€ãã§ã¯ãæãæµ®ãã¶Pythonã©ã€ãã©ãªã¯å®å
šãªãªã¹ãã§ã¯ãªããæ¥åžžçã«äœ¿çšããããã®ã§ãã åœç¶ãéçºã¯Pythonã ãã§ãªããäž»ã«Pythonã«ã€ããŠã説æããŸãã
ã¢ããªã¹ãã¯ã»ãã®å°ãã®æ°åŠã§ãããæ
éã«æ±ºå®ãäžãã管çã®èŠ³ç¹ã§ã¯ãªãå®éã®ããŒã¿ãèŠãå¿
èŠããããŸãããäœããã®çå®ãæ¢ããŠãããç解ããå¿
èŠããããŸãã
ããããã¹ãŠã«ãããŠãJupyterãšã³ã·ã¹ãã ã¯éåžžã«åœ¹ç«ã¡ãŸãã

ããã¯ãã€ã³ã¿ã©ã¯ãã£ããªããã°ã©ãã³ã°ãšã¬ããŒãã®ããŒãããã¯ã®ããã®ãã®ãããªãã©ãããã©ãŒã ã§ãã JupyterããŒãããã¯ã®éèŠãªæ¬è³ªã¯ããã®ãããªããŒãããã¯ã§ãããã®ããŒãããã¯ã«ã¯ãå€æŽå¯èœãªã€ã³ã¿ã©ã¯ãã£ããªèŠçŽ ãå€æ°ãããŸãã äž»ãªæ¬è³ªã¯ãããã°ã©ã ããã³ãŒãã®åŸ®å°èŠçŽ ã§ãã ãããã¯ããã©ãŠã¶ã®ã©ãããããã§å°å·ã§ããåžžã«äœ¿çšããŠããŸãã ãããã¯ãç»åãŸãã¯ã€ã³ã¿ã©ã¯ãã£ããªHTML掟çèŠçŽ ã®ããããã§ãã èŠçŽ ãå°å·ãå°å·ã衚瀺ããã ãã§ãããŸããŸãªããšãã§ããŸãã
Jupyterã·ã¹ãã ã¯é·ãééçºãããŠãããããŸããŸãªããŒãžã§ã³ã®ããŸããŸãªããã°ã©ãã³ã°èšèªãPython 2ããã³3ãGoãããŸããŸãªãã®ããµããŒãããŠããŸãã æ¥åžžã®ã¿ã¹ã¯ãå·éã«è§£æ±ºã§ããŸãã
åæã§äœãããŠããŠãJupyterã¯ãã®ç¹ã§ã©ã®ããã«åœ¹ç«ã€ã®ã§ããããïŒ

æåã®ã¿ã¹ã¯ã¯ãWebãµã€ãã®åé¡ã§ãã ã€ã³ã¿ãŒãããå
šäœãçç¥ããŠãã倧èŠæš¡ãªYandexã«ãšã£ãŠãç¹å®ã®ãµã€ããèŠãã®ã¯éåžžã«æéãããããŸãã ç§ãã¡ã«ã¯éåžžã«å€ãã®ãµã€ããããããããããç¬èªã®è©³çŽ°ãæã€ããšãã§ããã®ã§ããããããã€ãã®ãããã¯ã«éçŽããå¿
èŠããããŸãã
ãã®ã¿ã¹ã¯ã§ã¯ããã¹ãŠã®ã€ã³ã¿ãŒããããã¹ãã®é£æ¥é¢ä¿ã°ã©ããã€ãŸã2ã€ã®ãµã€ãã®çžäºã®é¡äŒŒæ§ã®ã°ã©ããäœæããŠããŸãã ãã¹ãã®æåããŒã¯ã¢ããã䜿çšããŠãã€ã³ã¿ãŒãããäžã®ãµã€ããšã¯äœãã«é¢ãããã©ã€ããªããŒã¿ããŒã¹ãååŸããã€ã³ã¿ãŒãããå
šäœã«æåããŒã¯ã¢ãããå€æ¿ããŸãã æåéããåã¿ã¹ã¯ã§Jupyterã䜿çšããŸãã é£æ¥ã°ã©ãã®æ§ç¯ã®èŠ³ç¹ãããMapReduceã§æäœã絶ããå®è¡ãããã®ãããªã°ã©ããæ§ç¯ãããã®ãããªããŒã¿åæãè¡ãããšãã§ããŸãã
å
¥åãŠã£ãžã§ããã䜿çšããŠãJupyterã§ã®æåããŒã¯ã¢ãããèªååããŸããã åãã¹ãã«ã¯ãçãããããŒãããããŸãããããã¯ããããæ£ããã§ãããã ç§ãã¡ã¯ã»ãšãã©åžžã«ãããã¯ãæšæž¬ããŸãããæåã§ããŒã¯ãä»ããã«ã¯äººãå¿
èŠã§ãã
ãããŠãããããçš®é¡ã®èå³æ·±ãåçãåŸãããŸãã

ããšãã°ãã¹ããŒãé¢é£ã®ãããã¯ã«ååšããã¹ããŒãé¢é£ã®ãµã€ãããã³é¢é£ããæ€çŽ¢ã¯ãšãªãããã«è¡šç€ºãããŸãã

äž»é¡çŸç§äºå
žã ãµã€ãã¯å°ãªããäžè¬çã«äžæã®ãªã¯ãšã¹ãããããŸãããäž»ãªãã®ã¯å€§ãããªã£ãŠããŸãã

件åã®å®¿é¡-宿é¡ãçµããã èå³æ·±ãã®ã¯ãå
éšã«äºãã«äŒŒããµã€ãã®2ã€ã®ç¬ç«ããã¯ã©ã¹ã¿ãŒãããããä»ã®ãµã€ããšã¯ç°ãªãããã§ãã ããã¯ã2ã€ã®ãããã¯ã«åããããããã¯ã®è¯ãäŸã§ãã ãµã€ãã®ååã¯æããã«å®¿é¡å
ã®1ã€ã®åé¡ã解決ãããã1ã€ã¯ä»ã®åé¡ã解決ããŸãã

å
¥æãªããã£ãã€ã¶ãŒãäœæããããšã¯éåžžã«èå³æ·±ãããšã§ããããŸã£ããç°ãªãã¿ã¹ã¯ã§ãã Yandexã¯ãéãå«ããŠå€ãã®ã¢ãã€ã«ã¢ããªã±ãŒã·ã§ã³ã賌å
¥ãããŠãŒã¶ãŒããšã«äœããã®çš®é¡ã®ã¢ããªã±ãŒã·ã§ã³ãã€ã³ã¹ããŒã«ããããšã§åŸããããŠãŒã¶ãŒã®å¯¿åœãäºæž¬ããæ¹æ³ãæ¢ã«ç¥ã£ãŠããŸãããæ®å¿µãªããããã®ç¥èãããŒã±ãã£ã³ã°æ
åœè
ã«äŒããããšã¯å°é£ã§ãããã©ãã£ãã¯ã®è³Œå
¥ãåŠçããè«è² æ¥è
ã ããã¯éåžžãåžžã«äœããã®äºç®ããããããªãå€ãã®å¶éããããšããäºå®ã«ãããã®ã§ãã ãã®ãããªå€æ¬¡å
æé©åã¿ã¹ã¯ãåæã®èŠ³ç¹ããèå³æ·±ããã®ã«ããå¿
èŠããããŸããããããŒãžã£ãŒçšã®ããã€ã¹ãäœæããå¿
èŠããããŸãã

Jupyterã¯ããã§éåžžã«åœ¹ç«ã¡ãŸãã ããã¯Jupyterã§éçºããã€ã³ã¿ãŒãã§ã€ã¹ã§ãããPythonã®ç¥èããªããŠãŒã¶ãŒãããŒãžã£ãŒããã°ã€ã³ããŠäºæž¬ã®çµæãååŸã§ããããã«ããŸãã ããã§ãAndroidãéžæãããiOSãéžæããããã©ã®åœã§ã©ã®ã¢ããªã±ãŒã·ã§ã³ãéžæããããéžæã§ããŸãã ããã€ãã®é²è¡ç¶æ³ããŒãäºç®ã®ãµã€ãºãããçš®ã®ãªã¹ã¯èš±å®¹åºŠãªã©ãå€æŽã§ããéåžžã«è€éãªãããŒãžã£ãŒãšãã³ããããŸãã ãããã®ã¿ã¹ã¯ã¯Jupyterã®å©ããåããŠè§£æ±ºãããŸãããå€è
ã®ã·ãã§ããã¢ããªã¹ãããããã®åé¡ãåç¬ã§è§£æ±ºã§ããããšãéåžžã«å¬ããæããŸãã
çŽ5幎åãç§ã察åŠãããããã€ãã®å¶éãšãã©ãããã©ãŒã ã®åé¡ããããšããçµè«ã«éããŸããã æåã®åé¡ã¯ãå€ãã®ç°ãªãã¢ããªã¹ããããŠããããããåžžã«ç°ãªãããŒãžã§ã³ããªãã¬ãŒãã£ã³ã°ã·ã¹ãã ãªã©ã䜿çšããŠããããšã§ãããã人ã®ããã«æ©èœããã³ãŒãã¯ãå¥ã®äººã«å¯ŸããŠå®è¡ãããªãããšããããããŸãã
ããã«å€§ããªåé¡ã¯ãããã±ãŒãžã®ããŒãžã§ã³ã§ãã ãã¹ãŠãããã«éå§ã§ããããã«ãäœããã®äžè²«ããç°å¢ãç¶æããããšãã©ãã»ã©é£ããããèšãå¿
èŠã¯ãªããšæããŸãã
ãããŠäžè¬çã«ãããŒã ã«åå ããã°ããã®æ°ããã¢ããªã¹ãã«ããã¹ãŠãã»ããã¢ãããããäºåæ§æãããç°å¢ãæäŸãããšããã¹ãŠã®ããã±ãŒãžãçŸåšã®ããŒãžã§ã³ã«ã€ã³ã¹ããŒã«ããã1ãæã§ç¶æããããšãåæäœæ¥ãšåããããè¯ãããšãç解ãå§ããŸããããã³éçºçšã äžè¬çã«ãéçºè
ã«ãšã£ãŠæèã¯äžè²«æ§ããããŸãããåæã®å€åã絶ããè¡ãããŠãããããåæè
ã«åžžã«åœãŠã¯ãŸãããã§ã¯ãããŸããã
ããã§ãJupyterHubã©ã€ãã©ãªã圹ç«ã¡ãŸããã

ããã¯éåžžã«åçŽãªã¢ããªã±ãŒã·ã§ã³ã§ãããåçŽã«åé¢ããã4ã€ã®ã³ã³ããŒãã³ãã§æ§æãããŠããŸãã
ã¢ããªã±ãŒã·ã§ã³ã®æåã®éšåã¯æ¿èªãæ
åœããŸãã ãã¹ã¯ãŒããšãã°ã€ã³ã確èªããå¿
èŠããããŸãããã®äººãææŸãããšãã§ããŸããã
2çªç®ã¯JupyterãµãŒããŒã®èµ·åã§ããJupyterã©ããããããå®è¡ã§ããåãJupyterãµãŒããŒãåãŠãŒã¶ãŒããèµ·åãããŸãã åãããšãã¯ã©ãŠãäžã§ã®ã¿ã³ã³ãã¥ãŒã¿ãŒã§çºçããã¯ã©ãŠãå±éã®å ŽåããŸãã¯åããã·ã³äžã§ããŸããŸãªããã»ã¹ãçæãããŸãã
ãããã·ã ãµãŒããŒå
šäœãžã®åäžã®ã¢ã¯ã»ã¹ãã€ã³ãããããJupyterHubã¯ã©ã®ãŠãŒã¶ãŒãã©ã®ããŒãã«ã¢ã¯ã»ã¹ããå¿
èŠããããã決å®ããŸãããã¹ãŠã¯ãŠãŒã¶ãŒã«å¯ŸããŠå®å
šã«ééçã§ãã åœç¶ãããŒã¿ããŒã¹ãšã·ã¹ãã å
šäœã®äžéšã®å¶åŸ¡ã

JupyterHubã®å€èŠ³ãè¡šé¢çã«èª¬æãããšããŠãŒã¶ãŒãã©ãŠã¶ãŒãJupyterHubã·ã¹ãã ã«ã¢ã¯ã»ã¹ãããã®ãŠãŒã¶ãŒããµãŒããŒãå®è¡ããŠããªãããæ¿èªãããŠããªãå Žåã JupyterHubãã²ãŒã ã«å
¥ããããã€ãã®è³ªåããããµãŒããŒãäœæããç°å¢ãæºåãå§ããŸãã
ãŠãŒã¶ãŒããã§ã«ãã°ã€ã³ããŠããå ŽåããŠãŒã¶ãŒã¯èªåã®ãµãŒããŒã«çŽæ¥ãããã·ãããJupyterã©ãããããã¯å®éã«çŽæ¥ãŠãŒã¶ãŒãšéä¿¡ãããµãŒããŒã«ã¢ã¯ã»ã¹ã«ã€ããŠå°ãããããã®ãŠãŒã¶ãŒã«ãã®ã©ããããããžã®ã¢ã¯ã»ã¹ãèš±å¯ãããããŸãã

ã€ã³ã¿ãŒãã§ã€ã¹ã¯éåžžã«ã·ã³ãã«ã§äŸ¿å©ã§ãã æ¢å®ã§ã¯ãå±éã¯å±éå
ã®ã³ã³ãã¥ãŒã¿ãŒã®ãŠãŒã¶ãŒåãšãã¹ã¯ãŒãã䜿çšããŸãã è€æ°ã®ãŠãŒã¶ãŒããããµãŒããŒãããå Žåããã°ã€ã³ãšãã¹ã¯ãŒãã¯ã·ã¹ãã ã®ãã°ã€ã³ãšãã¹ã¯ãŒãã§ããããŠãŒã¶ãŒã¯èªåã®ããŒã ãã£ã¬ã¯ããªãšããŠèªåã®ããŒã ãã£ã¬ã¯ããªã衚瀺ããŸãã éåžžã«äŸ¿å©ã§ããŠãŒã¶ãŒã«ã€ããŠèããå¿
èŠã¯ãããŸããã


æ®ãã®ã€ã³ã¿ãŒãã§ãŒã¹ã¯å
šäœãšããŠéåžžã«ããç¥ãããŠããŸãã ãããã¯ãçãããèŠãããšãããæšæºã®Jupyterã©ãããããã§ãã ã¢ã¯ãã£ããªã©ããããããèŠãããšãã§ããŸãã

ããªãã¯ãããããã®ããšãèŠãããšããªãã§ãããã ããã¯JupyterHubã®ã³ã³ãããŒã«ãŠã£ã³ããŠã§ãããµãŒããŒã®é»æºããªãã«ããŠèµ·åããããããšãã°JupyterHubãšéä¿¡ããããŒã¯ã³ãååŸããŠãããšãã°JupyterHubå
ã®äžéšã®ãã€ã¯ããµãŒãã¹ãéå§ã§ããŸãã

æåŸã«ã管çè
ã¯ãåãŠãŒã¶ãŒã®ç®¡çãåã
ã®JupyterãµãŒããŒã®èµ·åãåæ¢ããŠãŒã¶ãŒã®è¿œå ãåé€ããã¹ãŠã®ãµãŒããŒã®ãªãããªããããã®ãªã³ãå¯èœã§ãã ãããã¯ãã¹ãŠãèšå®ãªãã§éåžžã«äŸ¿å©ãªãã©ãŠã¶ã§å®è¡ãããŸãã
äžè¬çã«ãã·ã¹ãã ã¯éåžžã«çºå±ããŠããŸãã

åçã§ã¯ãä»å¹Ž12æã«çµäºããUC Berkleyã®ã³ãŒã¹ã¯ãäžçæ倧ã®ããŒã¿ãµã€ãšã³ã¹ã³ãŒã¹ã§ãããç§ã®æèŠã§ã¯ãããã°ã©ãã³ã°ã®æ¹æ³ãç¥ããªã1,200人ã®åŠçãåå ããããã°ã©ãã³ã°ãå匷ããŸããã ããã¯JupyterHubãã©ãããã©ãŒã ã§è¡ãããçåŸã¯ã³ã³ãã¥ãŒã¿ãŒã«Pythonãã€ã³ã¹ããŒã«ããå¿
èŠããªãããã©ãŠã¶ãŒã§ãã®ãµãŒããŒã«ã¢ã¯ã»ã¹ããã ãã§ããã
åœç¶ããã¬ãŒãã³ã°ã®ãããªã段éã§ãããã±ãŒãžãã€ã³ã¹ããŒã«ããå¿
èŠæ§ãçŸããŸããããããã«ããæåã®ãšã³ããªãŒã®åé¡ãå·éã«è§£æ±ºãããŸãã PythonãæããŠãã人ãããã«å®å
šã«æ
£ããŠããªãå Žåãããã±ãŒãžã®ã€ã³ã¹ããŒã«ãããçš®ã®ã·ã¹ãã ã®ä¿å®ãªã©ã«é¢é£ããããã€ãã®ã«ãŒãã³ãå°ãåé·ã§ããããšã«æ°ä»ãããšããããããŸãã ããªãã¯äººãéŒèãããããã©ããªäžçã§ãããã«ã€ããŠè©±ãã人ãå°æ¥ç¿åŸã§ãã詳现ãæãäžããããšãªããããã®ã§ãã
ã€ã³ã¹ããŒã«ïŒ
python3 -m pip install jupyterhub sudo apt-get install npm nodejs-legacy npm install -g configurable-http-proxy
Python 3ã®ã¿ããµããŒããããŠãããJupyterHubå
ã§ã¯2çªç®ã®Pythonã§ã»ã«ãå®è¡ã§ããŸãããJupyterHubèªäœã¯3çªç®ã®Pythonã§ã®ã¿åäœããŸãã å¯äžã®äŸåé¢ä¿ã¯ããã®èšå®å¯èœãªHTTPãããã·ã§ããããã¯ãPythonãåçŽåããããã«äœ¿çšãããã®ã§ãã
æ§æïŒ
jupyterhub --generate-config
æåã«è¡ãããšã¯ãæ§æã®çæã§ãã ãã¹ãŠã¯èšå®ãªãã§ãæ©èœããŸããããã©ã«ãã§ã¯ãäœããã®ããŒã8000ââãæã€ããŒã«ã«ãµãŒããŒãçæããããã°ã€ã³ãšãã¹ã¯ãŒãã«ãããŠãŒã¶ãŒãžã®ã¢ã¯ã»ã¹ããããæ³å»·ã§ã®ã¿æ©èœããŸãã JupyterHub configãã¡ã€ã«ãäœæããŸããæåéãããã¥ã¡ã³ãã®åœ¢åŒã§ããã¹ãŠã®èšå®ãå®å
šã«èªãããšãã§ããŸãã ããã¯éåžžã«äŸ¿å©ã§ããããã¥ã¡ã³ãã«è¡ããªããŠããã©ã®è¡ãå«ããå¿
èŠãããããç解ã§ãããã¹ãŠã³ã¡ã³ãã¢ãŠãããã管çã§ãããã¹ãŠã®ããã©ã«ãèšå®ã衚瀺ãããŸãã

äžæåæ¢ãšäºçŽããããã§ãã ããã©ã«ãã§ã¯ããããã€ãããšãã«ãµãŒããŒã«ãããã€ããŸããåªåããªãå Žåãã€ãŸãHTTPSã䜿çšããªãå ŽåããµãŒããŒã¯HTTPçµç±ã§èµ·åãããŠãŒã¶ãŒã®ãã¹ã¯ãŒããšãã°ã€ã³JupyterHubãšéä¿¡ãããšãã«ãªãŒãã³ã«ãªããŸãã ããã¯éåžžã«å±éºãªè©±ã§ãããããã§ä¿¡ããããªãã»ã©å€ãã®åé¡ã«å¯ŸåŠã§ããŸãã ãããã£ãŠãHTTPSã®åé¡ãç¡èŠããªãã§ãã ããã ç¬èªã®HTTPS蚌ææžããªãå Žåã¯ã蚌ææžãäœæã§ããŸãããŸãã¯ãç¡æã®èšŒææžãå
¥æã§ãããã°ãããletsencrypt.orgãµãŒãã¹ããããåé¡ãªããéãªãã§ãã¡ã€ã³ã§å®è¡ã§ããŸãã ããã¯ååã«äŸ¿å©ã§ããç¡èŠããªãã§ãã ããã
ããã©ã«ãã§ã¯ãããã¯ã«ãŒããšããŠå®è¡ãããæããã«ãç¹å®ã®ãŠãŒã¶ãŒã®äžããç¬èªã®ã©ããããããçæããŸãã ããã¯å€æŽã§ããŸãããããã©ã«ãã§ã¯å€æŽã§ããŸãã ãŸãããã¹ãŠã®ãŠãŒã¶ãŒã¯ããŒã«ã«ã§ãããããŒã ãã£ã¬ã¯ããªã¯ç¹å®ã®ãŠãŒã¶ãŒããšã«ã¹ã¯ããŒã«ããŸãã ä»ã«äœãã§ãããã詳ãã説æããŸãã
JupyterHubã®çŽ æŽãããç¹ã¯ããã®ãããªã³ã³ã¹ãã©ã¯ã¿ãŒã§ãããšããããšã§ãã æåéããç§ã瀺ããå³ã®ãã¹ãŠã®èŠçŽ ã«ãç¬èªã®èŠçŽ ãæ¿å
¥ãåã蟌ãããšãã§ããäœæ¥ãç°¡åã«ãªããŸãã ããšãã°ããŠãŒã¶ãŒã«ã·ã¹ãã ã®ãã°ã€ã³ãšãã¹ã¯ãŒããå
¥åãããããªãå Žåãããã¯ããŸãå®å
šã§ãäžäŸ¿ã§ããããŸããã å¥ã®ãã°ã€ã³ã·ã¹ãã ãäœæããŸãã ããã¯ãoauthãšãããšãã°githubã䜿çšããŠå®è¡ã§ããŸãã

ãŠãŒã¶ãŒã«ãŠãŒã¶ãŒåãšãã¹ã¯ãŒãã®å
¥åã匷å¶ãã代ããã«ãgithubã§2è¡ã®ã³ãŒãã䜿çšããŠæ¿èªãæå¹ã«ããã ãã§ããŠãŒã¶ãŒã¯githubã§èªåçã«ãã°ã€ã³ããgithubãŠãŒã¶ãŒåã§ããŒã«ã«ã«ã¹ã¯ããŒã«ãããŸãã

ãŠãŒã¶ãŒèªèšŒã®ä»ã®æ¹æ³ã¯ãããã«ãµããŒããããŸãã LDAPãããå Žå-ããã¯å¯èœã§ãã ä»»æã®OAuthãå¯èœã§ãããªã¢ãŒããµãŒããŒãããŒã«ã«ãµãŒããŒãžã®ã¢ã¯ã»ã¹ã確èªã§ããREMOTE_USERãªãŒã»ã³ãã£ã±ãŒã¿ãŒããããŸãã éãæããã¹ãŠã

ããã€ãã®ã¿ã€ãã®ã¿ã¹ã¯ããããšããŸãã ããšãã°ãGPUã䜿çšããå Žåã1ã€ã®ãã¯ãããžãŒã¹ã¿ãã¯ãç¹å®ã®ããã±ãŒãžã»ãããå¿
èŠã§ãããç°ãªããŠãŒã¹ã±ãŒã¹ã§CPUããåé¢ããå¿
èŠããããŸãã ãããè¡ãã«ã¯ãç¬èªã®ã¹ããŒããŒãäœæã§ããŸãã ããã¯ãã«ã¹ã¿ã Jupyterã©ããããããäœæããã·ã¹ãã ã§ãã ããã§ã¯ãDockerã䜿çšããŠãã³ãã瀺ããŸãããŠãŒã¶ãŒããšã«ãããã€ãããDockerãã¡ã€ã«ãã³ã³ãã€ã«ã§ããŸãããŠãŒã¶ãŒã¯ããŒã«ã«ã§ã¯ãªããå
éšã³ã³ãããŒã«é
眮ãããŸãã
JupyterHubãµãŒãã¹ã«ã¯ãä»ã«ã䟿å©ãªæ©èœãããã€ããããŸãã

ã¡ã¢ãªãéãããŠãããã·ã³ã§å®è¡ããŠããããªãœãŒã¹ãä¿åããŠããŠãŒã¶ãŒããªãœãŒã¹ã䜿çšããŠããªãããã«ãŠãŒã¶ãŒãåæãããšããŸãããŠãŒã¶ãŒãã·ã¹ãã ã«ããªãã£ãåŸãã¡ã¢ãªã䜿çšãããŸãã ãŸãã¯ãããšãã°ãã¯ã©ãŠããå±éããŠãããå€éã«äœ¿çšãããŠããªããã®ãç¡å¹ã«ããããšã§ä»®æ³ãã·ã³ã®è²»çšãç¯çŽããå¿
èŠãªãšãã«ã®ã¿ãªã³ã«ããããšãã§ããŸãã
æ¢è£œã®ãµãŒãã¹cull_idle_serversããããŸããããã«ãããéã¢ã¯ãã£ãã®åŸã«ãŠãŒã¶ãŒãµãŒããŒããªãã«ããããšãã§ããŸãã ãã¹ãŠã®ããŒã¿ãä¿åããããªãœãŒã¹ã¯äœ¿çšãããŸãããå°ãç¯çŽã§ããŸãã

æåéãããã®ã¹ããŒã ã®ãã¹ãŠã®éšåã«ãç¬èªã®ãã®ãå«ããããšãã§ãããšèšããŸããã ãããã·ã«äœããã®ã¢ããªã³ãäœæããäœããã®æ¹æ³ã§ãŠãŒã¶ãŒãããã·ãäœæã§ããŸãã ç¬èªã®ãªãŒãœã©ã€ã¶ãŒãäœæãããµãŒãã¹ã䜿çšããŠããŒã¿ããŒã¹ãšçŽæ¥éä¿¡ã§ããŸãã ç¬èªã®ã¹ããŒããŒãäœæã§ããŸãã
ãã®ãããªãããžã§ã¯ããKubernetesäžã®ã·ã¹ãã ããå§ãããŸããããã«ããããµããŒãããŠããKubernetã¯ã©ãŠãã«æåéãç¹å®ã®èšå®ãããã«çŽæ¥ãããã€ã§ããããã«ãªããŸããã ããã¯ãèªåã®ãµãŒããŒãdevopsãããã³ãµããŒãã«ç
©ããããããªãå Žåã«éåžžã«äŸ¿å©ã§ãã ãã¹ãŠãããã«äœ¿ãããéåžžã«çŽ æŽããã詳现ãªã¬ã€ãã§ãã

Jupyterã䜿çšããŠãã人ãè€æ°ããå Žåã¯ãJupyterHubãå¿
èŠã§ãã ãããŠãåãããšã®ããã«Jupyterã䜿çšããå¿
èŠã¯ãããŸããã ããã¯ããããã®äººã
ãå£çµãããããªãåé¡ãåé¿ã§ããããã«ãã䟿å©ãªã·ã¹ãã ã§ãã ããã«ã圌ããããã«åãã¿ã¹ã¯ãå®è¡ããå Žå-ããããã圌ãã¯å€ããå°ãªããäžè²«ããããã±ãŒãžã®ã»ãããå¿
èŠãšããŸãã
ç§ã®ã¢ãã«ãèããæ§ç¯ãããŠãããšããèŠæ
ãåãåã£ãå Žåãåæ§ã§ããäžéšã®ã¢ããªã¹ãVasechkinã¯ãããåçŸããããšããŠãããåäœããŸããã ãã€ãŠã¯ãäžå®ã®åé¡ããããŸããã ãããŠãã¡ãããäžè²«ãããµãŒããŒç¶æ
ã¯å€§ãã«åœ¹ç«ã¡ãŸãã
Pythonã®åŠç¿ã«ããã䜿çšããã®ã¯éåžžã«ã¯ãŒã«ã§ãã ãµãŒãã¹nbgraderããããŸããããã¯JupyterHubã®äžã«ãããåŠçã«å®¿é¡ãéãããšã§äŸ¿å©ãªé»æ± ãäœãããšãã§ããŸãã ãœãªã¥ãŒã·ã§ã³èªäœãèšå
¥ããè¿éããŸããJupyterã»ã«ããã§ãã¯ããããã«ã°ã¬ãŒããèšå®ã§ããèªåãã¹ãããããŸãã éåžžã«äŸ¿å©ãªã·ã¹ãã ãç§ã¯ãå§ãããŸãã
Pythonã§äœããèŠãããã»ãããŒã«åå ãããšæ³åããŠãã ããã åæã«ãæåãã3æéããããŠã誰ããèªåã®ããæ¹ã§ä»äºãããããšã¯æãŸãããããŸããã ããªãã¯ããã«äœãé¢çœãããšãå§ãããã§ãã
ãµãŒããŒäžã§ãã®ãããªã·ã¹ãã ãç«ã¡äžãããã°ã€ã³ã§ããã€ã³ã¿ãŒãããã¢ãã¬ã¹ããŠãŒã¶ãŒã«æäŸããäžå¿
èŠãªã«ãŒãã³ã«æéã浪費ããããšãªã䜿çšãéå§ã§ããŸãã ããã ãã§ããããããšãã