Rubyを使ってRSSを生成する

更新時刻の取得が簡単になった。

Rubyをインストールする

Ruby1.8.1をWindowsXPにインストールする。

  1. Ruby-mswin32 (ja)のサイトからruby-1.8.1-i386-mswin32.zipをダウンロードする
  2. 適当なディレクトリに展開する
  3. 環境変数を設定する
    1. スタート / 設定 / コントロールパネル / システム / 詳細設定 / 環境変数
    2. システム環境変数 / Path
    3. インストール先が C:\ruby なら C:\ruby\bin; を先頭に追加する

正しくインストールされたかを確認する

コマンドプロンプトからRubyのバージョンを出力する。

# ruby -v
ruby 1.8.1 (2003-12-25) [i386-mswin32]
    

Hello World

まずはいつもどおりにこの文字列を出力してみる。

ファイルを作成する。

hello.rb
------------------------------
#printは改行しない出力を行う
#putsは改行する出力を行う
#pはオブジェクトの内容を出力する
print "Hello World\n"
    

実行する。

# ruby hello.rb
Hello World
    

文字列と数値を連結する

数値の文字列表現を返すメソッド呼ぶ。

print "abc" + 4.to_s
    

組み込みクラスの文字列への暗黙変換メソッドを定義する。

class Numeric
    def to_str
        self.to_s
    end
end

result = "abc" + 3
print result
    

ライブラリのロードパスを追加する

ユーザーのホームディレクトリ配下にライブラリを置いてrequireしたい。

$: << "C:/rubylib/patched-html-parser"

require "html-parser"
print "OK"
    

HTTP経由でファイルを取得する

http-access2/2.0.4を使ってファイルを取得する。

しかし、このやり方ではSSLEAY32.dllが見つからないというダイアログが表示されてしまう。OpenSSLのWindows向けバイナリを入れれば解決するかもしれない。

require "http-access2"

client = HTTPAccess2::Client.new
uri = "http://www.tea4miki.org/"

content = client.get_content(uri)
print content
    

添付ライブラリのネットワークカテゴリにHTTPを扱うライブラリがあるのでそれを利用してファイルを取得する。

require "net/http"

Net::HTTP.get_print "www.tea4miki.org", "/"
    

日付を YYYY/MM/DD の書式でフォーマットする

require "date"

def formatDate(date)
    return date.strftime("%Y/%m/%d")
end

print formatDate(Date.today)
    

正規表現で複数行モードを使う

正規表現 "."(ピリオド) で改行もマッチするようにしたい。

content = "aaa\nbbb"

content.sub(/aaa.bbb/) {|match|
    print "line mode match!"
}

content.sub(/aaa.bbb/m) {|match|
    print "multi line mode match!"
}
    

GMTの時刻をローカルタイムゾーンにする

HTTPのLast-ModifiedをJSTに変更したい。

require "net/http"
require "time"

response = Net::HTTP.get_response(URI.parse("http://www.tea4miki.org/"))
puts Time.parse(response["last-modified"])
puts Time.parse(response["last-modified"]).getlocal
    

行単位でHTMLのタグを除去する

StrictなHTMLを前提とする。

require "net/http"

def trimTag(includeTag)
    return includeTag.gsub(/<.+?>/, "")
end

response = Net::HTTP.get_response(URI.parse("http://www.tea4miki.org/"))

puts "-----Start-----"
response.body.each {|line|
    print trimTag(line)
}
puts "-----End-----"
    

文字コードをShift_JISからUTF-8に変換する

rbuconvライブラリを使う。Rubyだけで書かれているのでコンパイルが面倒な人向け。

require "uconv"

u8str = Uconv.sjistou8(File.read("sjis.txt"))
File.open("utf8.txt", "w") {|file|
    file.puts(u8str)
}
    

RSSを構築する

RSS Parser 0.1.0を使ってRSS 1.0のドキュメントを構築する。

require "net/http"
require "date"
require "rss/1.0"
require "rss/maker"
require "rss/dublincore"
require "uconv"

response = Net::HTTP.get_response(URI.parse("http://www.tea4miki.org/articles/2004/11/15"))
lastmodified = Time.parse(response["last-modified"]).getlocal

rss = RSS::Maker.make("1.0", ["dublincore"]) do |maker|
    maker.channel.about = "http://www.tea4miki.org/rss"
    maker.channel.title = "プログラマっ子の足跡"
    maker.channel.description = "藤本美貴様の指先を見つめるプログラマっ子のサイトです"
    maker.channel.link = "http://www.tea4miki.org/"

    maker.items.do_sort = true

    item = maker.items.new_item
    item.link = "http://www.tea4miki.org/articles/2004/11/15"
    item.title = "Rubyを使ってRSSを生成する"
    item.date = lastmodified
end

File.open("rss.txt", "w") {|file|
    file.puts(Uconv.sjistou8(rss.to_s))
}
    

関連情報

Copyright © 2004, AfternoonTea
All rights reserved.