Category Archives: Diverse coding | Kaikenlaista koodailua

HelMet API ja sivutus

Harjoittelu jatkuu. Tämä versio näyttää, miten useampisivuisen hakutuloksen saa listattua yhteen ja samaan tauluun. Mitään kovin massiivisia hakuja ei näin kannata tehdä. Varmempi ja miksei käyttäjäystävällisempikin tapa toteuttaa sama asia on antaa sivukohtaiset tabit, jota klikkaamalla kyseinen sivu haetaan. Samaan tapaan siis kuin mitä API:n oma Search-sivu tarjoaa.

Demohaku on tarkoituksella niin nirso, että se olettaa kirjailijan nimen esiintyvän sellaisenaan author-kentässä. Jos näin ei ole, listalta tipahtaa. Näin kävi esimerkiksi teokselle Carnets : mai 1935 – février 1942, jonka author-kentän lopussa on tyhjä merkki. Tosielämässä ylimääräiset blankot otetaan tietysti huomioon.

Helatorstain HelMet-API

Tulipa mukavaan saumaan tuo HelMet API -julkaisu. Sain uraauurtavaa, kotimaista materiaalia jQueryn ja JSON(P):n alkeiden opiskelulle. Joten, pientä juhlameininkiä, onhan helatorstai ja kaikki: omistan tämän ensimmäisen tekijähakuyritelmäni pitkän linjan internet-aktiiville, Kari A. Hintikalle! Toivottavasti kirjoituskäsi on pian taas kunnossa, ja tekeillä oleva Vertaisaika etenee mallikkaasti. Terveisiä myös muille kirjoittajille: Tuija-kaimalle ja Annelle. Pääsette demohenkilöiksi sitten kun nimekkeitä on enemmän 😉

Kuratointia

HS Open #2

HS Open kakkonen on huomenna, ja sinne olen minäkin menossa. Mielenkiintoinen päivä tulossa! Luupin alla ovat mm. eduskuntavaalit 2011. Rahoittajia löytyi, ehdokkaita oli, vaalit käytiin. Mitä muuta tästä spektaakkelista voi päätellä numeroiden valossa?

Lähdetään liikkeelle datasta.

Keskeistä aineistoa HS Open kakkosen Politiikka-ryhmälle ovat ehdokkaiden ilmoitukset kampanjoiden menoista ja ilmoitukset tukijoista. Arvokasta taustainformaatiota tuovat mm. YLE:n vaalikonetiedot.

Kaksi taulukkoa, kaksi omistajatahoa. Voiko taulukot yhdistää jonkin yhteisen, uniikin sarakkeen avulla? Ei voi, näillä tiedoilla. Mitään Vaaliehdokas-ID -avainta ei ole olemassa. Henkilötunnus tietysti kaikilla ehdokkailla on, mutta sitä ei saa julkaista eikä hyödyntää. YLE:n taulukkorivit (ehdokkaat) on yksilöity ID-numerolla, mutta se on taulukon tuottamisen sivutuote. Ehdokasnumero taas on vaalipiirikohtainen. Puoluerahoitusvalvonnan aineistossa ei ole mitään avainsaraketta. Tarvitaan siis yhteinen nimittäjä.

YLE:n aineistossa on mainittu ehdokkaista sukunimi ja kutsumaetunimi. Puoluerahoitusvalvonnan datassa taas sukunimi ja kaikki nimet, joista jokin on todennäköisesti kutsumanimi. Riittäisikö etu- ja sukunimen yhdistäminen avaimeksi? Ehkä ei, sillä kaimoja saattaa olla. Puolueen lyhenteen lisääminen perään olisi kai jo aika varmaa? Harmi, että lyhenne löytyy vain rahoitusdatasta, ei YLE:ltä.

Ajatus: lähes jokaisella ehdokkaalla vaikutti tällä kerralla olevan oma vaali-web-domain. Olisiko jonkun jossakin kannattanut tallentaa se?

Käytin yhteisen avaimen muodostamisen yrittämiseen useita tunteja. Lopputulos: ei tullut avainta, mutta tulipa kokemusta datan siivoamis- ja esitystyökaluista Google Refine ja Google Fusion Tables. Ynnä hämmennystä ja lievää manailua Google Docs -hipsuista ja muista yllätyksistä.

Google Refine

Google Refine (entinen Freebase Gridworks) on näpsäkkä työkalu. Esimerkiksi data.gov.uk on käyttänyt sitä omissa yhdistetyn avoimen datan hankkeissaan. Jeni Tennisonilta löytyy selkeäsanainen esitys aiheesta. Googlen pari omaa esittelyvideota kannattaa katsoa. Niillä pääsee hyvin alkuun.

