
1.ã¯ããã«
ãã®ãããžã§ã¯ãã¯ãã¢ãã€ã«ã¢ããªã±ãŒã·ã§ã³ã§Google App Engineã䜿çšããç°¡åãªäŸã§ãã
ãµãŒããŒéšåã¯ãJSON圢åŒã®ãã³ã®ã³ã®ãªã¹ããæäŸããŸãã ã¢ãã€ã«ã¯ã©ã€ã¢ã³ãã¯ãHTTPãŸãã¯HTTPSãä»ããŠãã®ãªã¹ããèŠæ±ããŸãã
ãŸãããµãŒããŒåŽã¯ããŒã¿ããŒã¹ã«ç¹å®ã®ã€ãã³ããã€ãŸãç¹å®ã®ãã³ã®ã³ãžã®èšªåæ°ãšãã¿ã³ãæŒããåæ°ãèšé²ããŸããã€ãŸããéã«é€ãäžããããªããæ»ããŸãã
åãã³ã®ã³ã«ã¯ã 
Name ã 
Bioããã³counterãã£ãŒã«ãã®èª¬æãã£ãŒã«ãããããŸãã
2.翻蚳ã®åŸ®åŠã
ãã³ã®ã³ä¿è²ã·ãã¥ã¬ãŒã¿ããã·ã¢èªã«ç¿»èš³ããæ¹æ³ãèããŸããããã幌çšåãã¯ãä¿è²ãããä¿è²ããšããŠãé©ããŠããŸããã ãããã£ãŠã翻蚳ããã«æ®ã£ââãã
3.æºå
Google App Engine Go SDKãã€ã³ã¹ããŒã«ãããŠããªãå Žåã¯ã 
Google App Engineãªã³ã¯ãã¯ãªãã¯ãããä»ãã詊ãããã¯ãªãã¯ããŠããã¹ãŠã®ãã€ã³ãã«åŸããŸãã ãããžã§ã¯ãã«ååãä»ãã[Go]ãéžæããSDKãããŠã³ããŒãããŠã€ã³ã¹ããŒã«ããŸãã ç°å¢å€æ°ïŒ 
PATH ã 
GOROOT ã 
GOPATH ã 
APPENGINE_DEV_APPSERVER ïŒã
APPENGINE_DEV_APPSERVERããããšã確èªããŠãã ãããããã«ããã 
goappã³ãã³ãã衚瀺ãããŸãã ä»åŸã¯ãåçŽãªãããžã§ã¯ããGAEãµãŒããŒã«ã¢ããããŒãããŠå®è¡
goapp deployã¯ããããžã§ã¯ããã£ã¬ã¯ããªã§
goapp deployã³ãã³ããå®è¡ããå¿
èŠããããš
goapp deployãŸãã 圌女ã¯ããããžã§ã¯ããé
眮ããGoogleã¢ã«ãŠã³ãã®ã¡ãŒã«ãå°ããŸãã ãããžã§ã¯ãåãapp.yamlãšãµã€ãã§äžèŽããããšãéèŠã§ãã ãã ãããã®ãããžã§ã¯ãã§ã¯ãã¢ãžã¥ãŒã«ã䜿çšãããããŒãããã»ã¹ãå€å°ç°ãªããŸãã
Goã®IDEãšããŠ
LiteIDEããLuaããã³Corona SDKã®
ZeroBrane Studioããå§ãããŸãã Corona SDKã¯
Webãµã€ãããããŠã³ããŒãã§ããŸãã
4.ã¯ãªã³ããµãŒããŒ
次ã®å³ã¯ãã¯ã©ã€ã¢ã³ãïŒå·ŠïŒãšãµãŒããŒïŒå³ïŒã®éã®éåžžã«è€éãªéä¿¡ã¹ããŒã ã瀺ããŠããŸãã
ã芧ã®ãšãããã¯ã©ã€ã¢ã³ãã¯ãã³ã®ã³ã®ãªã¹ãã®ã¿ãèŠæ±ãã3ã€ã®ã€ãã³ãã®ã¿ãéä¿¡ããŸãã éä¿¡ã¯HTTPçµç±ã§ãããHTTPSã¯ç¡æã§äœ¿çšã§ããŸãã ããã¯ãGAEã䜿çšããå©ç¹ã®1ã€ã«èµ·å ããå¯èœæ§ããããŸããSSLèšŒææžã«æ¯æããããŠãããã§äœæ¥ãæ§æããå¿
èŠã¯ãããŸããã
ãã¹ãŠãHTTPãä»ããŠæ©èœãããããç¹å¥ãªã¯ã©ã€ã¢ã³ãã䜿çšããã«ãã©ãŠã¶ãŒã§ãªã¯ãšã¹ããçŽæ¥å®è¡ã§ããŸãã
penguin-daycare-simulator.appspot.comã¢ãã€ã«ã¯ã©ã€ã¢ã³ãã§ã¯äœ¿çšãããªãåçŽãªæšæ¶ã§ããããµãŒãã¹ãæ©èœããŠãããã©ããã確èªã§ããŸãã httpãhttpsã«çœ®ãæããŠããããæ©èœããããšã確èªã§ããŸãã
penguin-daycare-simulator.appspot.com/penguinsããã¯æãéèŠãªãªã¯ãšã¹ãã§ãã ã¢ãã€ã«ã¯ã©ã€ã¢ã³ãã¯ããã®å©ããåããŠãçŸåšç£èŠäžã«ãããã¹ãŠã®ãã³ã®ã³ã®ãªã¹ããåãåããŸãã
ãã®ããŒã¿ããã䟿å©ã«è¡šç€ºããã«ã¯ãChromeã®
JSONviewæ¡åŒµæ©èœããå§ãããŸãã
penguin-daycare-simulator.appspot.com/stat/visitpenguin-daycare-simulator.appspot.com/stat/fishpenguin-daycare-simulator.appspot.com/stat/bellyrubãããã®3ã€ã®ã¯ãšãªã¯ããã³ã®ã³ã®å¯Ÿå¿ããã«ãŠã³ããã€ã³ã¯ãªã¡ã³ãããŸãã ãã³ã®ã³
Id POSTãã©ã¡ãŒã¿ãŒãšããŠæž¡ãããŸãã ãµãŒããŒã¯å¿çã§äœãè¿ããŸããããå¿
èŠã«å¿ããŠãæååãOKããŸãã¯æäœã®æåã®å¥ã®ä¿¡å·ãå¿çã«è¿œå ã§ããŸãã
5.ããå€ãã®ã¹ã¯ãªãŒã³ã·ã§ãããããå€ãã®ã¹ã¯ãªãŒã³ã·ã§ããïŒ


