#!/usr/local/bin/perl

## LimeCounter v2.1
## Copyright (c) KentWeb

# 外部ファイル取り込み
require './init.pl';

# 外部データ受け取り
$buf = $ENV{'QUERY_STRING'};
$buf =~ s/\W//g;

# IPアドレス取得
$addr = $ENV{'REMOTE_ADDR'};

# ファイル定義
$datafile = "$datadir/$buf.dat";
#$lockfile = "$lockdir/$buf.lock";
$lockfile = "./lock/$addr.lock";
&lock;
if ($skipflag) {goto E;}
###################アクセス者IPの全記録（開始）####################
# ログファイル
$logfile = "../dayx/dayx.dat";

# 記録ファイルから読み込み
open(INLOG,"$logfile") || &error("Open Error: $logfile");
flock(INLOG,1);
@datalog = <INLOG>;
flock(INLOG,8);
close(INLOG);

$cnt_dayx = 0;
foreach $datalog (@datalog) {
	$cnt_dayx++;
}

$cnt_sa = 0;
if ($cnt_dayx > 5000) {
	$cnt_sa = $cnt_dayx - 5000;
}

while ($cnt_sa > 0) {
	shift @datalog;
	$cnt_sa--;
}

$datalog = pop @datalog;

# 記録ファイルを分解
($key,$yes,$today,$countlog,$youbi,$iplog,$click,$allip,$proxcnt,$td_newip,$td_newprox,$td_oldip,$td_oldprox) = split(/<>/, $datalog);

while ($countlog == 1) {
	$datalog = pop @datalog;
}
push (@datalog,"$datalog");

# 記録ファイルを分解
($key,$yes,$today,$countlog,$youbi,$iplog,$click,$allip,$proxcnt,$td_newip,$td_newprox,$td_oldip,$td_oldprox) = split(/<>/, $datalog);

# 日時を取得
$ENV{'TZ'} = "JST-9";
($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);
@week = ('Sun','Mon','Tue','Wed','Thu','Fri','Sat');
$year += 1900;
$mon++;
$thisday = $week[$wday];
if ($hour < 10) { $hour = "0$hour"; }
if ($min < 10) { $min = "0$min"; }
if ($sec < 10) { $sec = "0$sec"; }
if ($mon < 10) { $mon = "0$mon"; }
$date = "$year\/$mon";
if ($mday < 10) { $mday = "0$mday"; }
$year_last2 = substr($year, 2);
$month = "NAM$year_last2\P$year$mon$mday\($thisday\)";
$year_y = $year;
$mon_y = $mon;
if (($mday eq "01") && ($mon eq "01")) {
	$year_y = $year - 1;
	$mon_y = 12; 
} elsif ($mday eq "01") {
 	$mon_y = $mon - 1;
}
$monthy = "NAM$year_last2\P$year_y$mon_y$key\($youbi\)";

# ファイル定義
$megfile = "../lime_PLIST/$month.htm";
$megfiley = "../lime_PLIST/$monthy.htm";
$listfile = "$month.htm";
$meglist = "../lime_PLIST/NAM$year_last2\PLIST.htm";
$yearlist = "../lime_PLIST/NAMYEARPLIST.htm";
$todip = "../dayx/todip.dat";
$aipf = "../dayx/allip.dat";
$lockfile = "../dayx/lock/dayx.lock";
$ipfile = "../lime/namvlz/$addr.htm";

$host = gethostbyaddr(pack("C4",split(/\./,$ENV{'REMOTE_ADDR'})),2);
$software = $ENV{'SERVER_SOFTWARE'};
#X$docroot = $ENV{'DOCUMENT_ROOT'};
$gatewayi = $ENV{'GATEWAY_INTERFACE'};
$addr = $ENV{'REMOTE_ADDR'};
$rmethod = $ENV{'REQUEST_METHOD'};
$ruser = $ENV{'REMOTE_USER'};
$path = $ENV{'PATH'};
#X$vsname = $ENV{'VSERVER_NAME'};
$tz = $ENV{'TZ'};
$con = $ENV{'HTTP_CONNECTION'};
$accept = $ENV{'HTTP_ACCEPT'};
$acceptl = $ENV{'HTTP_ACCEPT_LANGUAGE'};
$authtype = $ENV{'AUTH_TYPE'};
$accepte = $ENV{'HTTP_ACCEPT_ENCODING'};
#X$scrfname = $ENV{'SCRIPT_FILENAME'};
$scname = $ENV{'SCRIPT_NAME'};
$sname = $ENV{'SERVER_NAME'};
#X$requri = $ENV{'REQUEST_URI'};
$sport = $ENV{'SERVER_PORT'};
$clength = $ENV{'CONTENT_LENGTH'};
$httphost = $ENV{'HTTP_HOST'};
#X$sadmin = $ENV{'SERVER_ADMIN'};
$referer = $ENV{'HTTP_REFERER'};
#X$uagent = $ENV{'HTTP_USER_AGENT'};
#X$acceptc = $ENV{'HTTP_ACCEPT_CHARSET'};

