F.lux siirtää vuorokausirytmin

in Technology, Non-technology

Otin toukokuussa käyttöön F.luxin. Se on yksinkertainen sovellus, joka muuttaa näytön värilämpötilaa auringon laskiessa ja noustessa. Ilman F.luxia elimistö kuvittelee, että aurinko ei laske koskaan, jos viettää paljon aikaa iltaisinkin tietokoneen ääressä.

F.lux toimii. Omalla kohdallani se on siirtänyt vuorokausirytmiä 2-4 tunnilla aikaisemmaksi. Tai oikeastaan aiemmin ei ollut mitään vuorokausirytmiä, vaan tuli tehtyä tietokoneella hommia monesti läpi yön, jos oli jokin kiinnostava projekti käynnissä. Nykyään aurinko laskee kaikilla näytöilläni klo 22 aikoihin ja klo 00 alkaa jo väsyttää. Viimeistään klo 02 nukahtaa melkein automaattisesti. Aamulla tulee sitten herättyä hämmentävän aikaisin.

Huono puoli on tietysti se, että tarvittaessa on vähän vaikeampi jaksaa valvoa myöhään. Näin kesällä vaikutus tuntuu vielä korostuvan, kun on päällä jatkuva heinänuha ja antihistamiinit. Syksyllä näkee sitten, miten homma toimii auringon laskiessa jo aikaisemmin.

F.luxin saa asennettua Mac-, Linux- ja Windows-koneisiin. Värilämpötilan muuttaminen voi näyttää aluksi oudolta, mutta siihen tottuu kyllä. Näytön punerrus on tavallaan samalla signaali siitä, että voi alkaa hiljalleen rentoutua iltaa kohden. Ainoat asiat, joissa värilämpötilan muutos oikeasti häiritsee, ovat kuvankäsittely ja television tai elokuvien katsominen. Silloinkin voi helposti käyttää F.luxin "Disable for an hour" -toimintoa.

Fixing a broken Windows Update on Windows 7 64-bit

in Technology

I recently noticed that my Windows 7 PC (64-bit) had not updated itself for a long time. When trying to manually run Windows Update, it would only open a dialog box saying:

"Windows Update cannot currently check for updates because the service is not running"

This happened despite the fact that the Windows Update service was, in fact, running and also properly configured as Automatic (Delayed Start).

After unsuccesfully trying various built-in fixes in Windows 7 and also trying a downloadable Microsoft Fix It pack, I decided to run a Upgrade using the original Windows 7 installation CD. That finally fixed the problem and now Windows Update is functional again.

The procedure to run an upgrade is:

  • Insert the Windows 7 installation CD.
  • Run the setup (without rebooting first).
  • Allow setup to download the latest updates.
  • Install as usual and choose to Upgrade Windows when asked.
  • You will need to re-enter the product key and re-activate.

I don't know how much of your custom settings and applications will be overwritten by this operation. I only use Windows 7 casually for gaming so I did not care.

Git status kaikista työhakemistoista

in Technology

Minulla on työkoneillani yleensä 20-30 eri Git-projektia checkattuna ulos. Joskus on helppo unohtaa checkata muutokset takaisin sisään, jos työstää samaan aikaan useita projekteja. Käytän tällaista bash-skriptiä apuna tarkistaakseni, missä projekteissa on muutoksia:

#!/bin/sh
cd ~/Git
for ff in `find . -name .git`; do
  f=`dirname "$ff"`
  echo $f
  cd $f
  git status $*
  cd -
done

Kuten skriptistä käy ilmi, pidän kaikkia projektejani Git-nimisen hakemiston alla. Sen alla olevat hakemistohierarkiat vaihtelevat, mutta onneksi jokaisessa Git-työhakemistossa on tasan yksi .git-alihakemisto, jonka avulla on helppo etsiä projektit.

Samalla periaatteella voi ajaa muitakin komentoja kaikkiin projekteihin. Käytän vastaavaa git pull -skriptiä päivittääkseni uusimmat muutokset keskitetyistä repositoryistä.

iOS 4 SDK:sta puuttuvat toiminnot

in Technology, Apple