èšäºã®å
¬éåã«ãç§ã¯ãã®ãã³ã®ã³ã«ã€ããŠæãåºããŸããïŒ
ããžãã£ããèŠã 6.ãµãŒããŒ-Google App Engine
ããã§ãã³ãŒãã«çŽæ¥ã¢ã¯ã»ã¹ã§ããŸãã Goãããžã§ã¯ãã®ãã¡ã€ã«æ§é ãèæ
®ããŠãã ããã
 PenguinDaycareSimulatorServer/ âââ default/ â  âââ app.go â  âââ default.yaml â  âââ penguins.json âââ static/ â  âââ favicon.ico â  âââ static.yaml âââ dispatch.yaml 
defaultããã³
staticã¯ã¢ãžã¥ãŒã«ã§ãã GAEã®ãããžã§ã¯ãã¯ã¢ãžã¥ãŒã«ã«åå²ããããšããã¢ãžã¥ãŒã«ãªãã§æ©èœããããšãã§ããŸãã ãã®å Žåã 
app.yamlãã¡ã€ã«ã¯
app.yaml ã 
app/app.goããã³
penguins.json 3ã€ã ãã§ãã å
ã
ããã¯ç§ã®ãããžã§ã¯ãã®ã±ãŒã¹ã§ããïŒGitHubã§æåã®ã³ããããèŠãããšãã§ããŸãïŒããã¢ããªã±ãŒã·ã§ã³ã®1ã€ã®ã€ã³ã¹ã¿ã³ã¹ãåŠçã§ããåæãªã¯ãšã¹ãã®æ°ãæ
åœãã
max_concurrent_requestsèšå®ã远å ãããã£ãã®ã§ãã ããã©ã«ãå€ã¯10ã®ã¿ã§ããGoã¯æããã«ãã以äžã®æ©èœãåããŠããŸãã æå€§å€ã¯500ã§ããè² è·ãå¢å ããŠãã®å€ãè¶
ãããšãã¢ããªã±ãŒã·ã§ã³ã®è¿œå ã®ã³ããŒãèµ·åããããããã®éã§è² è·ã忣ãããŸãã GAEã®ç¡æã®ã¯ã©ãŒã¿ã®ã¿ã«åãããå Žåã¯ããã®èšå®ã䜿çšããããšã匷ããå§ãããŸãã ã¢ããªã±ãŒã·ã§ã³ããã®ãããªè² è·ã«å¯Ÿå¿ããŠããªãå Žåã¯ããã®å€ãæžãããŠææè«æ±ã«åãæ¿ããŸãã
ãããã£ãŠããã®èšå®ã¯ã¢ãžã¥ãŒã«ã§ã®ã¿äœ¿çšã§ããŸãã ãŸããGAEãã¢ãžã¥ãŒã«ãšèŠãªãã«ã¯ãã¢ããªã±ãŒã·ã§ã³ã«å°ãªããšã2ã€ã®ã¢ãžã¥ãŒã«ãå¿
èŠã§ãã
staticã¯éåžžã«ã·ã³ãã«ãªã¢ãžã¥ãŒã«ã§ããïŒäžèšã®GAEã®å¶éããªãå ŽåïŒããã®ã¿ã¹ã¯ã¯
favicon.icoãã¡ã€ã«ãéçã«æäŸããããšã ãã§ãã
default -ãã¹ãŠã®äœæ¥ãè¡ãã¡ã€ã³ã¢ãžã¥ãŒã«ã
*.yamlãã¡ã€ã«ã¯èšå®ãšèª¬æã§ãã åã¢ãžã¥ãŒã«ã«1ã€ãšãã©ã®ã¢ãžã¥ãŒã«ãã©ã®URLãåŠçããããèšè¿°ãã1ã€ã®
dispatch.yamlãã¡ã€ã«ã
dispatch.yaml application: penguin-daycare-simulator dispatch: - url: "*/favicon.ico" module: static - url: "*/" module: default 
 static.yaml application: penguin-daycare-simulator module: static version: 1 runtime: python27 api_version: 1 threadsafe: true handlers: - url: /favicon.ico static_files: favicon.ico upload: favicon.ico 
 default.yaml application: penguin-daycare-simulator module: default version: 1 runtime: go api_version: go1 automatic_scaling: max_concurrent_requests: 500 handlers: - url: /.* script: _go_app 
 static.yamlã©ã³ã¿ã€ã ã§ã¯ãGoã§ã¯ãªãPythonãæå®ãããŠããããšã«æ³šæããŠãã ããã ããã¯ãå®éã«Goãã¡ã€ã«ãªãã§Goã«ã¢ãžã¥ãŒã«ãããŒãããããšãããšãGAEãèªãããã§ãã ãããã圌ã¯ãã®ç¶æ³ã§PythonãšPHPãèªããŸããã
