Home > ruby

2008.06.29

Consistent Hasing を Ruby で試す

Consistent Hashing を試すというページにて、Perlで Consistent Hashing を実装しているのを見つけたので、そのプログラムを Ruby に移植してみました。Perl 側の文法を完全には理解していないので一部は勘ですが、実行結果が一致しているのでたぶん合っていると思います。単純な移植ではつまらないので二分探索を用いた高速化も行っています。詳しくは以下のページをご覧ください。

ConsistentHashingRuby – pylori*style – Trac

2008.03.02

Ruby/EventMachineによるサーバの例

最近、Ruby/EventMachineというライブライがおもしろくて良く使っています。EventMachineは、イベントドリブンで非同期I/O処理を行うためのライブラリで、一部 C++ で書かれていて高速動作するのが特徴です。

EventMachine のインストール

rubygems を使うのが簡単です。

$ gem install eventmachine

EventMachineの使い方

ごく簡単な例:

require 'rubygems'
require 'eventmachine'

EventMachine.run {
  EventMachine.start_server('localhost', 7000, EventMachine::Connection)
}

EventMachine.run はイベント待ちの無限ループを行います。ブロックの中身はイベント待ちループの初期化のあと、ループに入る前に呼ばれます。

EventMachine.start_server は、指定TCPポートで待ち受けるサーバを登録します。3つ目の引数は、イベント発生時にコールバックを処理するクラスまたはモジュールを指定します。
EventMachineのイベント待ちループで、新しい接続(コネクション)が発生すると、ここで指定したクラスのインスタンスが生成され、イベントに応じてそのインスタンスオブジェクトのメソッドが呼び出されます。モジュールを指定した場合は EventMachine::Connectionにmix-inされます。EventMachine::Connectionは元々EventMachineにあるベースとなるクラスです。

上記のスクリプトを実行するとイベント待ちループにはいるので、別の端末ウィンドウを開いて telnet 等で次のように接続します。

$ telnet localhost 7000
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.

なにか文字を入力して Enter を押すと、サーバを起動した端末の方に

............>>>5
............>>>7

などと表示されます。数字は入力した行の文字数です。実際に入力した文字より2多いと思いますが、これは行末の “\r\n” も含めて数えているからでしょう。このように EventMachine::Connectionにはデフォルトで受け取った各行の長さをSTDOUTに出力するコールバックルーチンが定義されています。実際に使うときには EventMachine::Connectionを継承したクラスをつくるか、必要なメソッドを定義したモジュールを指定することになります。

Echoサーバの例

Echoサーバとは、クライアントからの入力をそのまま出力して返すものです。先ほどの例に少し手を加えてEchoサーバを作ってみます。

require 'rubygems'
require 'eventmachine'

module MyHandler
  def receive_data data
    send_data(">> "+data)
  end
end

EventMachine.run {
  EventMachine.start_server('localhost', 7000, MyHandler)
}

新たにMyHandlerというハンドラを定義して、それをstart_serverの引数に渡しています。receive_dataは入力があったときに呼び出されるメソッドで、引数の変数に受け取ったデータが入ります。send_dataは出力するためのメソッドで、ここでは入力の先頭に”>> “を付加してそのまま送り返しています。

これは非常に簡単な例ですが、これだけで複数のクライアントから同時に接続されても正しく動くサーバが簡単に作れます。非同期入出力をするプログラムを作る際には便利なライブラリです。

2006.09.30

ChartDirector for Ruby

ChartDirectorとは、Advanced Software Engineeringの製品で、チャート(グラフ)を描くためのライブラリです。有料ですが、試しに使ってみるだけなら無料でできます。最近になってRuby用が出たので試しに使ってみました。

ダウンロードと展開

ダウンロードページ http://www.advsofteng.com/download.html からアーカイブをダウンロードします。ここではChartDirector for RubyのFreeBSD(i386)用をダウンロードしました。ダウンロードしたら展開します。

