大変遅くなりました。ブログは鮮度が命ですが、ちょうど熟成された頃に公開することになり反省しています。

Day0

今回のRubyKaigiは、Day0がめちゃくちゃ大変でした。まず管制トラブルで全国的に飛行機が欠航や大幅な遅延となる見込みになっていました。

まあそんなことは気にせず、保安検査ギリギリに着く時間の電車にギリギリ乗り込み、リムジンバスに乗っていると、「搭乗される飛行機が欠航になりました」という通知が。

バスでめっちゃ焦りつつも、どうせなんとかなるだろう。羽田経由でもいいから行けたらいいや。そんな軽い気持ちでカウンターで話したところ、伊丹から羽田までの飛行機が満席か欠航なので、新幹線で行ってくれ。ウチは悪くないので(それはそう)返金しかできないっピ。と丁寧に説明していただき、新幹線で向かうことになりました。

もっと早く空港に着くべきだったな。そう思いながら、伊丹空港から新大阪駅までバスに乗り、みどりの券売機で切符を買います。みどりの券売機で34,000円も支払うのは初めてでした。多分これより長い距離の切符を買うことは今後ないであろう...

新幹線の切符。大阪市内→函館
新幹線の切符。大阪市内→函館

東京で弁当を買う時間がなかったり、東京から新函館北斗までの新幹線の車内ではずっと後ろのお子様に背中を椅子越しにマッサージしていただいたり(訳: 蹴られていた)と、まあまあ大変な移動でしたが、なんとか函館にたどり着くことができました。実に11時間の移動でした。

その後は、会社のカスタムスポンサー(たまり場)の準備に合流して、1日を終えました。

Day1

The Journey of Box Building

Ruby::Boxの内部がどうなっているのかについて説明しながら、技術的にどのようにRubyの実行環境を隔離していくのか、特に vm.c のレイヤーに踏み込んだ話でした。

Ruby::Boxのユースケースとして特に印象的だったのはApp v1とApp v2を別々のBoxに隔離することで、アプリケーションのバージョンごとに異なるライブラリを読み込める、という話で、これができると、v2で問題が起きたときにv1へフォールバックするような構成も考えられ、実質的にブルーグリーンデプロイのような使い方もできる、といった夢のような話でした。他にも、モジュラモノリス間で異なるライブラリを読み込めるようにできるかもしれません、これもめっちゃ嬉しいですね。

Ruby::Boxはclassやmethodを隔離するための仕組みですが、RubyのVM内部ではそれらがあらゆる場所から参照されるため、単にclass tableやmethod tableを分けるだけでは不十分で、「今どのBoxの中で実行されているのか」を常に監視しながら、適切なclassやmethodを解決する必要がある、というのがこの発表の肝で、Rubyの柔軟さを保ったまま隔離を実現しようとすると、VMの実行コンテキストそのものにBoxの概念を持ち込む必要がある、という話でした。

普段Rubyを書いているとclassやmethodはグローバルに存在しているように見えますが、それをBoxごとに切り替えられるようにするには、Ruby VMのかなり深い部分まで手を入れる必要があるのだと知りました。 個人的にはRuby::Boxは今一番気になっているホットな機能なので、コードをしっかり読んでみます。

Back to the roots of date

Ruby の Date を題材に、Ruby 本体へ貢献するまでの流れ、Date の改善、そして AI をどう使うか、という話が綺麗にまとまっていて、聞いていてワクワクするようなセッションでした。

内容としては、Date の実装を C から Pure Ruby に書き換えていく話が中心でした。C で書かれていると速そうに見える一方で、読みづらい、変更しづらい、貢献しづらいという面もあります。そこを Pure Ruby に寄せることで、メンテナンスしやすくなる。 けれどもちろん、C から Ruby にすれば全部解決、という単純な話ではなくて、互換性や性能への影響を見ながら少しずつ進める必要がある、という話でした。

既存の挙動を調べ、テストで守り、差分を小さくしていく流れが、Ruby 本体への貢献のロードマップとしても分かりやすく、参考にしたいと思います。 AI の使い方も、コードを丸投げするというより、C の実装を読む補助や、挙動の理解、テスト観点の洗い出しに使っているようでした。