Olen koodaillut tänä keväänä ja kesänä aika paljon iPad- ja iPhone-sovelluksia, lähinnä erilaisia prototyyppejä. Olen tunnistanut ainakin seuraavat kaksi jatkuvasti toistuvaa "patternia", joihin olisi kiva löytää vakioitu ratkaisu.

NSURLConnection: Jonotettu tiedonsiirto

Useimmat sovellukseni rakentuvat siten, että Core Datalla määritellään tietorakenne eli joukko SQLite-tauluja ja niiden kenttiä. Sitten verkosta haetaan JSON-muotoista tietoa ja tallennetaan se kyseisiin tauluihin.

iOS 4 SDK:n vakiotoiminnallisuus mahdollistaa vain yksittäisen taustalla latautuvan downloadin NSURLRequest- ja NSURLConnection-luokilla. Jokaista siirtoa varten pitää tehdä oma delegate-objekti, joka ymmärtää mitä vastaanotetulla tiedolla tehdään. Lisäksi sen pitää osata käynnistää seuraava tiedonsiirto edellisen päätyttyä.

Olisi paljon kätevämpää, jos voisi määritellä vapaamittaisen jonon ladattavia URLeja ja kullekin sitten yksinkertaisen käsittelylogiikan. Jonoon voisi lennossa heittää lisää tavaraa latautumaan sitä mukaa, kun esimerkiksi aiemmin ladatuista JSON-rakenteista huomataan, että tarvitaan myös niihin liittyviä kuvia tai videoita.

Rajapinta voisi toimia esimerkiksi näin:

// Wish for simpler queued NSURLConnections

- (void)startDownloading {
  self.queue = [DownloadQueue queue]
  [queue addDataURL:[NSURL URLWithString:@"http://www.google.com"]
         target:self
         onComplete:@selector(googleComplete:data:)
         onError:nil];
}

- (void)googleComplete:(DownloadQueue *)queue data:(NSData *)data {
  // Parse data and load images...
  [queue addDataURL:[NSURL ...]
         target:self
         onComplete:@selector(imageComplete:data:)
         onError:nil];
}

- (void)imageComplete:(DownloadQueue *)queue data:(NSData *)data {
  // ...
}

Core Data: "Hae kaikki" ja "Poista kaikki" -toiminnot

Core Data ei ole mielestäni kovinkaan onnistunut rajapinta. Sen käyttö on työlästä ja monimutkaista. Erityisesti ärsyttää se, että yksittäisen taulun kaikkien rivien poistaminen edellyttää niiden lataamista ensin muistiin ja sitten kunkin poistamista erikseen. Rivien lataaminenkin on aika työlästä, kun NSFetchRequest-koodia pitää kirjoittaa ~10 riviä.

Useimpia käyttötapauksia varten olisi siis kätevää olla yksinkeraisempi rajapinta, jolla voisi hakea tai poistaa taulun kaikki rivit. Rajapinnalle annettaisiin vain taulun nimi (entiteetti), ja mahdollisesti jotain yksinkertaisia järjestys- tai maksimirivimääräehtoja.

Rajapinta voisi toimia esimerkiksi näin:

// Wish for simpler NSFetchRequest
NSFetchRequest *req = [NSFetchRequest requestEntities:@"Article"
                       sortBy:@"pubDate" ascend:NO
                       limit:10 offset:0 context:managedObjectContext];

// Wish for simpler "delete all" API
[managedObjectContext deleteAllEntities:@"Article"];

23andMe-geenikartoitus

in Non-technology

Tilasin pari kuukautta sitten erikoistarjouksesta 23andMe.comin geenikartoituksen. Silloin hinta oli $99 + sylkinäytteen kuljetus, yhteensä $170 luokkaa. Normaali listahinta samalle täydelle kartoitukselle on $499. Kartoitus valmistui nyt.

23andMe on varsin modernisti rakennettu web-palvelu. Pelkän geenikartan lisäksi se sisältää sosiaalisia toimintoja, joiden avulla löysin jo esimerkiksi kolme viidettä pikkuserkkua jostain päin USA:ta. Lisäksi käyttäjille esitetään koko ajan erilaisia pikkukyselyitä tupakoinnista, syömisestä, värisokeudesta ja sen tyyppisistä asioista. Geenikarttoihin yhdistettynä näistä syntyy mielenkiintoisia tilastollisia tuloksia.