$cachec = $ENV{'HTTP_CACHE_CONTROL'};
#X$cachei = $ENV{'HTTP_CACHE_INFO'};
#X$client = $ENV{'HTTP_CLIENT_IP'};
$forw = $ENV{'HTTP_FORWARDED'};
#X$pragma = $ENV{'HTTP_PRAGMA'};
#X$proxy = $ENV{'HTTP_PROXY'};
#X$pcon = $ENV{'HTTP_PROXY_CONNECTION'};
#X$ppass = $ENV{'HTTP_PROXY_PASS'};
#X$puser = $ENV{'HTTP_PROXY_USER'};
#X$sphost = $ENV{'HTTP_SP_HOST'};
$te = $ENV{'HTTP_TE'};
$via = $ENV{'HTTP_VIA'};
#X$xon = $ENV{'HTTP_XONNECTION'};
$xforw = $ENV{'HTTP_X_FORWARDED_FOR'};
#X$xlocking = $ENV{'HTTP_X_LOCKING'};
#X$xcon = $ENV{'HTTP_XROXY_CONNECTION'};

#X$from = $ENV{'HTTP_FROM'};
#X$modify = $ENV{'HTTP_IF_MODIFIED_SINCE'};
$sprtcl = $ENV{'SERVER_PROTOCOL'};
$pathi = $ENV{'PATH_INFO'};
$patht = $ENV{'PATH_TRANSLATED'};
$querys = $ENV{'QUERY_STRING'};
$autht = $ENV{'AUTH_TYPE'};
#X$rid = $ENV{'REMOTE_IDENT'};
$ctype = $ENV{'CONTENT_TYPE'};

#----------------#
#  日次カウント  #
#----------------#
	# （ログの日次キー）≠（本日の日）の時、日付が変わったと判断する