Date みたいな昔からあるライブラリでも、ちゃんと掘るとまだ改善できるところがあり、それに取り組んでいる話を聞けてよかったです!

Digits, Digits, and Digits

sinやcos、tan、sinhなどといった様々な計算に利用されているe**xの計算について取り上げて、exp(1.1111111111...)は計算量が大きいが、exp(1), exp(0.1), exp(0.011), exp(0.0001111), exp(0.000000011111111)のように計算を分割することにより、expの計算速度を向上させるセッションでした。

今まで私は数学計算(主にCTFのCryptのexploitを書くとき)をするときはPythonを使うことが多く、RubyのMathライブラリはほとんど使ったことがなかったのですが、機会があれば使ってみようと思います。

Do Ruby::Box Dream of Modular Monolith

Ruby::BoxをRails上で動かし、モジュラモノリスのドメインロジックをBoxごとに分離できるか、というLTでした。Railsアプリケーションはひとつのまま、内部のモジュールごとにクラス空間や依存関係を分けられたら嬉しいよね、という話です。

最小構成では実際に動いていて、URLごとにクラス空間を分けるデモがありました。Railsの外側の仕組みはmain boxに置きつつ、controllerやmodelのロジックをchild box側で評価する、という構成が見えていて、これができるとモジュラモノリスの実行境界をかなり強くできそうです。

一方で、Railsで使うにはrequireとZeitwerkがかなり大変そうでした。Boxごとに世界を分けたいのに、autoloadのために走るrequireがどのBoxで実行されるのか分かりにくくなる。Rails::Engineと組み合わせるとrequireが失敗してcrashしたり、デモアプリも起動時にSEGVすることがあるらしく、現状はかなり実験的な段階だと感じました。

面白かったのは、Box間の参照が思ったより自由なところです。Boxをまたいでextendprependをしたり、superで別のBoxへ行き来したりできるらしいです。これをtagomorisさんに聞いたら「邪悪ですね」と言われた、という話が出ていて笑いました。

今すぐ実用するには遠そうですが、Ruby::Boxでモジュラモノリスの実行境界を分けるアイデアはめちゃくちゃ夢があります。Rubyで大きなアプリケーションをどう分割していくかを考える上で、かなり面白いテーマで、自分でも試したいなと感じました。 (追記: ゴールデンウィークにはほとんどこれに費やしていました。)

After Kaigi

RubyKaigiが終わった後は、オフィシャルパーティーに参加させていただきました。マグロの解体ショーを見るのは初めてでしたが、すしざ◯まいのように振る舞うMatzを見れたのが個人的に嬉しかったです。

また、同じ2025年卒の新卒2年目のRubyistと出会えたりと、RubyKaigiをきっかけにたくさんのrubyfriendsと出会えました。

オフィシャルパーティーが終わった後はHelloさんのDrink upに参加しました。こちらでは、海外からRubyKaigiに参加されている方と同じテーブルになり、ほとんどの会話を英語でしていました。

といっても私は全然英語を話せないので、カタコトの英語とジェスチャーでなんとか意思疎通をしていました。 一緒に飲んだ方が、「君の英語はそんな悪くないよ、伝える気持ちがあれば大体伝わる。単語の知識があれば大体話せる」と言ってくださり、少し自信がついてもっと積極的に海外の人とも話したいと思ったと同時に、もっと英語を勉強しなければと思いました。Day1にしてもうすでにKaigi Effectだ...

Helloさん、ありがとうございました!

そして最後にはやんちゃバーに行きました。3軒目ということもありあまり何を話したのかは覚えていなかったのですが、やんちゃさんがめちゃくちゃいい人だということは覚えています。

余談ですが、一人で喫煙所に行くのは勿体無いと感じたので、喫煙者のRubyistを誘って勝手に喫煙所.rbを開きました。一人よりもrubyfriendsと一緒の方が面白いし、Rubyの話をした方が勉強になりますよね。

Day2

続いて、Peterさんの「Building the Next-Generation Garbage Collection」です。 今まではRuby VMではgc.cを前提としていたけれど、MMTkのようなメモリ管理ツールキットを使えるように、Ruby VMとGC実装の境界を整理して、GCを差し替えられるようにしている、という内容でした。

