#!/usr/bin/perl require 'jcode.pl'; use warnings; #タイトル $title = "大雨・大雪"; # 通行止一覧リスト $List = "list.csv"; $this="http://jikandome.atumari.net/usr/local/bin/perl/fmake-yukiame.cgi"; &main(); exit; sub main{ &form(); } #----------------------------------------------------------------- # 道路情報システムと同期を取った時刻 sub koushinDT{ my @filestat = stat $List; #$atime = localtime($filestat[8]); # アクセス日 my $mtime = localtime($filestat[9]); # 更新時刻 return $mtime; } #----------------------------------------------------------------- # 初期処理。 sub form { my($i) = 1; my(@koujimei, @rosen, @basyo, @naiyou, @hyo, @idokeido, @ji, @itaru, @yakusyo, @yakusyotantou, @ukeoi, @ukeoitantou); my(@jisshi,@id); my($j, $num); ($ss, $mn, $hh, $dd, $mm, $yy) = localtime(time); $yy += 1900; $mm += 1; print "Content-type: text/html; charset=Shift_JIS\n\n"; &get_data; #getで取得した引数の全てを表示 #foreach $key ( keys( %FORM ) ) { # print "$key=$FORM{$key} \n " #} #List.csvファイルの内容を変数に読み込む if(open(HND, $List)) { while() { chomp; if($FORM{'kensaku'}){ @lockey = split(/or/ , $FORM{'kensaku'}); (undef, undef, undef, undef, undef, undef, undef, $temp, undef, undef, undef, undef, undef, undef) = split(/#/, $_, 14); if(&ifforeach($temp , @lockey) && ($_ =~ /雪/ || $_ =~ /台風/ || $_ =~ /大雨/ || $_ =~ /豪雨/ || $_ =~ /崩壊/ || $_ =~ /雨量/ || $_ =~ /異常/)){ ($koujimei[$i], $rosen[$i], $basyo[$i], $naiyou[$i], $hyo[$i], $ji[$i], $itaru[$i], $yakusyo[$i], $yakusyotantou[$i], $ukeoi[$i], $ukeoitantou[$i], $idokeido[$i], $jisshi[$i], $id[$i]) = split(/#/, $_, 14); $i++; } } else { if($_ =~ /冬/ || $_ =~ /凍/ || $_ =~ /雪/ || $_ =~ /台風/ || $_ =~ /大雨/ || $_ =~ /豪雨/ || $_ =~ /崩壊/ || $_ =~ /雨量/ || $_ =~ /異常/){ ($koujimei[$i], $rosen[$i], $basyo[$i], $naiyou[$i], $hyo[$i], $ji[$i], $itaru[$i], $yakusyo[$i], $yakusyotantou[$i], $ukeoi[$i], $ukeoitantou[$i], $idokeido[$i], $jisshi[$i], $id[$i]) = split(/#/, $_, 14); $i++; } } } close(HND); } #if(open(HND, $List)) { # while() { # if($FORM{'kensaku'}){ # @lockey = split(/or/ , $FORM{'kensaku'}); # chomp; # (undef, undef, undef, undef, undef, undef, undef, $temp, undef, undef, undef, undef, undef, undef) = split(/#/, $_, 14); # if(&ifforeach($temp , @lockey)){ # ($koujimei[$i], $rosen[$i], $basyo[$i], $naiyou[$i], $hyo[$i], $ji[$i], $itaru[$i], $yakusyo[$i], $yakusyotantou[$i], $ukeoi[$i], $ukeoitantou[$i], $idokeido[$i], $jisshi[$i], $id[$i]) = split(/#/, $_, 14); # $i++; # } # } # else{ # ($koujimei[$i], $rosen[$i], $basyo[$i], $naiyou[$i], $hyo[$i], $ji[$i], $itaru[$i], $yakusyo[$i], $yakusyotantou[$i], $ukeoi[$i], $ukeoitantou[$i], $idokeido[$i], $jisshi[$i], $id[$i]) = split(/#/, $_, 14); # $i++; # } # } #close(HND); #} print <<"EOF"; $title @lockey EOF #工事実施日カレンダーの大きさの定義 for($j=1;$j<$i;$j++) { $num = sprintf("%02d" , $j); print <<"EOF"; EOF } $mtime = &koushinDT; #$mtime="tako"; print <<"EOF";
@lockey 【大雨 大雪】(マーカーをクリックすると詳細が出るよ) $mtime
地図の移動 三好 / 三好+美馬 / 美馬 / 吉野川 / 美波 / 那賀 / 阿南 / 徳島 / 鳴門 / 全県

EOF print <<"EOF"; EOF #各通行止めの詳細表 for($j=1;$j<$i;$j++) { $num = sprintf("%02d" , $j); #時間帯「、」を改行に変換する $hyo[$j] =~ s/、/
/g; $hyo[$j] =~ s/通行止時間:/通行止時間
/g; $rosen[$j] =~ s/ /
/g; $rosen[$j] =~ s/ /
/g; $basyo[$j] =~ s/ /
/g; $basyo[$j] =~ s/ /
/g; $yakusyotantou[$j] =~ s/ /
/g; $yakusyotantou[$j] =~ s/ /
/g; $ukeoitantou[$j] =~ s/ /
/g; $ukeoitantou[$j] =~ s/ /
/g; $Rcal_html="
路線名規制区間規制期間規制理由規制内容時間帯発注請負者規制実施日地図
".&calen_html($jisshi[$j],0)."".&calen_html($jisshi[$j],1)."
"; print <<"EOF"; $rosen[$j]$basyo[$j]$ji[$j]

