package tqlib; # ###################################################################### ### ### ### CGIクイズシステム TakaQ Ver.2.05 ### [5/5] 関数ライブラリ (tqlib.pl) ### (c) 1996-1999 Takahiro Nishida ### http://www.mytools.net/ ### ### ###################################################################### # ### 変数設定部 (詳細は上記ページをご覧下さい) ###################### # データファイルのディレクトリ $basedir = "."; # CGIプログラムの拡張子 $ext = "cgi"; # フォーム内容の送信方法 $method = "post"; # 文字コード $code = "sjis"; # 管理者メールアドレス $email = "your\@mail.address"; # 「戻る」を押したときに移動するURL $backurl = "http://your.top/page.html"; ### 変数設定部 (ここまで)########################################### require "./jcode.pl"; $lockfile = "$basedir/lockdir/tq.lock"; $verno = "2.05"; ##### 日本語のデコード sub decode{ local($org, $tag)=@_; $org =~ tr/+/ /; $org =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; $org =~ s/\t//g; $org =~ s/&/&/g; unless($tag){ $org =~ s//>/g; } &jcode'convert(*org, $code); $org; } ##### 現在の時刻を得る sub get_time{ local($tsec) = time(); local($sec, $min, $hour, $mday, $mon, $year) = localtime($tsec); $mon++; $year += 1900; return sprintf("%02d/%02d/%02d %02d:%02d", $year, $mon, $mday, $hour, $min); } ##### 変数に不正な文字がないかどうかチェック sub checkvar{ ($_[0] =~ /[%\.\/;]/) && (&error("", 11)); } ##### 秒を「何分何秒」になおす sub change_time{ local($time)=@_; local ($min, $sec); $min = int($time/60); $sec = $time%60; if($sec < 10){ $sec="0$sec"; } "$min分$sec秒"; } ##### データファイルの作成 sub make_datafile{ local( $file, $data ) = @_; open( FILE, ">$file" ) || die &error( $file, 0 ); print FILE $data; close(FILE); } ##### 空ファイルの作成 sub make_emptyfile{ local( $file ) = @_; open( FILE, ">$file" ) || die &error( $file, 0 ); close(FILE); } ##### 百分率の計算 (a/b) sub calc_rate{ local($a, $b) = @_; local ($t) = ($b) ? int($a/$b*1000) : 0; if($t==0){ $t="00"; } substr($t, -1, 0) = "."; $t; } ##### 指定されたディレクトリのクイズファイルの個数をカウント sub count_quiz{ local ($dir) = @_; local ($p) = 1; while(open(FILE,"$dir/$p.q")){ close(FILE); $p++; } $p--; $p; } ##### ファイルロック sub file_lock{ $try=0; while(!(symlink("$$",$lockfile))){ if(++$try>3){ &error("", 99, 'いつまで経ってロックが解除されない場合は管理者に連絡して下さい'); } sleep(1); } } ############################################## # symlink が使えないサーバー用のファイルロック ############################################## #sub file_lock{ # $try=0; # while(-f $lockfile){ # if(++$try>3){ # &error("", 99, 'いつまで経ってロックが解除されない場合は管理者に連絡して下さい'); # } # sleep(1); # } # open(FILE,">$lockfile") || die &error($lockfile,0); # close(FILE); #} ############################################## ##### ロック解除 sub unlock{ unlink($lockfile); } ##### Ver.2.01以前で使われていた関数のダミー sub lock_check{ 1; } ##### 各種エラーメッセージ sub error{ local($file, $id, $detail) = @_; local(@sts) = lstat($lockfile); local($tn) = time(); $fmid[0] = 1; $msgs[0] = 'に書き込めません'; $fmid[1] = 1; $msgs[1] = 'が開けません'; $fmid[2] = 1; $msgs[2] = 'が壊れています'; $fmid[3] = 0; $msgs[3] = '(変数)が取得できません'; $fmid[4] = 0; $msgs[4] = '得点データが壊れています'; $fmid[5] = 0; $msgs[5] = '入力内容に誤りがあります
名前は必須です'; $fmid[6] = 0; $msgs[6] = '入力内容に誤りがあります
メールアドレスが不正です'; $fmid[7] = 0; $msgs[7] = '入力内容に誤りがあります
URLが不正です'; $fmid[8] = 0; $msgs[8] = '得点データがありません
二重登録しようとしていませんか?'; $fmid[9] = 1; $msgs[9] = '出題数が問題数を上回っています。
管理者の設定ミスです。'; $fmid[10] = 1; $msgs[10] = '出題数か問題数が0になっています。
管理者の設定ミスです。'; $fmid[11] = 1; $msgs[11] = 'ジャンル名が不正です'; $fmid[99] = 0; $msgs[99] = 'ロック中です'; $fmsgs[0] = "Backを押して戻ってください"; $fmsgs[1] = "管理者$emailに連絡してください"; $fid = $fmid[$id]; print "TakaQ - Error!!\n"; print "\n"; print "
エラー発生

\n"; print "

$file $msgs[$id]

\n"; if($detail){ print "

($detail)

\n"; } print "

$fmsg[$fid]

\n"; print "
[クイズのトップへ] [戻る]
\n"; print ""; &unlock if ($id != 99); # ID が 99 以外の場合はロック解除 &unlock if ($tn - $sts[9] > 15); # 約15秒以上ロックが続いてたら自動解除 exit; } sub copyright{ print "
Powered By TakaQ Ver.$verno
\n"; } 1;