今まではGCについて考える機会はあまりなかったのですが、単に「GCを速くする」という話ではなく、Rubyが将来的にいろいろなGCアルゴリズムを試せる土台を作っている話なのが面白かったです。

Surviving Black Friday: 329 billion requests with Falcon!

ShopifyがBFCM(Black Friday / Cyber Monday)のストアフロントを、UnicornからFalconへ移行した話でした。BFCM週末で3290億リクエスト、ピークで毎分8500万リクエストという規模をRubyで捌いていて、まず数字がすごいです。

FalconはFiberベースの非同期Webサーバーで、I/O待ちの間に同じワーカー内の別リクエストへ処理を切り替えられます。ただし、何でも並行にすればよいわけではなく、ShopifyではLong Tasksという仕組みで、I/O待ちに入るところだけ明示的に並行処理を有効にしていたのが印象的でした。

面白かったのは、Falcon自体の話だけではなく、本番投入までに壊れたものの話がかなり具体的だったところです。rdkafkaがFiber前提で設計されておらずsegfaultしたり、SpannerのgRPC C拡張がブロッキング呼び出しの中で固まったりしていました。非同期化すると、Rubyコードだけでなく依存しているライブラリやC拡張の前提まで一気に表に出てくるのだと感じました。

私も今、サーバーレスではあるけど、I/O待ちをうまく扱って1インスタンスあたりのリクエスト処理効率を上げられないか考えています。依存ライブラリによってはFiberベースの並行処理とうまく噛み合わないことがある、というのは勉強になりました。

The future of Ruby documentation

Rubyのドキュメント基盤であるRDocの話でした。正直、私はRDocについてほとんど知らなかったのですが、Rubyの公式ドキュメントやri、gemのAPIドキュメントを支えているものだと知れてよかったです。

RDoc 8.0では、parserをPrismベースにしたり、Markdown対応を改善したり、RBSのtype signatureをHTMLやriに表示できるようにしたり、rdoc --serverでドキュメントを書きながら確認できるようにしたりするとのことでした。また、Rubyの構文をRDoc独自に頑張ってparseするのではなく、Prismに任せられるようになったそうです。

AI時代のドキュメントとして、AIにはどんな情報があると嬉しいのか、という話も面白かったです。単にHTMLを食わせるより、Markdownのようにノイズが少ない形式や、RBSのような構造化された情報、@abstract@overrideのような設計意図を表すannotationがあると、人間にもAIにも読みやすくなるという話でした。

結論としては、AI専用の特別なドキュメントを作るというより、RDocがRDocとしてちゃんと良いドキュメントを作れるようにするのが一番大事、という話でした。AIにとって良いドキュメントは、人間にとっても良いドキュメントである、というのはすごく腑に落ちました。

それにしても、今回のRubyKaigiではPrismが吐くASTを何かに活用する話が多くて面白かったです。Ruby本体のparserが整備されると、その上に乗るツールも一気に良くなっていくんだなと感じました。

After Kaigi

Day2は、Studist x OPTiMのDrink upに参加しました。はこだてビールというすごく綺麗なお店で開催されていました。イカとビールがめっちゃ美味かったです。この日から一番好きな海鮮がイカになりました。 ここではモジュラモノリスとマイクロサービスの話をした記憶があります。

はこだてビール
はこだてビール

Studistさん、OPTiMさんありがとうございました!

そして続いて、White Seedに行きました。人がごった返していましたが、Rubyistたちとビールを飲みながらRubyについて話せました。tagomorisさんとRuby::Boxについて話せたことが記憶に残っています。

(写真は撮り忘れました)

Day3

Day3が始まりました。RubyKaigiももう最終日。やっとRubyKaigi仕様の市電が見ることができました。

RubyKaigi仕様の函館市電
RubyKaigi仕様の函館市電

まずは CRuby Committers による Ruby Committers and the World です。

Ruby Committers and the World
Ruby Committers and the World

Rubyを使うとAIのコストを抑えられるのでは?といった話や、Ruby CommittersによるこれからのRubyについての議論(setjmp/longjmpをやめたい話とか)を聞くことができて非常に面白かったです。

