
ãã·ã«ãŽãã¹ã¯ããã¶ã€ããŒããšã³ãžãã¢ããã®ããŒãžã£ãŒã«æãããŠãã劥åã®ãªããŠã§ããã¬ãŒã ã¯ãŒã¯ã§ããã-© chicagoboss.org
ãErlangã¯ããã©ãŒã«ããã¬ã©ã³ããªåæ£ã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ããããã®èšèªã§ãã ããã¯ãå®éã«é·ãéæåè£ã«é©çšãããŠããæ°å°ãªãé¢æ°åèšèªã®1ã€ã§ãã ããšãã°ããã¬ã³ã ïŒãšãªã¯ãœã³AXD-301ã¹ã€ããïŒãéè¡ã·ã¹ãã ãèªååã·ã¹ãã ãè² è·ã®é«ãWebã¢ããªã±ãŒã·ã§ã³ïŒFacebookãã£ããïŒãªã©ã§ãã åæã«ãErlangã¯ãªãŒãã³ãœãŒã¹è£œåã§ãããç¡æã§é åžãããŠããŸããã- ãã·ã¢èªã話ãã³ãã¥ããã£Erlangã®ãµã€ããæããŠãããŸãã
ãã®æçš¿ã¯ãErlangããã°ã©ããŒã®èŽè¡ãæ¡å€§ããããšãç®çãšããŠããŸãã ãã®åã«ãé¢æ°åããã°ã©ãã³ã°ãåœå ã®ç®çã«äœ¿çšããããšã¯ã§ããªããšèããŠãããªããããã¯ããªãã®èŠéãåºããæã§ãã ãã®æçš¿ã¯ããã®ãã¬ãŒã ã¯ãŒã¯ã®äœæè ïŒEvan MillerïŒãå人çã«ç¥ã£ãŠãããæè¿ãã®èšèªã®ãã¡ã³ã§ããç§ã®å人ã®ãµããŒãã§æžãããŸããã
äž¡æ¹ã«ãããšããã®ãã¬ãŒã ã¯ãŒã¯ã«åºã¥ãWebã¢ããªã±ãŒã·ã§ã³ã®éçºã¯ãåãã¬ãŒã«ïŒRuby on RailsïŒã§ã®éçºãããé ããããŸããã ããã€ãã®ç¹ã§ããã«é«éã§ãã ç§ã¯ä»¥åã¯é¢æ°åããã°ã©ãã³ã°ã«ç¹ã«ç²ŸéããŠããŸããã§ããããå人ã®ãã¬ãã·ã£ãŒã®ããšã§è©ŠããŠã¿ãããšã«ããŸããã ãã®äœéšã¯éåžžã«æåããæåã®Webãµã€ãã1幎åãããéãåãRuby on Railsã§äœæããããšãã§ããŸããã

