ニフティホームページでCGIを(5)

前回記事: なおさん亭::別館: ニフティホームページでCGIを(4)

ちょっと間が空いたが、ようやくCGIが形になったので、この連載をまとめてみたいと思う。いろいろな試行錯誤の上、情報ファイルのフォーマット、CGIスクリプトの内容はまとまったようだ。

まずは、CGIスクリプトと同じディレクトリ階層にある情報ファイルを紹介しよう。

情報ファイル

このファイルの構造は、先頭から以下のようになっている。

  1. 地域名、その英表記
  2. 局略称、局名称、その英表記(空行まで継続)
  3. 局略称
  4. 局説明文
  5. カード枚数、カードファイル名、説明(空行まで継続)
  6. コメント
  7. 局サイトURL、URL説明(オプション)
  8. 空行

3から8までは、2で列挙した分だけ繰り返す。つまり、その地方の放送局の数の分だけ、2は連続し、3から8は繰り返されることになる。個人的には、無駄のないデータ形式と思っているが、どうだろうか。

で、これを読み込んで放送局の一覧をこのように処理するCGIスクリプトが、これである。拡張子の都合で、本来なら.cgiとなるべきところに最後に.txtも付けている。

CGIスクリプトファイル

このスクリプトは、実は運用上のとは少し違う。Google AdSenseのスクリプトと、ニフティホームページのアクセスカウンタの記述は外してある。Perlのスクリプトが読める人しか読めないと思うので(何のこっちゃ)、あまり初心者的な説明はせずに済まそうと思う(面倒だという話もある)。プログラマは、組んだコードで語るのさ。

ポイントがいくつかある。@Homepageでは、Perlの標準モジュールは基本的にサポートしていないようだ。たとえば、CGIモジュールなどでもサポートされていない。なので、クエリを連想配列にするようなコードは、自分で埋め込まなければならない。冒頭にある冗長なコードは、これである。このコードで、クエリ文字列が引数ごとに分割されて、%inという連想配列にセットされる。

クエリ文字列には、type, districtという引数が渡されるが、これはそれぞれ国内中波、国内FMなど、大きな分類と、地方を表す文字列である。たとえばこのページにある各地方のリンクをクリックすると、type=domesticmw、district=hokkaidoなどという具合にlist.cgiに渡される。引数が多くのなるのは、CGIスクリプトの汎用性を高めようとするとしようがないことで、いずれは海外放送なども載せていこうと思っているから、このへんはしっかりとやっておかなければならない。

別のポイントとしては、冒頭(2)で放送局の一覧を列挙するが、同じ情報を同じファイルに何回も記述するのは不合理なため、放送局の一覧は略称をキーとした連想配列にキャッシュすることにしている。これにより、続く各放送局個別のデータが現れたら、その先頭にある略称(3)をそのままキーに用いて、局名やその英表記をそのまま取り出すようになっている。

局によっては、複数枚のカードがあるが、これは(5)の先頭でカードの枚数があるから、その枚数だけ続くカードファイル名を処理することにしている。個々のカードの拡大画像は別のCGIスクリプトview.cgiが処理するが、それへの引数にtypeをはじめとする引数のほかに、各種の名称を渡している。これは、view.cgi内で渡された情報(地方、曲名など)を表示するためのものだ。

カードは縦だったり横だったりするので、カードファイル名にオプションで向きを指定できるようにしている。カンマで切ってh,vがあれば、それは向きと見なされ、サムネールのサイズの指定にそのまま使用される。hなら横長で、vなら縦長というように、サイズ指定される。実際のカードのサイズはまちまちだが、誤差の範囲ということで、192ピクセル、128ピクセルというように統一している。

このようなときには、split関数は便利だ。実際にカンマ以降がなければ、2番目のスカラ変数は空になる。ほとんどは縦長で、横長は少ない方なので、横長を例外としてhが指定されるのを特別視しておけば、手を入れる必要は最小限になる。

実は、このスクリプトにはまだいろいろと問題がある。ひとつは、view.cgiへ日本語をそのままクエリとして渡していること、カードの表が横長、裏が縦長という場合に、裏を優先しているので縮小画像がおかしなことになる点である。後者は見た目の問題だからある意味どうでもいいとも言えるが、前者は技術的な問題なので、いずれは解決していかなければならない。Internet Explorerが勝手にUTF-8にエンコードしてくれているようだが、本来ならばプログラムの方で処置しておくべきポイントである。

いずれは解決するということで、とりあえずはサイトの充実を優先することにする。

これで、この連載は終わりだが、かなりはしょった感じもする。スクリプトファイルを惜しげもなく(大げさな)公開したことなので、チャラにして下さい。また、スクリプトの書き方が稚拙だとか、技術的に間違っているという指摘はどんどん受け入れますので、よろしくお願いします。

コメント