#!/usr/local/bin/perl -w ########################################### # data-normalize - Align probes by time # Mike Schilli, 2009 (m@perlmeister.com) ########################################### use strict; use DateTime; my @result = (); my $max = {}; my $data = { "2gb" => [qw( 21:33 100 08:18 83 10:52 80 18:40 57 08:36 35 12:21 28 )], "0.5gb" => [qw( 14:44 100 16:09 97 18:08 95 20:43 88 22:19 86 08:47 73 15:19 65 17:52 61 21:19 56 23:04 55 07:35 43 )]}; for my $conf (keys %$data) { my $points = $data->{ $conf }; my $day_start; my $day_current; while( my($time, $charge) = splice( @$points, 0, 2 ) ) { my($hour, $minute) = split /:/, $time; if(!defined $day_start) { $day_start = DateTime->today(); $day_start->set_hour( $hour ); $day_start->set_minute( $minute ); $day_current = $day_start->clone(); } my $time_current = $day_current->clone(); $time_current->set_hour( $hour ); $time_current->set_minute( $minute ); if($time_current < $day_current) { $time_current->add( days => 1 ); $day_current->add( days => 1 ); } $day_current = $time_current->clone(); my $x = (($time_current->epoch() - $day_start->epoch()) / 60); push @result, [ $conf, $x, $charge ]; if(!exists $max->{x} or $max->{x} < $x) { $max->{x} = $x; } if(!exists $max->{y} or $max->{y} < $charge) { $max->{y} = $charge; } } } my $margin = 2; for my $result (@result) { my($symbol, $x, $y) = @$result; print "$symbol ", int($x*(100-2*$margin)/ $max->{x})+$margin, " ", int($y*(100-2*$margin)/ $max->{y})+$margin, "\n"; }