2005年はこととねにおけるweb拍手年。web拍手に関係する文書をいくつか公開してきたが、その中で特に反響の多いのはweb拍手改造。やはりweb拍手CGIユーザーは、少しでも他のユーザーとは違う独自性を出したいという思いや、あるいはより便利にしたいという考えがあるのだろう。
ところでだ。今まで紹介してきたweb拍手の改造であるが、一度改造すれば後はそのままにしておいてもいいようなものならいざ知らず、頻繁に変更することが予想されるような改造の場合、その都度の作業が煩雑になりそうだと思ったりはしなかっただろうか、例えばお礼メッセージの数を増やす場合なら、変更点は三ヶ所にわたった。
変更箇所が多くなれば自然間違いもしやすくなるし、それになにより面倒だ。こうした、後々のメンテナンスのしにくさをすっきりと整理して、更新時の手間を少しでも軽減できないものだろうか。
お礼メッセージに関する改造はお礼メッセージのバリエーションを増やすとお礼メッセージを順番通り表示するの二種類であった。前者の改造は増やしたメッセージ数分の乱数を発生させるための改造であり、後者はメッセージを呼び出すための数値を順番にメッセージの数だけ取り出そうというものであった。この両者の改造には共通点がある。メッセージを呼び出すための数値を取得する際に、メッセージの総数がいくつであるかわかる必要があった。
#------メッセージ
$i = int(rand(5));
#------メッセージ
$i = $kaisuu % 5;
この総メッセージ数を自動で取得できれば変更箇所は激減するんだがなあ。しかしメッセージ数の自動取得だなんて可能なのだろうか?
お礼メッセージは配列を利用している。配列というのはなにかというと、ひとつの変数の中に複数の値を持たせられるという仕組みのことで、お礼メッセージのために用意された配列@messageから取り出そうとするメッセージを番号で指定しているのだ。その番号というのが$i
であった。$i
にセットされた数値でもって、@messageからメッセージを取り出していたことを思い出して欲しい。
ここで私たちに必要なのは@messageにどれだけの値がセットされているかだ。その調べ方は次のとおりである。
$#message
配列名の頭に$と#をつけてやると、その配列が今現在いくつの値を抱えているかを知ることができる(正確にいうと、配列の一番最後の添え字がわかる)。
ただここで注意しないといけないのは、こうして得られる数値は実際の値の数よりも1少ないということだ。なんでかというと、配列の値(添え字)は0から始まるからだ。お礼メッセージを設定するところ、$message[n]の数値が0から始まっていることを思い出して欲しい。
# 拍手送信後画面用お礼メッセージ1(タグ使用可)
$message[0]='拍手が送信されました。<br>ありがとうございました!';
# 拍手送信後画面用お礼メッセージ2(タグ使用可)
$message[1]='拍手が送信されました。<br>ありがとうございました!';
さて、$#messageで得られる数はメッセージ総数より1少ないわけだから、これに1を足してやればいい。このようにして改変されたコードは次のようになる。
#------メッセージ
$i = int(rand($#message + 1));
#------メッセージ
$i = $kaisuu % ($#message + 1);
これで、いくつメッセージを増やそうと減らそうと、乱数呼び出したり$kaisuu
を割ったりする数値をいちいち変更する必要はなくなった。
お礼メッセージをランダムに表示したり順番通りにしたりと、二種類のやり方をできるようにしたわけだが、できればこうした式を書き換えるんじゃなくて、ちょうどclapinit.cgiでパスワード認証をするかどうか決めるみたいに、ランダムと順番通りの二種類を切り替えられるような仕組みがあったら便利だ。
だから作ってみよう。
こういう仕組みを作る場合は、制御構文を使うと便利だ。制御構文というとなんだか難しく感じられるけれど、それほど難しいもんじゃない。指定した条件が成立する場合、しない場合の処理を、それぞれ分岐させるというもので、ここではifというのを使ってみよう。
ifでランダムのオンオフを切り替える仕組みを作る前に、まず変数を用意しておこう。いうならばこれはスイッチであり、この変数が0であるかどうかというのを判定して、メッセージをランダムに表示するかどうかをわけようというのだ。
ランダムオンオフ用の変数は、clapinit.cgiに作っておくといいだろう。clapinit.cgiを開くと、冒頭に基本設定を行うためのいろいろが書かれているが、ランダムのオンオフの設定もここに書いてしまうと、今後の変更時にあれこれ探し回る必要がなくなって便利だ。変更箇所は一ヶ所にまとまっている方がなにかと都合がいいからだ。
変数名は、他の変数とかぶってなければなんでもいい。私はランダムのオンオフを決める変数であることがわかるように、$randomonとしてみた。これを書き込む場所はどこでもいいが、お礼メッセージに関する変数なので、メッセージの設定と近いほうがわかりやすいと考えて、お礼メッセージの直前に書いてみた。
# 拍手送信後画面をランダム表示
# 0…する
# 1…しない
$randomon = '0';
# 拍手送信後画面用お礼メッセージ1(タグ使用可)
$message[0]='拍手が送信されました。<br>ありがとうございました!';
後から見てわかりやすいように、コメントも加えてみた。Perlでは#の後に書き込まれたものは無視されるのだ。
変数を用意したので、いよいよ制御構文に取り掛かろう。今回使うのはifということはすでにいった。
ifというと英語にifという単語があるが、これはまさにそれで、もし〜ならという理解でほぼ間違いない。ここでは$randomonが0であるかどうかで処理を切り替えるようにする。
$randomon が0であるかを調べるには、if ($randomon eq
0)
と書いてやればよい。eqの意味は、左辺と右辺の文字がイコールかどうかを比較するための演算子だ。ifがついているので、これを日本語に翻訳するとすれば、もし変数$randomonが文字0にイコールならば、とでもなるだろうか。
$randomonが0だった場合は、そのすぐ後に続く波括弧({})内の処理を行って、0でなかったときは、elseの次の波括弧内の処理を行う。つまり最初の括弧内には、さっき作った、ランダムの場合の処理を書き、elseの次には順番通りに表示させる処理を書けばいい。実際に書いてみれば、次のようになる。
#------メッセージ
if ($randomon eq 0){
$i = int(rand($#message + 1));
}else{
$i = $kaisuu % ($#message + 1);
}
もちろんいうまでもなく断っておくけれど、この条件文は、メッセージを取り出すための数値を取得していたところに書くのだぞ。具体的にいうと、clap.cgiの139行目。次の文章を置き換えるのだぞ。
#------メッセージ
$i = int(rand(5));
拍手のお礼メッセージはclapinit.cgiで設定しているが、この数を増やす場合に面倒だったのは、$message[n]のnに入る数字をいちいち連番で変更してやらないといけないところだった。この数字だが、いちいち指定しないですむようにはできないものだろうか。
配列関数のpushを使ってみよう。pushは値を、指定した配列の一番最後に追加するための関数で、つまりお礼メッセージを配列@messageに追加するときにpushを使うようにすれば、いちいち増やしたり減らしたりするときに、数字がかぶってないかとかを意識しないですむようになる。
push の構文は、push (配列名, 要素)
である(要素というのは値のこと、ここではお礼メッセージと考えてもらえばよい)。なので、配列名には@messageを、要素にはお礼メッセージを書いてやればいい。
# 拍手送信後画面用お礼メッセージ(タグ使用可)
push(@message,'拍手が送信されました。<br>ありがとうございました!<br>メッセージ1');
push(@message,'メッセージ2');
push(@message,'メッセージ3');
push(@message,'メッセージ4');
push(@message,'メッセージ5');
メッセージを増やすときには、push(@message,'メッセージ');
をコピーしてそのまま貼り付けてやるだけでいい。これで上の行から下の行に向かって、0から順番に配列に要素がセットされる。
お礼メッセージに関する整理は以上である。こうやって整理してやることで、変更箇所はお礼メッセージそのものと、ランダムのオンオフを切り替える箇所の二点に減らすことができた。
次回は、拍手の最大数に関するまとめと整理をするつもり。本当は今回一緒にやるつもりだったんだけど、思ったよりも量が多くて、疲れ果てて、ちょっと無理……。
< web拍手改造:お礼メッセージを順番通り表示する web拍手改造:これまでのまとめと整理 その二 >