« ホームパーティな忘年会 | メイン | しまなみ海道 岡山~愛媛へ »
2007年12月29日
Rubyプログラミング RSSフィード
数年前から流行りにもなっているRubyでも触ってみようかと思いたって、軽いWEBプログラミングを。
BEERLIFEで PHP+MySQLによるプログラムを数年前に行いましたが、そのころは便利なライブラリやフレームワークがあることを知らなかったので、SQL操作やクッキー関連の処理、フォーム処理を、ベタベタに書いた記憶があります。
ちょっとしたアイデアもあったので、Ruby on Railsなどで軽くアプリケーションが作れたらなぁと思い、まずはRubyでもと思ったのがきっかけ。幸い、現在お世話になっている さくらインターネットにはRuby環境も整っていることですし。
まずは、PCにRuby本体と開発環境RDEをインストール。RDEはときどき、落ちたりしますが、操作もなかなか直感的で、まずまず使えそうとの印象。
まず、やろうとしたのは、「ビール関連企業のニュースRSSなどから情報を動的に取ってきてサイドバーに表示する」というもの。別にRubyを使う必要性は全くないのですが、何ごとも経験ですし。
アーキテクチャは以下。
1. 取得対象のフィードのURLリストを、変更しやすいようにテキストファイルで保持。
2. 1日に1回ほどの頻度で、URLリストをもとに、それぞれのフィードをとってきてParseし、タイトルや日付、リンクなどを取得。それらを日付順にソートして、テキストファイルに保持。フィードのバージョンは、全対応できればいいけど、とりあえずメジャーなRSSとAtomあたり。
3. htmlを表示時に、そのテキストファイルから情報を取り出して、任意の形式でページに貼り付ける。(今回は、表示する項目数とCSSを自由に設定できるように。)
1. 準備
最終的には、このリストをWEBベースで管理者のみが自由に設定できればかっこいいけれど、頻度も考えて、まずはテキストファイルに手動で作成。
2. フィードの取得とファイル保存
定期実行は、さくらインターネットの設定コンパネから実行権を与えたrubyの実行ファイルを、cronに設定。フィードの取得とParseの実行は、ライブラリrssをrequireして、各要素を取得するだけ。取得とParseが1行で書けます。
#! /usr/local/bin/ruby
require 'rss'
rss = open(@url){ |file| RSS::Parser.parse(file.read, false) }
Parseした複数の要素を入れた Arrayの日付によるソートも、次のように簡単に書けます。
$item_list.sort! { |a,b|
b.item_date <=> a.item_date
}
で、それらをファイルにかけば準備は完了。
3. 表示
ほんとは動的に、HTMLを書き換えることで埋め込みをしてしまおうと思ったのですが、ちょっとつまってしまったので、とりあえずiframeで実施。
テキストファイルからデータを読み出しながらテーブル出力するRubyスクリプトをCGIとして呼び出すことに。CSSファイルを引数で渡せるようにしたので、任意のスタイルで、それぞれのサイトで表示可能です。さっそく、このブログのサイドバーと BEERLIFEのトップページに貼ってみました。
スクロールバーが表示されるのはカッコ悪いですが、そのうち直すことにして、最初にやりたかったことはだいたいできた感じ。
WEBプログラミングという、特定のコンテキストで行われる製作作業ということもあり、ライブラリに便利な機能がほぼ揃っているし、Ruby言語自体もとてもシンプル。 上記のコードも150行程度のプログラミングでできてます。
組み込みやっていると、高級言語とはあまり接点がなくなってしまいますが、ちゃんとWatchしとかな置いて行かれるなと。時代の流れを思わず感じてしまいます。
今回は、データベースを使わなかったけど、MVCのフレームワークであるRuby on Railsの便利さもぜひ体験してみたいところ。
投稿者 orval : 2007年12月29日 18:19
トラックバック
このエントリーのトラックバックURL:
http://www.orval-net.com/mt/mt-tb.cgi/690
このリストは、次のエントリーを参照しています: Rubyプログラミング RSSフィード:
» montana american legion post 19 from montana american legion post 19
familiarizes turnip,quoted alcoholics [続きを読む]
トラックバック時刻: 2008年10月28日 14:44

