🌴

RubyKaigi2024 DAY2予習

2024/05/12に公開

RubyKaigi2024 DAY2(5/16)の発表について、超ざっくりと予習というか、こんな感じのお話っぽいな〜というのをまとめました(各トークの紹介文にちょっと補足したりした感じ)。
時間がなくて後半露骨にあっさりした内容になっています🙇‍♂️

Leveraging Falcon and Rails for Real-Time Interactivity by Samuel Williams

Samuelさんご自身が開発されている、Falconという非同期WEBサーバを使って、リアルタイムインタラクティブなゲームを設計・実装するというお話のようです。
Falconはasync(ThreadScheduler等の機能を持った非同期処理用のGem)上で動くWEBサーバーらしいです。
Rubyをインタラクティブなゲームに使うイメージはなかったので、どんな感じになるのか気になります!
また、Falconの説明には「長期的にはウェブアプリケーションのデプロイを簡略化したい」という内容があり、この辺りについても詳しく聞けたら嬉しいなと思いました。

余談:
Rubyの並列実行はよく取り上げられる話題という印象ですが、個人的には使ったことがなくて、正直あまり具体的なイメージがない状態なんですよね・・・・。
自分が今まで関わってきたアプリが比較的小規模なものが多かったからでしょうか?
Railsアプリで重い処理とかは大抵非同期ジョブとしてActiveJob使っちゃうので、パフォーマンス改善のため並列化とかもやったことがないです。
このへんはいつかコード書きながら勉強したいです。

参考

falcon
Kaigi on Rails 2023 | Async Gem で始める ruby 非同期プログラミング

Finding Memory Leaks in the Ruby Ecosystem by Peter Zhu, Adam Hess

Ruby3.3の新機能であるRUBY_FREE_AT_EXITを使ってメモリリークを検出するというお話のようです。
メモリリークとは何か、その影響等についてお話ししてくださるようなので、勉強になりそうです。
メモリリークとは・・・!説明できない!恥ずかしい!
Wikipediaによれば、

  • メモリリークとは、使用していないメモリを解放することなく確保し続けてしまうこと
    • (個人的にこの現象とリークっていう言葉が結び付かない。そういうニュアンスあるのか・・・?)
  • メモリリークが繰り返し発生してメモリが大量に消費されると、メモリが枯渇してnullを返したりハンドリングされないエラーが発生したりする
    とのことです。
    リリースノートではRUBY_FREE_AT_EXITの説明を見つけられませんでしたが、内容についてはとしてはここで説明されてるところでしょうか?
    メモリサニタイザ(たぶん、メモリに関するバグを検出するツール)が使えるように、Ruby修了時に全てのメモリを解放するオプションのようです。
    全てのメモリを解放するのは難しいことのようですが、長時間起動し続けるWEBアプリや組み込みにおいては重要な話と感じました。

参考

Wikipedia | メモリリーク
bugs.ruby-lang.org | Feature #19993
bugs.ruby-lang.org | Feature #20290
Qiita | [UE4][UE5]でAddress Sanitizerを有効にしてメモリ破壊を調べる
ANDPAD Tech Blog | Ruby のメモリ使用量問題を調査し upstream で解決していただいた話
Quora | Railsサーバーの利用メモリがひたすら増加していく

Does Ruby Parser dream of highly expressive grammar? by Yudai Takada

RubyのパーサジェネレータにDSLを拡張する機能を追加するお話のようです。
まず背景として、Rubyは3.2までBisonというパーサジェネレータに依存していましたが、いろいろな環境でRubyのソースコードからビルドするために、複数バージョンのBisonに対応しなければならない、機能拡張が難しいという問題がありました。これに対し、Ruby3.3ではLramaという新しいパーサジェネレータが導入されました。LramaはRubyのレポジトリに直接インストールされており、Ruby開発者によって管理されているため、これまでより拡張しやすくなっています。Ruby3.4では更なる改善として、Ruby本体から独立したパーサを目指しており、さらに使いやすくしていくとのことです。
パーサージェネレータは文法ファイルというものの中にDSLで定義された文法に従ってパーサを生成します。
この発表では、この文法ファイルに使うDSLを複数対応できるようにしていくということと理解しました。
パーサ(ジェネレータ)を使いやすくしていくのは、LSPやRBSなどのツールを拡充していくための活動のようで、開発効率・開発体験の向上につながるお話を聞くことができそうです。

