2010-03-16 :-(
_ 朝ッ
0530 起床
_ 仕事
0830 出勤
_ [Ruby][コードリーディング][がらくた][高林哲]がらくたを読む find-inactive-ml
http://0xcc.net/attic/find-inactive-ml
- N日以上メールが流れていないメーリングリストを抽出する
- メールは MailDir 形式で格納していること
だと思う。たぶん。
Ruby のプログラム。読んでいく。
if ARGV.empty? puts "Usage: find-inactive-ml [-d num] <directory>..." exit 0 end
プログラムへの引数が何も無かったら Usage を印字して終了。-d は N日を指定する。
ndays = 100
N日はデフォルトでは 100 日とする。つまり -d を指定しない場合は、100 日以上メールが流れていないメーリングリストを抽出することになる。
parser = GetoptLong.new parser.set_options(['--days', '-d', GetoptLong::REQUIRED_ARGUMENT]) parser.each_option {|name, arg| if name == "--days" ndays = arg.to_i end }
ここはオプションを解析している。GetoptLong を使用すると GNU getopt_long のようにオプションを指定できるようになる。
最後のコード片を見る。
now = Time.now ARGV.each {|dir| last = Time.at(0) ## 起算時を取得 Dir.new(dir).each {|file| fullpath = File.join(dir, file) ## ディレクトリ名とファイル名を連結 next unless File.file?(fullpath) ## ファイルでなければ無視 last = [last, File.mtime(fullpath)].max ## より新しい mtime を取得 } if (now - last) > 86400 * ndays # no mail received for last n days puts dir end }
ようするに指定したディレクトリの中で最も新しいファイル( メールのこと )を探し、そのファイルの mtime が N日以上であるかどうかを調べている。
面白かったのは 2 つ。
last = Time.at(0)
これははようするに変数を 1970 年 1 月 1 日で初期化している。irb してみる。
irb(main):003:0> Time.at(0) => Thu Jan 01 09:00:00 +0900 1970
たんに last = 0 でも良いような気がするけど、意味を考えるとやはり「もっとも最初の日付」で初期化するほうがいいんだろう。 あとで Time オブジェクトとして比較などするから Time.at(0) にしてるのか。
もうひとつ面白かったのはここ。
last = [last, File.mtime(fullpath)].max
2 つの値のうち大きいほうを求めている。無名の配列( と言っていいのか? )を作り、max メソッドを呼び出している。こういう書き方もできるんだねえ。
_ 【限定復刻盤】FINAL FANTASY Finest Box
( via Nonsense Zone )
交換のためにはスクエニメンバーズポイント 1500 必要。
私が持ってるのは 2300 くらいあったので交換した。