Rahasummia tullaan laskeskelemaan ja vertailemaan. Niiden on siis syytä olla tietotyypiltään samanlaisia. Annoin Refinen lukufasetin (numeric facet) käydä läpi kaikki ne Puoluerahoitusvalvonnan taulukon sarakkeet, joissa oli rahasummia. Suurin osa oli tekstityyppiä, mutta joukossa oli myös numeerista dataa.

Valtavirrasta poikkeavat taulukon solut editoidaan. Kaikille tekstityypi, klik, done. Tällainen “masterdatan” muokkaaminen ei tietysti ole riskitöntä.

Taulukkolaskentaohjelmistot tarjoavat monenlaista vipstaakia datan sisäänlukuvaiheessa. Kokeilin, miten vahingossa mukaan livahtaneet hipsut ja ylimääräiset tyhjät merkit pystyy poistamaan. Pystyy, helposti.

Google Refine Expression Language (GREL) ymmärtää säännöllsiä lausekkeita. Alla poistetaan Etunimet-sarakkeen soluista lopun tyhjät merkit ja sulkeva hipsu.

Google Fusion Tables

Pinserissä oli muutama viikko sitten mainio salapoliisitarina iPhone-paikkadatasta. Siitä luin ensimmäistä kertaa näistä fuusiotauluista. Kätevä apu datan kääntelyyn ja katseluun eri kanteilta. Ja jos mukana on paikkatietoa – kuten Pinserin tapauksessa – ne esitetään automaattisesti karttanäkymässä. Taulukkoon voi tallentaa näkymiä, ja näkymiin edelleen suodatuksen ja ryhmityksiä.

Tein YLE:n vaalikonedatalle näkymän, jossa ovat ehdokkaista vain perustiedot kuten nimi, ikä, sukupuoli, puolue jne. Suodatin jäljelle vain ne rivit, jotka liittyvät valittuihin ehdokkaisiin. Ryhmitys keskimääräisen iän ja puolueen mukaan.

Erilaisten näkymien ja ryhmittelyjen määrittely data-aineistolle lähestyy pivot-taulujen filosofiaa. Excel ja OpenOffice Calc ovat tunteneet ne jo pitkään, ja aivan hiljattain niille tuli aito tuki myös Google Docsiin. Olen yksi heistä, joille pivotointi on vielä varsin vierasta. Tony Hirstin maanläheinen blogaus on auttaa alkuun.

Paikkatiedosta puheenollen, leikittelin jonkin aikaa ajatuksella, että saisin ennen HS Openia käsiini jonkin eduskuntavaaliehdokkaan, jolla olisi ollut iPhone mukana vaalityössä. Grand Plan: oletetaan, että hän olisi halukas antamaan Tieteen käyttöön viimeisen vaalityöviikkonsa paikkadatan. Oletetaan edelleen, että hän olisi liikkunut nimenomaan omassa vaalipiirissään iPhonensa kanssa. Miltä näyttäisi visualisointi, jossa olisivat mukana hänen liikkeensä ja hänen kyseisessä vaalipiirissä saamansa äänet? Voisiko tästä vetää minkäänsortin johtopäätöksiä vaalityön vaikutuksista äänestyskäyttäytymiseen? No, vastaus on tietysti että ei voi 🙂 mutta sormiharjoitteluna se olisi ollut mukava. Terveiset ja kiitokst Jyrki Kasville, joka tuli ensimmäisenä mieleen, kun mietin keneen ottaa yhteyttä. Hän oli tehnyt vaalityötä Eduskunnan Nokia E90:n kanssa, koska siinä oli työpaikan kalenteri. Muita en tähän hätään ehtinyt saada kiinni.

Google Docs

Suurin osa tästä aurinkoisesta viikonlopusta meni Google Docsin kanssa mähkiessä. Kuvittelin näet voivani rakentaa sen avulla puuttuvan lenkin rahoitusdatan ja YLE:n vaalikonedatan välillä.

Olin muodostanut Google Refine’n transform-vivulla molempiin taulukoihin ylimääräisen apusarakkeen HloID, ehdokkaan sukunimi ja ensimmäinen etunimi. Tavoite: kopioida sen avulla YLE-taulun ID myös toiseen tauluun. Silloin minulla olisi kunnon avain.

Lopulta onnistui, edes osittain (mutta ei oikealla aineistolla, josta kohta lisää), kiitos ahkeran googlaamisen ja ystävällisten Google Docs -foorumin vakioauttajien.

