今日はサイト内遷移表示のバグ取り.
こないだ書いたコード"をよくよく見てみると,
trace.sort.each{|ip, value|
(略)
と書いてるくせに,中でもらっている変数がlineになっていた.これがおかしい元凶であるような気がする.
それで,書き換えてみた.書き換えの際,また繰り返すのがこの部分で,計算も繰り返しでする部分があって,1回目だけ通るのがここで,等と考えているうちにまた訳が分からなくなる.
それと,ハッシュのハッシュを配列のハッシュにしたので,その部分も書き換え.それと,無視するファイルも文末一致で除く物と,文中どこであれ除く物とに増やしたので,書き換えている.
#ページ内遷移表示関数
#IPアドレス順に並び替えて,requestしたファイルを表示する.
def trace_view(file)
header_out("ページ内遷移")
logfile = open(file)
ignore = Regexp.new("#{IGNORE_FILE_END}$|#{IGNORE_FILE}")
#必要な行をとりあえずハッシュに保持
trace = Hash.new
while logline = logfile.gets
line = Accesslog.new(logline)
#無視するファイルは処理しない
unless ignore =~ line.requestURI
#必要行lineをtrace[ip]に入れていく.
#traceはハッシュで,{Key => Array}.
unless trace.key?(line.ip)
trace[line.ip] = Array.new
end
#行を保持
trace[line.ip] << line
end
end
#得られた行を表示
trace.each{|ip, value|
print "<h3> " + ip + "</h3> \n"
value.each_with_index{|line, i|
if i == 0
print "<h4> #{line.user_agent}</h4> \n"
print "<ol> \n"
end
t_last = Time.mktime(line.year, line.month, line.day, line.hour, line.minute, line.second)
unless i == 0
period = conv_sec(t_last - $t_prev)
print "<br> \n↓<br> \n↓ #{period}<br> \n↓</li> \n"
end
$t_prev = t_last #t_prevに前の時間を保持
print "<li> "
print "#{line.requestURI}(#{line.month}月#{line.day}日"
print "#{line.hour}時#{line.minute}分#{line.second}秒)"
}
print "</li> \n"
print "</ol> \n"
}
footer_out() #フッタ表示
end
conv_secは,引数にもらった数を秒数として,○時間○分○秒という文字列を返すメソッド.
# 秒数を引数にもらって,(秒,分,時)という配列を返す.
# 秒数によって,配列の長さは変わる.
TIME_CONV = [ 60, 60 ]
#助数詞
TIME_AN = [ "秒", "分", "時間" ]
def conv_sec(num)
t = Array.new
fmt_time = ""
t[0] = num.to_i
TIME_CONV.each{|s|
if t[-1] < s
break
else
t << t[-1] / s
t[-2] = t[-2] % s
end
}
t.each_with_index{|an, i|
fmt_time = an.to_s + TIME_AN[i] + fmt_time
}
return fmt_time
end
かえって分かりにくくなったかなあ.もし,日とか月とかに拡張するときも配列定数に書き加えるだけでいいかなあと思ったんだけど.
ちなみに,表示結果はこんな具合.うまくいっているような気はする.
今度はロボットのアクセスを分けてみよっと.