参考

gihyo.jp | Lrama LRパーサジェネレータが切り開く⁠⁠、Rubyの構文解析の未来

Community-driven RBS repository by Masataka Kuwabara

ライブラリのRBSファイル管理について、ユーザーがライブラリのRBSファイルを書いて貢献したい場合の問題を改善されたというお話のようです。
OSS活動に憧れを持つ身として、すごく気になります!(2022のfu-gaさんの発表聞いた時にあんなにやってみよう!と思ったのに結局やれてない・・・・)
また現在sorbetを使うプロジェクトに参画しており、RBIとの違いなどについても注目して聞きたいです。

参考

RubyKaigi Takeout 2021 | The newsletter of RBS updates
RubyKaigi2022 | Types teaches success, what will we do?

Embedding it into Ruby code by Soutaro Matsumoto

RBSをRubyコードの中に埋め込もうとしているというお話のようです・・・!
RBIを使っていて、「RBSならRubyのコードの中に色々書かずに型を使えるらしいのになぁ」とか羨ましく思ってたのですが、そこが変わっていくのでしょうか?
Rubyと分離するという設計の良い点悪い点についてもお話ししてくださるみたいです。
RBSは色々機能が充実していってるようですが、まだRBIの方が完成度は高いようです。
今後Rubyの型がどうなっていきそうなのか知ることができそうです。

参考

新機能ラッシュ! RBS最新情報をキャッチアップ

RubyGems on ruby.wasm by Yuta Saito

Wasmでgemを(実験的に)使えるよというお話のようです!
Wasmに追加されたComponent Modelという新しい仕様によってこれが実現可能になっているとのこと。
本来Wasmは言語比依存の仕組みとして作られていたものの、ある言語で書いたWasmモジュールを別の言語から利用するような場合には特別な注意を払ってコーディングしなければならなかったそうです。
Component Modelは、この点を改善するために追加されたもので、コンポーネントという相互に互換性のある単位を使うようです。
そもそもWasmってどんなところがいいの?と思って調べてみると、やっぱりJSに比べて速い(WEB上でネイティブに近いスピードで実行できる)というところが利点なんですね。
静的なWasmコードだけ配信して、実行は全部クライアント側で・・・みたいなサービスもあり得るんでしょうか?
発表の中ではデモも行っていただけるそうで、夢の広がるお話が聞けそうです!

参考

mdn web docs | WebAssembly
Zenn | WASM Component Modelをまとめてみる

Optimizing Ruby: Building an Always-On Production Profiler by Ivo Anjo

DatadogでRubyのプロファイリングができるddtrace Gemの仕組みについてのお話のようです!
Datadog一瞬だけ触っていたのですが、すごくいいプロダクトだなと思っていたし、ddtraceも確かほぼGemfileに入れるだけで使えて、すごく楽だった印象があります。
Rubyのプロファイリングがどのように行われるのか知ることで、もしかしたら部分的には手元で直接動作状況確認できるようになったりしないかな?もしそうなったら色々楽しそうです!

Reducing Implicit Allocations During Method Calling by Jeremy Evans

Rubyコードのオブジェクト割り当て削減による最適化に関連して、Ruby3.3での変更点と、3.4で予定されている変更について説明してくださるようです。
「暗黙的なオブジェクト割り当て」ということで、Rubyのメソッド呼び出しの仕組みの部分を知ることができそうです!

Unlock The Universal Parsers: A New PicoRuby Compiler by Hitoshi HASUMI

