Note

3年後の自分のために書いています

RubyKaigi 2019 レポート & 所感

はじめに

RubyKaigi 2019 に参加してきました。自分の聞いた発表のレポートや所感を書いていきます。(現時点で Twitter でスライドが公開されているものは載せておきます)

自分の理解・関心の度合いによって、文量に差が出ていますがご容赦ください。

間違っているところなどあればご指摘いただけると幸いです。

各発表のスライドはドリコムさんの以下の記事がよくまとまっていると思うので貼っておきます(全て揃っているわけではありませんが)

先にまとめ

  • Ruby 自体に関する発表は型の話とパフォーマンス改善(並行・並列処理、 JIT コンパイラなど)の話が主だった
  • Ruby を用いた実践的な設計・実装やライブラリにまつわる発表(DSLの設計、API クライアント開発、RSpec など)などもあり、とても勉強になった
  • mruby 楽しい
  • (主に英語力と技術的な基礎知識のなさが原因で)理解できる発表の方が少なかったことが悔しくて英語を学び始め、技術書を5冊ポチった
  • 発表に対する理解度は低かったけど、とても良い刺激を受けられたので、このタイミングで RubyKaigi に行けてよかった

Day 1

Keynote: The Year of Concurrency

  • Ruby 自体に関する発表は型の話とパフォーマンス改善(並行・並列処理、 JIT コンパイラなど)の話が主だった

先にまとめ で 👆 と書いた通り、 Ruby 3 で導入する(しない)「型」と「パフォーマンス改善策」についての話がメインだった。

あとは新機能としてブロック変数を明示的に書かずとも @1 とか(まだ決まっていない)で参照できる Numbered Block Parametercase ~ in によるパターンマッチ構文の話などをしていた。

Ruby 3 Progress Report

静的解析とか Bundler とかキーワード引数の仕様変更の話をしていた気がする。

Terminal Editors For Ruby Core Toolchain

Ruby 2.7 からは irb が便利になりますよって話。

Determining Ruby Process Counts: Theory and Practice

英語がほとんど聞き取れなかったので、スライドや Twitter でのハッシュタグツイートで必死に補完していた。

  • Request Queue を理解するのが大事
    • New Relic を使っていれば LoadBalancer や Nginx で使った時間が見られる
    • ここら辺 かな?
  • AverageResponseTime x 4 x RequestArrivalRate = Ruby Process Count にするとよい
  • Ruby は GVL があるので thread 数でなく process 数で考えるべき
  • JRuby は parallel に実行できるので process 数ではなく thread 数で考えるべき

Woker の設定とか全然わかってないな。勉強しよう。

A Type-level Ruby Interpreter for Testing and Understanding

Type Profiler の話。

Type Profiler を使えば Ruby コードに対して静的解析を行い、実行時エラーを事前に検出したり、型定義を吐き出すことができるようになる。 型定義の出力はあくまでドキュメントとしてのみで Ruby に型注釈は導入しないということを何度も念押ししていた。

Fibers Are the Right Solution

パフォーマンスの高いアプリケーションを書くために Fiber を使おうよという話。理解度は低い。 発表の最初に並行性・並列性についての説明をしてくれていたので、もし動画がアップされたら再度観たい。

GraphQL Migration: A Proper Use Case for Metaprogramming?

REST API などから GraphQL API へ移行する際に、メタプロを使って動的に GraphQL の Type 定義を生成するようにするとよいかもね、という話。

肝心のメタプロの実装部分が出てこなかったのと、実際やるとしてもテストがむちゃくちゃ激しくなりそうなので、アプリケーション内に組み込むイメージは出来なかった。(自分の理解が足りないだけかもしれない)

Day 2

All bugfixes are incompatibilities

Ruby の安定版のメンテナンスの話。(そもそも Ruby では安定版メンテナーと開発版メンテナーが分かれているというのを初めて知った)

最近は昔と比べて互換性を意識してやってますよ、という話だった気がする。

終盤で「ほとんど使われない部分のバグ修正に対応するよりも、より多くのユーザに対するメリットを優先する」的な話をしていて、これは SaaS というかアプリケーション全般にも言えることだよな、と思った。

How RSpec works

RSpec 自体の実装の話。(RSpecGoogle の中の人が作ってるらしい)

rspce-core, rspec-mocks, rspec-expectations のそれぞれの役割と内部実装に触れていてむちゃくちゃ面白かった。

個人的に今回の RubyKaigi の中で一番プレゼンが上手いと思ったので、動画がアップされたら何度も観直して参考にしたい。

Ovto: Frontend web framework for Rubyists

俺が作った最高の Ruby フロントエンドフレームワークを紹介するぜ。というお話。

Opal をベースに作っているらしい。コードは読みやすかった。

State of Sorbet: A Type Checker for Ruby

Stripe のチームによる静的型解析器 Sorbet の話。

