只今Ruby勉強中

プログラミングRuby―達人プログラマーガイド

うさぎさんと一緒にRubyの勉強をしているオレの記録。

間違ってる所とかいっぱいあると思いますけど、誰でもコメント出来るので気軽に教えて下さい。

普段は 鷹の島 って所で書いてます。

現在のハマリポイント - yield, succ?, Proc & 後で

2006-08-22 (Tue)

ボクならこう書く 00:37  ボクならこう書く - 只今Ruby勉強中 を含むブックマーク

LL Ringブログでやってる「キミならどう書く」シリーズで、何でも良いからグラフを作ってみやがれって言うお題があったのでおもしろそうだからチャレンジしてみました。

そういえば以前、いやな人スパムメールの件数をグラフにしてたなーって思ったので、それをやってみる事にしました。

まぁとりあえずほとんどベタ書きで。

dir = ARGV.to_s

require 'date'
require 'mailread'

class MyMail < Mail
   def header
      MailHeader.new(super)
   end
end

class MailHeader
   def initialize(header)
      @headers = {}
      header.each do |k, v|
         @headers[k.downcase] = v
      end
   end

   def [](attr)
      @headers[attr.downcase]
   end
end

def Dirs(dir)
   lists = []

   Dir.open(dir).each do |file|
      next if file =~ /^\.\./
      next if file =~ /^\.$/
      file = dir + '/' + file

      if FileTest.directory?(file)
         lists = lists + Dirs(file)
      else
         lists.push(file)
      end
   end

   return lists
end

days = {}

lists = Dirs(dir)

lists.each do |file|
   mail = MyMail.new(file.to_s)
   h = mail.header
   begin
      d = Date.parse(h['date'])
   rescue
      print 'error:', file, "\n"
      next
   end
   days[d] = 0 unless days[d]
   days[d] += 1
end

days.sort.each do |k, v|
   print k, ' => ', '*' * v, "\n"
end

まず Mail クラスの存在に気付くのが遅れた。メールの解析用のクラスを作ってたら、標準で Mail クラスがあるっぽい事がわかって急遽そっちに移行。つか refeMail を調べると「シンプルなメールクラス」とかって解説が出て来ていかにも使えそうな感じを出してるのに mailread の事がどこにも書いてなくて結局ぐぐってしまった。なんか良い調べ方はあるんでしょうか?後半の Date クラスも require するファイル名はぐぐって調べたし。まだこの辺の調査にすごく時間がかかる。

Mail クラスがヘッダの読み込みで大文字と小文字を区別してるみたいだったので、その辺の差位を吸収出来るような MyMail クラスってのを作ってみました。@headers をもうちょっと綺麗に生成したい所。 → あとで調べる → これで十分ぽい。

ファイルリストを読み込む Dirs の配列の処理ではまった。最初 lists.push(Dirs(file)) で配列を合体させていたつもりだったんだけど、これが駄目って事になかなか気付けなかった。ていうかそもそもファイルリストをゲットしてくれるクラスとかありそうな予感。→ あとで調べる → 調べた

Date.parse が失敗した時の処理方法をうまくやる方法がわからなかった。メールじゃないファイルもいくつか入ってるので、そこでエラーになっちゃう。ひとまず例外の捕捉とかを試してみた。あ、h['date'] が失敗したら next すりゃいいのか…。

そんで、実行結果のうちから7月分だけ出して来た。

2006-07-01 => **********************************************************
2006-07-02 => ***********************************************************
2006-07-03 => ********************************************************
2006-07-04 => ************************************************************************
2006-07-05 => *******************************************************
2006-07-06 => ***************************************************************
2006-07-07 => ***********************************************
2006-07-08 => ****************************************************
2006-07-09 => *********************************************************
2006-07-10 => **************************************
2006-07-11 => ****************************************************
2006-07-12 => ***************************************************************
2006-07-13 => ************************************************************************************************
2006-07-14 => *******************************************************************************
2006-07-15 => ***************************************************************************
2006-07-16 => **************************************************************************
2006-07-17 => ********************************************************************
2006-07-18 => ***********************************************************************
2006-07-19 => *********************************************************************************************
2006-07-20 => ************************************************************************
2006-07-21 => ***********************************************************************************
2006-07-22 => ******************************************************************************
2006-07-23 => *****************************************************************************
2006-07-24 => ***********************************************************************************************************
2006-07-25 => *************************************************************************
2006-07-26 => *************************************************************************************
2006-07-27 => ***************************************************************
2006-07-28 => ***************************************************************
2006-07-29 => *************************************************************************
2006-07-30 => *****************************************************************
2006-07-31 => *********************************************************************
トラックバック - http://rubyist.g.hatena.ne.jp/gaba/20060822