Go Conference mini 2023 Winter IN KYOTOでLTしてきました!

こんにちは、SWEの小島です。 この記事は ANDPAD Advent Calendar 2023 の 5日目の記事です。

先日開催されたGo Confarence maini in KYOTOに参加し、LTをしてきました!この記事はLTの紹介とカンファレンスに参加した感想になります。

Go Conference mini 2023 Winter IN KYOTOについて

kyotogo.connpass.com

Go Conference miniは全国各地のGo言語コミュニティが企画・運営を行っており、去年は仙台にて開催されており今年は京都にて開催されました。

LTについて

自分は「Go Getの時に遭遇したchecksumの不一致とその対応」というタイトルでLTをしました。 会場でchecksumの不一致に遭遇したしたことがある人を聞いたところ、あまり多くはなかったのでLTしたことで今後遭遇する人の手助けになれたならよかったと思います。

今回発表した資料はこちらになります。

speakerdeck.com

当日のアーカイブはそのうち公開されると思います。

今回発表するに調べたりまとめたものの時間の都合で資料では触れなかったことについて紹介します。

Go team が提供するモジュール関連のサービス

発表で軽く触れた、sum.golang.orgproxy.golang.orgに加えてindex.golang.orgがGo teamによって提供されています。こちらは発表時間の関係から紹介しなかったのですがモジュールに関連するサービスですので把握しておくことでモジュールについての理解が深まると思うので紹介します。

それぞれの役割は下記になっています。

  • sum.golang.org : checksum データベース
  • proxy.golang.org : モジュールミラー
  • index.golang.org : proxy.golang.org で利用可能なモジュールのフィード

sum.golang.log

発表の中で紹介した指定したモジュールの指定バージョンのchecksumの取得以外にもいくつかの応答を返すパスが存在しており、https://go.dev/ref/mod#go-sum-files にて全部で4つ紹介されています。

  • $base/latest : 最新のログの符号化されたツリー
  • $base/lookup/$module@$version : 指定したモジュールの指定したバージョンのchecksum
  • $base/tile/$H/$L/$K[.p/$W] : ログの一部を構成ハッシュの集合を指定して取得
  • $base/tile/$H/data/$K[.p/$W] : リーフハッシュのレコードを返す

ただ、発表中にも紹介した $base/lookup/$module@$version を用いて指定モジュールの特定バージョンのchecksumを取得する以外の利用シーンはいまいちわからなかったです。

proxy.golang.org

https://go.dev/ref/mod#goproxy-protocol にプロトコルが書かれており、全部で以下の5つのパスが存在しています。

  • $base/$module/@v/list : バージョンの一覧が返ってくる
  • $base/$module/@v/$version.info : メタデータがJSON形式で返ってくる
  • $base/$module/@v/$version.mod : go.modファイルが返ってくる
  • $base/$module/@v/$version.zip : zipが返ってくる
  • $base/$module/@latest : 最新バージョンのメタデータが返ってくる

例えば、発表中で紹介していた etoモジュールの情報をとってみる場合はそれぞれ下記のようになります。

また、/cached-onlyをつけることでキャッシュのみを利用するようになるようです。 例えば https://proxy.golang.org/cached-only/github.com/replu/eto/@latest のようにアクセスすることでキャッシュのみを利用するようになります。

index.golang.org

https://index.golang.org/index にアクセスすると一覧が見え、パラメータが3つ準備されています。

  • since : 許容可能な最も古いタイムスタンプ(最初にキャッシュされた時刻)
  • limit: リストの長さ(デフォルト2000,最大2000)
  • include
    • デフォルトはproxy.golang.orgがコピーしたキャッシュしたバージョン
    • allの場合はproxy.golang.orgまたはsum.golang.orgがこれまでに提供したすべてのモジュールのバージョン

例えば、下記は2023-10-25 07:20:00(UTC)以降にproxy.golang.orgがキャッシュしており、 proxy.golang.org or sum.golang.orgが提供したことがあるモジュールのリストを100件取得する場合のURLになります。

https://index.golang.org/index?since=2023-10-25T07:20:00Z&limit=100&include=all

