web拍手CGIではお礼メッセージはランダムに表示されるばかりだが、聞いた話によれば、登録版のweb拍手だとランダムと順番通りの表示を選べるようになっているらしい。clapinit.cgiで設定した1から5までのお礼メッセージを、その番号順に表示する機能があるということだ。この機能はweb拍手CGIではオミットされていて、別にそれが悔しいというわけでもないのだが、できないよりもできるほうがきっといいだろう。と、そんな薄弱な理由から、web拍手CGIでも順番通りにお礼メッセージを表示できるようにしてみよう。
メッセージの表示を制御するには、いったいどこをどう改造したらいいのだろう。実をいうと、以前お礼メッセージの数を増やす改造をしたときにその部分を説明しているのだ。具体的にいうと、clap.cgiの139行目。$iと書かれた部分があるのだが、これがメッセージを呼び出すために利用される変数なのだ。
#------メッセージ
$i = int(rand(5));
ここではいったいどういうことが行われているのかというと、ランダムで取り出した数字0から4を$iに格納している。さらにこの先をいえば、この$iに格納された番号を使ってメッセージを取り出している。思い出して欲しいんだが、clapinit.cgiの最初の方でメッセージを設定したとき、$message[n]のnに0から4までの数字が入っていただろう。
# 拍手送信後画面用お礼メッセージ1(タグ使用可)
$message[0]='拍手が送信されました。<br>ありがとうございました!';
# 拍手送信後画面用お礼メッセージ2(タグ使用可)
$message[1]='拍手が送信されました。<br>ありがとうございました!';
$iに格納された数字は、$message[n]から実際のメッセージ内容を取り出すために使われているのだ。
具体的にその取出作業がされているのは143行目。
print "$message[$i]<br><br><br>\n";
$message[n]のnの部分に$iが含まれてることがわかると思う。$iには、ランダムで0から4の数値が格納されていた。この数値に応じたメッセージが、$message[n]から取り出されているわけだ。
今回の変更箇所はもうおわかりのことだろう。変数$iに数値を格納する139行目である。
139行目では、rand()関数を使って、ランダムに取り出した数値を$iにセットするという作業がされていた。だから、お礼メッセージを順番通りに表示させるには、ランダムな数値ではなく、毎回1ずつ増える値を$iにセットすればいいとわかる。しかし、$iに入れるべき数字をどこから持ってくるか?
実は、もう用意されている。私たちは前回web拍手の連投数を変更したが、このときに拍手を送るごとに1ずつ増加する数字を目にしていた。そう、kaisuuである。そして前回、フォームを経由して送られてくるkaisuuが$kaisuuという変数にセットされているということも確認した。つまり、今回の改造には、この$kaisuuを利用できるのである。
最も簡単に思いつくやり方は、$kaisuuの値をそのまま$iにセットすることだ。clap.cgiの139行目を次のように書き換えるということである。
#------メッセージ
$i = $kaisuu;
このやり方は一見うまくいったと思えるだろうが、すぐに問題があるとわかる。拍手を次々に送っていると、すぐに用意したメッセージ数をオーバーしてしまい、メッセージが表示されなくなってしまうからだ。メッセージが表示されなくなるのは、$message[n]のメッセージがセットされていない部分を参照してしまうからで、いうならばエラーである。
このエラーを回避するにはどうしたらいいのだろうか。ひとつの方法は、前回の改造を応用して、用意したメッセージ数と連投可能最大数を同じにしてしまえばいい。こうすれば、$iには用意したメッセージ数以上の数値がセットされることもないわけで、つまりエラーも出ない。
しかし、こんな消極的な姿勢でよいのだろうか? いや、よくない。私は人生には、時に立ち向かわなければならない問題があると思っている。そして、それはまさに今なのではないか? さあ、私たちの問題に、真っ向から立ち向かい、克服しようではないか。
$kaisuu
がメッセージ数よりも大きくなった場合、$i
にはまた0から始まる数値を入れたいと思う。こういう場合にはどうしたらいいだろう。
ひとつのやり方は制御構文を使って、$kaisuu
がメッセージ数を上回ったときに働く処理をつくってやることだ。しかし、デフォルトの拍手連投数が10までしかなかった場合ならいざ知らず、前回の改造で拍手の最大数を増やしてしまった場合は、処理がややこしく込み入ってしまう。
なので、私は別の方法を使ってみようと思う。
web拍手CGIで使われているPerlという言語では、割り算の余りを導くことができる演算子がある。演算子というのは、+(プラス、足す)や-(マイナス、引く)といった計算に使う記号のことで、そして今回利用しようという演算子は%である。Perlでは%を使うことで、ある数値を別の数値で割ったときに出る余りを知ることができる。
一番最初の拍手が送られたとき、139行目に達した時点での$kaisuu
はまだ0のままである。$kaisuu
に1がプラスされるのは149行目だからだ。
$kaisuu ++;
ふたつ並んだ+記号が見えるだろう。Perlではこうすることで、$kaisuu = $kaisuu +
1
と同じ効果が得られる(インクリメントという)。つまり、$kaisuu
は149行目に達してはじめて+1されるのであり、実はこれは私たちには実に都合がいい。
139行目の処理が行われるとき、一番最初の拍手では$kaisuu
は0であることは確認した。六回目の拍手では、$kaisuu
は5である(149行目になって、はじめて6になる)。メッセージが五つ用意されているとしよう。一回目の拍手と六回目の拍手で、同じ第0番のメッセージを呼び出したい。どうすればいいか?
$kaisuu
をメッセージ数で割った余りを使うのである。
メッセージ数は5。一回目の拍手139行目$kaisuu
は0である。0/5の余りはいくつであろうか? 0である。六回目の拍手では$kaisuu
は5。5/5の余りはいくつであろうか? 0である。つまり私たちは、$kaisuu
/メッセージ数の余りを$iにセットしてやれば、期待通りの結果を得られるのである。
では、clap.cgiを書き換えてみよう。139行目を次のように書き換えてやる。
#------メッセージ
$i = $kaisuu % 5;
余りを導き出す演算子%を使い、$kaisuu
をメッセージ数5で割った余りを得ることができた。これで、$message[n]のnには0から4までの数値が順にセットされるようになり、お礼メッセージはランダム表示ではなくなった。
普通に考えると、お礼メッセージは順番に表示されるよりも、ランダムに表示されたほうが都合がいいように思える。じゃあ、今回の改造はなんの役に立つのだろう。
ほら、例えば紙芝居みたいに連続するストーリーをweb拍手で表現したいときなんかに使えないだろうか。どうだろう。
まあいずれにしても、私にはあまり活用できなさそうな改造ではあるなあ。
< web拍手改造:連投規制を緩和する web拍手改造:これまでのまとめと整理 その一 >