Go 1.6 で HTTP Request Context

Go 1.6(for Google App Engine)で、Go 1.7 の HTTP Request Context のような事をするメモ。

golang.org/x/net/context だけでいけるかな〜と思ったけど、そんなわけなくて、ゴリラ系のフレームワークを使った。

フレームワーク

なるべく簡素にしたいし、http.Handler をそのまま使いたかったので、以下を選択。

gorilla/contextHTTP Request Context の代替です。
リクエストオブジェクトをキーにして値をグローバルな変数に保管する的なことをしている。

自前のミドルウェアを用意して、リクエスト毎に値を保つコードを書くとこんな感じ。

import (
    ...
    "github.com/gorilla/context"
)

...

func MyMiddleware(w http.ResponseWriter, req *http.Request, next http.HandlerFunc) {
    bag := &ExampleBag{}
    context.Set(req, "contextKey", bag) // http.Request毎に保管する
    next(w, req) // MyHandler 呼び出し
    context.Delete(req, "contextKey")
}

...

func MyHandler(w http.ResponseWriter, req *http.Request) {
    bag, ok := context.Get(req, "contextKey").(*ExampleBag)
    ...
}

Go 1.7 > では

func MyMiddleware(w http.ResponseWriter, req *http.Request, next http.HandlerFunc) {
    bag := &ExampleBag{}
    ctx := context.WithValue(req.Context(), "contextKey", bag) // req.Context 便利
    next(w, req.WithContext(ctx))
}

...

func MyHandler(w http.ResponseWriter, req *http.Request) {
    bag, ok = req.Context().Value("contextKey").(*ExampleBag)
    ...
}

番外

Go 1.7 になったら、下記フレームワークに置き換えたい

builderscon tokyo 2016

builderscon.io

参加してきました。

Opening

来年も開催することが発表されました。
2.5 days やるそうで、都合があえば是非また参加したい。

OSS は Windows で動いてこそ楽しい

OSS は Windows で動いてこそ楽しい - builderscon2016
生 mattn さんのお話。
動かないものを動かしてそれで皆がわーっと喜んでくれるのが嬉しい、動かないものを動くようにするのが好きと仰っていて、とても共感した。
時間は、がんばって捻出するしかないそうなので、がんばろう。

動け!Golang 〜圧倒的IoTツール開発へようこそ〜

IoT製品の生産でIoTする #builderscon / Akerun Advent Calendar 3日目 - 僕のYak Shavingは終わらない
普段触れることのない分野。
工場って発注したら後はお任せみたいなイメージだったけど、作業者用のツールを作っていたり、わりと融通(?)がきく感じなんだなと思ったりした。
モノづくりをしている感があって、とても楽しそう。

Automatic Smile Camera を作った話 - 親バカハックノススメ

Automatic Smile Camera @ builderscon // Speaker Deck
赤ちゃんかわいい。
定点盗撮を3日間して1枚という結果だけど、赤ちゃんって何もしなくて笑うものなのかな?
親バカへの道のり、まず出会いから求めなくてはいけなくて、とてもとおい。

人工知能によってプログラムを有機化する

Builderscon 2016 講演資料 「人工知能によってプログラムを有機化する」(前篇)
Builderscon 2016 講演資料 「人工知能によってプログラムを有機化する」(後篇)
凄いボリュームで、むちゃくちゃ濃い話だった。
AIには、知識と思考という視点があって、初心者は思考から作ろうとしがちだけど、それは大変。
静的に用意したAI(Scripted AI)から自立型AI、そして生成型のAIへ。
オープンワールドなゲームでは、プレイヤーが暇そうにしていたら、プレイヤーの経路を予測して、その先に動物と村人の皆さんを配置して戦わせたりしてイベントを動的に作るとか。
ゲームの中にも演者(出番待ち)の皆さんがいるのか…という気づきがあったりして、とても面白かった。

一から始めるJavaScriptユニットテスト

一から始めるJavaScriptユニットテスト - Hatena Developer Blog
すごく分かりやすかったので、後でまた必ず読み返す。

Bluetooth キーボードの作りかた

builderscon tokyo 2016 で「 Bluetooth キーボードの作りかた」を喋りました | tech - 氾濫原
ちょうど左右分割キーボードが気になっているところだった。
しかし自作すごい。
同コストなら自作した方が知見も手に入るという考え方、百里ある!

OM-D E-M5 Mark II を買ってから1年たったので感想とかまとめ

tl;dr

おおむね満足してます :)

P9200025

良いところ

軽い

本体 469g、12-40mm PRO レンズを付けても 851g なので、とても体に優しい。
旅行に持っていきやすくて、街歩きや紅葉スナップにも最適。

防滴・耐低温

雨に気を使わなくていいのが嬉しい。
-10度まで耐性があるので、冬の北海道に持っていくときも安心だった。

レンズ

M.ZUIKO PRO レンズ素晴らしい。
パナソニックライカのレンズ素晴らしい。
オリンパスとパナソニック両方のレンズが使えるため、種類が豊富で素晴らしい。

気になるところ

オートフォーカス

動体の撮影はやっぱり苦しい。
知人の Nikon と比べたらピントのあまさ率が気になった。
パレード程度の動きでも、背景が人でごちゃごちゃしていたりすると、ちょっと心もとない。

グリップ

親指を添えるだけなので、長時間同じ体勢で撮影していると指が疲れる。
指が疲れるとブレてきたり、気づかないうちにカメラを傾けてしまってたりする。

高感度

よく指摘のあるところだけど、僕はそれほど気にしたことがない。
夜間撮影などをしていないので、判断できないのが正直なところ。

設定について

撮影後プレビューはオフ

プレビュー中に被写体を見失う体験をしてからオフ。
デフォルトは 0.5 秒表示っぽい。
メニューのスパナマークから設定できる。

静音モード

電子シャッター(静音モード)は、動体撮影時に歪みを発生させることがある。
ローリングシャッター現象っていう有名な話らしい。
もっと早く知っていれば…。
なのであまり使わない。
このあたりの話は、以下の記事が面白くて参考になった。
ミニレポート:シャッター3種類の使い分けを考える (OLYMPUS OM-D E-M5 Mark II) - デジカメ Watch Watch

レンズ

語れるほどたくさんのレンズを使っていないけど、次の2つは使ってみて素晴らしかった。

交換レンズ M.ZUIKO DIGITAL ED 12-40mm F2.8 PRO | 交換レンズ M.ZUIKO PRO | オリンパス

LUMIX G X VARIO 35-100mm|交換レンズ|デジタルカメラ(交換レンズ)|Panasonic

特に 35-100mm のレンズは汎用性が高いし明るくて軽いので、とても気に入ってる。

PA300020

まとめ

取り回しの良さが抜群のカメラで、PROレンズを使えば画質も満足。
AF(とおそらく高感度)は、用途によって厳しいので、動きモノを撮りたい人はよく検討した方が良い。