ãªããããã¯ããã®æ³šææ·±ãèªè
ã¯ããPHPã¯éçãã¡ã€ã«ã®ã¬ã³ããªã³ã°ã«é¢ããŠPythonãããæªãããšäž»åŒµããèæŠãè§£ãæŸãšããšããŸãããPythonã¯å人çã«ç§ã«è¿ãã®ã§ããããéžãã ã®ã§ãã 誰ã§ããã®ç®çã§PHPã䜿çšã§ããŸãã ãã¡ããããã®ããã»ã¹ã«ã¯PythonãPHPãé¢äžããŠããªããããããã¯ãã¹ãŠç¡æå³ã§ãã
 default.yaml handlersã¯ãç¹å®ã®URLãåŠçããå®è¡å¯èœãã¡ã€ã«ã瀺ããŸãã ãã®å Žåãapp.goã¯ãã¹ãŠã®çä¿¡ãªã¯ãšã¹ããåŠçããŸãïŒ 
dispatch.yamlãèæ
®ã«å
¥ããŸãïŒã URLã®èª¬æã¯éåžžã«æè»ã§ãæ£èŠè¡šçŸã䜿çšããŸãã ãã ããPythonãšPHPã§ç°ãªããã¡ã€ã«ã䜿çšããŠåãã¢ãžã¥ãŒã«å
ã®ç°ãªãURLãåŠçã§ããå ŽåãGoã§ã¯ã_go_appããšããŠæå®ãããåäžã®ãã¡ã€ã«ã§ããå¿
èŠããããŸãã ããã«ãæ¢ã«Goããã°ã©ã å
ã§ãå¿
èŠã«å¿ããŠãç°ãªãURLã®ãã³ãã©ãŒãéžæããã¢ããªã±ãŒã·ã§ã³å
šäœãè€æ°ã®ãã¡ã€ã«ã«åå²ã§ããŸãã
èšå®ãšyamlãã¡ã€ã«ã®è©³çްã«ã€ããŠã¯ã 
ãã¡ããã芧ãã ãã ã
penguins.json䜿çšãããŠãããã¹ãŠã®ãã³ã®ã³ã®ååãšèª¬æãå«ãJSONãã¡ã€ã«ã
penguins.json [ {"id": "1", "name": "Tux", "bio": "Beloved Linux mascot" }, {"id": "2", "name": "Skipper", "bio": "Small combat squad leader" }, {"id": "3", "name": "Lolo", "bio": "Russian adventurer" }, {"id": "4", "name": "Gunter", "bio": "The darkest character in Adventure Time" }, {"id": "5", "name": "The Penguin", "bio": "Na, na, na, na, na, na, na, na, na, na... The Penguin! " } ] 
 ãã®ãã¡ã€ã«ãä»ããŠãã³ã®ã³ã®è¿œå ãç·šéãè¡ãããŸãã
