#!/usr/local/bin/perl
# ************** go53.cgi V1.0(2003/8/30)*************
# 53次CGIの本体
# Copyright (c) とまて
# 配布元URL:『go53.cgiのページ』http://www3.kcn.ne.jp/~tomate/o_gate/go53.html
# 『とまての実験室』http://www3.kcn.ne.jp/~tomate/index 内
#############################################################
# jcode.plを組み込む必要があります。PATHは、設置の環境により指定します。
require 'jcode.pl';
$pass_set="x"; # パスワードの指定""でパスワード無し
$me="go53.cgi"; # このCGIの名前
$logfile="go53_log.txt"; # データログファイルの名前
$outputhtml="go53_disp.html";# 地図表示HTMLファイルの名前(go53.cgiから見た相対パス付きで)
$html_to_cgi="./"; # HTMLファイルの位置からCGIファイルへのパス。(絶対パスでも可)
$mapfile="mapB.gif"; # 53次の画像ファイル名(相対パスでも絶対パスでも可)
$color1="color1.gif"; # これから進む宿場の色を指定する画像
$color2="color2.gif"; # 既に到達した宿場の色を指定する画像
$checked=""; # 万歩計を使用する場合は"CHECKED"、距離で入力する場合は""
$keisuu=0.73; # 一歩あたりの距離をメートル単位で
$form_call=1; # 1でフォーム呼び出しボタンを表示:0で非表示
$max_km=100; # 一回当りの入力の最大値
$total_max=-1; # 合計値の最大値
$stock_num=100; # データ保存数
#############################################################
$map_left=20; # 地図のページ左端からの位置
$map_top=110; # 地図のページ上部からの位置
$map_height=259; # 地図の高さ
$map_width=745; # 地図の幅
@p_53=(725,718,704,697,690,683,668,654,621,604,577,563,551,537,530,522,511,
503,495,479,465,458,449,441,430,418,404,386,370,354,339,331,320,305,297,
287,278,266,246,231,220,191,176,169,161,148,135,126,107,98,83,63,40,21,13,2);
@k_53=(0,7.8,17.7,27.5,32.4,41.2,49.1,62.8,65.8,81.5,98.1,112.9,118.8,124.7,136.5,147.7,
151.6,160.8,164.9,174.5,181.2,189,195.7,204.5,208.4,215,222.1,231.6,237.6,255,265,
270.8,277.4,283.2,288.5,299.5,301.3,310.1,316.8,331.8,341.8,349.4,376.9,389.6,396.8,403.1,
408.7,416.9,423.4,433.2,443.8,457.5,469.3,483.7,495.5,500,500);
@shukuba=('日本橋','品川','川崎','神奈川','保土谷','戸塚','藤沢','平塚','大磯','小田原','箱根','三島','沼津','原','吉原','蒲原','由比','興津',
'江尻','府中','丸子','岡部','藤枝','島田','金谷','日坂','掛川','袋井','見附','浜松','舞阪','新居','白須賀','二川','吉田','御油','赤坂',
'藤川','岡崎','地鯉鮒','鳴海','宮','桑名','四日市','石薬師','庄野','亀山','関','坂下','土山','水口','石部','草津','大津','三条大橋','500km地点');
if($form_call==1){
$form_call="<INPUT TYPE=\"button\" VALUE=\"入力フォーム\" onClick=\"window.open('$html_to_cgi$me','formwin','width=350,height=450');\">";
}else{
$form_call="";
}
$logo='<A HREF="http://www3.kcn.ne.jp/~tomate/o_gate/go53.html"><SPAN STYLE="font-size:6pt;color:white;background-color:olive">
go53.cgi</SPAN></A>';
# 使用する配列や変数を作成する
@data=();
@date5=();
@test=();
$map_out="";
@page_data=();
$toutatu_position=0;
# ファイル入力サブルーチンをコールする
# testinput.txtの内容を@dataに入力する。
$errinp=&fileinput($logfile,"data");
if($errinp==1){$message="ログファイル($logfile)が開けません<BR>";}
$data_n=@data;
# 最新5日分のデータをエディット用に取り出す
&pick_5days;
# 6日前の累計値
if($data_n>5){
@dmy=split("\t",$data[$data_n-6]);
$ruikei6=$dmy[2];
}else{
$ruikei6=0;
}
# 日付
($sec , $min , $hour, $mday, $mon, $year ,$wday) = localtime();
$datenow =sprintf("%04d/%02d/%02d",$year + 1900, $mon + 1, $mday);
# 最新の累計値
if($data_n>0){
@dmy=split("\t",$data[$data_n-1]);
$x_pos=$dmy[2];
}else{
$x_pos=0;
}
# 古いユーザーコメントの抜き出し
$errinp=&fileinput($outputhtml,"page_data");
if($errinp==1){$message="地図表\示HTML($outputhtml)が開けません<BR>";}
$page_data=join("\n",@page_data);
$pos1=index $page_data,"<!-map_position-->";
$pos3=index $page_data,"<SPAN",$pos1;
$pos3=index $page_data,"<SPAN",$pos3+4;
$pos3=index $page_data,">",$pos3;
$pos4=index $page_data,"<",$pos3;
$usercom=substr($page_data,$pos3+1,$pos4-$pos3-1);
%form = &read_input_tagles('sjis');
$pass =$form{'pass'};
$disp =$form{'disp'};
if ($ENV{'REQUEST_METHOD'} eq "POST" && ($pass ne $pass_set && $pass_set ne "")){$message="パスワードが違います<BR>"}
if ($ENV{'REQUEST_METHOD'} eq "POST" && ($pass eq $pass_set)||($pass_set eq "")){
#--------------------↓フォームデータ読み込み---------------------
$send =$form{'send'};
if($x_pos>$total_max && $total_max>0){
$message="前回の到達距離が$total_maxを超えていますので、データを一旦全て削除します。<BR>";
$send="データを全て削除";}
if($send eq "入力"){
$date =$form{'date'};
$kyori =$form{'kyori'}+0;
$meter_on =$form{'meter_on'};
$coefficient =$form{'coefficient'};
if($meter_on==1){$kyori=int($kyori*$coefficient/100)/10;}else{$kyori=int($kyori*10)/10;}
if($kyori>$max_km){$kyori=$max_km;$message="$max_km"."km以上だったので$max_kmで入力されました。<BR>"}else{$kyori=int($kyori*10)/10;}
if($kyori>0){
$x_pos=$x_pos+$kyori;
$data[$data_n]="$date\t$kyori\t$x_pos";
for($i=0;$i<4;$i++){
$date5[$i]=$date5[$i+1];
$kyori5[$i]=$kyori5[$i+1];
}
$date5[4]=$date;
$kyori5[4]=$kyori;
$data_n=$data_n++;
}else{$message="100m未満は入力できません。<BR>";}
}elsif($send eq "修正"){
$kyori5[0] =int(($form{'kyori_0'}+0)*10)/10;
$kyori5[1] =int(($form{'kyori_1'}+0)*10)/10;
$kyori5[2] =int(($form{'kyori_2'}+0)*10)/10;
$kyori5[3] =int(($form{'kyori_3'}+0)*10)/10;
$kyori5[4] =int(($form{'kyori_4'}+0)*10)/10;
$date5[0] =$form{'date_0'};
$date5[1] =$form{'date_1'};
$date5[2] =$form{'date_2'};
$date5[3] =$form{'date_3'};
$date5[4] =$form{'date_4'};
$usercom =$form{'usercom'};
$x_pos=$ruikei6;
for($i=0;$i<5;$i++){
if($kyori5[$i]>$max_km){$kyori5[$i]=$max_km;$message="$max_km"."km以上だったので$max_kmで入力されました。<BR>";}else{$kyori5[$i]=int($kyori5[$i]*10)/10;}
$x_pos=$x_pos+$kyori5[$i];
$data[$is+$i]="$date5[$i]\t$kyori5[$i]\t$x_pos";
}
}elsif($send eq "チェックしたものを削除"){
$del[0] =$form{'del0'};
$del[1] =$form{'del1'};
$del[2] =$form{'del2'};
$del[3] =$form{'del3'};
$del[4] =$form{'del4'};
# 詰めて
$x_pos=$ruikei6;
$ip=0;
for($i=0;$i<5;$i++){
if($del[$i] != 1){
$x_pos=$x_pos+$kyori5[$i];
$data[$is+$ip]="$date5[$i]\t$kyori5[$i]\t$x_pos";
$ip++;
}
}
# 詰めた分だけ不要になったデータを消します。
$irest=5-$ip;
for($i=0;$i<$irest;$i++){
pop(@data);
$data_n--;
}
# 新たにエディットエリアにデータを格納し直す。
@date5=();
@kyori5=();
&pick_5days;
$x_pos=$dmy[2];
}
if($send eq "データを全て削除"){
@data=("");
$x_pos=0;
for($i=0;$i<5;$i++){
$date5[$i]="";
$kyori5[$i]=0;
}
}
if($data_n-1>$stock_num){
$errinp=&fileout($logfile,"data",1,$data_n-$stock_num,$data_n);
if($errinp==1){$message="ログファイル($logfile)が開けません<BR>";}
}else{
$errinp=&fileout($logfile,"data",1);
if($errinp==1){$message="ログファイル($logfile)が開けません<BR>";}
}
# 地図の表示のための操作
$oufukusuu=0;
$x_pos_d=sprintf("%10.1f",$x_pos);
while($x_pos_d-$kyori5[4]>= $k_53[55]){
$x_pos_d=sprintf("%10.1f",$x_pos_d-$k_53[55]);
$oufukusuu++;
}
for($i=0;$i<56;$i++){
if($x_pos_d<$k_53[$i]){last;}
}
$toutatu_position=$i-1;
$next=sprintf("%10.1f",$k_53[$toutatu_position+1]-$x_pos_d);
$rest=sprintf("%10.1f",500-$x_pos_d);
if($x_pos_d>=$k_53[55]){
$seiha=1;
$next=0-$next;
$oufukusuu++;
}else{
$seiha=0;
}
if($seiha != 1){
# 累積距離の表示
$kiroku="<B>累積距離:$x_pos"."km</B> ";
# 1回以上の場合に回数と地点を表示する
if($oufukusuu>0){
$kiroku=$kiroku.($oufukusuu+1)."回目の$x_pos_d"."km地点 ";
}
# 日本橋の場合は出発、それ以外は到達と書く
if($toutatu_position>0){
$kiroku=$kiroku."<B>$shukuba[$toutatu_position]宿</B>($toutatu_position番)に到達 ";
}else{
$kiroku=$kiroku."<B>$shukuba[$toutatu_position]宿</B>($toutatu_position番)を出発 ";
}
# 次の宿場までの距離
if($next!=0){$kiroku=$kiroku."次の<B>$shukuba[$toutatu_position+1]宿</B>までの距離:$next"."km";}
# ゴールまでの距離
$kiroku=$kiroku."<TABLE STYLE=\"font-size:12pt;color:black\"><TR><TD WIDTH=\"100%\">ゴール(500kmポイント)までの距離:$rest"."km</TD>";
}else{
# ゴールに到達した場合の表示
$kiroku="<B>累積距離は$x_pos"."km</B> ゴール(500km地点)に".($oufukusuu)."回めの到着しました。";
if($next!=0){
$kiroku=$kiroku."<TABLE STYLE=\"font-size:12pt;color:black\"><TR><TD WIDTH=\"100%\">余った$next"."km は次の旅に加算します!!</TD>";
}else{
$kiroku=$kiroku."<TABLE STYLE=\"font-size:12pt;color:black\"><TR><TD WIDTH=\"100%\"></TD>";
}
}
&map_change;
#--------------------↑フォームデータ読み込み---------------------
}
#--------------------↓ページの表示----------------------
print "Content-type: text/html\n\n";
if($disp eq "1"){
print "$page_data";
}else{
&test_page;
}
exit();
#===================↓ここからサブルーチン=============================
sub test_page{
print <<"HIA1";
<HTML>
<HEAD>
<TITLE>入力FORM</TITLE>
<META HTTP-EQUIV="content-type" CONTENT="text/html;charset=SHIFT_JIS" >
</HEAD>
<BODY STYLE="font-size:11pt">
<!------------------------↓作成したフォームの記述箇所------------------>
<FORM ACTION="$me" METHOD="POST">
<SPAN STYLE="color:#ef0000;font-weight:bold">$message</SPAN>
パスワード <INPUT TYPE="password" NAME="pass" VALUE="$pass" SIZE="12" MAXLENGTH="12">
<A HREF="$outputhtml" TARGET="go53">[HTML表\示]</A>
<A HREF="$me?disp=1" TARGET="go53">[CGI表\示]</A>
<HR>
新しい日付の分を入力<BR>
<INPUT TYPE="text" NAME="date" SIZE="15" MAXLENGTH="10" VALUE="$datenow">
<INPUT TYPE="text" NAME="kyori" SIZE="10" MAXLENGTH="10" VALUE=""><BR>
<INPUT TYPE="submit" NAME="send" VALUE="入力"><A HREF="$me">[再読み込み]</A><BR>
(100でリミットします)<BR>
距離は0.1km=100m単位で入力できます。<BR>
<INPUT TYPE="checkbox" NAME="meter_on" VALUE="1"$checked>万歩計モード<BR>
1歩あたりの距離m <INPUT TYPE="text" NAME="coefficient" VALUE="$keisuu" SIZE="10" MAXLENGTH="10"><BR>
<HR>
最新5日間のデータ(修正可能\)<BR>
<INPUT TYPE="text" NAME="date_0" SIZE="15" MAXLENGTH="10" VALUE="$date5[0]">
<INPUT TYPE="text" NAME="kyori_0" SIZE="10" MAXLENGTH="10" VALUE="$kyori5[0]"><INPUT TYPE="checkbox" NAME="del0" VALUE="1"><BR>
<INPUT TYPE="text" NAME="date_1" SIZE="15" MAXLENGTH="10" VALUE="$date5[1]">
<INPUT TYPE="text" NAME="kyori_1" SIZE="10" MAXLENGTH="10" VALUE="$kyori5[1]"><INPUT TYPE="checkbox" NAME="del1" VALUE="1"><BR>
<INPUT TYPE="text" NAME="date_2" SIZE="15" MAXLENGTH="10" VALUE="$date5[2]">
<INPUT TYPE="text" NAME="kyori_2" SIZE="10" MAXLENGTH="10" VALUE="$kyori5[2]"><INPUT TYPE="checkbox" NAME="del2" VALUE="1"><BR>
<INPUT TYPE="text" NAME="date_3" SIZE="15" MAXLENGTH="10" VALUE="$date5[3]">
<INPUT TYPE="text" NAME="kyori_3" SIZE="10" MAXLENGTH="10" VALUE="$kyori5[3]"><INPUT TYPE="checkbox" NAME="del3" VALUE="1"><BR>
<INPUT TYPE="text" NAME="date_4" SIZE="15" MAXLENGTH="10" VALUE="$date5[4]">
<INPUT TYPE="text" NAME="kyori_4" SIZE="10" MAXLENGTH="10" VALUE="$kyori5[4]"><INPUT TYPE="checkbox" NAME="del4" VALUE="1"><BR>
ユーザーのミニコメント(30字以内)<BR>
<INPUT TYPE="text" NAME="usercom" VALUE="$usercom" SIZE="55" MAXLENGTH="30"><BR>
<INPUT TYPE="submit" NAME="send" VALUE="修正">
<INPUT TYPE="submit" NAME="send" VALUE="チェックしたものを削除">
<INPUT TYPE="submit" NAME="send" VALUE="データを全て削除"><BR>
</FORM>
<!------------------------↑作成したフォームの記述箇所------------------>
</BODY>
</HTML>
HIA1
}
#********************************************************
sub map_change{
$map_left=20;
$map_top=110;
$pos1=index $page_data,"map_area";
$pos2=rindex $page_data,"top",$pos1;
$com_top=substr($page_data,$pos2+4,5)+2;
$map_top=$com_top+80;
$pos2=rindex $page_data,"left",$pos1;
$map_left=substr($page_data,$pos2+5,5)+2;
$cre_top=$map_top+260;
$blue_width=$p_53[$toutatu_position]+1;
$red_left=$map_left+$blue_width;
$red_width=$map_width-$blue_width;
#------------------地図表示部作成-----------------------------------
$map_out= <<"HIA1";
<DIV STYLE="position:absolute;left:$map_left;top:$map_top"><IMG SRC="$color1" WIDTH="$blue_width" HEIGHT="$map_height"></DIV>
<DIV STYLE="position:absolute;left:$red_left;top:$map_top"><IMG SRC="$color2" WIDTH="$red_width" HEIGHT="$map_height"></DIV>
<DIV STYLE="position:absolute;left:$map_left;top:$com_top;width:$map_width;font-size:12pt;background-color:white;color:black;line-height:140%;padding:5px">
$kiroku
<TD>$logo$form_call
</TD></TR></TABLE>
<CENTER><SPAN STYLE="font-weight:bold;background-color:#FFDDDD">$usercom</SPAN></CENTER>
</DIV>
<DIV STYLE="position:absolute;left:$map_left;top:$map_top"><IMG SRC="$mapfile" HEIGHT="$map_height" WIDTH="$map_width"></DIV>
HIA1
#-------------------HTMLに組み込む-----------------------------------
$pos1=index $page_data,"<!-map_position-->";
$pos2=index $page_data,"<!-/map_position-->";
if($pos1>0 && $pos2>0){
$headder=substr($page_data,0,$pos1);
$footer=substr($page_data,$pos2,length($page_data)-$pos2);
}else{
$pos1=index $page_data,"<\/BODY>";
$headder=substr($page_data,0,$pos1);
$footer="<!-/map_position-->\n</BODY>\n</HTML>";
}
$page_data=$headder."<!-map_position-->\n".$map_out.$footer;
@page_data=("$page_data");
$errinp=&fileout($outputhtml,"page_data",1);
if($errinp==1){$message="地図表\示HTML($outputfile)が開けません<BR>";}
}
sub pick_5days{
@date5=();
@kyori5=();
if($data_n>=5){
$is=$data_n-5;
$ie=$data_n-1;
}else{
$is=0;
$ie=$data_n-1;
}
for($i=$is;$i<=$ie;$i++){
@dmy=split("\t",$data[$i]);
$date5[$i-$ie+4]=$dmy[0];
$kyori5[$i-$ie+4]=$dmy[1];
}
}
sub fileinput{
$err=0;
$filename=$_[0];
$hensuumei=$_[1];
if ( !open (FILE_IO, $filename) ){
$err=1;
}
else{
@$hensuumei = <FILE_IO>;
close(FILE_IO);
}
$cntend=@$hensuumei-1;
for ($i=0;$i<=$cntend;$i++){
$$hensuumei[$i]=~s/\r//g;
$$hensuumei[$i]=~s/\n//g;
}
return($err);
}
#====================================================================
# ファイル出力サブルーチン__ &fileout(出力ファイル名,変数名,書き込みモード,start,end)
# ※書き込みモードは、0:追加書き込み、1:上書き保存
sub fileout{
$err=0;
$filename=$_[0];
$hensuumei=$_[1];
$overwrite=$_[2];
$istart=$_[3];
$iend=$_[4];
$cntend=@$hensuumei-1;
if($istart eq "" && $iend eq ""){
$istart=0;
$iend=$cntend;
}
if($istart<0 || $istart>$iend || $iend>$cntend){
$err=1;
}else{
if($overwrite==1){
$openname=">".$filename;
}else{
$openname=">>".$filename;
}
# ファイルに格納する。
if ( !open (FILE_IO, $openname) ){
$err=1;
}else{
for ($i=$istart;$i<=$iend;$i++){
print FILE_IO $$hensuumei[$i]."\n";
}
close (FILE_IO);
}
}
return($err);
}
##############################################################
# # # read_input : フォームからのデータを分解し # # $form{'xxxx'} で返す。
# # # # 引数 1: 'euc' or 'jis' or 'sjis' # # #
# タグ避け追加 byとまて
##############################################################
sub read_input_tagles {
$charset = $_[0];
$charset = 'euc' if ( $charset eq '' );
local ($buffer, @pairs, $pair, $name, $value, %FORM);
# Read in text
$ENV{'REQUEST_METHOD'} =~ tr/a-z/A-Z/;
if($ENV{'REQUEST_METHOD'} eq "POST") {
read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});
}else{ $buffer = $ENV{'QUERY_STRING'};}
@pairs = split(/&/, $buffer);
foreach $pair (@pairs) {
($name, $value) = split(/=/, $pair);
$value =~ tr/+/ /;
$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
&jcode'convert(*value, $charset);
$value =~ s/&/&/g;
$value =~ s/</</g;
$value =~ s/>/>/g;
$FORM{$name} = $value;
}
%FORM;
}
__END__