#!/usr/bin/perl sub usage { print STDERR "usage: $0 [-s [-n samples] [-i interval]] [log_file]\n"; exit(1); } while ($ARGV[0] =~ /^-/) { $opt = shift @ARGV; if ($opt eq "-s") { $sim = 1; } elsif ($opt eq "-n") { $sim_n = shift @ARGV; &usage unless defined $sim_n; } elsif ($opt eq "-i") { $sim_t = shift @ARGV; &usage unless defined $sim_t; } else { &usage; } } unless ($sim && defined $sim_n && defined $sim_t) { $n = 1; while (<>) { next unless /^=== (\d+) ===/; while ($1 != $n) { push(@f, $n); $n++; } $n++; } $n--; $t = int($n/@f+0.5); $last = 0; for (@f) { push(@d, $_-$last); $last = $_; } } if ($sim) { # y = 1-exp(-x/T) # 1-y = exp(-x/T) # ln(1-y) = -x/T # -T*ln(1-y) = x $type = " (SIMULATED)"; $sim_n = @f unless defined $sim_n; $sim_t = $t unless defined $sim_t; @d = (); for ($i = 0; $i != $sim_n; $i++) { push(@d, -$sim_t*log(1-rand)); } } for (@d) { $max = $_ if $_ > $max; } $cmd = "|gnuplot -e '". 'set term postscript color eps enhanced solid lw 2 20;'. 'set output "out.eps";'. 'set xrange [0:'.$max*1.05.'];'. 'set yrange [0:'.$max*1.05.'];'. 'set title "Correlation of time to adjacent corruptions'.$type.'";'. 'set xlabel "Cycles since previous event";'. 'set ylabel "Cycles until next event";'. 'plot "-" with points pt 7 notitle'. "'"; open(PIPE, $cmd) || die "open: $!"; undef $last; for (@d) { print PIPE "$last $_\n" if defined $last; $last = $_; } close(PIPE) || die "close: $!"; system("cat out.eps | ". "gs -sDEVICE=ppmraw -r100 -sOutputFile=- ". "-dTextAlphaBits=4 -dGraphicsAlphaBits=4 -sPAPERSIZE=a4 -q - | ". "convert -trim - out.png"); unlink("out.eps");