はじめに
RubyKaigi 2019 に参加してきました。自分の聞いた発表のレポートや所感を書いていきます。(現時点で Twitter でスライドが公開されているものは載せておきます)
自分の理解・関心の度合いによって、文量に差が出ていますがご容赦ください。
間違っているところなどあればご指摘いただけると幸いです。
各発表のスライドはドリコムさんの以下の記事がよくまとまっていると思うので貼っておきます(全て揃っているわけではありませんが)
先にまとめ
- Ruby 自体に関する発表は型の話とパフォーマンス改善(並行・並列処理、 JIT コンパイラなど)の話が主だった
- Ruby を用いた実践的な設計・実装やライブラリにまつわる発表(DSLの設計、API クライアント開発、RSpec など)などもあり、とても勉強になった
- mruby 楽しい
- (主に英語力と技術的な基礎知識のなさが原因で)理解できる発表の方が少なかったことが悔しくて英語を学び始め、技術書を5冊ポチった
- 発表に対する理解度は低かったけど、とても良い刺激を受けられたので、このタイミングで RubyKaigi に行けてよかった
Day 1
先にまとめ
で 👆 と書いた通り、 Ruby 3 で導入する(しない)「型」と「パフォーマンス改善策」についての話がメインだった。
あとは新機能としてブロック変数を明示的に書かずとも @1
とか(まだ決まっていない)で参照できる Numbered Block Parameter
や case
~ in
によるパターンマッチ構文の話などをしていた。
静的解析とか Bundler とかキーワード引数の仕様変更の話をしていた気がする。
Ruby 2.7 からは irb
が便利になりますよって話。
英語がほとんど聞き取れなかったので、スライドや Twitter でのハッシュタグツイートで必死に補完していた。
- Request Queue を理解するのが大事
- New Relic を使っていれば LoadBalancer や Nginx で使った時間が見られる
- ここら辺 かな?
- AverageResponseTime x 4 x RequestArrivalRate = Ruby Process Count にするとよい
- Ruby は GVL があるので thread 数でなく process 数で考えるべき
- JRuby は parallel に実行できるので process 数ではなく thread 数で考えるべき
Woker の設定とか全然わかってないな。勉強しよう。
Type Profiler の話。
Type Profiler を使えば Ruby コードに対して静的解析を行い、実行時エラーを事前に検出したり、型定義を吐き出すことができるようになる。
型定義の出力はあくまでドキュメントとしてのみで Ruby に型注釈は導入しないということを何度も念押ししていた。
パフォーマンスの高いアプリケーションを書くために Fiber を使おうよという話。理解度は低い。
発表の最初に並行性・並列性についての説明をしてくれていたので、もし動画がアップされたら再度観たい。
REST API などから GraphQL API へ移行する際に、メタプロを使って動的に GraphQL の Type 定義を生成するようにするとよいかもね、という話。
肝心のメタプロの実装部分が出てこなかったのと、実際やるとしてもテストがむちゃくちゃ激しくなりそうなので、アプリケーション内に組み込むイメージは出来なかった。(自分の理解が足りないだけかもしれない)
Day 2
Ruby の安定版のメンテナンスの話。(そもそも Ruby では安定版メンテナーと開発版メンテナーが分かれているというのを初めて知った)
最近は昔と比べて互換性を意識してやってますよ、という話だった気がする。
終盤で「ほとんど使われない部分のバグ修正に対応するよりも、より多くのユーザに対するメリットを優先する」的な話をしていて、これは SaaS というかアプリケーション全般にも言えることだよな、と思った。
RSpec 自体の実装の話。(RSpec は Google の中の人が作ってるらしい)
rspce-core
, rspec-mocks
, rspec-expectations
のそれぞれの役割と内部実装に触れていてむちゃくちゃ面白かった。
個人的に今回の RubyKaigi の中で一番プレゼンが上手いと思ったので、動画がアップされたら何度も観直して参考にしたい。
俺が作った最高の Ruby フロントエンドフレームワークを紹介するぜ。というお話。
Opal をベースに作っているらしい。コードは読みやすかった。
Stripe のチームによる静的型解析器 Sorbet の話。
現在はプライベートβ版だが、もうすぐ OSS 化されるとのこと。ここ から触れる。
むちゃくちゃ便利そうだけど、 Type Profiler の発表の時に言ってた「Ruby に型注釈は導入しない」の流れとは反している気がする。
既存の MJIT のパフォーマンス改善を主目的とした軽量 JIT 基盤開発プロジェクト(MIR プロジェクト)の話。
今回の RubyKaigi の中で一番理解度が低い発表。聞いてる時はほとんど何も分からなかった。
GCC と LLVM の話が最初にでてきて、「あれ GCC って Ruby と関係あったっけ? LLVM ってなんだ?」ってなっていた。
何も分からなかったがゆえにこの発表が後述する技術書を買う一番のモチベーションになった。
Ruby で DSL を書くお話。
- なぜ internal DSL は言語と見なされるのか?
- なぜ DSL にすると読みやすいのか?
- プログラマやそれ以外の人でもそのドメインの知識があればコードの意味を理解できるように設計されているから
- どうすればよい DSL を設計できるか?
そういえばメタプロ Ruby にも「Ruby はその柔軟性ゆえに DSL を書くのに適している」というような記述があった気がする。
個人的に良いと思った2つの発表スライドを載せておきます。
Day 3
以下のような議題で公開開発会議が行われていた。
- Range の
()
を省略したときでも良い感じに書くための演算子を導入したい(e.g. a..b |> each
)
- 右代入を導入したい
Numbered Block Parameter
をどの記号にするか?
個人的には Numbered Block Parameter
も含めて 👆 全部不要では?と思っている勢です。
このセッションで「Ruby を作る人達は別のパラダイムの言語を知った上でそこからインスピレーションを受けて Ruby を開発しているんだ」ということを知り、後述する Haskell 本を買うモチベーションになった。
mruby のメモリ管理の話。
実はこの前夜 mruby のワークショップに行っていて、 mruby にだいぶハマっていたため、とても面白かった。
mruby で遊ぶ用のマイコンが欲しい。
Ruby で書く Web API クライアントのお話。
API クライアント開発におけるアンチパターンとベストプラクティスがだいぶ実践的で、とても勉強になった。
発表内で紹介されていた リファクタリング Ruby 読みたいけどめっちゃ高いので買うか悩む。
Bundler の話。
Bundler を RubyGems にマージしたいと言っていたが、どういうことかあんまりわかっていない。 library rubygems のコードに組み込むということかな?
Apache Arrow を使って ActiveRecord #pluck
よりパフォーマンスのよいクエリ実行に成功したよ、という話。
マルチスレッド(10スレッド)の場合で、#pluck
と比べてメモリ消費量は2倍になったが、実行時間は 1/5 になったとのこと。
send-pop
を最適化して Ruby のパフォーマンスを改善したよという話。
send-pop
とは、 Ruby のメソッドで必ず返される(それが使われるかどうかは別として)何らかの返り値について、それが使われなかった時に捨てる、という一連の操作のこと(メッセージを send
したあとに使わなければ pop
する)
結論から言うと、メソッドの返り値を使うかどうかのフラグをもたせて、そのフラグを見て後処理を最適化することで処理速度をアップさせたらしい。(やりたいことは分かったが、実装部分の説明では理解が追いつかなかった)
スピード狂によるスピード狂のための Ruby で究極の速さを追い求める話。
「それ、C言語でいいのでは?」 とか絶対に言えない雰囲気で、可読性完全無視で Ruby で最高のパフォーマンスを発揮する手法について語られていた。
発表されていたご本人が一番楽しそうでなによりでした ^^
所感とか
- 刺激を受けて技術書を 5 冊買いました。
- 半分ぐらい英語の発表でしたが全然聞き取れず、自身の英語力の無さを痛感したので、英語を学び始めました。(まずはリスニングからかなと思っています)
- Web 上のドキュメントを読む分には Google 翻訳さえあればぶっちゃけそんなに困らないが、こういうリアルなカンファレンスや動画コンテンツや活字での情報収集が英語でできるのとできないのとでは、全然情報量が違ってくると思った。 あと、カンファレンスに登壇まではできずとも英語で鋭い質問ができるとかっこいいなという憧れもある。
- mruby で遊ぶ用のマイコンが欲しい。
- 今見返すとレポートというより感想文ですね、おそらく理解度が低いためです。もっと勉強します。