RubyKaigi 2015参加レポート n = 2 “#{n}日目”

こんにちは。会場の椅子と宿泊したホテルのベッドが堅くて腰と背中がばっきばきのk-shogoです。今回はRubyKaigi 20152日目のセッションの中から注目した物をまとめました。

rubykaigi

Rubyのテストフレームワーク史

Kouhei Sutouさんの『The history of testing framework in Ruby』ではRubyにおけるテストフレームワークの歴史についてまとめられていました。/\Atest.+unit\z/iという正規表現にマッチするテストフレームワークはRuby 1.8移行の全てに含まれているようです。しかしその歴史は壮絶な物だったのです。

年度 Ruby Version テストフレームワーク 補足
1999 1.3 testsupp PerlライクなAPI
Ruby用の初のテストフレームワーク
2000 1.4 RubyUnit 初のRubyにおけるxUnit系フレームワーク
テストジェネレーターやテスト実行コマンドが存在
2001 1.6 Lapidary Rubyっぽくない文法とGUIテストランナーを持つ
2002 1.6 Test::Unit RubyUnitとLapidaryが統合
最初の/\Atest.+unit\z/i
2003 1.8 Test::Unit RubyがTest::Unitをバンドル
2005 1.8 RSpec RSpecの活動は活発
バンドルされたTest::Unitの開発は停滞
2009 1.9 Test::Unit Test::Unitを捨て、test-unit gemとしてリリース
メンテナーが発表者のKouhei Sutouさんに交代
2009 1.9 minitest Test::Unitとの互換性を謳うも実はそうでは無かった
test/unitはminitestのラッパーとして開発
2013 2.0 test-unitもminitestもRSpecも活発に開発が進む
2013 2.1 minitest 5 minitest 5で非互換の変更
Rubyには最新のminitest 5をバンドル
Rubyのテストにはminitest 4とtest/unitを使うように
2014 2.2 minitest 5 Rubyにバンドルされるminitestをminitest 5に更新
test-unit gemをバンドル
Rubyのテストはminitest 4とtest/unitを使う

壮絶な歴史が垣間見えますね。/\Atest.+unit\z/iにマッチするテストフレームワークはいくつも登場しましたが、まとめると2002年に登場したTest::Unit互換のAPIであると理解するとよさそうです。Test::Unit互換APIとはテストを普通のRubyっぽく記述できることであり、minitestもこれを重要視しています。対してRSpecは英語っぽい文法で記述できるように独自のDSLを構築しています。

Rubyらしくテストを書くとはどう言うことかまとめると

  • テストケースをクラスとして実装する
    • サブテストケースはサブクラスにする(test-unitのみサポート)
  • 個別のテストをメソッドとして実装
  • テストの共有はモジュールを使用
  • アサーションはそのまま書く

Rspecの方がテスティングフレームワークとして人気なように感じますが、無駄なDSLや余計な動的アサーション呼び出しに惑わされずに/\Atest.+unit\z/iでRubyっぽくテストを書いてみてはいかがでしょうか。

RubyMotionの現在と未来

RubyMotionの開発元であるHipByteのLaurent Sansonettitheさんが発表された『future of ruby is in motion』ではRubyMotionの紹介と開発のライブデモ、そして将来の展望について語られていました。

私はバージョン3の時にライセンスを購入したのですが(値段は現在と変わらず$199/year)、バージョン 4の登場(2015年9月)と共に無料のStarter editionライセンスが登場したのをご存じでしょうか。有料ライセンスとの違いはスプラッシュスクリーンが変更出来ないこと、OSのサポートが最新の安定バージョンに限られる事です。Xcode7からApple Developer Programに登録せずとも実機へのインストールが可能になったので、無料でRubyを使ってモバイル開発をし、実機で動かすまでが出来るようになったと言うことですね。有料のライセンスだとモバイルのみならずOS X, watchOS, tvOSもサポートされますし、iOS, Androidでは古いバージョンやベータ版もターゲットとすることが可能になります。

発表ではmotion-gameというRubyMotionの拡張を用いてゲームを開発するライブデモを行っていました。
motion-gameはクロスプラットフォームのゲームエンジンで、オーディオ、スプライト、アニメーション、パーティクル、デバイスのセンサー/イベント、シーングラフ/ディレクターなどの多数の機能を揃えているようです。デモではFlappy BirdのようなFlappy Sushiで会場を沸かせていました。

Rhebok - 高速なRack Handler実装

