Go Conference 2017 Autumn
November 5, 2017
go event昨日のVimConf2017に引き続き, 2017年秋のGoCon。
抽選に当ってとっても嬉しいʕ•ᴥ•ʔ
抜け漏れも多々ありますが, 色々とメモをしています。もうちょっとあとの自分のため!
🐻 特別企画: パネルディスカッション
mattnさんはじめ, 全4名のすごい人達の対談で, 大変濃かったです。
アップグレード案件で手こずったところは?
- Goは動かしっぱなしでapt updateも問題なく。Windowsでも問題ない。
- 近々オンラインアップデートをする予定があるが, ほぼ不安はない。
- Goのバージョンを上げたときは必ずソースから再Buildしないと新しいバージョンの恩恵が受けられない。
Gopherになったきっかけ
- 8年くらい目にニュースで取り上げられたあとに触った。そのあとみんながクールダウンしたあとも使い続けていた。
- Windowsでしっかり動いたから。Goまわりは Windowsハッカーが多い。
- 画像のサムネイルを非同期で変換するジョブワーカー
- mattnさんが使っていたから by kaoriya
- 周りで誰も使っている人がいなかったから。
変態言語
ということで喜んで。
WindowsでGo使っている人
- 会場で0.5%
Windowsで生で書いていることの面白さ
- GoはUnix側に倒していない。
- ファイルパスパッケージやOSパッケージは, Unixに合わせるためのパッケージということではない。
- exeを作ってバイナリ配布することができること。配布のしやすさ。
WindowsだけではなくてLinuxにバイナリ配布することはあります?
- このコードはWindowsでは動かないな, でしか動かないな, は頭に入っている。
- Vimのコンパイルスイッチは非常にひどいが, Goはしっかり別れている。
今後あったらいいなという本
- 知見はどんどんブログや本で出していくといい。
- 自分も積極的にフィードバックしたい。
- Goでやるといいもの, Goで機械学習, ネットワークプログラムのエッセンス等
- アルゴリズム系をしっかり勉強できるものがあるといい。
- ノウハウ, パターン集が欲しい, あまり表に出てきていないので。
最新情報はブログ
- 本は古くなってしまう。結局公式ドキュメントを見ることに。
- Goの公式ドキュメントは充実している。
実際に使っているパッケージ
- ロギングは標準で書いてる。
- ファイルにログとして出力してローテート回す。
- JSONで出力。
- gorutineの数がどんどん増えていくとき(サーバ増やして)は, モニタリングしておくと良かった。
Go2やっていきについて期待しているところ
- バグの互換性を引きずっているところがある。(1世代)
- バグが継承されているところがなくなるのであれば, それだけでもGo2は価値がある。
- ジェネリクスがあるといいなあ。
- 実行バイナリのサイズ小さくならないかなあ。
- 使ってみて困った, といったようなレポートベースのIssueがあると嬉しい。
- Goは安全に倒そうとしている。そのせいでちょっと遅くなっているところもある。コレがGo2で外せないかなと思っている。
Goを入門者にすすめるか
- 研究機関や学校でも教えたほうが良いと思う。
- Vimの人としての危機感…Goはビジュアルプログラミング言語になり得るのでは。
- tenntennさん, このあいだ高校生に教えた。
- 何か別の言語を学んでいる人前提で教えていたことしかなかったので, プログラミング入門者には難しかった。
- 向いているとは思うが, 具体的にどう教えるのが良いのか。
- GoはPlaygroundがあるので最初に何かできているものから学ぶのが良いのでは。
このサンプルを作る
からはじめるのにいいものって何だろう?- ちょうどいい具合にGoが学べて離れていかないもの。
- Raspberry Pi でゲーム作ってみるとか?
Goの互換性を引きずっているバグは具体的になに?
- OSのCreate, Windowsはフラグが1つ足りない。互換性が壊れるから直さないと言われてこのままクローズしそう。
mocが必要になるようなテストってどうするの?
- reflectionで無理やりつくる。お手製のmocライブラリを書いている。
- サードパーティーに頼りたくない派。
- Readerを渡して処理するとか。最初からテストで使うことを想定して書いている。
- assertが欲しい場合はtestifyを使っている。
Go本体を知るために勉強するには?
- ドキュメントの修正からはじめていくのはどうでしょうか?
- チャレンジ精神は大切。
- 勢いも大切。
- 議論も大切。
GoとRDBMSをやり取りするのに一番良いのは?
- リフレクションが多くてGoぽくない, 今後どうなっていくの?
- database/sqlがかなり安全に倒している。
- Go2でドラスティックに変わっていくのでは。
- mattnさんが使っているORMについてはgorp, gormにしようと思ってやめた。
気に入っているOSS
- Goの本体, 標準ライブラリは好きで, これ読んでいるだけで新幹線行って帰って来れる。
次は過激な話もしたいとのこと。
🐻 Go at DigitalOcean / fatihさん
- 苦労をツールで解決して, すばらしいものがたくさんできあがっている。
- ○○一夜にしてならず, を感じた。
🐻 Go + microservices at Mercari / deeeetさん
https://talks.godoc.org/github.com/tcnksm/talks/2017/11/gocon2017/gocon2017.slide#1
- API ゲートウェイ
- Routing
- 認証・認可(各サービスが利用できるように)
- プロトコルのトランスフォーメーション
- 新規のときはgRPC, 古いやつ(PHP)はJSONに切り替える。
- Request アグリゲート
- マイクロサービスそのもの
- オファー機能
- サーチサービス
- TimeLineをパーソナライゼーション
- フレームワークは利用していない, GoとgRPCのみ。
- まずgRPCのプロトコルバッファの定義を書く。
- サーバを生成してマイクロサービスのアプリを書く。
- APIゲートウェイ側に実装
- Goのリファレンス実装
- gRPC
- 高速かつ汎用的に使えるRPCフレームワーク
- 多言語のツールセットがある。
- プロトコルバッファの書き方を覚えれば, サーバとクライアントができてします。
- ロジックに集中できる。
- なぜRESTじゃないのか!
- 完璧なRESTはかけない。
- 早くサービスをなんとかしたいのに悩む時間が長い。
- ドキュメンテーションを生成するツールが出てきている。
- 各言語ごとのリポジトリに生成するようにCIで設定している。
- プルリクエストを作ると, そのプルリクエストも各リポジトリのPRとして作成される。
- gRPCのロードバランシング
- どんどん変わっていく環境だと正しくロードバランシングすることが結構難しい。
- リクエストを落とさずに正しくswapしたい。
- gRPCはコネクションを使いまわしていることを忘れてはならない。
- クライアントサイドでロードバランシングをちゃんとする。
- DNSリゾルバがgRPCの1.6で入った。
- ロギングやメトリクスやトラッキング
- 共通のfuncとして実装したい。
- httpハンドラに実装するには? よくやるのはmiddleware
- gRPCはinterceptorを使う。
- 関数を返却する。
- go-grpc-middleware, chain関数
- 分散トレーシング
🐻 大規模で運用するためのモニタリングエージェントを自作する話 / huydxさん
- モニタリングエージェントとは何か。
- Not a generic log transfer
- 社内のレポートにあわせてマネジメントする。暗号化とか。
- 開発速度はオープンソースを使うと最初は楽だけれども, 個別の事情に合わせることを考えたら自分で作るほうが安全な選択肢。
- interfaceの重要性。
- Javaが多い。
- だからGoを選んだ。
その人のRustと僕のRust
その人のScalaと僕のScala
🐻 Prometheusから考察するGoのロギング / 大和屋貴仁さん
- Goのロギング事情
- PrometheusのMLからGoのロギングに興味を持った。
- GoogleのSRE本, 入門から運用まで(Prometheus)のスライドを読む。
- Gokitのロギング仕様ブック
- Goで不便なところ
- シンプル
- 非構造体
- 限定的な設定項目
- loggerは型で定義されている
- Globalなloggerオブジェクトが提供される
- ->
- 型で定義されているので別の実装で定義しにくい。
- importしたライブラリのロギングを制御しにくい。
- レベル付ロギングが欲しい。
- ロギングライブラリの乱立 -> 34種類もあるんだぜ
- go-kit/kit/log
- 文脈情報をwithで渡す。
- syncthins
- terraform
- logutilsに切り替え可能。
- レベル付ができるようになっている。
- レベルは何でも良い。
- kubernetes
- golang/glog
- Grafana
- log15
- moby
- logrus
- 出力は豊富
- go-kit/kit/log
- ライブラリは特徴があるけれども, 基本的に同じ。
- go-kitはこの世界のなかで完結しているので天国に見えた。
- ローテート機能については見ていないけどひょっとしたらglogがもっているかも?
🐻 Goのcompileの仕組みと高速化への取り組み / niconegotoさん
- 構文解析
- mutexの追加
- 大きい値でたくさん並列すると早いのかというとそういうことではない。
- internal以下読んでパッチを送ろう。
🐻 Async, Persistent, Fast, and Stable “Enough” Queue/Worker Using Go and PostgreSQL / _achikuさん
- 5人のチーム
- とてもシンプルに保っている。
- queue/worker
- que-go
- もともとはRubyで書かれているkeiというライブラリが元になっている。
- 1テーブルで複数のqueue
- advisory lock
- drawbacks
- パフォーマンス障害が発生するケース
- 長いjob(1万秒くらいスリープ), dequeueがひどぢことになる。
- int64じゃないとロックできない。
- ロックするSQLがCTE? for回しながらlockしにいかないと駄目。
- application code
- External API Serviceはトランザクションで守られない。
- 1ジョブ1トランザクションにしなさい。
- “やっていくしかない”
- APIサーバとpostgresサーバは別モノ
- quejobsというqueテーブルにargsというJSONタイプのカラムを作っておく。パラメータだけを保存する。どの関数, どのque, 何を入れるかを表現している。パラメータが減った場合は, 古いほうのWorkerが動かなくなってしまう。
🐻 Diff algorithm in Go / cubicdaiyaさん
- サーバサイドのミドルウェアあたりをGoで書いている。
- Edit Distance
- 置き換えの操作方法?
- 大文字のCは同じ要素, Dは文字を消す, Aは文字を追加する。
- 追加のAと削除のDを集めたもの。
- LCS
- Longest Common Subsequence
- 同一のものの一番長いもの。
- SES
- Shortest Edit Script
- 変換する手順。
- diffのアルゴリズム。
🐻 Ebiten - Goのシンプルな2Dゲームライブラリ / hajimehoshiさん
- どうやってマルチプラットフォームを実現したか。
- Windows, mac freeBSD, Linux
- Android, iOS
- 前回の続きでEdgeが動くようになった。
- 今年の5月にリリースしてから新しいものが未だに開発中。なので新しいゲームを作りたい。
- Ebiten Playground
- https://github.com/hajimehoshi/oto
- MP3を推している, なるべくブラウザNativeのデコーダーを使いたいから。パフォーマンスのため。
- GLFWはCgo不可避, 大変遅かったり壊れたり。クロスコンパイルが簡単にできない。大変なんですね。
- GopherJS, goの関数を指定しているのでJSの関数になる。
- gomobile
- gomobile build:
- 簡単だけど融通が効かない。
- 広告を入れるのが困難。
- Store公開時の署名を入れる行為が大変。
- gomobile bind: 動的ライブラリ
- なんでもできるけど, Goで完結できない。
- gomobile build:
- なぜKindleFire, GPD Pocketなのか。
- gomobile, Goそのもののバグを発見。
- なぜ海老天か。RPGツクールをつくっていたエンターブレイン社, この会社が2ch上でエビと呼ばれていたから。
- 今は2Dに注力したい。
🐻 eviewdog and static analysis for Go / haya14busaさん
reviewdog を飼ってコードレビューや開発を改善しませんか - haya14busa - goimportの挙動がいい感じになったよ! - golintのコメントを書いてね的な話が辛い。 - 既存のリポジトリプロジェクトに対応しようとすると死ぬ。 - Vim内でしか使えなかったerrorformatを外でも使えるようになる。 - 文字列のリストなのでコマンドラインの引数で渡せる。 - Vimのエコシステムを活用できる。 - Goで書いてよかったこと。 - 1バイナリで書けた。 - シンプル - すぐに動くものができた。 - 今のところはGithub, GithubEnterpriseのみ。 - Feature - もっとローカルで気軽に実行したい。 - Editorからでもちゃんと使えるようにしたい。 - revoewdogがあればgolintのウザさをスキップできるよ。 - switchのcaseが網羅されているかをGoでチェックできない。 - gosumcheck - GitHub - haya14busa/gosum: Sum/Union/Variant Type in Go and Static Check Tool of switch-case handling - 既存のサービスで途中から入れるときはreviewdogで可能か? - 同じファイルのエラーを表示したいというアイデアはある。
🐻 LT大会 (Lightning Talks)
🍎 パッケージ構成っていつでも悩ましい / keigodasuさん
- ビッグデータ, ミドルウェアのコミュニティ
- 君のJava, 僕のJavaを撲滅したい。
- DDDぽく書いていた。
- ときにはGoに従わない勇気も大切。
🍎 Consider better error handling for web apps / izumin5210さん
- より良いエラーハンドリング
- なぜWrapするのか。
- 新しいメッセージを追加したいとき。
- どこからエラーレポートするか。
- 500する前。
- どこでnotifyしているかわからないので何度も同じエラーを書くとか。
- contextをerrorに追加する。
🍎 Goだってパフォーマンスチューニングが必要です / uskさん
- GCCがあるからといってメモリ管理を気にしなくていいなんてことはない。
- GCが効くのでメモリ使用量がMaxまでいくことはないけれども, 間に合わない場合は死ぬのできちんと設計しましょう。
- Benchmarkはしっかりと取ろう。
pprof
を使おう。
🍎 バイオインフォマティクスにGo言語を持ち込んだ話 / otiai10さん
- cliをクロスコンパイルしてWindowsの人に配れる。
- ただ, だれも助けてくれない。Python, Rが多い世界。
- 生物学上のあいまいさ…
- 最初にやったら目立てる。
- gae Goで商売できる。
- bioinfoのsalaryが低い。
- どう活かすか, どこで活かすか。
- 経歴が足りていないこと。これは個性。
○○ではないことは個性
シェイプ オブ ライフ
🍎 Goでインタプリタを書いてみよう / knsh14さん
- 人生で一度はオレオレ言語を作ってみたい!
- Goで良さそうな本が出たのでやってみたかった。
- Parserの章でASTの気持ちになれた。
- Goのプラクティスに従わないことがある。
- Writing An Interpreter In Goを読んだ | SOTA
最後に:
これからやること。
- goroutineをちゃんと理解して書こう。
logrus
からzap
に移行してみよう。- privateにgodocを置きたい。
メルカリさん, Googleさん, スタッフのみなさん, スピーカーのみなさん, ありがとうございました!!