cover image
📱

RubyKaigi Takeout 2021の参加レポート

カテゴリ
Tech
書いた人
Keita Hino
URL
公開日
2021/11/05
 

はじめに

diddyworksでテックリードをしている日野です。
かなり間が空いてしましたが、先日開催されたRubyKaigi Takeout 2021に参加したので、そちらの参加レポートになります。弊社では、毎年1人(今後増える可能性あり)RubyKaigiに参加できるという福利厚生があるので、こちらを利用して参加してきました。
自分は今年で3回目の参加になるのですが、今回も例年通り盛り沢山な内容でした。
本記事では、個人的に面白かった発表を紹介していきたいと思います。
 

参加レポート1日目

TypeProf for IDE: Enrich Dev-Experience without Annotations

TypeProf(静的解析)の現状や今後の展望に説明がありました。
Ruby 3.0時点でのTypeProf は、Rubyのコードから型定義(rbs)を出力するツールでしたが、Ruby 3.1ではIDEでも使えるみたいです🎉
 
セッションの中ではTypeScriptの開発体験(コード補完や定義ジャンプなど)にも触れており、TypeProf for IDEでも同じことができるようになってきたとのこと。
 
自分はフロント側の開発をする時にTypeScriptを使っているのですが、定義ジャンプや Type hover(TypeProfでは現在開発中とのこと)のおかげで気持ちよく開発できている気がします。
これまでのRubyも上記とは違うタイプの気持ち良さがありましたが、将来的には上記の開発体験も実現できそうとのことで、今後も楽しみです!!
 
ただ、課題もあるようで、TypeProfはrequireされた先も含めて解析するため、かなり遅くなってしまうみたいです。
そのため、現状の実装だと解析が1秒経っても終わらなければ、解析を中断するため型による恩恵を受けることはできないとのこと。
これを解決するには、gemの方で型定義ファイルを書いてもらう必要があるみたいです。
gemの型定義ファイルがある場合は、ソースコードの解析をするのではなく、型定義ファイルを読むだけになるのでかなり高速になるとのこと。
3rd partyの型定義の扱いについては、Day2のThe newsletter of RBS updatesのセッションで詳しい説明がありました。
 
現時点でもTypeProfを試すことができるみたいなので、気になる人は触って遊んでみましょう!
How to use TypeProf for IDE
注意:開発途中なので、何かと荒削りで面倒です。書いてあるとおりに動かないなど、気付きがあったらぜひご報告ください。 TypeProf for IDEを動かすには、開発最新版のrubyが必要です。次のようにしてビルドしてください。 $ git clone https://github.com/ruby/ruby.git $ cd ruby $ ./autogen.sh $ ./configure --prefix=$PWD/local $ make $ make install ビルドができたら、パスを通してください。 $ export PATH=$PWD/local/bin:$PATH ruby -vで 3.1.0dev と出ていたら OK です。 $ ruby -v ruby 3.1.0dev (2021-07-16T07:10:54Z master eee709595c) [x86_64-linux] rbenv等を使ってもいいと思いますが試してません。 rubyのビルドについて興味がある人は、 Ruby開発の指南書 を読んでみてください。 TypeProfの最新版をcloneしてください。 $ git clone https://github.com/ruby/typeprof.git $ cd typeprof TypeProf for IDEは lsp-test というブランチで開発しています。 $ git checkout lsp-test bundlerを使って必要な依存gem(Rubyではライブラリのパッケージをgemといいます)をインストールした上で、テストを動かしてみてください。 $ bundle install $ bundle exec rake エラーなく終了したらOKです。 ruby/typeprofリポジトリの vscode/ というフォルダの中にvscode拡張のソースコードがあります。 vscodeで vscode/ フォルダを開いて、F5を押したら、TypeProfの拡張が有効になったvscodeが別途立ち上がるはずです。新しいvscodeのタイトルバーが [Extension Development Host] - ...
 
 

The Art of Execution Control for Ruby's Debugger

Rubyの新しいdebuggerである debug.gem を作ったモチベーションなどの説明がありました。
既存のdebuggerもありますが、性能面で課題を感じていたため、新しくdebuggerを作ったとのことです。
 
自分は、binding.pryで処理を止める→コンソール上である程度動くようにする→エディターに貼り付けるというスタイルで開発しています。
そのため、開発する時にdebuggerを多用するので、パフォーマンス面が良いのは魅力的だなーと感じました。
 
機能面の説明で、個人的に面白そうと感じたのは下記です。
  • step実行した後に巻き戻せる
  • trace callをすると、メソッドが呼ばれた時のstacktraceを表示できる。
 
debug.gemはRuby 3.1でbundleされるようですが、現時点でもRuby 2.6以上であれば、使えるとのことです。
↓こちらがdebug.gemのリポジトリです!
 
【ちょっと寄り道】debug.gemのstep実行した後に巻き戻す機能を触ってみた
まずは、Ruby 2.6以上の環境で、直接debugをインストールするかbundle経由でインストールします。
 
今回は、下記のサンプルファイルを用意しました。
# sample.rb

require 'debug'

class Human
  attr_accessor :first_name, :last_name

  def initialize(first_name, last_name)
    # これでブレークポイントをはれる。binding.pry的なもの
    binding.break

		# ローカル変数とインスタンス変数を試したいので両方入れてる
    hoge = first_name
    @first_name = first_name
    @last_name = last_name
  end

  def full_name
    puts first_name.concat(last_name)
  end
end

h = Human.new('akira', 'tanaka')
h.full_name
h.first_name
Ruby
 
上記のファイルを実行してみます。
すると、 binding.break を入れた部分で止まります。
色が付いていて見やすい👍
notion image
 