Rubyのユニバーサルパーサを実現するために解決しなければならないこと、そしてユニバーサルパーサを活用するために設計されたPicoRubyコンパイラについてのお話のようです。
ユニバーサルパーサは、異なるRuby実装(CRubyだけでなくmruby、JRuby、あるいはsorbetなど)で使い回すことのできることのできるパーサーです。
Lramaが生成するパーサはCRubyに深く依存しているため、ユニバーサルパーサーを実現するにはCRubyの実装を調査して依存をなくしていく必要があるようです。
また。PicoRubyはmrubyのすごく軽量な別実装です。
組み込み用途におけるユニバーサルパーサの意義が気になるところです。制限のある環境で動かせるというところになにか寄与するのでしょうか?

参考

Getting along with YAML comments with Psych by Masaki Hara

YAMLの自動生成にトライした際の失敗、そしてpsych-commentsというgemを作成してその問題を解決したというお話のようです。
このgemは、YAML中のコメントを抽出したりできるものみたいです。
実際に直面した問題をライブラリを自作して解決されたという、実践的なお話が聞けそうです!

参考

GitHub | wantedly/psych-comments

Breaking the Ruby Performance Barrier by Maxime Chevalier-Boisvert

YJITによってRubyが高速化した結果、実行時間においてC言語の関数呼び出しが支配的になってきてるので、それがRubyの高速化の障害となっているようです。
そのため、今後はC言語への依存を抑え、GemをPureRubyで書いていく必要があるというお話と、その観点でYJITがどのように活用できるかというお話のようです!
人の手で書いたCコードよりYJITで最適化されたRubyの方が速いということでしょうか?
Rubyの高速化はもうそんな領域まで到達してるんですね・・・!

RuboCop: LSP and Prism by Koichi ITO

RubocopにあらたにPrismパーサを使うオプションを導入する計画と、その目的や設計についてお話ししてくださるようです!
PrismはRuby3.3でバンドルされたパーサで、エラートレラントで移植性が高い、高速などの特徴があるそうです。
LramaがRuby本体の実行のためのパーサジェネレータで、Prismは現状LSPなどのツールなどでRubyコードを解析したりする用途で導入されたものという認識です。
(ただし、PrismはRuby本体のパーサとして使用でされることも狙って開発が進められているようです)
これがRubocopで使われるとのことで、現在使用しているParser Gemとどのような違いがあるのか、実際の利用の観点からの具体的なお話が聞けそうです。

参考

gihyo.jp | Prism⁠⁠:エラートレラントな⁠⁠、まったく新しいRubyパーサ
STORES Product Blog | プロと読み解くRuby 3.3 NEWS

An mruby for WebAssembly by Uchio KONDO

WASMに特化したmruby/edgeというランタイムについて、その内部技術や課題などについてのお話とのことです!
CRubyに比べて容量を絞っており、かつ「RubyのメソッドとWASM-exported functionsを関連づける」とあります。
WASM-exported functionsというのはこれのことでしょうか?
WASMで積極的にRubyを動かしていくにあたっての課題感みたいなところが聞けそうです!

参考

mdn web docs | エクスポートされた WebAssembly 関数

Good first issues of TypeProf by Yusuke Endoh

TypeProfの開発に貢献したい人向けに良いと思われる課題について話してくださるようです!
TypeProfはRubyのインタプリタ、型解析器で、解析結果をRBS形式で出力してくれます。
開発は進んでおり自動リファクタリングなどの機能も備わってきているようですが、開発人数が少なく、まだ実用化しきれていないようです。
コントリビュートチャンスを得られるかもしれません!

参考

ruby/typeprof | doc.ja

It's about time to pack Ruby and Ruby scripts in one binary by ahogappa

RubyとGemを全て含めて手one binary(一つの実行ファイル)としてパッケージ化するGemについて話して下るようです!
Rubyで作成したゲームを配布するために作ったものとのことです。
デモをしながらGemについて説明してくださるようなので、わかりやすそう!

From Interpreting C Extensions to Compiling Them by Benoit Daloze

