"Google App Engine for Java実践ガイド" を Go で写経してみようのコーナー。3.6 章から 3.8 章までの写経ができたので、メモメモ。

Google API Expertが解説する Google App Engine for Java実践ガイド
- 作者: 小川信一
- 出版社/メーカー: インプレス
- 発売日: 2012/03/16
- メディア: 大型本
- クリック: 12回
- この商品を含むブログ (14件) を見る
3.6章 Scheduled Task
Pull Request
3.6章 Scheduled Task by a-know · Pull Request #5 · a-know/gaeshakyo-with-go · GitHub
メモ
- 日付の演算について
- Big Sky :: Go言語で日付処理 がおもしろかった
slim3
でいうasKeyList()
は?query.KeysOnly()
でok- Datastore Queries | App Engine standard environment for Go | Google Cloud を見ればよし!
- ただ、
If q is a “keys-only” query, GetAll ignores dst and only returns the keys.
には少し躓いた。。(google app engine - KeysOnly Function dont return Keys - Stack Overflow もご参考あれ)
slim3
でいうcount()
は?- ほぼ同じ。
query.Count()
で ok - The datastore package | App Engine standard environment for Go | Google Cloud もご参考あれ
- ほぼ同じ。
3.7章 Mail Service
Pull Request
3.7章 Mail Service by a-know · Pull Request #6 · a-know/gaeshakyo-with-go · GitHub
メモ
- The mail package | App Engine standard environment for Go | Google Cloud さえ見れば良い、ってかんじ(`・ω・´)
- httpリクエストからの URL の組み立てとかは http - The Go Programming Language とか url - The Go Programming Language を見れば大丈夫かな
3.8章 Channel Service
Pull Request
3.8章 Channel Service by a-know · Pull Request #7 · a-know/gaeshakyo-with-go · GitHub
メモ
- やっぱりまずは This feature is removed | App Engine | Google Cloud を見る
Datastore.putAsync
相当のものは、 GAE/Go ではパッとはできなさそうだった。goroutine
あるもんな- 今回は敢えてスルーした。やるなら多分 google app engine - GAE Go — Async datastore API? - Stack Overflow らへんが参考になるのかな
- いわゆる key name は
StringID()
で。(The datastore package | App Engine standard environment for Go | Google Cloud) - Datastore の エンティティ一覧とかで確認できる、各エンティティ(kind)の名称について、あやうく勘違い。
- あるエンティティの key 作成時の
datastore.newKey
は、あくまでfunc NewKey(c appengine.Context, kind, stringID string, intID int64, parent *Key) *Key
なので、kind
で指定した文字列が Datastore に登録される kind 名となる。 - 決して登録しようとする struct の名前とかじゃない
- でも 3.8 章まではそこを一致して指定してきたから曖昧になってしまっていた
- あるエンティティの key 作成時の
- メモが追加された際、サーバーサイドがクライアントに通知する内容は、"追加されたメモの json 文字列"。
- 実装はこんなかんじ。
json_memo, err := json.Marshal(memo)
- クライアントに送信するところはこんなかんじ。
err := channel.SendJSON(c, minutesChannelKey.StringID(), string(js))
- これだと、クライアントでの
socket.onmessage
が受け取る内容は下記のようになってしまう(文字列オブジェクト内のエスケープすべき文字がエスケープされた状態になる)ので、"{\"Key\":\"ahVkZXZ-Z2Flc2hha\",\"Memo\":\"test\", ... "}"
- クライアント側で、
socket.onmessage
が受け取った内容を一回eval
してやることで、文字列を JS のオブジェクトとして評価できるようにしてから、$.parseJSON
してやった。- もっとスマートな方法があれば知りたい。
- 実装はこんなかんじ。
socket.onmessage = function(message) { var memoString = eval(message['data']); var memo = $.parseJSON(memoString); $('<li/>') .appendTo('#content ul') .text(memo['Memo'] + '(' + new Date(memo['CreatedAt']) + ')'); };
次は 3.9 章 Blobstore Service / File Service !
なんだけど、いまさら File Service を使うこともないでしょって気がするので、File Service の代わりに Cloud Storage を使うつもり。なので、本のとはだいぶ違う実装になりそう。これはこれで楽しみ。