$itaru[$j]$koujimei[$j]$naiyou[$j]$hyo[$j]$yakusyo[$j]
$yakusyotantou[$j]$ukeoi[$j]
$ukeoitantou[$j] $Rcal_html EOF } print <<"EOF";
EOF } sub parse_input{ if ($ENV{'REQUEST_METHOD'} eq "POST") { read(STDIN,$buffer,$ENV{'CONTENT_LENGTH'}); } else { $buffer = $ENV{'QUERY_STRING'}; } &jcode'convert(*buffer,'sjis'); @pairs = split(/&/,$buffer); foreach $pair (@pairs) { ($name, $value) = split(/=/, $pair); $name =~ tr/+/ /; $name =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; $value =~ tr/+/ /; $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; # 記録するデータはsjisに統一する &jcode'convert(*name,'sjis'); &jcode'convert(*value,'sjis'); $value =~ s//>/g; $value =~ s/://g; $value =~ s/,//g; $FORM{$name} = $value; } } #--------- sub routine (カレンダー)---------- sub calen_html($$){ #選択日のバックが赤になる #IN : 第1引数(チェックする日)、第2引数(今月を基準として±何月のカレンダーを表示するかmax12) $choiced=$_[0]; # 月の末日の指定(左から順に1月、2月・・・) @days = (31,28,31,30,31,30,31,31,30,31,30,31); $col=0; $font_color = 'black'; #フォントカラー $font_color_pre = 'darkgray'; #フォントカラー(本日より前) $choice_color = '#FFC3CE'; #バックカラー選択日 $day_bgcolor = '#ffffff'; #バックカラーそれ以外 $sat_color = '#0000FF'; #フォントカラー土曜日 $sun_color = '#FF0000'; #フォントカラー日曜・祝日 # 現在の日時を取得 ($second,$minute,$hour,$day,$month_now,$year_now)=localtime(); $year_now += 1900; $month_now += 1; #本日の月 if( $month_now + $_[1]>12){ $month = 1; $year_now += 1; $year=$year_now+1; } else{ $month = $month_now + $_[1]; #表示する月 $year=$year_now; } # うるう年の判定(4の倍数ならうるう年、しかし100の倍数ならうるう年でない、また400の倍数ならうるう年) if( (($year_now%4 ==0)&&($year_now%100 != 0))||($year_now%400 == 0) ){ $days[1]=29; } # 月の初日の曜日(ツェラーの公式)、月の末日を取得 $start = wday($year_now,$month,1); $lastday=$days[$month-1]; # カレンダー表示 $ret= "$year_now\年\ $month\月
"; # 月の初日の前まで、表のセルにスペース(改行)を入れる if($start!=0){ $ret=$ret.""; for($i=0;$i<$start;$i++){ $ret=$ret.""; $col++; } } # カレンダーのセルを作成 for($i=1;$i<=$lastday;$i++){ $bgcolor=$day_bgcolor; if(($i<$day && ($month<=$month_now && $year eq $year_now)) || $year < $year_now){$color=$font_color_pre;} #本日より前は日の色を灰色にする else {$color=$font_color;} if($col==0 && $i>=$day){ $ret=$ret.""; $color=$sun_color;} if($col==6 && $i>=$day){ $color=$sat_color;} if($i==$day){ $color=$font_todaycolor;} if(&sentakued($choiced,$year_now,$month,$i)){ $bgcolor=$choice_color; } $ret=$ret.""; $col++; if($col>=7){ $ret=$ret.""; if ($i<$lastday) { $col=0; } } } for($i=$col;$i<7;$i++){ $ret=$ret.""; } $ret=$ret."

$i

"; return $ret; } sub wday { my ($year,$month,$day)=@_; if($month<3){ $month += 12; $year--; } return ($year+int($year/4)-int($year/100)+int($year/400)+int((13*$month+8)/5)+$day)% 7; } #選択日の月を返す sub sentakued{ #IN : 検索する日の集合,年,月,日 #OUT : 1=存在したとき 0=存在しなかったとき my $i,@bunkai,$m,$d,$y; @bunkai=split(/,/,$_[0]); for($i=0;$i<=$#bunkai;$i++){ ($m,$d,$y)=split(/\//,$bunkai[$i]); if ($m==$_[2] && $d==$_[3] && $y==$_[1]){return 1;} } return 0; } sub get_data{ if ($ENV{'REQUEST_METHOD'} eq "POST") { read(STDIN,$buffer,$ENV{'CONTENT_LENGTH'}); } else { $buffer = $ENV{'QUERY_STRING'}; } &jcode'convert(*buffer,'sjis'); @pairs = split(/&/,$buffer); foreach $pair (@pairs) { ($name, $value) = split(/=/, $pair); $name =~ tr/+/ /; $name =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; $value =~ tr/+/ /; $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; # 記録するデータはsjisに統一する &jcode'convert(*name,'sjis'); &jcode'convert(*value,'sjis'); $value =~ s//>/g; $value =~ s/://g; $value =~ s/,//g; $FORM{$name} = $value; } } sub ifforeach($\@){ my ($moji,@key)=@_; foreach(@key){ if ($moji =~ m/$_/) {return 1;} } return 0; }