ã¢ããªã±ãŒã·ã§ã³å
šäœã®
app.goãŸãã å®å
šãªãªã¹ãã¯ãGitHub- 
app.goã§èŠãã®ã«äŸ¿å©ã§ãããã®ãã¡ã€ã«ã®åçŽåãããæ§é ïŒ
 package app    . import (...)   : Id, , , . type penguin struct {...}  ()  . var penguins []penguin     . type penguinEntity struct {...} . func init() {...}  penguins.json   penguins. func loadPenguinsJson() {...}  / -   . func rootHandler(w http.ResponseWriter, r *http.Request) {...}  /penguins -        JSON. func penguinsHandler(w http.ResponseWriter, r *http.Request) {...}   /stat/visit -  . func visitHandler(w http.ResponseWriter, r *http.Request) {...}   /stat/fish -   . func fishHandler(w http.ResponseWriter, r *http.Request) {...}   /stat/bellyrub -    . func bellyrubHandler(w http.ResponseWriter, r *http.Request) {...} 
ã¢ããªã±ãŒã·ã§ã³ãèµ·åãããšãæåã«initïŒïŒé¢æ°ãèµ·åãããŸãããã®é¢æ°ã¯ãpenguins.jsonãã¡ã€ã«ããèªã¿åããã¯ã©ã€ã¢ã³ãããã®ããŸããŸãªèŠæ±ã«å¿çãã颿°ãèšå®ããŸãã èšäºã®åé ã®ãªã³ã¯ã§æ¢ã«äœ¿çšã§ããŸãã
penguinsHandler()ã¯ã 
json.Marshal()颿°ã䜿çšããŠãã³ã®ã³ã¹ã©ã€ã¹ãJSON圢åŒã«
json.Marshal()ãã 
json.Marshal()ãä»ããŠã¯ã©ã€ã¢ã³ãã«æäŸããŸãã
visitHandler() ã 
fishHandler() ã 
bellyrubHandler()ã¯åãããžãã¯ã«åŸã£ãŠåäœããŸããããŒã¿ããŒã¹ãããã³ã®ã³ãåãåºãã察å¿ãããã©ã¡ãŒã¿ãŒã1ã€å¢ãããŠããŒã¿ããŒã¹ã«æžãæ»ããŸãã ããŒã¿ããŒã¹- 
ããŒã¿ã¹ã㢠-ã¯SQLäºæã§ã¯ãããŸãããã€ãŸããNoSQLãœãªã¥ãŒã·ã§ã³ã§ãã 圌女ã®äœåã®èª¬æã¯å¥ã®èšäºã«å€ããŸãã
ããŒã¿ã¹ãã¢ãžã®ã¢ã¯ã»ã¹ãªã©ãGAEã®å€ãã®æäœã¯åå¥ã«èª²éãããããããªãœãŒã¹ã®éå°ãªäœ¿çšã¯é¿ããŠãã ããã ãã®ãããããšãã°ããã¹ãŠã®ãã³ã®ã³ã®çµ±èšãèŠæ±ããå Žåãé¢é£ããŒã¿ãæäŸããããšã¯å®å
šã«ãªãã·ã§ã³ã§ãã ãã®ãªã¯ãšã¹ãã¯ãããšãã°10åã®ãã£ãã·ã¥æå¹æéã§ãã£ãã·ã¥ã§ããŸãã ãããè¡ãããã«ã远å ã®å€æ°
lastUpdateTimeãå°å
¥ããŸãããããã¯ã 
penguinsã¹ã©ã€ã¹ã®æåŸã®æŽæ°ã®ã¿ã€ã ã¹ã¿ã³ãã§ãã ãããŠãå
/penguinsãªã¯ãšã¹ãã§
updatePenguinsStatistics()颿°ãåŒã³åºããŸãããã®é¢æ°ã¯ããã£ãã·ã¥ã®æå¹æéãåããŠãããã©ããã確èªãããµã€ã¯ã«ã§
penguinsã¹ã©ã€ã¹å
ã®åãã³ã®ã³ã®ã«ãŠã³ã¿ãŒãæŽæ°ããŸãã
æåã§æŽæ°ã匷å¶ããããã«ã远å ã®èŠæ±
/æŽæ°ãšå¯Ÿå¿ãã
updateHandler()ãã³ãã©ãŒãå°å
¥ããŸããã
åèŠæ±ã¯ç¬èªã®ãŽã«ãŒãã³ã§åŠçãããããã 
penguinsã¹ã©ã€ã¹ãèšé²äžã®åææžã蟌ã¿ãŸãã¯èªã¿åãããä¿è·ããå¿
èŠããããŸãã ãã®ããã«ã 
RWMutexã䜿çšãããŸã-èªã¿åããŸãã¯æžã蟌ã¿çšã®ãã¥ãŒããã¯ã¹ã ãã®äœ¿çšã¯ãåçŽãª
Mutexããã广çã§ãã
ãªãœãŒã¹ã®æ¯ææžã¿æ¶è²»ãåé¿ããããã«ãããŒã¿ããŒã¹ã«é
å»¶ã¬ã³ãŒããå
¥åããŠãåä¿¡ãããã¹ãŠã®ã€ãã³ãã®å€ãèç©ããããšãã§ããŸãã
ãããžã§ã¯ããGAEãµãŒããŒã«ã¢ããããŒãããã«ã¯ããããžã§ã¯ããã£ã¬ã¯ããªã®ã¿ãŒããã«ã§3ã€ã®ã³ãã³ããå®è¡ããå¿
èŠããããŸãã
 goapp deploy default/default.yaml goapp deploy static/static.yaml appcfg.py update_dispatch . 
