web拍手の改造リクエストをいただいた。保存されているメッセージを一覧で表示したいというものであったが、それをするにはどうしたらよいものか。まあ、単純に保存されているデータを全て返す関数をひとつ用意してやればいいだけなんだが、それも芸がないなあ。と、しばらく考えた末に、芸がなくてもいいから解決してしまうのが先決だと思うようになった。
よって、久々のweb拍手改造。あんまりに久しぶりすぎて、以前どうやって書いてたか思い出せなくて、困ってる。
web拍手は、GETメソッドで渡されたパラメータに基づいて、ログやメッセージを表示する日付を決定している。GETメソッドというのは、例えばkaiseki.cgiの後ろに付けられた文字列、kaiseki.cgi?&0というようなものだ。これが0の場合は、0日前のログとメッセージを表示する。5なら5日前を表示するという仕組みになっている。
といったわけで、ここにallという文字列がきた場合に全てのログとメッセージを表示するようにしよう。具体的なやり方は以下のとおり。なお、改造対象となるファイルは、kaiseki.cgi、これだけだ。
今回の改造は、書き換える箇所が結構多い。なので、気をつけて作業していただきたい。改造箇所を示す行数は、例によって無改造のweb拍手のファイルに基づいたものなので、改造済みのものは場所が違ってくる。改造箇所の前後の行を引用するので、確認しながら作業いただきたい。
42行目に以下を加える。
#---------解析用データ抽出
& makelog;
& makemes;
if ($logday eq 'all') {
&makelogall;
&makemesall;
}
変数$logdayにallという文字列がセットされていた場合、関数makelogallと関数makemesallを実行する、という処理だ。関数は最後に追加するのでここでは考えない。
82行目を書き換える。
#----------------------HTML表示
$title = "web拍手解析";
&header;
print '<body>';
print "<center>\n";
if ($logday eq 'all') {
print "過去14日間のweb拍手解析";
} else {
print "$tomon月$today日のweb拍手解析<br><br>\n";
}
これは、別に変更する必要のない部分でもあるのだが、これをやっとかないと全メッセージを表示しているのに、日付は今日が表示されるという、ちょっとおかしなことになってしまう。でも、気にしないというのもひとつの見識だ。
115行目を書き換える。
#----------------------メッセージ表示
if ($logday eq 'all') {
print "過去14日間に送られたメッセージ<br>\n";
} else {
print "今日送られたメッセージ<br>\n";
}
print "<table border>\n";
ここも、考え方としては、82行目と同じだ。
122行目に追加する。
for ($i=0 ; $i<=$#mes ; $i++){
($mesday,$meshour,$message) = split(/<>/,$mes[$i]);
if ($logday eq 'all') {
print "<td><p align=\"right\">$mesday</p></td>\n";
}
print "<td><p align=\"right\">$meshour時</p></td>\n";
print "<td>$message</td><tr>\n\n";
$sousinmessage = "$sousinmessage\n$message";
}
これは、メッセージのポストされた日付(年月日)を表示させるためのものだ。これをしておかないと、何日に寄せられたコメントかわからない。
168行目を変更する。
print "</table>\n";
print "<p>[<a href=\"$base?$pass&all\">全てのログ / メッセージ</a>]</p>";
#------------------著作権表示、公式サイトへのリンク(削除不可)
この変更は、全メッセージを表示させるためのリンクを用意するためのもの。これを書くことで、全てのログ / メッセージという文字列のリンクが表示されるようになる。リンク文字列を変更したい場合は、a要素の中身を書き換えよう。
215行目に次の関数を追加する。メッセージ抽出とあるコメントを目印にして、その直前に入れるといいだろう。
sub makelogall {
&lockon; #====ロック開始
open(IN,"$logfile");
@logs = <IN>;
close(IN);
&lockoff; #=================ロック終了
@logall = (0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
$logtotalall = 0;
for ($i=0 ; $i <= $#logs ; $i++){
($logdate,$logtotal,$log[0],$log[1],$log[2],$log[3],$log[4],$log[5],$log[6],$log[7],$log[8],$log[9],$log[10],$log[11],$log[12]
,$log[13],$log[14],$log[15],$log[16],$log[17],$log[18],$log[19],$log[20],$log[21],$log[22],$log[23])
= split(/<>/,$logs[$i]);
$logtotalall += $logtotal;
for ($j = 0; $j <= $#log; $j++) {
$logall[$j] += $log[$j];
}
}
$logtotal = $logtotalall;
@log = @logall;
}
#---------------メッセージ抽出
これは、保存されている拍手の件数を合計して返す関数だ。より正確にいうなら、値を返すのではなく、拍手の回数がセットされているグローバル変数を上書きする。あんまりエレガントではないやりかただ。
236行目に次の関数を追加する。目印はパスワード認証のコメントだ。同じく、その直前に入れてやろう。
sub makemesall {
&lockon; #====ロック開始
open(IN,"$mesfile"); #===========過去メッセージから読み込み
@mesdata = <IN>;
close(IN);
&lockoff; #=================ロック終了
@mes = ();
for ($i=0 ; $i <= $#mesdata ; $i++){
@mes = (@mes, $mesdata[$i]);
}
}
#--------------パスワード認証
この関数が、過去のメッセージを全て返す関数だ。処理としては、最初のものより簡素になっている。
これはうちだけの問題なのかも知れないけれど、どうもログの削除のタイミングが一日遅れるようで、14日間のログを残すようにしているつもりが、15日間残ってしまっている。これまで、解析画面に表示されなかったから、気付かなかった。これが、私の改造(ログ保存期間を変更する)によるものなのか、それとももともとこういう仕様だったのか、それを確認するのは面倒くさいので、これでいいやと思うことにする。
以上。保存されているログとメッセージを一覧で表示する改造、終わりとしたい。