6.3 【cgiと戯れる】
ASPに飽きたので(っていうか、PWSかIISが必須だというのはやはり不便だ)、cgiに手を出してみた。
とりあえず、Active Perl 5....バージョン忘れた(笑)をインストールしてみた。PWS+ASPの時は何も悩まずに動かせたのだが(なんといってもファイルを置くだけで動くのだから)、cgiはちと素人には難しい。1行目にPerlの実行ファイルのパスを置くという意味がよくわからなくて(たいていの解説ページではUNIXを基準に書いてあるし)戸惑ったが、Active
Perlをデフォルトのままインストールしたのであれば「/perl/bin/perl」というディレクトリを指定すればいいだけだった。
あとは適当にソースを入手してきてコピーすれば、、、とか思ったのだけど、それもなんだか芸がない。いろいろありすぎるというのもあるし、最初から複雑なものをゲットしてきてもわけがわからないだけなような気がするし。そんなわけで、まずはGETやPOSTでcgiに渡された内容を表示するというごく単純なものを作成してみた。
「&」を基準に文字列をわけたり、URLエンコードされた文字列をもとに戻したりなんていうところは考えてもよくわからないので既存のソースから拝借してくる。要は文字列の置換をしているだけだが、このあたりは正規表現がわかってないと解読できない。ま、最初だし、「決まり文句」だと思っておけば差し支えなさそうだ。
あ、そうだ。結果をHTMLで表示させてやろうと思ったら、最初に「print "Content-type:
text/html\n\n";」とか書いてやらないといけないみたい。これはおそらく、ブラウザに対して「これから送るのはHTMLだよ」って教えてあげるためのものだろう。カウンタでイメージファイルを送るのであれば、「print
"Content-type: image/png\n\n";」とかいう感じ。最後の「\n\n」が必要なのかどうかはよく知らないけど、わざわざいじってトラブルになるのもなにかと面倒だし。
行末に「;」を入れ忘れたりしたが(printなんちゃらなんてBASICっぽいからややこしい)なんとかちゃんと動いてくれた。この結果をファイルに突っ込んでやることができれば、アンケートとかが簡単にできるかも。掲示板だったらそこからもう一度引っ張ってくるようにすればいいから、それほど苦労せずにできそうな気もする。問題は、同時に2ケ所以上からアクセスがあった場合の処理かな。
ついでに(?)カウンタも作ってみた。テキストカウンタを作りたかったのだけど、テキストカウンタをインラインで埋め込むためには「SSI」とかいう方法を使わないといけないらしい。どうやったらいいのかさっぱりわからないので、とりあえずは保留と。フレームのソースで指定するやり方が結構簡単そうだけど、カウンタのためだけにフレームをわけるってのもなんか違う気がするし(笑)。ページ自体を全部cgiで作るようにすればそれはそれで実現できそうだけど、それも面倒だよなぁ。
結局、「0」から「9」までのイメージを作り、それらを順に表示させる形で実現。1桁だったら特に難しいことはないが、2桁以上になると組み合わせて表示しないといけないのがなかなかややこしい。cgi内で画像をくっつけることができればいいが、ぼくの知識では無理。ということは、複数のcgiを使って実現するしかないということかな。
cgiを呼ぶ時にオプション(?)をつけて桁を区別するようにし、1の位のものが呼ばれた時だけカウンタを増やす形にしてみたところ、だいたいちゃんと動いているのだが、桁上がりが生じた時におかしくなってしまった。「019」の次は「020」にならなくてはいけないのに、なぜか「010」になってしまったのだ。
原因は単純で、10の位が表示される時にはまだカウンタの値は「19」だから、だ。仕方がないので1の位以外についても内部でカウンタを増やすことに。なんだかややこしいやり方だが、なんとかちゃんと動いてくれるようにはなった。
しかし気になるのは、常にちゃんと左から順番に呼んでくれるのか、ということだ。もしなんらかの原因で右から呼ばれてしまったら、「018」の次が「029」なんてことになる。なんとも難しい問題だ……。
同時に2ケ所以上からアクセスがあった場合の対処も含めて、もう少し勉強しないといけないなぁ。
QT-Q。2.20をリリース。「コピー時に<img>タグを追加するか」というオプションを追加してみた。これは、画像の一部をコピーしてクラリスワークスではりつけようと思って痛い目にあったから。Finderでクリップボードの表示がタグの方になってしまう問題もあり、それを回避するためにオプションにしたわけ。
次は秋頃までに2.30にするつもり。2.30では、スクリプトメニューの階層化などを予定。任意に作られるメニューの階層化っていうのはやったことがないので難しそうだけど。
|