2006-09-25
■ [Ruby] 「たのしいRuby 第2版」の練習問題を解く(4)

(4) 整数numが素数であるかどうかを調べるメソッドprime?(num)を定義してください。なお、素数とは「それ自身と1以外で割ることのできない数」です。1桁の整数のうち、素数となるのは「2,3,5,7」です。
じゃあ、ぼくの答えだよ。まず2の倍数を除外して、次に3以上の奇数で順番に割って、割り切れるかどうかを確認しているよ。numが素数かどうかの判定は、sqrt(num)よりも小さい整数まで確認すればいいんだったよね。
include Math def prime?(num) if num < 2 false elsif num == 2 true elsif num % 2 == 0 false else catch(:exit) { 3.step(sqrt(num).to_i,2){|i| throw(:exit,false) if num % i == 0 } true } end end
解答例と比較してみると‥‥。うん、大体考え方は同じだね。
■ [Ruby] RubyのRSSライブラリ

RubyのRSSライブラリを使ってみるよ。
RSS::Parser.parseメソッドを使うと、引数で指定したXMLファイルをパースしてオブジェクトとして抽象化することができるよ。あとはそのオブジェクトから必要な要素を好きなように取り出せば、RubyでいろいろなRSSを料理して楽しめるよ。
じゃあ、「はてなブックマーク」の「注目のエントリー」のRSSをパースして、タイトルとURLを表示させてみるよ(Windowsのコマンドプロンプトで表示することを前提に、tosjisしているよ)。
require 'open-uri' require 'rss/1.0' require 'kconv' # http_proxy = 'http://プロキシサーバ名:ポート番号/' http_proxy = nil filename = 'http://b.hatena.ne.jp/entrylist?mode=rss&sort=hot&threshold=3' rss = open(filename, {:proxy => http_proxy}) {|file| RSS::Parser.parse(file) } rss.items.each{|item| puts item.title.tosjis puts item.link puts }
すごく簡単にRSSを扱うことができるね。ほかにもdateを自動的にTimeオブジェクトにしてくれたり、RSSを出力したりとか色々な機能があるようだよ。詳しくは使い方を見てね。
■ [Ruby][SQL] ActiveRecordで「SQL書き方ドリル」(2)

きょうは「第2章 ひとつのテーブルを扱う」の「その2 複数の列を指定する」をやってみるよ。
ある日、あなたは上司に頼まれました。
「今、うちの会社が扱っている商品の名前と単価を一覧で全部出してくれ」
データベースの中には商品テーブルがあります。商品テーブルの名前はProductsです。商品テーブルの中に、商品名はProductNameという列が、単価はPriceという列があります。さて、どのようにすればよいでしょうか。
まずはActiveRecord::Baseを使ってO/Rマッピングをするよ。今回対象となるテーブルは「Products」で、そのテーブルの主キーは「ProductID」だから、
class Product < ActiveRecord::Base set_primary_key :ProductID set_table_name :Products end
とすればよさそうだね。今回も前回同様、クラス名「Product」に対応するテーブル名が「Products」と複数形だから、ActiveRecordの規約に従っているので省略できるよ。
class Product < ActiveRecord::Base set_primary_key :ProductID end
O/Rマッピングができたら、あとはfind(:all)メソッドを使って、ProductNameに相当するメソッドproductnameと、Priceに相当するメソッドpriceを使って取り出してあげればいいんだね。
class Product < ActiveRecord::Base
set_primary_key :ProductID
end
Product.find(:all).each {|item|
puts "#{item.productname} #{item.price}"
}
あとはActiveRecordを使うためのおまじない(データベースへのアクセスに関する部分)を追記してあげれば完成だね。
require 'rubygems'
require 'active_record'
ActiveRecord::Base.establish_connection(
:adapter => 'postgresql',
:host => 'localhost',
:username => 'sql_training',
:password => '(設定したパスワード)',
:database => 'nyanko'
)
class Product < ActiveRecord::Base
set_primary_key :ProductID
end
Product.find(:all).each {|item|
puts "#{item.productname} #{item.price}"
}
printfを使って、行を固定したほうがいいかな?
Product.find(:all).each {|item|
printf "%-24s %12d\n", item.productname, item.price
}
"Shift_JIS"はdowncase.gsub(/-/, "_")で正規化されるので"shift-jis"とかでもOKです.お薦めしませんが.
RSSオブジェクトには、output_encodingというインスタンス変数があるのですね。ありがとうございます!