#	$flg_do = 0;
	if ($mday != $key) {
		if (($mday eq "01") && ($mon eq "01")) {
			open(YLIST,">>$yearlist") || &error("Open Error: $yearlist");
			flock(YLIST,2);
			print YLIST "<A HREF='${meglist}' target='_blank'>$year\年</A>→\n";
			flock(YLIST,8);
			close(YLIST);
			open(LIST,">>$meglist") || &error("Open Error: $meglist");
			flock(LIST,2);
			print LIST "<html>\n<head>\n<META HTTP-EQUIV='Content-type' CONTENT='text\/html; charset=Shift_JIS'>\n<title>$year\年<\/title>\n<\/head>\n<body BGCOLOR='#00FF93'>\n<A HREF='\.\.\/lime\/limelist\.pl' target='_blank'>ファイル登録<\/A>　　　<A HREF='\.\.\/\.\.\/lime_DL\/limelist\.pl' target='_blank'>動画登録<\/A>　　　<A HREF='\.\.\/\.\.\/lime_SMPL\/limelist\.pl' target='_blank'>視聴データ登録<\/A><BR><BR>\n";
			flock(LIST,8);
			close(LIST);
		}
#		$flg_do = 1;
#		open(DAT,">>$megfiley") || &error("Open Error: $megfiley");
#		flock(DAT,2);
#		print DAT "<\/table>\n<\/body>\n<\/html>\n";
#		flock(DAT,8);
#		close(DAT);
		#-------------------
		open(TODIP,">$todip") || &error("Open Error: $todip");
		flock(TODIP,2);
		print TODIP "$addr\n";
		flock(TODIP,8);
		close(TODIP);

		$ipf1 = "../dayx/allip.dat";
		open(ALLIPF,"$ipf1") || &error("Open Error: $ipf1");
		flock(ALLIPF,1);
		@ipf_data = <ALLIPF>;
		flock(ALLIPF,8);
		close(ALLIPF);

		$ipf2 = "../dayx/lock/allip.sav";
		open(IPFSAV,"> $ipf2") || &error("Open Error: $ipf2");
		flock(IPFSAV,2);
		print IPFSAV @ipf_data;
		flock(IPFSAV,8);
		close(IPFSAV);
		#-------------------
#		open(DB,">>$megfile") || &error("Open Error: $megfile");
#		flock(DB,2);
#		print DB "<html>\n<head>\n<META HTTP-EQUIV='Content-type' CONTENT='text/html; charset=Shift_JIS'>\n<title>$year\年$mon\月$mday\日($thisday\)</title>\n</head>\n<body BGCOLOR='#00FF93'>\n<table frame='border' border='2'>\n<TR><TH align='right'>年月日(HH:MM:SS)</TH><TH>host</TH><TH>addr(≠P)</TH><TH>閲覧</TH><TH>cookie</TH><TH>from</TH><TH>referer</TH><TH>autht</TH><TH>clength</TH><TH>ctype</TH><TH>docroot</TH><TH>gatewayi</TH><TH>accept</TH><TH>acceptc</TH><TH>accepte</TH><TH>acceptl</TH><TH>cachep</TH><TH>con</TH><TH>httphost</TH><TH>modify</TH><TH>uagent</TH><TH>path</TH><TH>pathi</TH><TH>patht</TH><TH>querys</TH><TH>rid</TH><TH>rport(≠P)</TH><TH>ruser</TH><TH>rmethod</TH><TH>requri</TH><TH>scrfname</TH><TH>scname</TH><TH>sadmin</TH><TH>sname</TH><TH>sport</TH><TH>sprtcl</TH><TH>sprotoc</TH><TH>software</TH><TH>vsname</TH><TH>tz</TH><TH>cachec(P)</TH><TH>cachei(P)</TH><TH>client(P)</TH><TH>forw(P)</TH><TH>pragma(P)</TH><TH>proxy(P)</TH><TH>pcon(P)</TH><TH>ppass(P)</TH><TH>puser(P)</TH><TH>sphost(P)</TH><TH>te(P)</TH><TH>via(P)</TH><TH>xforw(P)</TH><TH>xlocking(P)</TH><TH>xon(P)</TH><TH>xcon(P)</TH></TR>\n";
#		
#		
#		
#		
#		print DB "<TR><TD>$year\年$mon\月$mday\日($thisday\) ($hour\：$min\：$sec\)</TD><TD>$host</TD><TD><A HREF='${ipfile}' target='_blank'>$addr</A></TD><TD><A HREF='http://192.168.11.3/lime_DL/limelog.htm' target='_blank'>$buf</A></TD><TD>$cookie</TD><TD>$from</TD><TD>$referer</TD><TD>$autht</TD><TD>$clength</TD><TD>$ctype</TD><TD>$docroot</TD><TD>$gatewayi</TD><TD>$accept<BR>$datalog</TD><TD>$acceptc</TD><TD>$accepte</TD><TD>$acceptl</TD><TD>$cachep</TD><TD>$con</TD><TD>$httphost</TD><TD>$modify</TD><TD>$uagent</TD><TD>$path</TD><TD>$pathi</TD><TD>$patht</TD><TD>$querys</TD><TD>$rid</TD><TD>$rport</TD><TD>$ruser</TD><TD>$rmethod</TD><TD>$requri</TD><TD>$scrfname</TD><TD>$scname</TD><TD>$sadmin</TD><TD>$sname</TD><TD>$sport</TD><TD>$sprtcl</TD><TD>$sprotoc</TD><TD>$software</TD><TD>$vsname</TD><TD>$tz</TD><TD>$cachec</TD><TD>$cachei</TD><TD>$client</TD><TD>$forw</TD><TD>$pragma</TD><TD>$proxy</TD><TD>$pcon</TD><TD>$ppass</TD><TD>$puser</TD><TD>$sphost</TD><TD>$te</TD><TD>$via</TD><TD>$xforw</TD><TD>$xlocking</TD><TD>$xon</TD><TD>$xcon</TD></TR>\n";
#		flock(DB,8);
#		close(DB);
		#
		$htmfile = "http://192.168.11.3/Logfiles/ex$year_last2$mon$mday\.htm";
		open(LIST,">>$meglist") || &error("Open Error: $meglist");
		flock(LIST,2);
#		print LIST "<A HREF='${listfile}' target='_blank'>$year\年$mon\月$mday\日($thisday\)</A> <A HREF='${htmfile}' target='_blank'>(LOG)</A>→\n";
		print LIST "<A HREF='${htmfile}' target='_blank'>$year\年$mon\月$mday\日($thisday\)</A>→\n";
		flock(LIST,8);
		close(LIST);
	}
	# 同じ日付の処理
	else {
		#-------------------
		# today ipファイルから読み込み
		open (TODIP,"$todip") || &error("Open Error: $todip");
		flock(TODIP,1);
		@todip = <TODIP>;
		flock(TODIP,8);
		close(TODIP);

		$flagip = 0;
		foreach $todip (@todip) {
		   chop($todip);
		   if ($addr eq $todip){
		        $flagip = 1;
		        goto TODIP_END;
		   }
		}
TODIP_END:
		if (!$flagip) {
			open (TODIP,">> $todip") || &error("Open Error: $todip");
			flock(TODIP,2);
			print TODIP "$addr\n";
			flock(TODIP,8);
			close(TODIP);
		}
		#-------------------
#		open(DB,">>$megfile") || &error("Open Error: $megfile");
#		flock(DB,2);
#		
#		
#		
#		
#		
#		print DB "<TR><TD>$year\年$mon\月$mday\日($thisday\) ($hour\：$min\：$sec\)</TD><TD>$host</TD><TD><A HREF='${ipfile}' target='_blank'>$addr</A></TD><TD><A HREF='http://192.168.11.3/lime_DL/limelog.htm' target='_blank'>$buf</A></TD><TD>$cookie</TD><TD>$from</TD><TD>$referer</TD><TD>$autht</TD><TD>$clength</TD><TD>$ctype</TD><TD>$docroot</TD><TD>$gatewayi</TD><TD>$accept<BR>$datalog</TD><TD>$acceptc</TD><TD>$accepte</TD><TD>$acceptl</TD><TD>$cachep</TD><TD>$con</TD><TD>$httphost</TD><TD>$modify</TD><TD>$uagent</TD><TD>$path</TD><TD>$pathi</TD><TD>$patht</TD><TD>$querys</TD><TD>$rid</TD><TD>$rport</TD><TD>$ruser</TD><TD>$rmethod</TD><TD>$requri</TD><TD>$scrfname</TD><TD>$scname</TD><TD>$sadmin</TD><TD>$sname</TD><TD>$sport</TD><TD>$sprtcl</TD><TD>$sprotoc</TD><TD>$software</TD><TD>$vsname</TD><TD>$tz</TD><TD>$cachec</TD><TD>$cachei</TD><TD>$client</TD><TD>$forw</TD><TD>$pragma</TD><TD>$proxy</TD><TD>$pcon</TD><TD>$ppass</TD><TD>$puser</TD><TD>$sphost</TD><TD>$te</TD><TD>$via</TD><TD>$xforw</TD><TD>$xlocking</TD><TD>$xon</TD><TD>$xcon</TD></TR>\n";
#		flock(DB,8);
#		close(DB);
	}
