package lib; #----------------------------------------------------------# # 姫君スクリプト ライブラリ Version 3.4 # #----------------------------------------------------------# # ---------------------------------------------------------- # Windows対応flock # 引き数:ロックファイル名 # 戻り値:1=ロックファイルが存在する # 0=ロックファイルが存在しない sub FlockOn { local($lockfile) = @_; if(-f "$lockfile"){ local($ltime) = (stat("$lockfile"))[9]; if ($ltime && $ltime < time - 60) { &FlockOff($lockfile); return 0; } else { return 1; } }else{ if(open(LOCK,">$lockfile")){ print LOCK "lock"; close(LOCK); chmod 0777, "$lockfile"; return 0; }else{ return 0; } } } # ---------------------------------------------------------- # Windows対応unflock # 引き数:ロックファイル名 # 戻り値:なし sub FlockOff { local($lockfile) = @_; unlink("$lockfile"); } # ---------------------------------------------------------- # 2000年問題に対応した日付けを求める # 引き数:gettimeやtimeの戻り値 # 戻り値:年、月、日、曜日、時間、分、秒 sub getdatetime { local($time,$jisa) = @_; local($sec,$min,$hour,$day,$mon,$year,$wday,$yday,$isdst); if($time eq ""){$time = time;} ($sec,$min,$hour,$day,$mon,$year,$wday,$yday,$isdst) = localtime($time + $jisa*60*60); $year = $year+1900; $mon = $mon+1; return($year,$mon,$day,$wday,$hour,$min,$sec); } # ---------------------------------------------------------- # 月末の数字を求める # 引き数:年、月 # 戻り値:月末の数字 sub getgetumatu { local($year,$mon) = @_; @monthday = ('31','28','31','30','31','30','31','31','30','31','30','31'); if($mon != 2){ return(@monthday[$mon-1]); }else{ if(&leapyear($year)){ return(29); }else{ return(28); } } } # ---------------------------------------------------------- # 曜日を求める # 引き数:年、月、日 # 戻り値:曜日の数字 # 0="日",1="月",2="火",3="水",4="木",5="金",6="土" sub getyoubi { local($year,$mon,$day) = @_; local($time,$sec,$min,$hour,$wday,$yday,$isdst); $time = &gettime($year,$mon,$day); ($sec,$min,$hour,$day,$mon,$year,$wday,$yday,$isdst) = gmtime($time); return($wday); } # ---------------------------------------------------------- # localtimeやgmtimeの引き数にできる数字を求める # 引き数:年、月、日 # 戻り値:localtimeやgmtimeの引き数にできる数字 sub gettime { local($year,$mon,$day) = @_; local($daynum,$time,$i); @monthday = ('31','28','31','30','31','30','31','31','30','31','30','31'); $daynum = 0; $mon = $mon - 1; $daynum += ($year-1)*365+int(($year-1)/4)-int(($year-1)/100)+int(($year-1)/400); for($i = 0; $i < $mon; $i++){ $daynum += $monthday[$i]; if($i == 1 && &leapyear($year)){ $daynum++; } } $daynum += $day; $time = ($daynum - 719163) * 24 * 60 * 60; return ($time); } # ---------------------------------------------------------- # 閏年の判定 # 引き数:年 # 戻り値:1=閏年、0=閏年じゃない sub leapyear { local($year) = @_; if(($year % 4 == 0 && $year % 100 != 0) || $year % 400 == 0){ return 1; }else{ return 0; } } # ---------------------------------------------------------- # 未来の日付算出 # 引き数:年月日(YYYYMMDD)、日数 # 戻り値:年月日(YYYYMMDD) # ※一週間以内の日付までしか対応していません(2ヶ月又借りは、NG) sub FutureDay { local($ymd,$n) = @_; local($year,$mon,$day,$w_day); $year = substr($ymd,0,4); $mon = substr($ymd,4,2); $day = substr($ymd,6,2); if ($n != 0) { $w_day = &getgetumatu($year,$mon); if (($day+$n) <= $w_day) { $day = $day + $n; } else { if ($mon >= 12){ $year++; $mon = 1; }else{ $mon++; } $day = ($day + $n) - $w_day; } $wyear = sprintf("%04d", $year) . sprintf("%02d", $mon) . sprintf("%02d", $day); } else { $wyear = $ymd; } $wyobi = &getyoubi($year,$mon,$day); return ($wyear,$wyobi); } # ---------------------------------------------------------- # 経過日数の算出 # 引き数:基点年月日(YYYYMMDD) # 戻り値:経過日数(基点年月日から今日までの経過日数) sub Kdays { use Time::Local; local($day) = @_; local($time,$time1,$w_year,$w_mon,$w_day,$kdays); $w_year = substr($day,0,4); $w_mon = substr($day,4,2); $w_day = substr($day,6,2); $time = timelocal(0, 0, 0, $w_day, $w_mon - 1, $w_year); $time1 = time; $kdays = int(abs(($time1 - $time) / 60 / 60 / 24)); return ($kdays); } # ---------------------------------------------------------- # 祝日のデータ格納処理(年単位) # 引き数:年 # 戻り値:祝日データ sub DayModify { local($year) = @_; local($i,$j,$k,$Holiday); local($shun,$yearly_year,$yearly_mon,$yearly_day,$yearly_dat); local($event_flag,$yearly_flag,$j,$weekday,$yearly_day_tmp); local(@yearly_tmp,@event_sort); local($w_youbi,$weekcnt,$cntstart_day,$cntstart_youbi,$tmpcnt); local(@Holiday) = (); local(@eventlist) = (); #a1 :月 日 内容 平日=0/休日=1 #a2/a3:月 週数 曜日 内容 平日=0/休日=1 push(@Holiday,"a1\t1\t1\t元旦\t1"); push(@Holiday,"a1\t1\t15\t成人の日\t1"); push(@Holiday,"a1\t2\t11\t建国記念の日\t1"); push(@Holiday,"a1\t4\t29\tみどりの日\t1"); push(@Holiday,"a1\t5\t3\t憲法記念日\t1"); push(@Holiday,"a1\t5\t4\t国民の休日\t1"); push(@Holiday,"a1\t5\t5\tこどもの日\t1"); push(@Holiday,"a1\t7\t20\t海の日\t1"); push(@Holiday,"a1\t9\t15\t敬老の日\t1"); push(@Holiday,"a1\t10\t10\t体育の日\t1"); push(@Holiday,"a1\t11\t23\t勤労感謝の日\t1"); push(@Holiday,"a1\t11\t3\t文化の日\t1"); push(@Holiday,"a1\t12\t23\t天皇誕生日\t1"); push(@Holiday,"a1\t12\t24\tクリスマスイブ\t0"); push(@Holiday,"a1\t12\t25\tクリスマス\t0"); push(@Holiday,"a1\t12\t31\t大晦日\t0"); push(@Holiday,"a2\t1\t2\t1\t成人の日\t1"); push(@Holiday,"a2\t10\t2\t1\t体育の日\t1"); push(@Holiday,"a3\t7\t3\t1\t海の日\t1"); push(@Holiday,"a3\t9\t3\t1\t敬老の日\t1"); if($year < 2000){ foreach (@Holiday) { # a1のみ抽出 if($_ =~ /^a1/){ push(@eventlist, "$_\t$year\n"); } } } else { if ($year < 2003) { foreach (@Holiday) { # a2|a3|体育の日|成人の日以外を抽出(後でa2を追加) if(!/^a2|a3|体育の日|成人の日/){ push(@eventlist, "$_\t$year\n"); } } } else { foreach (@Holiday) { # a2|a3|体育の日|成人の日|海の日|敬老の日以外を抽出(後でa2とa3を追加) if(!/^a2|a3|体育の日|成人の日|海の日|敬老の日/){ push(@eventlist, "$_\t$year\n"); } } } } # 春分の日の割出し(1980年以降に適用) $shun = int(20.8431+0.242194*($year-1980)-int(($year-1980)/4)); push(@eventlist,"a1\t3\t$shun\t春分の日\t1\t$year\n"); # 秋分の日の割出し(1980年以降に適用) $shuu = int(23.2488+0.242194*($year-1980)-int(($year-1980)/4)); push(@eventlist,"a1\t9\t$shuu\t秋分の日\t1\t$year\n"); # 振替休日のチェック for($j = 0; $j <= $#eventlist; $j++){ ($event_flag,$yearly_mon,$yearly_day,$yearly_dat,$yearly_flag,$yearly_year) = split(/\t/,@eventlist[$j]); if ($event_flag eq "a1"){ $weekday = &getyoubi($year,$yearly_mon,$yearly_day); if ($weekday == 0 && $yearly_flag == 1 && $yearly_dat ne "憲法記念日" && $yearly_dat ne "国民の休日"){ $yearly_day_tmp = $yearly_day + 1; push(@eventlist,"$event_flag\t$yearly_mon\t$yearly_day_tmp\t振替休日\t1\t$year\n"); } } } # 改正祝日法に対応 if($year >= 2000) { @yearly_tmp = (); foreach (@Holiday) { if($_ =~ /^a2/){ push(@yearly_tmp, "$_\t$year\n"); }} if($year >= 2003) { foreach (@Holiday) { if($_ =~ /^a3/){push(@yearly_tmp, "$_\t$year\n");} }} for($i = 0; $i <= $#yearly_tmp; $i++){ ($event_flag,$yearly_mon,$weekcnt,$w_youbi,$yearly_dat,$yearly_flag,$yearly_year) = split(/\t/,@yearly_tmp[$i]); if($weekcnt == 1){$cntstart_day = 1;} elsif($weekcnt == 2){$cntstart_day = 8;} elsif($weekcnt == 3){$cntstart_day = 15;} elsif($weekcnt == 4){$cntstart_day = 22;} elsif($weekcnt == 5){$cntstart_day = 29;} $cntstart_youbi = &getyoubi($year,$yearly_mon,$cntstart_day); $tmpcnt = $w_youbi - $cntstart_youbi; if($tmpcnt < 0){ $yearly_day_tmp = $cntstart_day + (7 + $tmpcnt); } else { $yearly_day_tmp = $cntstart_day + $tmpcnt; } push(@eventlist,"$event_flag\t$yearly_mon\t$yearly_day_tmp\t$yearly_dat\t$yearly_flag\t$year\n"); } } @event_sort = sort @eventlist; return(@event_sort); } # ---------------------------------------------------------- # 祝日/振替休日等の取得 # 引き数:年、月、日、祝日データ # 戻り値:祝日フラグ(0=平日 1=祝日/振替休日等) sub MakeEvent { local($eyear,$emon,$eday,@eventlist) = @_; local($i,$flag); $flag = 0; for($i = 0; $i <= $#eventlist; $i++){ ($e_i,$e_mon,$e_day,$e_e,$e_flag,$e_year) = split(/\t/,@eventlist[$i]); if($eyear == $e_year && $emon == $e_mon && $eday == $e_day){ $flag = $e_flag; last; } } return($flag); } # ---------------------------------------------------------- # 日付曜日編集 sub Yobi { local($flg,$year,$today,$f_suncolor,$f_satcolor,@wdays_j) = @_; local(@holiday, @wflag, @w_day, @w_yobi, @p_hi); local($wi, $f_day, $w_year, $w_mon); # 祝日/振替休日等の算出 @holiday = &DayModify($year); # 祝日/振替休日等の取得 @wflag = (); @w_day = (); @w_yobi = (); @p_hi = (); for ($wi = 0; $wi <= 6; $wi++){ ($f_day,$w_yobi[$wi]) = &FutureDay($today,$wi); $w_year = substr($f_day,0,4); $w_mon = substr($f_day,4,2); $w_day[$wi] = substr($f_day,6,2); # 祝日/振替休日等の算出 if ($year != $w_year) { @holiday = &DayModify($w_year); } $wflag[$wi] = &MakeEvent($w_year,$w_mon,$w_day[$wi],@holiday); # 0=日 6=土 , 1=休日 if ($w_yobi[$wi] == 0 || $wflag[$wi] == 1) { if ($flg == 1) { $p_hi[$wi] = "$w_mon/$w_day[$wi]($wdays_j[$w_yobi[$wi]])"; } elsif ($flg == 2) { $p_hi[$wi] = "$w_day[$wi]($wdays_j[$w_yobi[$wi]])"; } elsif ($flg == 3) { $p_hi[$wi] = "$w_mon/$w_day[$wi]($wdays_j[$w_yobi[$wi]])"; } else { $p_hi[$wi] = "$wdays_j[$w_yobi[$wi]]"; } } elsif ($w_yobi[$wi] == 6) { if ($flg == 1) { $p_hi[$wi] = "$w_mon/$w_day[$wi]($wdays_j[$w_yobi[$wi]])"; } elsif ($flg == 2) { $p_hi[$wi] = "$w_day[$wi]($wdays_j[$w_yobi[$wi]])"; } elsif ($flg == 3) { $p_hi[$wi] = "$w_mon/$w_day[$wi]($wdays_j[$w_yobi[$wi]])"; } else { $p_hi[$wi] = "$wdays_j[$w_yobi[$wi]]"; } } else { if ($flg == 1) { $p_hi[$wi] = "$w_mon/$w_day[$wi]($wdays_j[$w_yobi[$wi]])"; } elsif ($flg == 2) { $p_hi[$wi] = "$w_day[$wi]($wdays_j[$w_yobi[$wi]])"; } elsif ($flg == 3) { $p_hi[$wi] = "$w_mon/$w_day[$wi]($wdays_j[$w_yobi[$wi]])"; } else { $p_hi[$wi] = "$wdays_j[$w_yobi[$wi]]"; } } } return (@p_hi); } # ---------------------------------------------------------- # JPEG画像サイズ取得 # 引き数:JPEGファイル # 戻り値:横サイズ、縦サイズ # http://www.kent-web.com/ sub JpegSize { local($jpeg) = @_; local($t, $m, $c, $l, $W, $H); open(JPEG, "$jpeg") || return (0,0); binmode JPEG; read(JPEG, $t, 2); while (1) { read(JPEG, $t, 4); ($m, $c, $l) = unpack("a a n", $t); if ($m ne "\xFF") { $W = $H = 0; last; } elsif ((ord($c) >= 0xC0) && (ord($c) <= 0xC3)) { read(JPEG, $t, 5); ($H, $W) = unpack("xnn", $t); last; } else { read(JPEG, $t, ($l - 2)); } } close(JPEG); return ($W, $H); } # ---------------------------------------------------------- # GIF画像サイズ取得 # 引き数:GIFファイル # 戻り値:横サイズ、縦サイズ # http://www.kent-web.com/ sub GifSize { local($gif) = @_; local($data); open(GIF,"$gif") || return (0,0); binmode(GIF); sysread(GIF,$data,10); close(GIF); if ($data =~ /^GIF/) { $data = substr($data,-4); } $W = unpack("v",substr($data,0,2)); $H = unpack("v",substr($data,2,2)); return ($W, $H); } # ---------------------------------------------------------- # PNG画像サイズ取得 # 引き数:PNGファイル # 戻り値:横サイズ、縦サイズ # http://www.bloodyeck.com/wwwis/ sub PngSize { local($PNG) = @_; local($head, $a, $b, $c, $d, $e, $f, $g, $h); open(PNG,"$PNG") || return (0,0); binmode(PNG); if (defined(PNG) && read(PNG, $head, 8) == 8 && $head eq "\x89\x50\x4e\x47\x0d\x0a\x1a\x0a" && read(PNG, $head, 4) == 4 && read(PNG, $head, 4) == 4 && $head eq "IHDR" && read(PNG, $head, 8) == 8) { ($a,$b,$c,$d,$e,$f,$g,$h) = unpack("C"x8, $head); } else { return (0,0); } close(PNG); return ($a<<24|$b<<16|$c<<8|$d, $e<<24|$f<<16|$g<<8|$h); } # ---------------------------------------------------------- # ユーザーエージェント情報取得 # 戻り値:端末種別 #「$ua = 1」 -> i-mode端末 #「$ua = 2」 -> SoftBank端末 #「$ua = 3」 -> EZweb端末 #「$ua = 4」 -> PC sub getAgent { # ユーザーエージェント取得 $agent = $ENV{'HTTP_USER_AGENT'}; # サブスクライバID取得 $subno = $ENV{'HTTP_X_UP_SUBNO'}; # i-mode if ($agent =~ /DoCoMo/i) { $ua = 1; # vodafone } elsif ($agent =~ m|J-PHONE/[^\/]+/([^\/]+)|i || $agent =~ /Vodafone/|i || $agent =~ /^MOT\-/|i || $agent =~ /SoftBank/|i) { $ua = 2; # EZweb } elsif ($agent =~ /UP\.Browser/i) { $ua = 3; # PC } else { $ua = 4; } return($ua); } # ---------------------------------------------------------- # エラーメッセージ処理 sub error { local($ermsg,$erkbn) = @_; print "Content-type: text/html\n\n"; print "\n"; print "\n"; print "\n"; if($erkbn eq "jmp"){ print ""; } print "error\n"; print "\n"; print "\n"; print "
\n"; if ($erkbn eq "end"){ print "

ERROR !

\n"; print "

$ermsg\n"; print "


\n"; print "
"; print ""; print "
"; }elsif($erkbn eq "back"){ print "

ERROR !

\n"; print "

$ermsg\n"; print "


\n"; print "
"; print ""; print "
"; }elsif($erkbn eq "clr"){ print "

ERROR !

\n"; print "

$ermsg\n"; print "


\n"; print "
"; print ""; print "
"; }else{ print "

ERROR !

\n"; print "

$ermsg\n"; print "


\n"; } print "
\n"; print "\n"; print "\n"; exit 1; } 1;