読者です 読者をやめる 読者になる 読者になる

write ahead log

ロールフォワード用

App Engine + Golangでチートシートを作るだけのアプリを作った

GAE golang 作った/試した

作った.

https://cheat-sheet.tech

だって面倒なんだもの

チートシートって

  • 便利な割に作るのが面倒.
  • 他人が作ったものはしっくりこない

っていうパターンにいつもなるので, 多少は楽が出来るものを作りました.

どんなものか

Markdownの劣化版みたいな記法で書くと以下の様にチートシートっぽくなります. CheatSheet 記法

  • テーブルタグ書くのが面倒
  • 段組みしたい
  • 1ページで見たい(できるだけスクロールしたくない)
  • いちいち作り直したくない(既存のものをFork -> ちょっと変更で使い回したい)

という自分の欲求を満たせるようにしました.

見た目や機能は残念な感じですが, まぁ, 使っていて不便なところから改良するかも.

技術的な覚書

実質ここからがこの記事のメイン.
ブックマークと試行錯誤のメモが大量になったのでここに覚書.

入門記事

読んでおけば何となくそれっぽいものが作れるようになります.

この程度の掲示板ならこれだけで作れるはずです.

GAE + Golang 基礎
Datastore

基本操作は以下と公式で大丈夫だと思います.非常にわかりやすいです. トランザクションは使うことはありませんでした.

戸惑ったのは登録直後にクエリを発行しても登録したデータが表示されないことでした.
(しかもF5とかで再表示すると出てくる)

クラウド慣れしてる方なら問題ないのでしょうが, 結果整合性でスケールする事が重視されてるDBを普段取り扱わない私は割と戸惑いました.

Ancestorクエリを使えば最新の結果が返される事が保証されるそうです.

以下も戸惑いを減らしてくれました.

クエリカーソルは使いたかったのですが, 機能実装ごと投げ出していたりする部分が多くて使いませんでした.
実際は必須でしょう.

ハマりポイントを抑えてくれている記事もあります.
(1500byte制限でハマりました)

あと, 基本的なところで
string <=> Key
をそれぞれどうやって変換するんだー.というのがありましたが, 割と単純でした.

string -> key

id := "[ID String]"
// 数値へ変換
int_id, err := strconv.ParseInt(id, 10, 64) 
if err != nil {
  fmt.Fprint(w, "parse error")
  return;
}
// Keyを作る
key := datastore.NewKey(ctx, kind, "", int_id, nil)

key -> string

// IntID()を使います.keyをInt値へ
int_key := key.IntID()
// 後は何とでも
key_str := strconv.Itoa(int_key)
静的ファイルの配信

app.yamlを変更します. こんなディレクトリ構成だったら

/
|- public
    |
    |- css
    |- js
    |- img

こんな感じ.

handlers:
-   url: /public
    static_dir: public

これで/publicは公開されます.うっかり大事なファイル置いちゃだめです.

HTMLからは以下の様な感じでアクセスできます.

<link rel="stylesheet" href="/public/css/layout.css">
ロギング

logパッケージが用意されています.
こんな感じ.

import (
    "google.golang.org/appengine/log"
    "net/http"
)

func init() {
    http.HandleFunc("/", handler)
}

func handler(w http.ResponseWriter, r *http.Request) {
    ctx := appengine.NewContext(r)
    log.Debugf(ctx, "Debug:%v", err.Error())
    log.Infof(ctx, "Info:%v", err.Error())
    log.Warning(ctx, "Warning:%v", err.Error())
    log.Criticalf(ctx, "Critical:%v", err.Error())
}
ローカル開発時のDataStoreのデータの見方
goapp serve

した状態で, ブラウザで

http://localhost:8000

へアクセスするとDataStore viewerから見れます.

memcacheやsearch indexも見れて便利です.

SSL設定

以下が本当に詳しいです.ありがとうございます.本当にありがとうございます.

Google AppEngine - Custom Domain + SSLが簡単になった

上記以外だと, 常時SSL接続を要求したい場合の設定がわかりませんでした.

app.yamlへの記述が必要でした.

-   url: /.*
    script: _go_app
    secure: always

secure: alwaysと書いとけばOKです.

OAuth

OAuthと言いつつGoogleOpenID Connectだけ使いましたが.(まぁ, OAuthの上ですし)
GitHubとかにも対応したかったんですが. OAuthは認可であって認証ではないと考えると, OpenID Connectを使うのが無難なのでしょう. この辺りは特にGAEに固有というわけではないですね.

バッチ処理

cronが使えます. 下記はPHPの記事ですが, goでも特に変わりません.

URLで指定なのでアプリにコードを書く必要が出て若干面倒ではあります.

Cron によるジョブのスケジューリング

読んでおくと楽になる親切な記事があります.

公式

何だかんだ公式は充実してます.
英語だけなので若干苦労はしますが.

どうでもいいこと

正月にゴリゴリ書いて終わらせるつもりだったのですが, 病気に罹って地獄の年越しとなりました.

ノロウィルスは怖いです.

完成度は低いけど, 自分が使いたいものは出来たのでまぁ満足かな.
(バグとかたくさんありそう)

Web屋さんのスキルに敬意を払う2ヶ月となりました.

Happy Hacking.