RubyKaigi 2019 in 福岡に参加してきた話
前代未聞の公式パーティーが開催されたRubyKaigi 2019に参加してきました。去年は仙台、一昨年は広島でしたが今年は福岡での開催でした。自分は広島から連続で参加していますが、このイベントはホスピタリティが高く今年も楽しみにしていました。ただし今年は参加者の度肝を抜くネタが2つも仕込まれていた
ことから特筆すべき「RubyKaigi」になったといっても過言ではないでしょう。
会場について
日時と場所は以下のとおりです。初日は羽田から飛行機で飛んで、8時半頃に福岡空港に着きました。時間があり天気も良かったので、地下鉄で中洲川端まで出てそこからは徒歩で会場に向かいました。
- 日時
- 4/18(木) - 4/20(日) 10:00〜
- 場所
- 福岡国際会議場
会場内の様子
到着は9時半ごろです。すでに受付には行列ができていました。参加証の後ろの紙はCookpadさんで配っていたRubyパズルです。一日一枚配っていて一枚あたり3問出題されていました。写真に写っているProblemsの3-1は何とか解けましたが、その他はあまり解けませんでした。コメントや改行を用いたトリッキーなものが多かった印象です^1。
セッション内容
The Year of Concurrency (Keynote) @yukihiro_matz
初日のキーノートのもちろんRubyの父であるMatzこと「まつもとゆきひろ」さんのキーノートです。
タイトルからして並列性の話かと思いましたが、Ruby3全般の展望のお話が聞けました。個人的に安心したのは静的型付けへの道筋が立ったようだという点です。去年の段階だとかなりもやっとしていた印象ですが、今年は基礎技術が出揃ってアーキテクチャが固まってきたという印象を持ちました^2。そしていつもの「型は書きたくない」発言が聞けて大満足です(笑)。
個人的なメモです。詳細を見たい場合はクリックして開いてください。
- Rubyは良いと言われている
- 生産性
- 柔軟性
- 楽しい!
- Rubyは悪いと言われている
- 性能
- 伝統的に遅いと評判だが、年々速度向上している
- マルチコアを活かしきれない
- GIL(Giant Interpreter Lock)があるから
- 大きなチームや大規模プロジェクト向きではない
- 性能
- Rubyは大抵の用途には十分良い
- GitHub、Airbnb、Instacart、Cookpadという実例がある
- Twitterのようなサービスには向いていない。(リアルタイム性や性能要求が高いから?)
- そもそもTwitterは遅い1.8を続けたから自滅したんじゃない? 1.9以降を使っていたら未来は変わったかも
- Ruby3の改善点
- 性能
- MJITの導入(2.6)
- ファミコンエミュレータでは速くなるけどRailsでは遅くなる
- 改善予定
- 並行性
- Guild
- アクターモデル
- AutoFiber
- I/O待ちの改善
- Guild
- 静的解析
- 型は書きたくないでござる
- Rubyソースには型アノテーションは入れずに、別ファイル(.rbi)に型定義を書く
- 以下の4つをRuby 3で行う予定
- 型定義文法
- 標準ライブラリの型定義
- Type Profiler
- 静的型チェック
- Sorbet
- Steep
- 型は書きたくないでござる
- 性能
- 我々は生き残らなければならない
- ご飯を食べなければいけない
- 前進し続けるしかない
- 賢く進むしかない
- 自分は天才じゃない。後悔もする(スレッドをいれたこととか)
- みんなで進むしかない
- Rubyで世界を良くしたい
福岡県知事
小川福岡県知事がRubyKaigiに来られて挨拶されました。内容は観光案内とRubyの力に期待を込めた内容でしたが、国際会議の流儀どおりに英語でスピーチしたのはポイントが高いと思います。ただ福岡県がRubyに力を入れていること知っていたので、予想はできたというかこれで度肝を抜かれたというわけではないです^2。
A Type-level Ruby Interpreter for Testing and Understanding @mametter
15:40 - 16:20 / Main Hall (3F) @ rubykaigiA
前述したRuby 3で入る予定Type Profilerの発表です。Type Profilerはタイトルの「型レベルインタプリタ」のとおり、型に関する部分を「実行」して、プロファイリングするもののようです。
Type ProfilerはRuby 3で提供予定の静的解析のためのコンポーネントの一つです。静的解析の全体像としては以下の図が分かりやすかったです。Type Profilerの主目的は通常のRubyアプリケーションコードからクラスやメソッドの型を推定して型定義ファイルのプロトタイプを生成することです。この型定義は健全ではないので間違うこともあり、手動で修正が必要な場合があります。
Type Profilerの動作については以下の図が分かりやすかったです。従来のインタプリタが「値」に注目して実行しているのとは対照的に、Type Profilerでは呼び出し時の引数の型と戻り値の型に注目して評価し、その結果を型シグネチャとして抽出します。
このような動作のため実際にテストコードを通さないと型シグネチャは得られないみたいです。またその他にもメタプログラミングに弱かったり、状態爆発して遅かったりまだまだ問題はあるそうですが、とりあえず動作するものが公開されたので、今後の進捗に期待しつつ自分も少し触ってみたいと思います^3。
Pattern matching - New feature in Ruby 2.7 @k_tsj
これですよ、これ。最近のRubyで一番欲しかったやつ。パターンマッチングです。どうやら発表前日にtrunkに取り込まれたそうなので、すでに遊べるようです。
その有用性は以下のJSONのパターンマッチングの例を見れば一目瞭然でしょう。
こういったマッチングはScalaのような静的言語でやろうとすると非常に面倒ですが、Rubyだと本当にシンプルに書けていい感じです。その他にも配列やハッシュで使いやすいように考慮されていたりElixirで言うところのpin operator(^
)が実装されていたりするのでかなり実用的になっているなと感じました。ただ一つ残念なのはキーにはまだシンボルしか使えないらしいので、そこは今後に期待です。
その他のセッション
その他も素晴らしいセッションはたくさんありましたが、全てを紹介するのは難しいので簡単な感想(メモレベル)を書きました。
自分の心の声や脳内(誤)変換もそのまま消さずに残しておきました。嘘や間違いが見抜けて優しくスルーできる人だけが読んでください(笑)^4。
覚悟ができた方はここをクリックしてご覧ください。
- Matz Keynote
- テスト嫌いなんだよね
- DRYじゃないでしょ
- テスト嫌いなんだよね
- Ruby 3 Progress Report
- RubyコアチームからのRuby3に向けての進捗報告
- 実質Matzの話の続きで少し詳細化した内容
- How To Use OpenApi3 For Api Developer @ota42y
- OpenApi 3の話
- 分かる人にはSwaggerがそのままOpenAPIに名前を変えたといったほうが分かりやすいかもしれない
- 個人的にはRESTよりもGraphQLのほうがスマートだと思っているが・・・
- Pragmatic Monadic Programming in Ruby @joker1007
- モナドをRubyに実装した話
- RubyのASTを
悪用活用した素晴らしい例 - Scalaを
パクったインスパイアした素晴らしい例 - 個人的にはこういうのを待ってた 👍
- リポジトリは こちら。後で遊ぶよ。
- Fibers Are the Right Solution @ioquatix
- Call back hell!
- Async/Await Hell!
- So Fibers are right!
- Auto Fiberに期待しておこう
- All bugfixes are incompatibilities (Keynote) @nagachika
- リリースブランチのメンテナの6年間の苦労話
- 「人間は1年に1歳年をとる脆弱性がある」というパワーワードが飛び出る
- 美しいパッチだと取り込みたくなる
- 必要のないパッチを入れるのはやめておけ。バグるかもしれない・・・
- parse.yは魔境
- Syntax Errorは辛い・・・ 回避不能
- 括弧つけろよ、と思わなくもない
- Be Practical
- コミットログを読もう
- コンフリクトは2割ぐらい
- 発生バージョンが細かく書いてあったり、具体的に困っているプロダクトがあると取り込みやすい
- Six Years of Ruby Performance History: But How to Measure…? @codefolio
- RRB(Ryby Rails Bench)によるとRailsはRuby 2.6は2.0と比較して172%速くなった
- RRBは実アプリケーションに合わせたマクロなベンチでどの部分が遅いかは教えてくれない
- そこでRSB(Ryby Simple Bench)の出番
- intimate Chat with Matz and mruby developers about mruby @Hir0_IC
- 今日4/19はmrubyお誕生日・・・です
- mrubyはメモリ消費を抑えるのを頑張っている
- MatzにGCを作って欲しければ、退屈な会議に参加させればよい
- 捻挫したからセパレートキーボードにした by Matz
- 回答者よりも先に質問者が回答を述べる。誘導尋問とかそういうレベルではない
- Building a game for the Nintendo Switch using Ruby @amirrajan
- Nintendo SwitchでRubyを動かしやがった・・・
- こ、こいつ動くぞ!
- RubyData Workshop 資料その2 @mrkn, @284km, @kozo2, @ktou, @znz
- Red Data Toolsの話
- 無理しすぎんなよ
- rubydownは面白そう
- お菓子とフルーツのデプロイが完了した
- What is Domain Specific Language? @tanaka_akr
- Syntax + Semantics = Language
- この二つの違いをちゃんと知りたい方はコンピュータサイエンスを学びましょう(笑)
- Smalltalkの2項演算子には優先順位がない。ま、まじか!
- 良いことには限界があるが悪いことには限界がない
- 名言頂きました
- Lightning Talk Sessions
- How does TruffleRuby work @kis
- Javaの話をします。Javaを書こう!
- Graal VMとGraalは違う
- 第3二村射影がTruffleになるという話。コンパイラジェネレータのお話。
- How to Make Bad Source @jimlock
- ブラックジャックを糞コードにした話と仕様を都合よく変える話(ぉぃ
- ワレ、TRICK2018ノ、フッカツヲ、ノゾム
- 奴らクレイジーだな
- Dive into middleware with mruby @spikeolaf
- 人生を生きているとRDBMSを作りたくなる・・・まじか!
- From ㍻ to U+32FF @Y_MITSUBOSHI
- まぁ令和ネタはあるだろうと思ってた
- Invitation to the dark side of Ruby @tagomoris
- Rubyには決してマクロは入れない by Ma●z
- 👉 Maccro作りました。てへぺろ。
- Applying mruby to World-first Small SAR Satellite @ShunsukeOnishi
- mrubyのコードを衛生に送る
- ラーメン屋の行列を見てから行きたいじゃないっすか?
- The TracePoint bumb! @koic
- TracePointを使ったテロの話
- 頭沸いてるんじゃねーか by ko1
- 悪とかそういうレベルじゃねえなこれは by usa
- バグ・オブ・ザ・イヤー by nobu
- wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww やめろ、こんなん草しか生えんわ!
- Make Ruby Differentiable @nagachika
- Rubyでも自動微分したい!的な何か
- How does TruffleRuby work @kis
- Ruby Committers vs the World
- curryはお手本を見せるために作った。使うべきではない。
- 新機能をガシガシ増やしたい人 ノシ by 多数の観衆
- 投票は信じないよ by Matz
- わざわざ福岡に来るのはアグレッシブな人なの。真に受けて実行したあとに責任取らされるのは僕なの! by Matz
- 公開開発者会議(議事録)
- HackMDは便利。OSS版はCodiMDで自分はこちらをよく使う。
- Haskellの
$
やElixirの|>
相当の演算子がRubyにも欲しい- 👉 が演算子の候補になったときは大爆笑。草はやすわ
- むしろ右代入が欲しい
- こうしてゆるくてほとんど決まらないのが平常運転
- もう少しでRubyコアの開発をsubversionからcgitに移行するよ → したよ!
- Cleaning up a huge ruby application @riseshia
- 立ち見が出るほどの超人気セッション
- Cookpad社で使われているcookpad_allというリポジトリはコード量が50万行以上あり
- 未使用コードを削りたい
- KitchenCleanerを開発
- 1年間更新の無いコード、未実行のコードを自動で見つけ出す
- GitHubにIssueを立ててgit logからランダムで人を選んでアサイン。まじか!
- IseqLogger
- 使われていない命令を洗い出す。要コンパイル
- Ruby 2.6から入った“oneshot coverage”は一回でも実行されたかどうかを計測。これは便利そう。
- The challenges behind Ruby type checking @soutaro
- Rubyの型チェッカーの Steepの話
- FontAwesomeでRubyを検索するとアヒルがでてくる。分かっているじゃないか(ニヤリ)
- アヒルはスケールするよ
- Rubyのシグネチャ定義言語
- 後付の型定義言語なのでかなり柔軟に表現できる。TypeScriptの影が見えた・・・
open
の型定義がとんでもないことになってる・・・闇が深い・・・
- The future of the Bundled Bundler with RubyGems @hsbt
- RubyGemsの多要素認証を設定してください。🙏
- Rubyを使うのにbundlerをまず入れなきゃ、みたいなのは体験が良くないのでやめたい
- Reducing ActiveRecord memory consumption using Apache Arrow @mrkn
- Apache Arrowを使ってActiveRecordのメモリ削減できるかという話
- 先日の発表は間違っていました
- 列指向。Pandasと言われて納得した。データフレームね。
- Red Chainer and Cumo: Practical Deep Learning in Ruby @sonots @hatappi
- 現在のPythonのDNNスタックに対応するものがだいたいRubyにも出揃った
- Chainer-> RedChainer, TensorFlow -> TensorFlow.rb, MXNet -> MXNet.rb, NumPy ->Numo::NArray, CuPy -> Cumo
- ONNXを使った連携。ProtocolBuffer使う。
- numoをcumoにしたら奇跡的に動いた!
- Ruby3で3倍速くするという話をしてますけど、Cumoを使うと75倍速い(ドヤ)
- 現在のPythonのDNNスタックに対応するものがだいたいRubyにも出揃った
- Optimization Techniques Used by the Benchmark Winners (Keynote) @jeremyevans0
- SequalやRodaといったベンチマークで高性能を叩き出すフレームワーク作者の最適化術
- 執念は見習いたい
- Rubyが速くなれば万事解決(ぉぃ
食事
いつも何がでるか楽しみですが、今年は特にやばかったです。
朝食
二日目と三日目は朝食がでました。バイキング形式です。
前日に飲みすぎて胃もたれしていたので少なめにしています・・・
昼食
まさかの屋台!トップページが伏線だったとは・・・
屋台は5軒出ていたのでパノラマ写真にしてみました。
タイムラプスにした方もいるようです。
ビーフストロガノフと焼きラーメンを食べました。
とても美味しかったですが、屋台の暖簾はフェイクだったので店を間違えました・・・
Rubyラーメン食べたかった・・・
一日だけお弁当にしてみました。これも美味しかったです。
間食
お茶やコーヒーはブースで入れてもらいました。
特に八女茶の甘みと旨味のコラボレーションが忘れられない・・・
お菓子やフルーツも大量にGetできました。
Official Party in 川端商店街
技術カンファレンスとしては前代未聞の商店街のアーケードをまるまる使った公式パーティーです。
常人の発想じゃない(褒め言葉)ですね。震えが止まりません・・・
Yahooニュースにもなったみたいです。
このパーティーは本当に驚愕でしたが、控えめに言って最高でした。参加できてよかったです。
令和時代のRubyKaigi
最後の最後でまさかの令和ネタが飛び出ました。次の開催は長野県松本市です。
この「松本」で開催されるRubyKaigiは名前的に縁起がよく、正しく令和時代の最初のRubyKaigiに相応しい場所と言えると思います。
これがRubyKaigiで一番度肝を抜かれたネタでした。不意打ちすぎる・・・
まとめ
RubyKaigiはフレンドリーで活気に満ちた素晴らしい国際カンファレンスです。
この記事を読んでくれた方に、少しでもRubyKaigiの楽しさをお伝えできたなら幸いです。
参加者、関係者の皆様、お疲れ様でした!