èæ¯ïŒ
2010幎10æã«ã€ãªãã€å·ã·ã«ãŽã§éå¬ããã次ã®ã¢ãŒã©ã³ã»ãããŒã§éå¬ãããŸããã è¬çŸ©ã®çµããã«ã次ã®ããšãèµ·ãããŸããïŒå人ã«ãããšïŒïŒéšå±ã®åããã§ãç§ã¯Rails for Erlangã«åãçµãã§ããŸãããšèšã圌ã®å£°ãèãã99人ããã¯ããããã ïŒã ãRails for Erlangã§ä»äºãããŠããŸãããš99人ãããã¡ãããAhaïŒããšèšã£ãŠããŸãã ãã®ç·ã®ååã¯ãšãŽã¡ã³ã»ãã©ãŒã§ããã ã»ãããŒã®åŸãå人ãããæ©èœçãªã¬ãŒã«ãã«åã蟌ãŸããæŠå¿µãã¢ã€ãã¢ã«ã€ããŠå°ããããŸããã 圌ã¯ãã®ã¢ã€ãã¢ããšãŠãæ°ã«å ¥ã£ãŠããããã以æ¥ã圌ã¯ãã®ãã¬ãŒã ã¯ãŒã¯ã䜿çšãããããžã§ã¯ãã«èªç±æéãè²»ãããããã¥ã¡ã³ãã®äœæããšãŽã¡ã³ã«ãæ¯æŽããŠããŸãã 圌ã¯ãã®åé¡ã«é¢ããè¬çŸ©ãéå¬ãã圌ã®äŒç€Ÿã§ããã€ãã®ããšã玹ä»ããŸããã
- ãšã³ããªãŒ
- èšçœ®
- äœæ¥ç°å¢ã®ã»ããã¢ããïŒãªãã·ã§ã³ïŒ
- æåã®ãããžã§ã¯ãã®äœæ
- DBã䜿çšãã
- CRUD
- å ç®
- ãŸãšã
- è³æº
ãšã³ããªãŒ
ãã®èšäºã§ã¯ããšã³ããªãè¿œå /åé€/衚瀺/ç·šéã§ããã¢ãã¬ã¹åž³ãšãªããŠã§ããµã€ããäœæããŸãã ã€ãŸã æšæºã®CRUDãå®è£ ããŸãã
èå³ã®ãã人ã®ããã«ïŒ ã€ã³ã¹ããŒã«ããã¥ãŒãã³ã°ããŒã«ãåŠç¿ãå«ããéçºå šäœã«çŽ4ã5æéããããŸããã
ãã®ã¿ã¹ã¯ãéæããããã«ã次ã®ããŒã«ã䜿çšãããŸããã
Ubuntu 11.10 32ãããã Erlang R15B ã ChicagoBoss MVCãã¬ãŒã ã¯ãŒã¯ã MongoDBããã¥ã¡ã³ãæåããŒã¿ããŒã¹ãiskinã®Gmateãã©ã°ã€ã³ããã±ãŒãžãåããGeditïŒGeditã¯åãªãããã¹ããšãã£ã¿ãŒã§ãïŒã
Macçšã®ã€ã³ã¹ããŒã«ã¯ãUbuntuçšã®ã€ã³ã¹ããŒã«ãšåããããç°¡åã§ãã Windowsã«ã¯åå¥ã®æ瀺ããããŸãããããã«èšèŒãããŠããæ瀺ãšå€§å·®ã¯ãããŸããã ã³ã¡ã³ãã«Windows / Macãã€ã³ã¹ããŒã«ããçµéšãå ±æãã芪åãªäººããããããããŸããã
ããŒã«ããšã«ã1ã€ã®èšäºã§ã¯ãªããå¥ã®å€§ããªèšäºãæžãããšãã§ããŸãã ããããæãããèšèã倧éã®è³æã§èªè ãæããããªãããã«ãå®éã«ã¯ããã®èšäºã§ç°¡åã«ãšã³ããªãŒããããšãã§ããŸãã
ç§ã¯å人çã«ãé¢æ°åèšèªãŸãã¯ããã¥ã¡ã³ãæåããŒã¿ããŒã¹ã®ãããããæ±ã£ãããšããããŸããã§ããããããã§æåã®ã¢ããªã±ãŒã·ã§ã³ãäœæã§ããŸããã
ãªãœãŒã¹ã»ã¯ã·ã§ã³ã«ããæçšãªãªãœãŒã¹ããœãŒã¹ã³ãŒãã æ¢è£œã®Webãµã€ããžã®ãã¹ãŠã®ãªã³ã¯ã
ãã®ãµã€ãã¯ç§ã®ã©ããããã ïŒãã¥ã¢ã«ã³ã¢CPU T4300 @ 2.10GHzã2GBïŒã«ããããšã«èšåãã䟡å€ããããŸã ã ã©ãããçä¿¡ãªãã«ã æ»ã«ã€ããŠïŒããããã°ïŒå ±åããŸãã ããªãã®è³ªåãäºæ³ããŠïŒãµã€ããããŒã«ã«ã«ç«ã¡äžããŸããããªããªã ãµãŒããŒãã¯ã©ãã·ã¥ããè² è·ã確èªãããã£ãã ãŸããããã¯ããªããäœåãªãã¹ãã£ã³ã°ãè³Œå ¥ããå¿ èŠããªãããã«ãããå®ãããšãå€æããŸããã 誰ãã欲æã瀺ããéåžžã®ãµãŒããŒãå ±æããããã«ãµã€ãã眮ããããããŸããã
ãµã€ããéããªãå Žåã¯ãã©ãããããã䜿çšããŠããã®ã§ãæ°ååŸã«éããŠã¿ãŠãã ããã
ãã€ã³ãã®ãããããæ確ã§ãªãå Žåã¯ãã³ã¡ã³ããæžããŠãèšäºãç·šéããŸãã
èšçœ®
ã¢ãŒã©ã³
ãŸããErlangã®ææ°ããŒãžã§ã³ãã€ã³ã¹ããŒã«ããå¿ èŠããããŸãã ãã®Webãµã€ãã«ã¢ã¯ã»ã¹ãããªãã¬ãŒãã£ã³ã°ã·ã¹ãã ã®æ瀺ã«åŸããŸãã ããã§ãç®çã®ãã£ã¹ããªãã¥ãŒã·ã§ã³ãããŠã³ããŒãããããå¿ èŠãªãªããžããªã確èªã§ããŸãã
Ubuntu 11.10 32ãããã䜿çšããŠããŸãã 64ãããå°çšã®é åžãããã¯ãããŸããã ããã§ãUbuntu 11.04 32ãããçšã®ãã£ã¹ããªãã¥ãŒã·ã§ã³ãããŠã³ããŒãããŸããã æ¢åã®ã¹ã¬ãããšããã»ã¹ã®ã°ã©ãã£ã«ã«ãªè¡šç€ºïŒ appmonãŠãŒãã£ãªã㣠ïŒãªã©ãæ©èœã®äžéšãæ©èœããŸããã