いつかはあそこに座ってみたい、OSSに貢献することでこんなにたくさんの人の前で面白い話ができるの最高じゃねぇか!という気持ちになり、非常にモチベートされるセッションでした。

そして、RubyKaigiを締めくくるのはMatzのKeynoteです。内容は主にSpinelの紹介でした。SpinelはRubyのAOTコンパイラで、Rubyのコードを読み、Cのコードを生成し、最後はnative binaryとして実行できる形にします。このSpinelを作る際にはClaude Codeを使い、実装のほとんどをClaude Codeに任せていたそうです。興味深いですね。

Spinelを使うと何が便利だろうと考えていたんですが、jimlockさんのセッションで取り上げていたdateライブラリのように、C拡張を使っているがゆえにメンテナンスが難しくなっているgemがあったときに、コードはRubyに移行して、SpinelでAOTコンパイルしたCをRubyから実行することで、パフォーマンスを大きく損なうことなくRubyに移行できるかもしれません。 あるいは、Rubyで書きたいけどRubyを依存として含めたくないようなアプリケーション(ちっちゃいCLIとかCI helperとか、組み込みとか?)に活用できるかもしれません。 あとは、競プロだとRubyだとTLEだけどSpinelでCにすると通る、とかがあるかもしれない(?)

実際にまだ手元で試せていないのでまだ詳しいことはわからないですが、じきに試してブログを書こうと思います。

After Kaigi

どうしてもジンギスカンが食べたかったので、食べにいきました。ジンギスカンって漢字にするの成吉思汗なんですね。難しい。それにしてもジンギスカンのタレってなんであんなに美味いんですかね。

五稜郭近辺で食べたジンギスカン
五稜郭近辺で食べたジンギスカン

そのあとは、ホテルに荷物を置いてからRuby Illuminations 2026に向かいました。イカ踊りが流れていて、みんなでイカ踊りを踊る、という多分この人生で今後ないであろう経験ができました。面白かった。イカポッポ。EMの方と話す機会があり、採用やキャリアについてお話しできた記憶があります。

そして最後の気力を振り絞ってやんちゃバーに行きました。もう何を話したかは覚えていないですが、RubyKaigiのビールが美味しかったことを覚えています。

Day4

この日は、RubyKaigi 2026 Golf Competition in Hakodateに参加しました。函館でゴルフをするのは初めてでした。

12番ホールの景色が特に綺麗で、函館湾と、函館湾に停泊している船、函館山が一望できました。 私は12番ホールでは右にOBを打ってしまい、「ファー」と叫んだのですが、同じタイミングで停泊している船から「ファーーン」と汽笛が聞こえてきました。どうやら船の中にギャラリーがいたのかもしれません。 しかも、私の後に打った三谷さんも同じようにOBを打って、同じタイミングで停泊している船から「ファーーン」と汽笛が聞こえてきました。 これ、めちゃくちゃ面白い話なんですが、文章にするとあまり面白くないですね。

函館ベイコーストカントリークラブ 12番ホールのティーグラウンドから見た写真
函館ベイコーストカントリークラブ 12番ホールのティーグラウンドから見た写真

ゴルフのスコアはこんな感じでした。まあぼちぼちですね。ダブルペリア制では11人中10位と、ブービーメーカーというわけで入賞(?)することができました。

Hole123456789101112131415161718Total
Par44354443543444534572
nori555965647548559667107

ゴルフが終わった後、有志で打ち上げをしました。後日談ですが、生牡蠣は当たりませんでした。良かった。

ジンギスカンと生牡蠣
ジンギスカンと生牡蠣

その後、まだ函館山に行っていなかった4人で、タクシーで函館山に向かいました。22時から一般車両でも車で函館山展望台への道を通行することができるそうなのですが、22時20分くらいに行ったせいか、道が大渋滞でした。

なんとか展望台に到着して、外を見ると絶景。函館の旅を締めくくる最高の景色でした。

函館山展望台から見た100万ドルの夜景
函館山展望台から見た100万ドルの夜景

景色は綺麗だったので良いのですが、函館山の展望台は標高334mらしく、阪神ファンとして一言申したくなりますね。(なん阪関無)

