トップ «前の日記(2022/12/13 (火) ) 最新 次の日記(2022/12/15 (木) )» 編集 RSS feed

HsbtDiary


2022/12/14 (水) [長年日記]

Ruby の中にある解決できると嬉しい人が多分多いタフな問題

Ruby 開発チーム(コアチーム)には壺と呼ばれる、「これができるととても嬉しい」というネタを放り込む hackmd のページがあります。issue などにして作ったところで誰かが進めるわけでもないし、project にしても epic すぎるが、いつかは何かやりたいという大きさのものを思いついたらすぐに入れています。

今回は Ruby Advent Calendar 2022 の14日目の記事として、この壺の中から熟成された夢をいくつか取り出してご紹介します。

ライブラリのRactor 対応

Ruby 3.0 の目玉として入った Ractor ですが、Ruby のライブラリが Ractor で動くかというとまだわからない、むしろ動かないだろう、というステータスです。RubyGems や Bundler でネットワークアクセスをするときに Ractor にしたらなんか良さそう!とかそういう夢はありますが、標準添付ライブラリでも Ractor で動くかわからないので前に進めない状態です。

https://github.com/search?q=org%3Aruby+author%3Arm155&type=pullrequests

rm155 さんが Ruby の標準添付ライブラリに対して、Ractor でも動くためのパッチをたくさん投げてくれていますが、Ractor のテストが難しいのとパフォーマンスを劣化させないで対応させる、というところやそもそもこの修正が妥当かどうか、という部分でレビューしきれておらずマージは中途半端な状態になっています。

Ractor はまだ API や挙動がフリーズしたわけではないので、標準添付ライブラリや利用者が多い gem などを Ractor 対応しながら、もし期待とは異なって「この動きは仕様なのか...?」や「こう動くべきでは...?」ということを https://bugs.ruby-lang.org に起票してもらうと Ruby 開発チームはとても喜びます。

Socket の Happy Eyeballs Version 2 対応

これは Ruby アソシエーションの Grant で取り組んだ内容で、Socket.tcp を IPv6 と IPv4 の dual stack の時に高速に動かすという Happy Eyeballs Version 2 に対応させるという内容です。

プロジェクトの詳細については上記を見ていただきたいのですが、getaddrinfo_a を使って解決しようと取り組んだもののプロセスを fork した先で Socket.getaddrinfo を呼ぶと期待通りに動かず sleep 1 せざるを得ないという問題が残り、最終的には全て revert という状況になっています。

https://github.com/ruby/ruby/commit/5d8bcc4870601ab1ee05346346f241d4a805aac9

この対応はかなりタフな問題ですが、getaddrinfo_a を使うかどうか、も含めてアプローチから考えて解決できると Ruby 開発チームはそれはすごく喜びます。

ライブラリを複数バージョン同時にロードする機構

これは RubyGems/Bundler メンテナとしてはとても欲しい機能なんですが、要は json-x.y.z と json-a.b.c を単一のプロセスからそれぞれ require した上で衝突しないようにする仕組みです。

https://bugs.ruby-lang.org/issues/19024

上記でも似たような提案がありますが、C extention は無理じゃないかなあと matz や nobu のコメントもあり誰か作ってくれ〜というステータスになってます。

これが実現できれば、標準添付ライブラリとして付属しているライブラリは Gem の namespace の下に放り込んで、その上でユーザーが使いたい任意のバージョンのライブラリをトップレベルに入れるということができるようになって、長年の懸念となっている RubyGems で json が使えないとか、多数のライブラリをベンダリングしているという渋い問題が解決できます。アプリケーションレベルのユースケースとしては、モジュラモノリスな Rails であるネームスペースでは Rails 6 で、あるところは Rails 7 で、みたいなことができる、のかもしれません。なんかすごそう。

以上、3つほど、Ruby で解決が大変そうだけど、解決できたらすごい!11という問題を紹介しました。他にも HTTP/2, HTTP/3 対応とか、ワンバイナリの何かとか、C ext 依存が要因でインストールやビルドがめんどい(ことがある)とか、問題はたくさんあるので、我こそはという方は是非挑んで見てください。

メンター、とまでは動けるかわかりませんが何かしらガイダンスはできると思うので、GitHub や Redmine などで hsbt に声をかけてもらっても大丈夫です。