=QUERY('Sheet2'!A:C,"SELECT C WHERE A CONTAINS """&A361&""" ")

Tässä ollaan työkirjan lakanalla Sheet1, B-sarakkeen (tuleva ID) solussa B361. Samalla rivillä, A-sarakkeessa, on HloID. Saman työkirjan lakanasta Sheet2, sarakkeesta A, etsitään vastaavaa merkkijonoa. Jos löytyy, saman rivin sarakkeesta C haetaan arvo soluun B361.

QUERY-lauseke on tallennettu ensimmäiselle datariville. Solun oikeasta alanurkasta kiinni, ja lausekkeen kopiointi taulukon kaikille riveille. Suhteellinen viittaus A-sarakkeen soluun kasvaa samalla automaagisesti.

So far so good. Mutta. Varsinainen taulukko on niin iso, että Google Docs ei suostukaan lukemaan sitä samaan työkirjaan. No, tämän ei pitäisi olla ongelma, sillä myös kokonaan toisesta työkirjasta voi hakea, ainakin teoriassa.

=QUERY(IMPORTRANGE("0AvfW9KgU1XzhdHJSRFFwSGR3YWR6MVl3X0ZVWkhibUE","Sheet1!A:C"),"SELECT C WHERE A CONTAINS """&A361&""" ")

Pitkä älämölö on työkirjan yksilöivä avain. Sen näkee URL:sta.

Ei onnistunut. Google Docs oli joko sitä mieltä, että C-saraketta ei ole tai että hittiä ei löydy. Joissakin ohjeissa lakana ympäröitiin yksinkertaisilla hipsuilla, toisissa ei. Joissakin käytettiin puolipistettä välimerkkinä, toisissa pilkkua.

Nyt te varmaan sanotte, että “miksi ihmeessä mokoma vaiva, tauluthan voi yhdistää simppelisti tällä tavalla…” ja näytätte. Jään odottamaan.

EDIT 23.5: Järjestäjät olivat tehneet paljon duunia datan eteen. Aineisto oli siististi kantatauluissa, kanta LAMP-palvelimella ja palvelin Amazonilla. Kiitos tämän, päivän annista tuli hyvä. Porukassa oli osaajia monelta alalta, ja nopea protoilu sujui. Lahjakasta väkeä!

Väitöskirjat

Suomalaisista yliopistoista valmistui vuonna 2009 reilut 1600 uutta tohtoria. Olen siitä omituinen, että tykkään vilkuilla minkälaisia väitöskirjoja on ilmestynyt. Suurin osa kovasta tieteestä menee yli hilseen (onko kukaan väitellyt hilseestä?), mutta mukaan mahtuu silti sadoittain potentiaalisesti mielenkiintoisia, tuoreita tutkimuksia.

Väitöstilaisuuksista ja uusista väitöskirjoista tiedotetaan yliopistojen verkkosivuilla. Lehdistötiedotteissa, osana yleis-, ajankohtais- tai tiedeuutisia, tapahtumakalenterissa, uusissa julkaisuissa. Tiedottaja on yleensä joko yliopiston viestintä, julkaisuyksikkö tai kirjasto. Väitösuutisista kiinnostuneen kansalaisen on oltava kärppänä, mistä mitäkin löytyy ja milloin.

Reilu vuosi sitten tein tukun RSS-syötteitä Yahoo!Pipesilla niiden yliopistojen väitöksistä, jotka eivät sitä itse tarjoneet. Melko työlästä. Yliopiston julkaisujärjestelmästä (tai sen puutteesta) riippuen tiedote putkahtaa ilmoille eri tekniikoilla tuotettuna ja vaihtelevan muotoisena. Olennaisten tietojen poimiminen HTML-sivulta on pikkutarkkaa puuhaa, eikä mikään takaa että logiikka toimii enää ensi viikolla.

Kävin nyt uudestaan läpi kaikki putket. Muutoksia tuli pal-jon. Ei mikään ihme. Yliopistoja on tällä välin yhdistelty, järjestelmiä uusittu, sivuja siirrelty, leiskoja muutettu.

Kaikkien syötteiden liittäminen yhteen ja samaan tekee lopputuloksesta raskaan, joten jaoin ne viiteen pakettiin. Maantiedettä mukaillen etelästä pohjoiseen: pääkaupunkiseudun, Turun, Tampereen yliopistot sekä Lappeenrannan, Jyväskylän, Vaasan ja Itä-Suomen, Oulun ja Lapin yliopisto.

Helsingin yliopiston E-thesis -palvelun mittavasta syötetarjonnasta ovat mukana vain keskustakampus ja Kumpula. Yksi on joukosta poissa: entinen TKK eli nykyinen Aalto-ylipiston Teknillinen korkeakoulu. Syötteet ovat HTTPS-protokollan takana, ja Yahoo!Pipesilta ei löydy tukea sille. Varsinaisesti. YQL-kyselykielen ja Fetch Data -modulin avulla protokollarajoitetta voi tosin yrittää kiertää. En saanut temppua onnistumaan TKK:lla, Jyväskylässä (RSS) sen sijaan kyllä. Tiedä sitten, mikä ero tuossa on…

Jo hyvissä ajoin ennen väitöstilaisuutta väitöskirjan metatiedot on tallennettu digitaaliseen, määrämuotoiseen formaattiin. Työn on tehnyt yliopiston kirjasto. Metatieto on saman tien päivitetty paitsi paikalliseen tietokantaan myös Kansalliskirjaston Linda-yhteistietokantaan. Harmi vain, että tähän metatietoon ei ole toistaiseksi tarjolla avointa ohjelmointirajapintaa. Jos osaa ja viitsii, Lindan hakuliittymästä voi tietysti riipiä haluamansa tiedon screen scraping -tekniikoilla. Kotitarpeita ajatellen koodaus menee kuitenkin överiksi.

Kuinka ollakaan, tiedot väitöskirjoista leviävät myös Suomen rajojen ulkopuolelle. Isoimpia toimijoita ovat WorldCat ja Google Scholar. Molemmat tarjoavat API:n. Molemmat rajoittavat API:n käytön to qualifying institutions, mitä se sitten käytännössä tarkoittaakaan. Tiedän, että Google Scholarilla on paljon ystäviä, koska se on ajan tasalla. Vaikka sieltä ei välttämättä löydykään muuta kuin englanninkielistä aineistoa – kuten Jyrki Ilva E-thesis -palvelusta huomautti jo vuonna 2006 – suomenkieliset väitöskirjat alkavat olla harvinaisuus.

Leena Saarinen kirjoitti maaliskuussa Kansalliskirjaston Digitaalinen kirjasto -blogissa myönteiseen sävyyn Julkinen data -julkaisusta otsikolla Askel kohti avointa julkisdataa. Tämä lupaa hyvää. Nyt ei kun yhdessä toivomaan, ettei tarvitse odottaa liian kauan.

Taulukko tietokantana

Ulkomaan luontoretkillä on tullut tavaksi pitää listaa nähdyistä eläinlajeista. Taulukkoon nimi englanniksi ja latinaksi (jos tiedossa), paikka ja mahdollinen kommentti. En ole mikään listafriikki, mutta kirjaaminen helpottaa lajien ja tapahtumien muistamista.

Listoihin saattaa olla mielenkiintoa muillakin, joten olen muokannut niistä HTML-version verkkoon (sivun lopussa). Työnantaja on ollut joustava ja sallinut kohtuullisen määrän privaattia aineistoa webbipalvelimellaan. Se päivä on kuitenkin lähellä, että materiaali on syytä siirtää muualle. Webhotelli on mietinnässä muistakin syistä, mutta väliaikaisratkaisuna Google Docs on houkutteleva vaihtoehto.

Tony Hirst kertoo mainion havainnollisessa blogissaan, miten julkiseen Google-taulukkoon voi tehdä kyselyjä Google Visualisation API -kyselykielellä aivan kuin taulukko olisi verkossa oleva tietokanta. Kieli muistuttaa SQL-kyselykieltä. Tulosjoukon saa JSON-, CSV- tai HTML-muodossa.

Alkuperäiset taulukot ovat läppärillä Excel-tiedostoina. Toin Perun matkan lakanan Import-toiminnolla Googlelle, ja aloin leikkiä hakukielellä:

kaikki lajit, jotka näin Manu Wildlife Centerissä (MWC)
. Ei aakkostusta, ja taulukon sarakkeille A-D ymmärrettävämpi label

kultapyrstöt (oropendola) aakkosjärjestyksessä

kaikki rivit ensimmäistä lukuunottamatta, koska sen ensimmäisessä solussa ovat yhtenä pötkönä paikkalyhenteiden selitykset

So far so good, mutta vielä riittää duunia. Ensimmäisellä rivillä oleva tieto pitää saada käyttöön, samoin linkit latinalaisesta nimestä Wikipediaan.

Tvleffat-putki päivittyi

Muutama vuosi sitten tein tulevien TV-elokuvien syötteen telkku.com -palvelun perusteella. Kun äsken tweettasin illan Beat the Devil -leffasta, kävin pitkästä aikaa katsomassa, miltä putken alkupää näyttää. Ja kas, sieltähän löytyy nyt myös joistakin elokuvista linkki www.imdb.com-sivuille. Kopautin putkea, ja nyt linkki valuu mukana. Jos sinulla on sattumalta jatkotilaus putkesta, päivitä se syötelukijassasi.

Vuokratontti

Hankin viime vuonna tontin Second Life -virtuaalimaailmasta, EduFinland-saaristosta. Samaan tapaan kuin moni muutkin vuokralainen, minäkin testaan siellä yhtä sun toista ja mietin siinä sivussa, mihin oikeaan käyttöön tontista olisi. Tähän liittyen kirjoitin jopa riskianalyysin. Vaikka hassuahan se tavallaan on, tuo oikean etsiminen. Tonttihan ei ole todellinen vaan virtuaalinen.

Riskianalyysi pitää joka tapauksessa päivittää. Linden Lab näet julkaisi helmikuun lopulla uuden (beta) asiakasohjelman, Second Life Viewer 2, ja se onkin toista maata. Paitsi että käyttöliittymä muistuttaa entistä enemmän selainta, niin nyt myös mille tahansa objektille voi tuoda dynaamista web-sisältöä. Asiakasohjelmassa raksuttaa WebKit-moottori.

Osallistuin viikolla erääseen testiin, jossa ryhmä avattaria mm. muokkasi yhdessä Etherpad-dokumenttia. Todellisen ja virtuaalisen sekoittuminen reaaliajassa oli hämmentävä kokemus. No, Etherpadia ei kohta enää ole – joten nyt on parasta kerätä tavarat – mutta tämä oli vasta alkua.

Vielä kerran Radioputkesta: VTIMEZONE kunnolla mukaan

Yahoon putkesta tuleva vajavainen iCal alkoi nyppiä. Haen tämän outputin nyt Linux-ympäristöön, rakennan siellä standardinmukaisen tiedoston, siirrän sen webbipalvelimelle, ja tilaan sen sieltä Google-kalenterilla.

Skriptiä varten tein kaksi samana pysyvää aputiedostoa alku ja vtimezone, jotka yhdistetään muuttuvaan tietoon jokaisella ajokerralla.

alku:


BEGIN:VCALENDAR
VERSION:2.0
PRODID:-//ts.fi/iCal/EN

vtimezone:


BEGIN:VTIMEZONE
TZID:Europe/Helsinki
BEGIN:STANDARD
DTSTART:19811001T040000
RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10
TZNAME:Europe/Helsinki
TZOFFSETFROM:+0300
TZOFFSETTO:+0200
END:STANDARD
BEGIN:DAYLIGHT
DTSTART:19810301T030000
RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=3
TZNAME:Europe/Helsinki
TZOFFSETFROM:+0200
TZOFFSETTO:+0300
END:DAYLIGHT
END:VTIMEZONE

Tämä shell-skripti on ajastettuna kerran vuorokaudessa.


#!/bin/bash

# Yahoo!Pipesin tuottaman iCal-muotoisen tiedoston URL
url='http://pipes.yahoo.com/pipes/pipe.run?_id=6602675e62d5d95c7333285517e6a471&_render=ical&urlinput1=http%3A%2F%2Fspreadsheets.google.com%2Fpub%3Fkey%3Dtd1iey6KTeeTgGlE6U3_PPg%26output%3Dcsv'

# Haetaan data, ja tallennetaan se tiedostoksi
curl $url -o tolisten.ics

# Otetaan alussa olevat metatiedot talteen
grep X-WR tolisten.ics >XWR

# Yhdistetään alku, metatiedot ja aikavyöhyketiedot
cat alku XWR vtimezone >beforeevents

# Otetaan tapahtumatiedot erilleen
sed -n '/BEGIN:VEVENT/,$p' tolisten.ics >events

# Tyhjät rivit pois, ja korvataan DTSTART- ja DTEND-rivit
perl -pe 's/^n//;s/DTSTART:/DTSTART;TZID=Europe/Helsinki:/g;s/DTEND:/DTEND;TZID=Europe/Helsinki:/g' events >tzidevents

# Yhdistetään alkuosa tapahtumatietoihin
cat beforeevents tzidevents >all.ics

# Siirretään valmis tiedosto webbipalvelimelle
mv all.ics ~/public_html/yle.ics

# Lopuksi vielä tiedoston lukuoikeudet kuntoon
chmod go+rx ~/public_html/yle.ics

iCal-standardi edellyttäisi lisäksi jokaiselle tapahtumalle uniikin ID:n. Google-kalenteri ei sitä välttämättä tarvitse, mutta ehkä sen voisi vielä tuohon viritellä.