Ruby実装のひとつであるTruffleRubyの開発についてのお話のようです!
TruffleRubyはGraalVMという多言語対応のランタイム上で動くRuby実装で、多くのベンチマークで最速のRuby実装とのことです。
C言語の拡張追加設定なして対応しており、CとRubyを一緒にJITコンパイルで最適化するなどの機能が備わっているようです。
前回のリリースでアプローチを変更したという話や、どのような観点で最適化してきたか(していけそうか)を聞けそうです!

参考

Oracle GraalVM Enterprise Edition 21 | TruffleRuby
Zenn | Truffule Rubyの高パフォーマンスの仕組みを調べてみた

Squeezing Unicode Names into Ruby Regular Expressions by Martin J. Dürst

Rubyの正規表現について、Unicodeのnameプロパティを使って効果的に検索できるコンパクトなデータ表現について解説してくださるようです!
正規表現はよく使いますが、その仕組みなどは全然わかっていませんでした・・・。
そのあたり踏み込んだお話が聞けそうです!

Running Optcarrot (faster) on my own Ruby. by monochrome

個人でゼロから作られているmonorubyというRuby実装についてお話ししてくださるようです!
monorubyはRustによる実装で、JITコンパイラなども含んでいるとのことです・・・すごい・・・
OptcarrotはRubyのベンチマークとして開発されたファミコンエミュレータで、このベンチマークにおいて他のRuby実装に匹敵する性能が得られたとのことです。
どんなふうに作られているのかとても気になります・・・!

参考

GitHub | sisshiki1969/monoruby
GitHub | mame/optcarrot

Adding Security to Microcontroller Ruby by Ryo Kajiwara

Raspberry PiにPicoRubyでTLS暗号化した通信を行うことに挑戦したというお話のようです!
Rubyとmrubyにおいて、HTTP/HTTPSや暗号化がどのように実装されているのか説明するとのことです。
サーバー等で行われる通信とIoTとの差異などを知ることができそうです!

Lightning Talks by

2日目の最後はLT枠です!
ざっくり概要だけ下記にまとめます

  • Visualize the internal state of ruby processes in Real-Time by hogelog
    • 実行中のRubyプログラムに直接アタッチして内部状態を計測するMetricsMonitorというGemを作ったというお話!
    • どのように内部状態を可視化しているか、Gemをどのように活用しているか
  • The Frontend Rubyist by Andi Idogawa
    • JSの代わりにRubyでフロントエンドを実現するというお話!
  • Enjoy Creative Coding with Ruby by Miyuki Koshiba
    • クリエイティブ・コーディングでコーディングで日常に彩りををというお話!
    • 実際に体験できるらしい・・・?
  • Rearchitect Ripper by Yuichiro Kaneko
    • RubyのパーサであるRipperに長らく残っていたバグが、Bisonからの脱却によって今は修正可能となったというお話!
  • The Journey of rubocop-daemon into RuboCop by Fohte (Hayato Kawai)
    • rubocop-daemonの開発の過程で得られた教訓についてのお話!
    • OSSプロジェクトに関わるための効果的な戦略についても!
  • The test code generator using static analysis and LLM by Hashino Mikiko
    • 静的解析によりテストのないメソッドをなどを検出するOmochiというツールについてのお話!
    • Rubyにおける静的解析による開発効率化の可能性について
  • Contributing to the Ruby Parser by S.H.
    • どのように悩むのをやめて、Rubyパーサへのへのコントリビュートするようになったかというお話!
  • Improved REXML XML parsing performance using StringScanner by NAITOH Jun
    • Ruby用の標準XMLライブラリであるREXMLのパースプロセスを、StringScannerで高速化したというお話!
  • Hotspot on Coverage by Sangyong Sim
    • coverageライブラリでコード実行のホットスポットを探したというお話!
  • Drive Your Code: Building an RC Car by Writing Only Ruby by Hayao Kimura
    • R2P2を使えばセットアップ不要でRubyによる電子工作が可能であり、それを使ってRubyでラジコンカーを作るというお話!
  • An anthropological view of the Ruby community by Gui Heurich
    • 2年に及ぶRubyコミュニティの研究から得られた知見についてのお話!

Discussion