えいのうにっき

a-knowの日記です

Goをappengineで始めてみた

最近Goが気になっている

  • 転職したことにより appengine を仕事で触ることがなくなった一方で、appengine 愛は深まるばかり(なぜか)
    • 一年近くメンテできてなかった appengine アプリをメンテし始めたり
  • それと、少し前に appengine が modules をリリース
    • 細かいところはまだ使ってないからわからないけど、例えば、メイン言語として Java で appengine アプリを書いていても、別バージョン(module)として Go で書いた appengine アプリをデプロイして利用できる・・・的な?
  • これを使えば、特にレスポンス速度が必要な機能に関してだけはGoで書く、とかができる?
  • で、ちょうど自分のアプリでも遅っい機能がある
  • 自分の観測範囲内でも Go の盛り上がりをひしひしと感じている
  • ということで、Go を appengine で始めてみることにした

まずはGo言語そのものから

  • GoTourJP をさらっと流す。
    • 58くらいまでやった
    • あんまり直感的な文法ではないと感じたかな・・・、、でもまぁ、慣れかな?
  • そして Go のインストール
$ brew install go

ここらへんで飽きてきた

  • ので、とにかく「動く」「Webなもの」を作ってみながらやらないとヤバイ
  • ので、the Go Getting Started Guide - Google App Engine をやってみる
    • Python 2.7.x 以上が必要とのこと
      • 入ってた
    • SDKDL
      • GOPATH に展開しといた
      • 展開してできたディレクトリを PATH 通しておく
    • 準備おわり。Hello World
      • いきなり「Creating a Simple HTTP Handler」と来たもんだ
        • ぼく好み。
      • hello.go と app.yaml を書く
      • ローカルで起動してみる $ goapp serve .
        • おお、ちゃんと localhost で見れたよ!
        • hello.go を編集・保存してリロードしてみると、ちゃんと変更も反映されてる。
          • slim3 の hot reloading みたいで(・∀・)イイ!!
    • 続いて Using the Users Service
      • これが独特かな context := appengine.NewContext(req)
      • 「This is an opaque value used by many functions in the Go App Engine SDK to communicate with the App Engine service」・・・らしい
      • Go で appengine するときのお約束、みたいなもんかなー
    • お次は Handling Forms
      • html/template パッケージはいまいちよくわからんな。。
        • サーバーサイドで html を組み立てて返すようなことはあんまりしないだろうけど
    • そしてようやく Using the Datastore 。待ってました!
      • incompleteKey・・・ってなんだっけ
        • Datastore reference 読んでみる
        • It is valid to create a key with a zero StringID and a zero IntID; this is called an incomplete key, and does not refer to any saved entity. Putting an entity into the datastore under an incomplete key will cause a unique key to be generated for that entity, with a non-zero IntID.・・・とある
        • キーの生成時にキー値を指定せずにユニークなキーを生成するために使うもの・自動採番キーみたいなもの?・・・って感じか
          • 参考
          • NewKey の方はStringIDかintIDのどちらか、もしくは両方を指定する必要がある
          • どちらも指定しなければ、それはincompleteKeyとなる
      • datastore#NewIncompleteKey の3番目の引数はparentKey。この例では、entity取得時にancestor queryを発行するために、newKeyで作成した親キーを指定しておいてる
      • Datastore に put する、slim3 でいうところの Model は Go struct で
        • 必ずしも struct にしなくてもいいのかな?
    • 最後に Uploading Your Application でデプロイ $ goapp deploy .
      • デプロイできたよー
      • 爆速を期待してたんだけど・・・、、すんげぇ遅ぇ! ・・・作りのせいかな?
        • queryの発行だったりhtmlの出力だったり?
        • (2013/12/06 追記)ご指摘を頂き、日を改めてアクセスしてみたら別に普通のパフォーマンスでした
        • その時だけ、他の何らかの要因があったのか、もしくは私の環境周りが不調だったのかもしれません
          • サーバサイドのレスポンスタイムは数十msec〜100msec弱でした

とりあえずGoの環境とappengineへのデプロイまではできた!

次は、既存のGAE/JアプリにGoのmodulesをデプロイしてみて、Javaでputされたデータの取得とか、あといろいろ、ごにょごにょやってみるつもり。 今回のコード(といっても、チュートリアルのコードほぼそのままだけど)は、こちら