ファイル・URLを同じインターフェースで開ける go-openuri パッケージを書いてみた
ruby の open-uri
のインスパイアー。
o, err := openuri.Open("/path/to/file")
o, err := openuri.Open("http://localhost")
というようにファイルパスか URL かを気にせず IO オープンできる。
ちなみに戻り値は io.ReadCloser
。
ユーレックスのオイルヒーター RF11ES を買ってみた
買ったのは、1月8日あたり。大体2週間くらい使ってるけど、なかなか良い。
オイルヒーターの評価をみると、暖かい・暖かくないという意見が入りまじっていて、すこし不安だったけど、いまのところ十分に暖かくて買って良かった。
即暖性が低くて風通しの良い場所ではあまり効果がないとか、住宅環境に左右される感あるので、こう意見が入りまじっているのかなと感じた。
いま住んでいる部屋は気密性が高くて、8畳くらいの大きさなので、良い感じに効果がでているのかもしれない。
エアコンを使っていたときは、暖まりが悪いうえに乾燥してツラかったし、指先が寒くて PC を触るのもツラかったので、本当に買って良かった。
問題は電気代。エコ運転でも大体1時間に15円くらいかかるらしい。
寝るとき・外出するときは消すようにしていて、帰宅時間の1時間くらい前から運転を開始するようにタイマー設定する運用をしている。
のだけど、寝るときに消すのをしばしば忘れる。音がしないし、点けてること自体を忘れる。
RF11ES は何時間後に点ける消すといった設定しかできないけど、もうワンランク上の RFX11EH は何時から何時まで点けるといった細かい設定ができるので、こちらを買った方が良かったかもしれない。
数千円をケチった結果、電気代で損をしそうである。
ところで、買ったあとに知ったのだけど、オイルヒーターの次世代版ともいえるスマートヒーターとやらもあるらしい。
バルミューダ | SmartHeater2(スマートヒーター2)| 睡眠のための、まったく新しい暖房
お値段3倍くらい違うので買えないけど、即暖性の低さが解消されていたりスマホから操作できたり、とても良さそう。
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 をそのまま使いたかったので、以下を選択。
- GitHub - gorilla/context: A golang registry for global request variables.
- コンテキスト管理
- GitHub - gorilla/mux: A powerful URL router and dispatcher for golang.
- ルーティング管理
- GitHub - urfave/negroni: Idiomatic HTTP Middleware for Golang
- ミドルウェア管理
gorilla/context
が HTTP 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 になったら、下記フレームワークに置き換えたい