#-----------------------
$click++;
###############Proxy Checker始め###############戻した
@prox = ("HTTP_CACHE_INFO"," HTTP_CLIENT_IP","HTTP_FORWARDED","HTTP_PRAGMA","HTTP_PROXY","HTTP_PROXY_CONNECTION","HTTP_PROXY_USER","HTTP_PROXY_PASS","HTTP_SP_HOST","HTTP_VIA","HTTP_XONNECTION","HTTP_X_FORWARDED_FOR"," HTTP_X_LOCKING","HTTP_XROXY_CONNECTION");

@envi=sort(keys (%ENV));
$proxflag = 0;

foreach $envi (@envi) {
   foreach $prox (@prox) {

   if ($envi eq $prox){
     $proxflag = 1;
     goto PROXEND ;
     }
   }
}
PROXEND:
if ($host =~ /prox/ ) {$proxflag = 1; }
###############Proxy Checker終わり###############
#-------------------
# All ipファイルから読み込み
open(ALLIPF,"$aipf") || &error("Open Error: $aipf");
flock(ALLIPF,1);
@allipf = <ALLIPF>;
flock(ALLIPF,8);
close(ALLIPF);

# All ipファイルをIPで検索
$oldflag = 0;
foreach $allipf (@allipf) {
	chop($allipf);
	if ($addr eq $allipf){
		$oldflag = 1;
		goto ALLIPF_END;
	}
}
ALLIPF_END:
# All ipファイルに存在しないときは追加する
if (!$oldflag) {
	open(ALLIPF,">> $aipf") || &error("Open Error: $aipf");
	flock(ALLIPF,2);
	print ALLIPF "$addr\n";
	flock(ALLIPF,8);
	close(ALLIPF);
}
#-------------------
# ここで存在しなければ、当然todip.datにも存在しないということ
#unless は if の逆
#unless (-e $ipfile) { 
if (!$oldflag) {
	$countlog++;
	$today++;
	$allip++;
	if ($proxflag) {
		$proxcnt++;
		$td_newprox++;
	} else {
		$td_newip++;
	}
} else {
#	$oldflag = 1;
	if (!$flagip) {
		$countlog++;
		$today++;
		if ($proxflag) {
			$td_oldprox++;
		} else {
			$td_oldip++;
		}
	}
}
#print IPF "$year\年$mon\月$mday\日($thisday\) ($hour\：$min\：$sec\)：$buf\n";
#flock(IPF,8);
#close(IPF);
#####################
# ログをフォーマット
#####################
## 当日処理
if ($key eq $mday) {
	$data = "$key<>$yes<>$today<>$countlog<>$thisday<>$addr<>$click<>$allip<>$proxcnt<>$td_newip<>$td_newprox<>$td_oldip<>$td_oldprox<>\n";

## 翌日処理
} else {
	if ($oldflag) {
		if ($proxflag) {
			$data = "$mday<>$today<>1<>$countlog<>$thisday<>$addr<>$click<>$allip<>$proxcnt<>0<>0<>0<>1<>\n";
		} else {
			$data = "$mday<>$today<>1<>$countlog<>$thisday<>$addr<>$click<>$allip<>$proxcnt<>0<>0<>1<>0<>\n";
		}
	} else {
		if ($proxflag) {
			$data = "$mday<>$today<>1<>$countlog<>$thisday<>$addr<>$click<>$allip<>$proxcnt<>0<>1<>0<>0<>\n";
		} else {
			$data = "$mday<>$today<>1<>$countlog<>$thisday<>$addr<>$click<>$allip<>$proxcnt<>1<>0<>0<>0<>\n";
		}
	}
	&day_count;
	&mon_count;
}

