クイズスクリプトカスタマイズメモ
状態:不明
閲覧数:4,771
投稿日:2011-09-28
更新日:2015-09-23
「QQQ SYSTEMS 圧縮ファイルver2.24 2007/06/09」を目指して、
「三択クイズ 2011/06/09」を、これからカスタマイズしていく予定、のパーソナルメモまずは、「QQQ SYSTEMS 圧縮ファイルver2.24 2007/06/09」の理解、及び、デザインカスタマイズから、行なってみる予定
▼index.cgi
▼quiz.cgi
▼common.cgi … 共通ファイル
<出力>
出力指定は、 3箇所
・sub output{ … PC用、function.cgi(1212)
・sub outputop{ … PC用、quiz_op.cgi(4113)
・sub output_i{ … 携帯用、function.cgi(1241)
▼index.cgi
・sub main{メインプログラムからの出力指定 &output; … index.cgi(122)
▼quiz.cgi
・sub main{メインプログラムからの出力指定 &output; … quiz.cgi(409):
<表示>
▼index.cgi … sub main{(136)
&header_html;
&○○_html;
&top_html;
&top_i_html;
&△△_html;
&footer_html;
$footer_i_html
▼quiz.cgi … sub main{(398)
&header_html(); #####ヘッダーの作成
&○○_html;
&footer_html; #####フッターの作成
&html; #####画面の表示
&set_cookie; #####クッキー情報の書き込み
&△△_html;
$footer_i_html
<ページトップ表示小ナビ(サブナビ)>
▼index.cgi
sub top_html{(155)
$SYS{header}=~ s/\$title/$SYS{main_title}/g;
$SYS{header}=~ s/\$top/\[[url=$SYS{top_url}]$_top<\/a>\] /g;
$SYS{header}=~ s/\$quiz_op/\[[/url][url=$quiz_op_cgi]管理人室<\/a>\] /g;
$SYS{header}=~ s/\$imode/\[[/url][url=$index_cgi?j=1]$_imode<\/a>\] /g;
$main_html.=<<"_HTML_";
$SYS{header}<br><br>
_HTML_
※$header_htmlから$main_htmlへ移動
▼quiz.cgi
sub startmes{(125)
#####ユーザー指定のヘッダー
local($header_opt);
$header_opt="d=$FORM{d}&m=$FORM{m}";
if($FORM{passch} ne ''){$header_opt.="&passch=$FORM{passch}";} #####パスワードの引継ぎ
$sub_header=$SYS{sub_header};
$sub_header=~ s/\$title/$SYS{main_title}/g;
$sub_header=~ s/\$sub_title/$sub_title/g;
$sub_header=~ s/\$genre/$GNR{title}/g;
$sub_header=~ s/\$top/\[[/url][url=$SYS{top_url}]$_top<\/a>\] /g;
$sub_header=~ s/\$index/\[[/url][url=$index_cgi]$SYS{main_title}<\/a>\] /g;
$sub_header=~ s/\$challenge/\[[/url][url=$quiz_cgi?$header_opt]$_try<\/a>\] /g;
$sub_header=~ s/\$high/\[[/url][url=$quiz_cgi?$header_opt&h=1]$_high<\/a>\] /g;
$sub_header=~ s/\$graph/\[[/url][url=$quiz_cgi?$header_opt&g=1]$_graph<\/a>\] /g;
$sub_header=~ s/\$score/\[[/url][url=$quiz_cgi?$header_opt&s=1]$_score<\/a>\] /g;
if(!mygrep($FORM{d},@GENRE_DIR_ORIGN) || $GENRE_LST{$FORM{d}}{cont} ne 1){
$sub_header=~ s/\$add//g;
}else{
$sub_header=~ s/\$add/\[[/url][url=$quiz_cgi?$header_opt&add=1]$_add<\/a>\] /g;
}
$sub_header=~ s/\$mode/$mode_n/g;
$SYS{header}=~ s/\$imode/\[[/url][url=$quiz_cgi?$header_op]$<\/a>\] /g;
$start_html=<<"_HTML_";
$sub_header
|
_HTML_
※$header_htmlから$start_htmlへ移動
▼quiz.cgi1671行
<table $tbl_opt><tr><td bgcolor='$DSN{th_color}'$nowrap>のnowrapを外す
▼quiz.cgi1551行
<td nowrap width=10% bgcolor='$DSN{th_color}'><small>$walign1問題文$walign2</small></td>
▼quiz.cgi1555行
<td nowrap bgcolor='$DSN{th_color}'><small>$walign1貴方の答え$walign2</small></td>
他、多数
テーブル幅
▼index.cgi(378)
<table width="$SYS{tblw}" border=0 cellpadding=0 cellspacing=0 bgcolor="$SYS{top_border_color}"><tr><td>
↓
<table width="100%" border=0 cellpadding=0 cellspacing=0 bgcolor="$SYS{top_border_color}"><tr><td>
※後で気付いたんだけど、管理画面にテーブル幅を設定するところがあり、そこが80となっていたため、
いくらファイルを変更しても、変わらなかったみたい。ただ、その元データがどれなのかは不明
▼quiz.cgi(2215)
<table width="100%" border=0 cellpadding=0 cellspacing=0 bgcolor="$DSN{border_color}"><tr><td>
▼quiz.cgi(2252)
<table width="$SYS{tblw}" border=0 cellpadding=0 cellspacing=0 bgcolor="$DSN{border_color}"><tr><td>
テーブルボーダー
▼index.cgi(2230)
$top_tbl_opt ="border='$SYS{top_border_high}' width=100% cellspacing='$SYS{top_border}' cellpadding='$SYS{top_border_in}'"; #メニューページの表のオプション
↓
$top_tbl_opt ="border='0' width=100% cellspacing='$SYS{top_border}' cellpadding='$SYS{top_border_in}'"; #メニューページの表のオプション
あるいは、呼び出し箇所を削除
▼index.cgi(381)
<table $top_tbl_opt>
↓
<table>
↓適当にクラスを設定しておく
<table class="○○">
tableの中にtableが入っている理由は、
外tableの背景色を利用し、
テーブル背景色を変化させるため
↓
利用しないのなら、テーブル入れ子構造は、不要なはず
■midi
▼quiz.cgi(1709)
mp3に変更すると、mp3が鳴る。midiも鳴る。もしかして、ここは変更しなくてもよかったのかもしれない。
design.cgiで、鳴らすmidiファイルを設置しているので、そこの変更は必須
IEはそのまま問題なく音が表示されて、FFだとプラグインが必要なのは、ブラウザの仕様(?)みたい。
ユーザにプラグインを導入させずに、FFで、midiやmp3を鳴らす方法は、調べたけど分からなかった。
■管理画面
▼quiz_op.cgi
パスワード表示画面を表示させると、レイアウト的に都合が悪いので、
ファイル(quiz_op.cgi)自体に、ベーシック認証をかける
▽.htaccess で特定のファイルのみにBasic認証を設定する方法 | .htaccess | 阿部辰也のブログ&#8213;&#8213;人生はひまつぶし。
http://www.abe-tatsuya.com/web_prog/htaccess/basic_authentication2.php
但し、ベーシック認証でキャンセルを押すと、画面遷移しない理由は、不明。
401 Authorization Required
↓
ユーザエラーページ作成で対応
<hr />
▽2011.10.7.追記
<変数中身表示>
use Data::Dumper;
print Dumper($hoge));もしくは、warn Dumper $hoge;
.htaccessへ、AddHandler cgi-script-debug .cgiを追記
=====================================================
$VAR1 = '変数$hogeの中身';
<Dumper日本語文字化け対策>
use Data::Dumper;
use encoding 'utf-8', STDOUT => 'Shift_JIS';
$out_text = Data::Dumper->Dump([$hoge]);
$out_text =~ s/\\x{([0-9a-f]{4})}/chr(hex($1))/eg;
print $out_text;
▼quiz.cgi(132)
local($header_opt);
$VAR1 = undef;
▼quiz.cgi(133)
$header_opt="d=$FORM{d}&m=$FORM{m}";
$VAR1 = 'd=クイズディレクトリ名(英小文字)&m=1';
※クイズディレクトリ名(英小文字)…piyo(仮)
▼quiz.cgi(156)
$sub_header
$VAR1 = "<table cellspacing=0 cellpadding=0 width=\"100%\"><tr><td nowarap Valign=TOP><small>[[/url][url="index.cgi\]○○クイズ[/url]] [[url=\"quiz.cgi?d=piyo&m=1\]挑戦[/url]] [[url=\"quiz.cgi?d=piyo&m=1&h=1\]高成績者[/url]] [[url=\"quiz.cgi?d=piyo&m=1&g=1\]成績分布[/url]] [[url=\"quiz.cgi?d=piyo&m=1&s=1\]出題状況[/url]] [[url=\"quiz.cgi?d=&m=1&add=1\]問題投稿[/url]] </small></td><td><div align=right><p><big><B>○○</B> </big><span>勝ち抜き戦モード</span></p></div></td></tr></table>";
↓整形
<table cellspacing=0 cellpadding=0 width=\"100%\">
<tr>
<td nowarap Valign=TOP>
<small>
[[url="index.cgi\]○○クイズ[/url]] [[url=\"quiz.cgi?d=piyo&m=1\]挑戦[/url]] [[url=\"quiz.cgi?d=piyo&m=1&h=1\]高成績者[/url]] [[url=\"quiz.cgi?d=piyo&m=1&g=1\]成績分布[/url]] [[url=\"quiz.cgi?d=piyo&m=1&s=1\]出題状況[/url]] [[url=\"quiz.cgi?d=&m=1&add=1\]問題投稿[/url]]
</small>
</td>
<td>
<div align=right><p><big><B>○○</B> </big><span>勝ち抜き戦モード</span></p></div>
</td>
</tr>
</table>
▼quiz.cgi(137)
$sub_header
$VAR1 = '<table cellspacing=0 cellpadding=0 width="100%"><tr><td nowarap Valign=TOP><small>$index$challenge$high$graph$score$add</small></td><td><div align=right><p><big><B>$genre</B>$sub_title </big><span>$mode</span></p></div></td></tr></table>';
↓整形
<table cellspacing=0 cellpadding=0 width=\"100%\">
<tr>
<td nowarap Valign=TOP>
<small>
$index$challenge$high$graph$score$add
</small>
</td>
<td>
<div align=right><p><big><B>$genre</B>$sub_title </big><span>$mode</span></p></div>
</td>
</tr>
</table>
▼管理画面、システム設定編集 → 実行 → 「サブページのヘッダー」を保存すると、system.cgi「sub_header」へ保存される
なので、クイズ挑戦ページのヘッダーを変更する際は、ここを修正する
▼クイズページのヘッダーを変更する際は、system.cgi「header」を変更する。
管理画面、システム設定編集 → 実行 → 「メニューページのヘッダー」を保存すると、system.cgi「header」へ保存されるため
■サブメニュー
▼クイズページ … メニューページ
・TOP $top → クイズページ
・管理人室 $quiz_op → 管理画面
・携帯専用] $imode → 携帯画面
▼クイズ挑戦ページ … サブページ
・○○クイズ $index → クイズページ
・挑戦 $_try($challengeへカスタマイズ) → クイズ挑戦ページ
・高成績者 $high → 高成績者情報
・成績分布 $graph → 成績履歴グラフ
・出題状況 $score → 出題状況情報
・問題投稿 $add → 問題入力フォーム
※$topと$indexの違いが不明。問題を2つ以上作成すると、分かるかも…
▼クイズページ … 2行目
・「効果音付」「効果音無」
・「個人記録表示」「個人記録非表示」
・「個人記録消去」
▼クイズページ … 3行目
・問題投稿 $add → 問題入力フォーム
・出題状況 $score → 出題状況情報
▼クイズページ … 4行目
・挑戦 $_try(画像へカスタマイズ) → クイズ挑戦ページ
・高成績者 $high → 高成績者情報
・成績分布 $graph → 成績履歴グラフ
※「勝ち抜き戦モード」「20問モード」。どちらをクリックするかによって、表示結果は異なる
遷移先別に整理
▼「勝ち抜き戦モード」「20問モード」。どちらをクリックするかによって、表示結果は異なる
・挑戦 $_try(画像へカスタマイズ) → クイズ挑戦ページ
・高成績者 $high → 高成績者情報
・成績分布 $graph → 成績履歴グラフ
▼上記以外
・管理人室 $quiz_op → 管理画面
・携帯専用] $imode → 携帯画面
・問題投稿 $add → 問題入力フォーム
・出題状況 $score → 出題状況情報
・「効果音付」「効果音無」
・「個人記録表示」「個人記録非表示」
・「個人記録消去」
▼細かい挙動不明
・TOP $top → クイズページ
・○○クイズ $index → クイズページ
新たな疑問
・個人記録とは何か?
・個人記録消去とは、具体的に何をどうすることか?
グレップ検索するも、説明が見つからないないため、
ソースから追っていく。
▼index.cgi(575)
if($COOKIE{ck} > 0){
と書かれているから、クッキーへ保存されているのでは? と推測を立てる。
FFで確認
▼効果音無
QQQ=bgm:0;
▼効果音付
QQQ=bgm:1
▼個人記録非表示
QQQ=ck:0;
▼個人記録表示
QQQ=ck:1;
▼挑戦をクリック
QQQ=CCD_piyo:1;
▼開始ボタンをクリック
QQQ=CCD_piyo:1;Spiyo:1;
▼第1問目
QQQ=CCD_piyo:1,I2piyo:7,L2piyo:0,S2piyo:1,T2piyo:7,W2piyo:1,bgm:0
▼第2問目
QQQ=A2piyo:1,CCD_piyo:1,E2piyo:1,H2piyo:1,I2piyo:18,L2piyo:1,S2piyo:1,T2piyo:25,W2piyo:1,bgm:0;
※不明なのは、I2piyo:7,L2piyo:0,T2piyo:7,W2piyo:1,A2piyo:1,CCD_piyo:1,E2piyo:1,H2piyo:1,I2piyo:18,L2piyo:1,S2piyo:1,T2piyo:25,W2piyo:1;
※CCD_piyo:1は、チャレンジコード設定。詳細は忘れたが、グレ検すれば何か出てくると思われ
いよいよ、スクリプト部分か…。
しかし、全然、分かんねー…。
しょうがないので、$COOKIEでグレ検して、ひとつひとつ処理を追っていくしかないと思われ。
出来るかな?
▼index.cgi(126)
まずは、メインプログラム。
前後の処理は不明だけど、
}elsif(($FORM{ck} eq 1)||($FORM{ck} eq 0)){
$COOKIE{ck}=$FORM{ck};
&set_cookie;
↓意訳
もしくは、「個人記録表示ボタンがクリック」、または「個人記録非表示ボタンがクリック」されていたら、
$COOKIE{ck}に、$FORM{ck}を格納して、
クッキーをセットしてね
▼index.cgi(128)
}elsif($FORM{ck} eq 2){
undef %COOKIE;
$COOKIE{ck}=1;
&set_cookie;
↓意訳
もしくは、$FORM{ck} eq 2
「$FORM{ck} eq 2」って、一体どういう状況よ?
hiddenでグレ検して、それらしき行を発見。
▼index.cgi(580)
<input type=hidden name=ck value=2>
<input type=submit value='個人記録消去'>
なるほど、個人記録消去ですか。
これをクリックすると、「$FORM{ck} eq 2」になる。
戻る。
▼index.cgi(128)
}elsif($FORM{ck} eq 2){
undef %COOKIE;
$COOKIE{ck}=1;
&set_cookie;
↓意訳
もしくは、「個人記録消去ボタンがクリック」されると、
%COOKIEを未定義にして、
個人記録表示ボタンが押された状態にして、
クッキーをセットしてね
>「undef」関数は引数に指定した変数などを未定義値(undef)に設定します
▽undef関数 - その他の関数 - Perl関数のリファレンス
http://www.perlplus.jp/func/other/index2.html
要は、「個人記録消去ボタンをクリック」すると、
それまで、クッキーに、例えば、
「QQQ=A2piyo:0,CCD_piyo:1,E2piyo:1,H2piyo:0,I2piyo:0,L2piyo:2,S2piyo:1,T2piyo:5,W2piyo:0,bgm:0,ck:1; 」とか保存されていたヤツが初期化されて(厳密には未定義になり)、その後、「QQQ=ck:1; 」となる、ということ
▼index.cgi(132)
}elsif(($FORM{bgm} eq 1)||($FORM{bgm} eq 0)){
$COOKIE{bgm}=$FORM{bgm};
&set_cookie;
}
↓意訳
もしくは、「効果音付ボタンがクリック」、または「効果音無ボタンがクリック」されていたら、
%COOKIEを未定義にして、
$COOKIE{bgm}に、1または0を格納して、
クッキーをセットしてね
▼index.cgi(340)
# ジャンルの設定などを計算し、%GENRE_CALに格納
sub lineup_html{
$COOKIE{"S1$dir"}=$COOKIE{"S1$dir"}+0;$COOKIE{"S2$dir"}=$COOKIE{"S2$dir"}+0;
$COOKIE{"E1$dir"}=$COOKIE{"E1$dir"}+0;$COOKIE{"E2$dir"}=$COOKIE{"E2$dir"}+0;
$COOKIE{"H1$dir"}=$COOKIE{"H1$dir"}+0;$COOKIE{"H2$dir"}=$COOKIE{"H2$dir"}+0;
$COOKIE{"A1$dir"}=$COOKIE{"A1$dir"}+0;$COOKIE{"A2$dir"}=$COOKIE{"A2$dir"}+0;
$cook_a1=&point($COOKIE{"A1$dir"},1);
$cook_a2=&point($COOKIE{"A2$dir"},1);
$iplay_max1=$COOKIE{"W1$dir"}+$COOKIE{"L1$dir"};
$iplay_max2=$COOKIE{"W2$dir"}+$COOKIE{"L2$dir"};
if($iplay_max1 > 0){$iave1=&point($COOKIE{"W1$dir"}/$iplay_max1*100,1);}else{$iave1='0.0';}
if($iplay_max2 > 0){$iave2=&point($COOKIE{"W2$dir"}/$iplay_max2*100,1);}else{$iave2='0.0';}
<推測>
・「S」「E」「H」「A」で一つの塊
・「S1」「E1」「H1」「A1」の「1」は、「勝ち抜き戦モード」
・「S2」「E2」「H2」「A2」の「2」は、「20問モード」
・1が正解、0が不正解
S2piyo:1,
E2piyo:1,
H2piyo:0,
A2piyo:0,
I2piyo:0,
L2piyo:2,
T2piyo:5,
W2piyo:0,
S2piyo:1,
E2piyo:1,
H2piyo:1,
A2piyo:1,
I2piyo:7,
L2piyo:0,
T2piyo:7,
W2piyo:1,
I2piyo:18,
L2piyo:1,
T2piyo:25,
W2piyo:1;
<FFで確認>
勝ち抜き戦モード
▼開始
QQQ=A1piyo:0,CCD_piyo:1,E1piyo:0,H1piyo:0,I1piyo:0,L1piyo:0,S1piyo:1,T1piyo:0,W1piyo:0,ck:1;
▼1問目 不正解
QQQ=A1piyo:0,CCD_piyo:1,E1piyo:0,H1piyo:0,I1piyo:0,L1piyo:1,S1piyo:1,T1piyo:21,W1piyo:0,bgm:0,ck:1;
▼2問目 不正解
QQQ=A1piyo:0,CCD_piyo:1,E1piyo:1,H1piyo:0,I1piyo:0,L1piyo:2,S1piyo:1,T1piyo:34,W1piyo:0,bgm:0,ck:1;
<整形 挙動が分かっているヤツは外す>
▼開始
S1piyo:1,
E1piyo:0,
H1piyo:0,
A1piyo:0,
I1piyo:0,
L1piyo:0,
T1piyo:0,
W1piyo:0,
▼1問目 不正解
S1piyo:1,
E1piyo:0,
H1piyo:0,
A1piyo:0,
I1piyo:0,
L1piyo:1,
T1piyo:21,
W1piyo:0,
▼2問目 不正解
S1piyo:1,
E1piyo:1,
H1piyo:0,
A1piyo:0,
I1piyo:0,
L1piyo:2,
T1piyo:34,
W1piyo:0,
<推測検証>
・「S」「E」「H」「A」で一つの塊 … 何とも言えない
・「S1」「E1」「H1」「A1」の「1」は、「勝ち抜き戦モード」 … ○
・「S2」「E2」「H2」「A2」の「2」は、「20問モード」 … ○
・1が正解、0が不正解 … 多分、違う
結局、コードを追っていくしかない、と思われ。
▼index.cgi(340)
$COOKIE{"S1$dir"}=$COOKIE{"S1$dir"}+0;$COOKIE{"S2$dir"}=$COOKIE{"S2$dir"}+0;
$COOKIE{"E1$dir"}=$COOKIE{"E1$dir"}+0;$COOKIE{"E2$dir"}=$COOKIE{"E2$dir"}+0;
$COOKIE{"H1$dir"}=$COOKIE{"H1$dir"}+0;$COOKIE{"H2$dir"}=$COOKIE{"H2$dir"}+0;
$COOKIE{"A1$dir"}=$COOKIE{"A1$dir"}+0;$COOKIE{"A2$dir"}=$COOKIE{"A2$dir"}+0;
上記は、単に0を足しているだけ。
理由 → 何もセットしないのがあると、後々都合が悪くなるため、それを回避するための措置と思われ。
▼index.cgi(344)
$cook_a1=&point($COOKIE{"A1$dir"},1);
$cook_a2=&point($COOKIE{"A2$dir"},1);
function.cgi(445)
sub point {
小数点位統一関数ってことなので、小数点を統一させてるだけだと思われ。探している内容とは、あんま関係ない
ちょっとこれ分からんなー、と思ってたら、ここに書いてるやん!
▼index.cgi(443)
「個人成績を表示」
・個人挑戦 : $COOKIE{"S1$dir"}
・個人完走 : $COOKIE{"E1$dir"}回
・個人出題 : $iplay_max1問
・個人最高 : $COOKIE{"H1$dir"}問
・個人正解率 : $iave1%
・個人平均 : $cook_a1問
<推測>
・「1」が「勝ち抜き戦モード」で、「2」は「20問モード」
※「$walign1」「$walign2」が何を指しているか、不明
↓
▼function.cgi(2208)
if($SYS{walign} eq 'r'){$walign1='<div align=right>';$walign2='</div>';}
elsif($SYS{walign} eq 'c'){$walign1='<center>';$walign2='</center>';}
要は、レウアウトのdiv枠を入れるかどうか、みたいなの。スクリプトとは関係ない
FFで「S1」「E1」「H2」「A2」の挙動を確認した
<これまでに把握したクッキー内容>
・「CCD_○○:1」 … チャレンジコード設定
・「1」 … 「勝ち抜き戦モード」
・「2」 … 「20問モード」
・「S」 … 「個人挑戦回数」
・「E」 … 「個人完走」
・「H」 … 「個人最高正解回答数」
・「A」 … 「個人平均(何の平均かは不明。回答問題数?)」→(例)A1mita:0.5,A2mita:1.33333333333333,
<整形 挙動が分かっているヤツは外す>
▼開始
I1piyo:0,
L1piyo:0,
T1piyo:0,
W1piyo:0,
▼1問目 不正解
I1piyo:0,
L1piyo:1,
T1piyo:21,
W1piyo:0,
▼2問目 不正解
I1piyo:0,
L1piyo:2,
T1piyo:34,
W1piyo:0,
・個人正解率 : $iave1%
$iplay_max1=$COOKIE{"W1$dir"}+$COOKIE{"L1$dir"};
$iplay_max2=$COOKIE{"W2$dir"}+$COOKIE{"L2$dir"};
if($iplay_max1 > 0){$iave1=&point($COOKIE{"W1$dir"}/$iplay_max1*100,1);}else{$iave1='0.0';}
if($iplay_max2 > 0){$iave2=&point($COOKIE{"W2$dir"}/$iplay_max2*100,1);}else{$iave2='0.0';}
より、
<推測>
・「W」 … 正解回答数
・「L」 … 不正解回答数
FFで「W」「L1」の挙動を確認した
<これまでに把握したクッキー内容>
・「CCD_○○:1」 … チャレンジコード設定
・「1」 … 「勝ち抜き戦モード」
・「2」 … 「20問モード」
・「S」 … 「個人挑戦回数」
・「E」 … 「個人完走」
・「H」 … 「個人最高正解回答数」
・「A」 … 「個人平均(何の平均かは不明。回答問題数?)」→(例)A1mita:0.5,A2mita:1.33333333333333,
・「W」 … 正解回答数
・「L」 … 不正解回答数
<整形 挙動が分かっているヤツは外す>
▼開始
I1piyo:0,
T1piyo:0,
▼1問目 不正解
I1piyo:0,
T1piyo:21,
▼2問目 不正解
I1piyo:0,
T1piyo:34,
ようやくクッキー内容把握も終わりに近づいたなと思ったら、
おいおいおいおい。
ここにまんま書いてるやん!
頼むよ、オレ!
ちゃんと、コード見ようよ、オレ!
▼quiz.cgi(1944)
# 個人成績table
#************************************************
sub individual_html{
if($COOKIE{ck} > 0){ #####個人成績表示モードの場合
if($FORM{m} eq ''){$FORM{m}=1;}
$COOKIE{"S$cid"}=$COOKIE{"S$cid"}+0; #####挑戦回数
$COOKIE{"E$cid"}=$COOKIE{"E$cid"}+0; #####完走回数
$COOKIE{"W$cid"}=$COOKIE{"W$cid"}+0; #####正解回数
$COOKIE{"L$cid"}=$COOKIE{"L$cid"}+0; #####不正解回数
$COOKIE{"A$cid"}=$COOKIE{"A$cid"}+0; #####平均正解数
$COOKIE{"H$cid"}=$COOKIE{"H$cid"}+0; #####最高記録
$COOKIE{"T$cid"}=$COOKIE{"T$cid"}+0; #####総プレイ時間
$COOKIE{"I$cid"}=$COOKIE{"I$cid"}+0; #####平均正解時間
<クッキー内容>
・「CCD_○○:1」 … チャレンジコード設定
・「1」 … 「勝ち抜き戦モード」
・「2」 … 「20問モード」
・「S」 … 「個人挑戦回数」
・「E」 … 「個人完走」
・「H」 … 「個人最高正解回答数」
・「A」 … 「個人平均正解数」
・「W」 … 正解回答数
・「L」 … 不正解回答数
・「T」 … 総プレイ時間
・「I」 … 平均正解時間
<hr />
▽2011.10.9.追記
トップページ、左右(「勝ち抜き」と「20問モード」)で色変えたい。
だけど、TOP行表示部分だけ処理異なる。
▼index.cgi(442)から、
▼index.cgi(647)を呼び出してる。
$high="<td colspan=2 bgcolor='$SYS{top_high_color}'>$walign1<small>Top:[$name] $high問正解</small>$walign2</td>";
しかも、ここだけ、変数だけじゃなくて、htmlタグ毎返している。
理由は?
他でも使ってる?
<hr />
▽2011.10.10.追記
とりあえず、表示部分についての最低限のカスタマイズは、終了。
perl分からなくても、表示部分の修正なら、何とかなるものだ。時間をかければだけど…。
構成的には、対象ブラウザで、大きく2つに分かれている。
・PC
・携帯
また、ページ構成としても、大きく2つに分かれている。
・クイズのトップページ(インデックス)
・クイズ出題ページ
主要なファイルは、大きく3つ
・index.cgi … クイズのトップページ(インデックス)用
・quiz.cgi … クイズ出題ページ用
・function.cgi … 共通(?)関数。上記両方で利用されているものもあれば、何れか一方でのみ利用されていないものもある
大まかな処理の流れとしては、
「index.cgi」「 quiz.cgi」それぞれのmain関数に処理を記述し、「function.cgi」のoutput関数(PC用・携帯用)を呼び出して出力
「 quiz.cgi」などの処理が分かりにくいのは、main関数が下に書いてあるため。これは、html部分などのユーザカスタマイズ可能(やりやすい部分)を、親切で上に掲載しているため。→ スクリプトを見る際には、分かりづらいので、変更
ブラウザからのユーザカスタマイズを許可している関係で、デフォルト設定はファイルから読み込むが(例えば、function.cgi)、
サブヘッダー部分等については、作成したファイル(例えば、system.cgi)から読み込む仕様となっている。
なので、作成したこれらのファイルを消去すると、データが飛ぶことになる。
また、ローカルから古いファイルをアップデートしても、最新データが飛ぶことになるため、注意が必要(作成ファイルについては、常にサーバが最新の意)。
テンプレがない(処理部分とデザインが分離されていない)ため、スクリプトカスタマイズはしづらい(仕様としては、出来るだけスクリプトを触らずに各種変更ができるよう工夫されている)
テンプレ導入する程、理解していない。
あくまでも、表示部分が何となく分かった気がするだけで、根本的なスクリプト部分はさっぱり理解できていない。
今後の対策としては、PHPとの連携をどうするか?
今の案としては、ファイルに保存している部分を、DBに格納できれば、
そこからデータをPHPで取り出し、サイト全体で使いまわしていくことができるだろう、というもの。
但し、クッキーとか、セッション(?)部分が不明。
perlで保存したクッキーを、PHPで利用できるのか?
クッキーは、クッキーだから、スクリプト言語なんて、関係ないのか?
要検証。
もうひとつの考え方としては、これはこれで参考として、
PHPのクイズスクリプトに、この仕様を実装していく、というもの。
まあ、何れにせよ、時間がかかりそうなことには、違いない…
「三択クイズ 2011/06/09」を、これからカスタマイズしていく予定、のパーソナルメモまずは、「QQQ SYSTEMS 圧縮ファイルver2.24 2007/06/09」の理解、及び、デザインカスタマイズから、行なってみる予定
▼index.cgi
▼quiz.cgi
▼common.cgi … 共通ファイル
<出力>
出力指定は、 3箇所
・sub output{ … PC用、function.cgi(1212)
・sub outputop{ … PC用、quiz_op.cgi(4113)
・sub output_i{ … 携帯用、function.cgi(1241)
▼index.cgi
・sub main{メインプログラムからの出力指定 &output; … index.cgi(122)
▼quiz.cgi
・sub main{メインプログラムからの出力指定 &output; … quiz.cgi(409):
<表示>
▼index.cgi … sub main{(136)
&header_html;
&○○_html;
&top_html;
&top_i_html;
&△△_html;
&footer_html;
$footer_i_html
▼quiz.cgi … sub main{(398)
&header_html(); #####ヘッダーの作成
&○○_html;
&footer_html; #####フッターの作成
&html; #####画面の表示
&set_cookie; #####クッキー情報の書き込み
&△△_html;
$footer_i_html
<ページトップ表示小ナビ(サブナビ)>
▼index.cgi
sub top_html{(155)
$SYS{header}=~ s/\$title/$SYS{main_title}/g;
$SYS{header}=~ s/\$top/\[[url=$SYS{top_url}]$_top<\/a>\] /g;
$SYS{header}=~ s/\$quiz_op/\[[/url][url=$quiz_op_cgi]管理人室<\/a>\] /g;
$SYS{header}=~ s/\$imode/\[[/url][url=$index_cgi?j=1]$_imode<\/a>\] /g;
$main_html.=<<"_HTML_";
$SYS{header}<br><br>
_HTML_
※$header_htmlから$main_htmlへ移動
▼quiz.cgi
sub startmes{(125)
#####ユーザー指定のヘッダー
local($header_opt);
$header_opt="d=$FORM{d}&m=$FORM{m}";
if($FORM{passch} ne ''){$header_opt.="&passch=$FORM{passch}";} #####パスワードの引継ぎ
$sub_header=$SYS{sub_header};
$sub_header=~ s/\$title/$SYS{main_title}/g;
$sub_header=~ s/\$sub_title/$sub_title/g;
$sub_header=~ s/\$genre/$GNR{title}/g;
$sub_header=~ s/\$top/\[[/url][url=$SYS{top_url}]$_top<\/a>\] /g;
$sub_header=~ s/\$index/\[[/url][url=$index_cgi]$SYS{main_title}<\/a>\] /g;
$sub_header=~ s/\$challenge/\[[/url][url=$quiz_cgi?$header_opt]$_try<\/a>\] /g;
$sub_header=~ s/\$high/\[[/url][url=$quiz_cgi?$header_opt&h=1]$_high<\/a>\] /g;
$sub_header=~ s/\$graph/\[[/url][url=$quiz_cgi?$header_opt&g=1]$_graph<\/a>\] /g;
$sub_header=~ s/\$score/\[[/url][url=$quiz_cgi?$header_opt&s=1]$_score<\/a>\] /g;
if(!mygrep($FORM{d},@GENRE_DIR_ORIGN) || $GENRE_LST{$FORM{d}}{cont} ne 1){
$sub_header=~ s/\$add//g;
}else{
$sub_header=~ s/\$add/\[[/url][url=$quiz_cgi?$header_opt&add=1]$_add<\/a>\] /g;
}
$sub_header=~ s/\$mode/$mode_n/g;
$SYS{header}=~ s/\$imode/\[[/url][url=$quiz_cgi?$header_op]$<\/a>\] /g;
$start_html=<<"_HTML_";
$sub_header
|
_HTML_
※$header_htmlから$start_htmlへ移動
▼quiz.cgi1671行
<table $tbl_opt><tr><td bgcolor='$DSN{th_color}'$nowrap>のnowrapを外す
▼quiz.cgi1551行
<td nowrap width=10% bgcolor='$DSN{th_color}'><small>$walign1問題文$walign2</small></td>
▼quiz.cgi1555行
<td nowrap bgcolor='$DSN{th_color}'><small>$walign1貴方の答え$walign2</small></td>
他、多数
テーブル幅
▼index.cgi(378)
<table width="$SYS{tblw}" border=0 cellpadding=0 cellspacing=0 bgcolor="$SYS{top_border_color}"><tr><td>
↓
<table width="100%" border=0 cellpadding=0 cellspacing=0 bgcolor="$SYS{top_border_color}"><tr><td>
※後で気付いたんだけど、管理画面にテーブル幅を設定するところがあり、そこが80となっていたため、
いくらファイルを変更しても、変わらなかったみたい。ただ、その元データがどれなのかは不明
▼quiz.cgi(2215)
<table width="100%" border=0 cellpadding=0 cellspacing=0 bgcolor="$DSN{border_color}"><tr><td>
▼quiz.cgi(2252)
<table width="$SYS{tblw}" border=0 cellpadding=0 cellspacing=0 bgcolor="$DSN{border_color}"><tr><td>
テーブルボーダー
▼index.cgi(2230)
$top_tbl_opt ="border='$SYS{top_border_high}' width=100% cellspacing='$SYS{top_border}' cellpadding='$SYS{top_border_in}'"; #メニューページの表のオプション
↓
$top_tbl_opt ="border='0' width=100% cellspacing='$SYS{top_border}' cellpadding='$SYS{top_border_in}'"; #メニューページの表のオプション
あるいは、呼び出し箇所を削除
▼index.cgi(381)
<table $top_tbl_opt>
↓
<table>
↓適当にクラスを設定しておく
<table class="○○">
tableの中にtableが入っている理由は、
外tableの背景色を利用し、
テーブル背景色を変化させるため
↓
利用しないのなら、テーブル入れ子構造は、不要なはず
■midi
▼quiz.cgi(1709)
mp3に変更すると、mp3が鳴る。midiも鳴る。もしかして、ここは変更しなくてもよかったのかもしれない。
design.cgiで、鳴らすmidiファイルを設置しているので、そこの変更は必須
IEはそのまま問題なく音が表示されて、FFだとプラグインが必要なのは、ブラウザの仕様(?)みたい。
ユーザにプラグインを導入させずに、FFで、midiやmp3を鳴らす方法は、調べたけど分からなかった。
■管理画面
▼quiz_op.cgi
パスワード表示画面を表示させると、レイアウト的に都合が悪いので、
ファイル(quiz_op.cgi)自体に、ベーシック認証をかける
▽.htaccess で特定のファイルのみにBasic認証を設定する方法 | .htaccess | 阿部辰也のブログ&#8213;&#8213;人生はひまつぶし。
http://www.abe-tatsuya.com/web_prog/htaccess/basic_authentication2.php
但し、ベーシック認証でキャンセルを押すと、画面遷移しない理由は、不明。
401 Authorization Required
↓
ユーザエラーページ作成で対応
<hr />
▽2011.10.7.追記
<変数中身表示>
use Data::Dumper;
print Dumper($hoge));もしくは、warn Dumper $hoge;
.htaccessへ、AddHandler cgi-script-debug .cgiを追記
=====================================================
$VAR1 = '変数$hogeの中身';
<Dumper日本語文字化け対策>
use Data::Dumper;
use encoding 'utf-8', STDOUT => 'Shift_JIS';
$out_text = Data::Dumper->Dump([$hoge]);
$out_text =~ s/\\x{([0-9a-f]{4})}/chr(hex($1))/eg;
print $out_text;
▼quiz.cgi(132)
local($header_opt);
$VAR1 = undef;
▼quiz.cgi(133)
$header_opt="d=$FORM{d}&m=$FORM{m}";
$VAR1 = 'd=クイズディレクトリ名(英小文字)&m=1';
※クイズディレクトリ名(英小文字)…piyo(仮)
▼quiz.cgi(156)
$sub_header
$VAR1 = "<table cellspacing=0 cellpadding=0 width=\"100%\"><tr><td nowarap Valign=TOP><small>[[/url][url="index.cgi\]○○クイズ[/url]] [[url=\"quiz.cgi?d=piyo&m=1\]挑戦[/url]] [[url=\"quiz.cgi?d=piyo&m=1&h=1\]高成績者[/url]] [[url=\"quiz.cgi?d=piyo&m=1&g=1\]成績分布[/url]] [[url=\"quiz.cgi?d=piyo&m=1&s=1\]出題状況[/url]] [[url=\"quiz.cgi?d=&m=1&add=1\]問題投稿[/url]] </small></td><td><div align=right><p><big><B>○○</B> </big><span>勝ち抜き戦モード</span></p></div></td></tr></table>";
↓整形
<table cellspacing=0 cellpadding=0 width=\"100%\">
<tr>
<td nowarap Valign=TOP>
<small>
[[url="index.cgi\]○○クイズ[/url]] [[url=\"quiz.cgi?d=piyo&m=1\]挑戦[/url]] [[url=\"quiz.cgi?d=piyo&m=1&h=1\]高成績者[/url]] [[url=\"quiz.cgi?d=piyo&m=1&g=1\]成績分布[/url]] [[url=\"quiz.cgi?d=piyo&m=1&s=1\]出題状況[/url]] [[url=\"quiz.cgi?d=&m=1&add=1\]問題投稿[/url]]
</small>
</td>
<td>
<div align=right><p><big><B>○○</B> </big><span>勝ち抜き戦モード</span></p></div>
</td>
</tr>
</table>
▼quiz.cgi(137)
$sub_header
$VAR1 = '<table cellspacing=0 cellpadding=0 width="100%"><tr><td nowarap Valign=TOP><small>$index$challenge$high$graph$score$add</small></td><td><div align=right><p><big><B>$genre</B>$sub_title </big><span>$mode</span></p></div></td></tr></table>';
↓整形
<table cellspacing=0 cellpadding=0 width=\"100%\">
<tr>
<td nowarap Valign=TOP>
<small>
$index$challenge$high$graph$score$add
</small>
</td>
<td>
<div align=right><p><big><B>$genre</B>$sub_title </big><span>$mode</span></p></div>
</td>
</tr>
</table>
▼管理画面、システム設定編集 → 実行 → 「サブページのヘッダー」を保存すると、system.cgi「sub_header」へ保存される
なので、クイズ挑戦ページのヘッダーを変更する際は、ここを修正する
▼クイズページのヘッダーを変更する際は、system.cgi「header」を変更する。
管理画面、システム設定編集 → 実行 → 「メニューページのヘッダー」を保存すると、system.cgi「header」へ保存されるため
■サブメニュー
▼クイズページ … メニューページ
・TOP $top → クイズページ
・管理人室 $quiz_op → 管理画面
・携帯専用] $imode → 携帯画面
▼クイズ挑戦ページ … サブページ
・○○クイズ $index → クイズページ
・挑戦 $_try($challengeへカスタマイズ) → クイズ挑戦ページ
・高成績者 $high → 高成績者情報
・成績分布 $graph → 成績履歴グラフ
・出題状況 $score → 出題状況情報
・問題投稿 $add → 問題入力フォーム
※$topと$indexの違いが不明。問題を2つ以上作成すると、分かるかも…
▼クイズページ … 2行目
・「効果音付」「効果音無」
・「個人記録表示」「個人記録非表示」
・「個人記録消去」
▼クイズページ … 3行目
・問題投稿 $add → 問題入力フォーム
・出題状況 $score → 出題状況情報
▼クイズページ … 4行目
・挑戦 $_try(画像へカスタマイズ) → クイズ挑戦ページ
・高成績者 $high → 高成績者情報
・成績分布 $graph → 成績履歴グラフ
※「勝ち抜き戦モード」「20問モード」。どちらをクリックするかによって、表示結果は異なる
遷移先別に整理
▼「勝ち抜き戦モード」「20問モード」。どちらをクリックするかによって、表示結果は異なる
・挑戦 $_try(画像へカスタマイズ) → クイズ挑戦ページ
・高成績者 $high → 高成績者情報
・成績分布 $graph → 成績履歴グラフ
▼上記以外
・管理人室 $quiz_op → 管理画面
・携帯専用] $imode → 携帯画面
・問題投稿 $add → 問題入力フォーム
・出題状況 $score → 出題状況情報
・「効果音付」「効果音無」
・「個人記録表示」「個人記録非表示」
・「個人記録消去」
▼細かい挙動不明
・TOP $top → クイズページ
・○○クイズ $index → クイズページ
新たな疑問
・個人記録とは何か?
・個人記録消去とは、具体的に何をどうすることか?
グレップ検索するも、説明が見つからないないため、
ソースから追っていく。
▼index.cgi(575)
if($COOKIE{ck} > 0){
と書かれているから、クッキーへ保存されているのでは? と推測を立てる。
FFで確認
▼効果音無
QQQ=bgm:0;
▼効果音付
QQQ=bgm:1
▼個人記録非表示
QQQ=ck:0;
▼個人記録表示
QQQ=ck:1;
▼挑戦をクリック
QQQ=CCD_piyo:1;
▼開始ボタンをクリック
QQQ=CCD_piyo:1;Spiyo:1;
▼第1問目
QQQ=CCD_piyo:1,I2piyo:7,L2piyo:0,S2piyo:1,T2piyo:7,W2piyo:1,bgm:0
▼第2問目
QQQ=A2piyo:1,CCD_piyo:1,E2piyo:1,H2piyo:1,I2piyo:18,L2piyo:1,S2piyo:1,T2piyo:25,W2piyo:1,bgm:0;
※不明なのは、I2piyo:7,L2piyo:0,T2piyo:7,W2piyo:1,A2piyo:1,CCD_piyo:1,E2piyo:1,H2piyo:1,I2piyo:18,L2piyo:1,S2piyo:1,T2piyo:25,W2piyo:1;
※CCD_piyo:1は、チャレンジコード設定。詳細は忘れたが、グレ検すれば何か出てくると思われ
いよいよ、スクリプト部分か…。
しかし、全然、分かんねー…。
しょうがないので、$COOKIEでグレ検して、ひとつひとつ処理を追っていくしかないと思われ。
出来るかな?
▼index.cgi(126)
まずは、メインプログラム。
前後の処理は不明だけど、
}elsif(($FORM{ck} eq 1)||($FORM{ck} eq 0)){
$COOKIE{ck}=$FORM{ck};
&set_cookie;
↓意訳
もしくは、「個人記録表示ボタンがクリック」、または「個人記録非表示ボタンがクリック」されていたら、
$COOKIE{ck}に、$FORM{ck}を格納して、
クッキーをセットしてね
▼index.cgi(128)
}elsif($FORM{ck} eq 2){
undef %COOKIE;
$COOKIE{ck}=1;
&set_cookie;
↓意訳
もしくは、$FORM{ck} eq 2
「$FORM{ck} eq 2」って、一体どういう状況よ?
hiddenでグレ検して、それらしき行を発見。
▼index.cgi(580)
<input type=hidden name=ck value=2>
<input type=submit value='個人記録消去'>
なるほど、個人記録消去ですか。
これをクリックすると、「$FORM{ck} eq 2」になる。
戻る。
▼index.cgi(128)
}elsif($FORM{ck} eq 2){
undef %COOKIE;
$COOKIE{ck}=1;
&set_cookie;
↓意訳
もしくは、「個人記録消去ボタンがクリック」されると、
%COOKIEを未定義にして、
個人記録表示ボタンが押された状態にして、
クッキーをセットしてね
>「undef」関数は引数に指定した変数などを未定義値(undef)に設定します
▽undef関数 - その他の関数 - Perl関数のリファレンス
http://www.perlplus.jp/func/other/index2.html
要は、「個人記録消去ボタンをクリック」すると、
それまで、クッキーに、例えば、
「QQQ=A2piyo:0,CCD_piyo:1,E2piyo:1,H2piyo:0,I2piyo:0,L2piyo:2,S2piyo:1,T2piyo:5,W2piyo:0,bgm:0,ck:1; 」とか保存されていたヤツが初期化されて(厳密には未定義になり)、その後、「QQQ=ck:1; 」となる、ということ
▼index.cgi(132)
}elsif(($FORM{bgm} eq 1)||($FORM{bgm} eq 0)){
$COOKIE{bgm}=$FORM{bgm};
&set_cookie;
}
↓意訳
もしくは、「効果音付ボタンがクリック」、または「効果音無ボタンがクリック」されていたら、
%COOKIEを未定義にして、
$COOKIE{bgm}に、1または0を格納して、
クッキーをセットしてね
▼index.cgi(340)
# ジャンルの設定などを計算し、%GENRE_CALに格納
sub lineup_html{
$COOKIE{"S1$dir"}=$COOKIE{"S1$dir"}+0;$COOKIE{"S2$dir"}=$COOKIE{"S2$dir"}+0;
$COOKIE{"E1$dir"}=$COOKIE{"E1$dir"}+0;$COOKIE{"E2$dir"}=$COOKIE{"E2$dir"}+0;
$COOKIE{"H1$dir"}=$COOKIE{"H1$dir"}+0;$COOKIE{"H2$dir"}=$COOKIE{"H2$dir"}+0;
$COOKIE{"A1$dir"}=$COOKIE{"A1$dir"}+0;$COOKIE{"A2$dir"}=$COOKIE{"A2$dir"}+0;
$cook_a1=&point($COOKIE{"A1$dir"},1);
$cook_a2=&point($COOKIE{"A2$dir"},1);
$iplay_max1=$COOKIE{"W1$dir"}+$COOKIE{"L1$dir"};
$iplay_max2=$COOKIE{"W2$dir"}+$COOKIE{"L2$dir"};
if($iplay_max1 > 0){$iave1=&point($COOKIE{"W1$dir"}/$iplay_max1*100,1);}else{$iave1='0.0';}
if($iplay_max2 > 0){$iave2=&point($COOKIE{"W2$dir"}/$iplay_max2*100,1);}else{$iave2='0.0';}
<推測>
・「S」「E」「H」「A」で一つの塊
・「S1」「E1」「H1」「A1」の「1」は、「勝ち抜き戦モード」
・「S2」「E2」「H2」「A2」の「2」は、「20問モード」
・1が正解、0が不正解
S2piyo:1,
E2piyo:1,
H2piyo:0,
A2piyo:0,
I2piyo:0,
L2piyo:2,
T2piyo:5,
W2piyo:0,
S2piyo:1,
E2piyo:1,
H2piyo:1,
A2piyo:1,
I2piyo:7,
L2piyo:0,
T2piyo:7,
W2piyo:1,
I2piyo:18,
L2piyo:1,
T2piyo:25,
W2piyo:1;
<FFで確認>
勝ち抜き戦モード
▼開始
QQQ=A1piyo:0,CCD_piyo:1,E1piyo:0,H1piyo:0,I1piyo:0,L1piyo:0,S1piyo:1,T1piyo:0,W1piyo:0,ck:1;
▼1問目 不正解
QQQ=A1piyo:0,CCD_piyo:1,E1piyo:0,H1piyo:0,I1piyo:0,L1piyo:1,S1piyo:1,T1piyo:21,W1piyo:0,bgm:0,ck:1;
▼2問目 不正解
QQQ=A1piyo:0,CCD_piyo:1,E1piyo:1,H1piyo:0,I1piyo:0,L1piyo:2,S1piyo:1,T1piyo:34,W1piyo:0,bgm:0,ck:1;
<整形 挙動が分かっているヤツは外す>
▼開始
S1piyo:1,
E1piyo:0,
H1piyo:0,
A1piyo:0,
I1piyo:0,
L1piyo:0,
T1piyo:0,
W1piyo:0,
▼1問目 不正解
S1piyo:1,
E1piyo:0,
H1piyo:0,
A1piyo:0,
I1piyo:0,
L1piyo:1,
T1piyo:21,
W1piyo:0,
▼2問目 不正解
S1piyo:1,
E1piyo:1,
H1piyo:0,
A1piyo:0,
I1piyo:0,
L1piyo:2,
T1piyo:34,
W1piyo:0,
<推測検証>
・「S」「E」「H」「A」で一つの塊 … 何とも言えない
・「S1」「E1」「H1」「A1」の「1」は、「勝ち抜き戦モード」 … ○
・「S2」「E2」「H2」「A2」の「2」は、「20問モード」 … ○
・1が正解、0が不正解 … 多分、違う
結局、コードを追っていくしかない、と思われ。
▼index.cgi(340)
$COOKIE{"S1$dir"}=$COOKIE{"S1$dir"}+0;$COOKIE{"S2$dir"}=$COOKIE{"S2$dir"}+0;
$COOKIE{"E1$dir"}=$COOKIE{"E1$dir"}+0;$COOKIE{"E2$dir"}=$COOKIE{"E2$dir"}+0;
$COOKIE{"H1$dir"}=$COOKIE{"H1$dir"}+0;$COOKIE{"H2$dir"}=$COOKIE{"H2$dir"}+0;
$COOKIE{"A1$dir"}=$COOKIE{"A1$dir"}+0;$COOKIE{"A2$dir"}=$COOKIE{"A2$dir"}+0;
上記は、単に0を足しているだけ。
理由 → 何もセットしないのがあると、後々都合が悪くなるため、それを回避するための措置と思われ。
▼index.cgi(344)
$cook_a1=&point($COOKIE{"A1$dir"},1);
$cook_a2=&point($COOKIE{"A2$dir"},1);
function.cgi(445)
sub point {
小数点位統一関数ってことなので、小数点を統一させてるだけだと思われ。探している内容とは、あんま関係ない
ちょっとこれ分からんなー、と思ってたら、ここに書いてるやん!
▼index.cgi(443)
「個人成績を表示」
・個人挑戦 : $COOKIE{"S1$dir"}
・個人完走 : $COOKIE{"E1$dir"}回
・個人出題 : $iplay_max1問
・個人最高 : $COOKIE{"H1$dir"}問
・個人正解率 : $iave1%
・個人平均 : $cook_a1問
<推測>
・「1」が「勝ち抜き戦モード」で、「2」は「20問モード」
※「$walign1」「$walign2」が何を指しているか、不明
↓
▼function.cgi(2208)
if($SYS{walign} eq 'r'){$walign1='<div align=right>';$walign2='</div>';}
elsif($SYS{walign} eq 'c'){$walign1='<center>';$walign2='</center>';}
要は、レウアウトのdiv枠を入れるかどうか、みたいなの。スクリプトとは関係ない
FFで「S1」「E1」「H2」「A2」の挙動を確認した
<これまでに把握したクッキー内容>
・「CCD_○○:1」 … チャレンジコード設定
・「1」 … 「勝ち抜き戦モード」
・「2」 … 「20問モード」
・「S」 … 「個人挑戦回数」
・「E」 … 「個人完走」
・「H」 … 「個人最高正解回答数」
・「A」 … 「個人平均(何の平均かは不明。回答問題数?)」→(例)A1mita:0.5,A2mita:1.33333333333333,
<整形 挙動が分かっているヤツは外す>
▼開始
I1piyo:0,
L1piyo:0,
T1piyo:0,
W1piyo:0,
▼1問目 不正解
I1piyo:0,
L1piyo:1,
T1piyo:21,
W1piyo:0,
▼2問目 不正解
I1piyo:0,
L1piyo:2,
T1piyo:34,
W1piyo:0,
・個人正解率 : $iave1%
$iplay_max1=$COOKIE{"W1$dir"}+$COOKIE{"L1$dir"};
$iplay_max2=$COOKIE{"W2$dir"}+$COOKIE{"L2$dir"};
if($iplay_max1 > 0){$iave1=&point($COOKIE{"W1$dir"}/$iplay_max1*100,1);}else{$iave1='0.0';}
if($iplay_max2 > 0){$iave2=&point($COOKIE{"W2$dir"}/$iplay_max2*100,1);}else{$iave2='0.0';}
より、
<推測>
・「W」 … 正解回答数
・「L」 … 不正解回答数
FFで「W」「L1」の挙動を確認した
<これまでに把握したクッキー内容>
・「CCD_○○:1」 … チャレンジコード設定
・「1」 … 「勝ち抜き戦モード」
・「2」 … 「20問モード」
・「S」 … 「個人挑戦回数」
・「E」 … 「個人完走」
・「H」 … 「個人最高正解回答数」
・「A」 … 「個人平均(何の平均かは不明。回答問題数?)」→(例)A1mita:0.5,A2mita:1.33333333333333,
・「W」 … 正解回答数
・「L」 … 不正解回答数
<整形 挙動が分かっているヤツは外す>
▼開始
I1piyo:0,
T1piyo:0,
▼1問目 不正解
I1piyo:0,
T1piyo:21,
▼2問目 不正解
I1piyo:0,
T1piyo:34,
ようやくクッキー内容把握も終わりに近づいたなと思ったら、
おいおいおいおい。
ここにまんま書いてるやん!
頼むよ、オレ!
ちゃんと、コード見ようよ、オレ!
▼quiz.cgi(1944)
# 個人成績table
#************************************************
sub individual_html{
if($COOKIE{ck} > 0){ #####個人成績表示モードの場合
if($FORM{m} eq ''){$FORM{m}=1;}
$COOKIE{"S$cid"}=$COOKIE{"S$cid"}+0; #####挑戦回数
$COOKIE{"E$cid"}=$COOKIE{"E$cid"}+0; #####完走回数
$COOKIE{"W$cid"}=$COOKIE{"W$cid"}+0; #####正解回数
$COOKIE{"L$cid"}=$COOKIE{"L$cid"}+0; #####不正解回数
$COOKIE{"A$cid"}=$COOKIE{"A$cid"}+0; #####平均正解数
$COOKIE{"H$cid"}=$COOKIE{"H$cid"}+0; #####最高記録
$COOKIE{"T$cid"}=$COOKIE{"T$cid"}+0; #####総プレイ時間
$COOKIE{"I$cid"}=$COOKIE{"I$cid"}+0; #####平均正解時間
<クッキー内容>
・「CCD_○○:1」 … チャレンジコード設定
・「1」 … 「勝ち抜き戦モード」
・「2」 … 「20問モード」
・「S」 … 「個人挑戦回数」
・「E」 … 「個人完走」
・「H」 … 「個人最高正解回答数」
・「A」 … 「個人平均正解数」
・「W」 … 正解回答数
・「L」 … 不正解回答数
・「T」 … 総プレイ時間
・「I」 … 平均正解時間
<hr />
▽2011.10.9.追記
トップページ、左右(「勝ち抜き」と「20問モード」)で色変えたい。
だけど、TOP行表示部分だけ処理異なる。
▼index.cgi(442)から、
▼index.cgi(647)を呼び出してる。
$high="<td colspan=2 bgcolor='$SYS{top_high_color}'>$walign1<small>Top:[$name] $high問正解</small>$walign2</td>";
しかも、ここだけ、変数だけじゃなくて、htmlタグ毎返している。
理由は?
他でも使ってる?
<hr />
▽2011.10.10.追記
とりあえず、表示部分についての最低限のカスタマイズは、終了。
perl分からなくても、表示部分の修正なら、何とかなるものだ。時間をかければだけど…。
構成的には、対象ブラウザで、大きく2つに分かれている。
・PC
・携帯
また、ページ構成としても、大きく2つに分かれている。
・クイズのトップページ(インデックス)
・クイズ出題ページ
主要なファイルは、大きく3つ
・index.cgi … クイズのトップページ(インデックス)用
・quiz.cgi … クイズ出題ページ用
・function.cgi … 共通(?)関数。上記両方で利用されているものもあれば、何れか一方でのみ利用されていないものもある
大まかな処理の流れとしては、
「index.cgi」「 quiz.cgi」それぞれのmain関数に処理を記述し、「function.cgi」のoutput関数(PC用・携帯用)を呼び出して出力
「 quiz.cgi」などの処理が分かりにくいのは、main関数が下に書いてあるため。これは、html部分などのユーザカスタマイズ可能(やりやすい部分)を、親切で上に掲載しているため。→ スクリプトを見る際には、分かりづらいので、変更
ブラウザからのユーザカスタマイズを許可している関係で、デフォルト設定はファイルから読み込むが(例えば、function.cgi)、
サブヘッダー部分等については、作成したファイル(例えば、system.cgi)から読み込む仕様となっている。
なので、作成したこれらのファイルを消去すると、データが飛ぶことになる。
また、ローカルから古いファイルをアップデートしても、最新データが飛ぶことになるため、注意が必要(作成ファイルについては、常にサーバが最新の意)。
テンプレがない(処理部分とデザインが分離されていない)ため、スクリプトカスタマイズはしづらい(仕様としては、出来るだけスクリプトを触らずに各種変更ができるよう工夫されている)
テンプレ導入する程、理解していない。
あくまでも、表示部分が何となく分かった気がするだけで、根本的なスクリプト部分はさっぱり理解できていない。
今後の対策としては、PHPとの連携をどうするか?
今の案としては、ファイルに保存している部分を、DBに格納できれば、
そこからデータをPHPで取り出し、サイト全体で使いまわしていくことができるだろう、というもの。
但し、クッキーとか、セッション(?)部分が不明。
perlで保存したクッキーを、PHPで利用できるのか?
クッキーは、クッキーだから、スクリプト言語なんて、関係ないのか?
要検証。
もうひとつの考え方としては、これはこれで参考として、
PHPのクイズスクリプトに、この仕様を実装していく、というもの。
まあ、何れにせよ、時間がかかりそうなことには、違いない…