ページ内をどんな風に移動しているか表示することを考える.
欲しいのは,htmlを見に来た記録だから,以前作った生ログ表示と同じ条件で行を省く.その後の行の保持はエラーログ表示と似たような動作だ.1つのファイルの閲覧時間も把握できるといいから,次のファイルへのアクセス時間から前のファイルへのアクセス時間を引いて表示させることとする.
#ページ内遷移表示関数
#IPアドレス順に並び替えて,requestしたファイルを表示する.
def trace_view(file)
header_out("ページ内遷移")
logfile = open(file)
ignore = Regexp.new(IGNORE_FILE + "$")
#必要な行をとりあえずハッシュに保持
trace = Hash.new
trace_count = Hash.new
while logline = logfile.gets
line = Accesslog.new(logline)
unless ignore =~ line.requestURI #無視するファイルは処理しない
#必要行lineをtrace[ip][trace_count[ip]に入れていく.
save_line(trace, trace_count, line.ip, line)
end
end
#得られた行を並べ替えて表示
trace.sort.each{|ip, value|
print "<h3>" + ip + "</h3>\n"
print "<h4>" + line.user_agent + "</h4>\n"
print "<ol>\n"
access_time = Array.new
trace[ip].sort.each{|count, line|
access_time[count] = Time.mktime(line.year, line.month, line.day, line.hour, line.minute, line.second)
unless count == 1
period = access_time[count] - access_time[count - 1]
if period >= 60
minute = period.divmod(60)
print "<br>\n↓<br>\n↓ " + minute[0].to_i.to_s + "分"
print minute[1].to_i.to_s + "秒<br>\n↓</li>\n"
else
print "<br>\n↓<br>\n↓ " + period.to_s + "秒<br>\n↓</li>\n"
end
end
print "<li>" + line.requestURI
print "(#{line.month}月#{line.day}日"
print "#{line.hour}時#{line.minute}分#{line.second}秒)"
}
print "</li>\n"
print "</ol>\n"
}
footer_out() #フッタ表示
end
save_lineは新たに作った関数で,引数に4つ取る.これは,前に作ったエラーログ表示部と共通で使う.
#必要行を保持する関数
#第1引数,第2引数はハッシュで,2つ揃ってハッシュのハッシュを作り,
#lineを保持する.
#termは,保存するときのハッシュのキーになる
def save_line(saver, saver_count, term, line)
unless saver.key?(term)
saver[term] = Hash.new
saver_count[term] = 0
end
saver_count[term] += 1 #ステータスエラーのカウンター
#ステータスエラーの行を保持
saver[term][saver_count[term]] = line
end
ありゃ?UserAgentがずれてないか?
表示を自分好みにする段階で,最初にこなければ行けないタグがどれで,くれ返さなければいけないのがどこで――と考えているうちに訳が分からなくなった.……美しくないなあ.
あと,秒数から分+秒の表記にするのがうまいこといっていない.これぐらい,メソッドありそうなんだけど,どんなもんだろ.
それに,ロボットの遷移と人の遷移は処理分けたいよなあ.