21 my @opt = <<'=back' =~ /B<--(\S+)>/g;
37 use lib
"$FindBin::Bin/../lib";
43 use File
::Basename
qw(basename dirname);
44 use File
::Path
qw(mkpath);
49 use Hash
::Util
qw(lock_keys);
52 lock_keys
%Opt, map { /([^=|!]+)/ } @opt;
60 use Imager
; use YAML
::XS
; my @yaml = map { YAML
::XS
::LoadFile
$_ or die "cannot load yaml file: $!"; } @ARGV;
61 my $xsize = 1200; my $ysize = 800;
62 my $img = Imager
->new(xsize
=>$xsize, ysize
=>$ysize, channels
=>4);
63 my $white = Imager
::Color
->new( 255, 255, 255 );
64 my $gray = Imager
::Color
->new( 192, 192, 192 );
65 my $black = Imager
::Color
->new( 10, 10, 10 );
66 $img->flood_fill(x
=>50, y
=>50, color
=>$white);
67 my $xgridlines = 30; my $ygridlines = 12;
68 GRIDX
: for (my $xgridline = 0; $xgridline <= $xgridlines; $xgridline++) {
69 my $x = 10 + ($xsize - 20) * ($xgridline/$xgridlines);
70 $img->line(color
=>$gray, x1
=>$x, x2
=>$x, y1
=>10, y2
=>$ysize-10, aa
=>1, endp
=>1 );
72 GRIDY
: for (my $ygridline = 0; $ygridline <= $ygridlines; $ygridline++) {
73 my $y = 10 + ($ysize - 20) * ($ygridline/$ygridlines);
74 $img->line(color
=>$gray, x1
=>10, x2
=>$xsize-10, y1
=>$y, y2
=>$y, aa
=>1, endp
=>1 );
76 my($max_total_secs, $max_total_lines);
77 YAML
: for my $yaml_i (0..$#yaml){
78 my $yaml = $yaml[$yaml_i];
79 my @k = sort keys %{$yaml->{G
}};
80 $max_total_secs //= $yaml->{G
}{$k[-1]}{T
};
81 $max_total_lines //= $yaml->{G
}{$k[-1]}{N
};
82 $max_total_secs = $yaml->{G
}{$k[-1]}{T
} if $yaml->{G
}{$k[-1]}{T
} > $max_total_secs;
83 $max_total_lines = $yaml->{G
}{$k[-1]}{N
} if $yaml->{G
}{$k[-1]}{N
} > $max_total_lines;
85 my $font = Imager
::Font
->new(file
=> "/usr/share/fonts/truetype/freefont/FreeSans.ttf");
87 string
=>int($max_total_lines),
98 string
=>int($max_total_secs),
108 DAY
: for (my $i = 1;$i < $max_total_secs/86400; $i++) {
109 my $x = $i*86400*($xsize-20)/$max_total_secs + 10;
121 my @hue = map { (360/scalar(@yaml)) * $_ } 0..$#yaml;
123 for my $yaml_i (0..$#yaml){
124 printf "\r%d/%d ", 1+$yaml_i, 1+$#yaml;
125 my $yaml = $yaml[$yaml_i];
126 my $curcol = Imager
::Color
->new( hue
=> $hue[$yaml_i], s
=>0.95, v
=>0.9, );
127 my @k = sort keys %{$yaml->{G
}};
129 my $e = $yaml->{G
}{$t};
130 $img->circle( color
=> $curcol, r
=> 1, aa
=> 1, filled
=> 1, x
=> 10 + ($xsize-20)*$e->{T
}/$max_total_secs, y => $ysize - 10 - ($ysize-20)*$e->{N}/$max_total_lines );
132 my $string = sprintf "%s (%s)", basename
($ARGV[$yaml_i]), $yaml->{uniq_path_snippet
} || $yaml->{hostname
};
144 $img->write(file
=>"t.png");
150 # cperl-indent-level: 4