バリケンのRuby日記 RSSフィード

2006-09-25

[] 「たのしいRuby 第2版」の練習問題を解く(4)  「たのしいRuby 第2版」の練習問題を解く(4) - バリケンのRuby日記 を含むブックマーク はてなブックマーク -  「たのしいRuby 第2版」の練習問題を解く(4) - バリケンのRuby日記  「たのしいRuby 第2版」の練習問題を解く(4) - バリケンのRuby日記 のブックマークコメント

(4) 整数numが素数であるかどうかを調べるメソッドprime?(num)を定義してください。なお、素数とは「それ自身と1以外で割ることのできない数」です。1桁の整数のうち、素数となるのは「2,3,5,7」です。

たのしいRuby 第2版

じゃあ、ぼくの答えだよ。まず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

解答例と比較してみると‥‥。うん、大体考え方は同じだね。

[] RubyRSSライブラリ  RubyのRSSライブラリ - バリケンのRuby日記 を含むブックマーク はてなブックマーク -  RubyのRSSライブラリ - バリケンのRuby日記  RubyのRSSライブラリ - バリケンのRuby日記 のブックマークコメント

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を出力したりとか色々な機能があるようだよ。詳しくは使い方を見てね。

[][] ActiveRecordで「SQL書き方ドリル」(2)  ActiveRecordで「SQL書き方ドリル」(2) - バリケンのRuby日記 を含むブックマーク はてなブックマーク -  ActiveRecordで「SQL書き方ドリル」(2) - バリケンのRuby日記  ActiveRecordで「SQL書き方ドリル」(2) - バリケンのRuby日記 のブックマークコメント

きょうは「第2章 ひとつのテーブルを扱う」の「その2 複数の列を指定する」をやってみるよ。

ある日、あなたは上司に頼まれました。

「今、うちの会社が扱っている商品の名前と単価を一覧で全部出してくれ」

データベースの中には商品テーブルがあります。商品テーブルの名前はProductsです。商品テーブルの中に、商品名はProductNameという列が、単価はPriceという列があります。さて、どのようにすればよいでしょうか。

すらすらと手が動くようになるSQL書き方ドリル

まずは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
}

koukou2006/09/30 14:34rss.output_encoding = "Shift_JIS"と入れておくとto_sjisは必要なくなります.

"Shift_JIS"はdowncase.gsub(/-/, "_")で正規化されるので"shift-jis"とかでもOKです.お薦めしませんが.

muscovyduckmuscovyduck2006/09/30 23:47kouさん>
RSSオブジェクトには、output_encodingというインスタンス変数があるのですね。ありがとうございます!