ãããããã¬ãŒãã³ã°ãããã³éåžžã®ãããžã§ã¯ãã®äœæã§ãããããã¯å¹²æžããŸããã
ãããŠãã¡ããããœãŒã¹ããOSã®ããŒãžã§ã³ã«åã£ãé©åãªããŒãžã§ã³ããã€ã§ããã«ãã§ããŸã:)ç§ã®å人ã¯ãã§ã«ãUbuntuãšMacã®ç°ãªããã·ã³çšã«5åããŒãžã§ã³ãåéããŠããŸãã 圌ã¯ãã¡ããitã§ãããšèšã£ãŠããŸãããããå€ã«ç¿åŸããããšã¯ããªãå¯èœã§ãã
åé¡ã«ã€ããŠã¯ã Erlang-Solutionsã«åãåãããããšãã§ããŸãã 圌ãã¯ç·ãã¡ãææã ãšèšãã
ãã¡ã€ã«ãããŠã³ããŒãããŠã€ã³ã¹ããŒã«ãéå§ãããšã次ã®ã¡ãã»ãŒãžã衚瀺ãããŸããã
installing esl-erlang 1:15.b
size - 63.8 mb
ã€ã³ã¹ããŒã«åŸãã¢ããªã±ãŒã·ã§ã³ããã¹ãããã«ã¯ãã³ã³ãœãŒã«ãéããŠerlã³ãã³ããèšè¿°ããŸãã 次ã®ãããªãã®ãçæãããŸãã
Erlang R15B (erts-5.9) [source] [smp:2:2] [async-threads:0] [hipe] [kernel-poll:false]
Eshell V5.9
ãã³ãã¹
Gitã䜿çšããã«ãã¬ãŒã ã¯ãŒã¯ãããŠã³ããŒãã§ããŸããéçºããŒãžã«ç§»åããŠææ°ããŒãžã§ã³ãååŸããã ãã§ãã
GitããŸã ãæã¡ã§ãªãå Žåã¯ã€ã³ã¹ããŒã«ããŸãã
apt-get install git-core
ChicagoBossãã¬ãŒã ã¯ãŒã¯ã®ã³ããŒãååŸããŸãã
git clone git://github.com/evanmiller/ChicagoBoss.git
ãªããžããªã®ãã£ã¬ã¯ããªã«ç§»åããŸãã
cd ChicagoBoss
ã³ã³ãã€ã«ããŸãïŒ
./rebar get-deps clean compile
æ°ãããããžã§ã¯ããéå§ããã«ã¯ïŒãã¬ãŒã ã¯ãŒã¯ã®ãã£ã¬ã¯ããªã«ããå¿ èŠããããŸãïŒïŒ
make app PROJECT=your_project_name_here
次ã«ïŒ
cd ../your_project_name_here
ãããã°ïŒéçºè ïŒã¢ãŒããèµ·åããã«ã¯ïŒ
./init-dev.sh
æ¬çªç°å¢ã§å®è¡ããã«ã¯ïŒ
./init.sh start
ã¡ãã»ãŒãžã®ç§»åãåæ¢ãããŸã§åŸ ã¡ãŸãã ãšã©ãŒãŸãã¯ã¯ã©ãã·ã¥ã¬ããŒãããªãå Žåã¯ãlocalhostïŒ8001ãéãããšãã§ããŸã
ããã§ãæ°ããã¢ãã«ãã³ã³ãããŒã©ãŒããã¥ãŒãäœæãããµãŒããŒãåã³ã³ãã€ã«ããŠåèµ·åããã«çµæãããã«ç¢ºèªã§ããŸãã å Žåã«ãã£ãŠã¯ãããšãã°ã«ãŒããå€æŽãããšããªã©ãåã³ã³ãã€ã«ãäŸç¶ãšããŠå¿ èŠã§ãã
ã³ã³ãã€ã«ã¯æ¬¡ã®ã³ãã³ãã«ãã£ãŠåŒã³åºãããŸãã
./rebar compile
ChicagoBossã¯ããã©ã«ãã§Misultinã®WebãµãŒããŒã䜿çšããã¢ããªã±ãŒã·ã§ã³ã®äœææã«ããŒã8001ãæ§æã«æžã蟌ãŸããŸããå¿ èŠã«å¿ããŠããµãŒããŒãMochiweb ãå Žåã«ãã£ãŠã¯Cowboyã«çœ®ãæããããšãã§ããŸãã
ã¢ã³ãŽãã
ããã§ã¯ãã¹ãŠãéåžžã«ç°¡åã§ãã ããŠã³ããŒãããŠã€ã³ã¹ããŒã«ããŸãã Ubuntuã§ã¯ããã£ã1ã€ã®ããŒã ïŒ
apt-get install mongodb
æ£åžžæ§ããã¹ãããã«ã¯ãã³ã³ãœãŒã«ã«æ¬¡ã®ã³ãã³ãã®ãããããå ¥åã§ããŸãã
mongo
ãŸãã¯
ps aux | grep mongo
localhostïŒ28017ã§ããã¯ããããšãã§ããŸãã ã¢ããªã±ãŒã·ã§ã³ãéåžžMongoã§åäœãããã€ãã£ãããŒãã¯27017ã§ãããã©ãŠã¶ã®å Žåãããã©ã«ãã¯28017ã§ãã
MongoDBãµãŒããŒãå¶åŸ¡ããã«ã¯ã次ã®ã³ãã³ãã䜿çšããŸãã
$ sudo status mongodb
$ sudo stop mongodb
$ sudo start mongodb
$ sudo restart mongodb
ãµãŒããŒã誀ã£ãŠã·ã£ããããŠã³ããåŸïŒããšãã°ããã·ã³ãã·ã£ããããŠã³/ãªããŒããããšããããŒã¿ããŒã¹ãµãŒããŒãèµ·åãããšãïŒã¯ããŸã ãªãã®ãŸãŸã§ãã ããã¯ãç¹ã«ããã¯ãã¡ã€ã«ãäœæããããšã«ãã£ãŠè¡ãããŸãã ãµãŒããŒãåèµ·åããã«ã¯ã次ãå®è¡ããå¿ èŠããããŸãã
1.ããã¯ãã¡ã€ã«ãåé€ãã
2.å埩ã¹ã¯ãªãããå®è¡ãã
$ sudo rm /var/lib/mongodb/mongod.lock
$ sudo -u mongodb mongod -f /etc/mongodb.conf --repair
ããã§ãã¹ãŠã§ããç¬èªã®ã¢ããªã±ãŒã·ã§ã³ãäœæããæºåãã§ããŸããã æŠããŠãããŒã¿ããŒã¹ãªãã§ã¢ããªã±ãŒã·ã§ã³ãäœæããããšããå¥ã®ããŒã¿ããŒã¹ã䜿çšããããšãã§ããŸãã ããªãã®è£éã§ã ãµããŒããããããŒã¿ããŒã¹ã¯ãããã¥ã¡ã³ãã«ãªã¹ããããŠããŸãã
äœæ¥ç°å¢ã®ã»ããã¢ããïŒãªãã·ã§ã³ïŒ
Gmateãã©ã°ã€ã³ããã±ãŒãžãããŠã³ããŒãããŸããã ãããã®ãã¡ãç§ã¯æ¬åœã«ãããŸã§Zen Codingã®ã¿ã䜿çšããŠããŸãã ãã®ãã©ã°ã€ã³ã®äœ¿çšã«é¢ããåªãããã¥ãŒããªã¢ã«ã¯ã ãã®ãããªè¬çŸ©ã§çŽ¹ä»ãããŠããŸãã 人çãæ¬åœã«ç°¡çŽ åããŸãã
ç§ã®å人ã¯ãããã¯è²§ãã人ã®ããã®HAMLã§ãããšèšããŸãããããã®ã¬ã€ã€ãŒã®äœ¿çšã¯ä»ã®ãšãããæ¿å ¥ããããŠããŸããã
ãŸããã¹ããããïŒ Snippets ïŒã䜿çšããŸãã ãã®ãã©ã°ã€ã³ã«ã¯Geditãä»å±ããŠããŸãããããã©ã«ãã§ã¯ãªãã«ãªã£ãŠããŸãã æå¹ã«ããã«ã¯ã[ç·šé]-> [èšå®]-> [ãã©ã°ã€ã³]-> [ã¹ãããã]ã«ç§»åããŸãã
䜿ãæ¹ã¯ç°¡åã§ãã[ããŒã«]-> [ã¹ããããã®ç®¡ç]-> "your_language"ãéããŠæ¢åã®ãã®ãç·šéããããç¬èªã®ã¹ãããããè¿œå ããã ãã§ãã ãããã䜿çšããããã®æé ã¯ãã¡ãã§ãã ãããã解æããã®ã«çŽ3åããããããããããã«15åã§èªåã®ãã®ãäœæããŸããã ããããdivã®ãããªãã®ãèšè¿°ããTabãã¯ãªãã¯ããŠä»¥äžãååŸããã®ã¯ã©ãã»ã©äŸ¿å©ã§ããã
<div> </div>
å¿ èŠã«å¿ããŠãè¿œå ã®ãã£ãŒã«ãIDãã¹ã¿ã€ã«ãªã©ã®ããã¹ããè¿œå ã§ããŸãã ãŸããããã©ã«ãå€ãšã次ã«TabãæŒãããšãã«ã«ãŒãœã«ããžã£ã³ããããã€ã³ããèšå®ããŸãã
ç§ã¯Visual Studioã§ã¹ããããã䜿çšããŸããããGeditã§IMHOã䜿çšããæ¹ãã¯ããã«äŸ¿å©ã§ãã
ãããŠãã¯ããEmacsãNotepad ++ãããã³ä»ã®å€ãã®ãšãã£ã¿ãŒçšã®åæ§ã®ãã©ã°ã€ã³ããããŸãã
æåã®ãããžã§ã¯ãã®äœæ
ãã¹ãŠãé ä¿¡ããããã¹ãŠãæ©èœããŸãã Webãµã€ãã®äœæãéå§ã§ããŸãã ChicagoBossã§ãã£ã¬ã¯ããªã«ç§»åããã³ãã³ããèšè¿°ããŸãã
make app PROJECT=addressbook
ã¯ãããããžã§ã¯ãã®ååã¯æå¹ãªã¢ãã ã§ãªããã°ãªããŸããã ã¢ãã ã¯ååä»ãå®æ°ã§ãã ååã¯å°ããªæåã§ã®ã¿éå§ããå¿ èŠããããååã«ã¯æåãæ°åãã¢ã³ããŒã¹ã³ã¢ã®ã¿ãå«ããããšãã§ããŸãã
ãã¬ãŒã ã¯ãŒã¯ã¯ãããã©ã«ãã§ããŒã ãã£ã¬ã¯ããªã«æ°ãããã£ã¬ã¯ããªãäœæããŸãã ãããžã§ã¯ãå šäœãå éšã«ãããŸãããããžã§ã¯ãã移å/転é/åé€ãããå Žåã¯ããã®ãã£ã¬ã¯ããªã§ååã«æäœã§ããŸãã ãããžã§ã¯ãã®æ°ããäœæããããã£ã¬ã¯ããªã«ç§»åããŸã
cd ../addressbook
ãã¹ãŠã®ã³ãŒã/ãªãœãŒã¹ã¯srcãã£ã¬ã¯ããªã«ãããŸãã äžè¬çãªæ§é ïŒ

