#!/usr/bin/perl -w # -*-perl-*- # Last updated: <2024/06/09 10:28:00 +0900> # # opg.cgi means Ore Power Gold # # 2024/06/09 ver 0.1.3.1 # 2000/9/14 ver 0.1.3 # # やあ3のパワーを表すcgi # text表示用 use strict; use warnings; my ( @a, @b, @c, @s ); my ( @wsize, @wcount ); ######################################################## #default value set # my $ver = "0.1.3 2000/9/18"; my $ver = "0.1.3.1 2024/06/09"; # set diary files directory my $diarydir = "diary"; if ( $^O eq "MSWin32" ) { # Windows $diarydir = "D:/home/diary/diary/"; } elsif ( $^O eq "linux" ) { # Linux $diarydir = "/home/mieki256/diary/"; } my $author = "mieki256"; my $max = 90; # 日数 my $width = 60; # width of graph my $HNS = 0; my $TDS = 1; my $sys = $HNS; # 日記システムの選択 my $lang = 1; # 0: Japanese / 1: English my $back_uri = "./"; # URL for back my $ref_uri = "./"; # URL for refer-diary my $weekstat = 1; # week summary ######################################################## my $jisa = 0; #設定ファイルの読み込み require "./opg.ph" if ( -e "./opg.ph" ); # 今日を取得 my $tt = time + $jisa * 3600; my ( $sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst ) = localtime($tt); $year += 1900; $mon++; my $startdate = sprintf( "%04d%02d%02d", $year, $mon, $mday ); my $startdotw = $wday; # 今日の曜日 my $enddate = 0; # print "$startdate $startdotw\n"; my (@week); if ( $lang == 0 ) { # default=0: japanese #日本語 @week = ( "", "月", "火", "水", "木", "金", "" ); } else { #English @week = ( "Su", "Mo", "Tu", "We", "Th", "Fr", "Sa" ); } #他の言語に対応する場合はここらへんをアレせよ # days of months my @dom = ( 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 ); ######################################################## #引数の解釈 masato-3 from i system my ($query_string); if ( $ARGV[0] eq '-t' ) { # デバック用オプション引数を使った実行 # 使用例 : ./index.cgi -t word=system $query_string = $ARGV[1]; splice( @ARGV, 0, 2 ); # オプション引数を除去 } elsif ( $ENV{'REQUEST_METHOD'} eq "POST" ) { read( STDIN, $query_string, $ENV{'CONTENT_LENGTH'} ); } else { $query_string = $ENV{'QUERY_STRING'}; } my %FORM; my @x = split( /&/, $query_string ); foreach my $x (@x) { my ( $name, $value ) = split( /=/, $x ); $value =~ tr/+/ /; $value =~ s/%([0-9a-fA-F][0-9a-fA-F])/pack("C", hex($1))/eg; $FORM{$name} = $value; } ######################################################## #引数の適用 $max = $FORM{'max'} if ( $FORM{'max'} ); # max=100 if ( $FORM{'startdate'} ) { $startdate = $FORM{'startdate'}; # startdate=20000914 ここから日数分さかのぼる my ( $y, $m, $d ) = ( $startdate =~ /(\d{4})(\d{2})(\d{2})/ ); $startdotw = &get_dow( $y, $m, $d ); } my ($mrep); if ( $FORM{'mrep'} ) { $mrep = $FORM{'mrep'}; # mrep=200009 monthly report $mrep =~ /(\d{4})(\d{2})/; $startdate = "$1$2" . $dom[$2]; # 20000931 とする my ( $y, $m, $d ) = ( $startdate =~ /(\d{4})(\d{2})(\d{2})/ ); $startdotw = &get_dow( $y, $m, $d ); $enddate = "$1$2" . "01"; } &makefilelist; my ( $maxday, @size ); my $maxsize = 0; #maximum size of hnf my $sum = 0; # 合計 for ( my $i = 0; $i < $max; $i++ ) { my $t = ( stat( $a[$i] ) )[7]; # size get if ( $t > $maxsize ) { $maxsize = $t; $maxday = $i; } #push(@s, $t); # 配列に格納 $size[$i] = $t; $sum += $t; } print "content-type: text/html\n"; print "charset: euc-jp\n\n"; &printhead; &printform; &printdata; &printfoot; # end; exit; sub printdata { if ( $maxsize == 0 ) { print "no diary\n"; return; } my $w = $startdotw; print "
";
    print "    day     : size : bar\n";
    for ( my $i = 0; $i < $max; $i++ ) {
        print "";
        print "$b[$i]($week[$w]):";
        my $buf = sprintf( "%06d", $size[$i] );
        print "$buf:";
        if ( $i == $maxday ) {
            print "";
        }
        for ( my $j = 0; $j < $size[$i] * $width / $maxsize; $j++ ) {
            print "*";
        }
        if ( $i == $maxday ) {
            print "";
        }
        print "\n";
        $wcount[$w]++;
        $wsize[$w] += $size[$i];
        $w--;
        if ( $w < 0 ) { $w = 6; }
    }
    print "
