
翻蚳è
ã®ã¡ã¢ãã®èšäºã¯
翻蚳ã§ãã ãªãã©ã«ç¿»èš³ã«ã¯ãWordã§35 A4ããŒãžããããŸããã 5ã6ã€ã®éšåã«åå²ããäºå®ã§ãã ãã®ãããã¯ã¯ãWebã¢ããªã±ãŒã·ã§ã³ãããè¯ããããã¯ãªãŒã³ã«äœæãããå€ãã®ããã°ã©ããŒã«åœ¹ç«ã€ã¯ãã ãšæããŸãã ãã®èšäºã¯ãç§ã®ç®ãåŒããèšäºã§éåžžè¡ãããããã«ãçµ±åãã¹ãã§ã¯ãªããåäœãã¹ãã䜿çšããŠTDDæ¹æ³è«ã§Webã¢ããªã±ãŒã·ã§ã³ãäœæããæ¹æ³ãåŠã³ãã人ã«ã圹ç«ã¡ãŸãã ééã£ãçšèªãã©ããã§äœ¿çšãããŠããããç¿»èš³ãæ©æ¢°çããããšæãããå Žå-å人ã®ã¡ãŒã«ã§ç§ã«æžããŠãã ãããããã¯ã»ãšãã©Google翻蚳è
ã§ã¯ãããŸããã
1幎åãå人ã®Roberto Ciattiã ãRobert Martinãã¯ãªãŒã³ã¢ãŒããã¯ãã£ãšåŒã¶æŠå¿µã玹ä»ããŸããã ããããããã¯äŒè°ã§ãã®æŠå¿µã«ã€ããŠå€ãã®ããšã話ããããã«ã€ããŠéåžžã«è峿·±ãèšäºãæžããŠããŸãã ãã¯ãªãŒã³ã¢ãŒããã¯ãã£ããšã¯ãå³å¯ãªã«ãŒã«ãè¶
ããŠããœãããŠã§ã¢ã·ã¹ãã ãåå è
ã®ããŸããŸãªå±€ãšåœ¹å²ã«é¢ããäžé£ã®åæãæ§æããæ¹æ³ã§ãã
圌ããã§ã«èšäºãPure architectureã ïŒHabréã®ç¿»èš³ïŒã§è¿°ã¹ãããã«ãã¢ãããŒãèªäœã®ã¢ã€ãã¢ã¯æ°ãããã®ã§ã¯ãªããéå»3ã10幎ã«ããã£ãŠå€ãã®ãœãããŠã§ã¢éçºè
ã«ãã£ãŠæšé²ãããŠããå€ãã®æŠå¿µã«åºã¥ããŠããŸãã æåã®å®è£
ã®1ã€ã¯ã1992幎ã«å
¬éãããIvar Jacobksonã®åäœã§ãããªããžã§ã¯ãæåãœãããŠã§ã¢ãšã³ãžãã¢ãªã³ã°ïŒå
è¡æåã¢ãããŒãã§ææ¡ãããBoundary-Control-Entityã¢ãã«ã«ãããŸãã ããããMartinã¯ãã®ã¢ãŒããã¯ãã£ã®ä»ã®ææ°ããŒãžã§ã³ããªã¹ãããŠããŸãã
ããã§åœŒããã§ã«èª¬æããããšãç¹°ãè¿ããŸããïŒåœŒãããäžæãã§ããªãïŒããããã®æŠå¿µã«æ
£ããããã«ããªããèŠãããšãã§ããããã€ãã®ãªãœãŒã¹ãžã®ãªã³ã¯ãåã«æçš¿ããŸãïŒ
ãã®èšäºã®ç®çã¯ãã¯ãªãŒã³ãªã¢ãŒããã¯ãã£ãŒã䜿çšããŠãŒãããPythonã§WebãµãŒãã¹ãäœæããæ¹æ³ã瀺ãããšã§ãã ãã®å€å±€èšèšã®äž»ãªå©ç¹ã®1ã€ã¯ãã¹ãå®¹ææ§ã§ãããããTDDã¢ãããŒãã«åŸã£ãŠããã°ã©ãã³ã°ããŸãã ãã®ãããžã§ã¯ãã¯ããšããšçŽ3æéã§ãŒãããéçºãããŸããã ãããžã§ã¯ãã®ãã£ã©ã¯ã¿ãŒã®ç¹æ§ãèæ
®ããŠãæçµã³ãŒããç°¡çŽ åããããã«ããã€ãã®æ±ºå®ãè¡ãããŸããã ãããã®ç°¡ç¥åãææããå¿
èŠã«å¿ããŠèª¬æããŸãã
Pythonã®TDDã«ã€ããŠè©³ããç¥ãããå Žåã¯ã ãã®ã«ããŽãªã®èšäºãèªãã§ãã ããã
ãããžã§ã¯ãã®æŠèŠ
Rent-O-Maticãããžã§ã¯ãïŒ Tentacle Dayãã¡ã³ã¯ãªã³ã¯ããã£ããã§ããŸãïŒã®ç®æšã¯ãããã€ãã®å€ã§èšè¿°ããããªããžã§ã¯ãã®ããŒã¿ã»ããã®äžã«åçŽãªæ€çŽ¢ãšã³ãžã³ãäœæããããšã§ãã ãã®æ€çŽ¢ãšã³ãžã³ã§ã¯ããã£ã«ã¿ãŒãèšå®ããŠæ€çŽ¢ãçµã蟌ãããšãã§ããŸãã
ããŒã¿ã¬ã³ãŒãã¯ãè³è²žæã®ä¿ç®¡æœèšã§ãããæ¬¡ã®å€ã§èª¬æãããŸãã
- äžæã®èå¥å
- å¹³æ¹ã¡ãŒãã«åäœã®é¢ç©
- ãŠãŒã/æ¥ã§ã®ã¬ã³ã¿ã«äŸ¡æ Œ
- 座æšïŒç·¯åºŠãšçµåºŠïŒ
çŽç²ãªã¢ãŒããã¯ãã£ã«ã¯ãã·ã¹ãã ã®ããŸããŸãªå±€ã®åé¢ãå«ãŸããŸãã ã¢ãŒããã¯ãã£èªäœã¯ã4ã€ä»¥äžã®å®éã®ã³ãŒãã¢ãžã¥ãŒã«ã§å®è£
ã§ãã4ã€ã®å±€ã§èšè¿°ãããŸãã ãããã®ã¬ã€ã€ãŒã«ã€ããŠç°¡åã«èª¬æããŸãã
ãšã³ãã£ãã£
ããã¯ããã¡ã€ã³ã¢ãã«ãèšè¿°ãããã¬ãã«ã§ãã ããã§ãããŒã¿ããŒã¹ã«ä¿åãããŠããããŒã¿ã«é¢ããã¹ãã¬ãŒãžæ©èœã衚ãã¯ã©ã¹ãäœæããå¿
èŠããããŸãã ç§ã®æèŠã§ã¯ããã®ã¯ã©ã¹ã¯ããžãã¹ããã»ã¹ã®å®è£
ã«å¿
èŠãªæ
å ±ãæäŸããŸãã
ãã®ã¬ã€ã€ãŒã®ã¢ãã«ã¯ãDjangoãªã©ã®ãã¬ãŒã ã¯ãŒã¯ã®éåžžã®ã¢ãã«ãšã¯ç°ãªãããšãçè§£ããããšãéèŠã§ãã ãããã®ã¢ãã«ã¯ããŒã¿ã¹ãã¬ãŒãžã·ã¹ãã ã«é¢é£ããŠããªãããããããã®ã¯ã©ã¹ã®ã¡ãœããã䜿çšããŠçŽæ¥ä¿åãŸãã¯ååŸããããšã¯ã§ããŸããã ãããã«ã¯ãããžãã¹ã«ãŒã«ã«é¢é£ãããã«ããŒã¡ãœãããå«ãŸããŠããŸãã
ã·ããªãª
ãã®å±€ã«ã¯ãã·ã¹ãã ã«å®è£
ãããã¹ã¯ãªãããå«ãŸããŠããŸãã ãã®åçŽãªäŸã§ã¯ãæå®ããããã£ã«ã¿ãŒã«åŸã£ãŠã¹ãã¬ãŒãžæœèšã®ãªã¹ãã衚瀺ãããã·ããªãªã¯1ã€ã ãã§ãã ããã«ã¹ã¯ãªãããé
眮ããŠãå庫ã«é¢ãã詳现æ
å ±ããŸãã¯å庫ã®äºçŽãååã®å
å¡«ãªã©ããã®ä»ã®å¿
èŠãªããžãã¹ããã»ã¹ã衚瀺ããããšãã§ããŸãã
ã€ã³ã¿ãŒãã§ãŒã¹ã¢ããã¿ãŒ
ãã®å±€ã¯ãããžãã¹ããžãã¯ãšå€éšã·ã¹ãã ã®å¢çã«å¯Ÿå¿ããããããšããŒã¿ã亀æããããã«äœ¿çšãããAPIãå®è£
ããŸãã ãŠãŒã¶ãŒã€ã³ã¿ãŒãã§ã€ã¹ã®ãããªã¹ãã¬ãŒãžã·ã¹ãã ã¯ããã®ã¬ã€ã€ãŒã®å€éšã·ã¹ãã ã§ãããã¹ã¯ãªãããšããŒã¿ã亀æããå¿
èŠããããŸãã ãããŠããã®å±€ã¯ããã®ãããªããŒã¿ã¹ããªãŒã ã®ã€ã³ã¿ãŒãã§ã€ã¹ãæäŸããŸãã ãã®ãããžã§ã¯ãã§ã¯ãå€éšWebãµãŒãã¹ãæ§ç¯ã§ããJSONã·ãªã¢ã©ã€ã¶ãŒãä»ããŠãã¥ãŒãšã®éä¿¡ãæäŸãããŸãã ã¹ãã¬ãŒãžã¢ããã¿ã¯ãããŸããŸãªã¹ãã¬ãŒãžã·ã¹ãã ã§åäœããå
±éã®APIãèšè¿°ããŸãã
å€éšã€ã³ã¿ãŒãã§ãŒã¹
ã¢ãŒããã¯ãã£ã®ãã®éšåã¯ãåã®å±€ã§å®çŸ©ãããã€ã³ã¿ãŒãã§ãŒã¹ãå®è£
ããå€éšã·ã¹ãã ã§æ§æãããŠããŸãã ããã§ã¯ãããšãã°ãJSONã·ãªã¢ã©ã€ã¶ãŒãä»ããŠïŒã¹ã¯ãªããã®äžéšãšããŠïŒããŒã¿ã«ã¢ã¯ã»ã¹ããïŒRESTïŒãšã³ããªãã€ã³ããå®è£
ããWebãµãŒããŒãèŠã€ããããšãã§ããŸãã ããšãã°ãMongoDBçšã®ã¹ãã¬ãŒãžå®è£
ããããŸãã
APIãšã·ã§ãŒã
ã¯ãªãŒã³ãªã¢ãŒããã¯ãã£ã§ã¯ãAPIãšããèšèã¯éèŠã§ãã åã¬ã€ã€ãŒã«ã¯ã ãšã³ããªãã€ã³ã ïŒã¡ãœãããŸãã¯ãªããžã§ã¯ãïŒã®åºå®ã»ããã§ããAPIã䜿çšããŠã¢ã¯ã»ã¹ã§ããŸãã ãä¿®æ£æžã¿ããšã¯ããåå®è£
ã§åããããšãæå³ããŸããæããã«ãAPIã¯æéãšãšãã«å€åããå¯èœæ§ããããŸãã åãã¬ãŒã³ããŒã·ã§ã³æ¹æ³ã¯åãã·ããªãªãšåãæ¹æ³ãåç
§ããŠããã®ç¹å®ã®ã·ããªãªããçãããã¡ã€ã³ã¢ãã«ãååŸããŸãã ãããã¯ãã¬ãŒã³ããŒã·ã§ã³å±€ã«ç§»åãããã®ããŒã¿ã¯ãHTMLãPDFãç»åãªã©ã®æ
å ±ã®ç¹å®ã®è¡šçŸã«åŸã£ãŠãã©ãŒããããããŸãã æ¡åŒµããŒã¹ã®ã¢ãŒããã¯ãã£ãçè§£ããŠããå Žåã¯ãåå²ãããAPIé§ååã³ã³ããŒãã³ãïŒãŸãã¯ã¬ã€ã€ãŒïŒã®åºæ¬æŠå¿µãæ¢ã«çè§£ããŠããå¿
èŠããããŸãã
åãæŠå¿µãã¹ãã¬ãŒãžã¬ã€ã€ãŒã«ãåœãŠã¯ãŸããŸãã åã¹ãã¬ãŒãžå®è£
ã¯åãã¡ãœãããæäŸããå¿
èŠããããŸãã ã¹ã¯ãªãããæ±ãå Žåãã©ã®ã¹ãã¬ãŒãžã·ã¹ãã ã䜿çšãããŠããããèããå¿
èŠã¯ãããŸãããããŒã«ã«ã®MongoDBãã¯ã©ãŠãã¹ãã¬ãŒãžã·ã¹ãã ããŸãã¯ç°¡åãªã€ã³ã¡ã¢ãªããŒãã«ãªã©ã§ãã
ã¬ã€ã€ãŒéã®åé¢ãããã³åã¬ã€ã€ãŒã®ã³ã³ãã³ãã¯ãåžžã«å€æŽããããŸãŸã§ãããšã¯éããŸããã é©åã«èšèšãããã·ã¹ãã ã¯ãããã©ãŒãã³ã¹ããã®ä»ã®ç¹å®ã®èŠä»¶ãªã©ã®åé¡ã«å¯ŸåŠããå¿
èŠããããŸãã ã¢ãŒããã¯ãã£ãèšèšãããšããäœããã©ãã§ããªãç¥ã£ãŠããããšãéèŠã§ãã ã«ãŒã«ãèªåã§ã埮調æŽãããææãç¥ãããšã¯ç¹ã«éèŠã§ãã ãã¹ãŠã®è³ªåã«æç¢ºã«ãé»ããŸãã¯ãçœãã§åçã§ããããã§ã¯ãããŸããã å€ãã®æ±ºå®ã¯ãç°è²ã®åœ±ãã§ããã€ãŸããäœãããªããã©ãã«çœ®ãã¹ãããèªåã§æ±ºããªããã°ãªããŸããã
ããããäž»ãªããšã¯ãçŽç²ãªã¢ãŒããã¯ãã£ã®æ§é ãæ··ä¹±ãããããšã§ã¯ãããŸããã ç¹ã«ã ããŒã¿ãããŒã®åé¡ã§æºãããªãããã«ããå¿
èŠããããŸãïŒRobert Martinã®èšäºã®ãå¢çç·ãè¶ãããã»ã¯ã·ã§ã³ãåç
§ïŒã ããŒã¿ãããŒãäžæãããšãæ§é å
šäœãç Žå£ãããŸãã ç¹°ãè¿ããŸãããããŒã¿ã®æµããäžæããªãã§ãã ããã ããŒã¿ãããŒéåã®äŸã¯ããã®ã¯ã©ã¹ã衚ãã®ã§ã¯ãªããäœããã®ã¹ã¯ãªããã«ããPythonã¯ã©ã¹ã®çºè¡ã§ãïŒããšãã°ãJSONæååãšããŠïŒã
ãããžã§ã¯ãæ§é
ãããžã§ã¯ãã®æ§é ãèŠãŠã¿ãŸãããã
Cookiecutterã䜿çšããŠãããžã§ã¯ãæ§é ãæ§ç¯ããŸããã ãã®éšåãæµwalkã«èª¬æããŸãã rentomatic
ã«ã¿ãã°ã«ã¯ã次ã®ãµããã£ã¬ã¯ããªãå«ãŸããŠããŸãã
domain
repositories
REST
serializers use_cases
ãããã®ãã£ã¬ã¯ããªã¯ãåã®ã»ã¯ã·ã§ã³ã§ç€ºããéå±€æ§é ãšããã¹ããç°¡åã«èŠã€ããããããã«äœæããããã¹ããã£ã¬ã¯ããªã®æ§é ãåæ ããŠããŸãã
ãœãŒã¹ã³ãŒã
ãã®GitHubãªããžããªã§ãœãŒã¹ã³ãŒããèŠã€ããããšãã§ããŸã ã 圌ããåå²ããå®éšãã倿Žãããã®èšäºã§èª¬æããåé¡ã解決ããããã®ããæåããæ¹æ³ãæ¢ããŠãã ããã ãœãŒã¹ã³ãŒãã«ã¯ã¿ã°ä»ãã®ã³ããããå«ãŸããŠããŸããããã«ãããèšäºã§èª¬æãããŠããäœæããã»ã¹ããã©ãããšãã§ããŸãã ã©ãã«<Gitã¿ã°ïŒã¿ã°
>ã¯ãèšäºèªäœã®èŠåºãã®äžã«é
眮ãããŸãã ã©ãã«ã¯ãGitHubã®ã¿ã°ãæã€ã³ããããžã®ãªã³ã¯ã§ããããã«ãããgithubã«ç§»åããŠãã³ãŒããè€è£œããã«ã³ãŒãã確èªã§ããŸãã
ãããžã§ã¯ãã®åæå
Gitã¿ã°ïŒ Step01
æŽæ°ïŒ ãã® cookiecutter ããã±ãŒãžã¯ããã®ã»ã¯ã·ã§ã³ãšãŸã£ããåãç°å¢ãäœæããŸãã æ¬¡ã®èª¬æã§ã¯ãäŸåé¢ä¿ãšæ§æã管çããæ¹æ³ã説æãããã®ããŒã«ã詳ãã調ã¹ãŸããæ¬¡ã®ãããžã§ã¯ãã§äœ¿çšããå¯èœæ§ããããŸãã
éåžžããããžã§ã¯ãå
ã«Pythonä»®æ³ç°å¢ããããã€ããã®ã奜ããªã®ã§ãäžæçãªä»®æ³ç°å¢ãäœæããŠãCookiecutterãèšå®ãããããžã§ã¯ããäœæããŠãvirtualenvãåé€ããŸãã cookiecutterã¯ãåæãã¡ã€ã«æ§é ãæäŸããããã«ãããªããšãããžã§ã¯ãã«ã€ããŠããã€ã質åãããŸãã ç¬èªã®ãã¹ãç°å¢ãäœæããã®ã§ã use_pytest
ãnoããšèšãæ¹ãè¯ãã§ãããã ããã¯ãã¢ãããžã§ã¯ãã§ãããå
¬éããå¿
èŠããªãããã use_pypi_deployment_with_travis
ã«use_pypi_deployment_with_travis
ãnoããšåçã§ããŸãã ãããžã§ã¯ãã«ã¯ã³ãã³ãã©ã€ã³ã€ã³ã¿ãŒãã§ã€ã¹ããããŸãããäœæè
ãã¡ã€ã«ãå®å
šã«äœæããã©ã€ã»ã³ã¹ã䜿çšã§ããŸãã
virtualenv venv3 -p python3 source venv3/bin/activate pip install cookiecutter cookiecutter https://github.com/audreyr/cookiecutter-pypackage
質åã«çããŠãããæ¬¡ã®ã³ãŒãã䜿çšããŠãããžã§ã¯ããå®äºããŸã
deactivate rm -fR venv3 cd rentomatic virtualenv venv3 -p python3 source venv3/bin/activate
Cookiecutterãäœæããrequirements_dev.txtãã¡ã€ã«ãåãé€ããŸãã ç§ã¯éåžžãvirtualenvã®äŸåé¢ä¿ãç°ãªãéå±€ãã¡ã€ã«ã«ä¿åããŠãæ¬çªç°å¢ãéçºç°å¢ãããã³ãã¹ãç°å¢ãåé¢ããããã requirements
ãã£ã¬ã¯ããªãšå¯Ÿå¿ãããã¡ã€ã«ãäœæããŸãããã
mkdir requirements touch requirements/prod.txt touch requirements/dev.txt touch requirements/test.txt
test.txt
ãã¡ã€ã«ã«ã¯ããããžã§ã¯ãã®ãã¹ãã«äœ¿çšãããç¹å®ã®ããã±ãŒãžãå«ãŸããŸãã ãããžã§ã¯ãããã¹ãããã«ã¯ãéçºç°å¢çšã®ããã±ãŒãžãã€ã³ã¹ããŒã«ããå¿
èŠãããããããã¡ã€ã«ã«éçºã®äŸåé¢ä¿ãå«ããå¿
èŠããããŸãã
-r prod.txt pytest tox coverage pytest-cov
dev.txt
ãã¡ã€ã«ã«ã¯ãéçºããã»ã¹äžã«äœ¿çšãããããã±ãŒãžãšããã¹ãããã³æ¬çªçšã®ã€ã³ã¹ããŒã«ããã±ãŒãžãå«ãŸããŸãã
-r test.txt pip wheel flake8 Sphinx
ïŒ test.txt
ãã§ã«prod.txt
å«ãŸããŠãããšããäºå®ãå©çšããŠããŸãïŒã
æåŸã®åºæ¬çãªrequirements.txt
ãã¡ã€ã«ã¯ãåã«requirements/prod.txt
ã€ã³ããŒããrequirements/prod.txt
-r prod.txt
æããã«ãããŒãºã奜ã¿ã«æé©ãªãããžã§ã¯ãæ§é ãèŠã€ããããšãã§ããŸãã ãã®æ§é ã¯ãã®ãããžã§ã¯ãã«é©ããŠããŸãããæ¬¡ã®ãã¹ãŠã®ãããžã§ã¯ãã§äœ¿çšããããšã匷å¶ããŠããããã§ã¯ãããŸããã
ãã®åé¢ã«ãããã³ã³ãã¥ãŒã¿ãŒã«æ¬æ Œçãªéçºç°å¢ãã€ã³ã¹ããŒã«ããTravisãªã©ã®ãã¹ãç°å¢ã«ãã¹ãããŒã«ã®ã¿ãã€ã³ã¹ããŒã«ããå®çšŒåç°å¢ãžã®ã€ã³ã¹ããŒã«ã®äŸåé¢ä¿ã®æ°ãæžããããšãã§ããŸãã
ã芧ã®ãšãããäŸåãã¡ã€ã«ã§ã¯ã¿ã°ããŒãžã§ã³ã䜿çšããŠããŸããã ããã¯ããã®ãããžã§ã¯ããéçšç°å¢ã§èµ·åãããªããããç°å¢ãåçµã§ããªãããã§ãã
virtualenv
å
ã«éçºäŸåé¢ä¿ãã€ã³ã¹ããŒã«ããããšãå¿ããªãã§ãã ãã
$ pip install -r requirements/dev.txt
ããŸããŸãªæ§æ
pytest
ãã¹ãpytest
æ§æããå¿
èŠããããŸãã ããã¯ã pytest.ini
ãã¡ã€ã«ãä»ããŠè¡ãããŸãããã®ãã¡ã€ã«ã¯ãã«ãŒããã£ã¬ã¯ããªïŒsetup.pyãã¡ã€ã«ãããå ŽæïŒã«äœæã§ããŸãã
[pytest] minversion = 2.0 norecursedirs = .git .tox venv* requirements* python_files = test*.py
ãããžã§ã¯ãéçºäžã«ãã¹ããå®è¡ããã«ã¯ãåã«å®è¡ããŸã
$ py.test -sv
ã«ãã¬ããžã確èªããå Žåãã€ãŸã ãã¹ãã«ãã£ãŠå®è¡ãããã³ãŒãã®éãå®è¡
$ py.test --cov-report term-missing --cov=rentomatic
ãã¹ãã«ãã¬ããžã®è©³çްã«ã€ããŠã¯ã Coverage.pyããã³pytest-covããã±ãŒãžã®å
¬åŒããã¥ã¡ã³ããã芧ãã ãã ã
flake8
ããã±ãŒãžã䜿çšããŠã PEP8ãšã®äºææ§ã«ã€ããŠPythonã³ãŒãããã¹ãããããšã匷ããå§ãããŸãã setup.cfg
ãã¡ã€ã«ã«é
眮ããå¿
èŠãããflake8
èšå®ã¯æ¬¡ã®setup.cfg
ã§ãã
[flake8] ignore = D203 exclude = .git, venv*, docs max-complexity = 10
ã³ãŒããPEP8æšæºã«æºæ ããŠããããšã確èªããã«ã¯ã次ãå®è¡ããŸãã
$ flake8
Flake8ã®ããã¥ã¡ã³ãã¯ãã¡ãããå
¥æã§ããŸã ã
ãã®æçš¿ã®åã¹ãããã¯ã100ïŒ
ã®ã³ãŒããã¹ããšã«ãã¬ããžãäœæããããšã«æ³šæããŠãã ããã ã¯ãªãŒã³ã¢ãŒããã¯ãã£ã®å©ç¹ã®1ã€ã¯ãã¬ã€ã€ãŒéã®åé¢ã§ãããããã«ãããããé«ããã¹ãå¯èœæ§ãä¿èšŒãããŸãã ãã ãããã®ãã¥ãŒããªã¢ã«ãç¹ã«RESTã»ã¯ã·ã§ã³ã§ã¯ãã¢ãŒããã¯ãã£ã®ç°¡åãªèª¬æã®ããã«äžéšã®ãã¹ããçç¥ãããããšã«æ³šæããŠãã ããã
ããŒã2ã«ç¶ããŸãã