######################################################################## # # fan_exam.cgi ver.20030108 # 「ファン度調査」用perlスクリプト # by JTCY(http://jtcy.obzaiya.com)(jtcy@obzaiya.com) # First Created: 2003/01/01 18:33 # Last modiried: 2003/01/09 0:36 # ######################################################################## -------------------------------------------------- ■ 1 ■ はじめに・動作環境 -------------------------------------------------- Mystery Laboratoryさん(http://www5b.biglobe.ne.jp/~mystery/)の「本格ミ ステリファン度調査」を嚆矢とした「ファン度調査」というのがちょっと流行っ ています。ある特定の(書籍や名探偵といった)リストに対して、既読かどうか、 知っているかどうかをたずねる、というものです。これに使われているスクリプ トは、既存のアンケート系CGIを使っている物が多いようです。しかし、複数回 答の処理や項目の管理など、ファン度調査向きでない点もあるように見受けられ ました。そこで、自分の勉強を兼ねてファン度調査に特化したperlスクリプトを 書いてみることにしました。 「ファン度調査」のために作りましたので、ファン度調査に適したいくつかの 機能があります。また、勉強のため、ご意見やご要望などにはできるだけ対応し ていく予定です。 このプログラムはperlスクリプトです。perlのバージョンは5を想定しています。 スクリプトの記述の文字コードにはeucを利用しています。euc以外にコードを 変更すると、正しく動作しなくなる可能性があります。 -------------------------------------------------- ■ 2 ■ メリットとデメリット -------------------------------------------------- ●2.1● メリット ▼2.1.1▼ CSV形式で項目の管理が可能 たとえば書籍だと、著者・出版社・価格などの項目が表になっていると便利な のですが、既存のものだと項目→票数の一対一対応しかできないため、この部分 が醜くなってしまうきらいがありました。fan_exam.cgiはcsvで複数項目を管理 できます。また、項目の初期設定も、設定ファイルにEXCELで編集できる CSV(Camma Sepalated Values)形式を採用しているため、簡便です。 ▼2.1.2▼ 項目別昇順・降順ソートが可能 前項の各項目は、昇順・降順それぞれでソートすることができます。著者名な ど漢字を利用する項目には、読み仮名を設定し、その順にソートするすることも 可能です。 ▼2.1.3▼ 全投票中のパーセンテージ表示 既存のアンケートCGIのパーセンテージ表示は、全ての得票の合計値に対する パーセンテージを計算するため、「アンケート回答者のうち何パーセントに当て はまるのか」といった情報が読みとれません。fan_exam.cgiは投票者数を記憶し、 投票者のうち何人が投票したかを表示するので、パーセンテージが直感的でわか りやすくなっています。 ▼2.1.4▼ 書店サイトに自動リンク ISBNコードを項目中に含めると、自動で書店サイトの書籍紹介にリンクを張ります。 現在、amazon.co.jpへのリンクに対応しています。その他の書店サイトにも、 要望があり次第対応します。 ▼2.1.5▼ HTML表示部を自由に変更可能 HTMLの表示にはテンプレートファイルを読み込む形を取っているので、背景画像・ スタイルシートその他のHTMLのデザインは自由に変更できます。 ●2.2● デメリット(兼 To Do) ▼2.2.1▼ 処理が遅い アルゴリズムが最適化されていないため、冗長な計算を何回も繰り返してい るため、処理に時間がかかります。場所によっては、管理者から注意されるかも 知れません。 (※スクリプトを見直して、そこそこ速くなるようにはしたつもりですが、リス トの量が1000行を越えるような大量のデータの場合は、ちょっとつらくなるかも 知れません。) ▼2.2.2▼ EUCでしか表示できない 表示に使っている文字コードはeuc-jpのみです。shift JISやUNICODEでの出 力は対応していません。 (※要望があり次第対応します。) -------------------------------------------------- ■ 3 ■ ファイル構成 -------------------------------------------------- 以下のファイルを用意してください。カッコ内はパーミッションです。 (構成例) ./ (0777) ├/lockdir (0777) │└examlock (0666) │ ├jcode.pl (0644) ├fan_exam.cgi (0755) ├fan_exam.tpl (0644) ├booklist.csv (0666) └image.png (0644) ●lockdir(ディレクトリ) ロックファイルを保存しておくためのディレクトリです。 名前の変更は不可能です。 ●examlock(ロックファイル) ロックの状態を記録するためのファイルです。中身は何でも構いません。 空で結構です。 このファイルの名前は変更できません。このファイルの中身を変更する必要は ありません。 ●jcode.pl(インクルードファイル) 日本語を処理するための機能がつまったperlスクリプトファイルです。 jcode.plはKazumasa Utashiroさんの著作物です。(http://srekcah.org/jcode/) このファイルの名前は変更できません。このファイルの中身を変更してはいけ ません。 (※変更する場合にはjcode.plとは異なる、という明示的な説明が必要です。 詳しくは上記jcode.plオフィシャルサイトをごらん下さい。) ●fan_exam.cgi(実行ファイル) CGI本体のファイルです。 名前は自由に変更できますが、拡張子が.cgiか.plでないと動かないプロバイ ダが多いかと思います。 場合によって、ファイルの先頭部分を変更する必要があります。変更の詳細に ついては後述します。 ●fan_exam.tpl(テンプレートファイル) HTMLの表示のしかたを決定するファイルです。 名前は変更できますが、変更した場合には実行ファイルの先頭にある設定部分 を変更する必要があります。 内容は変更することができます。内容の変更の詳細については後述します。 ●booklist.csv(リストファイル) アンケートの項目を設定したファイルです。CSV形式で書き込みます。 名前は変更できますが、変更した場合には実行ファイルの先頭にある設定部分 を変更する必要があります。 内容は変更しないと使い物になりません。内容の変更の詳細については後述し ます。 ●image.png(画像ファイル) グラフの表示に使う画像ファイルです。 名前は変更できますが、変更した場合には実行ファイルの先頭にある設定部分 を変更する必要があります。 内容を変更する場合には、画像編集ソフトを使ってください。画像のフォーマ ットはPNG形式である必要はありません。 -------------------------------------------------- ■ 4 ■ 実行ファイルの設定部分 -------------------------------------------------- 実行ファイルには、一部設定をしなくてはいけない部分があります。 設定は、全て $nantoka = 'hogehoge'; の'hogehoge'の部分を変更します。 値の両端にあるのは'(シングルクオート)です。値のあとには;(セミコロン)を付 けなくてはなりません。 ●fan_exam.cgiの中身●(冒頭部の抜粋、先頭の数字は行番号) > 1:#!/usr/local/bin/perl 「#!」に続けて、perlを動かすパスのある場所を指定しなくてはいけません。 普通は/usr/local/bin/perlですが、プロバイダによって異なる場合がありま す。 >16:#グラフを示すのに使う画像ファイルの場所 >17:$image_uri = './image.png'; image.pngのある場所を指定します。相対パス指定でも、絶対パス指定でも、http://から始まるURI型の指定でも構いません。 画像ファイルの名前を変更した場合、それに合わせて値を変更する必要があります。 >19:#最初に呼び出した時のソート順/'-1r'で得票の多い順 >20:$default_query = '-1r'; デフォルトの表示の時に何を基準にソートするかを指定します。リストファイ ルの項目番号(0始まり)で指定します。デフォルトで昇順、「r」を付けると降 順になります。 >22:#テンプレートファイルの場所 >23:$template_file = 'fan_exam.tpl'; テンプレートファイルがある場所を指定します。絶対パス・相対パスでの指定 が可能ですが、http://から始まるURI型では指定できません。 テンプレートファイルの名前を変更した場合、それに合わせて値を変更する必 要があります。 >25:#リストファイルの場所 >26:$book_file = 'booklist.csv'; 項目を指定したリストファイルの場所を指定します。 リストファイルの名前を変更した場合、それに合わせて値を変更する必要があ ります。 >28:#テーブルの詳細設定 >29:$table_top = ''; テーブルの色・線の太さなどをHTMLの書式に従って指定します。 -------------------------------------------------- ■ 5 ■ テンプレートファイルの詳細 -------------------------------------------------- テンプレートファイルの内容を変更することで、見た目を変更することができ ます。 テンプレートファイルは、普通のHTMLを書くのと同じ要領で記述できますが、 「置き換え部分」を設定しなくてはいけません。 ●5.1● 文字コード テンプレートファイルの文字コードはEUC, JIS, shift jisのいずれでも構い ません。ユニコードは無理なようです。 ●5.2● 置き換え部分 置き換え部分とは、::hogehoge::と言ったように、コロン二つで前後を囲まれ た文字列です。 これは、スクリプトの実行時に何らかの内容と置き換えられます。 ▼5.2.1◆ ::notice:: ::notice::はスクリプトの状態や、エラーなどのメッセージを表示します。 テンプレートファイルには、「::notice::」と全て半角で書いた(カギカッコ 除く)部分を必ず一つおいてください。 ▼5.2.2◆ ::table:: ::table::は、アンケートの実際の項目を示すテーブルを表示するのに使いま す。 テンプレートファイルには、「::table::」と全て半角で書いた(カギカッコ 除く)部分を必ず一つおいてください。 ●5.3● その他の記述 その他はHTMLを書くのと全く同じ要領で書くことができます。 -------------------------------------------------- ■6◆ リストファイル -------------------------------------------------- リストファイルはEXCELに準拠したCSV形式で保存します。 EXCELを使える環境にある場合、EXCELで編集し、CSV形式で保存してください。 EXCELを使える環境にない場合、下記の仕様に準拠するよう編集してください。 ●CSVファイル仕様 1. 文字コードはシフトJISを使う。それ以外でも読み込みは可能だが、、 投票結果を書き出す時に自動的にシフトJISに変換される。 2. 基本的にコンマで区切った部分がスペースを含めて値である。 3. 値にコンマやダブルクウォートが含まれる場合は、 値全体をダブルク ウォートで囲む。 4. 値に含まれるダブルクウォートは、""となる。 (2.3.4.はperlメモ(http://www.din.or.jp/~ohzaki/perl.htm)より) 最初の一行が各項目の詳細、二行目以降が具体的な項目になります。 リストファイルの例(見やすくするために適宜スペースを入れています。実際 にはスペースは入れないでください。) >*NO ,書名 ,#書名 ,著者名 ,#著者名 , 出版社 ,出版年, ISBN , 0 >1 ,「空飛ぶ馬」,そらとぶ,北村薫 ,きたむら, 東京創元社,1989 , 4488413013, 0 ここに書いた各セルの値が、表示の際の項目名になります。 一番最初の項目は、通し番号を書いてください。この番号によって得票が管理 されます。通し番号がずれると、得票は正しく管理されません。 二番目以降には、表示する項目を順に書いていきます。 一番最後の項目は、必ず0を書いてください。以後、一行目の最後に投票者総 数が、二行目以降の各行の末尾に得票数が記録されます。 調査開始後にCSVファイルを変更する場合は、最後の行を0にする必要はありま せん。何らかの理由で得票数を変更する必要がある場合は、ここを変更してくだ さい。 項目名の頭に#(半角シャープ)を付けると、それは前の項目の読み仮名と見 なされます。前の項目での並べ替えをする時に、この項目が利用されます。 上記の例の場合、「書名」や「著者名」で並べ替えをする時、実際には 「#書名」や「#著者名」を使って並べ替えがおこなわれます。#付きの項目は並 べ替え以外には使われないので、並べ替えをするのに充分なデータがあれば、正 しい読みを書く必要はありません(参考:上記「そらとぶ」「きたむら」) 平仮名と片仮名、半角と全角は区別されます。注意してください。 項目の並べ替えは文字コード順でおこなわれます。('23', '5', '1', '18')を 並べ替えると('1', '18', '23', '5')になります。 項目名の頭に*(半角アスタリスク)を付けると、並べ替えは数値の大小順に なります。('23', '5', '1', '18')を並び替えると('1', '5', '18', '23')にな ります。 項目名を半角で「ISBN」(カギカッコ除く)とすると、その項目はISBNコード と書いたものと認識されます。 ここにハイフンを略した10桁のコードを記入した場合、自動で書店サイトの書 籍紹介にリンクが張られます。ISBNコード以外を記入した場合、リンクは張られ ません。ISBNコードか否かは、数字またはアルファベットのXが10桁続くかどう かによって判定されます。0から始まるコードはExcelで編集すると冒頭の0が消えてしまうので、「'0000000000」のように先頭にシングルクウォートを付けなくてはいけません。 (要望があれば、先頭に0がない場合、自動で補ってISBNコードとして認識させ るようにします) -------------------------------------------------- ■ 7 ■ 謝辞・制作環境・著作権 -------------------------------------------------- jcode.plはKazumasa Utashiroさんの著作です。利用条件の下、再配布させて いただいています。ありがとうございます。明示なしにjcode.plを変更すること は許されていません。 詳しくはjcode.pl内の著作権に関する記述をごらん下さい。 「ファン度調査」というアイデアはMystery Laboratoryさん (http://www5b.biglobe.ne.jp/~mystery/)から拝借したものです。ありがとうご ざいます。 スクリプトやアイデアの一部やはOhzaki Hirokiさんのperlメモ (http://www.din.or.jp/~ohzaki/perl.htm)から拝借したものです。ありがとう ございます。 このスクリプトの動作確認には、下記の環境を使いました。別の環境では別の 問題が起こるかも知れません。 perl: ActivePerl v. 5.003 httpd: An httpd v.1.36b ブラウザ: Opera 7.0 beta 2 全て無料の物です。制作者の皆さんに感謝します。ありがとうございます。 このスクリプトはJTCY(jtcy@lycos.jp)が作りました。再配布・改造その他は 全くもって自由です。好き勝手にやっちゃってください。 このスクリプトを利用することによって発生するいかなる不都合な結果にも、私は責任を負わないこととします。 -------------------------------------------------- ■ 8 ■ おわりに -------------------------------------------------- このスクリプトは私が初めて人様に公開するプログラムです。 勉強を兼ねて作っていますので、どんどん更新されていく可能性があります。 なんか不具合があったり、要望があったり、相談があったりしたら、お気軽に メールなりなんなりで ご連絡下さい。できるだけお応えできるようにしたいと 思います。 2003/01/01 JTCY.