# ログを更新
open(OUTL,">>$logfile") || &error("Write(Add) Error: $logfile");
flock(OUTL,2);
print OUTL @data;
flock(OUTL,8);
close(OUTL);
#######################################IP毎のアクセス記録処理　開始
#if (!$oldflag) { 
#	open(IPF,">>$ipfile") || &error("Write(Add) Error: $ipfile");
#	flock(IPF,2);
#	print IPF "<html>\n<head>\n<META HTTP-EQUIV='Content-type' CONTENT='text/html; charset=Shift_JIS'>\n<title>$addr\($host\)</title>\n</head>\n<body BGCOLOR='#00FF93'>\n<PRE>\n";
#	print IPF "$host\n\n";
#} else {
#	open(IPF,">>$ipfile") || &error("Write(Add) Error: $ipfile");
#	flock(IPF,2);
#}
#print IPF "$year\年$mon\月$mday\日($thisday\) ($hour\：$min\：$sec\)：$buf\n";
#flock(IPF,8);
#close(IPF);

#######################################IP毎のアクセス記録処理　終了

#-----------------------
##############アクセス者IPの全記録（終了）#####################

# チェックモード
if (!$buf || $buf eq "check") { &check; }

# データが存在しない場合は終了
#unless (-e $datafile) { &error("Not Exist: $datafile"); }

# データ読み取り
#open(IN,"$datafile") || &error("Open Error: $datafile");
#flock(IN,1);
#$data = <IN>;
#flock(IN,8);
#close(IN);

# カウントアップ
#($count,$ip) = split(/:/, $data);
#if (!$ip_chk || ($ip_chk && $addr ne $ip)) {
#	$count++;

#	open(OUT,">$datafile") || &error("Write Error: $datafile");
#	flock(OUT,2);
#	print OUT "$count:$addr";
#	flock(OUT,8);
#	close(OUT);
#}

