Rioってなんだろう

Rio:http://rio.rubyforge.org/
Ruby: Net::Http and open-uri | 2006-08-13:
http://www.juretta.com/log/2006/08/13/ruby_net_http_and_open-uri/
をそれぞれ参考にしながら,Rioってヤツを試してみる.


そもそもRioって何?

Rio - Ruby I/O Comfort Class

Rio is a convenience class wrapping much of the functionality of IO, File, Dir, Pathname, FileUtils, Tempfile, StringIO, and OpenURI and uses Zlib, and CSV to extend that functionality using a simple consistent interface. Most of the instance methods of IO, File and Dir are simply forwarded to the appropriate handle to provide identical functionality. Rio also provides a "grande" interface that allows many application level IO tasks to be expressed succinctly.

全部入りってこと?


とりあえず入れる.

$ sudo gem install rio

入れたら,次にhttp://www.juretta.com/log/2006/08/13/ruby_net_http_and_open-uri/に書いてある事とか,適当に色々試してみるぞ.

ウェブページの取得,ファイルへの書き込み

require 'rubygems'
require 'rio'

rio('http://d.hatena.ne.jp/omochist/') > rio('mochi.html')

見た感じ,URLで指定したファイルをローカルにmochi.htmlという名前で保存するって感じだ.本当にコレで行けたら,スゲーラクチンである.実際に試してみる.

$ ruby hoge.rb
$ ls
hoge.rb         hoge.rb~        mochi.html

「マジで落とせてるの?」と疑問に思いながらmiで開いてみると,ちゃんと落とせてて驚き.ナンダコレは,すげー楽じゃないか.

複数のウェブページの取得,ファイルへの書き込み

今度は,複数のページを配列に落とし込んでみる.(※注:以下のソースは,実行するとエラい目に遭います.)

require 'rubygems'
require 'rio'

# ページの取得
pages = []
rio('http://www.google.co.jp') > pages
rio('http://www.yahoo.co.jp') >> pages
rio('http://rio.rubyforge.org/') >> pages
rio('http://www.t3.rim.or.jp/~terra/') >> pages
rio('http://tksn.web.infoseek.co.jp/') >> pages

# 書き込み
pages.each_with_index do |page, i|
  rio("page#{i}.html") < page
end

これで行けそうかな〜!って感じですが,行けません.どうもこのRioってのは,ページを落としてきてその一行一行を配列に追加していくので,結果1797個もの配列を作り,ご丁寧にもその一個ごとにファイルを作ってしまいます.これは正直望ましくない.ココで,

  • 全部オブジェクト
  • 配列はオブジェクトならある程度なんでも格納

ってのを思い出しながら,ページの取得をこんな風に変更する.

pages = []
pages << rio('http://www.google.co.jp')
pages << rio('http://www.yahoo.co.jp')
pages << rio('http://rio.rubyforge.org/')
pages << rio('http://www.t3.rim.or.jp/~terra/')
pages << rio('http://tksn.web.infoseek.co.jp/')

こうすると,ちゃんと思い通りに動いてくれる.

$ ruby hoge2.rb
$ ls
hoge.rb         hoge2.rb        mochi.html      page1.html      page3.html
hoge.rb~        hoge2.rb~       page0.html      page2.html      page4.html

ウェブページのタイトルを取得

チョットした応用.正直,open-uriとか使っても十分にできる範囲ではある.

require 'rubygems'
require 'rio'

# chompして配列にする事もできる.
# lines = rio('http://d.hatena.ne.jp/omochist/').chomp.to_a
lines = rio('http://d.hatena.ne.jp/omochist/').to_a

lines.each do |l|
  if l =~ /<title>(.*)<\/title>/
    puts $1
    break
  end
end
$ ruby hoge3.rb 
もち

ちゃんとできてる.

他にも色々できる

FTPサーバからgzipファイルを落としてきて解凍してローカルに保存したり,適当なファイルのシンボリックリンクの作成したり,何やもうとりあえず色々できる.それも,だいたいが一行で書ける.rubygemsrioをrequireするだけで,とりあえず色々できる.とにかく色々できる.


面倒くさがりには持ってこいのgemだなぁ.DirとかIOとか何も考えずに,くくとかしてりゃ良いだけだもの.良くできてるなー.