タグクラウド

2008年05月06日

Radiant CMSでPerfumeブログのRSSフィード

PerfumeのオフィシャルブログはRSSが出力されていません。日々更新をチェックしにいくのもアミューズにお願いするのも面倒だったので、自分のサーバでRSSフィードを生成・提供するようにしました。
配信するのはタイトルとURLのみで、ファンクラブ会員限定コンテンツである本文の配信は行いません。

http://perfume.yurufuwa.jp/blog_feeds/


このフィードは、オープンソースのCMS「Radiant CMS」と、Radiant CMSのテンプレート上で直接Rubyコードを実行できるようにするエクステンション「Back Door」を使って生成しています。

http://www.radiantcms.org/
http://backdoor.rubyforge.org/


■処理の流れ

  1. Radiant CMSがRSSリーダーからのHTTPリクエストを受け、該当するテンプレートの処理を開始。
  2. Back Doorによりテンプレート内のRubyコードが実行される。オフィシャルブログのHTMLを取得、必要な情報を切り出しRSS生成。
  3. Radiant CMSが生成されたRSSを返す。


■実装
<レイアウト「XML Feeds」作成>
Content-typeを「text/xml」として以下の内容のレイアウトを作成します。

<r:content />


<スニペット「tag_perfume_blog_feed」定義>
テンプレート中で「perfume_blog_feed」というタグでRSSを生成できるようにします。タグにするのは、複数のフィード(のっち、かしゆか、あ〜ちゃん、スタッフの各ブログ)を生成する際にRubyコードを使い回せるようにするためです。


<r:tag name="perfume_blog_feed">

require 'rubygems'
require 'hpricot'
require 'rss'
require 'open-uri'
require 'cgi'

FETCH_URL = tag.attr['url']
FEED_TITLE = tag.attr['title']
FEED_LINK = tag.attr['url']
FEED_DESCRIPTION = tag.attr['title']

# 指定されたURLのコンテンツを取得し、Stringとして返す。
def get_html(url)
result = ''
open(url) {|f| result = f.read}
end

# HTMLからblogエントリーのタイトル、URL、更新日付を取得しHashのArrayとして返す。
#
# Hashのキー: :url => blogエントリのURL, :title => タイトル, :date => 更新日付
def extract_blog_entries(html)
result = []
doc = Hpricot(html)
doc.search("div.box_cont_01").search('h4').search('a').each do |e|
url = CGI::unescape(e['href'].sub(/.*set_ref__=http%3a%2f%2f/, "http://")).gsub(/&sid=[^&]*/, "")
date = Time.parse(e.search('span').inner_html.gsub(/\./, "/"))
title = CGI::unescapeHTML(e.inner_html.gsub(/<span.*/, ''))
result.push({:url => url, :title => title, :date => date})
end
return result
end

# extract_blog_entriesで戻された情報からフィードを生成する
def generate_feed(blog_entries)
rss = RSS::Maker.make("2.0") do |maker|
maker.channel.title = FEED_TITLE
maker.channel.link = FEED_LINK
maker.channel.description = FEED_DESCRIPTION

blog_entries.each do |entry|
item = maker.items.new_item
item.title = entry[:title]
item.link = entry[:url]
item.date = entry[:date]
item.dc_date = entry[:date]
end
end

result = rss.to_s
end


html = get_html(FETCH_URL)
if html != nil then
blog_entries = extract_blog_entries(html)
xml = generate_feed(blog_entries)
end
xml
</r:tag>


