GoGoogle App EngineおよびLuaCorona SDKでのペンギン保育シミュレヌタの䜜成


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/visit
penguin-daycare-simulator.appspot.com/stat/fish
penguin-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でフォロヌしおください

それだけです ご枅聎ありがずうございたした

Source: https://habr.com/ru/post/J220031/


All Articles