はじめに
タイトルの通り、RubyKaigi2025に参加しています。
RubyKaigi初参加で空気感をおそるおそる探りながらではありましたが、Day1で参加したセッションの概要を紹介していきたいと思います。
(ちゃんと聞き取れていない部分もあるかと思いますがご容赦ください)
参加したセッション
Ruby Taught Me About Encoding Under the Hood
- 文字コードの歴史
- 狼煙→光学的電信→セマフォ→モールス信号
- ASCII、EBCDIC→Unicode
- 文字コードに興味を惹かれた経緯
- IRBで特定の絵文字(👨👨👦👦)を入力するとクラッシュすることがわかった
- ∵絵文字を構成するコードポイントに制御文字が含まれることが原因
- 原因調査するうちに文字の見た目とそれを表現するためのコードが乖離していることに興味を持った
- IRBで特定の絵文字(👨👨👦👦)を入力するとクラッシュすることがわかった
- Unicode15.1.0に対応する際苦労したこと
- インド系文字で文字を連結するための制御文字(InCB)の区分を追加
- 文字定義が正しく読み込まれない、意図通りに文字が表示されずテストが通らないなど
- Unicode16.0.0で対応中のこと
- 見た目は同じだが文字コードが異なる文字の取り扱い(例:合成文字)
- 実装・テストはできているがパフォーマンス面に不安が残る状態
- RubyKaigiについて
- コミッターなどとオフラインで話ができる貴重な場なのでぜひ声をかけてほしい
Introducing Type Guard to Steep
- Type Guardがうまくいかないケースへの対応
- 複数クラスで定義されている同名メソッド(Union Types)
- 例:
ActiveSupport#present?
メソッド - if文の条件式で記述したときにブロック内コードで型の絞り込みが機能しないことがある
- →条件式の戻り値も評価した上で絞り込むようにすることで対応
- 例:
- 自分で定義したメソッドによる型の絞り込み(User-defined method)
- 例:オーバーライドによって戻り値が変わるメソッド
- 型定義ファイルにアノテーションを追加することで対応
- 現在対応中
- インスタンスの状態により型の絞り込みが発生するケース
- 例:
ActiveRecord#valid?
- 例:
- 複数クラスで定義されている同名メソッド(Union Types)
Goodbye fat gem 2025
- fat gem = ビルド済みバイナリ入りgem
- インストール時に拡張ライブラリ(C実装のライブラリ)のビルドが必要となる場合に使われる
- メンテナンスし続けるのが難しい
- 最新のRuby環境にすぐ対応されない可能性がある
- どれか1つでも対応してないと使えない
- →対応されるまで前バージョンのものを使い続けることが多い
- 依存ライブラリに脆弱性が見つかったら修正待つしかない
- クロスコンパイルがほぼ必須
- 11プラットフォーム、メンテ対象のRuby4バージョン=44通り分のバイナリを用意する必要がある
-
rake-comppiler-dock
で環境作れるけどそれでも大変 - スタティックリンクも必要となる
- 最新のRuby環境にすぐ対応されない可能性がある
-
rubygems-requirements-system
を作成- https://github.com/ruby-gnome/rubygems-requirements-system
- ビルド環境を自動で整備するgem
- 先駆者:RubyInstaller2
- gemのインストール時間が長くなることが欠点
- パラレルビルドを使えば解決するかもしれない
- ただRubygems公式から「pythonで言うwheelを開発中」との発表があった
- 本当に実現できるのか?
Automatically generating types by running tests
-
rbs-trace
を作った- https://github.com/sinsoku/rbs-trace
- テスト実行時の挙動から型宣言ファイルを自動生成できるようにするgem
- メソッド呼び出し時の引数と戻り値を記録して集計する
- テストが正確かつ十分に記述されていることが前提
- 既存のRailsアプリで動作することは確認済み
- redmine、mastdon
- 確認した限り生成された型定義も問題なさそう
- 3.8倍〜5倍くらい実行時間が遅くなるが型定義ファイルを生成する1回だけ実行すれば良いので許容範囲
- 苦労したところ
- BasicObjectを継承しているクラスの場合クラスメソッドが集計できない
- ActiveRecord::Retionのクラスがうまく表示されない
- nameメソッドがオーバライドされているためto_sするだけだとうまくいかない
- void型を判定できない
- ∵rubyの仕様上戻り値として何かしら値を返すため
- →呼び出し元で値を使っているかを確認する(caller_locations)
- 並列テストに対応してない
- 他スレッドですでにアノテーションが挿入されている場合挿入しなくなってしまう
- →実行結果を集計する部分と型定義をコードに挿入する部分を別プログラムとしてそれぞれ実行するようにした
State of Namespace
- namespaceとは
- アプリケーション、ライブラリをカプセル化する仕組み
- 他ライブラリの実装に影響しないようにできる
- バージョン違いのライブラリも同時に読み込むこともできるようになる
- namespaceの外部から呼び出すことも可能
- 詳細は去年の発表を参照
- 去年の発表からデバッグ作業を進めていた
-
make exam
が通らずにRuby3.4リリースに間に合わず。。。
-
- 実装について
- クラス定義部分にnamespaceのために必要なデータ構造を追加
- classextの内容を同じnamespaceの他クラスにもコピーする
- 苦戦した部分
- autoloadで一度読み込んでから別のnamespaceを読み込んだときにうまくいかない
- 定数テーブルを読み込もうとするとSEGVが起きる
- テスト(
make exam
)中に勝手にSIGKILLがかかる- ビルド時に生成されるファイルが競合していた
- MRIのバグ見つけた
- Stackで大量にpopがかかる
- #20655
- refinementするとエイリアスが正しく機能しない
- #20767
-
make check
でsytemstackerror - prismでビルドするとエラーになる
- etc...
- Stackで大量にpopがかかる
- 今後の展望
- namespaceの管理について
- 実装をstack&threadからcontrolframeへ
- namespace GC
- 次のRubyバージョンにはマージしていきたい
- namespaceの管理について
dRuby on Browser Again!
※「dRubyをブラウザで動かす」という目的が同じだったので同じ時間枠内でそれぞれ発表
- ruby.wasmを使ってdRubyを動かしてみた(from Yoh Osaki)
- wasm:ブラウザ上で動くruby処理系
- dRuby:分散コンピューティングで動くRuby
- 構成
- drb-websocket
- faye-websocketを使って実装
- wasm_drb
- wasm上でのdRuby実装
- drb-websocket
- 課題
- stubで呼び出すと非同期呼びだし(Promise Object)として扱われる
- wasmとJSの連携が難しい
- websocketを抽象化するライブラリを作った(from Shigeru Nakajima)
- wands(Web AND Socket)
- irbで動くコードをwasmでも動かせるようにする
- ソケットプログラミングをブラウザ上でやっているようなもの
おわりに
興味ありそうな分野をピックアップして参加したつもりでしたが、勉強不足なところもありなかなか難しい内容でした
(聞いた時にはわかったつもりになってましたが、いざ噛み砕いてみると難しくもあり・・・)
今日はスポンサー企業のブースをほぼ周れていなかったので、Day2以降はそちら中心に周っていきたいと思います。