<RSS出力用テンプレート作成>
以下の内容のテンプレートを作成します。下記はあ〜ちゃんのブログ(http://www.amuse.co.jp/perfume/blog/a-chan/)のフィードの例です。


<r:snippet name="tag_perfume_blog_feed" /><r:perfume_blog_feed url="http://www.amuse.co.jp/perfume/blog/a-chan/" title="Perfume A-CHAN BLOG" />


テンプレートの「slug」はRSSっぽく「a-chan.xml」などとします。レイアウトは、前述の手順で作成した「XML Feeds」を適用します。

以上で完了です。

ピクチャ 4.png

Radiant CMSでは一定時間コンテンツがキャッシュされます。キャッシュが有効である間は、何度アクセスしても実際にはフィード生成処理は行われずキャッシュが使用されます。HTML取得先のサーバへの負荷が軽減されるので好都合です。

Radiant CMSでレスポンスキャッシュの有効期限を変更する:
http://vividtone.seesaa.net/article/94905361.html
posted by maeda at 12:10| 島根 ☀| Comment(3) | TrackBack(0) | ソフトウェア | このブログの読者になる | 更新情報をチェックする

2008年03月20日

Rubyイディオム: 実行中のスクリプトのディレクトリをロードパスに追加


$:.push(File.expand_path(File.dirname(__FILE__)))


  • __FILE__ は実行時のスクリプトのファイル名
  • File.dirnameはディレクトリ名のみを取得
  • File.expand_pathは、与えられたパスが相対パスであれば絶対パスに変換。
  • $:はロードパス。pushでパスを追加。

  • ラベル:ruby
posted by maeda at 10:13| 島根 ☁| Comment(0) | TrackBack(0) | ソフトウェア | このブログの読者になる | 更新情報をチェックする

2008年03月15日

svn log である日付以降のログを出力する

http://d.hatena.ne.jp/qpsdead/20080315/1205511860 より。

svn log である日付以降のログを出力するとかオプションでできねーのかなー



気になったので調べてみた。以下でOK。日付を{}で囲むのを忘れると構文エラーになる。

svn log -r {2008-01-01}:HEAD http://svn.example.jp/repos/
ラベル:SVN
posted by maeda at 09:15| 島根 🌁| Comment(0) | TrackBack(0) | ソフトウェア | このブログの読者になる | 更新情報をチェックする

2008年02月24日

RSSをjsonpに変換するCGIスクリプト

任意のRSSフィードのURLを渡すとjsonpに変換して返すCGIスクリプトをRubyで作成しました。

目的は自分のサイトで使うため。あるサイトでRSSが流れているsvnのコミットログを表示させたいのです。同様のサービスはいろいろあるのですが、勉強がてら作りました。案外時間を使ってしまいましたが。エラー処理等を実装してから運用開始しようと考えています。


RSSの解析にはfeed-normalizerを使っています。fastladderのcrawler.rbを参考にしました。

<ソースコード>
rss2js.rb
posted by maeda at 23:26| 島根 ☁| Comment(0) | TrackBack(0) | ソフトウェア | このブログの読者になる | 更新情報をチェックする

2008年02月17日

Rubyのシングルクォートとダブルクォートは、実行速度には差が無い

Rubyで文字列を表すときに使う"(ダブルクォート)と'(シングルクォート)。今まで、ずっとだぶるクォートはエスケープの解釈(\nなど)があるから遅いと思い込んでいたのですが、実際には差がないとのこと。

[ruby-list:44595]より、まつもとゆきひろ氏の発言。

シングルクオートとダブルクオートの違いはプログラムの最初の読
込時に解決されますので、実行スピードには関係ないです。
http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-list/44595


いままで極力シングルクォートを使うようにしていましたが、その必要はなかったようです。

そういえば、前田修吾さんのコーディング規約でも、必要がなければダブルクォートを使うことになっていました。

文字列リテラルには基本的に"..."を使用する。ただし、特殊文字を解釈させたくない場合のみ、'...'を使用する。また、原則的にヒアドキュメントは使用しない。
http://shugo.net/ruby-codeconv/codeconv.html

ラベル:ruby
posted by maeda at 09:44| 島根 ☁| Comment(0) | TrackBack(0) | ソフトウェア | このブログの読者になる | 更新情報をチェックする

2008年02月10日

Herokuの登録完了

webベースのRails開発環境、Herokuの登録が完了しました。

8日の昼休みに登録して、9日の13時38分にメールが届きました。ほぼ1日。"Average wait: 2 days"ということでしたが、案外早く登録してもらえました。

posted by maeda at 22:16| 島根 ☀| Comment(0) | TrackBack(0) | ソフトウェア | このブログの読者になる | 更新情報をチェックする

2008年02月08日

webベースのrails開発環境、herokuの登録待ち中

ブラウザ上でRailsの開発ができるheroku.com、先ほど登録の申し込みをしました。

ブラウザで Ruby on Rails 開発! Heroku を使ってみよう:
http://webos-goodies.jp/archives/51287729.html

開発したRailsアプリケーションを公開しようとすると、まだまだPHPほどにはホスティング環境が整備されておらず少し面倒なのですが、herokuの場合は開発環境のみでなく実行環境も用意されるのがすばらしいです。


ただ、すぐに使えるかと思ったら、手作業による登録なのか、使えるまでしばらく時間がかかるそうです。"Average wait: 2 days"とのこと。

上記記事で紹介されてから、日本からの申し込みが殺到しているらしいです。数時間のうちに数百件のjpドメインのメールアドレスから登録申し込みがあったとblogに書かれています。

We're Huge in Japan:
http://blog.heroku.com/archives/2008/2/5/were_huge_in_japan/


Railsアプリケーションは比較的メモリを消費しますが、いったいどんなインフラで大量のユーザーをまかなっているのか興味深いです。
ラベル:heroku Rails
posted by maeda at 13:00| 島根 ☀| Comment(0) | TrackBack(0) | ソフトウェア | このブログの読者になる | 更新情報をチェックする

2008年02月06日

session濫用禁止

webアプリケーションの初心者がRailsを使うと、妙にsessionを多用したコーディングをします。なぜだろうとずっと思ってましたが、今日思い知りました。

sessionって、プログラミング初心者が大好きなグローバル変数そのものなんですね(気づくの遅すぎ)。グローバル変数と同じく、どこからでもところかまわず値の読み書きが可能。そして、グローバル変数と同じく、どこで参照されるかわからないからメンテしにくい。

無用なsessionをRailsプロジェクトから消していくのは、なんだか爆弾処理班になった気分です。

Railsでコーディングさせる前に、最初に「session濫用禁止」を理解させておくべき。
ラベル:Rails
posted by maeda at 21:52| 島根 ☁| Comment(0) | TrackBack(0) | ソフトウェア | このブログの読者になる | 更新情報をチェックする

2008年02月05日

DelphiでShiftJIS文字列をutf8に変換する

UTF8Encodeを使う。

Utf8Text := UTF8Encode(SjisText));

UTF8Encode関数は引数としてWideStringを要求するが、通常のStringを渡せば自動変換される。したがって、明示的にキャストを行う必要はない。

なお、ShiftJIS文字列をUnicode文字列に変換するには、WideString型の変数に代入すればよい。
ラベル:Delphi
posted by maeda at 20:18| 島根 ☁| Comment(0) | TrackBack(0) | ソフトウェア | このブログの読者になる | 更新情報をチェックする

広告


この広告は60日以上更新がないブログに表示がされております。

以下のいずれかの方法で非表示にすることが可能です。

・記事の投稿、編集をおこなう
・マイブログの【設定】 > 【広告設定】 より、「60日間更新が無い場合」 の 「広告を表示しない」にチェックを入れて保存する。


×

この広告は1年以上新しい記事の投稿がないブログに表示されております。