# ページカウンタ
if ($type == 1) {

	# ダミーGIF画像
	local(@gif) = (
		"47","49","46","38","39","61","02","00","02","00","80","00",
		"00","00","00","00","ff","ff","ff","21","f9","04","01","00",
		"00","01","00","2c","00","00","00","00","02","00","02","00",
		"00","02","02","8c","53","00","3b");

	# ダミー画像を表示
	print "Content-type: image/gif\n\n";
	foreach (@gif) {
		print pack('C*',hex($_));
	}

# ダウンロードカウンタ
} else {

	# index読み取り
	$f=0;
	open(IN,"$idxfile");
	flock(IN,1);
	while (<IN>) {
		($id,$sub,$link,$file) = split(/<>/);

		if ($buf eq $id) { $f++; last; }
	}
	flock(IN,8);
	close(IN);

	if (!$f) { &error("IDが不正です"); }

	# Locationヘッダ
	if ($type == 2) {

		# IISサーバ (PerlIS) 対応
		if ($ENV{'PERLXS'} eq "PerlIS") {
			print "HTTP/1.0 302 Temporary Redirection\r\n";
			print "Content-type: text/html\n";
		}

		# ファイルへジャンプ
		print "Location: $file\n\n";

	# metaタグ
	} else {

		&header("<META HTTP-EQUIV=\"refresh\" CONTENT=\"1; URL=$file\">");
		print "<div align=center>自動でダウンロードできない場合は\n";
		print "<a href=\"$file\">ここ</a> をクリックしてください。<br>\n";
		print "<form><input type=button value='閉じる' onClick='top.close();'>\n";
		print "<\/form><\/div>\n<\/body><\/html>\n";
	}
}
#######################################　システムLOG作成開始
#if ($flg_do) { `C:\usr\local\bin\perl.exe D:\Logfiles\y.pl`;}
#######################################　システムLOG作成終了

E:
exit;

#######################################サブルーチン追加　開始
#----------------#
#  日次カウント  #
#----------------#
sub day_count {
	# ログの日次キーより本日の日が小さければ月が変わったと判断する
	# 日次記録ファイル
	#$key は、前日の日
	#$mdayは、アクセスした瞬間の日
	$dayfile = "../dayx/day.dat";

	if ($mday < $key) {
		# 日次アクセスファイルを読み込み
		open(INDAY,"$dayfile") || &error("Open Error : $dayfile");
		flock(INDAY,1);
		@dayfile = <INDAY>;
		flock(INDAY,8);
		close(INDAY);
		&graph_make;
		#各月グラフを作成し、ファイルの内容を初期化
		open(INDAY,">$dayfile") || &error("Open Error : $dayfile");
		flock(INDAY,2);
		flock(INDAY,8);
		close(INDAY);
	} else {
	# 月内での処理
		open(INDAY,">>$dayfile") || &error("Open Error: $dayfile");
		flock(INDAY,2);
		# $todayは、dayx.datの、「本日カウント」
		print INDAY "$mon\/$key \($youbi\)<>$today<>\n";
		flock(INDAY,8);
		close(INDAY);
	}
}

