読者です 読者をやめる 読者になる 読者になる

#RubyKaigi 2011で気になったgem 13選

Rubyist達の夏フェスであるところのRubyKaigiが今年も開催され、猛暑の練馬が大いに盛り上がりました。今回が最後の開催とのことで、関係者各位は素晴らしい会議を本当にどうもありがとうございました。
さて、今年のRubyKaigi2011での各セッションで紹介されたgemのうち、気になったものをピックアップしてみました。

1. fakeweb

fakewebは、指定したURLのHTTPレスポンスを偽装する、テスト用のライブラリ。外部サービスと連携するプログラムのテストを書くにはとても便利ですね。
Engine YardのAndy Delcambre氏による「Toggleable Mocks and Testing Strategies in a Service Oriented Architecture」という発表で紹介されました。

以下、サンプルコードです。(READMEより)

FakeWeb.register_uri(:get, "http://example.com/test1", :body => "Hello World!")

Net::HTTP.get(URI.parse("http://example.com/test1"))
=> "Hello World!"

Net::HTTP.get(URI.parse("http://example.com/test2"))
=> FakeWeb is bypassed and the response from a real request is returned
追記(2011/07/19)

id:secondlife 氏によれば、今はfakewebよりwebmockの方がイケてるとのことです。

2. artifice

artificeも、HTTPレスポンスを偽装する、テスト用のライブラリです。上記と同じ発表の中で紹介されました。fakewebは偽物のNet::HTTPのレスポンスオブジェクトを生成するだけなので通信は発生しないのに対し、artificeは、rackでWebサーバを立てて通信を行います。fakewebでは偽装度が物足りない方にオススメですね。

3. showoff

showoffは、RubyKaigiで海外勢のスピーカーの方々が使っていたruby製のプレゼンライブラリです。特徴としては以下のとおりです。

  • スライドはmarkdownで記述
  • Keynote風のオシャレな画面が生成される
  • Sinatraでできている
  • シンタックスハイライトができる
  • トランジション(ページ切り替えのアニメーション)に対応
  • JSやRubyをプレゼン中に実行し、実行結果を画面に出せる

日本ではruby製のプレゼンライブラリといえばrabbitが有名ですね。RubyKaigi2011では海外のスピーカーの方がこぞってshowoffを使っていたので、これからは日本のRuby界隈でもこのshowoffが流行るかもしれません。

4. drip

dripは、dRubyでの分散処理で、プロセス同士でオブジェクトをやりとりするための機構です。途中から聴講したため詳細まで理解できませんでしたが、複雑な依存関係を持つデータをキューイングするときに活躍しそうです。
dRubyの作者である関将俊さんの発表「Drip: Persistent tuple space and stream.」で紹介されました。
関さんのdRuby本の英語版が出るらしく、そちらではこのDripが紹介される予定だそうです。

5. rails_best_practices

rails_best_practicesは、あなたのRuby on Railsプロジェクトにおける code smell (コードの不審な臭い)のする箇所や、「ここはこう書いたほうがRails的にクールだよ!」というような箇所を指摘し、修正方法を提案してくれるライブラリです。指摘されるプラクティスは、同名のウェブサイト Rails Best Practices | rails best practices list で投票の多いものが採用されています。
rails_best_practicesはOpen FeintのエンジニアでありRails Best Practicesの作者でもあるRichard Huangさんの発表、Use rails_best_practices to refactor your rails codes で紹介されました。

6. ruby_parser

ruby_parserは上記のrails_best_practicesがrubyコードの解析に使用しているpure ruby実装によるrubyパーサです。ruby_parserは、rubyコードをS式に展開します。
例として、次のようなRubyコードは、

def conditional1(arg1)
  if arg1 == 0 then
    return 1
  end
  return 0
end

以下のようなS式に展開されます。(READMEより)

s(:defn, :conditional1, s(:args, :arg1), s(:scope, s(:block, s(:if, s(:call, s(:lvar, :arg1), :==, s(:arglist, s(:lit, 0))), s(:return, s(:lit, 1)), nil), s(:return, s(:lit, 0)))))

7. fabrication

fabricationは、ActiveRecordのテストデータ生成用ライブラリです。Mongoid、Sequelにも対応しています。
railsには組み込みでfixturesという機能がありますが、これがいけてないので皆 machinistfactory_girl を使うわけですが、この fabrication はそれらよりも後発であり、より記述がすっきりしているのが特徴です。
例えば、以下のようなDSLでテストデータを記述できます。(公式サイトより)