Palvelun varsinainen ydin on geeneihin perustuva terveyskartoitus. Se koostuu erilaisten sairauksien riskeistä, carrier-statuksesta (omille lapsille mahdollisesti periytyvät sairaudet), erilaisten lääkeaineiden ja hoitojen tehoavuudesta, sekä yleisluontoisemmista geneettisistä ominaisuuksista, kuten laktoosi-intoleranssista, silmien väristä ja niin edelleen.

Sairauksista kerrotaan sekä kohonneet, tavalliset että tavallista matalammat riskit. Yhteensä erilaisia kartoitettuja sairauksia on vajaa sata. Ilokseni omalla kohdallani niiden vakavimpien sairauksien kohonneita riskejä ei näyttäisi juurikaan olevan. Jos olisi ollut, niin tietäisipähän sitten minkä sairauksien tutkimukseen kannattaisi lahjoittaa rahaa.

23andMe säilyttää käyttäjän geenikartan. Riskianalyysit päivittyvät sitä mukaa, kun uutta tietoa tulee saataville. Tietoa syntyy sekä "oikean" geenitutkimuksen kautta että käyttäjäkyselyillä. Kyselyt eivät ehkä ole ihan niin luotettavia kuin oikeat tutkimukset, mutta toisaalta käyttäjämassaa on paljon enemmän. Kysymysten asettelu on usein muodossa "onko sinulla diagnosoitu tautia X", eli niillä pyritään seulomaan esiin oikeaa, lääkärin diagnosoimaa tietoa.

Oman geenikartan voi myös imuroida itselleen 15-megaisena tekstitiedostona. Ei siitä paljon selvää saa, mutta onhan se hauska omistaa. Itse ajattelin kyllä olla aika varovainen sen tallentamisessa ja säilyttää sitä vain salatussa muodossa.

ITNytin huuhaa-tietoturvauutisointia

in Technology

Kun ITNyt uutisoi S-ryhmän WLAN-kirjautumisongelmasta, olin innoissani. Vihdoinkin suomalainen IT-uutispalvelu, joka harrastaa oikeaa tutkivaa journalismia!

Myöhemmin lisätty uutinen Welhon ja Maxinetin ongelmista kuitenkin paljastaa, että kyse onkin vain brändeillä ratsastavasta julkisuustempusta, joka liioittelee ja vääristelee uhkaa. Welhon hotspotien WLAN-kirjautumiset on nimittäin SSL-suojattu. Olen itse ollut aikoinaan mukana suunnittelemassa niitä. Welhoon kirjautuminen on ihan yhtä turvallista kuin vaikkapa Googleen tai Facebookiin.

ITNytin uutisoinnin taustalla onkin se vanha ja tunnettu tietoturvaongelma, että avoimen WLAN-tukiaseman rinnalle voi pystyttää valetukiaseman samalla SSID:llä ja huijata käyttäjän kytkeytymään siihen. Tässä ei ole mitään S-ryhmälle, Welholle tai Maxinetille spesifistä, vaan sama periaate toimii minkä tahansa avoimen tukiseman ollessa kyseessä.

"Vaarassa" ovat siis yhtä lailla Spark-, Wippies- ja Homerun-tunnukset kuten kaikki muutkin hotspot-operaattorit ympäri maailman. Ainoa keino suojautua näiltä radiotason hyökkäyksiltä tarkistaa sisäänkirjautuessaan, että SSL-yhteys on varmennettu oikella varmenteella.

Tablettien yleistyessä ja lisätessä langattomien verkkojen kysyntää on sinänsä ihan hyvä nostaa tietoisuuteen tämä WLANin vanha ongelma. Mutta sitä on syytä käsitellä oikeasta näkökulmasta.

Varsinainen ongelma on IEEE 802.11a/b/g/n-standardissa, joissa ei ole mitään keinoa luoda salattua yhteyttä vaatimatta käyttäjää tietämään etukäteen salausavainta. Tämän vuoksi maailman jokainen avoin hotspot-verkko on radiotasolla salaamaton, ja käyttäjien on niitä käyttäessään luotettava SSL/SSH-salaukseen tai VPN-yhdyskäytäviin.