先々月にGunosy.go#12にお邪魔させてもらったりと、今年はGo言語と触れ合う機会が多いのですが、今日は抽選で外れたものの繰り上げ当選する事ができたGo Conference 2015にお邪魔してきました。
内容の詳細は発表者さんが公開されているプレゼン資料をご確認頂くとして、とりあえずメモを載せておきます。
It’s an exciting time to be a gophar(キーノート:Francesc Campoy@google さん)
- Golangのチームに入って3年
- Golangは今年で5歳
- 今年8月頃にGo 1.5がリリース予定
- Go 1.5は全てをGo言語で記述
- C言語を知らなくてもGo言語の改善に貢献できるようになる
- SSA(Single Static Assignment)
- New SSA Backend planはGo 1.6から
- go vet
- ソース分析で使われるgo oracle
- サポートがあるエディターはvim(vim-go)とemacs
- godoc -anlytics=pointerでgodoc中に呼び出し元一覧が記載される
- gomobile tool
- とりあえず今はAndroidのみサポート
- これ全てでアプリを記述するのは難しそう
- 依存性管理ツールが今後提供されるかも?
What I Talk About When I Talk About CLI Tool By Golang(SOTA@楽天 さん)
- 社内でcloud foundryを使っている
- 直感的なUI/UX
- https://github.com/docker/docker/tree/master/pkg/mflag
- ロングオプションとショートオプションを同時に指定できる
- https://github.com/mitchellh/cli
- サブコマンドのインターフェースを定義
- テストがしやすい
- 他のコマンドと協調動作する
- os.Exitはdeferを実行せず終了するので、mainでExitする
- io.WriterをRun()に渡すとテストがしやすい
- https://github.com/tcnksm/go-latest
- 使われているコマンドが最新版かチェック
- https://github.com/tcnksm/gcli
- いい感じのコマンドラインツール雛形を出力してくれる
- 質疑応答
- 引数を渡すとき–hogeの後空白か=だとどっちがいい? → =つけずにやってる
- cliパッケージを作るときにcli.goとの違い → フラグが独自のカスタマイズがされている、exitコードが独自
- エラーコード以外の情報を返すべきか → iota使ってやってる
- 標準入力(ファイル入力)の使い方 -とかファイル名なかったりとか → 普通に下手にベタに書いてる
Generative Programming in Go(MIYAKE Yusuke@GMO Pepabo さん)
- コードからコードを出力する
- Goでは標準でコードをパースしてASTを出力する機能がある
- 構造体のコメント欄に"+AR"があるとActiveRecordの振る舞いを生成
- generics:構造体に対して個々の型を扱う共通のメソッドを生成
- https://github.com/clipperhouse/gen
- パフォーマンス:コード生成でリフレクションを回避
- https://github.com/pquerna/ffjson
- DSL:ASTのメソッド名/コメント/タグから定義を補完して生成
- なんでもgenerateはよくない
- テストは生成物に対して行う
- 質疑応答
- ソースコード管理はどうするか?→ 生成した結果までバージョン管理する
- 参考にした資料 → clipperhouse/genなど
GoのASTをいじくって新しいツールを作る(vvakame@topgate さん)
- structのjsonタグを都度書くのはつらい
- https://github.com/favclip/jwg
- 構造体のコメントに+jwgを書いてgo:generateするとjsonタグを自動生成
- 内部情報や開発環境のみ出力といった対応も可
- ASTで構造体の各要素(名前、種類、変数名、変数の型)が取れる
- https://github.com/favclip/genbase
- jwgのライセンスはMIT
A Tale of Go REPL(motemen@hatena さん)
- https://github.com/motemen/gore
- Go言語でREPL環境
- Goのeval = go run
- ASTに一旦変換して.goにして実行
- go runした結果を出力する
- 変数やパッケージが使われてない系のエラーは無理やり使って対応
- 質疑応答
- goreの補完はどうやっているか? → gocodeに問い合わせている
- goreの副作用のあるコードはundoやclearと合わせて今後対応予定
Debugging Go Code with GDB(kaneshin@eureka さん)
- print debugのデメリット アドホックなコードを書いてしまう
- GDBを使うと処理の中断ができる
- gcflagsで最適化オプションをOFFにする
- ldflags -wでバイナリサイズが減る
- WAFはRevelを使っている
- Revelにした理由:CTOが選んだ。なるべく枯れているものを利用
- 個人的にはWAF使わない方がいいんじゃないか
- WAFとgdbは相性が悪い
- gdbのバージョンを確認する
Scaling Sourcegraph with Go(Gabriel Aszalos@sourcegraph さん)
- https://sourcegraph.com/github.com/golang/go
- Web上で型の定義などが参照できるソースレビューツール
- gRPCを使ってサービスを分割している
1binary 自己完結型の 形態素解析器 kagome を 作ってみた話(ikawaha@パシフィックポーター さん)
- https://github.com/ikawaha/kagome
- pure goな形態素解析器
- 辞書同梱
- Javaで実装された形態素解析器Kuromoji
- 辞書はJarの中に含まれている
- Goの場合はgo-bindataで含める
Gaurun / A general push notification server in Go(cubicdaiya@mercari さん)
- https://github.com/mercari/gaurun
- Push通知リクエストをHTTP APIで受けて非同期にAPNsやGCMに送信処理を実行
- goroutineの数はパフォーマンスが下がるので無制限に作らない
- https://github.com/fukata/golang-stats-api-handler
- サーバーのモニタリング内容を出力
- 質疑応答
- APIでエラーが出たときのハンドリング → アクセスログとエラーログを別に出力
- リークしてた事の解決方法 → 外部のライブラリが悪さしてたのでforkして修正
- goroutineを使ってキューシステムのチューニング → 定常用とキャンペーン用でプロセスを分ける
Goと電子工作とロボット(HideyukiTakei@beatrobo さん)
- https://github.com/hybridgroup/gobot/
- gRPCサーバーでコマンドを受け取ってAVR(マイコン)にゲートウェイする
ピクシブ社内広告サーバーでのGoの開発・運用(catatsuy@pixiv さん)
- UNIX Domain Socketで繋いでいる理由=TCP 3way Handshakeのコストが高かった
- https://github.com/circus-tent/circus
- mozilla製プロセス管理ツール
- ダウンタイムを起こさないようにするために利用
- go build ldflagsでgitのリビジョン番号を埋め込む
- https://github.com/pmylund/go-cache
- memcachedへのアクセスが重いためアプリケーション側でキャッシュ
- cpufrequtilsで常にCPUがフルスピードで動くように
- 広告サーバーとMySQLサーバーでは効果があった
- ログ出力はCircusから直接Goが出力するように変更
- プロファイリングが取りやすいのでパフォーマンスが必要な場合でも使いやすい
- 質疑応答
- インフラは何を使っているか → 実サーバーを使っている
- ログをCircus経由で出すとリソースを食う原因は? → Circus自体の調査はしていない
Goで共通基盤システムを作っている話(Ryota Nishio@CyberAgent さん)
- Realtime Messaging Platformを作っている(OSS化予定)
- mqtt, websocket, protobuf, msgpack, zeromq, consul
- 開発体制は3名
- デプロイが非常に容易
- テストやベンチマークが標準装備
- versioning/vendoringの問題 現在はgodepを使っている
- 標準パッケージが宝の山
- 選定の際は自分でベンチマークを取る
- genericsないのどうしてる? reflectは使わない