作った.
(追記 2018/1/12) HTTPSの証明書も切れたので公開をやめました。 割と面白かったです。
だって面倒なんだもの
チートシートって
- 便利な割に作るのが面倒.
- 他人が作ったものはしっくりこない
っていうパターンにいつもなるので, 多少は楽が出来るものを作りました.
どんなものか
Markdownの劣化版みたいな記法で書くと以下の様にチートシートっぽくなります.
- テーブルタグ書くのが面倒
- 段組みしたい
- 1ページで見たい(できるだけスクロールしたくない)
- いちいち作り直したくない(既存のものをFork -> ちょっと変更で使い回したい)
という自分の欲求を満たせるようにしました.
見た目や機能は残念な感じですが, まぁ, 使っていて不便なところから改良するかも.
技術的な覚書
実質ここからがこの記事のメイン.
ブックマークと試行錯誤のメモが大量になったのでここに覚書.
入門記事
読んでおけば何となくそれっぽいものが作れるようになります.
この程度の掲示板ならこれだけで作れるはずです.
GAE + Golang 基礎
Datastore
基本操作は以下と公式で大丈夫だと思います.非常にわかりやすいです. トランザクションは使うことはありませんでした.
戸惑ったのは登録直後にクエリを発行しても登録したデータが表示されないことでした.
(しかもF5とかで再表示すると出てくる)
クラウド慣れしてる方なら問題ないのでしょうが, 結果整合性でスケールする事が重視されてるDBを普段取り扱わない私は割と戸惑いました.
Ancestorクエリを使えば最新の結果が返される事が保証されるそうです.
以下も戸惑いを減らしてくれました.
クエリカーソルは使いたかったのですが, 機能実装ごと投げ出していたりする部分が多くて使いませんでした.
実際は必須でしょう.
ハマりポイントを抑えてくれている記事もあります.
(1500byte制限でハマりました)
あと, 基本的なところで
string <=> Key
をそれぞれどうやって変換するんだー.というのがありましたが, 割と単純でした.
- Stack overflow - Golang GAE - intID in struct for mustache
- Stack overflow - Making a Google App Engine datastore key from a string
例
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と言いつつGoogleのOpenID Connectだけ使いましたが.(まぁ, OAuthの上ですし)
GitHubとかにも対応したかったんですが.
OAuthは認可であって認証ではないと考えると, OpenID Connectを使うのが無難なのでしょう.
この辺りは特にGAEに固有というわけではないですね.
- Google App Engine OAuth認証を利用する
- Google App Engine for GoでOAuth2による認証を用意する
- Google OAuth2 トークンを取得する with Go
- Go (Golang) OAuth for Facebook, Github, Twitter and Google Plus
- Google Identify Platform - OpenID Connect
バッチ処理
cronが使えます. 下記はPHPの記事ですが, goでも特に変わりません.
URLで指定なのでアプリにコードを書く必要が出て若干面倒ではあります.
他
読んでおくと楽になる親切な記事があります.
公式
何だかんだ公式は充実してます.
英語だけなので若干苦労はしますが.
どうでもいいこと
正月にゴリゴリ書いて終わらせるつもりだったのですが, 病気に罹って地獄の年越しとなりました.
ノロウィルスは怖いです.
完成度は低いけど, 自分が使いたいものは出来たのでまぁ満足かな.
(バグとかたくさんありそう)
Web屋さんのスキルに敬意を払う2ヶ月となりました.
Happy Hacking.