Recently in Programmering Category

Lovdata har en fin kategorisering av norske lover. Jeg tenkte denne kunne være en fin datakilde for å eksperimentere litt med Google Visualization API og resultatet kan sees under.

Merk at flere lover kan opptre i flere kategorier. Det betyr at man ikke uten videre kan summere opp og få det totale antall lover som gjelder i Norge, men gir et godt bilde av hva som er viktig for oss - tror jeg.

Grunnlagsdata er tilgjengelige i et regneark.

Lovområde
Antall lover
Eldste lov
Siste lov
Lenke til Lovdata

Jula er over. Heller ikke i år fikk jeg det jeg ønsker meg mest; en binær klokke. Siden jeg har ti tommeltotter så tror jeg ikke jeg vil lage en selv. Derimot kan jeg jo programmere litt. En Javascript versjon er nok ikke like funksjonell, men får duge så lenge. Så får jeg krysse fingrene, kanskje neste år...



Norsk samfunnvitenskapelige datatjeneste (NSD) har en fantastisk tidsserie som de har kalt uenighetsindeksen. Dette er en serie som måler uenigheten mellom partiene på Stortinget. Indeksen har data fra 1979 og fram til høsten 2009. Dette er etter min mening en liten, godt gjemt skatt.

Tabellen som NSD publiserer er omfattende og vanskelig å lese. Jeg fant meg selv i å jobbe meg gjennom parti for parti og mistet snart helheten siden jeg hele tiden flyttet fokus.

Jeg har tidligere lest en del om SVD (Singular value decomposition) og hvordan denne kan benyttes til å prosjektere data i flere dimensjoner ned til f.eks to som lettere kan visualiseres i et diagram. Dette har blant annet vært gjort for stemmegivningen til senatorer i USA. Teknikken benyttes også i nettsøk og har med suksess blitt brukt for å presentere profilbaserte anbefalinger.

Utstyrt med Perl og pakken PDL prosjektere jeg uenighetsindeksen fra NSD ned til en dimensjon for hver tidsperiode, dvs en verdi for hvert parti i hver tidsenhet. Resultatet i form av et linjediagram kan du se under. Jo større avstand mellom linjene, jo mer uenige er partiene. Desto nærmere linjene er hverandre, vel, desto mer enige er de.

Til opplysning så har jeg lagt til regjeringssamarbeidene nederst på figuren.

partier.png

Dette ser ved første øyekast mildt sagt kaotisk ut, men ser man litt nøye etter så kan man se en del trender. Den mest opplagte er at partier som er i regjering med hverandre, ser ut til å være veldig enige. Ikke akkurat noen bombe akkurat det, men jeg synes det er litt morsomt å se hvordan f.eks Høyre plutselig blir så mye mer enig med både KRF og SP etter at regjeringssamarbeidet starter i 1981?? (helt til venstre i diagrammet).

Det samme utslaget kan vi se med dagens regjering (helt til høyre); SV, DNA og SV er stort sett enige. For ikke å snakke om hvor samlet opposisjonen er, med unntak av FRP. Denne klare samlingen ser ut til å være enestående i figuren. Kan dette ha noe med det faktum at vi har en flertallsregjering? Og er det en tendens som vil vare?

Jeg tror ikke at figuren vil svare på slike spørsmål, men synes allikevel den gir et enkelt og godt bilde av avstanden mellom de politiske partiene i Norge.

Datagrunnlag og kildekode

Skulle du ha lyst til å gjøre dette selv, vil etterprøve mine konklusjoner - det er jo ikke sikkert jeg har gjort ting riktig - eller bare har lyst til å leke deg, så skal du få slippe å gjøre den jobben jeg akkurat har gjort. Du kan laste ned et Perl-script som inneholder tabellen fra NSD samt utfører SVD transformasjonen. Du kan også se på datagrunnlaget til diagrammet i form av et regneark.

I mai, mens jeg hadde en litt stille dag i Thailand, kom jeg over to sider hos Pollution Control Department i Bangkok (PCD). De spesielle med disse er at de inneholder tabeller som viser luftforurensingen i hendholdsvis Bangkok og for hele landet. Litt som luftkvalitet.info her i Norge.

