RubyKaigi 2018に参加しました

こんにちは。freeeでアプリケーションエンジニアをしているimamuraです。

去年に続き、今年もRubyKaigiに弊社エンジニア数名で参加しました。 RubyKaigiはプログラミング言語Rubyの技術カンファレンスで、5/30~6/1の三日間でRubyに関する知見や最新の情報が共有されます。そして、今回もfreeeはスポンサーとして協賛させていただきました!

rubykaigi.org

RubyKaigi会場に置かれたfreeeのパンフレット

RUbyKaigi会場のスポンサーロゴが印刷された板

会場の雰囲気

1000人以上の色々な国からRubyエンジニアが集まっていました。 スポンサーブースでは、企業が展示をしてライブコーディングやノベルティの配布、書籍の販売などがあり、大変賑わっていました!

RubyKaigi会場の書籍販売ブース 自社パンフレットが置かれているのを撮影するfreee社員 *1

セッション

そして、RubyKaigiはRubyの生みの親こと、Matzによるkeynoteから始まりました。 MatzのCRubyへのバージョンを上げる以外のコミットがRuby 2.6.0 preview2には反映され、それが多分5年ぶりぐらいなので拍手が起こっていました。 そしてそのコミットは、プログラミングで名前の付け方が重要という前置きで、本人が名付けたyield_selfメソッドが分かりづらかったため、thenという名前への変更だったので会場では笑いが起こっていました。終始、和気藹々とした雰囲気でした。*2

Matzによるキーノートセッションの様子

そのあとは、三会場に分かれてそれぞれ多種多様なセッションがありました。普段Rubyを書いている際に意識していなかった仕組みについて考える機会になったり、RubyGems3の変更点についての話型システムやRuby 2.6.0-preview2からendless rangeという書き方ができるようになった話など最新のRubyに関する情報にキャッチアップすることもできました。

これらのセッションの中でも自分が面白かったセッションを紹介したいと思います。

Analyzing and Reducing Ruby Memory Usage

Analyzing and Reducing Ruby Memory Usage - RubyKaigi 2018

Ruby 2.6系のパフォーマンス改善についての内容でした。大きく分けて二つトピックがありました。*3

一つ目が共有文字列についてです。Rubyの文字列を表す構造体は、メモリが割り当てられた文字の配列の先頭の要素へのポインタと、そこからの長さの情報を持っており、部分一致する文字列は、作られるたびにメモリ割り当てをするのではなく、構造体のポインタと長さの情報だけ変えて同じメモリの文字列を参照するようにしたそうです。Rubyは、ファイルの位置が格納されている配列と、requireメソッドの引数のファイル名をキー、その配列のインデックスを値としたハッシュを持っており、先ほどの共有文字列の仕組みを使って、requireメソッドのパフォーマンスが改善した話でした。*4

二つ目に、Rubyのコードは、命令列(数字)の配列(ISeq Object)にされてからバイトコードになり実行されます。このISeqObjectが参照するオブジェクトはmark_arrayという配列にアドレスを入れて、GCされないように監視されるようになっていましたが、配列を使わずに、直接ISeqObjectからそのオブジェクトをマークするようになりました。これによってmark_arrayに必要なメモリが削減されたようです。

そして、改善を紹介するたびに、「あなたならこの機能にいくら払いますか?5000円、10000円、5000兆円?アップグレードすればタダです!」というセリフで会場が沸いていました。

セッション中の風景

Exploring Internal Ruby Through C Extensions

Exploring Internal Ruby Through C Extensions - RubyKaigi 2018

RubyのHashのパフォーマンスをCで拡張したものやC++で実装したものと比較する内容でした。RubyのオブジェクトがどのようにCの構造体と連携されているか、C側でRubyのデータがどのような構造体で表現されているかなどが説明されました。また標準のRubyのHashはC++で実装したものと条件によってはあまり差がなく、高速だったことが印象に残っています。

RNode with code positions

RNode with code positions - RubyKaigi 2018

speakerdeck.com

Rubyの2.5系から行番号だけでなく、カラムの情報を持つようになった話でした。 カラムとはその行におけるコードの位置のことで、これによってNoMethodErrorなどがどの行のどの位置で起こったかが分かるようになりました。「Rubyのしくみ」などで知っていたASTにどうやって複雑な位置情報を持たせるのかが興味深かったです。

Extend your own programming language

extend your own programming language - RubyKaigi 2018

speakerdeck.com

MinRubyというrubyインタプリタを使ってrubyのインタプリタを拡張する話でした。このインタプリタ自体もrubyで書かれています。rubyのASTを評価するevaluate関数を基本的な四則演算などを使って実装したりしていました。例えば、論理和・論理積の演算子を追加したり、末尾再帰で計算する関数を作ったり、Lindaという並列処理言語のevalを使って拡張したりがありました。具体的な実装でイメージしやすかったので、自分でもMinRubyを拡張したいなと思いました。

DRINK UPを開催しました!

freee.connpass.com

1日目の晩にRubyKaigiに参加された方の懇親の場としてDRINK UPを開催しました! 東京、福島、沖縄、海外など世界中のRubyistたちにお越しいただき、素敵な出会いがたくさんありました。その中にはRubyコミッターでpatch monsterことnobuさんや去年に引き続きご参加された方もいらっしゃいました。

仙台の美味しい料理と日本酒を飲みながらRubyの話、なぜかGoの話、エンジニアのキャリアの話などしながら、普段なかなか交流できない方々と盛り上がれたのは貴重な体験でした。

参加してくださった方々ありがとうございます! また来年もDRINK UPを開催しますので、次回の会場である福岡で皆様のご参加をお待ちしております!

DRINK UP恒例の集合写真

最後に

ここまで読んでくださりありがとうございます!

私自身は去年、新卒でfreeeに入社し2年目になりましたが、初めてのRubyKaigiへの参加でした。登壇者の話す内容のレベルが高くて正直、圧倒されました。自分はまだまだだなーと感じつつ、このままやっていけば自分もその高みに行けるのではないかといった不思議な気分になりました。

そして、何よりもっとRubyについて詳しくなりたい、Rubyでもっとコードを書きたい気持ちが高まった機会でもありました!

お約束の紹介になりますが、freeeではRubyを使ってプロダクトを一緒に成長させてくれる仲間を募集しています!興味を持ってくださった方はぜひfreeeに遊びに来てください!

jobs.freee.co.jp

www.wantedly.com

*1:これは、ブログ用の写真を撮る本人です。

*2:RSpecの英語のような書き方に馴染めないMatzがそれと同じような「then」メソッドを実装したことも笑いを誘ったポイントでした。

*3:Aaronの記事が参考になります。

*4:しかし、Aaronの考案の前にすでに修正されており、コードを書く前に検索しようという言葉でこの話は締めくくられました。これは数年前にあったRubyKaigi 2011の発表で、出てくる「書く前にグーグルしたほうがいい」と同じオチでした。