% wget http://download2.advsofteng.com/chartdir_ruby_freebsd.tar.gz
% tar zxvf chartdir_ruby_freebsd.tar.gz

railsdemo

ChartDirector for Rubyには、Ruby on Rails用のサンプルが添付されています。 Railsが使える環境であれば、次のようにして展開したディレクトリの中にあるrailsdemoディレクトリで ruby srcipt/serverを実行し、ブラウザでhttp://localhost:3000/にアクセスすればデモを見ることができます。

% cd ChartDirector/railsdemo
% ruby script/server

s-WS124.jpg

左側のリンクをクリックすると豊富なサンプルグラフを見ることができます。たとえば、Cylinder Bar Shadingというリンクをクリックすると以下のようなサンプルが表示されます。

s-WS125.jpg

自分のrailsアプリケーションでChartDirectorを使う場合は、railsdemo/vendorディレクトリの中身を全部自分のrailsアプリのvendorディレクトリにコピーして使います。

rubydemo

ChartDirectorは、もちろんruby単体で使うことができます。rubydemoディレクトリに移動し、rubyのライブラリサーチパ スにrailsdemo/vendorを含めれば、デモプログラムを実行できます(実際に使う場合にはrailsdemo/vendorの中身を全部 rubyのライブラリサーチパスのどこかにコピーして使うことになります)。

% cd ../rubydemo
% ruby -I../railsdemo/vendor simplebar.rb

上記のようにするとsimplebar.pngというグラフ画像が生成されます。

simplebar.png

画像下部にある黄色いバーは、ライセンスを登録していない場合に表示されます。ライセンスを購入し、設定すれば黄色いバーは表示されなくなります。

ライセンスの購入

http://www.advsofteng.com/purchase.htmlからライセンスを購入することができます。メールでライセンスコードが送られてくるので、それをファイルに書き込むと登録は完了し、グラフ画像に黄色いバーが表示されなくなります。

ChartDirectorは非常に機能が豊富で、美しいグラフを高速に生成できます。サンプルやドキュメントも充実しています。値段も安いのでオススメのグラフライブラリです。

2006.08.27

Hpricot

HpricotというRuby用のHTMLパーサに注目していたのですが、 最近ちょうど使いたい場面があったので使ってみました。 まず、Hpricotはスキャン部分がC言語で書かれていて、類似のHTreeより高速だということですので両者を比べてみました。

require 'benchmark'
require 'open-uri'
require 'rubygems'
require 'hpricot'
require 'htree'

str = open('http://www.ruby-lang.org/en/').read

n = 100
Benchmark.bm {|x|
  x.report {n.times {HTree(str)}}
  x.report {n.times {Hpricot(str)}}
}

結果は次のようになり、たしかにHpricot(下の段)の方がかなり高速なようです。

     user     system      total        real
11.773438   0.671875  12.445312 ( 13.631620)
 4.750000   0.359375   5.109375 (  5.644100)

使い方等についてはwikiHTMLパーサ Hpricotにまとめました。 使い勝手もかなり良く、おすすめです。

2006.08.19

Ruby or Rails CheatSheets

Ruby Inside16 Great Ruby Articles and Resources In The $100 Contest So Farという記事で、 Ruby or Rails Cheat Sheetsというのが紹介されています。 RubyやRailsのcheat sheet やリファレンスがいくつかあがっていて、たとえば Ruby On Rails Referenceなんかは、結構便利。しかし、Ruby on Rails Cheat Sheetをみると、もはやRubyとRailsは区別されていない感じです。

2006.08.16

faster Symbol.to_s

High-performance Ruby: faster Symbol.to_sという記事でSymbol#to_sを高速化する方法が紹介されています。(最初に見たときはもっと長いコードでしたが、今見たらいろいろコメントがついて、よりエレガントに更新されているようです。)コメントにあるように、

   @str_rep ||= to_s

よりも

   @str_rep || (@str_rep = to_s)

のほうが速いと言うのははじめて知りました。