Rubyの特徴は「柔軟性」です。まず,人を選びません。初心者にとっては学ぶのが易しく,熟達したプログラマには高度な機能を提供してくれます。適用できる範囲が広いのも柔軟性の表れです。Rubyは,この特集の他のパートで紹介しているように,実際のシステム開発に使えるだけのポテンシャルを持っています。一方で,個人がちょっとした便利ツールとして使うのにも適しています。このパートではそうした手軽な使い方を取り上げます。

 Windows用のRuby処理系はいくつかありますが,ここで使うのはActiveScriptRubyです。パッケージ管理を行う「RubyGems」,Rubyスクリプトをスタンドアロンで起動するexeファイルに変換する「Exerb」,RubyからJavaのオブジェクトを扱えるようにする「RubyJavaBridge(rjb)」といった便利なライブラリ/ユーティリティをあらかじめ内蔵しているのが特徴です。同ソフトのWebページからmsiファイルをダウンロードし,ダブルクリックでインストールしてください。

なぜ今,Rubyが注目されているのか...Yugui
 Rubyが“今”注目されているのはなぜでしょうか。私はハードウエア性能の向上と,必要とされるシステムの変化があると考えています。

 Rubyの弱点としてよく指摘されるのはプログラムの実行速度です。Rubyプログラムの実行速度はJavaの数分の1しかないこともあります。ただ,ハードウエア性能が向上したことで,その程度の速度低下は許容できるようになってきました。

 私が普段,携わっているWeb開発を見てみましょう。1995年,Webアプリケーションの萌芽が芽生え始めていました。Javaは遅すぎて見向きもされませんでした。2000年,Javaは主流になっていました。2005年,Javaの制約が意識され始めました。そして,Rubyが注目されました。言語としての柔軟さや開発のしやすさは,たいてい実行速度とのトレードオフです。2000年時点のハードウエア性能では,そのトレードオフを鑑みてJavaが最適解でしたが,2006年にはJavaは最適解から外れ始め,Rubyが最適解に近づいてきたのです。

 ハードウエア性能が許すならば,言語は柔軟なほうがよいのではないでしょうか。実行速度がいくらか遅くても,開発期間を縮めること,システムの機能を充実することのほうが重要です。サービスの提供が半年遅くなればその間に競合他社の進出を許してしまいます。

 速度が重要になる場合でも,本当に必要なのはスケールアウトすること,すなわち「ハードウエアを足せばその分だけ速度が上がる」ようなシステムを構築することです。米Googleが様々なサービスで成功したポイントはそこにあるといわれています。ハードウエアが安価になった現在,速度が10倍必要になったらハードウエアを10倍に増やせばよいのです。そして,スケールアウトするシステムを的確に構築するには,言語は柔軟なほうがよいのです。

求められるシステムが変わってきた

 開発すべき領域の変化も,Rubyが注目されている理由の一つです。Rubyが得意とする領域の開発が盛んになっているのです。

 私なら,銀行の預金管理システム開発にはRubyを選択しません。飛行機の自動操縦にも,3Dアクション・ゲームの描画処理にも。しかし,銀行のインターネット取引サイト,飛行機の運航状況検索システム*A,ゲームのシナリオを制御するプログラム*Bになら,自信を持ってRubyを勧めます。

 人命にかかわるような本当にクリティカルな基幹システムは,Rubyが比較的苦手とする分野です。ただし,基幹システムと連携しながら顧客に新しい価値をもたらすためのシステムは,今後ますます必要になってきます。新しい需要が生まれて新しい企業が先を争って参入を試み,戦略が変化していく中では,開発期間の短縮こそが重要です。情勢の変化に合わせて素早く修正できることが求められるのです。

まずは電卓代わりから

 まずはRubyを電卓代わりに使うところから始めてみましょう。Rubyのプログラムを対話形式で1行ずつ実行できる「irb」というソフトウエアを使います。スタートメニューの「Ruby 1.8」からirbを選択するか,コマンドプロンプトで「irb」と入力することでirbが起動します。

 「電卓ならWindowsにも付いている」と思うかもしれません。その通りです。でも,irb(つまりRuby)にはWindows付属の電卓にはない特徴があるのです。

 試しに,Windwosの電卓で表示を「関数電卓」にして2の100乗を計算してみてください。べき乗の計算を行うキーは右の図の通りです。計算すると,結果の最後に「e+301」と表示されるはずです。これは,数字が大きすぎてすべての桁の値を表示しきれないという意味です。

 次にirbを起動して「p 2**1000」と入力してみてください。「p」は表示のためのメソッド,「**」はべき乗の演算子です。結果のすべての桁が表示されました。Rubyでは,メモリーの許す限り,いくらでも大きい値を扱えるのです。

