[img_assist|nid=775|title=Yen-Bahtsグラフ|desc=もちろんUbuntuサーバでもRailsは動作します。 Macからアクセスして表示できました。|link=node|align=left|width=320|height=275]
なんだか仕事が忙しくて時間がとりにくい中、Ruby on Rails3.0β版をN900にインストールしてみた。
Rails3.0β版はRuby1.9系に対応しているとリリースノートに書かれていたが、あいにくN900には1.9系のパッケージはなく、セルフビルドしてみた結果は“make test”でNGがたくさん検出される有様。パッケージとして提供されている1.87系で動作させることにした。
N900でもリリースノートに書かれている手順に従えば、問題なくインストールできました。ただ、eMMCへのインストールは非常に遅く、晩にインストールを開始し、そのまま一睡したのでした。
どうもeMMCへの書き込みは遅いですね。何がボトルネックになっているのだろうか…
[img_assist|nid=774|title=Yen-Bahtsグラフ|desc=Rails3.0β版でバーツ−円の為替レートをグラフ表示するソフトを作ってみました。|link=node|align=left|width=320|height=192]
Rails標準のHTTPサーバ“Webrick”は遅く、N900では更に顕著なため、
“thin”をインストール。
また、WEBページの解析には、“nokogiri”を使用することにした。
かつては“hpricot”を使っていたがRuby1.9系ではうまく動かない状態が続い
ていたこと、nokogiriはhpricotと互換性があり1.9系でも動作するとのことだっ
たため、nokogiriを選択した次第。
インストールした結果は以下。
芋づる式にインストールされたことなどから沢山のパッケージがインストール
されました。
abstract (1.0.0)
actionmailer (3.0.0.beta)
actionpack (3.0.0.beta)
activemodel (3.0.0.beta)
activerecord (3.0.0.beta)
activeresource (3.0.0.beta)
activesupport (3.0.0.beta, 2.3.5)
arel (0.2.pre)
builder (2.1.2)
bundler (0.9.7)
cgi_multipart_eof_fix (2.5.0)
daemons (1.0.10)
erubis (2.6.5)
eventmachine (0.12.10)
fastthread (1.0.7)
gem_plugin (0.2.3)
i18n (0.3.3)
mail (2.1.2)
memcache-client (1.7.8)
mime-types (1.16)
mongrel (1.1.5)
nokogiri (1.4.1)
rack (1.1.0)
rack-mount (0.6.0, 0.4.0)
rack-test (0.5.3)
rails (3.0.0.beta)
railties (3.0.0.beta)
rake (0.8.7)
sqlite3-ruby (1.2.5)
text-format (1.0.0)
text-hyphen (1.0.0)
thin (1.2.7)
thor (0.13.3)
tzinfo (0.3.16)
グラフ表示には [http://pullmonkey.com/projects/open_flash_chart2/ Open Flash Chart II] を使用。
色々情報をあさっている限りではRailsを使う場合はDBへのデータの投入は手動が一般的にも思えるけど、手動で為替レートを入れるのは面倒だしスクレープしてActiveRecordにてDBに書き込むようにした。
スクレープするサイトは http://www.oanda.com を使わせていただくことに。ずいぶん過去に遡ってレートを確認することができること、(厳密にはHTMLコンテンツなのだが、データ部分については)CSVとして出力することもできるため、取り扱いがしやすいのです。
レートの解析は以下のような関数を準備してみる。
require ‘rubygems’
require ‘net/http’
require ‘uri’
require ‘date’
require ‘open-uri’
require ‘nokogiri’
def analyze_currency(from_date, to_date, from_currency, to_currency, format)
doc = Nokogiri::HTML(open(“http://www.oanda.com/convert/fxhistory?date_fmt=us&date=#{to_date}&date1=#{from_date}&exch=#{from_currency}&expr=#{to_cur\
rency}&lang=en&margin_fixed=0&redirected=1&format=#{format}”))
pre=doc/:pre
pre.inner_text.each_line { |line|
line.chomp!
datestr, value = line.split(/\s*,\s*/)
month, day, year = datestr.split(/\s*\/\s*/)
date = Date.new(year.to_i, month.to_i, day.to_i)
yield date, value
}
end
これで解析結果が《日付》《レート》の並びで返却される。
こちらを以下のような関数を使って、指定した期間のレートを保存する。
def save_currency(options)
if options[:from_date].nil? ||
options[:to_date].nil? ||
options[:from_currency].nil? ||
options[:to_currency].nil? ||
options[:format].nil? ||
options[:site_info].nil?
raise ArgumentError, “argument error”
end
from_date = options[:from_date]
to_date = options[:to_date]
from_currency = options[:from_currency]
to_currency = options[:to_currency]
format = options[:format]
site_info = options[:site_info]
##### 30日区切りでデータ取得
date = from_date
while date <= to_date
next_date = date + 30
if next_date > to_date
next_date = to_date
end
puts “processing #{date} – #{next_date} …”
analyze_currency(date, next_date, from_currency, to_currency, format) { |date, value|
puts “date=#{date}, currency=#{value}”
CurrencyInfo.create_or_update( :date => date,
:rate => value.to_f,
:site_info => site_info )
}
date = next_date + 1
end
end
CurrencyInfo.create_or_update()はRailsにてモデルを作成し、そこに追加したメソッドだったりする。
そうそう。
ActiveRecordを使うために、ファイル先頭に以下のような記述をしておくべきみたい。
require ‘rubygems’
gem ‘actionmailer’, ‘3.0.0.beta’
gem ‘actionpack’, ‘3.0.0.beta’
gem ‘activerecord’, ‘3.0.0.beta’
gem ‘activeresource’, ‘3.0.0.beta’
gem ‘activesupport’, ‘3.0.0.beta’
require ‘net/http’
require ‘uri’
require ‘date’
require ‘open-uri’
require ‘nokogiri’
require ‘active_record’
もしかしたら必要ないことまで書いているかもしれない。ひとまず個人用だし、余計な処理が発生することによるロスは考えないことにする。
グラフ表示については、Open Flash Chart IIのページにあるサンプルを参考にすれば良い。
しかし注意すべきことが(少なくとも1つ)あります。それは、view側のHTMLの記述にいて。Rails3.0では以下のように書かなければならない。
<%= raw(@graph) %>
上記で“raw(〜)”とあるのが注意点。これがないと、URLエンコードされてグラフは表示されない。セキュリティの観点からデフォルトでエンコードするようになったみたい。
為替レートを表示するには上記だけでは(Rails側のコードが掲載できていないこともあり)不十分かな。
ちょっと時間がないので今日はこのへんで。万が一要望があるか時間があれば掲載してみます。
しかしまあ、このグラフを見ると、アジア経済危機にドーンとバーツが暴落しているのが分かりますね。