å°æ¥ãapp.goã倿Žãããšãã¯ã 
goapp deploy default/default.yamlãå®è¡ããã ãã§ãã
çµè«ãšããŠãç¡æã®å¶éãå¢ããã«ã¯ãææã®è«æ±æžãæ¥ç¶ããããšããå§ãããŸãããåæã«1æ¥ãããã®æå€§è²»çšã1ãã«ã«èšå®ããããšããµãŒããŒåŽã«ã€ããŠã話ããŸãã åæã«ãäžéšã®ç¡æå²ãåœãŠãå¢å ããŠããŸããããŸã äœã䜿çšããŠããŸããã
7.ã¯ã©ã€ã¢ã³ãåŽ-Corona SDK
Corona SDKã¯ãAndroidãiOSãWindows PhoneïŒè¿æ¥å
¬éäºå®ïŒãHTML5ïŒéçºäžïŒçšã®ã¢ãã€ã«ã¢ããªã±ãŒã·ã§ã³ãéçºããããã®ã¯ãã¹ãã©ãããã©ãŒã ãã¬ãŒã ã¯ãŒã¯ã§ãã ç§ã¯ãã®è£œåãããªãé·ãé䜿çšããŠãããããªãŒã©ã³ãµãŒãšããŠã®ã¯ã©ã€ã¢ã³ããšç§èªèº«ã®ããã«ã²ãŒã ãæžããŠããŸãã é©åãªé床ãšã¢ããªã±ãŒã·ã§ã³ã®äœæéåºŠã«æ³šæããŠãã ããã
ãããžã§ã¯ãã®ãã¡ã€ã«æ§é ããå§ããŸãããã äž»ã«ã¢ã€ã³ã³ãšåçã®ããã«ãããã«ããã«ãã¡ã€ã«ããããŸãã®ã§ãç§ã¯ã¹ãã€ã©ãŒã®äžã§ãããããããã«ããŸãã
ãã¡ã€ã«æ§é  PenguinDaycareSimulator/ âââ images/ â  âââ penguins/ â  â  âââ 1.png â  â  âââ 1@2x.png â  â  âââ 2.png â  â  âââ 2@2x.png â  â  âââ 3.png â  â  âââ 3@2x.png â  â  âââ 4.png â  â  âââ 4@2x.png â  â  âââ 5.png â  â  âââ 5@2x.png â  âââ background.jpg â  âââ background@2x.jpg â  âââ button-over.png â  âââ button-over@2x.png â  âââ button.png â  âââ button@2x.png â  âââ dot-off.png â  âââ dot-off@2x.png â  âââ dot.png â  âââ dot@2x.png â  âââ fish.png â  âââ fish@2x.png â  âââ hand.png â  âââ hand@2x.png â  âââ popup.png â  âââ popup@2x.png âââ lib/ â  âââ api.lua â  âââ app.lua â  âââ utils.lua âââ scenes/ â  âââ choose.lua â  âââ menu.lua â  âââ penguin.lua âââ Default-568h@2x.png âââ Icon-60.png âââ Icon-60@2x.png âââ Icon-72.png âââ Icon-72@2x.png âââ Icon-76.png âââ Icon-76@2x.png âââ Icon-Small-40.png âââ Icon-Small-40@2x.png âââ Icon-Small-50.png âââ Icon-Small-50@2x.png âââ Icon-Small.png âââ Icon-Small@2x.png âââ Icon-hdpi.png âââ Icon-ldpi.png âââ Icon-mdpi.png âââ Icon-ouya.png âââ Icon-xhdpi.png âââ Icon-xxhdpi.png âââ Icon.png âââ Icon@2x.png âââ build.settings âââ config.lua âââ main.lua 
 ä»ã®ãšãããLuaãã¡ã€ã«ã«ã®ã¿æ³šæãæãããšãã§ããŸãã
