Hatena::Grouprubyist

Rubyを勉強しようと思ってはじめた日記

2008-04-27

SQLで集計してランキングを出す(0)

| 20:24 | SQLで集計してランキングを出す(0) - Rubyを勉強しようと思ってはじめた日記 を含むブックマーク はてなブックマーク - SQLで集計してランキングを出す(0) - Rubyを勉強しようと思ってはじめた日記 SQLで集計してランキングを出す(0) - Rubyを勉強しようと思ってはじめた日記 のブックマークコメント

書いてから思ったんですが、SQLというかデーターベースに疎いのでSQLでどうやったら集計できるのか?から調べることになりそうです。いいお勉強になりそうです。

参考

Rubyでアクセス解析をする(0.73)課題

| 19:58 | Rubyでアクセス解析をする(0.73)課題 - Rubyを勉強しようと思ってはじめた日記 を含むブックマーク はてなブックマーク - Rubyでアクセス解析をする(0.73)課題 - Rubyを勉強しようと思ってはじめた日記 Rubyでアクセス解析をする(0.73)課題 - Rubyを勉強しようと思ってはじめた日記 のブックマークコメント

Apacheのログファイルの内容をMySQLに登録することは出来ました。ということで、次の課題。

課題を思いついたのですが、とくにランキングは欲しい機能です。これを先にやらないと!

UTF8の文字列がログにありそこがエンコードされたままで記録されている

ログにUTF8の文字列があります。この文字列は、エンコードされた状態になっているのでこれをデコードしたい

ランキングを出したい

Rubyでアクセス解析をする(0.72)例外処理を加えてみる

| 18:56 | Rubyでアクセス解析をする(0.72)例外処理を加えてみる - Rubyを勉強しようと思ってはじめた日記 を含むブックマーク はてなブックマーク - Rubyでアクセス解析をする(0.72)例外処理を加えてみる - Rubyを勉強しようと思ってはじめた日記 Rubyでアクセス解析をする(0.72)例外処理を加えてみる - Rubyを勉強しようと思ってはじめた日記 のブックマークコメント

例外処理を加えてみて、エラーの内容を明確にしてみようと思いました。

例外処理を付け加えてみた

while text = logs.gets do
/^([^ ]*) ([^ ]*) ([^ ]*) \[([^]]*)\] "([^ ]*)(?: *([^ ]*) *([^ ]*))?" ([^ ]*) ([^ ]*) "(.*?)" "(.*?)"/u =~ text
    begin
    entry = Entrys.new
        entry.url = $6
        entry.ref = $10
        entry.ua  = $11
        /^(.*)\/(.*)\/(.*):(.*):(.*):(.*) \+0900/ =~ $4
        at_time = Time.local($3, montn_array[$2], $1, $4, $5, $6)
        entry.access_date = at_time
    entry.save
    rescue => ex
        print ex,' : ',text
    end
end
logs.close

するとエラー内容が判明しました。エラーが発生しなかった部分については、きちんと、MySQLに登録されてました。

エラー内容

ruby setup.rb 
no implicit conversion from nil to integer : 219.109.216.3 - - [30/Mar/2008:08:21:12 +0900] "GET /tag/\x93n\x95\xd3 \x89p\x8bP HTTP/1.0" 200 16201 "-" "NetTracker/7.5 Enterprise"
no implicit conversion from nil to integer : 219.109.216.3 - - [30/Mar/2008:08:21:17 +0900] "GET /tag/TEAM NACS HTTP/1.0" 200 16201 "-" "NetTracker/7.5 Enterprise"
no implicit conversion from nil to integer : 219.109.216.3 - - [30/Mar/2008:08:22:52 +0900] "GET /tag/\x8a\x94\x8e\xae\x89\xef\x8e\xd0 \x9a\xe6\x8ei\x8a\xe2 HTTP/1.0" 200 16201 "-" "NetTracker/7.5 Enterprise"
no implicit conversion from nil to integer : 219.109.216.3 - - [30/Mar/2008:08:25:02 +0900] "GET /tag/INFOBAR 2 HTTP/1.0" 200 16201 "-" "NetTracker/7.5 Enterprise"

うん?「NetTracker/7.5 Enterprise」というのがおかしいのかな?とりあえず、エラーの内容がわかりました。原因究明はまた別のときにします(おそらく正規表現で取得できた値が、nilなんだけれど、intに変換できないよ!というエラー)

Rubyでアクセス解析をする(0.71)

| 18:21 | Rubyでアクセス解析をする(0.71) - Rubyを勉強しようと思ってはじめた日記 を含むブックマーク はてなブックマーク - Rubyでアクセス解析をする(0.71) - Rubyを勉強しようと思ってはじめた日記 Rubyでアクセス解析をする(0.71) - Rubyを勉強しようと思ってはじめた日記 のブックマークコメント

昨日、アクセスログをデータベースに登録できました。きちんと登録できたかどうか確かめてみることにしました。

まず、アクセスログのファイルは何行があったのか確認。

$ wc -l access_log 
10827 access_log

10827行。じゃあ、登録できた数は?

mysql> select * from entry;
1548 rows in set (0.07 sec)

うん?かなり少ないです。エラーが出ていたので、そこで処理がとまってしまったようです。そこで一旦登録された情報を削除。

delete from entry

ということで、少し考え直し。

カレンダー
2007 | 12 |
2008 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 09 | 10 | 11 | 12 |
2009 | 06 | 08 |