#counter
**内容 [#k5e43322]
#setlinebreak(on)
#contents
**目的 [#ub939be8]
人生が3万日だとしたら、今まで何日生きてきてあと何日残されているのかを知り、モチベーションを高めたりがっかりしたりするために使います。

中川翔子先生の名言「人生3万日しかない」にインスパイアされ、作成しました。

**機能の概要 [#z9942a20]
生年月日を入力し、「レッツ計算!」ボタンを押すと、今まで生きてきた日数と残された日数を計算し出力します。
***今後盛り込む予定の機能 [#d31d0375]

**ツールのURL [#t31dd84f]
http://hinata.la.coocan.jp/tool/hauko.cgi

**ソースイメージ [#q8650621]
 #!/usr/bin/perl
 
 ($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst) = localtime(time);
 @months=("01","02","03","04","05","06","07","08","09","10","11","12");
 @days=("01","02","03","04","05","06","07","08","09","10","11","12","13","14","15",
 		"16","17","18","19","20","21","22","23","24","25","26","27","28","29","30","31");
 %daysofmonth=(
 		"01"=>'31',
 		"02"=>'28',
 		"03"=>'31',
 		"04"=>'30',
 		"05"=>'31',
 		"06"=>'30',
 		"07"=>'31',
 		"08"=>'31',
 		"09"=>'30',
 		"10"=>'31',
 		"11"=>'30',
 		"12"=>'31'
 		);
 
 sub decode {
     local($args, $n_read, *terms, $tag, $value);
 
     $ENV{'REQUEST_METHOD'} eq "POST" ?
     ($n_read = sysread(STDIN, $args, $ENV{'CONTENT_LENGTH'})):
     ($args = $ENV{'QUERY_STRING'});
 
     @terms = split('&', $args);
 
     foreach (@terms) {
         ($tag, $value) = split(/=/, $_, 2);
         $value =~ s/\+/ /g;
         $value =~ s/%([0-9A-Fa-f][0-9A-Fa-f])/pack("c", hex($1))/ge;
         $tags{$tag} = $value;       # tags is global
     }
 	require 'jcode.pl';
 	jcode::convert(\$tags{handlename}, 'euc');
 }
 sub uruuchk{
 	my $year=$_[0];
 	if(($year % 400)==0){$daysofmonth{02}=29;return 1;}
 	elsif(($year % 100)==0){$daysofmonth{02}=28;return 0;}
 	elsif(($year % 4)==0){$daysofmonth{02}=29;return 1;}
 	else{$daysofmonth{02}=28;return 0;}
 
 }
 sub set_bornyeardays{
 	my $ret=0;
 
 	my $uruu_flg=&uruuchk("$tags{b_year}");
 #	print "tags{b_month}=$tags{b_month}<br>";
 #	my $b_month=$tags{b_month};
 #	print "daysofmonth{02}=$daysofmonth{02}<br>";
 #	print "daysofmonth->tags{b_month}=$daysofmonth{$tags{b_month}}<br>";
 #	print "tags{b_day}=$tags{b_day}<br>";
 #	print "daysofmonth{02}=$daysofmonth{02}<br>";
 	if($daysofmonth{$tags{b_month}} < $tags{b_day}){
 		print "$tags{b_year}年$tags{b_month}月$tags{b_day}日は存在しません!←この表示バグあり<br>";
 	}
 	foreach my $month (@months){
 		if($month eq $tags{b_month}){
 			$ret += ($daysofmonth{$tags{b_month}}-$tags{b_day}+1);
 #		print "ret=bornyeardays$month,$ret<br>";
 		}elsif($month > $tags{b_month}){
 			$ret +=$daysofmonth{$month};
 #		print "ret=bornyeardays$month,$ret<br>";
 		}
 	}
 #	print "bornyeardays=$ret<br>";
 	return $ret;
 }
 sub set_tonow{
 	my $today = sprintf("%04d%02d%02d", $year + 1900, $mon +1, $mday);
 	my $bornday= "$tags{b_year}$tags{b_month}$tags{b_day}";
 	my $nowyear  = sprintf("%04d", $year + 1900);
 	my $nowmonth = sprintf("%02d", $mon +1);
 	my $nowday   = sprintf("%02d", $mday);
 	my $ind=0;
 	my $ret=0;
 	my $uruu_flg=&uruuchk($nowyear);
 #	print "today=$today<br>";
 	if($today < $bornday){
 		print "あなたはまだ生まれていません!<br>";
 	}
 #	print "nowmonth=$nowmonth<br>";
 	if($tags{b_year} eq $nowyear){
 			if($uruu_flg == 1){
 				$ret -=366;
 #			print "ret=eq,$ret<br>";
 			}elsif($uruu_flg == 0){
 				$ret -=365;
 #			print "ret=eq,$ret<br>";
 			}
 #			$ret +=1;
 	}else{
 		for($ind=$tags{b_year}+1;$ind<$nowyear;$ind++){
 			$uruu_flg=&uruuchk($ind);
 			if($uruu_flg == 1){
 				$ret +=366;
 #			print "ret=$ind,$ret<br>";
 			}elsif($uruu_flg == 0){
 				$ret +=365;
 #			print "ret=$ind,$ret<br>";
 			}
 		}
 
 	}
 	$ret +=&set_bornyeardays;
 	$uruu_flg=&uruuchk($nowyear);
 
 	foreach my $month (@months){
 		if($month < $nowmonth){
 			$ret +=$daysofmonth{$month};
 #		print "ret=$month,$ret<br>";
 		}elsif($month eq $nowmonth){
 			$ret += ($nowday-1);
 #		print "ret=$month,$ret<br>";
 		}
 	}
 	return $ret;
 }
 sub set_remain{
 	my $tonow=$_[0];
 	if($tags{which} eq "mydeadline"){
 		return "<font color=\"red\">この機能は未実装</font>";
 	}elsif($tags{which} eq "haukosdeadline"){
 		return 30000-$tonow;
 	}
 }
 sub printkekka{
 	print "<font size=\"5\">中川翔子先生の名言「人生3万日しかない」ツール 計算結果♪</font><br><br>";
 	my $tonow=&set_tonow;
 	my $today=$tonow+1;
 	my $remain=&set_remain("$tonow");
 	my $which="";
 	if($tags{which} eq "mydeadline"){
 		$which="$tags{grim_reaper}歳の誕生日";
 	}elsif($tags{which} eq "haukosdeadline"){
 		$which="3万日";
 	}
 
 	print <<"EOL";
 	
 
 	<font size="5">$tags{handlename}さんは昨日まで</font>
 		<font size="6">$tonow日</font>
 	<font size="5">生きてきました。</font><font size="2"> ※ 生年月日含む</font><br>
 	<font size="5">今日は</font>
 		<font size="7" color="red">$today</font>
 	<font size="6">日目</font><font size="5">です!</font><br>
 	<font size="5">$whichまで残り</font><font size="6">$remain日</font><font size="5">です。</font><font size="2"> ※ 今日を含む</font>
 	<form method="POST" action="./hauko.cgi">
 		<input type="hidden" name="handlename" value="$tags{handlename}">
 		<input type="hidden" name="b_year" value="$tags{b_year}">
 		<input type="hidden" name="b_month" value="$tags{b_month}">
 		<input type="hidden" name="b_day" value="$tags{b_day}">
 		<input type="hidden" name="which" value="$tags{which}">
 		<input type="hidden" name="grim_reaper" value="$tags{grim_reaper}">
 		<input type="submit" value="再入力" name="submit">
 	</form>
 	・関連ページ<br>
 	 <a href="http://ameblo.jp/nakagawa-shoko/" target="blank">しょこたん☆ブログ</a><br>
 	 <a href="http://www.mhlw.go.jp/toukei/saikin/hw/life/life08/index.html" target="blank">厚生労働省:日本人の平均余命 平成20年簡易生命表</a><br>
 	 <a href="http://www2.ttcn.ne.jp/honkawa/1620.html" target="blank">図録▽世界の平均寿命ランキング</a><br>
 	・関連名言<br>
 	 <a href="http://www.kotodama.in/quote/51041" target="blank"><font size="5">今日という日は、残りの人生の最初の一日である。</font></a><br>
 	 <a href="http://www.kotodama.in/quote/54293" target="blank">人生3万日しかない</a><br>
 	 <a href="http://www.kotodama.in/quote/52208" target="blank">人生は一歩一歩、死に向かっている。</a><br> <br> <br>
 
 
 EOL
 }
 sub chk_param{
 	my $ret=0;
 	print "<font color=\"red\"><b>";
 	if($tags{handlename} eq ""){
 		print "お名前を入力してください。<br>";
 		$ret=1;
 	}
 	if($tags{b_year} eq ""){
 		print "生年を入力してください。<br>";
 		$ret=1;
 	}elsif($tags{b_year} !~ /^[0-9]+$/){
 		print "生年には数字を入力してください。<br>";
 		$ret=1;
 	}
 	if($tags{which} eq "mydeadline"){
 			if($tags{grim_reaper} eq ""){
 				print "中川翔子先生を信じないのなら想定享年を入力してください。<br>";
 				$ret=1;
 			}elsif($tags{grim_reaper} !~ /^[0-9]+$/){
 				print "想定享年には数字を入力してください。<br>";
 				$ret=1;
 			}
 	}
 	print "</font></b>";
 	return $ret;
 }
 
 sub b_month_select{
 
 	my $ret="<select name=\"b_month\">";
 	foreach my $month (@months){
 		if ($month eq $tags{b_month}){$selected="selected";}
 		$ret=$ret . "\t<option value=\"${month}\" $selected>${month}</option>\n";
 		$selected="";
 	}
 	$ret=$ret . "</select>";
 	return $ret;
 }
 sub b_day_select{
 
 	my $ret="<select name=\"b_day\">";
 	foreach my $day (@days){
 		if ($day eq $tags{b_day}){$selected="selected";}
 		$ret=$ret . "\t<option value=\"${day}\" $selected>${day}</option>\n";
 		$selected="";
 	}
 	$ret=$ret . "</select>";
 	return $ret;
 }
 
 sub printform{
 	my $mydeadlinechk="";
 	my $haukosdeadlinechk="checked";
 	my $monthselect=&b_month_select;
 	my $dayselect=&b_day_select;
 	if($tags{which} eq "mydeadline"){
 		$mydeadlinechk="checked";
 		$haukosdeadlinechk="";
 	}
 	print <<"EOL";
 	<font size="5">中川翔子先生の名言「人生3万日しかない」ツール♪</font><br><br>
 	このツールは<a href="http://ameblo.jp/nakagawa-shoko/" target="blank">中川翔子先生</a>の名言
 	「人生3万日しかない」にインスパイアされ、作成されました。<br>
 	生年月日を入力していただくと現在まで生きてきた日数と、残りの日数を計算致します。<br>
 	<form method="GET" action="./hauko.cgi">
 	<table border="1">
 	<tr><td>お名前:</td><td><input type="text" name="handlename" size="30" maxlength="40" value="$tags{handlename}"></td></tr>
 	<tr><td>生年月日:</td><td><input type="text" name="b_year" size="4" maxlength="4" value="$tags{b_year}" style="ime-mode:disabled">年
 							$monthselect月
 							$dayselect日
 							<font size="2">※ 生年は西暦で入力してください。</font>
 					</td></tr>
 	<tr><td>想定享年:</td><td>
 							<input type="radio" name="which" value="haukosdeadline" $haukosdeadlinechk>
 							中川翔子先生が言うのだから、私は<font size="4">3万日</font>生きるに違いない。
 							<font size="2">(※ 3万日生きると約82歳と50日)</font><br>
 							<input type="radio" name="which" value="mydeadline" $mydeadlinechk>
 							私は<input type="text" name="grim_reaper" size="3" maxlength="10" value="$tags{grim_reaper}" style="ime-mode:disabled">歳まで生きる!<font color="red">←この機能は未実装</font>
 					</td></tr>
 	<tr><td colspan="2" align="center"><input type="submit" value="レッツ計算!" name="submit"></td></tr>
 	</table>
 	</form>
 EOL
 }
 
 print <<"EOL";
 Content-type: text/html
 
 <HTML>
 <HEAD>
 	<meta http-equiv="Content-Type" content="text/html; charset=EUC-JP">
 	<TITLE>中川翔子先生の名言「人生3万日しかない」ツール♪</TITLE>
 </HEAD>
 <BODY>
 EOL
 
 if ($ENV{'QUERY_STRING'} ne "") {
 	&decode();
 	$param_chk_result=&chk_param;
 	if($param_chk_result==0){
 		&printkekka;
 	}elsif($param_chk_result==1){
 		&printform;
 	}
 
 }else{
 	&decode();
 	&printform;
 }
 if($param_chk_result ne ""){
 	$print_parm=<<"EOL";
 $tags{handlename}さんは$tags{b_year}年$tags{b_month}月$tags{b_day}日生まれ、$tags{which}、$tags{grim_reaper}歳まで生きる。param_chk_result=$param_chk_result
 EOL
 }
 
 print <<"EOL";
 	<font size="1">動作に不具合等ありましたら<a href="http://hinata.la.coocan.jp/pukiwiki/?%BD%C4%BD%F1%A4%AD%A5%C4%A1%BC%A5%EB%2F%A5%D0%A5%B0%B4%C9%CD%FD%CA%ED" target="blank">ご連絡ください</a>。
 	早急に対応したいと思います。(2009年8月27日<a href="http://hinata.la.coocan.jp/pukiwiki/?FrontPage" target="blank">日向充</a>)</font>
 	<br><br>
 	<script type="text/javascript"><!--
 	amazon_ad_tag = "hinatamitsuru-22"; amazon_ad_width = "728";  amazon_ad_height = "90";//--></script>
 	<script type=\"text/javascript\" src=\"http://www.assoc-amazon.jp/s/ads.js\"></script>
 	<iframe src="http://rcm-jp.amazon.co.jp/e/cm?t=hinatamitsuru-22&o=9&p=20&l=qs1&f=ifr"
 	width="120" height="90" frameborder="0" scrolling="no"></iframe>
 	</BODY>
 	</HTML>
 EOL
 

**改版履歴 [#je702bdd]
***090827(初版) [#pdc5e359]
9月1日にちょっと直したので、ソースは9月1日のもので。
#ref(hauko.cgi.090901.txt)

**バグ管理簿 [#od1d05c2]
#ls2

----
- 新たに作り始めたしょこたんツールは是非rubyで開発して頂きたかった。。 -- [[o]] &new{2009-09-17 (木) 13:41:07};
- うぅ。。なんかすぐ作りたかったので、つい慣れてるもので作っちゃいました。。 -- [[日向充]] &new{2009-09-19 (土) 21:19:25};
- いまからでも遅くない!このツールをrubyに書き換えよう!Dateクラスを使えばきっと簡単! -- [[o]] &new{2009-09-19 (土) 22:02:12};
- 確かに、そういうクラスを使わずに自前で計算してるのあほすぎですよね。rubyで書き直してみます! -- [[日向充]] &new{2009-10-03 (土) 20:06:25};
- NrbJukShawrelHSN -- [[drrsxkrfp]] &new{2010-05-06 (木) 19:06:58};

#comment
----
-[[Perlメモ]]
-[[プログラミング]]

#amazon_live(books-jp,search,Perl,48)
#amazon_search(small)

トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS