LINE Notify を Go でさくさく使うためのライブラリをつくった #golang
github.com LINE Notify については こちら
使い方
実例コードを用意してます。
認証 と 通知 の2つ、サンプルがあります。
注意事項として、認証のサンプルはコールバック用の外部からアクセスできる URL が必要です。
通知のサンプルは、アクセストークンがあれば動きます。
アクセストークンは LINE Notify 管理画面でお試し発行できるので、それを使ってみてください。
認証について
通知用のアクセストークンを取得します。
具体的な流れは、
/auth
にアクセスした人を、LINE Notify 認証 URI にリダイレクト- リダイレクト先で通知設定をしたとき、
/callback
に POST リクエスト - 渡ってきたパラメータ(code)を使って、アクセストークンを取得
です。
/auth でやっていること
認証に必要なパラメータをセットして、認証 URI にリダイレクトしてます。
このとき CSRF 攻撃対策のために、state をもつようにしてます。
/callback でやってること
渡ってきたパラメータをパースします。
次に、state の値を比較して、正常なリクエストかどうかを確認します。
最後に、code をつかってアクセストークンを取得します。
通知について
アクセストークンをつかって通知します。
LINE Notify は、テキストだけではなく、画像を送ることもできます。
画像は、URL かバイナリで指定します。
もし仮に両方指定したときは、バイナリを優先します。
ちなみに GoogleAppEngine で使いたいときは、Client.HTTPClient
に urlfetch.Client
を入れるようにしてください。
c := linenotify.New() c.HTTPClient = urlfetch.Client()
Docker を使って PHP 5.2 環境を用意してみる
先日、ひょんなことから PHP 5.2 環境を用意した備忘録。
利用した Docker イメージ
Pull
docker pull tommylau/php-5.2 docker pull tommylau/nginx docker pull mysql:5.6
Run
docker run --rm --name mysql5.6 -e MYSQL_ROOT_PASSWORD=password -d mysql:5.6 docker run --rm --name php -v /path/to/web:/var/www/html --link mysql5.6:mysql -d tommylau/php-5.2 docker run --rm --name nginx -v /path/to/web:/var/www/html --link php:php -p 9000:80 -d tommylau/nginx
確認
cat /path/to/web/index.php <?php echo phpinfo(); open http://localhost:9000
ioutil.ReadAll and base64 Encoder benchmark
Streamの扱い方 by jun06t を読んだ。
ioutil.ReadAll は io.Reader や io.Writer を使ったときと比べてメモリ効率が良くなく、避けた方が良いみたい。
知らなかった。
資料を参考にしつつ、個人的に気になった base64 encoder のベンチマークを加えて、自分でも試してみた。
結果
[utahta@mbp13 bench]% go version go version go1.8.3 darwin/amd64 # /tmp/image.jpg 300KB [utahta@mbp13 bench]% go test -bench . -benchmem BenchmarkRead1-4 10000 121861 ns/op 1046577 B/op 11 allocs/op BenchmarkRead2-4 50000 37957 ns/op 311456 B/op 3 allocs/op BenchmarkEncode1-4 3000 459245 ns/op 1130656 B/op 5 allocs/op BenchmarkEncode2-4 3000 516458 ns/op 1455392 B/op 13 allocs/op PASS # /tmp/image.jpg 20MB [utahta@mbp13 bench]% go test -bench . -benchmem BenchmarkRead1-4 200 8519747 ns/op 67106875 B/op 17 allocs/op BenchmarkRead2-4 500 3436382 ns/op 20480160 B/op 3 allocs/op BenchmarkEncode1-4 50 32229327 ns/op 75104416 B/op 5 allocs/op BenchmarkEncode2-4 50 34383885 ns/op 94418246 B/op 19 allocs/op PASS
read は、たしかに ioutil.ReadAll を使う理由がないくらい差がある模様。
もしくは ioutil.ReadAll の中身を io.Copy を使うように書きかえたら、みんな幸せになるのでは…?
反面 base64 Encoder は、EncodeToString の方が結果が良かった。
僕の書き方が悪い可能性も大いにあるけど、少なくともこのように書いて得することはなさそう。