宿はホテル シーブリーズにしました。GW前の函館のホテルはかなり高騰していたのですが、立地が五稜郭駅から徒歩8分と少し遠いからか、喫煙室だったからかわかりませんが、一泊6,250円と新卒2年目の私にとってはかなり良心的な価格で宿泊することができました。

※Day0からDay4までの宿は会社に出していただきました。ありがたい。

Day5

Day5はあとは帰るだけ。レイトチェックアウト常習犯の私なのですが、なぜか8時に起床できました。 部屋が喫煙室だったので一服して、RubyKaigi 2026の本屋さんで購入した「Tidy First?」を少し読んでからチェックアウトしました。

まずは五稜郭駅から函館駅に向かいます。

五稜郭駅 時刻表
五稜郭駅 時刻表

五稜郭駅に着いて気づいたのですが、電車の本数が思ったより少ないです。一時間に2〜3本。ですが、駅舎の雰囲気が良かったせいか、ぼーっとしているとあっという間に電車が来ました。

五稜郭駅舎
五稜郭駅舎

函館駅に着きました。Day0に意図せず函館駅を利用することになったので、実に5日ぶりの函館駅。まだ飛行機までは時間があったので、コインロッカーに荷物を預けて少し散策することにしました。

これは赤レンガ倉庫群。実は高専4年の時に函館に旅行に来たことがあって、その時も行ったので3年ぶりに来ました。何回見てもいいですね、東京駅もそうなんですが、レンガ造りの古い建物には趣を感じます。

赤レンガ倉庫群
赤レンガ倉庫群

赤レンガ倉庫を見るのは満足したので、そのまま徒歩で函館駅に戻ります。

途中で見つけたでっかいタコ
途中で見つけたでっかいタコ

でっかいタコを見るとタコが食べたくなってきました。というわけで、なぜかRubyistは読み間違えがちな商業施設の地下1Fにある根室はなまるに行きました。

なぜかRubyistは空目しがちな商業施設(kiralis/キラリス)
なぜかRubyistは空目しがちな商業施設(kiralis/キラリス)

開店20分ほど前に着いたのですが、すでに前には11組いました。人気ですね。

根室はなまるで食べた寿司。イカ4貫
根室はなまるで食べた寿司。イカ4貫

本当はタコの写真を載せるべきだとは思いますが、イカが一番好きなのでイカの写真しか撮ってませんでした。反省。

昼から飲む酒ってなんでこんなにうまいんでしょうか。寿司を食いながら地酒を流し込みます。脳が痺れます。最高です。 余談ですが、函館だからなのかわからないですが、なぜか酒が1合じゃなくて1.5合で来ました。飲み切った頃にはすっかりほろ酔いになっていました。

てなわけで、そろそろ函館を去る時間が来ました。コインロッカーから荷物を取り出してリムジンバスに乗り込み、絶景を横目に函館空港に向かいます。

リムジンバスから撮った海が綺麗な写真
リムジンバスから撮った海が綺麗な写真

函館空港に着いてお土産を買っていると、きのう一緒にゴルフをしたかびさんころちゃんさんと遭遇しました。函館で最後に会ったRubyistかも。 お土産をカバンに詰めて、荷物を預けると25kg。そら重いですわ、腰も限界を迎えつつあります。

函館空港で搭乗後、機内から撮った写真。さらば函館。
函館空港で搭乗後、機内から撮った写真。さらば函館。

さいごに

函館の酒・飯と、Rubyに囲まれた最高の6日間でした。RubyKaigiありがとう!!Ruby最高!!!

余談: Day30

元々関西Ruby会議のCFPを出すためにRuby::Boxを使ってモジュラモノリスの実行境界を分けるのを試していたのですが、tagomorisさんのRuby::BoxのKeynoteや、jokerさんのLTをきっかけに、Ruby::Boxでモジュラーモノリスの実行境界を分離する、というテーマで初めてCFPを書いてみました。

それが見事採択され、人生初めてセッションを登壇できることになりました。高専生時代でも学会で発表したことすらなかったので、もうすでにめっちゃ緊張していますが、めっちゃ嬉しいです!

関西Ruby会議09 Speakers