RubyKaigi 2024 に参加しました

5月15日~17日に沖縄で開催された RubyKaigi 2024 に参加してきました。
これまで RubyKaigi はオンラインでちょくちょく参加していましたが、リアルで参加したのは`初めてでした。チケット代から交通費・宿泊費まで全て負担してくれた会社に感謝です。

0日目

会社の代休が余っていたので前日(5/14)に沖縄に移動し前泊しました。Pre-checkin が19時までだったのですが、17時半頃に空港についたため急いで会場に向かいました。

ゆいレールに乗ったときくらいからエンジニアっぽい人々をチラホラ見かけるようになり、県庁前駅で降りてからは5~10人くらいが小雨が降るなか会場を目指して歩いていたと思います。

会場はすでに多くの人で賑わっており、入口のパネルでの記念撮影をする人やスポンサーブースを設営する人、久しぶりの再開に話を弾ませている人、そしてネームタグをケースにいれるの苦戦する人(自分)など様々でした。

RubyKaigi が同窓会みたいになっているのは現地参加の醍醐味ですね。自分の知り合いも何人か来るという情報を聞いていましたが、このときは誰にも会わなかったのでそそくさとホテルへ向かいました。

RubyKaigi 2024 というロゴと沖縄の文化や食べ物をモチーフにした図形などが配置された図
会場入口にあった RubyKaigi のパネル

ホテルでチェックインを済ませたときには19時を過ぎていました。この時間になると沖縄といえど日は落ち、雨がパラパラ降っていました。

移動で疲れていましたがせっかくなら沖縄料理を食べたいなと思い、国際通りに向かいました。バスで Suica が使えなかったときは焦りましたが、お守りとして持っていた千円札のお陰で無賃乗車せずにすみました。

向かったお店はここ 飯ト寿 小やじ maps.app.goo.gl

オリオンビールで乾杯し、刺し身やサラダ、メンチカツを食べました。刺し身は臭みがまったくなく美味しかったです。

会社の同僚に連絡したところ、一緒に飲もうということになったので牧志公設市場の居酒屋で飲みました。
実は職場から RubyKaigi に参加しているメンバーはチームが異なり、これまでほとんど面識がありませんでした。
こうやってイベントがないと、なかなか会うことも難しいのでいい機会となりました。


ここからはざっくりと参加したセッションをピックアップして振り返っていこうと思います。

1日目

Writing Weird Code

資料: https://drive.google.com/file/d/1Dkx15u_5UAGoFqJHCeAuj2FXS-z_U7EE/view

Animated Quine というわけのわからないもの(褒めてる)を初っ端から見せつけられ、RubyKaigi 始まったなぁという感想でした。
一見すると使い道がなさそうなトリック(失礼)が散りばめられているのですが、字句解析や構文解析の穴をつくためのテストコードとしてこういった技術が使われるというのは興味深かったです。

アニメーションつけるのは難しそうですが、普通の Quine は試したいなと思います。

The grand strategy of Ruby Parser

資料: https://speakerdeck.com/yui_knk/the-grand-strategy-of-ruby-parser

お昼ご飯が長引き、途中参加でしました。
パーサージェネレータである Lrama に関する話で、そもそもなぜ必要なのか?から今後の展望までが熱く語られました。
Prism は触ったことがあったのですが、Lrama に関しては初めて知りました。しかし、その必要性や Universal Parser の構想などについてざっくり理解できたと思います。

An adventure of Happy Eyeballs

資料: https://speakerdeck.com/coe401_/an-adventure-of-happy-eyeballs

Socket ライブラリに RFC8305: Happy Eyeballs v2 で提案されているアルゴリズムを実装したという話でした。
実装する上での複雑な状態との戦い方やブロッキングなどの対処として IO.selectIO.pipe を使った実装は参考になりました。

ネットワーク周りの実装するときのテストって大変そうだなって思ったのですが、デモのように簡易サーバー立ち上げるのが一般的なんですかね...?

Official Party

特に説明はないです。海を眺めながらのバーベキューは最高でした。(0日目の天気じゃなくてよかった〜)

バーベキューグリルで焼かれている肉・ソーセージ・野菜など
一日目の Official Party のバーベーキューの様子

2日目

Does Ruby Parser dream of highly expressive grammar?

資料: https://speakerdeck.com/ydah/does-ruby-parser-dream-of-highly-expressive-grammar

Lrama の文法を定義する構文に関する話でした。
Lrama では新しい構文を定義して DSL を使って実装したことによって複雑な文法を抽象化できるようになったということだと理解しました。

パラメタライズや頻出文法のライブラリ化、条件分岐などがあるとのことですが Ruby 以外のパーサーも作ろうと思えば作れるという認識であっているんですかね...?

Embedding it into Ruby code

資料: https://speakerdeck.com/soutaro/embedding-it-into-ruby-code

YARD のように書いたコメントから RBS を生成する rbs-inline gem を作っているという話でした。 YARD との共存?として説明などを書きたいときにどうなっていくのかが気になりますね。 まだ RBS 導入できていないのでこれから導入するときは使ってみたいです。

あと、Live demo のときに snippet を使っていて真似したいなと思いました。

Getting along with YAML comments with Psych

資料: https://speakerdeck.com/qnighy/getting-along-with-yaml-comments-with-psych

Psych という YAML パーサーを拡張してコメントを扱えるようにしたという話でした。(スピーカーは前職の同僚)
以前 YAML の歴史について教えてもらい、実はライブラリ存在はその時に聞いていました。

しかし、発表後半で触れていたライブラリの拡張ライブラリを作る際にどこまでを責務とするか?のような設計の線引の話はあまり聞いていなかったので面白かったです。(以前も聞いてたらごめんなさい..)

RuboCop: LSP and Prism

資料: https://speakerdeck.com/koic/rubocop-lsp-and-prism

RuboCop に LSP を統合した話でした。この話を聞くまで RuboCop が LSP の機能を持っていること知らなかったです。
静的解析→リアルタイムな解析でエラートレラントの必要性を理解できました。

Shopify の Ruby LSP も LSP と linter/formatter を提供しているので、今後どちらが使われていくのかは気になりますね。

Good first issues of TypeProf

資料: https://speakerdeck.com/mame/good-first-issues-of-typeprof

TypeProf の紹介とコントリビューションしてねという話でした。型注釈無しで無理矢理型を推論するのはパワフルですごい... 特にテストに関する考え方が印象的でした。編集過程をテストするため、そのようなテストが書きやすい DSLを作りシナリオテストを実装しているのが面白かったです。

実は TypeProf 自体は以前の発表で知っていたのですが何もできていなかったので、これを期に手を動かしたいなと思います。

夜ご飯

この日はアフターイベントに参加できなかったので一人で飲みに行きました。行ったお店は県庁近くの くもざき

maps.app.goo.gl

気さくな店長が色々とオススメの泡盛を教えてくれました。大きくてジューシーな焼売と沖縄野菜が美味しかったです。

3日目

YJIT Makes Rails 1.7x Faster

資料: https://speakerdeck.com/k0kubun/rubykaigi-2024

YJIT のパフォーマンス改善の話でした。タイトルつけた時点では 1.7 倍の高速化が、発表のタイミングでは 1.8 倍になったとのことで笑いが起きました(すごい)。
Ruby のコードはまず Ruby VM 命令に変換され、それが JIT コードに変換されて動作するようです。(JIT でない部分はインタプリタ) ただしすべてのコードが YJIT に変換されるわけではないようで、今回の対応でサポート範囲が増えたことによりパフォーマンスが改善したようです。
他にも VM のスタックの値をメモリーに書き込んでいたものがレジスタに置き換わるなど様々な高速化が行われているようです。

個人的に最近低レイヤに興味が出てきたのでこのあたりの発表が聴けてよかったです。また Ruby のバージョンを上げるだけでどんどん速くなってくれるので嬉しいですね。

Porting mruby/c for the SNES (Super Famicom)

資料: https://speakerdeck.com/gedorinku/c-for-the-snes-super-famicom-rubykaigi-2024

スーパーファミコンに MRuby を移植し、ゲームを動かす話でした。(スピーカーは前職の同期)
以前から話を聞いていましたが、画面更新のタイミングが決められていることやデバッグの難しさ、パフォーマンス問題など改めて発表で聞いて面白かったです。

この取り組みを聞いて自分も低レイヤに興味を持ち、CPU エミュレータを書きはじめたりしているので感謝です。

感想

今回はじめて RubyKaigi に現地参加してみて、現地参加の良さを実感しました。
登壇者や他の参加者との交流ができることはもちろん、会場の熱気や一体感みたいなものは実際に同じ空間にいないと感じることはできないなと強く思いました。

また、オンラインだと本当に気になるセッションしか見ないことが多いです。しかし、現地にいるとせっかくだし除いてみるかという感じでふらっと聴きに行くことも多く、幅を広げられる(知らないことを知れる)という点で結構よかったなと思います。

発表全体に関する所感としては、Ruby のパーサー周りや開発支援系の話が多かった印象です(自分が意識して聴きに行ったのもある)。
他にも YJIT、並列・並行処理などパフォーマンス関連のトピックも多かったです。この辺は実際にアプリケーションを運用する上で直に恩恵を受けられるので今後が楽しみなところですね。

これは僕だけかもしれないですが、JSConf や Go Conference に比べて言語本体の実装やランタイムの話が多いなという印象をもちました。RubyKaigi は 「Ruby にこんな機能を実装しました」「xxx のこの実装はこうなっています」みたいな内部の話が聴けます。これは自分にとってはなかなか新鮮な感じがして楽しかったです。

一方で反省点としては事前の予習が足りなかったなと感じています。前の話にも重なるのですが、Ruby のコア周りの話が多いため予備知識がないと置いてきぼりになってしまうなと... 直近の Ruby 周りの動向を知っているともっと RubyKaigi を楽しむことができ、吸収できることも多かっただろうなと思いました。

一通り話を聞いてみて、RubyKaigi の内容を今すぐ実務に取り入れるイメージはあまりついていないです。しかし、今後はより積極的にコミュニティ貢献するぞというモチベーションになったので参加してよかったなと思っています。

さっそく自分の周りでも RubyKaigi で紹介された gem に対してパッチを送ったり、それに便乗して(?)僕もパッチを投げたりしていて KaigiEffect を実感しています。

github.com

自分が今後注視していきたいところは以下の4つです。来年の RubyKaigi では話についていけるようにしっかりとキャッチアップしていきたいと思います。(あわよくば登壇したい...!

  • Prism と Lrama の関係
  • Ruby 自体
    • 文法?機能のフリーズ周りの動向
    • まだ使ったことない機能周り(Fiberとか)
  • 開発ツール周り全般
    • 型の支援ツールなども出てきているが複数あるので今後どうなっていくのか
  • 気になった gem とか

そういえば沖縄に行ったのは今回が3度目なのですが、いちばん沖縄料理を堪能できました。沖縄野菜やお刺身が美味しく、オリオンビール泡盛を飲みすぎてしまったので次の健康診断が心配です。
一つだけ心残りがあるとすれば〆のステーキを食べる元気がなかったので、次は〆ステーキ食べるために沖縄に行こうと思います! RubyKaigi お疲れ様でした!


編集履歴

2024-05-29: The grand strategy of Ruby Parser の資料のリンクが間違っていたため修正いたしました。ご指摘いただきありがとうございました。
2024-05-30: Getting along with YAML comments with Psych のセクションがまるっと抜けてたので追記しました。