Fabricator(:person) do
  name { Faker::Name.name }
  email { |person| "#{person.name.parameterize}@example.com" }
end

fabricationは、諸橋 恭介さん(@moro)の発表「5 years know-how of RSpec driven Rails app. development.」の中で触れられました。

8. mustang

mustangは、Googleの高速JSエンジン「V8」をrubyから使うためのラッパーです。
以下のように、rubyからJSコードをevalすることができます。rubyを経由しているので一見遅そうですが、JSエンジンがV8なのである程度高速に実行できるとのことです。

require 'mustang'

cxt = Mustang::Context.new
cxt.eval("'Hello' + ' World!';") # => 'Hello World!'
cxt.eval("var a=1;")
cxt.eval("a+5;") # => 6

cxt[:puts] = method(:puts)
cxt.eval("puts(a)") # displays "1" on the screen
cxt[:a] # => 1

Chris Kowalik氏の発表Efficient JavaScript integration testing with Ruby and V8 engine.で紹介されました。mustang自体もご自身の作です。

9. mike

mikeは上記のmustang+V8を利用した高速なheadless browser(画面は表示されないがブラウザと同様の挙動を再現できるブラウザ)です。mustangの作者Chris Kowalik氏が高速なJSテストのために開発されたそうです。
mikeという名前はMike the headless chicken (首なし鶏マイク)から来ているそうです(ややグロ注意)。

10. james

jamesはMax OSXの音声認識・音声合成機能を利用し、人工無能的な対話を記述できるライブラリです。

# READMEより
James.dialog do

  hear 'What time is it?' => :time

  state :time do
    hear ['What time is it?', 'And now?'] => :time
    into { time = Time.now; "It is currently #{time.hour} #{time.min}." }
    exit {} # Optional, listed for completeness.
  end

end

このような簡単な記述で、macとの音声対話が楽しめます。
jamesは、Florian Hanke氏のLT「James: An electronic butler that you can talk to.」で紹介されました。Jamesさんとの絶妙な掛け合いは爆笑でしたね。

11. rios

riosは標準入出力の間のプロキシです。riosを使うと、標準入出力をフックして処理を書けます。cursesなどを使ったインタラクティブで複雑なコマンドラインツールのテストを書くために作成されたそうです。
小山田昌史さんのLT「Rios Proxy - コマンドラインインタフェースのためのプロキシフレームワーク」で紹介されました。
以下、READMEのサンプルコードです。「vim」という文字列が出力される前に、「***」に書き換えてしまうというサンプルです。

#!/usr/bin/env ruby

require "rios/easy"

on_output { |s|
  s.gsub(/vim/i) { |match| "***" }
}

listen

12. interactive-macruby

interactive-macrubyは、MacRuby版のirbです。MacRubyなので、コマンドラインからウィンドウを作るなどのGUI操作ができます。
Eloy Durán さんと Vincent Isambart さんによるLT「A Hayabusa-speed talk about living under the MacRuby rainbow」で紹介されました。

13. aviglitch

aviglitchは、グリッチアーティストの大家、ucnvさんによる動画グリッチライブラリです。AVIフォーマットに則ってグリッチをするので、安全にバイナリを破壊することができて便利です。ucnvさんの発表「Visual Glitch, using Ruby」で紹介されました。
以下は、aviglitchのサイト(http://ucnv.github.com/aviglitch/)から引用したサンプルコードです。これはキーフレームをすべて削除することで動画を壊すグリッチ手法(datamoshと呼ばれる)を実現しています。

require 'aviglitch'
 
a = AviGlitch.open 'file.avi' # Rewrite this line for your file.
a.glitch :keyframe do |f|     # To touch key frames, pass the symbol :keyframe.
  nil                         # Returning nil in glitch method's yield block
end                           # offers to remove the frame.
a.output 'out.avi' 

このコードを使ってグリッチした動画例は以下のとおりです。

最後に

ここで紹介しているのは僕が聴講したセッションからのみなので、RubyKaigi2011で発表された魅力的なgemのうちのごく一部だと思います。他の皆さんも別のセッションで知ったものなどあればぜひブログ書いてください!