また、https://index.golang.org/index で最も古いものから2000件取得でき、2000件目は {"Path":"github.com/imdario/mergo","Version":"v0.0.0-20151231081848-bc0f15622cd2","Timestamp":"2019-04-18T02:07:46.760773Z"}となっているのでhttps://index.golang.org/index?since=2019-04-18T02:07:46.760773Z で2000件~3999件が取得できると言った具合にこれをひたすら繰り返せばプロキシされている全pkgが確認できるはずです。(試してないので理論上ですが)。

モジュールの取得に関係している環境変数

発表の中では GORPXOYGOSUMDBしか触れることができませんでしたが(GOPRIVATEについてはおまけとして少しだけ触れています)、この発表をするにあたりまとめたのでこちらもここで公開しておきます。

  • GOPROXY
    • モジュールプロキシのリスト
    • デフォルトはhttps://proxy.golang.org,direct
    • directを指定した場合はプロキシを使用しないでバージョン管理リポジトリに直接アクセス
    • カンマ区切り or パイプ区切りでプロキシのリストを指定する
      • 区切り文字によって微妙に挙動が異なる
      • カンマの場合は404または410エラーの場合のみ次のプロキシを使う
      • パイプの場合はタイムアウトのような非HTTPのエラーも含めどんなエラーでも次のプロキシを使う
  • GOSUMDB
    • 利用するchecksumデータベースの名前を指定
    • デフォルトはsum.golang.org
    • offを指定した場合はchecksumの検証が無効化される
  • GOPRIVATE
    • プライベートのモジュールのパスを記載する
    • GONOPROXYとGONOSUMDBのデフォルト値になる
  • GONOPROXY
    • モジュールプロキシを使用しないでバージョン管理リポジトリに直接アクセスするモジュールのパスのリスト(カンマ区切り)
  • GONOSUMDB
    • チェックサムデータベースを使用しないモジュールのパスのリスト(カンマ区切り)

どういう操作を行った時にcheckusmの不一致が発生するのか

発表ではchecksumの不一致に遭遇した場合の話をしましたが、逆にどういう操作を行うとchecksumの不一致を発生させることになるのかについては触れることができなかったのでこちらについても紹介します。 (こちらについては自分が把握している範囲になり他のパターンでも発生する可能性があるかについては確認できていないです。)

checksum の不一致を発生させることになる操作としては以下が考えられます。

  • モジュール自体や指定されたバージョンを削除する
  • 指定したバージョンが紐づくコミットを変更する
    • 発表の中で紹介した github.com/replu/eto@v0.0.1 に関してはgit push -fを用いてタグが紐づいていたコミットを変更することでわざとchecksumの不一致が発生するようにしています

つまり、一度公開した情報を削除・変更した場合に発生するので一度公開したものは上書きを避けると、checksumの不一致を発生させることを避けれます。

参加した感想

Go Conference 2023ではオンラインでの登壇だったので、次はオフラインでも登壇してみたいと思っていたのですが、今回オフラインでも登壇する機会に恵まれ発表することができてよかったです。 オフラインの方が発表している時に聞いている人の反応がわかったり発表後に直接発表の感想を聞くことができたりより発表を楽しむことができました。(オンラインよりもオフラインの方が緊張しましたが...)

どのセッションも学びがあり面白かったですが個人的に直近で「Go言語 100Tips ありがちなミスを把握し、実装を最適化する」や「プログラマーのためのCPU入門 ― CPUは如何にしてソフトウェアを高速に実行するか 」を読んでいたこともありメモリ効率やコンパイラの最適化について関心が高まっていたタイミングだったのでコンパイラ周りのセッションが特に面白かったです。

また、カンファレンス中の休憩時間や懇親会では多くの人が交流することができオフラインカンファレンスの良さを再確認することができました。 カンファレンスを開催してくだったkyogo.go及び一般社団法人Gophers Japanの皆さんありがとうございました!!

最後に

アンドパッドでは、「幸せを築く人を、幸せに。」というミッションの実現のため、一緒に働く仲間を大募集しています。 会社や事業、開発チームにご興味を持たれた方は、下記のサイトをぜひご覧ください。

engineer.andpad.co.jp