えいのうにっき

a-knowの日記です

3.6章 〜 3.8 章 の GAE/Go 写経メモ

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

Google API Expertが解説する Google App Engine for Java実践ガイド

Google API Expertが解説する Google App Engine for Java実践ガイド

3.6章 Scheduled Task

Pull Request

3.6章 Scheduled Task by a-know · Pull Request #5 · a-know/gaeshakyo-with-go · GitHub

メモ

3.7章 Mail Service

Pull Request

3.7章 Mail Service by a-know · Pull Request #6 · a-know/gaeshakyo-with-go · GitHub

メモ

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 あるもんな
  • いわゆる 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 章まではそこを一致して指定してきたから曖昧になってしまっていた
  • メモが追加された際、サーバーサイドがクライアントに通知する内容は、"追加されたメモの 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 を使うつもり。なので、本のとはだいぶ違う実装になりそう。これはこれで楽しみ。