Srcãã£ã¬ã¯ããªæ§é ïŒ

ãªãœãŒã¹ãã¡ã€ã«ïŒjavascriptãcssãã¡ãã£ã¢ãã¡ã€ã«ïŒã¯/ priv / static /ã«ãããŸãã ã¹ã¿ã€ã«ã·ãŒãæ¥ç¶ã¯æ¬¡ã®ããã«ãªããŸãã
<link rel="stylesheet" href="/static/css/style.css" type="text/css" charset="utf-8" />
boss.configãç·šéããããŒã¿ããŒã¹ã«é¢ããããŒã¿ãè¿œå ããŸãã
{db_hostã "localhost"}ã
{db_portã27017}ã
{db_adapterãmongodb}ã
{db_databaseãã¢ãã¬ã¹åž³}ã
{db_write_modeãsafe}ã
{db_read_modeãmaster}ã
ãããç§ã®èšå®ïŒããã³ç°å¢ïŒã§ãã

åããŠã¢ãã¬ã¹åž³ãšããåèªãééã£ãŠæžãããšããå€ãã®ååãä»ããããŠãããããåŸã§æ£ããååã§ã¢ããªã±ãŒã·ã§ã³ãåäœæããå¿ èŠããããŸããã
次ã«ãsrc / model /ã«address.erlãã¡ã€ã«ãäœæããŸãã ããŒã¿ããŒã¹ã«ã¢ã¯ã»ã¹ããããã«å¿ èŠã§ãã ç§ã«ãšã£ãŠã¯ãã®ããã«èŠããŸãïŒ
-module(address, [Id, Firstname, Lastname, Address1, Address2, City, State, Country, Active, CreationTime, ModifictionTime ]). -compile([export_all]).
addressbook_main_controller.erlïŒ appname_controllername_controller ïŒãšããååã®ã³ã³ãããŒã©ãŒãäœæãã次ã®ã³ãŒããå éšã«èšè¿°ããŸãããã
-module(addressbook_main_controller, [Req, SessionID]). -compile([export_all]). index('GET', [])->{ok, [{data, "Hello World"}]}.
ã€ã³ããã¯ã¹ã¯ç§ãã¡ã®æ©èœã§ã
ã->ã以éã¯ãã¹ãŠé¢æ°ã®æ¬äœã§ãã
ãã®é¢æ°ã¯GETãªã¯ãšã¹ãã«å¿çããåŠçãæåãããšãããŒã¿å€æ°ã«æååãè¿ããŸãã
OK-ãã¹ãŠãããŸããã£ãããšãæå³ããŸãã ãšã©ãŒãåŠçããããã«ããšã©ãŒãšããåèªã䜿çšãããŸãã 次ã®ããã«ãªããŸãã
index('GET', [])-> {ok, [{data, "Hello World"}]}; {error, Reason}-> Reason.
è¿ãããå€ãããŒãžã«è¡šç€ºããã«ã¯ããã¥ãŒã«{{data}}ã¿ã°ãè¿œå ããå¿ èŠããããŸãã 確èªããã«ã¯ãæåã®htmlãã¡ã€ã«ã/ src / view / main /ãã£ã¬ã¯ããªã«äœæããŸãã ãããindex.htmlãšåŒã³ãŸãããïŒ
<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title>My addressbook</title> </head> <body> <form> <div id="main"> {{data}} </div> </form> </body> </html>
æåŸã®ä»äžãã¯ãã«ãŒãã®ã»ããã¢ããã§ãã ãã¡ã€ã«/priv/addressbook.routesãéããæ°ããã«ãŒããè¿œå ããŸãïŒããã©ã«ãã§ã¯ã«ãŒãããŸã ãªãããããã¹ãŠã®è¡ãã³ã¡ã³ãåãããŠããŸãïŒã
{"/", [{controller, "main"}, {action, "index"}]}.
ã¢ããªã±ãŒã·ã§ã³ã®ã³ã³ãã€ã«./rebar compile
./init-dev.shãå®è¡ããŸã
ãã©ãŠã¶ã«ç§»åããŠãlocalhostïŒ8001ãéããšãHello Worldã衚瀺ãããŸãã
ã«ãŒãã®å€æŽãé€ãã以éã®ãã¹ãŠã®å€æŽã¯ããµãŒããŒãåã³ã³ãã€ã«ããã³åèµ·åããã«é©çšãããŸãã ãã®å Žã§ã
ã«ãŒãã«ã€ããŠïŒã©ã®ã¢ãã¬ã¹ã§ã©ã®ã³ã³ãããŒã©ãŒãšã¡ãœãããåŒã³åºãããå³å¯ã«ç€ºãããšãã§ããŸãã ãŸãã¯ãã¢ãã¬ã¹ã«ãã©ãŒã / [ã³ã³ãããŒã©å] / [ã¢ã¯ã·ã§ã³å]ã®ãã«ãã¹ãæå®ã§ããŸãã ã€ãŸã ãã®å Žåãmainãšããååã®ã³ã³ãããŒã©ãŒããããŸãã createãšããã³ã³ãããŒã©ãŒã«æ°ããã¡ãœãããè¿œå ããå ŽåãlocalhostïŒ8001 / main / createã«ã¢ã¯ã»ã¹ããŠåŒã³åºãããšãã§ããŸãã ãŸãã¯ã次ã®ã«ãŒããæå®ããŸãã
{"/create", [{controller, "main"}, {action, "create"}]}.
ãããŠãåŒã³åºãã¯ããŒã«ã«ãã¹ãã®ããã«ãªããŸãïŒ8001 / create
DBã䜿çšãã
ããŒã¿ããŒã¹ãžã®æ¥ç¶ã¯ãã§ã«è¡ãããŠããŸãã WebãµãŒããŒã®å®è¡äžã«ã³ã³ãœãŒã«ã§ã¯ãšãªãå®è¡ããããšãã§ããŸãã ãããè¡ãã«ã¯ãã³ã³ãœãŒã«ã«ç§»åããã³ãã³ããå®è¡ããŠã¢ããªã±ãŒã·ã§ã³./init-dev.shãèµ·åããEnterããŒãæŒããŠãããšãã°æ¬¡ã®ããã«æ°ããéããè¡ãå ¥åããŸãã
boss_db:find(address, []).
ãã®ã³ãã³ãã¯ãã¢ãã¬ã¹ã¢ãã«ã«ãã€ã³ããããŠãããã¹ãŠã®ãšã³ããªã衚瀺ããŸãã çŸåšãããã«ã¯ã¬ã³ãŒãããããŸããïŒãŸãã¯ããã©ã«ãã§ç©ºã®ã¬ã³ãŒãããããŸãïŒã
boss_dbãšå ¥åã§ããŸããTabããŒãæŒããŠã䜿çšå¯èœãªã³ãã³ãã確èªããŸãã
[]-ããã©ã¡ãŒã¿ãŒããæå³ããŸãã æ¬åŒ§ã空ã®å Žåã0åã®ãã©ã¡ãŒã¿ãŒãæž¡ããŸãã findã³ãã³ãã®å Žåãfirstname = "ivan"ã®ãšã³ããªã®ãªã¹ããååŸã§ããŸãã
boss_db:find(address, [{firstname, "ivan"}]).
ã³ã³ãœãŒã«ã§ã¯ãããŒã¿ããŒã¹ã ãã§ãªããå€ãã®äŸ¿å©ãªã³ãã³ããå®è¡ã§ããŸãã
CRUD
ããã§ãã¢ãã«ãæ©èœããæºåãæŽããŸãããã³ã³ãããŒã©ã«æ°ããé¢æ°ãè¿œå ã§ããŸãã æ°ãããšã³ããªãè¿œå ããäœæé¢æ°ãè¿œå ããŸãã
create('GET', [])->ok; create('POST', [])-> Firstname = Req:post_param("firstname"), Lastname = Req:post_param("lastname"), Address1 = Req:post_param("address1"), Address2 = Req:post_param("address2"), City = Req:post_param("city"), State = Req:post_param("state"), Country = Req:post_param("country"), Active = Req:post_param("active"), CreationTime = erlang:now(), ModificationTime = erlang:now(), NewAddress = address:new(id, Firstname, Lastname, Address1, Address2, City, State, Country, Active, CreationTime, ModificationTime), case NewAddress:save() of {ok, SavedAddress}-> {redirect, [{action, "index"}]}; {error, Reason}-> Reason end.
ããã°ã©ããŒåãã«ã³ãŒããèªãããšã¯é£ãããªããšæãã®ã§ãããã§ã¯äœã説æããŸããã ç§ãèšããå¯äžã®ããšã¯ãidãèªåçã«äœæããããšããããšã§ãã
idã¯äºçŽèªã§ãã
Id-ãããã£ãŠãå€æ°ãåŒã³åºãããšãã§ããŸãã
ã¯ããèšèªã§ã¯å€§æåãšå°æåãåºå¥ãããŸãã
次ã«ããã®ã¡ãœããã®htmlãã¡ã€ã«ãäœæããŸãã create.htmlãšåŒã³ãŸãïŒ
<!DOCTYPE html> <html> <head> <title>My addressbook</title> </head> <body> <form method="post"> <header></header> <div id="main"> <table> <tr><td>Frist name</td> <td><input type="text" id="firstname" name="firstname" size="45" maxlength="255" value="" /></td></tr> <tr><td>Last name</td> <td><input type="text" id="lastname" name="lastname" size="45" maxlength="255" value="" /></td></tr> <tr><td>Address1</td> <td><input type="text" id="address1" name="address1" size="45" maxlength="255" value="" /></td></tr> <tr><td>Address2</td> <td><input type="text" id="address2" name="address2" size="45" maxlength="255" value="" /></td></tr> <tr><td>City</td> <td><input type="text" id="city" name="city" size="45" maxlength="255" value="" /></td></tr> <tr><td>State</td> <td><input type="text" id="state" name="state" size="45" maxlength="255" value="" /></td></tr> <tr><td>Country</td> <td><input type="text" id="country" name="country" size="45" maxlength="255" value="" /></td></tr> <tr><td>Active</td> <td><input type="checkbox" id="active" name="active" value="true" /></td></tr> </table> <button type="submit">Submit</button> </div> </form> </body> </html>
ããã§ãå€ãæž¡ãã³ã³ãããŒã«ã§ã¯ãidãã©ã¡ãŒã¿ãŒãšnameãã©ã¡ãŒã¿ãŒã®äž¡æ¹ãæå®ããå¿ èŠãããããšã«æ³šæããããšãéèŠã§ãã ãããã¯ããããããã¬ãŒã ã¯ãŒã¯ã®ããŸããŸãªéšåã§äœ¿çšãããŸãã ç§ã®æèŠã§ã¯ãEvanã¯ãã®ããžãã¹ãä¿®æ£ããå¿ èŠãªãã©ã¡ãŒã¿ãŒã1ã€ã ãæ®ããããšèããŠããŸãã ã¡ãªã¿ã«ãã»ãŒæ¯é±æŽæ°ãé »ç¹ã«å ¬éãããããããã®èšäºãå ¬éããããŸã§ã«ä¿®æ£ããã°ã©ã ãæ¢ã«ãªãªãŒã¹ãããŠããå¯èœæ§ããããŸãã
ããŒã¿ããŒã¹å ã®ãã¹ãŠã®ã¬ã³ãŒãã衚瀺ããå¥ã®é¢æ°ãè¿œå ããŸãïŒããæ£ç¢ºã«ã¯ã以åã«èšè¿°ãããã€ã³ããã¯ã¹é¢æ°ã眮ãæããŸãïŒã
index('GET', [])->Addresses = boss_db:find(address, []), {ok, [{addresses, Addresses}]}.
ãŸããindex.htmlããŒãžã®ã³ãŒããå€æŽããŸãã
<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title>My addressbook</title> </head> <body> <form method="post"> <header></header> <div id="main"> <table cellspacing="0" cellpadding="0"> <tr> <th>First name</th> <th>Last name</th> <th>City</th> <th>Address1</th> <th>Address2</th> <th>State</th> <th>Country</th> <th>Active</th> </tr> {% if addresses %} {% for address in addresses %} <tr> <td>{{address.firstname}}</td> <td>{{address.lastname}}</td> <td>{{address.city}}</td> <td>{{address.address1}}</td> <td>{{address.address2}}</td> <td>{{address.state}}</td> <td>{{address.country}}</td> <td>{{address.active}}</td> </tr> {% endfor %} {% endif %} </table> </div> </form> </body> </html>
ChicagoBossã¯ã ErlyDTLã©ã€ãã©ãªãä»ããŠDjangoãã³ãã¬ãŒãã·ã¹ãã ã䜿çšããŸãã Djangoãã³ãã¬ãŒãèšèª ã
ããã§ãã¢ãã¬ã¹/ main /ããã³/ main / createã«ã¢ã¯ã»ã¹ãããšãããŒã¿ããŒã¹ããã®æ å ±ã®å ¥åãšåºåã®2ã€ã®ãã©ãŒã ãåãåããŸãã
ã¬ã³ãŒããåé€ïŒåé€ïŒããã«ã¯ãã³ã³ãããŒã©ãŒã®æ¬¡ã®æ©èœã§ååã§ãã
delete('GET', [Id])-> boss_db:delete(Id), {redirect, [{action, "index"}]}.
localhostïŒ8001 / main / delete / [id]ãšåŒã¶ã ãã§ãã
ã¬ã³ãŒãã衚瀺ïŒè¡šç€ºïŒããã«ã¯ããã®é¢æ°ãã³ã³ãããŒã©ãŒã«è¿œå ããŸãã
show('GET', [Id])-> Address = boss_db:find(Id), {ok, [{address, Address}]}.
ãã¥ãŒãã¡ã€ã«show.htmlãäœæããŸãã
<!DOCTYPE html> <html> <head> <title>My addressbook</title> </head> <body> <form method="post"> <div id="main"> <table cellspacing="0" cellpadding="0"> {% if address %} <tr><td>First name</td><td>{{address.firstname}}</td></tr><tr> <td>Last name</td><td>{{address.lastname}}</td></tr><tr> <td>City</td><td>{{address.city}}</td></tr><tr> <td>Address1</td><td>{{address.address1}}</td></tr><tr> <td>Address2</td><td>{{address.address2}}</td></tr><tr> <td>State</td><td>{{address.state}}</td></tr><tr> <td>Country</td><td>{{address.country}}</td></tr><tr> <td>Modification time</td><td>{{address.modification_time}}</td></tr><tr> <td>Creation time</td><td>{{address.creation_time}}</td></tr><tr> <td>Active</td><td>{{address.active}}</td></tr> {% endif %} </table> </div> </form> </body> </html>
ã¬ã³ãŒãã®ç·šéã¯ãäœæãšè¡šç€ºã®æ··åã§ãã ã³ã³ãããŒã©ãŒã«ããã«2ã€ã®æ©èœãè¿œå ããŸãã
edit('GET', [Id])-> Address = boss_db:find(Id), {ok, [{address, Address}]}; edit('POST', [Id])-> Address = boss_db:find(Id), NewAddress = Address:set([{firstname, Req:post_param("firstname")}, {lastname, Req:post_param("lastname")}, {address1, Req:post_param("address1")}, {address2, Req:post_param("address2")}, {city, Req:post_param("city")}, {state, Req:post_param("state")}, {country, Req:post_param("country")}, {active, Req:post_param("active")}, {modification_time, erlang:now()}]), case NewAddress:save() of {ok, SavedAddress}-> {redirect, [{action, "index"}]}; {error, Reason}-> Reason end.
Erlangã§ã¯ãã¹ãŠã®å€æ°ã¯äžå€ã§ããããšã«æ³šæããããšãéèŠã§ãïŒ ãããã£ãŠãæåã«AddressãååŸããŠãããNewAddressããã®å€æ°ã®å€æŽãããç¶æ ã«å²ãåœãŠãå¿ èŠããããŸãã
æåã®é¢æ°ã¯showé¢æ°ãšåãããšãè¡ãã2çªç®ã®é¢æ°ã¯ãã©ãŒã ã®[éä¿¡]ãã¿ã³ãã¯ãªãã¯ããåŸã«ããŒã¿ããŒã¹ã®æ å ±ãæŽæ°ããŸãã
ãã®ãŸãã«ãã©ãŒã edit.htmlãè¿œå ããŸãã
<!DOCTYPE html> <html> <head> <title>My addressbook</title> </head> <body> <form method="post"> <table cellspacing="0" cellpadding="0"> {% if address %} <tr><td>First name</td><td><input type="text" id="firstname" name="firstname" size="45" maxlength="255" value="{{address.firstname}}" /></td></tr><tr> <td>Last name</td><td><input type="text" id="lastname" name="lastname" size="45" maxlength="255" value="{{address.lastname}}" /></td></tr><tr> <td>City</td><td><input type="text" id="city" name="city" size="45" maxlength="255" value="{{address.city}}" /></td></tr><tr> <td>Address1</td><td><input type="text" id="address1" name="address1" size="45" maxlength="255" value="{{address.address1}}" /></td></tr><tr> <td>Address2</td><td><input type="text" id="address2" name="address2" size="45" maxlength="255" value="{{address.address2}}" /></td></tr><tr> <td>State</td><td><input type="text" id="state" name="state" size="45" maxlength="255" value="{{address.state}}" /></td></tr><tr> <td>Country</td><td><input type="text" id="country" name="country" size="45" maxlength="255" value="{{address.country}}" /></td></tr><tr> <td>Active</td><td><input type="checkbox" id="active" name="active" value="{{address.active}}" /></td></tr> {% endif %} </table> <button type="submit">Submit</button> </form> </body> </html>
ããã§ãã¹ãŠã§ããCRUDã®æºåã¯å®äºã§ãã
å ç®
èšäºãæžããŠããéããã°ã€ã³ãç»é²ãç»é²ãŠãŒã¶ãŒã®ãªã¹ãããã£ãããå ¥åæ€èšŒã 管çããã« ïŒãã¹ãŠã®ãµã€ãã³ãŒãã¯githubã«ããããªã³ã¯ã¯ãªãœãŒã¹ã»ã¯ã·ã§ã³ã«ãããŸãïŒãåºå®ããããšãã§ããŸããã
ç¹ã«IEã§äœæ¥ããŠããå Žåã¯ããã¹ãå°çšã®æ©èœãåãããã£ããã«ãã°ãæ®ã£ãŠãããããç¹ã«IEã§ãã°ã€ã³ãç¡å¹ã«ããŸãããããããªããšãåé¡ãçºçããŸãã 圌ãšãã£ããã§ããŸããããµãŒããŒã¯ã¯ã©ãã·ã¥ããŸããããå¿«é©ã§ã¯ãããŸããã ç§ã®ä»äºã¯ãErlangã®åäœã瀺ãããšã§ãããIEã®Ajaxåé¡ã解決ããããšã§ã¯ãããŸããã
管çããã«ã¯ä»»æã®æ°ãããµã€ãã«ã€ã³ã¹ããŒã«ã§ãã5åéæ©èœããŸãã
ãŸãããã³ãã¬ãŒããè©ŠããŠã¿ãŸããã ãã®çµæã次ã®ãããªãã¹ã¿ãŒãã³ãã¬ãŒãã1ã€åŸãããŸããã
<!DOCTYPE html> <html lang="en"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <link rel="stylesheet" href="/static/css/style.css" type="text/css" charset="utf-8" /> <title>{% block title %}My amazing site{% endblock %}</title> {% block res %} {% endblock %} </head> <body> <header> {% if person %} Hello, {{person.name}} (<a href="/user/logout">Quick, Log Me Out!</a>) <br /> {% endif %} Your IP: {{ip}} </header> <nav> <ul class="nav"> <li class="nav"><a href="/">Home</a></li> <li class="nav"><a href="/create">Create</a></li> <li class="nav"><a href="/chat/live/public">Chat</a></li> <li class="nav"><a href="/user/login">Login</a></li> <li class="nav"><a href="/user/showall">Users</a></li> </ul> </nav> <section> {% block content %}{% endblock %} </section> <footer> {% block footer %}{% endblock %} </footer> </body> </html>
ãããŠä»ãç§ã®show.htmlã¯æ¬¡ã®ããã«ãªããŸãã
{% extends "layout/application.html" %} {% block title %}My addressbook{% endblock %} {% block content %} <table cellspacing="0" cellpadding="0"> {% if address %} <tr><td>First name</td><td>{{address.firstname}}</td></tr><tr> <td>Last name</td><td>{{address.lastname}}</td></tr><tr> <td>City</td><td>{{address.city}}</td></tr><tr> <td>Address1</td><td>{{address.address1}}</td></tr><tr> <td>Address2</td><td>{{address.address2}}</td></tr><tr> <td>State</td><td>{{address.state}}</td></tr><tr> <td>Country</td><td>{{address.country}}</td></tr><tr> <td>Modification time</td><td>{{address.modification_time}}</td></tr><tr> <td>Creation time</td><td>{{address.creation_time}}</td></tr><tr> <td>Active</td><td>{{address.active}}</td></tr> {% endif %} </table> {% endblock %}
1ã€ã®ãã¬ãŒã ãšç°ãªãã³ã³ãã³ããå€æããŸãã
Djangoãã³ãã¬ãŒãã®è©³çŽ°ã«ã€ããŠã¯ãå ¬åŒWebãµã€ããã芧ãã ããããªã³ã¯ã¯ä»¥äžã®ãªãœãŒã¹ã«ãããŸãã
ChicagoBossã«ã¯ãç¬èªã®ãã³ãã¬ãŒãããããŸãã ãããã«ã€ããŠã®å°ãã®æ å ±ã¯å ¬åŒãŠã§ããµã€ãã§èŠã€ããããšãã§ããŸãã è€éãªããšã¯äœããããŸããã ãã䜿çšãããã³ãŒããã¿ã°ã«çœ®ãæããã ãã§ãã ããŠãããã«ããã€ãã®ã°ããºã
ãŸãšã
2æ¥åŸã®ãµãŒããŒã®çµæã¯æ¬¡ã®ãšããã§ãã
UPDïŒçŸæç¹ã§ã¯ãçµæã®ãã¡ã以äžã®ã¿ïŒ
ãã®ãµã€ãã¯ãã»ãã¥ãªãã£ãã§ãã¯ãå®æœããç®çãªãã«ã泚å°ã«å¯Ÿããä¿è·ãªãã§äœæãããŸããã ãã®ãµã€ãã¯ããã¯ãããžãŒãåçŽãªäŸãšã©ã®ããã«æ©èœãããã®äŸã瀺ãããã ãã«äœæãããŸããã
UPDïŒ Habraeffectã¯3æ30æ¥ã«ã®ã¿èŠ³å¯ãããŸããã æ®ãã®æ¥ã¯ã蚪åãããŠãŒã¶ãŒãæã§æ°ããããšãã§ããŸãã
Google Analyticsãš1æ¥ãããã®ããŒã«ã«ãã°ã«ãããšïŒ
-ãµã€ãã«ã¯1489人ã®ãŠãŒã¶ãŒãã¢ã¯ã»ã¹ããŸãã
-ããŒãžãã¥ãŒ-9070
-ããŒã¿ããŒã¹ã¯ãšãª-43051
-åæã«ãã£ããã«åå ã§ãããŠãŒã¶ãŒã®æ倧æ°ã100
JavaScriptã³ãŒãã®ããã¯ããŒã ã§ãã£ãããè¡ãããªãã£ãå Žåãããã«ãªã¯ãšã¹ãããããŸãã
åžžã«ãµãŒããŒãã¯ã©ãã·ã¥ããããšã¯ãããŸããã ããŒã¿ããŒã¹ãæ害ãªååããåé€ããå°ãªããšãç¥å¥ªè ããã®ä¿è·ãè¿œå ããããã«ã®ã¿ãªãã«ããå¿ èŠããããŸããã
è³æº
ãã¹ããµã€ããžã®ãªã³ã¯
ãœãŒã¹ãžã®ãªã³ã¯
ChicagoBossã®å ¬åŒãŠã§ããµã€ã ã åããµã€ãã«ãAPIããã¥ã¡ã³ããWikiãªã³ã¯ãããã³ãã¬ãŒã ã¯ãŒã¯ã®æäœã«é¢ãããã¬ãŒãã³ã°ããããŸãã
Erlangå ¬åŒãŠã§ããµã€ã
ãã·ã¢ã®ã³ãã¥ããã£ã¢ãŒã©ã³ ã ãã·ã¢èªã®WikiããããŸãã
ã¢ãŒã©ã³ãæ¢çŽ¢ããã®ã«æé©ãªãµã€ã
Erlangããã¥ã¡ã³ã
Erlangãœãªã¥ãŒã·ã§ã³ ã ããããæ£ããããŒãžã§ã³ã®ErlangãããŠã³ããŒãã§ããŸãã
ãšãŽã¡ã³ã®èª¬æãããªïŒ ãšããœãŒã1 ã ãšããœãŒã2 ã ãšããœãŒã3
Erlangã«ãã競åããã°ã©ãã³ã° ã ãã¬ãŒãã³ã°ã«é©ãããããªçŽ æã
Ruby on RailsãšChicagoBossã®éã
NodejsãšErlangã®æ¯èŒ
100äžäººã®ãŠãŒã¶ãŒã«ãµãŒãã¹ãæäŸããæ¹æ³ïŒ
Djangoãã³ãã¬ãŒãèšèª ã Djangoãã³ãã¬ãŒãã·ã¹ãã ã
ChicagoBoss Googleã°ã«ãŒã