ENECHANGE Developer Blog

ENECHANGE開発者ブログ

RubyKaigi 2022 参加レポート : Day 1

初めまして、ENECHANGEで働いているokamotoです。

本ブログには初登場になります。これからよろしくお願いします。

ENECHANGEはRubyKaigi2022にゴールドスポンサーとして応援させていただきました。

ENECHANGEのishibashiと一緒にRubyKaigi2022にオフラインで参加してきました!

「私がRubyKaigi 2022に参加して感じたこと」、「私が参加したセッションで話されたことの要約と感想」を主に書きます。

RubyKaigi 2022
RubyKaigi 2022

Ruby meets WebAssembly

要約

Rubyは非常に素晴らしい言語だが、以下の問題がある

  • Ruby interpreterが必要で一部の環境ではインストールできない
  • 環境構築が大変である

それらを解決するのが WebAssembly (WASM) !

Ruby interpreterが必要で一部の環境ではインストールできない

→ブラウザはどこにでもあるのでRubyをどこでも使えるようになる

環境構築が大変である

→ブラウザ上で動けば環境構築で躓くことなくすぐに試せる(特に初学者)

ブラウザ上で、WASMで書かれたRubyインタプリタを動かして、そこにRubyのソースコードを与える。

苦労された点として、CRuby を WebAssembly に移植する際に、Exception、Fiberの制御フローが特殊でWASM上で再現させることが難しかったが、Asyncifyを使用すること実現できたとのこと。

以下のURLからirbのデモ可能!

https://irb-wasm.vercel.app/

感想

WebAssembly導入のメリットやデモを見せていただくことで理解が進みました。 環境構築は私が初めてRubyの学習をする際に何度も躓き心が折れそうになった思い出があるので、お気軽に試せるようになるのは非常に価値が高い! Ruby3.2から導入予定とのことで、Rubyの間口が広がるため今後の展開が楽しみですね。

Making *MaNy* threads on Ruby

要約

MaNy Projectのゴール:Rubyで100K以上のスレッドを扱えるようになる

Rubyのスレッドの歴史とMaNy Projectの紹介

Ruby1.8以前

  • 1:Nスレッド
    • 1つの Native thread (kernel thread) に対して複数の Ruby thread を立てる
    • Ruby 上で完全に制御でき、軽量
    • 並列処理ができなかったりブロッキング処理が難しい

Ruby1.9

  • 1:1スレッド
    • 1つの Native thread に対して1つの Ruby thread を立てる
    • システムがブロッキング処理を行ってくれるためシンプルで扱いやすい
    • Native thread に頼ることで 1:N よりオーバーヘッドが多くなった
    • Ruby 上で完全に扱えていた 1:N と比べてコントロールしにくい

Ruby X.X?(3.2は間に合わないみたい)

  • M:Nスレッド
    • 複数の Native thread に対して複数の Ruby thread を立てる
    • Go 言語などと同様
    • 1:N と 1:1 両方の特徴を持つ
    • コントロールしやすく軽量
    • 並行処理が可能
    • ブロッキング処理が難しい
    • 複雑性も増す

Types teaches success, what will we do?

要約

昨今、Rubyにおいても静的型付けが注目されている。 (今回のRubykaigiでも型に関するセッションが多かった印象がある)

Ruby3.0でRBS/steepが導入されたが、実際にはまだまだ普及していないのではないか。

会場でのオーディエンスに対する質問で該当する方が挙手

  • 「プロジェクトで型を導入している方」:少ない(2割ないくらい?)
  • 「TypeScriptを使っている方」:結構多い(7割くらい?)

普及していない理由のひとつに、gemの型が定義されていないというが問題ではないか。 Gemの型定義を集約したgem_rbs_collection がある (TypeScript でいう DefinitelyTypes)。 RubyGems には 約17万の Gem が登録されている一方で gem_rbs_collection には 44個 しか型定義がない。

各gemへのコントリビュート推奨

Fu-gaさんがコントリビュートした際の事例を紹介

PR:https://github.com/ruby/gem_rbs_collection/pull/172

  • steep check実行
  • countでブロック許可されていないという型定義エラーが出たのでcountの実装箇所を確認
  • rbs側が誤っていたので修正しPR

コントリビュートする際のポイント

  • テスト用のクラスにも型定義をする必要あり
  • 自動で型定義できるので有効活用するといい
    • メソッド側で明確に型定義されているもの以外はuntypedで生成される
  • テストはすべてに書くのは大変なので主要な API や自分のプロジェクトで使っている部分のみでもよいのではないかと考えている[CONTRIBUTING.md](https://github.com/ruby/gem_rbs_collection/blob/main/docs/CONTRIBUTING.md
  • 標準ライブラリ、組み込みはRBSリポジトリで管理

感想

型定義導入について考えるきっかけとなり、コントリビュートに対するハードルを下げる形での提案をしていただいたので非常に関心を持つことができました。

Tools for Providing rich user experience in debugger

要約

Ruby3.1から導入されたdebug.gem(https://github.com/ruby/debug)でまだあまり知られていない便利機能の紹介

  • Chrome DevTools
  • VsCode拡張機能
    • history inspector
      • プログラム実行logを取って巻き戻し確認などが可能
    • Object Inspector
      • activerecord検索結果のテーブル出力
      • arrayのグラフ化

感想

debug機能便利だけど全然使いこなせていないということがわかりました。 いろいろ試して導入してみたいと思います。

TRICK 2022 (Returns)

TRICK2022
TRICK2022

高度な技術でまったく役に立たない変なプログラムを書いた者が勝ち!という、 超絶技巧変態Rubyコンテスト。4年ぶりに帰ってきた!

かなりレベルが高くて解説を聞いても正直理解できないものが多いが、卓越した技術とアイデアの作品はもはや芸術の領域。

以下のリポジトリにて公開されているので、各ディレクトリでruby entry.rb を実行してお試しあれ。 GitHub:https://github.com/tric/trick2022

2018年はYouTubeにて公開されたようなので、2022も後日公開を期待。

Day1全体感想

RubyKaigi初参加ということもあり、会場の熱気に初日から圧倒されまくっていました。

セッションの内容も難しく話に付いていくのに必死でした。

そんな中でも、新しい機能や方向性のテーマにはRubyの未来を感じさせられる内容が多く、興味深く、わくわくしていました。

この調子でインプット続けたら頭が爆発するのではないか、、、という不安と次はどんなセッションだろうという期待に胸を踊らせながらDay1を終了しました。

Day2以降も記事公開予定なのでぜひ御覧ください。

(うなぎ、うまー)