2018年5月31日から6月2日までRubyKaigi 2018 が仙台国際センターにて行われました。本記事は2日目の基調講演の内容をレポートします。
須藤さんは「My way with Ruby」というタイトルで、自身とRubyの関わりについて発表しました。須藤さんは自身のRubyistとしての活動を「フリーソフトウェアを使ってRubyでできることを増やす」「 ライブラリのメンテナンスをする」という2つにまとめています。実際にメンテナンスしているライブラリの数は130個ほど。非常に数が多いのですが、それぞれ須藤さん自身が必要に駆られて作ったと言います。今回の発表ではそのソフトウェアの一部を、作成したきっかけとともに振り返っていきました。
本記事ではその中でも特にRabbitとData Processingに関するものについて紹介します。
Rabbit
Rabbitは世界で唯一の「Rubyist向け」のプレゼンテーションツールです。Rubyの生みの親であるまつもとゆきひろさんも使っています。Rabbitの名前を知らない方でも、スライドの下を走るうさぎとかめを見たことがある方は多いのではないでしょうか。
まずRabbitはプレゼンテーションツールなので、GUIライブラリが必要になったところから話が始まりました。そこで須藤さんはRuby/GTK3 の開発に参加されています。こうした必要駆動の開発の場合には、必要なもののみを実装する方針と、ほぼすべての機能を実装する方針のどちらもとれますが、須藤さんは後者を選んできたそうです。Rabbitも大事ではあるけれどもRubyでできることを増やすのが大事なので、とその理由を語っていました。
Ruby/GTK3はGTK+プロジェクト のRubyバインディングです。言い換えると、C言語で書かれたGTK+にあるAPIをRubyから実行できるようにするライブラリです。当初はそれぞれのAPIに対しバインディングを手書きしていましたが、GTK+には3,000以上ものAPIがあり自動生成をする方針に転換、Ruby/GI を作成するに至ったそうです。Ruby/GIは実行時のオーバーヘッドが大きいという課題がありますが、MJITと似た設計で実行時にコンパイルすることで速度面の改善が図れるのではないかという展望の話もありました。
Rabbitの開発にあたり上記以外にも様々なRubyバインディングを作成・開発されています。
cairoの開発にあたっては、Ruby本体以外から確保されたメモリ量を認識できないためGCの実行頻度が不十分になってしまうという課題に遭遇し、rb_gc_adjust_memory_usage
という関数を本体に追加するきっかけとなったそうです(参考:https://bugs.ruby-lang.org/issues/12690 ) 。
またこうしたバインディング以外にもインストールを簡単にするためのライブラリとして、gemのインストール時にシステムのパッケージも同時にインストールしてくれるnative-package-installer やクロスコンパイルに役立つrake-compiler の話もありました。
Data Processing
須藤さんは最後に、Data Processing(データ処理)をきっかけとするライブラリについて取りあげました。データ処理の分野では PythonやRが普及していますが、須藤さんはRubyでデータ処理がしたいという思いがあることを以前に話していました 。
一般によく使われているデータ形式としてCSVがあります。須藤さんはRubyのCSVモジュールのメンテナも務めています。CSVは広く普及している一方で、形式の自由度が高すぎるあまり扱いにくくパフォーマンスが出ないという側面もあります。そういった側面を克服した別のデータフォーマットとしてApache ArrowやApache Parquetという形式もありますが、そのどちらもRubyから扱えるようにgemを作成されているそうです。
こうした取り組みのように「Rubyでデータ処理をできるようにする」ためのプロジェクトとしてRed Data Toolというプロジェクト があります。上述のgemも含め様々な観点からRubyでのデータ処理を後押しするためのプロジェクトで、現在20ほどのgemがあるそうです。例えば顔認証などの機能をもつOpenCVのRubyバインディングであるred-opencv などの紹介がありました。
まとめ
全体の締めくくりとして、Rubyistとしての須藤さんの活動を再度「フリーソフトウェアを使ってRubyでできることを増やす」「 ライブラリのメンテナンスをする」という2点で表現していました。「 こうした活動について一緒にやりたい人がいたらやりましょう」という誘いで基調講演は終了しました。