config.lua ã 
build.settings -Corona SDKã®ãããžã§ã¯ãèšå®ãã¡ã€ã«ã ããŒãã¬ãŒããã¥ãŒãŸãã¯ã©ã³ãã¹ã±ãŒããã¥ãŒã«ãã¢ããªã±ãŒã·ã§ã³ãåç
§ç»é¢ã®è§£å床ããºãŒã æ¹æ³ããã®ä»ã®ããŸããŸãªèšå®ãããããšã瀺ããŸãã Corona SDKãåããŠã®å Žåã¯ãä»ã®ãšãããããã®ãã¡ã€ã«ã«æ³šæãæãããšã¯ã§ããŸããã
ãŸããã«ãŒãã«ã¯iOSãšAndroidã®ã¢ã€ã³ã³ã
Default-568h@2x.png ãiPhone 5ã§æ£åžžã«åäœããããã«
Default-568h@2x.pngããããŸããç»å/ãã£ã¬ã¯ããªå
ã«ã¯ãéåžžã®ãã¡ã€ã«ãš2åã®HDããŒãžã§ã³
@2xãŸãã ååãšããŠãiPhone 3GSã®ãããªç»é¢ãæã€ããã€ã¹ã¯ãµããŒãã§ããªããªããŸããããã®å²åã¯éåžžã«å°ããã§ãããããã§ããŒãã§ã¯ãããŸããã iPad Retinaãå®å
šã«ãµããŒãããã«ã¯ããã§ã«
@4xãã¡ã€ã«ãš
config.luaè¡ãå¿
èŠã§ãããã»ãšãã©ã®ã²ãŒã ã¯åé¡ãªãåäœããŸãã
Corona SDKã¯
main.luaãã¡ã€ã«ããã¢ããªã±ãŒã·ã§ã³ãèµ·åããå¿
èŠãªã©ã€ãã©ãªãããã«æ¥ç¶ãããããã€ãã®å€æ°ã宣èšãããã·ãŒã³ãããã€ã±ã¢ã«å
¥ãããã¿ã³ã§åãæ¿ããããŸãã ã¢ããªã±ãŒã·ã§ã³ã®ãã¹ãŠã®ã·ãŒã³ïŒç»é¢ïŒã¯ç°ãªããã¡ã€ã«ã«ä¿åããã 
scenes/ãã£ã¬ã¯ããªã«åéããããã¹ãŠã®ãŠãŒã¶ãŒã©ã€ãã©ãªã
lib/ã«é
眮ããŸããã éçºè
ã¯ãããã®ãã¡ã€ã«ã奜ããªããã«èªç±ã«é
眮ã§ããŸãã
lib/ app.luaãš
utils.luaãå«ãŸããŠããŸã-ããã¯äžç·ã«Corona SDKãæäœããããã®äŸ¿å©ãªé¢æ°ã®ã³ã¬ã¯ã·ã§ã³ã§ãã 
app.lua ãç»åãããã¹ãããã¿ã³ãªã©ã衚瀺ããããã®æšæºCorona SDK颿°ã®äŸ¿å©ãªã©ãããŒãå®è£
ããŸãã
main.luaãã
scenes/menu.lua main.luaãžã®ç§»è¡
scenes/menu.lua ãã©ã€ã³ãä»ããŠè¡ãããŸã
 storyboard.gotoScene('scenes.menu') 
ããã§ããã³ã®ã³èŠæ±ã¯æ¢ã«ãµãŒããŒäžã§å®è¡ãããŠããŸãã 
menu.luaäž»èŠãªã³ãŒãã
menu.luaãŸãã
 function scene:createScene (event) local group = self.view app.newText{g = group, text = 'Penguin Daycare', size = 32, x = _CX, y = _CY - 150} app.newText{g = group, text = 'Simulator', size = 32, x = _CX, y = _CY - 110} local pleaseWait = app.newText{g = group, text = 'Please Wait', size = 16, x = _CX, y = _CY} local button = app.newButton{g = group, x = _CX, y = _CY, text = 'Enter the Daycare', onRelease = function() storyboard.gotoScene('scenes.choose', {effect = 'slideLeft', time = app.duration}) end} button.isVisible = false app.api:getPenguins(function() pleaseWait.isVisible = false button.isVisible = true end) end 