処理を巻き戻すには、あらかじめ record onを実行しておく必要があります。
右側に # commandと表示されていますが、これはdebug.gemのコマンドとして認識しているという表示になります。通常のRubyのコードを入力した場合は # rubyと表示されます。
notion image
 
あとは他のdebuggerと同じようにstep等で処理を進めていき、hogeと@first_nameへfirst_nameの代入が終わりました。(stepはsでも実行可能です)
notion image
 
ここからが面白いところで処理の巻き戻しを試してみます。
step backを実行することで、処理を巻き戻すことができます。
下記のように、hogeにfirst_nameを代入する直前まで巻き戻しました。
notion image
 
この状態で再度hogeの中身を確認してみます。
すると、下記のように nil が返りました。
そうなんです、このように変数への代入も巻き戻すことができるんです!ここが個人的には面白いなーと思いました。
notion image
 
ただ、バグなのか分からないのですが、インスタンス変数への代入は巻き戻らないようです🤔
notion image
 
今回はシンプルなRubyのコードで試しましたが、そのうちRailsのプロジェクトでも試してみようと思います!
 
 

参加レポート2日目

The newsletter of RBS updates

本セッションでは、RBS v2で何が変わったかについて説明がありました。
こちらも、Ruby 3.1 で bundle されるようです。
 
rbs のリポジトリとして、rbs本体gem_rbs_collection が存在しています。
gem_rbs_collection は 3rd party の型を管理するリポジトリで、TypeScriptを使っている方だと DefinitelyTyped のようなものと考えるとイメージしやすいと思います。
 
これまで、上記の rbs_collection を使える状態にするには、git submoduleを実行して、rbsの設定をして〜のようにやることが多くで準備が大変だったそうです。
 
この問題を解決するために、新しく rbs collection コマンド が追加されます。
rbs collection installを実行することで、型の依存関係を自動で解決してくれます。
どのように解決するかというと、Gemfile.lock は既に依存が解決された状態になっているので、 Gemfile.lockに記載されている gem の中から rbs があるものを抜き出します。
具体的には、rbs collection installを実行すると、Gemfile.lock を元に rbs_collection.lock.yamlが生成されます。
そのため、上記のコマンドを実行する前に bundle install を実行して Gemfile.lock を最新の状態にしておく必要があります。
 
また、RBS自体のアップデートもあり、 Bounded TypeGeneric Type Aliasesがサポートされました。
 
他にもRBSのparserをCで書き直していて、最大5倍速くなるとのことです。
Rubyの型周りがどんどん進化しているので、気になる方はwatchしておくと良さそうです👀
 

参加レポート3日目

How to develop the Standard Libraries of Ruby?

最近のRubyGemsやbundler周りの近況について説明がありました。
最近の動きとして、default gem(本体に入っているもの)として入っていたものを、bundled gem(普通のgemでinstallしたりuninstallしたりできる)に切り出しているみたいです。
 
例えば、あるgemをバージョンアップさせたい!という時に、そのgemがRuby本体にbundleされていた場合はRuby自体をアップデートする必要があります。
 
ですが、bundled gemとして切り出されていれば、`gem update 〇〇` のように該当のgemのみをアップデートできるようになります。
 
Ruby本体とgemとでは、アップデートする時のハードルの高さが違うので、gemごとにアップデートできるようになるのは嬉しいですね!
 
 

Matz Keynote

初めはRuby 3に入った機能の振り返りが中心でした。
Matz的には型は書きたくないが、型の恩恵を受けたいという気持ちは分かるとのこと。
この辺りについては、Day1・Day2でも話がありましたね。
他にもRactorの話や、パフォーマンス、新しく入ったシンタックスなどについて触れていました。
 
Ruby 3.0では、Ruby 2.xとの 互換性を維持 しながら進化していくことを意識していたそうです。
弊社では、まだ3系上げれていないのですが、過去にバージョンアップをする時にコード側の修正をほとんどしなくても上げれたので、すごくありがたいなーと思っていました。
近いうちにRuby 3系に上げたいという気持ちが高まりました!!
 
ここまではRuby 3.0の話でしたが、Ruby 3.1以降の話です。
これまで新機能などをどんどん入れていましたが、しばらくは ツール周りに力を入れていきたい とのことでした。
現時点で、Ruby 3.1に入ることが予定されている静的解析やdebuggerなどもその一環なんだと思います。
この辺りは書いている時の気持ちよさに直結するところなので、今後更に便利になっていくと嬉しいですね!
 
またこれまでパフォーマンスの優先度は低かったが、今後は力を入れていきたいとのこと。
去年の Keynoteで、Ruby 3.0は Ruby 2の時より3倍早くする(Ruby 3x3)を掲げていて、一部のベンチマークでは達成できていたという話がありました。
今年の Keynote ではなんと、 Ruby 3.xは Ruby 3.0より3倍早くする との発表があり、今後のRubyは更に期待が高まりました!

終わりに

今年のRubyKaigiでは、静的解析周りの強化や新しいdebuggerが導入されたりと開発体験が良くなりそうな発表がたくさんありました。
去年開催されたRubyKaigiのMatzのkeynoteでも、Ruby 3以降はツール周りを強化していきたいという話をされていました。実際に今年のRubyKaigiでは新機能がもりもり入るというよりは、ツール周りの強化が多かった印象です。
正直、難しくて理解しきれなかった部分も多くありましたが、普段何気なく使っているツールも裏ではよりよくするために努力してくれてる人たちがいて、その方々に支えられてるんだなーということを改めて実感しました。感謝感謝です🙏
また、Matzのkeynoteでは、 Ruby 3.x は Ruby 3.0より3倍早くする というかなりチャレンジングな目標も掲げていたので、今後のRubyの進化も楽しみです!!