#----------------#
#  前月グラフ作成  #
#----------------#
sub graph_make {
	$flag=0;
	$tochu=0;
	$graph2 = "./red.gif";
	$dKEY = 2;

	for (my $i = 0; $i <@dayfile; $i++) {
		chop;
		($m_d,$dcnt) = split(/<>/,$dayfile[$i]);
		# \d+は「数字1文字(\d)以上(+)続く文字」という意味である。
		# =~ は、@_ 以外の変数($m_d)に対してパターンマッチを行う時に使うもの。
		# 真ん中の「\/」=「文字列の"/"」の意味。つまり、これはm/ /である。
		if ($i == 1 && $m_d =~ /^(\d+)\/(\d+)/) {
			# ^は、行頭の意味
			# パターンマッチ（上の行）に成功すると、n個のグループ【( )内のこと】の文字列は特殊変数$1と$2…$nに残される。
			if ($2 != 1) { $tochu=1; }
		}

		# グラフ幅を指定
		if ($dcnt > 0) { $width = int($dcnt / $dKEY); }
		else { $width=1; }
		if ($width < 1) { $width=1; }

		# 桁処理
		$dcnt = &filler($dcnt);

		# 色変更
		$m_d =~ s/Sat/<font color=blue>Sat<\/font>/;
		$m_d =~ s/Sun/<font color=red>Sun<\/font>/;

		$dayfile[$i] = "<tr><td nowrap>$m_d</td><td align=right> &nbsp; $dcnt &nbsp; </td><td><img src=\"$graph2\" width=$width height=5></td></tr>\n";
	}

	if ($mon_y < 10) { $mon_y = "0$mon_y"; }
	$aclist = "../dayx/ACLOG$year_y$mon_y\.htm";
	
	open(GRAPH,">$aclist") || &error("Open Error: $aclist");
	flock(GRAPH,2);
	print GRAPH "<!DOCTYPE HTML PUBLIC '-//W3C//DTD HTML 4.01 Transitional//EN'>\n<html lang='ja'>\n<head>\n<META HTTP-EQUIV='Content-type' CONTENT='text/html; charset=Shift_JIS'>\n<META HTTP-EQUIV='Content-Style-Type' CONTENT='text/css'>\n<title>ACCESS LOG $year_y\年$mon_y\月</title>\n<STYLE TYPE='text/css'>\n<!--\nbody,tr,td,th { font-family: 'MS UI Gothic', Tokorozawa; }\n-->\n</STYLE>\n</head>\n<body bgcolor='#F1F1F1' text='#000000' link='#0000FF' vlink='#800080'>\n";
	print GRAPH "<blockquote>\n<table border=0 cellpadding=1 cellspacing=0>\n<tr><th bgcolor=#D5FFD5>月日</th><th bgcolor=#D5FFD5>アクセス数</th><th bgcolor=#D5FFD5>グラフ</th></tr>\n";

	print GRAPH @dayfile;
####################
	# グラフ幅を指定
	if ($today > 0) { $width = int($today / 2); }
	else { $width=1; }
	if ($width < 1) { $width=1; }

	# 桁処理
	$today = &filler($today);
	$m_d = "<tr><td nowrap>$mon_y\/$key \($youbi\)</td><td align=right> &nbsp; $today &nbsp; </td><td><img src=\"$graph2\" width=$width height=5></td></tr>\n";

	# 色変更
	$m_d =~ s/Sat/<font color=blue>Sat<\/font>/;
	$m_d =~ s/Sun/<font color=red>Sun<\/font>/;

	print GRAPH $m_d;
####################
	print GRAPH "<\/table><\/blockquote><\/body><\/html>\n";
	flock(GRAPH,8);
	close(GRAPH);
}

