こんにちは。STORES 予約 の開発をしているima1zumiです。夏も終わり秋も深まる季節になってしまいましたが、8/24に開催された大阪Ruby会議04という地域Ruby会議*1に参加したのでレポートします。
会場は中之島フェスティバルタワーでした。ビル1FにGLITCH COFFEE OSAKAがあったりカンファレンスホールと同じフロアに美術館があったりとオシャレな空間でした。
Keynote: 最高の構文木の設計 2024年版
LSPやRuboCopのユースケースから考えるとRubyが提供する構文木にTriviaと呼ばれる付加情報をくっつけたほうがいいんじゃないかという設計の提案の話、と理解しました。パーサとしては抽象構文木で十分ですがRuboCopのコードフォーマットのようなことをしたい場合、抽象構文木では落とされるコメントや空白といった情報を保持しておきたいケースがある。現状のRuboCopは頑張って文字列書き換えを実装しているがRuby本体から具象構文木を提供すればみんなハッピーなのではという話でした。
その場合は抽象構文木(AST)ではなく具象構文木(CST)と呼ばれるそう。実装にあたってはIDEがセットになっている言語のSwift等を参考にしたとのことで、IDEがセットだとコメントのような情報もLSPが流行る前から必要だったんだなあというのが興味深かったです。これは人類が初めて出会う問題ではないんですね。先行事例を丁寧に調べる姿勢を見習いたいと思いました。
dRuby 入門者による あなたの身近にある dRuby 入門
dRubyとはRuby上でプロセスやネットワークを超えてメッセージを送るための仕組みで、他プロセスのインスタンスにアクセスしたりできるようです。dRubyの紹介とリアルワールドで使われているdRubyのユースケースの話で、dRubyを触ってみたくなりました。Xの初期にdRubyが使われていたということを初めて知りました。dRubyでremote IRBを書いてみたいなーと思いました。*2
Re-line 〜 IRB・Reline 複数行編集の裏側
ぺんさんによるRelineのリアーキテクチャの話。リアーキテクチャの主なPRはこちらです。
ぺんさんと言えば奇妙なコードの作者としても知られていますが、IRB, Reline等のメンテナでもあります。自分もメンテナの一員なので楽しみにしていたトークで、とても面白かったです。会場の中で一番エンジョイしていた自信があります。
少しこのトークの前提の話をすると、RelineはGNU Readline互換の行編集機能を提供するPure RubyライブラリでRuby本体に同梱されています。GNU ReadlineにはなくRelineにある機能として複数行の入力を受け付けることや、ダイアログを表示させることができます。*3複数行入力ができることによってCLI上でも直感的にRubyのコードを入力しやすくしています。*4
また、ダイアログは補完候補の表示などに使われています。補完候補は既に出力した文字を上書きして表示されることがありますが、端末にはCSSでいうz-indexのような概念はないため、何を優先して描画すべきかを計算する必要があります。
そんなRelineですが、端末にレンダリングするメソッドやタイミングがあちこちに散らばって見通しが悪くなっている、何度もレンダリングして効率が悪い、レンダリングに使う変数がどのタイミングでどんな状態になっているかわかりにくいといった問題がありました。また、不具合でレンダリングに失敗するとデバッグが難しいという課題もありました。その問題を解決するためにレンダリングを差分レンダリングにすることと、レンダリング箇所を統一して効率よく見通しよくするといったリアーキテクチャの設計の話でした。リアーキテクチャにあたってレンダリングすべき文字の重なりあいを線分と捉える、3Dレンダリングのレンダリング方法を参考にするなどぺんさんの思考が垣間見えたのが面白かったです。
ぺんさんはこれをjQueryからReactへの転換と同じようなことをした、と話していました。一見するとターミナルエミュレータとフロントエンドは技術的に遠い分野のように思えますが、どういった技術分野の上に乗っているのかは些細な問題で、本当に重要なのはいかにして解くべき問題を捉えるかなのだなぁと感じました。
Keynote: 令和の隙間産業——PicoRubyはどこから来て、どこへ行くのか
素敵なクロージングキーノートでした。「これはキーノートだと思って聞くからキーノートになるのだ」という言葉がとても印象的で、発表者だけではなく、聞き手によっても作られるものだと発表という営みへの解釈が深まった気がしました。ちょっとした自分のプロダクトをもって育てていくことの楽しさに心が温まりました。
懇親会
飛び入りLTコーナーがあったので現場でスライドを作ってLTしてきました。これもまた隙間産業的なプロダクトで、2006年から2024年までのRubyKaigiの登壇者とタイトルを一覧にしたページです。RubyKaigiのあるスピーカーが過去に何を話していたのか知りたいことや、年度を横断して調べたいことがときどきあるので作りました。
作り始めたときは自分にしか需要がないのではないかと思っていましたが、RubyKaigiオーガナイザー方面に需要があったようで喜んでもらったり、名寄せや取得方法を充実させるPRを出してもらったりと思わぬフィードバックをもらえて嬉しかったです。自分がほしいと思っていることは他の誰かもほしいと思っている可能性があるものですね。
参加してみて
トークも交流も楽しく元気がもらえる素敵なカンファレンスでした。オーガナイザー、発表者、すべての関係者の方々に感謝します。ありがとうございました!
*2:参考: リモートプロセスのIrbセッションをローカルプロセスのRelineを使って操作できるirb-remoteというGemを作った | QWYNG.dev
*3:GNU Readlineにも複数行入力機能はありますが、2行目以降はプロンプトが表示されません。
*4:ただし複数行入力にすると単一行の入力と違って終了条件が自明ではなくなります。そのためRelineはProcで終了条件を受け取っており、例えばIRBではコードをひとかたまりで実行できる条件をProcとしてRelineに渡しています。