Jeg har tidligere jobbet på et EU-prosjekt som heter APNEE. Dette prosjektet hadde blant annet som mål å presentere informasjon om luftkvalitet på regionalt nivå til publikum. Også noe av det samme som luftkvalitet.info gjør.

Det er spesielt kartpresentasjonen som jeg synes er informativ. Så kunne jeg på en enkel måte flytte informasjonen fra HTML-tabellene til PCD over til et kart? Nå finnes det noen enkle kart hos PCD, men jeg ville ha noe mer spenstig.

luftkvalitet-thailand-yahoo-pipes.pngJeg hadde ingen planer om å bruke for mye tid på dette - jeg var på ferie, men hadde fått en kløe som måtte stilles. Det var da det slo meg at jeg kunne bruke Yahoo Pipes til dette. Hente inn siden, trekke ut de dataene jeg trengte og produsere en GeoRSS strøm. Enkelt og burde ikke ta så alt for lang tid.

Og det tok det ikke heller. Etter et par timer hadde jeg resultatet klart og jeg var ganske fornøyd med meg selv. En enkel og oversiktlig prosess var produsert.

Da jeg skulle ta en titt på denne igjen for noen dager siden, etter at den var gått i glemmeboken et par måneder, var min overraskelse stor da jeg leste følgende beskjed:

warning Can't fetch pages that robots.txt disallow

PCD har tydeligvis stengt av for aksess til sidene for roboter, noe som Yahoo Pipes er. Kanskje på grunn av mitt lille eksperiment, hva vet jeg? Uansett syntes jeg dette var forargelig og ble litt irritert.

Så hvordan kan jeg komme rundt dette?

Prosessen er jo ganske enkel og en ypperlig oppgave til et lite Perl script. Som sagt så gjort. Jeg satt meg ned og skrev noen få *kremt* linjer kode. Den eneste forskjellen er at istedenfor å produsere GeoRSS så valgte jeg å lage KML istedenfor.

Voila, luftkvaliteten for de største byene i Thailand kan inspiseres i Google Earth.


AQI-Thailand.pngHvis du er interessert i kildekoden eller resultatet, kan du laste dem ned.
This is a small perl plugin I have made for Gaim. It uses the Chatbot::Eliza module by (download from CPAN) which imitates a phychotherapist, and responds to all instant messages that arrives. I read an article by Randal L. Schwartz, and wanted to have some fun with my buddies. Try it if you like, it doesn't matter, it's all the same.

use Chatbot::Eliza; 
GAIM::register("Eliza", "0.0.1", "end", "");

my($myname) = "Per Henrik"; 
my($elizaname) = "Eliza";

my(@ids) = GAIM::get_info(1);

my($msg,$id);
my(%buddy) = ();

foreach $id (@ids) {
  my($pro) = GAIM::get_info(7, $id);
  my($nam) = GAIM::get_info(3, $id);
  $msg .= "\n$nam using $pro";
}

GAIM::print("Eliza activated.", "$elizaname signing on. Responding on behalf of $msg");

GAIM::add_event_handler("event_im_recv", "doEliza");

sub doEliza {
  my($index) = $_[0];
  my($who) = $_[1];
  my($text) = $_[2];
  my($flags) = $_[3];

  if(defined($buddy{$who})) {
    my($eliza) = $buddy{$who};
    my($eliza_says) = $eliza->transform($text);
    GAIM::print_to_conv($index, $who, $eliza_says, 0);
  } else { # first time $who sends a message to me
    GAIM::print_to_conv($index, $who, "Hello, how are you?", 0);
    GAIM::print_to_conv($index, $who, "$myname is not here right now.", 0);
    GAIM::print_to_conv($index, $who, "He is probably working, sleeping, eating or whatever.",
0);
    GAIM::print_to_conv($index, $who, "You can chat with me if you like.", 0);
    GAIM::print_to_conv($index, $who, "My name is $elizaname.", 0);
    GAIM::print_to_conv($index, $who, "How are you feeling today?", 0);
    $buddy{$who} = new Chatbot::Eliza();
  }
}

sub end {
  GAIM::print("Eliza unload", "$elizaname signing off.");
}