●Windowsに付属する電卓で2の1000乗を計算
●Windowsに付属する電卓で2の1000乗を計算

●irbで2の1000乗を計算
●irbで2の1000乗を計算

何はなくとも正規表現

 Rubyで行うちょっとした作業といえば,一番多いのはテキスト・ファイルの処理でしょう。そんなときに威力を発揮するのが,RubyがPerlから受け継いだ強力な正規表現の機能です。

 Rubyを使えば,テキスト・ファイルの文字の置換くらいはコマンドプロンプトでワンライナー(1行プログラムのこと)を実行するだけで済みます。-eオプションでプログラムを直接記述して実行し,コマンドプロンプトのリダイレクション機能を使って別のテキスト・ファイルに結果を出力します。gsubは,正規表現にマッチした部分を指定した文字列に置き換えるメソッドです。

 HTMLタグの除去といったことも簡単にできます。ワンライナーでは「<」などの記号を使うとエラーになるので,tagcut.rbというファイル名でプログラムを保存しました。正規表現は,タグをまたいでマッチしないよう最短マッチを指定しています。

 もっとも,これくらいの簡単な置換なら,たいていのテキスト・エディタでもできます。Rubyの正規表現にはまだいろいろな機能があるので,興味があれば33ページに示したRubyの解説書で調べてみてください。

●正規表現を使った文字の置換
●正規表現を使った文字の置換

●タグの除去
●タグの除去

ファイルを1行ずつ処理する

 前のページで使ったreadメソッドは,ファイルの中身を一度に読み込みます。一方,openメソッドでファイルを開いておけば,ファイルの中身を1行ずつ処理できます。ここでは「各行の3番目から12番目の文字だけを取り出す」という例を取り上げます。

 「ファイルを開いて,処理を行い,ファイルを閉じる」と順番通りに書くと,右の一番上のようなプログラムになります。ただ,こうした書き方はRubyでは好ましくありません。ファイルの閉じ忘れの危険性があるからです。Part1で解説したように,ファイルを扱う際にはブロックを使うのが鉄則です。ブロックを使えば,ファイルの閉じ忘れを気にする必要はなくなります。

 ファイルをオープンしたら,イテレータのeachメソッドを使うことで,各々の行に対して処理を行うことができます。line[2..11]と指定することで,3番目から12番目の文字からなる文字列を取り出せます。while文とgetsメソッドを使っても同様の処理を行うことが可能です。

 ちなみにreadlinesというメソッドを使うこともできます。この場合,ファイルの各行が格納された配列が最初に作られます。

file = File.open(ARGV[0])
file.each{|line|
puts line[2..11]
}
file.close
●ブロックを使わない例

File.open(ARGV[0]){|file|
file.each{|line|
puts line[2..11]
}
}
●ブロックを使う例(その1)

File.open(ARGV[0]){|file|
while line = file.gets
puts line[2..11]
end
}
●ブロックを使う例(その2)

File.readlines(ARGV[0]).each{|line|
puts line[2..11]
}
●ブロックを使う例(その3)

Windowsアプリケーションを操作する

 Ruby 1.8系には,Windowsのアプリケーションを操作するための「Win32OLE」というライブラリが標準で入っています。RubyのプログラムからMicrosoft WordやExcelのファイルを操作したり,Internet Exploreを起動して任意のWebページを表示するといったことができます。

 Win32OLEを利用するには,まずrequireメソッドでWin32OLEライブラリを読み込みます。アプリケーションを操作するためのCOMオブジェクトは,「WIN32OLE.new('操作したいアプリケーションのプログラムID')」と書くことで生成されます。そのCOMオブジェクトで利用できるOLEのメソッドの一覧は,ole_methodsというメソッドで取得できます。

 ちょっと変わったところでは,Win32OLE経由でWindows Script Hostを利用することもできます。例えば,Popupメソッドを使うとダイアログ・ボックスにメッセージを表示できます。GUIで簡単な表示を行いたいけど,Ruby/TkなどのGUIライブラリを利用するのはちょっと大げさ。そんなときにWin32OLE経由で手軽に使えるWSHのポップアップ機能は意外に役に立ちます。

●Win32OLEで操作できるアプリケーションの例
●Win32OLEで操作できるアプリケーションの例

require 'win32ole'

wsh = WIN32OLE.new('Wscript.Shell')
wsh.Popup('Hello')
●Win32OLEで操作できるアプリケーションの例
●RubyからWindows Script Hostを使って ポップアップを表示