macOS Sierra 10.12 で golang/go のテストを実行するメモ

このあたりに従い、ソースコードをもってくる。

$ git clone https://go.googlesource.com/go
$ cd go

このあたりに従い、テストを実行する。

$ cd src
$ ./all.bash

失敗した。

$ ./all.bash
##### Building Go bootstrap tool.
cmd/dist
ERROR: Cannot find /Users/utahta/go1.4/bin/go.
Set $GOROOT_BOOTSTRAP to a working Go tree >= Go 1.4.

GOROOT_BOOTSTRAP に go 1.4 以上のパスをセットして、実行してみる。

$ GOROOT_BOOTSTRAP=/usr/local/Cellar/go/1.8.3/libexec ./all.bash

成功した。

$ GOROOT_BOOTSTRAP=/usr/local/Cellar/go/1.8.3/libexec ./all.bash
##### Building Go bootstrap tool.
cmd/dist

##### Building Go toolchain using /usr/local/Cellar/go/1.8.3/libexec.
bootstrap/cmd/internal/dwarf
... 略 ...

##### API check

ALL TESTS PASSED

... 略 ...

basic_scaling の idle_timeout について #GAE

試したメモ。

app.yaml のドキュメントをみると、以下のように書いてある。

app.yaml#basic_scaling

idle_timeout
  Optional. The instance will be shut down this amount of time after receiving its last request. The default is 5 minutes.

  任意。 インスタンスは、最後の要求を受信した後、この時間をシャットダウンします。 デフォルトは5分です。(Google 翻訳)

受信とは…🤔

  1. 最後のリクエストを受け付けてからN分後にシャットダウンするのか
  2. 最後のリクエストを完了してからN分後にシャットダウンするのか

おそらく b だと思うけど、分からないので簡単に試した。

結論

b の最後のリクエストを完了してからN分後にシャットダウンする が正しい。

検証ログ

以下のように basic_scaling の設定をした app.yaml を用意して、

# app.yaml
... 略 ...

instance_class: B1
basic_scaling:
  idle_timeout: 1m # 5分だと長いので1分に設定
  max_instances: 1

handlers:
- url: /_ah/start # basic_scaling 用
  script: _go_app
  login: admin

- url: /path/to
  script: _go_app
  login: admin

... 略 ...

/path/to にアクセスする。

func PathTo(w http.ResponseWriter, req *http.Request) {
    ctx := appengine.NewContext(req)
    for i := 0; i < 20; i++ {
        log.Infof(ctx, "sleep... i:%v", i)
        time.Sleep(10 * time.Second)
    }
}

a であれば、最中にシャットダウンされるので、ログが途切れるハズ。

結果

f:id:utahta:20170709125158p:plain

途切れてない:)

LINE Notify を Go でさくさく使うためのライブラリをつくった #golang

github.com LINE Notify については こちら

使い方

実例コードを用意してます。
認証通知 の2つ、サンプルがあります。

注意事項として、認証のサンプルはコールバック用の外部からアクセスできる URL が必要です。

通知のサンプルは、アクセストークンがあれば動きます。
アクセストークンは LINE Notify 管理画面でお試し発行できるので、それを使ってみてください。

認証について

通知用のアクセストークンを取得します。
具体的な流れは、

  1. /auth にアクセスした人を、LINE Notify 認証 URI にリダイレクト
  2. リダイレクト先で通知設定をしたとき、/callback に POST リクエスト
  3. 渡ってきたパラメータ(code)を使って、アクセストークンを取得

です。

/auth でやっていること

認証に必要なパラメータをセットして、認証 URI にリダイレクトしてます。
このとき CSRF 攻撃対策のために、state をもつようにしてます。

/callback でやってること

渡ってきたパラメータをパースします。
次に、state の値を比較して、正常なリクエストかどうかを確認します。
最後に、code をつかってアクセストークンを取得します。

通知について

アクセストークンをつかって通知します。

LINE Notify は、テキストだけではなく、画像を送ることもできます。
画像は、URL かバイナリで指定します。
もし仮に両方指定したときは、バイナリを優先します。

ちなみに GoogleAppEngine で使いたいときは、Client.HTTPClienturlfetch.Client を入れるようにしてください。

c := linenotify.New()
c.HTTPClient = urlfetch.Client()