fix sival log for negative/zero values
[barcat.git] / barcat
diff --git a/barcat b/barcat
index 1347cf5a5d053e282c721d6ee2669419180643a5..48464342d6f2d2053fe28fb1f835ea9b364136c8 100755 (executable)
--- a/barcat
+++ b/barcat
@@ -143,10 +143,11 @@ 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;
+       my $unit = int(log(abs $_[0] || 1) / log(1000) - ($_[0] < 1) + 1e-15);
+       my $float = sprintf '%e', $_[0] / 1000 ** $unit;  #TODO: or $_[0] =~ /\./
+       $float -= int($float);
        sprintf('%*.*f%*s',
-               $float ? 5 : 3, $float,  # length and tenths
+               $float ? (5,1) : (3,0),  # length and tenths
                $_[0] / 1000 ** $unit,   # number
                $float ? 0 : 3,          # unit size
                $#{$opt{units}} >> 1 < abs $unit ? "e$unit" : $opt{units}->[$unit]
@@ -192,6 +193,7 @@ if ($opt{stat}) {
 }
 
 __END__
+=encoding utf8
 
 =head1 NAME
 
@@ -311,56 +313,68 @@ Appended graphics will extend to fill up the entire screen.
 
 =head1 EXAMPLES
 
-Commonly used after counting, such as users on the current server:
+Draw a sine wave:
 
-    users | sed 's/ /\n/g' | sort | uniq -c | barcat
+    seq 30 | awk '{print sin($1/10)}' | barcat
 
-Letter frequencies in text files:
+Compare file sizes (with human-readable numbers):
 
-    cat /usr/share/games/fortunes/*.u8 |
-    perl -CO -nE 'say for grep length, split /\PL*/, uc' |
-    sort | uniq -c | barcat
+    du -d0 -b * | barcat -H
 
-Memory usage of user processes:
+Memory usage of user processes with long names truncated:
 
     ps xo %mem,pid,cmd | barcat -l40
 
-Sizes (in megabytes) of all root files and directories:
+Monitor network latency from prefixed results:
 
-    du -d0 -m * | barcat
+    ping google.com | barcat -f'time=\K' -t
+
+Commonly used after counting, for example users on the current server:
+
+    users | sed 's/ /\n/g' | sort | uniq -c | barcat
+
+Letter frequencies in text files:
+
+    cat /usr/share/games/fortunes/*.u8 |
+    perl -CS -nE 'say for grep length, split /\PL*/, uc' |
+    sort | uniq -c | barcat
 
 Number of HTTP requests per day:
 
     cat log/access.log | cut -d\  -f4 | cut -d: -f1 | uniq -c | barcat
 
-Any kind of database query with leading counts:
+Any kind of database query with counts, preserving returned alignment:
 
     echo 'SELECT count(*),schemaname FROM pg_tables GROUP BY 2' |
     psql -t | barcat -u
 
-Exchange rate USD/EUR history from CSV download provided by ECB:
+External datasets, like movies per year:
+
+    curl https://github.com/prust/wikipedia-movie-data/raw/master/movies.json |
+    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:
+
+    curl https://github.com/Biuni/PokemonGO-Pokedex/raw/master/pokedex.json |
+    jq -r '.pokemon[] | [.height,.num,.name] | join(" ")' | barcat
+
+USD/EUR exchange rate from CSV provided by the ECB:
 
     curl https://sdw.ecb.europa.eu/export.do \
          -Gd 'node=SEARCHRESULTS&q=EXR.D.USD.EUR.SP00.A&exportType=csv' |
     grep '^[12]' | barcat -f',\K' --value-length=7
 
 Total population history from the World Bank dataset (XML):
+External datasets, like total population in XML from the World Bank:
 
     curl http://api.worldbank.org/v2/country/1W/indicator/SP.POP.TOTL |
     xmllint --xpath '//*[local-name()="date" or local-name()="value"]' - |
     sed -r 's,</wb:value>,\n,g; s,(<[^>]+>)+, ,g' | barcat -f1 -H
 
-Movies per year from prepared JSON data:
-
-    curl https://github.com/prust/wikipedia-movie-data/raw/master/movies.json |
-    jq '.[].year' | uniq -c | barcat
-
-Pokémon height comparison:
-
-       curl https://github.com/Biuni/PokemonGO-Pokedex/raw/master/pokedex.json |
-       jq -r '.pokemon[] | [.height,.num,.name] | join(" ")' | barcat
-
-Git statistics, such commit count by year:
+And of course various Git statistics, such commit count by year:
 
     git log --pretty=%ci | cut -b-4 | uniq -c | barcat
 
@@ -368,10 +382,6 @@ Or the top 3 most frequent authors with statistics over all:
 
     git shortlog -sn | barcat -L3 -s
 
-Latency history:
-
-    ping google.com | barcat -f'time=\K' -t
-
 =head1 AUTHOR
 
 Mischa POSLAWSKY <perl@shiar.org>