analyze.rb
#! ruby -Ks

#**********************************************************#
#
#  ロリポウェブサーバ ログ解析
#
#    【2006/1/31 更新】
#
#**********************************************************#

#**********#
#  下準備  #
#**********#

require 'shellwords'
require 'cgi'
require 'kconv'

require 'lolipopaccesslog.rb'

#  結果出力用HTMLファイル名
NAME_HTML = 'result.html'


#  リクエストファイル名ごとのアクセス数付き検索語句リストのHTMLを生成
def get_wordslist_per_file(files_and_searchwords)
  html     = "<p><b>検索語句</b></p>\n"
  filename = ''
  words    = ''
  cnt      = 0

  #  リクエストファイル名でソート
  files_and_searchwords = files_and_searchwords.sort { |a,b| a[0]<=>b[0] }

  files_and_searchwords.each do |record|
    if record[0] != filename		#  新しいリクエストファイル名
      if words != ''			#  既に検索語句のカウントが始まっていれば
        html  += "    #{cnt}: " + words + "<br>\n"
        words =  ''
        cnt   =  0
      end

      filename  =    record[0]
      html  +=  '  ' + record[0] + "<br>\n"
    end
    
    if record[1] != words			#  新しい検索語句
      if words != ''			#  既に検索語句のカウントが始まっていれば
        html += "    #{cnt}: " + words + "<br>\n"
        cnt  =  0
      end
      words = record[1]
    end
    cnt += 1
  end
  
  if words != ''				#  1度でも検索語句のカウントが行われていれば
    html += "    #{cnt}: " + words + "<br>\n"
  end
  
  html
end


#  結果出力用HTML
$html = "<html><body>\n<p><font size=+1><b>【【 ロリポウェブサーバ ログ解析結果 】】</b></font></p>\n"
ARGV.sort!
$html += "<p>#{ARGV[0]} 〜 #{ARGV.last}</p>\n"  #  処理対象期間

#****************#
#  ログ読み込み  #
#****************#

log = LolipopAccessLog.new(ARGF.readlines())

#**************************#
#  ユニークホスト数を取得  #
#**************************#

$html += "<p><b>【 ユニークホスト数 】</b>: #{log.count_uniqhost}</p>\n"

#************************#
#  検索エンジン関連統計  #
#************************#

$html += "<p><b>【 検索エンジン関連 】</b></p>\n"

#  Google  #

$html += "<p><b>[ Google ]</b> 総アクセス数: #{log.count_access_from_se(LolipopAccessLog::SE_GGL)}"
$html += " / ユニークホスト: #{log.count_uniqhost_from_se(LolipopAccessLog::SE_GGL)}</p>\n"
#  レコードごとのリクエストファイル名と検索語句を抽出
files_and_searchwords = log.get_files_and_searchwords(LolipopAccessLog::SE_GGL)
#  リクエストファイル名ごとのアクセス数付き検索語句リストのHTMLを生成
$html += get_wordslist_per_file(files_and_searchwords)


#  Yahoo  #

$html += "<p><b>[ Yahoo ]</b> 総アクセス数: #{log.count_access_from_se(LolipopAccessLog::SE_YAH)}"
$html += " / ユニークホスト: #{log.count_uniqhost_from_se(LolipopAccessLog::SE_YAH)}</p>\n"
#  レコードごとのリクエストファイル名と検索語句を抽出
files_and_searchwords = log.get_files_and_searchwords(LolipopAccessLog::SE_YAH)
#  リクエストファイル名ごとのアクセス数付き検索語句リストのHTMLを生成
$html += get_wordslist_per_file(files_and_searchwords)


#  msn  #

$html += "<p><b>[ msn ]</b> 総アクセス数: #{log.count_access_from_se(LolipopAccessLog::SE_MSN)}"
$html += " / ユニークホスト: #{log.count_uniqhost_from_se(LolipopAccessLog::SE_MSN)}</p>\n"
#  レコードごとのリクエストファイル名と検索語句を抽出
files_and_searchwords = log.get_files_and_searchwords(LolipopAccessLog::SE_MSN)
#  リクエストファイル名ごとのアクセス数付き検索語句リストのHTMLを生成
$html += get_wordslist_per_file(files_and_searchwords)

#****************************************************#
#  HTMLデータを完成させて、保存して、ブラウザで開く  #
#****************************************************#

$html += "</body></html>"
File.open(NAME_HTML,"w") do |f|
  f.puts($html)
end
exec("start #{NAME_HTML}")
exit