Mac OS X ja "next window" -näppäin

in Technology, Apple

Monille uusille Mac-käyttäjille tuntuu oudolta, että Cmd-Tab toimii eri logiikalla kuin Windowsin Alt-Tab. Windowsissa Alt-Tab ei tee eroa eri sovellusten kesken vaan vaihtaa kaikkien ikkunoiden välillä. Macissa taas Cmd-Tab vaihtaa sovellusten välillä, mutta kullakin sovelluksella voi olla auki useita ikkunoita.

Oletuksena sovelluksen sisäinen ikkunan vaihto tapahtuu näppäinyhdistelmällä Cmd-`, joka on suomalaisessa näppäimistössä aika hankala. `-merkki on siis "käänteinen heittomerkki", jonka saa näppäinyhdistelmällä Shift-´.

Tämä näppäinyhdistelmä kannattaa vaihtaa. Avaa ensin System Preferences, valitse sieltä Keyboard ja sen alta Keyboard Shortcuts -välilehti. Klikkaa vasemmanpuoleisesta listasta Keyboard & Text Input ja etsi sitten oikeanpuoleisesta listasta "Move focus to next window in application".

Nyt voit tuplaklikata kyseisessä kohdassa olevaa ⌘` -symbolia, ja painaa sitten haluamasi näppäinyhdistelmän sen tilalle. Itse käytän yhdistelmää Cmd-§, eli Command sekä Tabin yläpuolella oleva näppäin.

Muutos tulee heti voimaan ja nyt voit painella Cmd-§ vaihdellaksesi nopeasti ikkunoita esimerkiksi webbiselaimessa, Terminalissa, Wordissa ja niin edelleen.

iPhone 4 ja videopuhelut

in Technology, Apple

iPhone 4 julkaistiin odotetusti ja Apple näyttää ajavan FaceTimeä eli videopuheluita sen pääasiallisena myyntiargumenttina. Jännä nähdä, onnistuuko Steve Jobs tekemään niistä yhtä mainstreamia kuin kännykkäsurffailusta. Nokiahan ei ole onnistunut kummassakaan, vaikka aikaa on ollut.

Gizmodon mukaan FaceTime perustuu cocktailille avoimia standardeja:

[FaceTime is] Based on many open standards, h.264, AAC, SIP, STUN, TURN, ICE, RTP, SRTP, Apple going to standards body tomorrow to make FaceTime an open industry standard.

Vaikuttaa siis hyvin samanlaiselta, kuin perinteiset SIP-pohjaiset VoIP-puhelut. Ei kovin nättiä, mutta toisaalta aika vakioitua. Tämä tarkoittaa myös, että kolmansien osapuolten on mahdollista toteuttaa videopalveluita suoraan nettiin. Perinteisissä Nokian käyttämissä WCDMA-videopuheluissahan näin ei ole ollut, vaan koko puhelinverkko on ollut täysin irrallisena Internetistä. Ehkä se on sen juuri takia jäänyt niin vähäiselle käytölle.

On mielenkiintoista myös nähdä, millaisia videopuheluita ja etukameraa hyödyntäviä iPhone-sovelluksia tulee App Storeen. Ensimmäiseksi voisi veikata jonkinlaista Chatroulette-kloonia.

Blog upgraded to Django 1.2.1

in Technology, Django

My personal blog site has been upgraded to Django 1.2.1. For me, upgrading was a simple matter of running:

sudo easy_install http://media.djangoproject.com/releases/1.2/Django-1.2.1.tar.gz

Everything else seems to work fine after that, except that I had to change an import statement for email_re:

-from django.forms.fields import email_re
+from django.core.validators import email_re

The regular expression is used for validating comment sender email addresess.

Update:

Also had to add CSRF support according to these instructions to make my custom comment form work.

How To Enable Chrome Web Store Applications on Mac OS X

in Technology

The new Chrome Web Store will be based on web applications. Applications can already be installed now by using a developer build of Chrome and starting it with the --enable-apps option.

On Windows the --enable-apps option can be added to the start menu shortcut of Chrome. On Mac OS X, you need to create a small shell script inside the Chrome bundle:

  • Open Terminal and go to /Applications/Google Chrome.app/Contents/MacOS
  • Rename "Google Chrome" (the binary) to "Google Chrome.bin"
  • Create a new text file called "Google Chrome" with the following contents:

#!/bin/sh
exec "$0.bin" --enable-apps $@

  • Make it executable with chmod 755 "Google Chrome"

Note that the same principle can be used to add command line options to any Mac OS X application. You may have to do this again after Chrome has been updated.

Now you can play with it and install the Hacker News application or my own kfalck.net application. They basically just add web shortcuts to Chrome's application menu. You can view the menu by pressing Command-T (or Ctrl-T on Windows/Linux).

Googlen WebM on webin uusi videostandardi

in Technology

No niin, nyt alkoi tapahtua Google I/O:ssa (live stream):

  • VP8 -videokoodekki julkaistiin odotetusti kuten itsekin aiemmin bloggailin.
  • Sitä ovat tukemassa ainakin Google Chrome, Mozilla Firefox ja Opera.
  • Uuden web-videostandardin nimi on WebM ja se muodostuu VP8-videosta, Vorbis -audiosta sekä yksinkertaistetusta Matroska-formaatista.
  • YouTube konvertoi kaikki videonsa (myös) WebM-muotoon.

WebM-projektin saitilta löytyy jo työkaluja ffmpeg-patchien ja DirectShow-filtterien muodossa. Saatavilla on myös VP8 SDK sekä joukko kaupallisia työkaluja.

Lisensoinnin suhteen WebM on täysin rojalttivapaa ja itse koodi on julkaistu modifioidulla Apache/BSD-lisenssillä, jossa on suojapykälä kolmansien osapuolten patenttilitigaatiota vastaan. Tämän lisäksi Google myöntää vapaan ja ilmaisen käyttöoikeuden kaikkiin Googlen patentteihin, jotka koskevat WebM:ää.

Hyvältä näyttää. Eiköhän tästä tule HTML5:n videostandardi. Tuskin Microsoftilla ja Applella on enää paljoa millä taistella vastaan.

Miksi Git on parempi kuin Mercurial

in Technology

Tässä artikkelissa oli sen verran isoja pointteja, että päätin nostaa sen esiin: Why I Switched to Git From Mercurial.

Nähtävästi siis Mercurial-versionhallintaohjelmisto:

  • Ei hallitse datamäärältään isoja repositoryja optimaalisesti.
  • Menee jopa rikki, jos repositoryyn laittaa liikaa dataa.
  • Sisältää komentoja, joilla voi tuhota dataa lopullisesti repositorysta turhan helposti.

Olen itse käyttänyt Gittiä aika huoleti isojen datamäärien varastoimiseen (esim. kuvien ja dokumenttien). Tällä perusteella tuntuu siltä, että valinta on ollut hyvä, sillä Gitillä ei ole niiden kanssa mitään ongelmia. Tarvittaessa olen pystynyt myös poistamaan Gitin historiasta isoja datatiedostoja, jos repositoryn koko on paisunut niiden vuoksi turhan isoksi.

Gitin käyttöliittymästä olen samaa mieltä kuin artikkelin kirjoittaja. Siinä olisi hiomista monessa paikassa siten, että käyttäjä ei joutuisi heti googlailemaan apua esimerkiksi merge-konflikteja selvitellessä. Gitin sisäinen tietorakenne ja arkkitehtuuri taas on selvästi suunniteltu aivan loistavasti.

iPad-ohjelmointivinkkejä

in Technology, Apple

Olen käyttänyt tänä keväänä paljon aikaa iPhone- ja iPad-ohjelmointiin. Tästä syystä en ole bloggaillut kovin paljon web-asioista, vaikka niitäkin yhä kehittelen.

iPad-ohjelmointi on sikäli haastavaa, että isolla ruudulla esitettävät käyttöliittymät ja sisällöt vaativat paljon muistia. iPadissa on DRAM-muistia vain 256MB eli saman verran kuin iPhone 3GS:ssä. Näytön resoluutio ja kuvien koot ovat iPhoneen nähden nelinkertaisia, joten muistin kanssa pitää olla tarkkana.

Eniten muistia vievät sellaiset käyttöliittymät, joissa näyttöä "flippaillaan" sormella oikealle ja vasemmalle. Muistissa täytyy pitää vähintään kolme näytöllistä tavaraa, jotta skrollaus toimii ripeästi kumpaan suuntaan tahansa. Aiempia näkymiä täytyy sitten jatkuvasti vapauttaa muistista sitä mukaa, kun niitä ei enää tarvita.

Muistinhallinnassa on muutama kohta, jotka menevät helposti pieleen. Käyn ne tässä läpi.

UIViewController: viewDidUnload

Käyttöjärjestelmä lähettää toisinaan UIViewController-objekteille viewDidUnload-viestin muistin käydessä vähiin. Tässä tilanteessa .xib-tiedostosta ladattu näkymä (UIView) ollaan vapauttamassa. UIViewControllerin velvollisuus on vapauttaa kaikki viittaukset kyseisen näkymän elementteihin, kuten tekstikenttiin ja nappeihin, jotta ne poistuvat muistista. Tyypillinen toteutus voi näyttää tältä:

- (void)viewDidUnload {
    [super viewDidUnload];
    self.textLabel = nil;
    self.pushButton = nil;
}

Propertyjen vapautus deallocissa

Propertyt ovat Objective-C 2.0:n kätevä ominaisuus. Niiden avulla ei tarvitse kirjoitella erikseen getter- ja setter-metodeja. Riittää, että luokkaan määritellään @property- ja @synthesize-direktiivit näin:

@interface OmaLuokka : NSObject {
    NSString *teksti;
}
@property (nonatomic, retain) NSString *teksti;
@end

//...

@implementation OmaLuokka
@synthesize teksti;
@end

Jujuna tässä on kuitenkin se, että Objective-C ei vapauta propertyjä automaattisesti. Jokainen property pitää erikseen vapauttaa dealloc-viestin yhteydessä, tai muuten muisti vuotaa:

- (void)dealloc {
    [teksti release];
    [super dealloc];
}

Vuotamisen voi todeta ajamalla iPhone/iPad-sovelluksensa läpi Xcoden Leaks Performance Toolilla. Se näyttää suorituksen lopuksi ne objektit, jota ei vapautettu kunnolla.

SQLite ja binääridata

Eräs iPhonen ja iPadin kätevimpiä ominaisuuksia on Core Dataan sisäänrakennettu SQLite-tuki. Sovellus voi varastoida kaiken datansa paikalliseen SQL-tietokantaan. Melko usein tulee sitten eteen tilanne, että tietokannasta ladataan muistiin esimerkiksi 100 riviä UITableView-listausta varten.

Ongelmia aiheuttavat tässä sellaiset tietokantataulut, joihin on tallennettu suuria binääriobjekteja, kuten JPEG- ja PNG-kuvia. Jos tietokannasta ladataan muistiin 100 riviä, joissa jokaisessa on mukana 500 kilotavun kuva, muistia kuluu hetkessä 50MB. Jos rivejä on 500, hakutulokset eivät enää mahdu muistiin ollenkaan.

Ratkaisu on tallentaa binääriobjektit erilliseen tauluun, jolla on one-to-one relationship alkuperäisen taulun riveihin. Tällöin Core Data lataa binääriobjektit faultingia käyttäen automaattisesti muistiin vasta sitten, kun niihin viitataan koodissa. Esimerkiksi silloin, kun käyttäjä klikkaa luettelonäkymästä yhtä riviä ja sovellus siirtyy detaljinäkymään.

Käytön jälkeen binääriobjektit voi poistaa muistista ja palauttaa faulteiksi refreshObjectilla tähän tapaan:

[managedObjectContext refreshObject:binaariObjekti mergeChanges:NO];

Tyypillisesti tämä tehtäisiin silloin, kun isoa binääriobjektia käyttänyt detaljinäkymä suljetaan ja palataan luettelonäkymään.