Add a script to parse our XEarth committer markers file and generate a
URL to Google's Charts API of a heat map of the world with countries colored according to the number of FreeBSD committers residing there.
This commit is contained in:
parent
b357cc9091
commit
4e74cfc22e
Notes:
svn2git
2020-12-08 03:00:23 +00:00
svn path=/www/; revision=31785
1 changed files with 156 additions and 0 deletions
156
tools/heatmaps/heatmap.pl
Executable file
156
tools/heatmaps/heatmap.pl
Executable file
|
@ -0,0 +1,156 @@
|
|||
#!/usr/bin/perl -w
|
||||
#
|
||||
# $FreeBSD$
|
||||
#
|
||||
# Script for parsing the xearth committers markers file and generating a
|
||||
# heat map with countries of the world colored according to how many committers
|
||||
# reside there.
|
||||
#
|
||||
# Creates an image of the following form :
|
||||
# http://chart.apis.google.com/chart?chco=ffffff,ffbe38,600000&chd=s:BEICCFKEDBXICMMCBDBFPDBBBBBEDBBBBBQDBBJE9B&chf=bg,s,EAF7FE&chld=ARATAUBEBGBRCACHCNCZDEDKESFRGBGRHUIEINITJPKRKZMNMOMXMYNLNONZPEPLPTRORUSESISKTWUAUSZA&chs=440x220&cht=t&chtm=world
|
||||
#
|
||||
# See http://code.google.com/apis/chart/
|
||||
#
|
||||
# Murray Stokely, March 30, 2008
|
||||
#
|
||||
|
||||
use strict;
|
||||
|
||||
my %country_iso3166 = (
|
||||
'western australia', 'AU',
|
||||
'usa', 'US',
|
||||
'poland', 'PL',
|
||||
'canada', 'CA',
|
||||
'ukraine', 'UA',
|
||||
'sweden', 'SE',
|
||||
'uk', 'GB',
|
||||
'russia', 'RU',
|
||||
'bulgaria', 'BG',
|
||||
'switzerland', 'CH',
|
||||
'czech republic', 'CZ',
|
||||
'denmark', 'DK',
|
||||
'mexico', 'MX',
|
||||
'portugal', 'PT',
|
||||
'ca usa', 'US',
|
||||
'romania', 'RO',
|
||||
'india', 'IN',
|
||||
'malaysia', 'MY',
|
||||
'the netherlands', 'NL',
|
||||
'greece', 'GR',
|
||||
'spain', 'ES',
|
||||
'japan', 'JP',
|
||||
'taiwan', 'TW',
|
||||
'austria', 'AT',
|
||||
'brazil', 'BR',
|
||||
'hungary', 'HU',
|
||||
'south africa', 'ZA',
|
||||
'italy', 'IT',
|
||||
'belgium', 'BE',
|
||||
'france', 'FR',
|
||||
'mongolia', 'MN',
|
||||
'united kingdom', 'GB',
|
||||
'slovakia', 'SK',
|
||||
'peru', 'PE',
|
||||
'ireland', 'IE',
|
||||
'south korea', 'KR',
|
||||
'norway', 'NO',
|
||||
'australia', 'AU',
|
||||
'new zealand', 'NZ',
|
||||
'slovenia', 'SI',
|
||||
'macau sar', 'MO',
|
||||
'argentina', 'AR',
|
||||
'china', 'CN',
|
||||
'germany', 'DE',
|
||||
'kazakhstan', 'KZ',
|
||||
);
|
||||
|
||||
sub printUsage() {
|
||||
print STDERR "Usage : heatmap.pl <xearth markers file>\n\n";
|
||||
}
|
||||
|
||||
# This is an encoding of data values from 0 to 61 into [A-Za-z0-9].
|
||||
# See http://code.google.com/apis/chart/#simple_values
|
||||
sub simple_encode($) {
|
||||
my $num = int($_[0]);
|
||||
if ($num >= 0) {
|
||||
if ($num <=25) {
|
||||
return chr(ord('A')+$num);
|
||||
} elsif ($num<=51) {
|
||||
return chr(ord('a')+$num);
|
||||
} elsif ($num<=61) {
|
||||
return chr(ord('0') + $num - 52);
|
||||
} else {
|
||||
die "Can not simple encode $num!";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if ($#ARGV < 0) {
|
||||
printUsage();
|
||||
exit;
|
||||
}
|
||||
|
||||
open(FIN, "$ARGV[0]") || die "Could not open $ARGV[0] : $!";
|
||||
|
||||
# ISO country code => number of committers from there.
|
||||
my %country_hash;
|
||||
foreach my $line (<FIN>) {
|
||||
chomp $line;
|
||||
# Match a line like this and extract number of usernames in quotes
|
||||
# and human-readable country
|
||||
# 37.40, -122.07, "murray" # (CORE) Mountain View, CA, USA
|
||||
if ($line =~ m/\s*\d+\.\d+,?\s+-?\d+\.\d+,?\s*"([^"]+)"[^#]*#(.*)$/g) {
|
||||
my @people = split(/\s*,\s*/, $1);
|
||||
my $rawcountry = $2;
|
||||
my $len = 0;
|
||||
foreach my $person (@people) {
|
||||
$len++ if ($person =~ m/\S+/);
|
||||
}
|
||||
if ($len == 0) {
|
||||
print STDERR "Couldn't parse: $line\n";
|
||||
next;
|
||||
}
|
||||
my @components = split(/,/, $rawcountry);
|
||||
my $country_name = $components[$#components];
|
||||
$country_name =~ s/^\s*//;
|
||||
$country_name =~ s/\s*$//;
|
||||
if ($country_iso3166{lc($country_name)}) {
|
||||
$country_hash{$country_iso3166{lc($country_name)}} += $len;
|
||||
} else {
|
||||
print STDERR "Unknown ISO code for country: $country_name\n";
|
||||
}
|
||||
}
|
||||
}
|
||||
close(FIN);
|
||||
|
||||
my %worldmap;
|
||||
# Parameters for the Charts API.
|
||||
$worldmap{'chs'} = '440x220';
|
||||
$worldmap{'chco'} = 'ffffff,ffbe38,600000';
|
||||
$worldmap{'cht'} = 't';
|
||||
$worldmap{'chtm'} = 'world';
|
||||
$worldmap{'chld'} = '';
|
||||
$worldmap{'chd'} = 's:';
|
||||
$worldmap{'chf'} = 'bg,s,EAF7FE';
|
||||
|
||||
# country_hash - country name -> committers from there
|
||||
# Find the largest number of committers in one country, so we can normalize
|
||||
my $max_ppl = (reverse sort {$a <=> $b} values %country_hash)[0];
|
||||
my %country_pct;
|
||||
|
||||
# country_pct - iso countr code -> pct committers from there.
|
||||
foreach my $country (keys %country_hash) {
|
||||
$country_pct{$country} = simple_encode(sprintf "%d", (((60 * $country_hash{$country}) / $max_ppl) + 1));
|
||||
}
|
||||
|
||||
foreach my $key (sort (keys %country_pct)) {
|
||||
$worldmap{'chld'} .= $key;
|
||||
$worldmap{'chd'} .= $country_pct{$key};
|
||||
}
|
||||
|
||||
my $CHART_URL = 'http://chart.apis.google.com/chart?';
|
||||
foreach my $key (sort (keys %worldmap)) {
|
||||
$CHART_URL .= sprintf '%s=%s&', $key, $worldmap{$key};
|
||||
}
|
||||
chop $CHART_URL;
|
||||
print $CHART_URL;
|
Loading…
Reference in a new issue