\n"; print "Max. day is "; print "$b[$maxday]: $size[$maxday]
\n"; print "Total is " . sprintf( "%dKB.\n", $sum / 1024 ); print "Ave. is " . sprintf( "%d.\n", $sum / $max ); #for ($i=0;$i<$max;$i++) { #print "$i=$b[$i]:$size[$i] \n"; #} if ($weekstat) { &printweek; } } sub printweek { #曜日ごとの集計 my ( $wmaxsize, $wmax ); print "
weekly status
\n"; for ( my $i = 0; $i < 7; $i++ ) { $wsize[$i] = $wsize[$i] / $wcount[$i]; # normalize if ( $wmaxsize < $wsize[$i] ) { $wmaxsize = $wsize[$i]; $wmax = $i; } } print "
\n";
    for ( my $i = 0; $i < 7; $i++ ) {
        print "$week[$i]:" . sprintf( "%8d:", $wsize[$i] );
        if ( $i == $wmax ) {
            print "";
        }
        for ( my $j = 0; $j < $wsize[$i] * $width / $wmaxsize; $j++ ) {
            print "@";
        }
        if ( $i == $wmax ) {
            print "";
        }
        print "\n";
    }
    print "
\n"; } sub printform { #フォームを表示 my $mrep; $startdate =~ /(\d{6}).*/; $mrep = $1; print < start date: max:
monthly report:

EOF } sub printhead { print < Ore Power Gold - $author

Ore Power Gold - $author

version $ver

diary directory : $diarydir

back


EOF } sub printfoot { print < back

Ore Power Gold is made by yar-3(ore\@yar-3.net) and OPG supporters.

Ore Power Home Page

EOF } sub makefilelist { # print "start date = $startdate\n"; # print "start dotw = $startdotw\n"; # print "max = $max\n"; # print "end date = $enddate\n"; my $tmpdate = $startdate; my $tmpdotw = $startdotw; for ( my $i = 0; $i < $max; $i++ ) { push( @a, &makefilename($tmpdate) ); # diary/2000/d20000913.hnf push( @b, $tmpdate ); # 20000913 if ( $tmpdate == $enddate ) { $max = $i + 1; last; } $tmpdate = &prevday($tmpdate); } } sub makefilename { my $dt = $_[0]; if ( $sys == $HNS ) { $dt =~ /(\d{4}).+/; push( @c, $dt ); return "$diarydir/$1/d" . $dt . ".hnf"; } if ( $sys == $TDS ) { $dt =~ /(\d{4})(\d{2})(\d{2})/; push( @c, $dt . "#$3" ); return "$diarydir/$1/$2/$3.tdf"; } } # 1日前の日付を知る # 20000101 -> 19991231 sub prevday { my $dt = $_[0]; $dt =~ /(\d{4})(\d{2})(\d{2})/i; #(2000)(09)(14) my $ty = $1; my $tm = $2; my $td = $3; #print "##$dt## $1 $2 $3\n"; $td--; if ( $td == 0 ) { #前月に移動 $tm--; if ( $tm == 0 ) { #現在1月だったら年も移動 $ty--; $tm = 12; $td = 31; } elsif ( $tm == 2 ) { #2月ならうるう歳check if ( $ty % 4 == 0 ) { if ( $ty % 400 == 0 ) { #2000年とか $td = 29; } elsif ( $ty % 100 == 0 ) { #1900年とか $td = 28; } else { $td = 29; } } else { $td = 28; } } else { #2-12月 $td = $dom[$tm]; } } return sprintf( "%04d%02d%02d", $ty, $tm, $td ); } #曜日を取得! sub getdayoftheweek { my ( $y, $m, $d ) = ( $_[0] =~ /(\d{4})(\d{2})(\d{2})/ ); return $week[ &get_dow( $y, $m, $d ) ]; } #曜日を取得(0:日, 1:月, ..., 6:土) sub get_dow { # hnsのDate.pmを参考に書き換えました # これでtimelocal()を使わずにすみますヨ。 my ( $y, $m, $d ) = @_; $y = $y + 399 if ( $m < 3 ); ( $y + int( $y / 4 ) - int( $y / 100 ) + int( $y / 400 ) + ( 0, 0, 3, 2, 5, 0, 3, 5, 1, 4, 6, 2, 4 )[$m] + $d ) % 7; } # 2000/9/8 ver 0.0.3 # 2000/9/7 first version # special thanks # tokumi-3 # docile-3 # masato-3 (sub routines for i system)