はじめに
Goとしばらく離れていましたが、最近作りたいものができたこともあり、変化に追いつくためにもGo Conference 2022 Springに参加した。今回はリモート開催となる。イベント詳細情報は、下記の通り。
- Go Conference 2022 Spring公式ページ
- connpassのイベント参加ページ
スケジュール
4/24(日) AM 7:00 時点で、公開されている発表資料/スライドのリンクを更新しました
不備がありましたら、こちらまで
スライドのリンクが分からない箇所には(未)を入れています
セッションの感想
人間の直感に対応させた複雑度<Cognitive Complexity>の計測ツールをgo/astで実装してみよう
メモ
- 認知的複雑度を測定する静的解析ツール nrnrk/gocognito
感想
Cyclomatic complexity
(循環環複雑度)は聞いたことがあったが、Cognitive Complexity
(認知的複雑度)は知らなかった。。人間の直感近い複雑度が計測できるとのこと。
Cognitive Complexity
を計測するためgo/ast
を使って、静的解析ツールを作るセッション。astの構造体を理解する上で参考にしたいと思いました!
創業以来のPHPシステムが生み出した混沌をGoへの移行で乗り越えた話
メモ
- CMS側をPHPからGoへ移行した話。テスト,静的解析,クラス,関数全てなしのコードのリプレースに関するセッション
- RDBにJSONのカラム(text)があり、map[string]stringや定義した構造体にパースするため、
sqlx
のScanner
やValuer
といったインタフェースを駆使し、課題解決した
感想
sqlx
でイレギュラーなRDBの値に対して、対応する手段があるのは便利だなと思いました!
ゼロから作る Protocol Buffer のパーサーとレキサー
感想
個人的にGoはパーサー実装に強いと思っています。理由としてgojq
やesbuild
の既存実装を移植したプロジェクトも存在し、どれも本家と遜色ないどころか高パフォーマンスだったりします。
本セッションは、なんらかの理由で(Google公式のprotoパーサーだと全ての文法規則に対応していない?)Protocol Bufferのパーサーを実装するという内容。
木構造の設計の工夫などパーサーだけでなく、静的解析のツールチェインを作ることも考慮したTipsが説明されていた。VimのALEプラグイン経由で自動修正のデモもあり、かっこよかったです。自作言語のもう一歩先を行ったトピックで、自分良い題材が見つかったら参考にしたいと思いました。
go-protoparserを読むのも良さそうです(執筆時15000行くらいはあるので、全体を把握するのは大変そうですが、、)
GoのGC(garbage collector)について理解する
メモ
- discordの事例でGoを利用した結果、2分毎のGCによってSTWが起きて、レイテンシが高くなり、許容できずRustにリライトした
- Go 1.9.2の利用事例で少し古いという指摘もあり
- GCは生産性を上げるために必要なため、GoにはGCが存在する
- GoはConcurrent Mark Sweep(CMS)を採用
- 最古のGCアルゴリズムを改良した
- GCもバージョン毎に改善が入っている
- GoチームでGCのSLOがある
感想
GoのGC理解の大一歩としてとても良いセッションと感じました。GoのGCアルゴリズムの概要から始まり、バージョン毎に改善が入っている点、GoチームでGCのSLOがある点など、個人的に知らないこと盛りだくさんでした!
レガシーシステムをGoにリプレースした一年間の振り返り
感想
DDD, Clean Architecture, Onion Architectureを利用したプロダクトの話。並列テストにも少し言及があり、参考になりました。
メタバースを支える技術 ~UGCに溢れる3D空間のリアルタイム同期を支えるGo〜
感想
メタバースなアプリケーションのサーバーサイドでのGo活用事例。UGC(ユーザー側で作成できるコンテンツ)の素材の転送効率の最適化やPub Subサーバー(ユーザーアバター、空間制御周り)でGoを利用しているとのこと。一般的なWebアプリと異なる高負荷、ステーフルな環境下であるメタバース領域でのGo活用事例でとても新鮮でした!
高速で統一的な自動生成ツールをprotocプラグインとして実装した話
メモ
- ソーシャルゲームのGo事例。マスターデータ量が多く、コードを自動生成しないと辛いレベルの規模感。自動ジェネレートが遅く、Protocol Bufferを活用
goimports
をかけたときに、import文を追加する処理は、対象のライブラリが見つかるまで探索(Nまで探索)するので重い。対策として、あらかじめimportを追加しておく、goimports
のimports削除はAST解析のみでされるので、誤ってimportしてしまうことを許容して問題ないとのこと。filepath.Walk
よりfilepath.Walkdir
が速い。(Go 1.16で追加)- protcプラグインはログに標準エラー出力を使う
感想
自動生成コードI/O処理の極小化として、File I/Oはギリギリまで発生させないという話は分かりみが深かった。goimports
やgofmt
をライブラリから生成されたバイト配列に対して適用しているとのこと(面白い)。自動生成定義にprotocを使って素振りしたいなと感じました。
GoとLambdaを使用した高パフォーマンスでサーバレスなマイクロサービスの開発と運用
感想
ランタイムが1つというのは確かにメリットだなと感じました!ベンチマーク結果は、GoはやはりLambdaでも良いパフォーマンス結果が出ていました。ただ実際にアプリを書くと、Nodeは自然と非同期になる一方、Goはgoroutineを使う必要があることを考慮すると要件次第だなぁとも思いました。。
IoT with TinyGo
メモ
- fastlyがほぼフルタイムでTinyGoの改善をしているとのこと
感想
goroutineも使えるのは意外だった。httpやMQTT(内部的にはpahoを利用)のpub/subが使えるので、それなりに遊びが出来る段階には来ているんだなーと感じました。Wio Terminal持っているし、どこかで試したいですね。
外部コマンドの実行を含む関数のテスト
感想
目から鱗でした。外部コマンド実行結果のモックがサクッと実装できるとテストが捗りそうですね。。標準ライブラリのテスト読んでみることの重要さにも気づけて良かったです。
Gopher, Chrome, Automation in 5m
感想
私が昔Chrome自動化をする際には、sclevine/agoutiを使っていましたね。紹介されていたライブライどれも使いやすそうです。
この手のchrome自動化ツールはスタンドアローンで起動しますが、プロファイルのcookieやlocal storageを使いたいケースがあり、そこら辺いい感じになっていると嬉しいなーと思いました!
最後に
幅広い分野でGoが活用されていることが再認識できました。運営のみなさまこのような機会を設けて頂きありがとうございました!