こんにちは、ミツバです。
縁があって、Go Conference 2019 Springに参加することができました。
ありがとうございました。
gocon.connpass.com
聞いたセッション
goproxyを作成しているケイティーさん
modulesはGoのバージョンの違いを吸収してくれて、Go Proxyではバージョン指定がきついのでプロキシを設けてバージョン問い合わせしたり、zipでの送受信ができるようにして、より楽にパッケージ管理が可能
(英語が危ういので違うかも)
checksumを設けて、本当に欲しいものだけを持ってこれるようにする
Case studies of designing developer friendly libraries
speakerdeck.com
izumin5210さん :Wantedly
developer friendlyとは、simple, easy
Easyだと開発効率が高くなる反面、少し複雑なことをすると爆発してしまう
しかしEasyは悪ではない
Goのcontext.ContextはI/Oの時間がかかる処理に利用する
メトリクス収集にも利用可能
パッケージでは良く利用されている (例: newrelic/go-agent)
middlewareなどの概念も重要
拡張性の話
Redigoパッケージ
doメソッドに処理を書いていく
Connをラップすることでロギング周りの処理を変更可能だったりする
google-cloud-goパッケージ
optionをNewするときにオプションを受けとれるようになっていて、オプションをさし替えることでユーザのちょっとこったことを実現する
functional option patternが拡張性が高くていい感じ
builder patternもパッケージで利用されてたりしていて、拡張性は高め
functional option patternは以下の記事がわかりやすかったです。
qiita.com
wireは最高
Boilerplate生成
環境変数を設定しておくだけで各種設定を読みこんでくれるようなライブラリを作っている
足回りのことはある程度ライブラリに任せる選択もありかもという話
Better asset bundling tool than the best
docs.google.com
shibu_jpさん: フューチャーアーキテクト
ne/httpのファイルシステムについて
コンテンツの圧縮とかSPAとかで高速化を行っている
asset bundler から圧縮を解除してnet/httpに渡して、それを読んだ後、またまた圧縮してブラウザに返す処理をするそうなので、これを改善するやつを作ったよという話
brotliというcontent-encodingを利用すると爆速
Goならわかるシステムプログラミングを読みます
SPAの場合
buildしたやつをのローカルに置いておいて、それを読みにいく
Goのバイナリ一個を持っていくことでできるようにする
assetsの暗号化もできる、便利
Goによる外部プロセス起動ベストプラクティス及びtimeoutパッケージ徹底解決
songmu.github.io
songmuさん
os/execパッケージで外部コマンドを実行できる
TeeReaderを利用することで、teeコマンドのようなことが可能
command contextでタイムアウトとかが設定できる
でも内部では、SIGKILLで止めてしまう
これによって、孫プロセスがずっと生き続けてしまうらしい
SIGTERMを送りたいのだけど、Goはそれは各自でやってもらうという方針
そういうツールを開発
これはGNU timeoutを参考にしているらしい
プロセスグループにもシグナルを送れる
SIGCONTを送るようにもしておき、停止しているプロセスがあれば叩き起こす
Design considerations for container-based Go applications
speakerdeck.com
hgsgtkさん
環境変数を見て、それらを一つの構造体として取得ができるGoパッケージ
github.com
zapを使ってカスタムロガーが作れる
github.com
ヘルスチェックは、エンドポイント生やして確認する
DBなどもアプリケーションのエンドポイントから行ったりするらしい
Design pattern for Image and text composition in Go
timakinさん
赤い四角を書きたければ、各ピクセルに色を入力して画像として吐くようにしたい
画像とテキストの合成を行なう
/image/fontパッケージ
imageにテキストを書きこめる
読みこめるfontが足りないので、freeetype/truetypeを使って読みこもうとしたけど、ヒラギノsansが読みこめない (つらい)
ごにょごにょする
rakyll/statikパッケージ、assets importするときに利用できる
テキストをどこかで画像として保存しておいて、それを画像として合成するのも良い
GoでのFont周りは意外ときついらしい
Dive into Buildkit LLB with Go
speakerdeck.com
po3rinさん
mobyの機能を置き替える感じで Buildkitが登場
buildkitdというデーモンが立っていて、それをcliが叩く
buildkitctl のコードを見るとSolveが最終的に呼ばれている
そして、llb.Definitionという定義がある
llbとは
ビルド時に利用しやすい構造になっているもの
非循環構造 DAG
llb2dotというツールを作成しこれを利用して、dot言語にして可視化ツールにながせる (便利)
buildkitには、Dockerfile2llbという関数があるので、それを使えば爆速でllb構造が手に入る
buildkitでDockerfileのparserがあるので、それを利用してASTを入手できる
Dockerfile linterがお手軽に作れちゃう
Dockerfileを利用しなくてもllbは構築できるので、自作のファイル構造も利用可能
Fuzzy finder as a Go library
speakerdeck.com
ktr_0731さん
行指向なので、オレンジという曲名がたくさんあったら一番欲しいものが不明
fzfを利用しているライブラリはfzfをインストールしないと利用できなかったりする。
なので、Go用のfuzzy finderを作った
Needleman-wunsch: fzyが利用しているアルゴリズム
Smith-Waterman : fzfが利用いしているアルゴリズム
fzy: ALGORITHM.mdにスコアリングのルールが書かれている
fzf: algo.goにスコアリングのルールが書かれている
Building Modules Discovery (from Go Team)
Goのパッケージの評価、コードクオリティや依存の話から、モジュールをその評価情報などから検索できるサービスを提供しようとしているよという話 (英語が危ういので違うかも)
Goのパッケージが探しやすくなると非常に熱いムーブメントが起きそうだなと思いました。
全体感想
個人的にGoという言語は、CLIツールなどを簡単に作成できて大好きなので、非常にどのセッションも有意義なものでした。
英語が危ういので、英語を聞きとれるようになりたいなぁと思いました。
buildkitは楽しそうなので、暇があったら中身を見てみたいと思いました。