Go Conference 2019 Spring に参加してきました

こんにちは、ミツバです。 縁があって、Go Conference 2019 Springに参加することができました。 ありがとうございました。

gocon.connpass.com

聞いたセッション

keynote

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は楽しそうなので、暇があったら中身を見てみたいと思いました。