ということで、やってみることにした。サーバ側でできるか?と思って試行錯誤してみたけれど、なんかNGっぽい。で、アクセスログ(14日分)から作ってみることにした。本来であればXoopsのサイトマップ機能があるのだけど、いくつかHTMLで書いている所もあるので。
なので、ローカルで実行してみることにした。ダウンロード、解凍と進んだら、ついでにpythonもダウンロードすることに。とっととインストール。で、解凍した中に入っているconfig.xmlを編集。中身は英語だけれど、日本語の解説がダウンロードサイトにあるので、それほど難しくはない。
そのままアクセスログを固めている(実は、使っているのはxreaで、ここは5日分のログを保管しておいてくれるのだが、自分でアクセスログを解析するために、ずーっとログを累積しているのだった)ファイルを指定して、さらに自分のサイトを指定する。ファイルの設置場所は同じでよい。ということで、引数を指定して、そのまま実行。なんということもなく終わった。
試しにXMLを開いてみる。なるほど、そういうことになっているのか。FTPでサイトマップのXMLを転送して、そのアドレスをgoogleに通知。アドレス一発で通知できるので、きわめて楽。ということで、数日中に解析結果が反映されることに。なるほどね。
うまいこと、自分のほしい解析結果が出てこない。なら、自分で作ってしまおうとか思ってみたり。Perlで書けば、たぶんできる・・・・かも。とりあえず、アクセス先のファイル名、リターンコード、時刻、サイズという情報と、アクセスもとのドメイン、時刻という情報をそれぞれ分離して、マトリクスにすればいいはず。もっとも、DBを使わず、ということになれば、6つのマトリクスなので、合計で36個の中間ファイルができてしまう、という問題点はあるのだけど。
時間を見つけてやってみるかな。あ、人に使ってもらうことは(今のところ)意識していないので、自分なりのツールになって、人様にお見せできるようになってから公開します。
まずは、使っているサーバがApacheのログをはき出してくれているので、それのフォーマットを調べてみた。スプリッタは半角スペースと言うことがわかったので、アクセスログから半角スペースをカンマに一括置換しで、CSVに拡張子を変えて、表計算ソフトで開いてみた。なるほど。ただし、リクエスト(GETとかPOSTとか)と、クライアント名(たとえばIEとかOperaとか)は、ダブルクオートされているので、表計算ソフトではカンマを区切りとは見てくれなかった。が、それが逆にいい感じ、と言う風に見えなくもない。
今度は、ダブルクオートを一時的に半角のアットマークに置換してみることにする。そうすれば、表計算ソフトはカンマを正しく区切り文字として見てくれるハズだから。置換してみると、もうちょっとよくわかった。なるほど。
今回のログは、以下の順番で区切られていることがわかった。実際にはサーバの設定によってあちこち変わっているかもしれないので、使用するときはログファイルをよく見ておきましょうね。
まずは、半角ダブルクオートで分割。こうすると、クライアントアドレスからタイムゾーンで1つ、メソッドからHTTPバージョンまでで1つ、リターンコードと転送サイズで1つ、リファラで1つ、クライアント名で1つ、というデータができあがる。そのそれぞれを、今度は半角スペースで区切ると言うことになる。そうすれば、データはこんな風に分割されるはずだ。
次に、これを解析しやすいように、中間ファイルに出力しておくことにする。デバグも楽になるはずだし。さらに「何を単位に解析するか」ということについては、★をつけたところをキーにしておく(今回は7つ)。ということで、この7つを、それぞれ中間ファイルに出力しておくことにする(7つも中間ファイルがあることに、違和感を覚える人もいるだろうけど、まぁその辺はご愛敬ということで)。
当然だけど、すべての中間ファイルの「N行目」は、元のログの「N行目」を指しているので、1行単位で読み込んでいけば、当然同じ行の解析ができるはず。
とりあえず、ここまで実装してみることにする。今のところ、拡張性は考えないで、とりあえず動くことを前提として、中間ファイル作成までのソースコード。
つづいて、ランキングの元になるカウンタを取得することになる。配列変数を使えば、カウンタの計測は問題ではないので、これはあっさりと。そして、カウンタを降順に並べるという作業が発生する。これは、リニアに大小関係を比較すればいい。ただ、時刻についてはカウンタをとっても仕方がないので、これはまた別の話。
と、なんとか時刻別のカウンタも作りました。途中、処理順を間違えて四苦八苦していたのは内緒。あとは、ランキング上位のキーワードをキーにして、それぞれカウンタを取得していけばいいから、二重ループを回していけばいいことになる。
ここまで考えて気がついた。出力はHTMLがよい。じゃないと、解析結果がとんでもないことになってしまうことになる。ううむ。格闘40分、なんとかHTML変換を終える。解析結果1つについて、1個のHTMLに。
が、ここに来て2重ループを作らなければならないことに気がついたって、まだやってなかったよ。どうしよ・・・・風呂に入って考えるとするか。
今日は第二回目。
ファイル設計とマトリクス集計の設計書をフリーハンドで書き上げる。オレは本当にSEなのか、と自問自答を繰り広げること約5分。できました。見せないけど。
ということで、あとは実装するだけ・・・なんだけど、ビデオ見なきゃ(と、ここで故障していることを発見)、掃除しなきゃ(と、ここで漂白が必要なことを発見)、メシ食わなきゃ(ということで餅を焼いてみたり)・・・・実装に取りかかったのは夜になってから。
ということで、前回のポイントを整理しましょう。
で、早速2次元解析開始。ネスティングの嵐(いやネスティングの荒らし)。変数がどこに行ったのかよくわからなくなってしまったり。ということで、一応処理ロジックとしては完成した。試しに走行させてみる。
なるほど。ファイル出力はうまくいっている。そう、肝心なロジック部分にバグがあるのか、ヌルデータばっかり!
今日はこれ以上ハマる訳にはいかないので、これにて中断。ソースコード上は、どこにもバグはないのだが・・・・おそらく、シンタックスな問題ではなくて(じゃなかったら、Perlは動かせない)、ロジックとか「お作法」に反しているのだと思うのだが・・・・
ということで、次回の宿題。何も出てこないバグロジックの修正。あとは、引数の渡し方でマトリクスは簡単に作れるのだから。
今後の予定
暇人のプログラムはまだまだ続く。
メールはこちらへ...[sugaken (sugaken @(at) sugaken .(dot) net)]
この日記は、GNSを使用して作成されています。