golang.tokyo#6に参加しました
2017年6月1日(木)に行われた、golang.tokyo#6にブログ枠で参加してきました。
golang.tokyo #3以来の2回目の参加になります。
会場は株式会社ディー・エヌ・エーさん
今回のはソーシャルゲームプラットフォームと現地時間の5月15日にアメリカで開催されたGopher Fest 2017がメインコンテンツとなる会でした。
メインセッション
Gopher Fest 2017 参加レポート
tenntenn / 株式会社ソウゾウ
概要
Gopher Fest 2017の中の The State of Go 内容についてお話でした。
またGopher Fest2017のセッションの動画はアップロードされているみたいです。
golangの開発状況
- go1.9は5/1コードフリーズしており、8月上旬にリリース予定
言語仕様の変更が1点. 型のエイリアスを定義できるようになる
- 完全に同じ型として扱える
- キャスト不要
- エイリアスの方にはメソッド定義はできない
- 例: type Applicant = http.Client でApllicantはhttp.Clientとして同様に扱える
標準ライブラリの変更
- math/bits => ビット演算に便利なライブラリ
- sync.Map => スレッドセーフなマップ
- html/template => スクリプトのインジェクトがエラーになるようになり、より安全に
- os.Exec => 重複する環境変数を削除するように一番後ろのものを優先する.直感的になった
-
https://tip.golang.org/pkg/ のようにtipをつけてアクセスすると、最新のmasterのドキュメントを見ることができる
ランタイムの改善
- 多くのものがベンチマーク結果が良くなった
ツール類の改善
感想
スレッドセーフなマップなど便利そうだし、go testの改善でvendor配下を無視してくれるのも良いですね。ベンチの結果もよくなっているということなのでgo1.9のリリースが楽しみになりました。
初めてGolangで大規模Microservicesを作り得た教訓
村田雄一 / 株式会社ディー・エヌ・エー
スライドが公開されたら追記します
概要
実際のプロダクションにおいて、Golangで大規模なMicroservices構成のAndAppを作ったときに得た教訓の紹介でした。
1. フレームワークにこだわらない
- 洗練されたnet/httpがあり、その足らずはライブラリで補完すれば大丈夫
- 言語仕様がシンプルかつgofmtがあるので、コーティングスタイルは似てくる
2. interfaceを尊重する
- 独自エラー型を利用する場合にNilには型があるという罠が踏んだ経験から、素直に他の関数のようにerrorインターフェースに統一したほうがよかったという
- interfaceの定義されてたものは積極的に使用したほうが標準ライブラリとの連携がシンプルになる
- Interfaceで定義されてるものはInterfaceを維持する
3. regex compile / reflection は遅い
- gojsonschemaを使って、バリデーションのたびに毎回regexコンパイルしていたことやrelectionの多用をしていたためバリデーションをかけるとかなり遅くなった
- チューニングした結果2倍以上の改善
- regexマッチのキャッシュ
- reflection多用部のロジックチューニング(無くすことはできないので、ロジックの無駄を省く)
- gojsonschemaをチューニングするより、go-jsval段違いに速かった
4. 非対称暗号は遅い
- 非対称鍵の署名が重い
- opensslと比べてGoのcrypt/rsaが貧弱
- 対象鍵の署名: 0.37msec
- 非対称鍵の署名(Goのcrypt/rsa): 486msec程度
- 非対称鍵の署名(openssl): 50msec程度
- cgoを使ったopensslのバインディングも存在.(ただApp Engineのサンドボックス環境の都合で利用できない)
- goの最新版(1.7)でもあまり改善されていない様子
まとめ
- 困った時にはGoの哲学に帰りシンプルなアプローチを取る
- Goを過信せずにパフォーマンスに気を配る
感想
非対称鍵の署名処理部分を(PHP + openssl)で外出してhttpリクエストしたほうが早いということがすごく印象に残りました。他にも独自のエラー型のことやパフォーマンスのことも参考になりました
LT
ゲーム開発には欠かせない?!あれをシュッと見る
Ryosuke Yabuki (@Konboi) / 株式会社カヤック
概要
CSVビューアを作成した時のお話でした。
GitHub - Konboi/csviewer: csv viewer command
背景
使用したライブラリの紹介
-
GitHub - soh335/sliceflag: slice flag for flag package of go
- 同一のオプションで複数の値を受け取る
- 普段のflagの使い方と大きく変わらない
- 簡単かつ綺麗にテーブル形式で表示
- ヘッダとフッタが便利
感想
便利なライブラリの紹介だったのでcliツールを作る際には役立てたいですね
マスタデータの管理がcsv等なのはどこにでもあるのだと改めて感じることができる回でした...
Go Review Commentを翻訳した話
鎌田健史 (@knsh14) / KLab株式会社
概要
Go Review Commentsを翻訳することで得た学びを紹介でした。
Code Review Comments (CodeReviewComments · golang/go Wiki · GitHub) とは?
- コードレビューする些細に見るべき箇所をいい感じにまとめたもの
- effective GOをさらに簡単にしたもの
その日本語訳を書いた (#golang CodeReviewComments 日本語翻訳 - Qiita)
内容は大きく4つの種類がある
- コードの見た目を改善 => 大体はツールで解決
- コメント、文章の体裁 => コード内の文章の書き方のアドバイス
- tips系 => より良い方法を紹介
- 設計の指針 => レシーバタイプの考え方など
翻訳を書くきっかけ
- Goコードをレビューしてもらった時に大量の指摘を受けた
- その時にCode Review Commentsを渡せれる
- 読んだ証拠に自分で翻訳
翻訳してよかった点
- 正解パターンを勉強できるのが効率が良かった
- 英語の勉強にもなり、他の英語書籍への挑戦するハードルも下がった
まとめ
- Code Review Commentは目を通してほしい
- 良いドキュメントの翻訳は勉強になる
感想
Code Review Commentは把握していなかったので、これを気に読んで翻訳された日本語訳のものから読み、自分のコードやレビュー時をよりよくしていきたいです。
ScalaからGo
James / 株式会社エウレカ
概要
Scalaの人がGoに移ってきた時のお話です。
- 関数型開発はGoできますか? => No
- 関数型開発のコンセプトはGOで使えますか => Yes
- 関数型開発の考え方
- 関数型開発は副作用がない開発
- 関数の副作用があるとテストしにくしバグの原因になる
- コードとしてだと例として部分適用
- どちらが好きか?
感想
副作用があるのかないのかはっきりさせるということは、Goでも関数型でも同じだと思うので、普段のコードから考えて書いてみようと思えました。今までは正直意識できていなかったので。。。
Crypto in Go
Kengo Suzuki / マネーフォワード
概要
暗号化のお話でした
- Goにおける暗号アルゴリズムを利用
- AES
- 固定長しか扱えない
- 任意の長さの平文に暗号化するためにECBを始め、様々なモードがある
- AES + PKCS7パティング + HMAC
- 実装するのに行数が多く面倒
- AES + GCM
- アメリカ国立標準技術研究所(NIST)にも標準として認められている
- とてもシンプルに実現
最後に
最新のgo1.9の話や実プロダクトでの知見だけでなく、他言語からの視点,暗号の話など様々な有意義な内容に触れることができ、楽しい会でした。
運営の皆さんありがとうございました。またぜひ参加したいです