Masahiro Naganoさんの発表『Rhebok, High Performance Rack Handler』では高速なRack Handler実装であるRhebokについて紹介されていました。RackとはHTTPのリクエスト/レスポンスを処理するためのインターフェースとその実装です。Rackのインターフェースを実装することでフレームワークであるrails, sinatra, Padrino等と、ウェブサーバーであるunicorn, puma, thin, rhebok等の組み合わせを自由に行うことが可能になります。もしRackが無かったらそれぞれの組み合わせの為の実装を行わなければならず大変ですね。

RhebokはPerlのGazelleをRubyにポートしたもので、特徴は以下の物が挙げられます。

  • preforkアーキテクチャ
  • 高速なHTTPパーサー(picohttpparser)
  • ホットデプロイ対応
  • OobGC
  • IOタイムアウト

事前にプロセスをフォークするpreforkを用いている点はunicornと同一ですが、高速なHTTPパーサーを用いることやIOタイムアウトを実装することによりunicornよりも高速な応答を可能にしているとのことです。さらにはwritev(2)システムコールを用いたTCP Optimizationなども行っているとのことで、高速化にかけるこだわりが感じられました。HTTPは1.0のみをサポートしており、これはnginxやh2oを前に置くことを前提にしているそうです。

ソーシャルゲーム、広告、SNSといったハイトラフィックなサービスでは高速なRack Handlerを用いることのメリットは大きく、高速化のための実装を知ることが出来る興味深いセッションでした。

Railsビュー国際化の新たな手法

Kouta KariyadoさんのLT『Automating View Internationalization in Ruby on Rails』ではRailsにおけるビューの国際化手法についての新たな提案がなされていました。通常Railsの国際化ではI18n Translateビューヘルパーメソッドを用いて明示的にt('.title')のように呼び出します。発表でなされた提案ではデフォルトでローカライゼーションヘルパーを呼び出すという物で、すでに実装も行われているようです。

HTMLエスケープの為に存在していたhヘルパーもRails 2では明示的に使い分ける必要がありましたが、Rails 3ではエスケープがデフォルトになった事例の拡張といったところでしょうか。サービスを広く展開するためにアプリケーションの国際化を迫られる場面も増えてくる昨今、提案手法には期待が持てます。

RubyをGo lang風にテストする

Yuki KuriharaさんのLT『A new testing framework Rgot』ではGolangのテスティングフレームワークをRubyに移植したRgotについて述べられていました。興味深いのは単にGo言語のテストライクな記述ができる事にとどまっていないという点です。一つはテスティングフレームワークにベンチマークツールを内包することでテストとベンチマークをセットで行おうという事。もう一つはRubyのテストはアサーション指向である事に対して、Goのテストではエラーログ指向だと言うことです。Goではテストを中断しないErrorと、中断するFatalというテストを落とすためのメソッドが用意されるのですね。

発表ではさらに/test/specといったディレクトリ構成ではなく、テスト対象となるコードと同階層にテストコードを配置するアイディアや、今後の展望としてExampleの対応が挙げられるなど意気込みが感じられる内容でした。

ErRuby - erlang上のRuby実装

Lin Yu HsiangさんのLT『what i learned by implementing a ruby vm in erlang』ではErlang上のRuby実装であるErRubyの紹介がされました。Erlang上に作られたRubyライクなシンタックスを持つ言語としてReia、そしてReiaの後継プロジェクトとして指名されたElixirが存在します。Elixirは初期のバージョンこそRubyライクなシンタックスにこだわっていましたが、現在はRuby風味も感じるといった程度でしょうか。対してErRubyはErlang上で動作するRubyとして実装を進めているようです。

ErRubyの現在の実装状況はクラス定義、ローカル変数、メソッド呼び出と限定されているようですが、オブジェクトとメソッドの単位でErlangプロセスを扱うアイディアは今後のさらなる発展に期待が持てます。

雑感

今年のRubyKaigiではRubyだけの枠にとどまらず、JVM技術のCRrubyへの転用可能性、そしてCrystal, Rust, RubyMotion, Go, Erlangといった他の言語との関わりといった広がりを感じました。直近ではもうすぐRubyistへのクリスマスプレゼントとしてRuby 2.3が届きますね。safe navigation operator(通称ぼっちオペレータ), Hash#digおよびArray#digHash#to_procをはじめとした便利な新機能が盛りだくさんです。Rails 5.0.beta1も発表され、一人ぼっちのクリスマスでも退屈せずに済みそうです!