2006-08-22 (Tue)
■ ボクならこう書く 
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 クラスがあるっぽい事がわかって急遽そっちに移行。つか refe で Mail を調べると「シンプルなメールクラス」とかって解説が出て来ていかにも使えそうな感じを出してるのに 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 => *********************************************************************