collect.rb 出力の差分

クライアントPC の入れ替えに連動して、hosi.org サーバの冗長系も
入れ替えようとしていますが、Bookmarks 収集でどれくらい違いが
発生するかを確認しようとして、入れ替え前のサーバと入れ替え後の
サーバで、FESS で収集した記事を HTML 形式でファイルに書き出す
collect.rb の出力の違いを可視化するスクリプトを書いてみました。

ところが書いてみると、ほぼ同じスクリプトが、先(々)週分と今週分の
collect.rb の出力の違いを可視化するのにも使える!

一度収集して採用しなかった URL は採用しないという判断済なので、
最新の収集で再度拾っても採用することはありません。よって、新規の
判断は先(々)週分と今週分の collect.rb の出力の差分のみに着目すれば、
判断が効率化できます。

そのロジックを書き出してみると、

 # 1記事をハッシュに記憶するメソッド
 def html2hash(hash, path)
  open(path, 'r', &:read).each_line do |line|
   next unless /(20..-.+?) <a href='(.+?)' target='_blank'>(.+?)<\/a>/ =~ line
   hash[$2] = [$1,$3] # URL => [収集日時, 記事名]
  end
 end
 
 # 過去と新規の collect.rb 出力全体をそれぞれハッシュに記憶
 now = Time.now
 new_bookmarks = {}
 old_bookmarks = {}
 Dir.glob(['20*.html','_20*.html']) do |path| # '20*','_20*' は夫々過去と新規の collect.rb 出力
  next if (now - File::Stat.new(path).mtime) > 15 * 86400.0 # 過去の出力は直近15日以内のみ
  html2hash(path =~ /^_/ ? new_bookmarks : old_bookmarks, path)
 end
 
 # 新規出力にあって過去出力にない記事のみをリストアップ
 list = []
 titles = new_bookmarks.keys.reject {|key|
  old_bookmarks.key?(key)
 }.sort_by {|key| new_bookmarks[key][1]}
 titles.each_with_index do |key, count|
  list << ("(#{'%03d' % (count+1)}) #{new_bookmarks[key][0]} <a href='#{key}' " +
      "target='_blank'>#{new_bookmarks[key][1].chomp}</a>")
 end
 
 # 結果を書き出し
 puts HTML % list.join("<br/>\n") # 文字列 HTML は collect.rb のものと同じ


くらいの簡単なスクリプトで済む。

これで少し作業が楽になればよいのですが…

この記事へのコメント