3è¡ã®ããã¹ããš1ã€ã®ãã¿ã³ãäœæãããŸãã ãµãŒããŒããå¿çãåãåããŸã§ããã¿ã³ã¯é衚瀺ã«ãªããŸãã èŠæ±èªäœã¯
app.api:getPenguins()颿°ã«ãã£ãŠå®è¡ãããåŒæ°ãšããŠã³ãŒã«ããã¯é¢æ°ããããŸãã
ãã¿ã³ãã¯ãªãã¯ãããšããã³ã®ã³ã®éžæã·ãŒã³ã
choose.luaãŸã
choose.luaãã¡ã€ã«ã®ã³ãŒãã®äž»èŠéšåã®ã¿ã
choose.luaãŸãã
 function scene:createScene(event) local group = self.view self.backButton = app.newButton{g = group, x = _L + 10, y = _T + 10, w = 48, h = 32, rp = 'TopLeft', text = 'Back', fontSize = 14, onRelease = function() storyboard.gotoScene('scenes.menu', {effect = 'slideRight', time = app.duration}) end} local function gotoPenguin(ind) storyboard.gotoScene('scenes.penguin', {effect = 'slideLeft', time = app.duration, params = ind}) end local slideView = newSlideView{g = group, x = 0, y = _CY, dots_y = 180, onRelease = gotoPenguin} for i = 1, #app.api.penguins do local p = app.api.penguins[i] local slide = display.newGroup() app.newImage('images/popup.png', {g = slide, w = 300, h = 335}) app.newImage('images/penguins/' .. p.id .. '.png', {g = slide, w = 200, h = 256}) app.newText{g = slide, x = 0, y = -140, text = p.name, size = 18, color = 'white'} app.newText{g = slide, x = 0, y = 140, text = p.bio, size = 14, color = 'white', w = 220, align = 'center'} slideView:addSlide(slide) end slideView:makeDots() slideView:gotoSlide(1) end 
ããã§ã 
newSlideView()ã¯ããã³ã®ã³ã®ã¹ã©ã€ããã¹ã¯ããŒã«ã§ããã·ã³ãã«ãªãŠã£ãžã§ãããäœæãã颿°ã§ãã ãã®ãŠã£ãžã§ããã®ã³ãŒãã¯ããã¡ã€ã«ã®å
é ã®
choose.luaã«ãããŸãã
ãã³ã®ã³ããšã«ã¹ã©ã€ããäœæãããŸãã ãã³ã®ã³ã®ç»åã¯ã¢ããªã±ãŒã·ã§ã³å
ã«ä¿åããããã³ã®ã³ã®IDã«å¯Ÿå¿ããŸãã ããã¯ãGAEãµãŒããŒãªã©ã«ç»åãä¿åããããšã§ä¿®æ£ã§ããŸãã ãããã¯ãŒã¯ããç»åãããŠã³ããŒãããããã«ãCorona SDKã«ã¯
display.loadRemoteImage()颿°ãŸãã¯äžäœã¬ãã«ã®
network.download()ãŸãã
ã¹ã©ã€ããã¯ãªãã¯ãããšã 
gotoPenguin()颿°ã
gotoPenguin() ãåä¿¡ãããã¹ãŠã®ãã³ã®ã³ã®é
åïŒããŒãã«ïŒå
ã®ãã³ã®ã³ã®çªå·ïŒ 
Idã§ã¯ãªãïŒãååŸããŸãã ãã®é¢æ°ã¯æçµçãª
penguin.luaã·ãŒã³ã«ãžã£ã³ããããã®åŒæ°ãåãã·ãŒã³ã«æž¡ããŸãã
penguin.lua function scene:createScene(event) local group = self.view local background = app.newImage('images/background.jpg', {g = group, w = 384, h = 640, x = _CX, y = _CY}) self.backButton = app.newButton{g = group, x = _L + 10, y = _T + 10, w = 48, h = 32, rp = 'TopLeft', text = 'Back', fontSize = 14, onRelease = function() storyboard.gotoScene('scenes.choose', {effect = 'slideRight', time = app.duration}) end} local ind = event.params local p = app.api.penguins[ind] local visitsLabel = app.newText{g = group, x = _CX, y = _T + 20, text = 'Visits: ' .. p.visit_count, size = 18, color = 'white'} local fishLabel = app.newText{g = group, x = _CX, y = _T + 40, text = 'Fish: ' .. p.fish_count, size = 18, color = 'white'} local bellyrubsLabel = app.newText{g = group, x = _CX, y = _T + 60, text = 'Belly rubs: ' .. p.bellyrub_count, size = 18, color = 'white'} local penguin = app.newImage('images/penguins/' .. p.id .. '.png', {g = group, w = 200, h = 256, x = _CX, y = _CY - 25}) app.newButton{g = group, x = _CX - 80, y = _B - 50, w = 128, h = 48, text = 'Fish', fontSize = 14, onRelease = function() local fish = app.newImage('images/fish.png', {g = group, x = penguin.x, y = penguin.y + 200, w = 512, h = 188}) fish.alpha = 0.8 transition.to(fish, {time = 400, alpha = 1, y = penguin.y, xScale = 0.1, yScale = 0.1, transition = easing.outExpo, onComplete = function(obj) transition.to(fish, {time = 400, alpha = 0, onComplete = function(obj) display.remove(obj) end}) end}) app.api:sendFish(p.id) p.fish_count = p.fish_count + 1 fishLabel:setText('Fish: ' .. p.fish_count) end} app.newButton{g = group, x = _CX + 80, y = _B - 50, w = 128, h = 48, text = 'Belly rub', fontSize = 14, onRelease = function() local hand = app.newImage('images/hand.png', {g = group, x = penguin.x - 40, y = penguin.y + 30, w = 80, h = 80, rp = 'TopLeft'}) transition.to(hand, {time = 1200, x = penguin.x + 40, transition = easing.swing3(easing.outQuad), onComplete = function(obj) display.remove(obj) end}) app.api:sendBellyrub(p.id) p.bellyrub_count = p.bellyrub_count + 1 bellyrubsLabel:setText('Belly rubs: ' .. p.bellyrub_count) end} app.api:sendVisit(p.id) p.visit_count = p.visit_count + 1 visitsLabel:setText('Visits: ' .. p.visit_count) end 
 penguin.luaã§ã¯ãèæ¯ç»åãèªã¿èŸŒãŸããéžæãããã³ã®ã³ã®ç»åã衚瀺ãããããã€ãã®ããã¹ãã©ãã«ãš2ã€ã®ã¢ã¯ã·ã§ã³ãã¿ã³ã衚瀺ãããŸãã ããããã¯ãªãã¯ãããšãã¢ã¯ã·ã§ã³ãã¢ãã¡ãŒã·ã§ã³åããããªã¯ãšã¹ãã颿°
