domenica 6 luglio 2014

Orologi, Mele e cause, ovvero l'orologio Hilfker del 1944

Ricorderete tutti che Apple accettò di pagare venti milioni di franchi svizzeri per poter usare il look (ma non il comportamento) dell'orologio progettato da Hans Hilfker per le ferrovie federali svizzere (e adottato con qualche modifica anche dalle DB).
Per chi non si ricorda come è fatto l'orologio, ecco una foto presa sempre da Wikipedia:
Il design di questo orologio è sicuramente degno dei musei che lo ospitano a Londra e New York.
Ma cosa veramente particolare di questo orologio è la non-lancetta-dei-secondi. È una lancetta solamente e richiama la forma della paletta del capostazione. Non fa un giro completo in 60 secondi, ma in 58.5 secondi, rimanendo ferma sulle 12 per un secondo e mezzo in attesa del segnale di sincronismo dal master di stazione. Grazie a YouTube potete vedere questo effetto particolare qui senza dovervi recare in Svizzera:

Se il funzionamento di questo orologio vi pare assurdo, guardate per cominciare questi orologi di una stazione italiana (la fonte è sempre Wikipedia):
Qui non c'è nemmeno la lancetta dei secondi: dato che gli orari dei treni sono basati sul minuto intero, non su frazioni di minuto, una vera lancetta dei secondi non serve. Quella dell'orologio di Hilfker serve praticamene a prepararsi all'arrivo del minuto successivo e non a contare i secondi

Ovvio che questo orologio bello e particolare abbia interessato i più geek tra gli appassionati di computer. In fondo il termine hacker arriva dal gruppo ferromodellistico del MIT di Boston, tra i quali i patiti di computer non mancano, e originariamente non era collegato a furti e vandalismi informatici. E questo articolo è proprio nasce proprio dalla passione di molti geek per questo orologio dalle linee bellissime ed il comportamento strano.

Passione che dal 1989 ha portato all'esistenza un programma chiamato "swisswatch" (per Unix e GNU/Linux) il cui aspetto è più o meno questo: 

(lo sfondo sarebbe bianco pieno senza che si veda qualcosa in trasparenza)
Le lancette sono un'po scalettate, ma salvo questo particolare il look è riprodotto fedelmente la lancetta dei secondi fa un giro in 58.5 secondi. A tutt'oggi non mi pare che il MIT, titolare del copyleft, sia mai stato citato in causa per questo programma.

Quando svilupparono per GNU/Linux una libreria chiamata Cairo per permettere di tracciare linee con una qualità superiore grazie a effetti di antialiasing (in termini semplici: non fa le linee oblique scalettate), un ragazzo tedesco scrisse un programma per un orologio usando questa libreria e diede ad ogni utente la possibilità disegnarsi come più preferiva le varie componenti del tema grafico. Ovvio che qualcuno ha pensato pensato a disegnare un tema che imitano l'aspetto dell'orologio Hilfker:
Il tema viene distribuito qui insieme ad altri temi per questo ed altri programmi per GNU/Linux.
Il programma nasce con un "movimento" che imita quello degli orologi al quarzo, con la lancetta che si muove a scatti da una tacca alla successiva e non con movimento continuo. E fa il giro in 60 secondi e non 58.5. Se tutto ciò non vi soddisfa e avete una computer recente, vi basta una semplice modifica al codice del programma per avere un comportamento simile a quello degli orologi delle stazioni svizzere. Questo non garantirà che il regionale per tornare a casa abbia una puntualità elvetica, ma sul desktop può fare piacere. Ma fate attenzione che questa modifica "appesantisce" il programma. Ad esempio questa modifica è troppo pesante per i vecchi iMac lamp.

Dettagli tecnici per chi li vuole

Ecco il pezzetto di codice modificato per avere la lancetta che si muove come nell'orologio delle ferrovie Svizzere (o tedesche, anche le DB usano lo stesso orologio):
    /* take care of the clock-hands anim-vars */
/*  if (fFullSecond < 1.0f) */
/*      iFrames++; */
/*  else */
/*  {*/
        iFrames = 0;
        fLastFullSecond = fCurrentTimeStamp;

        if(g_iSeconds < 58)
            fAngleSecond = (double) g_iSeconds * 6.2f;
        else {
            fAngleSecond = 0.0;
            bAnimateMinute = g_iSeconds == 59;
        }
/*      if(fAngleSecondX < 230.0) */
/*          fAngleSecond =  */
/*      if (fAngleSecond == 360.0f) */
/*          fAngleSecond = 0.0f; */

(file cairo-clock.c, righe dalla 601 alla 618)
Purtroppo questa piattaforma non mi permette di pubblicare qui l'insieme dei sorgenti modificati o una patch. Ma il programma originale è distribuito sotto GNU GPL, quindi potete richiedermelo direttamente.