#----------------#
#  月間カウント  #
#----------------#
sub mon_count {
	# 初めてのアクセスの場合
	$monfile = "../dayx/mon.dat";
	# （演算子　ファイル名）　-z : ファイルが存在し大きさが0
	# $todayは、dayx.datの、「本日カウント」
	# $dateは、たった今の年/月のこと
#	if (-z $monfile) { $mons[0] = "$date<>$today<>\n"; }
#	else {
		open(MON,"$monfile") || &error("Open Error: $monfile");
		flock(MON,1);
		@mons = <MON>;
		flock(MON,8);
		close(MON);

		# ログ配列の最終行を分解
		$mons[$#mons] =~ s/\n//;
		# 「$#monsは、mons添字の最大値」
		($y_m,$cnt) = split(/<>/,$mons[$#mons]);

		# 当月処理
		# $dateは、たった今の年/月のこと
		if ($y_m eq $date) {
			$cnt = $cnt + $today;
			$mons[$#mons] = "$y_m<>$cnt<>\n";
		} else {
		# 翌月処理
		#（ログ配列の最終行が $dateと異なれば、月が変ったと判断する）
			$cnt = $cnt + $today;
			$mons[$#mons] = "$y_m<>$cnt<>\n";
			push(@mons,"$date<>0<>\n");
		}
#	}

	# ログファイルを更新
	open(MON,">$monfile") || &error("Open Error: $monfile");
	flock(MON,2);
	print MON @mons;
	flock(MON,8);
	close(MON);
}

#--------------#
#  ロック処理  #
#--------------#
sub lock {
	local($retry) = 5;
	$skipflag = 0;
	# （演算子　ファイル名）　-e : ファイルが存在する
	if (-e $lockfile) {
		local($mtime) = (stat($lockfile))[9];
		if ($mtime < time - 60) {
			utime time, time, $lockfile;
			$skipflag = 1;
		} else {
			$lockflag=1;
			&wait1;
		}
	} else {
		while (!mkdir($lockfile, 0755)) {
			if (--$retry <= 0) { &error; }
			sleep(1);
		}
	}
#	while (!mkdir($lockfile, 0755)) {
#			if (--$retry <= 0) { &error; }
#			sleep(1);
#	}
	$lockflag=1;
}

#--------------#
#  ロック解除  #
#--------------#
sub unlock {
	rmdir($lockfile);
	$lockflag=0;
}

#----------------#
#  桁区きり処理  #
#----------------#
sub filler {
	local($_) = $_[0];
	# "." は、「\n以外の任意の1文字」。"*" は、「適合文字列0個以上」の意味
	# \d+は「数字1文字
	# $1は月で、$2は日
	1 while s/(.*\d)(\d\d\d)/$1,$2/;
	$_;
}

#--------------#
#  エラー処理  #
#--------------#
sub error {
	# ロック中の時は解除
	if ($lockflag) { &unlock; }
	&header();
	print "<h3>30秒あけてから、次のダウンロードを開始して下さい。</h3>$_[0]\n";
	print "<\/body><\/html>\n";
	exit;
}

#--------------#
#  wait表示処理  #
#--------------#
sub wait1 {
	# ロック中の時は解除
	if ($lockflag) { &unlock; }
	&header();
	print "<h3>1分あけてから、次のダウンロードを開始して下さい。</h3>$_[0]\n";
	print "<\/body><\/html>\n";
	exit;

}

#######################################サブルーチン追加　終了
#--------------#
#  HTMLヘッダ  #
#--------------#
sub header {
	local($meta) = @_;

	print "Content-type: text\/html\n\n";
	print <<EOM;
<html>
<head>
<META HTTP-EQUIV="Content-type" CONTENT="text/html; charset=Shift_JIS">
$meta
<title>$ver</title></head>
<body>
EOM
}

#------------------#
#  チェックモード  #
#------------------#
sub check {
	&header();
	print <<EOM;
<h3>Check Mode</h3>
<ul>
EOM

	# indexのパス確認
	# （演算子　ファイル名）　-e : ファイルが存在する
	if (-e $idxfile) {
		print "<li>インデックスファイルのパス: OK!\n";

		# パーミッション
		# （演算子　ファイル名）　-r : 実効uid/gidでファイルが読める
		if (-r $idxfile && -w $idxfile) {
			print "<li>インデックスファイルのパーミッション: OK!\n";
		} else {
			print "<li>インデックスファイルのパーミッション: NG → $idxfile\n";
		}
	} else {
		print "<li>インデックスファイルのパス: NG → $idxfile\n";
	}

	# データディレクトリ
	# （演算子　ファイル名）　-d : ディレクトリかどうか
	if (-d $datadir) {
		print "<li>データディレクトリのパス: OK!\n";

		# （演算子　ファイル名）　-r : 実効uid/gidでファイルが読める
		if (-r $datadir && -w $datadir && -x $datadir) {
			print "<li>データディレクトリのパーミッション: OK!\n";
		} else {
			print "<li>データディレクトリのパーミッション: NG → $datadir\n";
		}
	} else {
		print "<li>データディレクトリのパス: NG → $datadir\n";
	}

	# ロックディレクトリ
	print "<li>ロック形式: ";
	if ($lockkey == 0) { print "ロック設定なし\n"; }
	else {
		if ($lockkey == 1) { print "symlink\n"; }
		else { print "mkdir\n"; }
		print "<li>ロックディレクトリ: $lockdir\n";

		# （演算子　ファイル名）　-d : ディレクトリかどうか
		if (-d $lockdir) {
			print "<li>ロックディレクトリのパス: OK!\n";
			# （演算子　ファイル名）　-r : 実効uid/gidでファイルが読める
			if (-r $lockdir && -w $lockdir && -x $lockdir) {
				print "<li>ロックディレクトリのパーミッション: OK!\n";
			} else {
				print "<li>ロックディレクトリのパーミッション: NG → $lockdir\n";
			}
		} else {
			print "<li>ロックディレクトリのパス: NG → $lockdir\n";
		}
	}

	# 著作権表示：削除禁止
	print <<EOM;
<li>バージョン: <a href="http://www.kent-web.com/">$ver</a>
</ul>
</body>
</html>
EOM
	exit;
}

__END__