app.api:sendFish()ããã³
app.api:sendBellyrub()ä»ããŠãµãŒããŒã«éä¿¡ãããŸãã ãŸãã 
app.api:sendVisit()ã¯ãã·ãŒã³ãäœæãããçŽåŸã«åŒã³åºãããŸãã ãããã®å颿°ãåŒã³åºããåŸãã€ã³ã¿ãŒãããããªãå Žåã§ãã察å¿ããããã¹ãã©ãã«ãæŽæ°ãããŸãã ããã¯ãåãªã¯ãšã¹ãã«å¯ŸããŠãµãŒããŒããã®å¿çã®ãã§ãã¯ãå
¥åããã³ãŒã«ããã¯é¢æ°ãæäŸããããšã§ä¿®æ£ã§ããŸãã
æåŸã«ããã¹ãŠã®ãµãŒããŒäœæ¥ã¯
lib/api.luaè¡ãã
lib/api.lua ã
api.lua local _M = {} local app = require('lib.app') _M.hostname = 'http://penguin-daycare-simulator.appspot.com' function _M:getPenguins(callback) local url = '/penguins#' .. math.random(1000, 9999) network.request(self.hostname .. url , 'GET', function (event) if not event.isError then local response = json.decode(event.response) if response then self.penguins = response callback() end end end) end function _M:sendVisit(id) local url = '/stat/visit' local request = {body = 'id=' .. id} network.request(self.hostname .. url , 'POST', function (event) if event.isError then app.alert('Network error') end end, request) end function _M:sendFish(id) local url = '/stat/fish' local request = {body = 'id=' .. id} network.request(self.hostname .. url , 'POST', function (event) if event.isError then app.alert('Network error') end end, request) end function _M:sendBellyrub(id) local url = '/stat/bellyrub' local request = {body = 'id=' .. id} network.request(self.hostname .. url , 'POST', function (event) if event.isError then app.alert('Network error') end end, request) end return _M 
 ãæ³åã®ãšããããµãŒããŒã®æäœã¯ç°¡åãªPOSTãªã¯ãšã¹ãã§è¡ãããŸãã 
getPenguins()å ŽåããµãŒããŒããã®å¿çã¯
json.decode()颿°ã«ãã£ãŠJSON圢åŒããé
åïŒããŒãã«ïŒã«å€æãããã¢ãžã¥ãŒã«ã®ïŒããããã£ïŒãã£ãŒã«ãã«é
眮ãããŸãã
ã芧ã®ãšãããCorona SDKã§ã®POSTãªã¯ãšã¹ãã®éä¿¡ãšãã®å¿çãžã®å¿çã¯éåžžã«ç°¡åã§ãã ãããã£ãŠãGoogle App Engineèªäœãšã®çµ±åã¯éåžžã«ç°¡åã«ãªããŸããã ç§ã¯åè¡ãäœããããããã€ã³ãããŸãããæ§æãçŽæçã§ããããšãæã¿ãŸãã
8.åç
§
ãœãŒã¹ã¯ç§ã®GitHubã«ãããŸãïŒ
Android 2.3.3以éã«ã¯ã©ã€ã¢ã³ãããŒããã€ã³ã¹ããŒã«ã§ããŸããããã¯
APK ïŒ 
ãã©ãŒ ïŒã§ãã
ãŸãã¯ãCorona SDKãããŠã³ããŒãããGitHubãããœãŒã¹ãããŠã³ããŒãããŠãCorona Simulatorã§å®è¡ããŸãã
ãã®èšäºã®å·çãæäŒã£ãŠãããM0sTH8ã«æè¬ããŸããTwitter @SergeyLergã§ãã©ããŒããŠãã ããããã ãã§ã ãæž
èŽããããšãããããŸããïŒ