シミュレーションしてるといつ終わるのかわからなくて,「もうおわったかなー」とか気になったり,「まだ終わってないかなー」とか気になったり,「そろそろ終わったよな」とか「いや,さすがにもう終わってるだろ」とか気になったりして,精神衛生上良くない感じがしたりする.そういうのってきっと良くないので,いつごろ終わるのか計算してメール送るスクリプトとか書いてみた.Getopt::Compact、Date::Calc::Object、Mail::Sendmailあたりのモジュールはつかった。
シミュレーション回数とかパラメータとかはオプションで与えるようにしてたので,ほかにメールアドレスとかも与えるようにする.
my $o = Getopt::Compact->new( name => 'sim', struct => [ [[qw(C cnt)], q{number of simulation trials (default: 5)}, '=i' ], [[qw(n num)], q{number of initially-deployed nodes (default: 300)}, '=i', \@num ], [[qw(B ber)], q{bit error rate (default: 1e-5)}, '=s', \@ber ], # パラメータとかいろいろ [[qw(d dest)], q{destination mail address (default: hoge@hoge.hoge-u.ac.jp)}, '=s' ], [[qw(s src)], q{source mail address (default: bar@bar-u.ac.jp)}, '=s' ], [[qw(S smtp)], q{SMTP server (default: smtp@smtp-u.ac.jp)}, '=s' ], ], ); my $opts = $o->opts; $opts->{dest} ||= 'hoge@hoge.hoge-u.ac.jp'; $opts->{src} ||= 'bar@bar-u.ac.jp'; $opts->{smtp} ||= 'smtp@smtp-u.ac.jp';
シミュレーション時間の見積もりは,各パラメータセットについて1回だけシミュレーションを行って,その時間をシミュレーション回数倍してやる.
sub assume_sim_time (@) { my (@params) = @_; # パラメータセットの配列 my $start = Date::Calc->today_and_now(); # シミュレーション回数を強制的に1にする my @testparam = map { { %$_, cnt => 1 } } @params; execute( $_ ) for (@testparam); my $end = Date::Calc->today_and_now(); my $diff = $end - $start; # time()かなんかで秒数測った方が効率的なんじゃね?という話もある. $end += $diff for ( 2 .. $opts->{cnt} ); return ($start, $end); }
メールとか送る.メールは研究室のサーバ経由で送る.
sub send_sim_time { my ($start, $end) = @_; my %mail = ( To => $opts->{dest}, From => $opts->{src}, Server => $opts->{smtp}, Subject => 'assumption', ); my $msg = "start: " . join('/', $start->date) . ' ' . join(':', $start->time) . "\n"; $msg .= "end: " . join('/', $end->date) . ' ' . join(':', $end->time) . "\n"; sendmail( %mail, Message => $msg ) or die $Mail::Sendmail::error; print "Ok. Log says\n", $Mail::Sendmail::log, "\n"; }
すると,各パラメータセットについて一通り終わった時点で,こんなメールがくる.
start: 2007/8/21 20:28:46 end: 2007/8/25 17:13:18