2019年にやったこと
ハイライト
Thanks to Arm Treasure Data and people who helped me, today I got a visa stamp to work in the US from October for 3 years.
— k0kubun (@k0kubun) August 10, 2019
I published a progress report of Ruby's JIT development as of Ruby 2.7 https://t.co/iTDAyDqAbe
— k0kubun (@k0kubun) December 26, 2019
書いた | セルフホストで学ぶJVM入門 - k0kubun's blog https://t.co/AHlMaaIOio #はてなブログ
— k0kubun (@k0kubun) 2019年6月27日
発表
RubyのJITの話を伊東で1回、東京で2回、博多で1回、USで1回、ロシアで1回の計6回話した。 今年はかなりいろいろ試した割にはなかなか成果が乏しい感じだったので、来年はバーンと成果を出していきたい。
- 第60回 プログラミング シンポジウム: Cコンパイラを利用したRubyのJITコンパイラ
- Rails Developers Meetup 2019: JIT on Rails
- RubyKaigi 2019: Performance Improvement of Ruby 2.7 JIT in Real World
- RailsConf 2019: Ruby 2.7 JIT on Rails
- Builderscon 2019: Optimizing Ruby with JIT
- RubyRussia 2019: JIT compiler improvements in Ruby 2.7
英語での発表
年々少しずつながら多少は英語で話をするのに慣れてきた気がする。 割と自分が英語で話してる動画がたまってきたけど、最初に比べるとマシになったと信じたい。
- RubyConf 2016: Evaluate Ruby Without Ruby
- RubyKaigi 2017: LLVM-based JIT compiler for CRuby (LT)
- RubyConf 2017: LLVM-based JIT compiler for MRI
- RubyElixirConfTaiwan 2018: Method JIT compiler for MRI
- RubyConf 2018: The secret power of Ruby 2.6: JIT
- RailsConf 2019: Performance Improvement of Ruby 2.7 JIT in Real World
- RubyRussia 2019: JIT compiler improvements in Ruby 2.7
去年書いてなかったけど、英語のPodcastにも2回出ていた。
仕事 / US生活
2018年は1年間SREチームで主にPythonを書いていたが、2019年は年明けからバックエンドチームというところに移ってKotlinを書いている。
Rubyは常に書いていて、入社後3回目となる rails new
もした。
バックエンドチームの中ではストレージチームというサブチームにいて、TDで動いているクエリエンジンのストレージに関連したサービスのメンテナンスをしている。クエリの最適化をするために必要なメタデータを提供する下準備として、その基盤となる部分をでかいRailsからKotlinでDropwizardのサービスに切り出すということをやっているが、結合箇所が比較的多く大変なのと他にもいろいろ仕事がある関係でまだそれをやっている。次のクオーターで区切りをつけたい見込み…
サイドプロジェクトとしては、Xenial移行がパフォーマンス問題で難航してた奴をやっつけたり、Chefでデプロイしていたレガシーサービスを mitamae on CodeDeploy でデプロイするように移行したりした。mitamaeは全社的に使っているというよりは、割とChefのコードがあって素のCodeDeployに移行するのが大変 + トラフィックも多く移行リスクが高いようなサービスを安全に移行するために使っていて、歴史の長い3つのサービスで使われている。地味に成果物がいくつかオープンソース化されている。
入社時から希望していたUS移籍が叶い、妻と一緒にUSに移住した。US移籍が退職のち入社扱いだったので9月に有給を消化しまくり、10月からマウンテンビューオフィスで働いている。Armオフィスがサンノゼにありそちらに近くしようと考え、サンタクララのほぼサンノゼみたいな位置に住んでいる。同僚は月4000ドル前後の家賃を払っている人が多い中、割と安めのエリアの1ベッドルーム *1 なので家賃は月2700ドル弱。マウンテンビューは遠いので車通勤しながら Rebuild.fm の消化が捗る。
東京オフィスにいる時は英語だけ喋る同僚が近くにいて英語で会話する機会が割とあったが、こちらのオフィスで僕が関わるエンジニアが大体日本語を話せるので、仕事中あまり英語を話さなくなった。が、Zoomで英語を話す機会が週2〜4回あるし、プライベートで外にいる時に英語を使うので英語を話す時間はトータルでは増えていると思う。
ブログ
書きたいなあと思いつつ書いてないネタがまだ3つくらいあるんだけど、コードを書くのに比べて文章を書くのが大変面倒なのであまり書かなくなってしまった。かろうじて書けたのはこのあたり:
- 令和時代のRubyコア開発 - k0kubun's blog
- セルフホストで学ぶJVM入門 - k0kubun's blog
- Rubyで最速のテンプレートエンジンを作る方法 - k0kubun's blog
- Linux perfで快適に計測するためのtips - Qiita
- VM命令ディスパッチ手法: Context Threading - Qiita
- JIT development progress at Ruby 2.7 - k0kubun - Medium
JVMの奴は本当はOpenJDKのVMやJITの実装がCRubyと同じレベルでスラスラ読めるところまで行きたかったけど、独力ではちょっと大変だったので一旦やめた。Ruby Hacking GuideとかRuby Under a MicroscopeのOpenJDK版みたいな奴 (特にVMやJITの部分が解説されているもの) をご存じの方がいたらご共有ください。
OSS活動
新作は習作のJJVMだけ。 一方既存のOSSのメンテを割とがんばっていたので、思い入れのあるものをご紹介:
- ruby/ruby
- C99化 https://github.com/ruby/ruby/pull/2064 。C99の機能と、Visual StudioとSolarisに少し詳しくなった。
- Git化。僕は https://github.com/ruby/ruby-commit-hook をSVNから移行しつつ周辺をモダン化するのを中心にやった。400コミットくらいしてる。
- GitHubマージボタン有効化 https://bugs.ruby-lang.org/issues/16094 。GitHubはミラーなので、つまり本家gitリポジトリと双方向同期を実装した。そのうち記事で紹介するかも。
- ブランチのtrunk→masterリネーム https://bugs.ruby-lang.org/issues/15843 。GitHub時代には全く不要なGitリポジトリ運用の知見が貯まった。Rubyの最新版をtrunkと呼ぶのはもう古い!
- GitHub Actions対応のサポート。ruby orgにベータが来るのがやたら早かったので、Actionsは大体ruby/rubyで覚えた。入力をevalするプラグインを作って使ったりしている。
- IRBのシンタックスハイライト https://github.com/ruby/ruby/pull/2150 。Hamlでよく使ってた
Ripper.lex
再来。pryと違ってデフォルトでインクリメンタルにハイライトするところが便利。 - CGI.escapeHTML 高速化 https://github.com/ruby/ruby/pull/2226 。高速化前の奴も4年前に僕が書いた奴なんだけど、4年経つとより良いコードを書くことができる。mattnさんがSSEなしでカリカリチューニングした時 のアイデアに、vmg/houdiniがやってるexponentialな投機的allocationに勝つためにそもそも使いうる最大サイズを (可能なら) スタックに積めばいいじゃんという発想を足したもの。SSEを使った実装も2回くらいやったけど、それと比較しても割と良い性能特性を持ってると思う。
- k0kubun/hamlit
- Ruby 2.5のString Interpolationを使った最適化 https://github.com/k0kubun/hamlit/pull/146 。HamlitがRubyのテンプレートエンジン界最速(タイ)に返り咲き。上記のブログでも紹介したのでそちらを。
- k0kubun/sqldef
- wasm対応PR https://github.com/k0kubun/sqldef/issues/45 が来た。PCで https://sqldef.github.io/ を開くと (微妙に古いバージョンの) sqldefがブラウザで試せるようになった。
- レポートされたissueベースで 足りなかった機能を色々足した。ご利用いただいている皆様にはいつもお世話になっております。
- itamae-kitchen/mitamae
- 社内でヒットしたマイナーバグ達を色々直した。社内リポジトリ的には3つながら、クラスタが多いサービスで使われる傾向にあるので、今では社の400〜500台のサーバー上で使われている。
- mruby-yaml のメンテナを引き継いだ https://github.com/mrbgems/mruby-yaml/pull/12 。社でChefからmitamaeに移行する時に、CRubyのYAMLと挙動を揃えてオペレーションdiffのチェックを楽にするために色々直した。
- mruby-specinfra のbackportを自動化した https://github.com/itamae-kitchen/mruby-specinfra/pull/12 。Rubyからmrubyのコードへの変換、完璧にやるのは不可能なので要経過観察だけど、mitamaeのspecinfraの改善のキャッチアップが遅れがちだった問題がほぼ解決して良かった。
2020年は
2019年が全く目論み通り行かなかったので… 今度こそJITでRailsアプリが高速化できるようにしたいですね!
あとは英語の勉強を継続してTOEFL iBTで100点越えたいと思っている。
*1:一番小さい単位だけど、東京の2DKより広いのがほとんど