web拍手改造のまとめ第二回目。前回はお礼メッセージの変更周りを中心に整理したので、今回は予告したとおり、拍手を連続で送れる最大回数の設定周辺を整理してみることにしよう。
web拍手の改造において、連投規制の緩和は簡単な部類に入るだろう。基本的に変更箇所は一ヶ所。clap.cgiの147行目にある数値を書き換えるだけの話であった。
if ($kaisuu < 9){
ただ、ささいな話ではあるが、拍手の回数制限を超えたことを知らせるメッセージ中にある回数。
print '<font size=2>いたずら防止のため、10回以上連続で拍手を送れないようになっています。</font>';
これも一緒に変更してやる必要があって、けれどこちらはというと、特に本質的な話ではないからどうにも変更するのを忘れてしまいがちになる。だから、どうせ変更するのなら、一ヶ所だけの変更ですませたいというのは、前回にもいった話であった。
今回の改造は、clapinit.cgiの基本設定パートで連投可能数を設定できるようにして、clap.cgiを開かなくてもすむようにしようというものだ。今回使うのはスカラ変数で、このタイプの変数は今までにも散々扱ってきたから特に説明の必要はないだろう。
ここで変数というのがなにかと簡単に触れておくと、数値や文字列を格納しておけるボックスのようなものと考えていただくとよいのではないかと思う。変数になにか値を入れておくと、次に別の場所で違う値がセットされるまで、同じ値を保持し続けてくれる。なので、後々変更する必要があるような値は、プログラム冒頭で変数にセットするようにしてやると、後々のメンテナンスが楽になる。もちろんプログラム中では、その変数を扱うというわけだ。
今回の改造は、この考えに基づいている。すなわち、147行目の数値と、いたずら防止のメッセージ中の数値を、ともに同じ変数で扱うようにする。
変数の名前は、他の変数に重複していなければなんでもいい。私は、拍手の回数を格納する変数$kaisuuと関連があることがわかるようにと考え、$kaisuumaxとしてみた。もちろん、わかりやすければなんでもよい。
変数に値をセットするのは、最初にいったように基本設定のパート。clapinit.cgiを開き、私は解析閲覧用パスワードの次に、拍手最大数の設定をおこなう行を追加した。
# 解析閲覧用パスワード(パスワード認証をかけない場合は不要)
$password = '0000';
# 連続して送れる拍手の最大数
$kaisuumax = 10;
以上で、設定周りの変更は終了だ。
変数の用意ができたら、次はプログラムの変更をしよう。変更箇所はclap.cgiの147行目と、いたずら防止うんぬんと書かれた160行目だ。
まず147行目を見てみよう。
if ($kaisuu < 9){
数字9を変更することにする。ここでの数字は、実際の連投可能数よりも1少ない数でなければならなかったから、つまり先ほど用意した$kaisuumaxから1を引いてやればいい。つまり、ここは次のようになる。
if ($kaisuu < $kaisuumax - 1){
これで、$kaisuuが、$kaisuumaxから1引いた値よりも小さい場合のみに、拍手ボタンとメッセージ入力用フォームが表示されるようになった。
さて、次は160目である。
print '<font size=2>いたずら防止のため、10回以上連続で拍手を送れないようになっています。</font>';
この10という数字を、変数$kaisuumaxに置き換えたらいいのだが、そのまま置き換えるとちょっとまずい。というのは、変数はダブルクオート(")の中では展開して値になってくれるのだが、シングルクオート(')だと変数が変数の文字列のまま表示されてしまう(つまり、$kaisuumaxがそのまんま表示される)。なので、$kaisuumaxはシングルクオートの外に書いてやらないといけないのだ。
なので、変数を囲む前半分と後半分をそれぞれシングルクオートでくくってやり、カンマ(,)でつないでやる。こうすることで、期待どおりの表示が得られるだろう。
print '<font size=2>いたずら防止のため、',$kaisuumax,'回以上連続で拍手を送れないようになっています。</font>';
この改造は、やるもやらないも任意である。一応、なにをやりたいかだけ説明しておこう。
お礼メッセージをランダムで表示するときには問題とならないのだが、順番通りに表示させようというときには、次のような問題が出はしないだろうか。すなわち、連投最大回数をお礼メッセージ総数が上回ってしまうようなケースである。お礼メッセージ数が連投最大回数よりも多くなると、連投最大回数を超えた分のお礼メッセージは一生表示されないということになってしまう。
この解決法は二点。一点目は、お礼メッセージ数を増やしたときは、それにあわせて連投最大回数も増減させるということ。しかしこれでは、変更箇所を少なくしようとしてきたこれまでの苦労が台無しになってしまう。
二点目は、お礼メッセージ数が連投最大回数を上回ったときに、自動的に連投最大回数を増やすよう、プログラムに工夫を加えるという方法。もちろん私たちが取り組むのは、こちらのやり方である。
お礼メッセージ総数が連投最大回数を上回ったどうかを知りたい場合は、単純にこのふたつの数を比較してやればいい。お礼メッセージ総数を知る方法は前回にやっているので、どうぞ思い出して欲しい。比較して、その条件が満たされた場合に処理を分岐させる方法というのも前回やった。同様に思い出して欲しい。
お礼メッセージ総数は$#messageで得ることができた。そして、最大回数は先ほどの変数$kaisuumaxである。この両者の数を比較してやればいい。条件はというと、$kaisuumaxが$#messageに同じか少ない場合である。なぜ同じである必要があるかといえば、$#messageは配列@messageの一番最後にある要素の添え字を返すからだ。配列の添え字は0から始まることを思い出してもらえばいいだろう。
以上を、ifの条件文と合わせて、$kaisuumaxが$#messageに同じか少ない場合、$kaisuumaxにメッセージ総数がセットされるようにしてやればいい。
if ($kaisuumax <= $#message){
$kaisuumax = @message;
}
$kaisuumaxにセットされるのが、@messageであることに注意してもらいたい。スカラ変数に配列を代入すると、配列の要素数がセットされるのだ。つまり、お礼メッセージ総数をそのまま取り出せると考えてよい。
メッセージ総数を判断して連投回数を変更する処理ができたわけだが、果たしてこれをどこに書いたらいいだろうか。
ここで思い出して欲しいのは、メッセージ総数が連投回数を超えた場合に困るのは、どういうケースだったかということだ。つまり、お礼メッセージを順番に表示したいときである。ランダムならば、お礼メッセージはばらばらに表示されるのだから、連投可能回数がお礼メッセージ数よりも少なくたってなにも困らない。
なので、以上の処理は、前回の改造部分、お礼メッセージをランダムに表示するかどうかを切り替えるために用意したif条件文の中に書くのが一番いい。もちろん書くのは、順番通りに表示する分岐のほうにであるぞ。ついでにいえば、これはclap.cgiの、かつて139行目だったところだ。
#------メッセージ
if ($randomon eq 0){
$i = int(rand($#message + 1));
}else{
$i = $kaisuu % ($#message + 1);
if ($kaisuumax <= $#message){
$kaisuumax = @message;
}
}
前回と今回の整理で、これまでの改造の成果を、便利に切り替えたり、また変更したりできるようになった。
とりあえず今回で、web拍手の改造は一段落。まだ続く予定だが、残念ながら私の改造のアイデアはもう尽きようとしている。もしよい改造アイデアがあったら、web拍手経由ででもいいから伝えて欲しい。可能なものであれば、できるだけ答えていきたいと思う。
< web拍手改造:これまでのまとめと整理 その一 web拍手改造:一言メッセージの書き込み時刻を記録する 簡単編 >