
ä»æ¥ãå€ãã®ã·ã¹ãã ãšããã°ã©ãã³ã°èšèªã¯ã匷åããšäœçœ®ä»ããããŠããŸãã ããã¯ããããæªããšèšãããšã§ã¯ãããŸããã ç§ãã¡ã®ã»ãŒå
šå¡ããããååããªæ©èœã ãšèããŠããŸãã ãããããã®æçš¿ã§ã¯ãå€ãã®å Žåã
ããã»ã©åŒ·åã§ã¯
ãªãããã°ã©ãã³ã°èšèªãšã·ã¹ãã ãå¿
èŠã«
ãªããšãã芳ç¹ãäŒããããšæããŸãã ããããç¶è¡ããåã«ãæ確ã«ããã€ããã§ãããªãªãžãã«ã®ãç§èªèº«ã®èãã¯ã»ãšãã©ãããŸããã ãã°ã©ã¹ã»ããã¹ã¿ãã¿ãŒã®
æ¬ããŽããã«ããšãã·ã£ãŒãããããèªãã åŸã«çãŸããäžé£ã®æèã®æŠèŠã説æããŸãã ãŸãããã£ãªããã¯ãã©ãŒã®
æçš¿ãš ScalaäŒè°ã®
ãããªã¯ã以äžã«ç€ºãè³æã«å€§ããªåœ±é¿ãäžããŸããã éèŠãªèãã¯ããã§ãïŒ
è¡šçŸåãé«ãŸããã³ã«ãã¡ãã»ãŒãžãç解ããããã¹ãŠã®äººã«è¿œå ã®è² æ
ãããããŸãããããŠãPythonã³ãã¥ããã£ã«ããè¿ãæ確ã«ãªãäŸã§ãã®ç¹ã説æããããšæããŸãã
å®çŸ©ã«é¢ããããã€ãã®èšèã å€ããå°ãªãã匷åãªããã°ã©ãã³ã°èšèªãšã¯ã©ãããæå³ã§ããïŒ æçš¿ã®ãã¬ãŒã ã¯ãŒã¯å
ã§ã¯ãããã¯ãããã次ã®ããã«èª¬æã§ããŸããã³ãŒããæžããããã·ã¹ãã ã«ããŒã¿ãå
¥åããããã人ã®èŠ³ç¹ããã¯ããèªç±ãšã奜ããªããšãããèœåãã ããã¯æ£åŒãªå®çŸ©ã§ã¯ãããŸãããããè¡šçŸåãã®æŠå¿µãšã»ãŒçžé¢ããŠããŸãã ããæ£ç¢ºã«ã¯ãå€ãã®èšèªã¯
ãã¥ãŒãªã³ã°å®å
šæ§ã«é¢ããŠåãã¬ãã«ã®è¡šçŸåãæã£ãŠããŸãã ããããéçºè
ã¯ãããå°ãªãã³ãŒãã§ããŸãã¯ããã€ãã®ç°ãªãæ¹æ³ã§ç¹å®ã®çµæãåŸãããšãã§ããããå€ãã®èªç±ãåŸãããããããããã®ããã€ãããã匷åãªãã®ãšããŠéžã³ãŸãã
ãããããã®èªç±åºŠã¯ããã»ã©åçŽã§ã¯ãããŸããã ä»»æã®èšèªã䜿çšãããšãã«äž»åŒµãããåãã®åãããã¯ã誰ããããªããæžãããã®ããæ¶è²»ããããšãã«æäŸããªããã°ãªããªããªã¿ãŒã³ã«çããã 以äžã¯æ£åŒã«ããã°ã©ãã³ã°ã«é¢é£ããäŸã§ãããåæã«éã®åå¿ãèŠã€ããŸãã
誰ããå°ããŸãïŒãããã§ãåé¡ã§ããïŒããã¡ãããããªãã®ã·ã¹ãã ã®çµæããæ¶è²»ãããããšãã§ããç¯å²ã§ã ãœãããŠã§ã¢ã³ã³ã·ã¥ãŒããã³ã³ãã€ã©ãããã³éçºè
åãã®ãã®ä»ã®ããŒã«ã¯ãã³ã³ã·ã¥ãŒãããšããŠæ©èœãããããã»ãšãã©ã®å Žåã補åã®ããã©ãŒãã³ã¹ãšæ£ç¢ºãã ãã§ãªãã人ãæ°ã«ããŸãã
ããŒã¿ããŒã¹ãšã¹ããŒã
ãè¡šçŸåãã¹ã±ãŒã«ã®äžäœã¬ãã«ã¯ãããã°ã©ãã³ã°èšèªã§ã¯ãªãããŒã¿ã«èµ·å ãããã®ã§ãã ãã ããããŒã¿ãšèšèªã®äž¡æ¹ãã誰ãããã®ã¡ãã»ãŒãžãåä¿¡ããããšèªèãããå¿
èŠããããããããã§ãåãã¢ãããŒããé©çšãããŸãã
äœå¹Žãã®éãç§ã¯ãã°ãã°ããããã圢åŒã§ããã¹ããå
¥åããããã®ãã£ãŒã«ããäœãããã«é ŒãŸããŸããã ãšã³ããŠãŒã¶ãŒã®èŠ³ç¹ãããããšããã®ãããªãã£ãŒã«ãã¯æé«ã¬ãã«ã®ããã¯ãŒããäœçŸããŠããŸããäœã§ãå
¥åã§ããããã§ãã ãããŠããã®ããžãã¯ã®æ çµã¿ã®äžã§ããã®ãããªãã£ãŒã«ãã¯ãæã圹ç«ã€ããã®ã§ãã
ãããããã£ãŒã«ãã«ããã¹ããå
¥åã§ãããããããã¯æ§é åã«ããŸã圹ç«ããªãã®ã§ãæã圹ã«ç«ã¡ãŸããã ãã®ãããªãã£ãŒã«ãã§ã®æ€çŽ¢ã§ããã確å®ã«æ©èœããŸãã-ã¿ã€ããã¹ã®å¯èœæ§ãšãããã€ãã®ããšã説æããããŸããŸãªæ¹æ³ã®ããã§ãã ããŒã¿ããŒã¹ã§ã®äœæ¥æéãé·ããªãã°ãªãã»ã©ãå¯èœãªãã¹ãŠãå³å¯ã«èŠå¶ããããšãã欲æ±ã匷ããªããŸãã ãããŠãç§ãããããªããšããããšããåŸãããããŒã¿ããããå€ãã®å©çãåŒãåºãããšãã§ããŸãã ã€ãŸããã·ã¹ãã ã«ããŒã¿ãå
¥åãããœãŒã¹ã®ããã¯ãŒãïŒã€ãŸãèªç±ïŒãå¶éããã°ããã»ã©ããã®ããŒã¿ããæ¶è²»ãããæ©äŒãå¢ããŸãã
åãããšãããŒã¿ããŒã¹æè¡ã«ãèšããŸãã éæ§é åïŒã¹ããŒãã¬ã¹ïŒããŒã¿ããŒã¹ã¯ãããŒã¿å
¥åã«ååãªæ©äŒãšæè»æ§ãæäŸãããã®åºåã§ã¯ãã圹ã«ç«ã¡ãŸããã Key-Valueã¹ãã¬ãŒãžã¯ãèªç±åœ¢åŒã®ããã¹ããã«äŒŒãŠããŸãããåãæ¬ ç¹ããããŸããæ
å ±ãæœåºããããããŒã¿ã§äœãããããå Žåã«ã¯ã»ãšãã©åœ¹ã«ç«ã¡ãŸããã次ã«ç¹å®ã®ããŒã
HTML
äžéšã«ã¯ãWebã®æåã¯ãäž»èŠãªæè¡ã§ããHTMLãšCSSã®æ©èœã®æå³çãªå¶éã«ãããã®ã§ããã ã¯ãããããã¯ããŒã¯ã¢ããèšèªã§ãããããã°ã©ãã³ã°èšèªã§ã¯ãããŸããããå¶ç¶ã§ã¯ãããŸããã§ããã ããã¯
æèçã«éžã°ããæŠå¿µã§ããããã®åµèšè
ã®äžäººã¯ãã£ã ã»ããŒããŒãºã»ãªãŒã§ããã
ã1960幎代ãã1980幎代ã«ãããŠãã³ã³ãã¥ãŒã¿ãŒãµã€ãšã³ã¹ã¯ãŸããŸã匷åãªããã°ã©ãã³ã°èšèªãäœæããããã«å€ãã®åªåãããŸããã ããããä»æ¥ã§ã¯ãããã»ã©åŒ·åã§ãªãããŒã«ãéžæããå¿
èŠãããçç±ããããŸãã ãããã®1ã€ã¯ãèšèªãã匱ããã»ã©ãä¿åãããŠããããŒã¿ã䜿çšããŠããå€ãã®ããšãã§ãããšããããšã§ãã åçŽãªå®£èšãã©ãŒã ãäœæãããšã誰ã§ããã®ãã©ãŒã ãããŸããŸãªæ¹æ³ã§åæããããã°ã©ã ãäœæã§ããŸãã äžè¬çãªæå³ã§ãã»ãã³ãã£ãã¯ãããã¯ãŒã¯ã¯ãäœæè
ã倢ã«ãæããªãã£ããã®ãããªããŒã¿åæã®æ©äŒãåŸãããã«ã倧éã®ããŒã¿ãéåžžã®èšèªã«å€æããè©Šã¿ã§ãã
ããšãã°ãWebããŒãžã§RDFã䜿çšããŠå€©æ°äºå ±ã衚瀺ããå ŽåããŠãŒã¶ãŒã¯ãã®ããŒã¿ãè¡šã«æœåºããäœããã®æ¹æ³ã§åŠçãå¹³ååãã°ã©ããããããããä»ã®æ
å ±ãšæ¯èŒã§ããŸãã ãããJavaã¢ãã¬ãããšæ¯èŒããŠãã ãããæ
å ±ã¯éåžžã«çŸãã衚瀺ã§ããŸãããåæããããšã¯ã§ããŸããã æ€çŽ¢ãããã¯ãããŒãžã«è¡šç€ºãããå
容ãç解ããŸããã Javaã¢ãã¬ãããäœãããããç¥ãå¯äžã®æ¹æ³ã¯ãç»é¢ã®åã«åº§ã£ãŠãã人ã®åã§å®è¡ããããšã§ããW3Cã³ã³ãœãŒã·ã¢ã ã¯åãç«å ŽãåããŸããïŒ
ãã°ãããã©ã¯ãã£ã¹ïŒWorld Wide Webã§æ
å ±ããªã³ã¯ããŸãã¯ã¢ããªã±ãŒã·ã§ã³ãè¡šçŸããã®ã«é©ããæã匷åã§ãªãèšèªã䜿çšããŸã ã
ãããã¯ã
Paul Grahamã®ã¢ããã€ã¹ã«ã»ãŒå®å
šã«åããŠããŸãïŒãæš©åãã®å®çŸ©ã¯å€ãã®å Žåã圢åŒçãšã¯çšé ããã®ã§ãããšããç¹ã«æ³šæããŠãã ããïŒã
MANIFEST.in圢åŒã®ãã¡ã€ã«
ãå®éã®ãããã°ã©ãã³ã°èšèªã«ç§»ããŸãããã äŸãšããŠãdistutilsããã³setuptoolsããŒã«ã§äœ¿çšãããMANIFEST.inãã¡ã€ã«åœ¢åŒãéžæããŸããã Pythonã©ã€ãã©ãªçšã®ããã±ãŒãžãäœæããããšãããå Žåã¯ããããããã®åœ¢åŒã«ç²ŸéããŠããã§ãããã
å®éãããã¯Pythonã®ããã±ãŒãžã«å«ãããã¡ã€ã«ãèšè¿°ããéåžžã«å°ããªèšèªã§ãïŒäœæ¥ãã£ã¬ã¯ããªããåŒã³åºãããMANIFEST.inãã¡ã€ã«ã«é¢é£ïŒã äŸïŒ
include README.rst recursive-include foo *.py recursive-include tests * global-exclude *~ global-exclude *.pyc prune .DS_Store
ãã£ã¬ã¯ãã£ãã«ã¯2ã€ã®ã¿ã€ãããããŸãã
- includeïŒincludeãrecursive-includeãglobal-includeãgraftïŒ
- excludeïŒexcludeãrecursive-excludeãglobal-excludeãpruneïŒ
çåãçããŸãããããã®æ什ã¯ã©ã®ããã«è§£éãããŸããïŒ ã€ãŸãããããã®ã»ãã³ãã£ã¯ã¹ã¯äœã§ããïŒ
ã
äœæ¥ãã£ã¬ã¯ããªïŒãŸãã¯ãµããã£ã¬ã¯ããªïŒããã®ãã¡ã€ã«ã¯ãå°ãªããšã1ã€ã®includeã¿ã€ãã®ãã£ã¬ã¯ãã£ãã«äžèŽããexcludeã¿ã€ãã®ãã£ã¬ã¯ãã£ãã«äžèŽããªãå Žåãããã±ãŒãžã«å«ããå¿
èŠããããŸããããã®èšèªã¯å®£èšçã§ããããã§ãã æ®å¿µãªãããããã§ã¯ãããŸããã
distutilsã®ããã¥ã¡ã³ãã«ã¯ãMANIFEST.inã«ã€ããŠèšè¿°ãããŠããŸã-ãã£ã¬ã¯ãã£ãã¯æ¬¡ã®ããã«ç解ããå¿
èŠããããŸãã
- ããã±ãŒãžã«å«ãŸãããã¡ã€ã«ã®ç©ºã®ãªã¹ãããå§ããŸãã ããæ£ç¢ºã«ã¯ãããã©ã«ãã®ãªã¹ãããå§ããŸãã
- é åºã«åŸã£ãŠ MANIFEST.inã®æ瀺ã«åŸããŸãã
- ã¿ã€ããincludeã®åãã£ã¬ã¯ãã£ãã«ã€ããŠãé¢é£ãããã¹ãŠã®ãã¡ã€ã«ãäœæ¥ãã£ã¬ã¯ããªããããã±ãŒãžãªã¹ãã«ã³ããŒããŸãã
- é€å€ãã£ã¬ã¯ãã£ãããšã«ã察å¿ãããã¹ãŠã®ãã¡ã€ã«ãããã±ãŒãžãªã¹ãããåé€ããŸãã
ãã®äŸã¯ããã®èšèªã®åœä»€çãªæ§è³ªã瀺ããŠããŸããMANIFEST.inã®åè¡ã¯ããã®ã¢ã¯ã·ã§ã³ãå¯äœçšã®ååšã瀺åããããŒã ã§ãã ããã«ãããäžèšã®ç䌌宣èšããŒãžã§ã³ãããèšèª
ã匷åã«ãªããŸãã äŸãèããŠã¿ãŸãããïŒ
recursive-include foo * recursive-exclude foo/bar * recursive-include foo *.png
ãããã®ã³ãã³ãã®ãªã¹ãã®çµæãpngãã¡ã€ã«ïŒfoo / barã®äžïŒãããã±ãŒãžã«å«ãŸããŠããŸãã ãŸããfoo / barã®äžã®ãã¹ãŠãããã±ãŒãžã«å«ãŸããŠããããã§ã¯ãããŸããã 宣èšåèšèªã䜿çšããŠåãçµæãéæããããšã¯ãããšãã°æ¬¡ã®ããã«ããå°é£ã§ãã
recursive-include foo * recursive-exclude foo/bar *.txt *.rst *.gif *.jpeg *.py ...
åœä»€åèšèªã¯ãã匷åãªã®ã§ããããéžæããèªæããããŸãã ãã ããåœä»€åã«ã¯ããã€ãã®éèŠãªæ¬ ç¹ããããŸãã
- æé©åã®é£ãã ã MANIFEST.inã解éããããã±ãŒãžã«å«ãããã¡ã€ã«ã®ãªã¹ããäœæããå Žåãæå¹ãªãœãªã¥ãŒã·ã§ã³ã¯1ã€ã ãã§ããæåã«ããã£ã¬ã¯ããªãšãµããã£ã¬ã¯ããªå
ã®ãã¹ãŠã®ãã¡ã€ã«ã®å€æŽäžå¯èœãªãªã¹ããäœæãã次ã«ã«ãŒã«ãé©çšããŸãã è¿œå ã®èŠåã«åŸã£ãŠãã¡ã€ã«ãåºåãªã¹ãã«ã³ããŒããé€å€ã®èŠåã«åŸã£ãŠãã¡ã€ã«ãããã¡ã€ã«ãåé€ããŸãã ãã®ã¢ãããŒãã¯çŸåšPythonã§å®è£
ãããŠããŸãã
ãã¡ã€ã«ãæ¯èŒçå°ãªãå Žåãããã¯æå¹ãªãªãã·ã§ã³ã§ãã ãŸãããªã¹ããæ°åã®ã¢ã€ãã ã§æ§æãããŠããå Žåããã®ã»ãšãã©ãããã±ãŒãžããé€å€ããå¿
èŠããããããæçµçãªãªã¹ãã®äœæã«ã¯å€ãã®æéãããããŸãã
ãã®åé¡ã®è§£æ±ºçã¯æçœãªããã§ããäžéšã®ãã£ã¬ã¯ãã£ãã«ãã£ãŠé€å€ããããã£ã¬ã¯ããªã«ã¯ç§»åããªãã§ãã ããã ãã ããããã¯ãé€å€ãã£ã¬ã¯ãã£ãããã¹ãŠã®å
å«ãã£ã¬ã¯ãã£ãã«ç¶ãå Žåã«ã®ã¿å¯èœã§ãã
ãã®åé¡ã¯çè«çãªãã®ã§ã¯ãããŸããã äœæ¥ãã£ã¬ã¯ããªå
ã®ãã¡ã€ã«ã®æ°ãå€ããããããšãã°toxããŒã«ã䜿çšããå Žåãsetup.py sdistããã³ãã®ä»ã®ã³ãã³ããå®è¡ãããš10åã«éããããšããããŸãã ã€ãŸããtoxèªäœïŒsetup.pyã䜿çšïŒã®åäœã¯éåžžã«é
ããªããŸãã ä»ã ç§ã¯ãã®åé¡ã解決ããããšããŠããŸããããããè¡ãã®ã¯éåžžã«é£ãããšæããŸãã
äžèŠãããšãæé©åãè¡ãããšã¯å¯èœã§ãïŒãã¹ãŠã®ãã£ã¬ã¯ãã£ããè¿œå ããåŸã«æä»çãªãã£ã¬ã¯ãã£ããå®è¡ããããšã«ããããã¡ã€ã«ã·ã¹ãã ãããã»ã©éäžçã«äœ¿çšããŸããïŒããããã¯ãã¹ãŠãèããè€éã«ãããããã¯åãå
¥ãããããã«ãããŸããã ã³ãŒããã©ã³ãã®æ°ãå¢ãããããå€æ°ã®ãšã©ãŒãçºçããå¯èœæ§ãé«ããªããŸãã
ããããå¯äžåãå
¥ãããã解決çã¯ãMANIFEST.inã®äœ¿çšãå®å
šã«æŸæ£ããå®å
šã«ç©ºã®å Žåã«ã®ã¿æé©åããããšã§ãã - ããã¯ãŒãã®è£åŽïŒMANIFEST.inãã¡ã€ã«ã¯ç解ãã«ããã ãŸã第äžã«ãèšèªã®ååãç¿åŸããããšã¯ããå°é£ã§ãã è£
食çã®å Žåãããã¥ã¡ã³ãã¯å®éãããã¯ããã«çããªããŸãã
ããã«ãç¹å®ã®MANIFEST.inãåæãããšãã¯ãçµæã衚瀺ããããšããŠç²Ÿç¥çã«ã³ãã³ããå®è¡ããå¿
èŠããããŸãã éœåã®è¯ãé åºã§è¡ãé
眮ããæ¹ãã¯ããã«ç°¡åã§ãã
ããã¯ãã¹ãŠãããã±ãŒãžã®äœææã«ãšã©ãŒã«ã€ãªãããŸãã ããšãã°ãMANIFEST.inã®å
é ã«ããglobal-exclude *ããã£ã¬ã¯ãã£ãã¯ãååããïŒäžéšã®ãšãã£ã¿ãŒã®äžæãã¡ã€ã«ïŒã§çµãããã¹ãŠã®ãã¡ã€ã«ãããã±ãŒãžããé€å€ãããããšãæå³ããŸãã å®éããã®ãã£ã¬ã¯ãã£ãã¯äœãããŸããã ãããŠã以äžã®ãã£ã¬ã¯ãã£ãã®ãããããããã±ãŒãžã«ããã€ãã®ãã¡ã€ã«ãå«ããããšãããšããããã¯èª€ã£ãŠå«ãŸããŸãã ãã®ãšã©ãŒã®æ¬¡ã®äŸãèŠã€ããŸããïŒæå³ãããšããã«åäœããªããã£ã¬ã¯ãã£ããé€å€ããŸãïŒã
- hgview ïŒãã¡ã€ã«ã®æåã«é
眮ããå Žåãæ©èœããŸããïŒ;
- django-mailer ïŒãã¡ã€ã«ã®å
é ã®å£ããã°ããŒãã«é€å€ãã£ã¬ã¯ãã£ãïŒã
- æååã®é åºãå€æŽãããšããã±ãŒãžã®æ§æã«åœ±é¿ãããããèªèããããããããã«MANIFEST.inã§æååãã°ã«ãŒãåããããšã¯ã§ããŸããã
ã«ãŒãã£ã³ã°
ã«ãŒãã£ã³ã°ã¯Djangoã®ã³ã¢ã³ã³ããŒãã³ãã®1ã€ã§ãã ããã¯ãURLã解æããæå®ãããURLã®ãã³ãã©ãŒã«æž¡ãã³ã³ããŒãã³ãã§ãã åæã«ããããããURLããããã€ãã®ã³ã³ããŒãã³ããæœåºããŸãã
Djangoã§ã¯ãããã¯æ£èŠè¡šçŸã䜿çšããŠå®è£
ãããŸãã åç«ã«é¢ããæ
å ±ã衚瀺ããã¢ããªã±ãŒã·ã§ã³ããããåç«/ urls.pyãã¡ã€ã«ã«æ¬¡ã®ã³ãŒããå«ãŸããŠãããšããŸãã
from django.conf.urls import url from kittens import views urlpatterns = [ url(r'^kittens/$', views.list_kittens, name="kittens_list_kittens"), url(r'^kittens/(?P<id>\d+)/$', views.show_kitten, name="kittens_show_kitten"), ] , views.py : def list_kittens(request): # ... def show_kitten(request, id=None): # ...
æ£èŠè¡šçŸã«ã¯ããã¥ãŒé¢æ°ã«æž¡ããããã©ã¡ãŒã¿ãŒãååŸããããã«äœ¿çšãããçµã¿èŸŒã¿ã®ãã£ããã£é¢æ°ããããŸãã cuteness.comã§ã¢ããªã±ãŒã·ã§ã³ãåäœãããŸãã 次ã«ãã¢ãã¬ã¹
www.cuteness.com/kittens/23ãshow_kittenã³ãŒããžã®åŒã³åºããéå§ããŸãïŒãªã¯ãšã¹ããid = "23"ïŒã
URLãç¹å®ã®æ©èœã«ã«ãŒãã£ã³ã°ã§ããããã«ãªã£ããããWebã¢ããªã±ãŒã·ã§ã³ã¯ã»ãšãã©åžžã«ãããã®åãURLãçæããããã«åŒ·å¶ãããŸãã åç«ã®ãªã¹ããããããŒãžã«ãå人ããŒãžãžã®ãªã³ã¯ãå«ããå¿
èŠããããšããŸãïŒshow_kittenã ãããŠç¢ºãã«ãURLã«ãŒãã£ã³ã°æ§æãåå©çšããããšã§ãããè¡ãããšãã§ããŸãã
ãã ããéæ¹åã«äœ¿çšããŸãã URLã«ãŒãã£ã³ã°ãå®è¡ããå Žåã次ã®æé ãå®è¡ããŸãã
URL path -> (handler function, arguments)
çæãããšãããã³ãã©ãŒé¢æ°ãšå¿
èŠãªåŒæ°ãç¥ã£ãŠããŸãã ãããŠ
ãURLã«ãŒãã£ã³ã°ãå®äºããåŸ ããŠãŒã¶ãŒãç®çã®ããŒãž
ã«å°ãURLãäœæããå¿
èŠããããŸãã
(handler function, arguments) -> URL path
ãããè¡ãã«ã¯ãã«ãŒãã£ã³ã°ã¡ã«ããºã ã®åäœãäºæž¬ã§ããå¿
èŠããããŸãã ãä»é±æ«ã®ã€ã³ãããã¯ã©ããªãã®ãããšå°ããŸããDjangoã®æŽå²ã®ããåæã«ã¯ããŸã ãã®ãããªæ©èœã¯ãããŸããã§ããã ããããã»ãšãã©ã®å ŽåãURLãã³ãã¬ãŒãã®ãæ¹åãå€æŽãã§ããããšãããããŸããã éçããã³ãã£ããã£ãããèŠçŽ ãèŠã€ããããã«ãæ£èŠè¡šçŸã解æã§ããŸãã
URLã«ãŒãã®å®çŸ©ã«äœ¿çšãããèšèª-æ£èŠè¡šçŸ-ã«ã¯ç¹å®ã®å¶éãããããããããå¯èœã§ããããšã«æ³šæããŠãã ããã ããã«ã¯ãã£ãšåŒ·åãªèšèªã䜿çšã§ããŸããã ããšãã°ã次ã®æ©èœã䜿çšããŠURLãå®çŸ©ããŸãã
- å
¥åãšããŠURLã䜿çšãã
- äžäžèŽã®åé¡ã®å ŽåãNoMatchã
- å¶ç¶ããããã¯åãæšãŠãããURLãšãã£ããã£ããããã©ã¡ãŒã¿ã®ã»ãããè¿ããŸãã
urls.pyã¯æ¬¡ã®ããã«ãªããŸãã
from django.conf.urls import url, NoMatch def match_kitten(path): KITTEN = 'kitten/' if path.startswith(KITTEN): return path[len(KITTEN):], {} raise NoMatch() def capture_id(path): part = path.split('/')[0] try: id = int(part) except ValueError: raise NoMatch() return path[len(part)+1:], {'id': id} urlpatterns = [ url([match_kitten], views.list_kittens, name='kittens_list_kittens'), url([match_kitten, capture_id], views.show_kitten, name="kittens_show_kitten"), ]
ãã¡ãããmatch_kittenãšcapture_idãããç°¡æœã«ããããšãã§ããŸãã
from django.conf.urls import url, m, c urlpatterns = [ url([m('kitten/'), views.list_kittens, name='kittens_list_kittens'), url([m('kitten/'), c(int)], views.show_kitten, name="kittens_show_kitten"), ]
mãšcãé¢æ°ãè¿ãããšãèãããšããã®èšèªã¯æ£èŠè¡šçŸã«åºã¥ããŠãå®éãããURLãã«ãŒãã£ã³ã°ããããã«ãã匷åã§ããããšãå€æããŸããã äžèŽãæ€åºããŠãã£ããã£ããããã®ã€ã³ã¿ãŒãã§ã€ã¹ã«ã¯ãããå€ãã®æ©èœããããŸããããšãã°ãããŒã¿ããŒã¹ãªã©ã§IDãæ€çŽ¢ã§ããŸãã
ãããããã®èèã®æšœã«ã¯ã¿ãŒã«ãå«ãŸããŠããŸããURLãéã«ããããšã¯ã§ããŸããã ãã¥ãŒãªã³ã°å®å
šèšèªã§ã¯ãããã®ãããªåºåã§ã®å
¥åããŒã¿ã¯ã©ããªããŸããïŒããšå°ããããšã¯ã§ããŸãããçè«çã«ã¯ãæ¢ç¥ã®ãã¿ãŒã³ãæ€çŽ¢ããããã«é¢æ°ã®ãœãŒã¹ã³ãŒãã衚瀺ã§ããŸãããããã¯å®å
šã«éçŸå®çã§ãã
ãŸããæ©èœãå¶éãããŠããæ£èŠè¡šçŸã§ã¯ãããå€ãã®ãªãã·ã§ã³ã䜿çšã§ããŸãã äžè¬ã«ãåçŽãªåŒã¯äžçš®ãªã®ã§ãéåžžããŒã¹ã®URLæ§æã¯éã«ãªããŸããã ïŒãããã®ã¿ïŒãç¬èªã®æ¹æ³ã§å
ã«æ»ãããšã¯ã§ããŸããã ãŸããåŸæ¥ã®URLãéåžžã©ããçæããå Žåã¯ãç¬èªã®ãœãªã¥ãŒã·ã§ã³ãå¿
èŠã§ãã ãããããªãã ããã§ãééãããšãDjangoã¯å¥ã®æåãä»»æã«éžæããä»ã®ã¯ã€ã«ãã«ãŒãã¯ãã®ããã«åŠçãããŸããã ãããããã®ãããªæåã¯ãã£ããã£ãããæåã®äžã ãã§èŠã€ãããããæ£èŠè¡šçŸãéã«ããããšã¯éåžžã«å¯èœã§ãã
ãããã£ãŠãURLã«ãŒãã確å®ã«éåŒãããå Žåã¯ãæ£èŠè¡šçŸããã匷åã§ãªããã®ãå¿
èŠã«ãªããŸãã ãã€ãŠã¯ããããã
ååã«åŒ·å
ã§ãã ããã®æ©èœãåé·ã§ããããšãèªèããŠããªãã£ãããã«éžæãããŸããã
ãšããããPythonã§ã¯ããã®ãããªã¿ã¹ã¯çšã®ããèšèªãå®çŸ©ããã®ã¯ããã»ã©ç°¡åã§ã¯ãããŸããã ãããã®å®è£
ãšäœ¿çšã«ã¯ãããªãã®æ°ã®ãã€ã©ãŒãã¬ãŒããšè©³çŽ°ã¬ãã«ãå¿
èŠã«ãªããŸã-æ£èŠè¡šçŸã®ãããªãæååãèšèªã䜿çšããå Žåãããã¯ããã«å€ããªããŸãã ãšããã§ãHaskellã®ãããªèšèªã§ã¯ã代æ°çããŒã¿åã®å®çŸ©ããã¿ãŒã³ã®ãããã³ã°ã®ãããªããªãåçŽãªæ©èœã®ãããã§ããã®ãããªããšã¯ã¯ããã«ç°¡åã«ãªããŸãã
æ£èŠè¡šçŸ
åã®ç« ã§ã¯ãå¥ã®åé¡ãæãåºããŸããã ã»ãšãã©ã®å Žåãæ£èŠè¡šçŸã®äœ¿çšã¯éåžžã«ç°¡åã§ãã ãã ããã¬ã®ã¥ã©ãŒã·ãŒãºã³ã«é»è©±ãããããšãå¿
èŠãã©ããã«é¢ä¿ãªãããã¹ãŠã®å¯èœæ§ãããã«å©çšå¯èœã«ãªããŸãã å Žåã«ãã£ãŠã¯ãå¯èœæ§ã®ãããã¹ãŠã®äžèŽãèŠã€ããããã«ããã¯ãã©ããã³ã°ãè¡ãå¿
èŠããããŸãã ãããŠãããã¯ãæ£èŠè¡šçŸã«ãã£ãŠéåžžã«é·ãåŠçãããæåã®çµã¿åãããæå³çã«äœæã§ããããšãæå³ããŸãã
ã¡ãªã¿ã«ãããã«ãã
ã¯ã©ã¹å
šäœã®DoSè匱æ§ãçºçã ããã®ãã¡ã®1ã€ãDjango-
CVE-2015-5145ã§çºèŠãã
ãŸãã ã
ãã³ãã¬ãŒãïŒDjango vs Jinja
Jinjaãã³ãã¬ãŒããšã³ãžã³ã®äœæè
ã¯ã
Djangoãã³ãã¬ãŒãèšèªã«è§ŠçºãããŸãããããã®å²åŠãšæ§æãå€å°å€æŽããŸããã
ããã©ãŒãã³ã¹ã¯ãJinja2ã®äž»ãªå©ç¹ã®1ã€ã§ãã ããã§ã¯ãPythonã³ãŒãã¯ãDjangoã§è¡ãããŠããããã«ãPythonã§äœæãããã€ã³ã¿ãŒããªã¿ãŒãå®è¡ããã®ã§ã¯ãªããããã«ã³ã³ãã€ã«ãããŸããããã«ãããããã©ãŒãã³ã¹ã
5ã20ååäžããŸãã
Jinjaã®äœè
ã§ããArmin Ronacherã¯ãåãã¢ãããŒãã
䜿çšããŠDjangoãã³ãã¬ãŒãã®ã¬ã³ããªã³ã°ãé«éåããŸããã ãã®ãããžã§ã¯ãã
æäŸããŠã圌ã¯Djangoã®APIæ¡åŒµæ©èœãJinjaã§å®è£
ãããã¢ãããŒããå®è£
ããããšãéåžžã«é£ããããããšãç¥ã£ãŠããŸããã Djangoã§ã¯ãç¬èªã®ãã³ãã¬ãŒãã¿ã°ã䜿çšã§ããŸããããã«ãããã³ã³ãã€ã«ãšã¬ã³ããªã³ã°ã®æ®µéã
ã»ãŒå®å
šã«å¶åŸ¡ã§ããŸãã ç¹ã«ã
django-sekizaiã§ã¯
addtoblockãªã©ã®åŒ·åãªã¿ã°ã䜿çšã§ããŸãããäžèŠãããšããã¯äžå¯èœã«æããŸãã ãããããã®ãããªå ŽåïŒãŸãã«ïŒããé
ãããŒãžã§ã³ã䜿çšããããšããŠããè¿
éãªå®è£
ã®å©ç¹ããããŸãã
å€ãã®ãã¿ãŒã³ã«åœ±é¿ããå¥ã®éèŠãªéãããããŸããã Djangoã§ã¯ããã³ãã¬ãŒãã®ã¬ã³ããªã³ã°ããã»ã¹äžã«ã転éãããã³ã³ããã¹ããªããžã§ã¯ãïŒãã³ãã¬ãŒãã«å¿
èŠãªããŒã¿ãå«ãïŒãäžæžãã§ããŸãã ãã³ãã¬ãŒãã¿ã°ã¯ã³ã³ããã¹ããèšå®ã§ããŸããããããã®ããã€ãïŒããšãã°ãurlïŒã¯ãŸãã«ãããè¡ããŸãã
ããã«ãããJinjaã®äŸã«åŸã£ãŠã
Pythonã§ã®ã³ã³ãã€ã«ã®
倧éšåã Djangoã«å®è£
ã§ããŸããã
ãããã®äž¡æ¹ã®ã±ãŒã¹ã§ãåé¡ã¯Djangoãšã³ãžã³ã®ãã¯ãŒã§ããããšã«æ³šæããŠãã ãã-ã³ãŒãäœæè
ãJinja2ã§ã¯äžå¯èœãªããšãè¡ãããšãã§ããŸãã ãã®çµæãé«éã³ãŒããã³ã³ãã€ã«ããããšãããšéåžžã«å€§ããªå°é£ã«çŽé¢ããŸãã
å Žåã«ãã£ãŠã¯ãã³ãã¬ãŒãã®ã¬ã³ããªã³ã°é床ããããžã§ã¯ãã®äž»ãªåé¡ã«ãªãå¯èœæ§ããããããããã¯éåžžã«éèŠãªãã€ã³ãã§ãã ãã®ããã
å€ãã®è£œåãJinjaã«
移è¡ã
ããŸããã ãããŠãããã¯äžå¥åº·ãªç¶æ³ã§ãïŒ
å€ãã®å ŽåãåŸç¥æµã§ã®ã¿ãæé©åãå°é£ã«ãªãåå ãæ£ç¢ºã«ç解ããããšãã§ããŸãã ãããŠãèšèªã«ããã€ãã®å¶éãå°å
¥ããããšã¯å¿
ç¶çã«æé©åããã»ã¹ã®ä¿é²ãå¿
èŠãšãããšèšãã®ã¯cã§ãã ããã°ã©ããŒãšæ¶è²»è
åãã®éãããæ©èœã®æŠå¿µãéåžžã«ããŸãå®è£
ãããŠããèšèªããããŸãïŒ
Pythonã®ããŒã¿æ§é ã¯ããã©ã«ãã§å€æŽå¯èœã§ãããããã³ã³ããã¹ããªããžã§ã¯ããæžãæãå¯èœã«ããããšã¯è«ççã§ãããšèšããŸãã Pythonèªäœã«ç§ãã¡ããããããŸã...
Python
ãã®èšèªã®å¯èœæ§ã®å¹
ãšã¯ç°ãªãæ¹æ³ã§é¢é£ä»ããããšãã§ããŸãã ããšãã°ããããPythonã³ãŒãã«ééãããã¹ãŠã®éçºè
ãšããã°ã©ã ã®ç掻ãã©ãã»ã©è€éã«ããŠããã®ãã
ãŸããã³ã³ãã€ã«ãšããã©ãŒãã³ã¹ãé ã«æµ®ãã³ãŸãã å¶éãã»ãšãã©å®å
šã«ååšããªããããç¹ã«ã¯ã©ã¹ãã¢ãžã¥ãŒã«ã®æžãæããå¯èœã«ãªããããããçš®é¡ã®æçšãªããšãå®è¡ã§ããã ãã§ãªããããã©ãŒãã³ã¹ã倧å¹
ã«äœäžããŸãã
PyPyã®äœè
ã¯çŽ æŽãããçµæãéæããããšãã§ããŸããã
ããã®ãã€ããã¯ã¹ãã
å€æãããšãå°æ¥çã«å€§ããªæé·ãéæããå¯èœæ§ã¯äœãã§ãã ãŸããå©çšå¯èœãªããã©ãŒãã³ã¹ã®åäžã¯ãã¡ã¢ãªæ¶è²»ã®å¢å ãç ç²ã«ããŠéæãããŸããã Pythonã³ãŒããæé©åã§ããã®ã¯ç¹å®ã®å¶éã®ã¿ã§ãã
ãã®æèŠãããå ŽåïŒPythonãDjangoã«ã¯ãŸã£ããå察ããŠããŸããã ç§ã¯Djangoã®äž»èŠãªéçºè
ã®1人ã§ãããã»ãšãã©ãã¹ãŠã®ãããã§ãã·ã§ãã«ãããžã§ã¯ãã§DjangoãšPythonã䜿çšããŠããŸãã ãã®æçš¿ã§ã¯ãããã°ã©ãã³ã°èšèªã®å¹
åºãå¯èœæ§ã«ãã£ãŠçããåé¡ã説æããããšæããŸãã
次ã«ããªãã¡ã¯ã¿ãªã³ã°ãšã³ãŒããµããŒãã«ã€ããŠèª¬æããŸãã çé¢ç®ãªãããžã§ã¯ããäœæããå Žåã確ãã«å€ãã®æéããµããŒãã«è²»ããããŸãã ãããŠããããè¿
éãã€æå°éã®ãšã©ãŒã§è¡ããããšãéåžžã«éèŠã§ãã
åãPythonã§ãVCSïŒGitãMercurialãªã©ïŒã䜿çšããŠãããšãã«ã10è¡ã®é¢æ°ãå¥ã®å Žæã«ç§»åãããšãããã°ã©ã èªäœã®èŠ³ç¹ããäœãå€ãã£ãŠããªãã«ããããããã20è¡ã®å·®åãåŸãããŸãã ããã«ããããããäœããå€æŽãããå ŽåïŒæ©èœã移åãããã ãã§ãªããå€æŽãããå ŽåïŒã決å®ããã®ã¯éåžžã«å°é£ã§ãã
æ¯åãããã«çŽé¢ãããšãè€éããçããŸãããªããè€éãªæ§é ã®ã³ãŒããäžé£ã®ãã¬ãŒã³ããã¹ããšããŠæ±ãã®ã§ããããã ããã¯ããçš®ã®çæ°ã§ãïŒ
ãã®åé¡ã¯ã
é«åºŠãªdiff-toolsã®å©ããåããŠè§£æ±ºã§ãããšæãããã§ãããã ãããåé¡ã¯ãPythonã§é¢æ°ã®ã·ãŒã±ã³ã¹ãå€æŽãããšãããã°ã©ã ã«å®éã«åœ±é¿ããå¯èœæ§ãããããšã§ãïŒå®è¡æã«çºçããå€æŽãæå³ããŸãïŒã
以äžã«äŸã瀺ããŸãã 以åã«å®çŸ©ããé¢æ°ãããã©ã«ãåŒæ°ãšããŠäœ¿çšããŸãã
def foo(): pass def bar(a, callback=foo): pass
è¡ã®é åºãå€æŽãããšãbarã®å®çŸ©ã®fooã«ã€ããŠãNameErrorãšã©ãŒãçºçããŸãã
ãã³ã¬ãŒã¿ã䜿çšããŸãïŒ
@decorateit def foo(): pass @decorateit def bar(): pass
@decorateitã§èããããå¹æã®ããããããã®é¢æ°ã®é åºãå€æŽããããšã¯ã§ãããããã°ã©ã ãåãããã«æ©èœããããšã確èªããŠãã ããã é¢æ°ã®åŒæ°ãªã¹ãã®ã³ãŒããåŒã³åºãããšã«ã€ããŠãåãããšãèšããŸãã
def foo(x=Something()): pass def bar(x=Something()): pass
ã¯ã©ã¹å±æ§ãã¹ã¯ããã§ããŸããïŒ
class Foo(): a = Bar() b = Bar()
ããã§ã¯ãBarã³ã³ã¹ãã©ã¯ã¿ãŒã§èããããå¹æã®ãããbã®å®çŸ©ã¯aã®äžã«é
眮ãããŠããŸãã ããã¯çè«åã®ããã«æãããããããŸããããåãDjangoã¯ãModelãã£ãŒã«ããšFormå®çŸ©å
ã§å®éã«äœ¿çšããŠãåºæ¬ãã£ãŒã«ãã³ã³ã¹ãã©ã¯ã¿ãŒå
ã®ããªãããŒãªã¯ã©ã¹ã¬ãã«ã«ãŠã³ã¿ãŒã䜿çšããŠãæšæºãã£ãŒã«ãé åºã確ä¿ããŸã
Pythonã§ã¯ãé¢æ°åŒã®ã·ãŒã±ã³ã¹ã¯ã¢ã¯ã·ã§ã³ã®ã·ãŒã±ã³ã¹ã§ããããã®çµæãšããŠãªããžã§ã¯ãïŒé¢æ°ãšåŒæ°ïŒãäœæãããããã€ãã®ã¢ã¯ã·ã§ã³ããããã§å®è¡ããããªã©ã®äºå®ã«èããå¿
èŠããããŸã ä»ã®èšèªãšã¯ç°ãªãã宣èšã®é åºãå€æŽããããšã¯ã§ããŸããã
ããã«ãããã³ãŒããèšè¿°ããéã«æãå¹
åºãå¯èœæ§ãåŸãããŸãããæ¢æã®ã³ãŒãã䜿çšããæäœã®èªååã«é¢ããŠã¯å¥œè»¢ã§ããŸããã ãªãã¡ã¯ã¿ãªã³ã°ã¯ãèšèªã®æ©èœïŒã
ããã¯ã¿ã€ãã³ã° ããªã©ïŒã«ãã£ãŠååãå€æŽã§ããªããããæããããšãªãå®è¡ããããšã¯ã»ãšãã©äžå¯èœã§ãã ãŸããããªãã¬ã¯ã·ã§ã³ããšå±æ§ïŒgetattrãªã©ïŒãžã®åçã¢ã¯ã»ã¹ã®å¯èœæ§ããããããéåžžã¯èªåçã«å®å
šã«ååãå€æŽããããšã¯ã§ããŸããã
ãã®ããããã¹ãŠã®ãã©ãã«ã«ã€ããŠVCSããªãã¡ã¯ã¿ãªã³ã°ããŒã«ãéé£ããªãã§ãã ããã ããã¯ãã¹ãŠãPythonèªäœã®å¯èœæ§ã®å¹
ã«é¢ãããã®ã§ãã ã³ãŒãå
ã®æ§é ã®æ°ãèšå€§ã§ããã«ãããããããããããçš®é¡ã®æäœã«é¢ããŠãããã䜿çšããŠè¡ãããšã¯ã»ãšãã©ã§ããŸããã ãã®ããã詳现ã«èª¿ã¹ãŠã¿ããšãè¡ã®é åºã«å¯Ÿããdiffã®äŸåæ§ã¯ããã»ã©æªãã¯ãªããŸããã
ä»æ¥ã§ã¯ãã³ãŒãå
ã®å®çŸ©ã®é åºãéèŠã«ãªãããããã³ã¬ãŒã¿ãã»ãšãã©äœ¿çšããŠããŸãããããã«ãããæ¶è²»è
ã®ç掻ãå€å°æ¥œã«ãªããŸãã ãããããŸãã«ãç§ãã¡ã®ããŒã«ã¯ãŸã å®çšçã§ã¯ãããŸããã äžéšã®æ¶è²»è
ã«ãšã£ãŠã¯ãç¹å®ã®æšæºçãªç¶æ³ãèæ
®ããŠæé©åãå®è¡ããããšãã°JITãã§ãã¯ã䜿çšããŠé害ãæ€åºããããšãã§ããŸãã ããããä»ã®ããŒã«ïŒããšãã°ãVCSããªãã¡ã¯ã¿ãªã³ã°ããŒã«ïŒã§ã¯ãé害ãçºçããå Žåãå®è£
ã«é¢ããæ
å ±ãåéããã«ã¯é
ãããŸãã åé¡ãçºèŠããæç¹ã§ã¯ããã§ã«ãç Žæãããã³ãŒãããªãªãŒã¹ããŠããå¯èœæ§ããããããåŸã§è¬ãããã泚æããæ¹ãè¯ãã§ãããã
çæ³çãªèšèªã§ã¯ãVCSã§diffé¢æ°ã®ååãå€æŽãããšããé¢æ°fooã®ååãbarã«å€æŽãããŸãããã®ããã«ãªããŸãã â , foo bar. « » . - Python .
, , . .
, , , . , , â . â . . , , (, ), .
, , VCS, .
Lamdu , .
ãŸãšã
( ), , : , , . , Slavery is freedom. , ,
.
, , , . , , VCS .
, .
, , . â , .
, , . , .