earthquake feed example
[barcat.git] / barcat
diff --git a/barcat b/barcat
index b6f60ef2a6b36355c1de63f3d6a96a935fe108ea..5863c4c952b527438ef29accfc93b9681de71272 100755 (executable)
--- a/barcat
+++ b/barcat
@@ -77,7 +77,10 @@ if (defined $opt{interval}) {
        } or warn $@, "Expect slowdown with large datasets!\n";
 }
 
-$SIG{INT} = 'IGNORE';  # continue after assumed eof
+$SIG{INT} = sub {
+       $SIG{INT} = 'DEFAULT';  # reset for subsequent attempts
+       'IGNORE' # continue after assumed eof
+};
 
 my $valmatch = qr/$opt{anchor} ( \h* -? [0-9]* \.? [0-9]+ (?: e[+-]?[0-9]+ )? |)/x;
 while (readline) {
@@ -99,6 +102,12 @@ while (readline) {
 
 $SIG{INT} = 'DEFAULT';
 
+sub color {
+       $opt{color} and defined $_[0] or return '';
+       return "\e[$_[0]m" if defined wantarray;
+       $_ = color(@_) . $_ . color(0) if defined;
+}
+
 sub show_lines {
 
 state $nr = $opt{hidemin} ? $opt{hidemin} - 1 : 0;
@@ -124,18 +133,18 @@ if ($opt{markers} // 1 and $size > 0) {
        $barmark[ orderpos($#order * .68269) ] = '<';
        $barmark[ orderpos($#order / 2) ] = '+';  # mean
        $barmark[ -$minval * $size ] = '|' if $minval < 0;  # zero
-       defined and $opt{color} and $_ = "\e[36m$_\e[0m" for @barmark;
+       color(36) for @barmark;
 
        state $lastmax = $maxval;
        if ($maxval > $lastmax) {
                print ' ' x ($lenval + $len);
-               printf "\e[90m" if $opt{color};
+               printf color(90);
                printf '%-*s',
                        ($lastmax - $minval) * $size + .5,
                        '-' x (($values[$nr - 1] - $minval) * $size);
-               print "\e[92m" if $opt{color};
+               print color(92);
                say '+' x (($maxval - $lastmax - $minval) * $size + .5);
-               print "\e[0m" if $opt{color};
+               print color(0);
                $lastmax = $maxval;
        }
 }
@@ -143,13 +152,12 @@ if ($opt{markers} // 1 and $size > 0) {
 @lines > $nr or return if $opt{hidemin};
 
 sub sival {
-       my $unit = int(log($_[0]) / log(1000) - ($_[0] < 1));
-       my $float = $_[0] !~ /^ (?: 0*\.)? [0-9]{1,3} $/x;
-       sprintf('%*.*f%*s',
-               $float ? 5 : 3, $float,  # length and tenths
-               $_[0] / 1000 ** $unit,   # number
-               $float ? 0 : 3,          # unit size
-               $#{$opt{units}} >> 1 < abs $unit ? "e$unit" : $opt{units}->[$unit]
+       my $unit = int(log(abs $_[0] || 1) / log(10) - 3*($_[0] < 1) + 1e-15);
+       my $float = $_[0] !~ /^0*[-0-9]{1,3}$/;
+       sprintf('%3.*f%1s',
+               $float && ($unit % 3) == ($unit < 0),  # tenths
+               $_[0] / 1000 ** int($unit/3),   # number
+               $#{$opt{units}} * 1.5 < abs $unit ? "e$unit" : $opt{units}->[$unit/3]
        );
 }
 
@@ -157,12 +165,12 @@ while ($nr <= $#lines) {
        $nr >= $opt{hidemax} and last if defined $opt{hidemax};
        my $val = $values[$nr];
        if (length $val) {
-               my $color = !$opt{color} ? 0 :
+               my $color = !$opt{color} ? undef :
                        $val == $order[0] ? 32 : # max
                        $val == $order[-1] ? 31 : # min
                        90;
                $val = $opt{units} ? sival($val) : sprintf "%*s", $lenval, $val;
-               $val = "\e[${color}m$val\e[0m" if $color;
+               color($color) for $val;
        }
        my $line = $lines[$nr] =~ s/\n/$val/r;
        printf '%-*s', $len + length($val), $line;
@@ -192,6 +200,7 @@ if ($opt{stat}) {
 }
 
 __END__
+=encoding utf8
 
 =head1 NAME
 
@@ -346,10 +355,18 @@ Any kind of database query with counts, preserving returned alignment:
     echo 'SELECT count(*),schemaname FROM pg_tables GROUP BY 2' |
     psql -t | barcat -u
 
+Earthquakes worldwide magnitude 1+ in the last 24 hours:
+
+    https://earthquake.usgs.gov/earthquakes/feed/v1.0/summary/1.0_day.csv |
+    column -tns, | graph -f4 -u -l80%
+
 External datasets, like movies per year:
 
     curl https://github.com/prust/wikipedia-movie-data/raw/master/movies.json |
-    jq '.[].year' | uniq -c | barcat
+    perl -054 -nlE 'say if s/^"year"://' | uniq -c | barcat
+
+But please get I<jq> to process JSON
+and replace the manual selection by C<< jq '.[].year' >>.
 
 Pokémon height comparison:
 
@@ -377,6 +394,12 @@ Or the top 3 most frequent authors with statistics over all:
 
     git shortlog -sn | barcat -L3 -s
 
+Activity of the last days (substitute date C<-v-{}d> on BSD):
+
+    ( git log --pretty=%ci --since=30day | cut -b-10
+      seq 0 30 | xargs -i date +%F -d-{}day ) |
+    sort | uniq -c | awk '$1--' | graph
+
 =head1 AUTHOR
 
 Mischa POSLAWSKY <perl@shiar.org>