現在はプライベートβ版だが、もうすぐ OSS 化されるとのこと。ここ から触れる。

むちゃくちゃ便利そうだけど、 Type Profiler の発表の時に言ってた「Ruby に型注釈は導入しない」の流れとは反している気がする。

A light weight JIT compiler project for CRuby

既存の MJIT のパフォーマンス改善を主目的とした軽量 JIT 基盤開発プロジェクト(MIR プロジェクト)の話。 今回の RubyKaigi の中で一番理解度が低い発表。聞いてる時はほとんど何も分からなかった。

GCCLLVM の話が最初にでてきて、「あれ GCC って Ruby と関係あったっけ? LLVM ってなんだ?」ってなっていた。

何も分からなかったがゆえにこの発表が後述する技術書を買う一番のモチベーションになった。

What is Domain Specific Language?

RubyDSL を書くお話。

  • なぜ internal DSL は言語と見なされるのか?
    • 独自のセマンティクスを持っているから
  • なぜ DSL にすると読みやすいのか?
    • プログラマやそれ以外の人でもそのドメインの知識があればコードの意味を理解できるように設計されているから
  • どうすればよい DSL を設計できるか?
    • Ruby の黒魔術を適度に利用する :imp:

そういえばメタプロ Ruby にも「Ruby はその柔軟性ゆえに DSL を書くのに適している」というような記述があった気がする。

Lightning Talks

個人的に良いと思った2つの発表スライドを載せておきます。

Day 3

Ruby Committers vs the World

以下のような議題で公開開発会議が行われていた。

  • Range の () を省略したときでも良い感じに書くための演算子を導入したい(e.g. a..b |> each
  • 右代入を導入したい
  • Numbered Block Parameter をどの記号にするか?

個人的には Numbered Block Parameter も含めて 👆 全部不要では?と思っている勢です。

このセッションで「Ruby を作る人達は別のパラダイムの言語を知った上でそこからインスピレーションを受けて Ruby を開発しているんだ」ということを知り、後述する Haskell 本を買うモチベーションになった。

(partially) Non-volatile mruby

mruby のメモリ管理の話。

実はこの前夜 mruby のワークショップに行っていて、 mruby にだいぶハマっていたため、とても面白かった。

mruby で遊ぶ用のマイコンが欲しい。

Best practices in web API client development

Ruby で書く Web API クライアントのお話。 API クライアント開発におけるアンチパターンとベストプラクティスがだいぶ実践的で、とても勉強になった。

発表内で紹介されていた リファクタリング Ruby 読みたいけどめっちゃ高いので買うか悩む。

The future of the Bundled Bundler with RubyGems

Bundler の話。

Bundler を RubyGems にマージしたいと言っていたが、どういうことかあんまりわかっていない。 library rubygems のコードに組み込むということかな?

Reducing ActiveRecord memory consumption using Apache Arrow

Apache Arrow を使って ActiveRecord #pluck よりパフォーマンスのよいクエリ実行に成功したよ、という話。

マルチスレッド(10スレッド)の場合で、#pluck と比べてメモリ消費量は2倍になったが、実行時間は 1/5 になったとのこと。

The send-pop optimisation

send-pop を最適化して Ruby のパフォーマンスを改善したよという話。

send-pop とは、 Ruby のメソッドで必ず返される(それが使われるかどうかは別として)何らかの返り値について、それが使われなかった時に捨てる、という一連の操作のこと(メッセージを send したあとに使わなければ pop する)

結論から言うと、メソッドの返り値を使うかどうかのフラグをもたせて、そのフラグを見て後処理を最適化することで処理速度をアップさせたらしい。(やりたいことは分かったが、実装部分の説明では理解が追いつかなかった)

Optimization Techniques Used by the Benchmark Winners

スピード狂によるスピード狂のための Ruby で究極の速さを追い求める話。

「それ、C言語でいいのでは?」 とか絶対に言えない雰囲気で、可読性完全無視で Ruby で最高のパフォーマンスを発揮する手法について語られていた。

発表されていたご本人が一番楽しそうでなによりでした ^^

所感とか

  • 刺激を受けて技術書を 5 冊買いました。
  • 半分ぐらい英語の発表でしたが全然聞き取れず、自身の英語力の無さを痛感したので、英語を学び始めました。(まずはリスニングからかなと思っています)
    • Web 上のドキュメントを読む分には Google 翻訳さえあればぶっちゃけそんなに困らないが、こういうリアルなカンファレンスや動画コンテンツや活字での情報収集が英語でできるのとできないのとでは、全然情報量が違ってくると思った。 あと、カンファレンスに登壇まではできずとも英語で鋭い質問ができるとかっこいいなという憧れもある。
  • mruby で遊ぶ用のマイコンが欲しい。
  • 今見返すとレポートというより感想文ですね、おそらく理解度が低いためです。もっと勉強します。