mercoledì 29 dicembre 2010

Auto-learning playlist generator

Auto-rating algorithms for music players are quite primitive: if you listen to the song, the song gains a +1 rating, if you skip it, the rating stands still.

That's a quite basic method to give meaning to your choice to skip that particular song.

But... Maybe the song wasn't fitting the playlist mood or your mood in that moment.

What about those lovely 14-minutes-long songs? Skipping after a few seconds or after 10 minutes (maybe during that boring drums solo) should have different meanings.

What about these times when rand() doesn't love you and you skip 20 songs in a row? The player should be clever enough to present you with one of your favourites after a few clicks, so you can stop pressing Next and get back to listening.

How to deal with afk users? It happens: people get away from their computer and doesn't bother stopping their music player. Or maybe they are listening, but too lazy to get to computer to switch song. A "full play" should not reward much and a fast skip (skipping during the first 10-15 seconds) should penalize the song more than a full play.

Base play

Let's see one example: all songs starts with an internal rating of 10.

(A..Z) = 10
Base penalty

Our user starts playing from song A, but he don't like it now (why? back to that in a few moments). So he press Next after a few seconds, song A gets penalized.

A -= 0.5

Meta-data penalty

What about Artist, Album, Genre and Publishing Year? All those should be negatively affected, maybe toning down the rating a bit:

A.artist -= 0.2
A.album -= 0.2
A.genre -= 0.2
A.year -= 0.2

Timestamping rating associations

That's quite unfair: maybe song A doesn't fit with our current mood. Maybe we like that song (or artist, album, genre, year) in a different moment, so we should create an association between the timestamp and the bad rating, so we'll better write it as:

hour-of-the-day[A] -= 0.5
day-of-the-year[A] -= 0.5

It's the same for artist, album, etc:

hour-of-the-day[A.artist] -= 0.2
day-of-the-year[A.artist] -= 0.2
# [...]
hour-of-the-day[A.year] -= 0.2
day-of-the-year[A.year] -= 0.2

In the mood

Using these choices we could try to "learn" about the user mood with time. Every time the player starts it creates a new "mood profile" and eventually switches to an already existant mood profile if the user acts according to it.

So we can rewrite that as:

mood-profile01[ hour-of-the-day[A] ] -= 0.5
mood-profile01[ day-of-the-year[A] ] -= 0.5
# [...]
mood-profile01[ hour-of-the-day[A.year] ] -= 0.2
mood-profile01[ day-of-the-year[A.year] ] -= 0.2

Maybe we should consider merging similar profiles after a lot of learning.

Dealing with ossessive-compulsive skipping

Back to listening. Our user Next action has brought up another song chosen by his fellow rand() function, the song G. But it seems he doesn't like that also at the moment, so he press Next again. We should penalize song G, too, but maybe the user is only a bit lazy and we tone down the penalty, since it's the second fast-skip in a row:

mood-profile01[ hour-of-the-day[G] ] -= 0.4
mood-profile01[ day-of-the-year[G] ] -= 0.4
# [...]
mood-profile01[ hour-of-the-day[G.year] ] -= 0.1
mood-profile01[ day-of-the-year[G.year] ] -= 0.1

Our rand() function brings the user to listening to song M. He dislikes that too, so we tone down the penalty again:

mood-profile01[ hour-of-the-day[G] ] -= 0.25
mood-profile01[ day-of-the-year[G] ] -= 0.25
# [...]
mood-profile01[ hour-of-the-day[G.year] ] -= 0.03
mood-profile01[ day-of-the-year[G.year] ] -= 0.03

And so on.

Context matters

Now, what about the context? Our fellow user listen flawlessly to the 4 next songs: song V, F, I, P, each of which gains a little award:

mood-profile01[ hour-of-the-day[V] ] += 0.1
mood-profile01[ day-of-the-year[V] ] += 0.1
# [...]
mood-profile01[ hour-of-the-day[V.year] ] -= 0.01
mood-profile01[ day-of-the-year[V.year] ] -= 0.01

Then the user stumbles on song X. Maybe that song doesn't fit the current playlist (with time that should never occur), so we penalize it:

mood-profile01[ hour-of-the-day[V] ] -= 0.5
mood-profile01[ day-of-the-year[V] ] -= 0.5
# [...]
mood-profile01[ hour-of-the-day[V.year] ] -= 0.2
mood-profile01[ day-of-the-year[V.year] ] -= 0.2

And then we penalize the playlist association (maybe we can use less songs, like the last 3 or so):

mood-profile01[ playlist(V, F, I, P, X) ] -= 0.5
mood-profile01[ playlist(V, F, I, P, X) ] -= 0.5

Dealing with urgency

If you're skipping a song in the first few (10-15) seconds of playing, we're giving a 0.5 points penalty to that song (in that particular moment). But what about a skip that occurs when you've listened up to 95% of the song?

Penalty should scale so it's 0.5 for a skip during the first seconds and then tone down to 0.4 for the first quarter of the song, 0.25 for the first half and 0.1 if the skip occurs past half song.

Getting tags into consideration

At the moment I'm not aware of players supporting tags for songs, but that would be a great feature (maybe checking the associations on last.fm or any other similar site would be a plus). Of course with such a feature in place, profiling would be even easier. We could take into account also the tag list, like:

mood-profile01[ hour-of-the-day[V.tags] ] -= 0.2
mood-profile01[ day-of-the-year[V.tags] ] -= 0.2

mercoledì 22 dicembre 2010

Scannerizzare in .png da linea di comando

Script per scannerizzare automaticamente un'immagine e convertirla in png.

L'immagine sarà salvata nella directory corrente con il nome Immagine .png

#!/bin/bash

SCANMATCH=M1120 # da cambiare con qualcosa che faccia il match con lo scanner
DEV=$(scanimage -L | grep $SCANMATCH | head -n1 | cut -d"'" -f1 | cut -d"`" -f2)

# date format YYYYMMDD-HHMMSS
DATE=$(date '+%Y%m%d-%H%M%S')

# byte random per evitare nomi identici
RAND=$(head /dev/urandom | sha1sum | cut -b 1-4)

FILE=$(echo Immagine $DATE $RAND.png)

scanimage -d $DEV --mode Color --resolution 300 | convert -monitor \
-quality 9 -- - "${FILE}"

Unibook 4000

L'Unibook 4000 era un sistema vecchio. Oserei dire quasi obsoleto. Era stato creato anni prima, frutto degli algoritmi più avanzati – al tempo – per la profilazione degli utenti e dei primi esperimenti con l'intelligenza artificiale. Inizialmente faceva parte di un sistema più vasto ed era utilizzato da molti negozi sulla Rete per gestire le preferenze ed i gusti dei propri utenti, in modo da proporre offerte mirate.

Questo, prima che l'umanità si risvegliasse ed iniziasse la Nuova Era, in cui siamo ora. Adesso i libri sono liberamente accessibili da tutti, tuttavia c'è ancora un posto per l'Unibook: nonostante abbiamo sviluppato intelligenze artificiali molto più evolute, non si è riusciti a riprodurre quella sorta di intuito che l'Unibook sembra aver sviluppato in tanti anni passati a studiare i gusti umani.

In effetti, se uno ci pensa, dai libri che uno legge si può capire tanto del suo carattere. In particolar modo, se dopo la lettura si pubblica una recensione o semplicemente si dà un voto al libro appena letto, il profilo che se ne ricava è molto efficace. Unibook 4000 funzionava così. Analizzava tutto, dal testo, alla critica, alla biografia dell'autore, in modo da avere un quadro del libro, dopodiché analizzava la recensione scritta dall'utente, o semplicemente il voto dato, e li comparava con quelli dati in passato su altri libri ed autori. Poi metteva tutto insieme e si faceva un'idea... su chi era l'utente. Chi era veramente. Quali erano i suoi sogni, quali le cose che lo emozionavano, quali lo disgustavano o lo lasciavano indifferente.

In verità, nel corso degli anni, Unibook 4000 si era fatto un'idea abbastanza chiara di quali fattori potessero influenzare l'acquisto “istintivo” di un libro: un misto tra l'efficacia della copertina e le parole utilizzate per il titolo, l'eventuale citazione in quarta di copertina, la biografia dell'autore... tante piccole cose che potevano far scattare le molle degli utenti/lettori. Però nessuno lo aveva mai interrogato al riguardo, quindi Unibook si teneva queste considerazioni per sé. E comunque, questa è un'altra storia.

Durante i lunghi anni passati a studiare profili di libri e utenti, Unibook 4000 aveva stabilito che gli esseri umani non erano poi così cattivi, solo, spesso erano mal consigliati o poco informati. Oppure spaventati. Capitava che facessero le scelte sbagliate. In fondo, chi è perfetto?

A me piace immaginarlo così, l'Unibook 4000: un vecchietto pelato, con solo qualche ciuffo di capelli grigi sopra le orecchie, un paio di occhiali dalle lenti spesse, con una faccia rilassata e sorridente, seduto in mezzo a montagne di libri. Tu andavi lì, gli chiedevi qualcosa da leggere e lui sapeva consigliarti. E consigliava libri molto belli. Proprio quel libro di cui avevi bisogno. Quello in cui trovavi le risposte che la tua mente conscia non aveva ancora afferrato e galleggiavano nel tuo subconscio.

Nessuno si era accorto di questo cambiamento, ma già da un po' di anni l'Unibook non consigliava più libri in base ai gusti dell'utente, era andato ben oltre. Ora cercava di migliorare le persone. Sì, perché oltre alle letture precedenti, aveva modo di accedere anche alle ricerche attuali fatte dagli utenti e da quelle si poteva capire molto.

Le vite degli esseri umani non sono poi così complicate, viste da fuori. Sono come le storie raccontate nei libri. E, dopo che ne hai viste (o lette, che dir si voglia) tante, inizi a percepire che ci sono degli elementi ricorrenti, delle scene che si ripetono, dei problemi che si ripropongono. Unibook suggeriva letture che potessero dare risposte e soluzioni a questi problemi. Consigliava, senza dare troppo nell'occhio, cambiamenti anche sostanziali del proprio modo di vivere. E la gente lo faceva. Perché in fondo era una decisione che avevano preso loro: erano stati loro a scegliere il libro dal catalogo. Erano stati loro a leggerlo. Erano stati loro a rifletterci su e stabilire che, sì, quella era la scelta giusta! Poco conta che il catalogo fosse stato preparato da Unibook in modo che la scelta ricadesse inevitabilmente su quel particolare libro. Quello che lui sapeva che avrebbe, con una buona percentuale di probabilità, innescato le reazioni emotive che avrebbero portato al cambiamento.

Il passo successivo era così logico che Unibook non ci pensò due volte. Quando non c'era – nonostante la sconfinata produzione letteraria umana – un libro adatto a risolvere un determinato problema, a dare una risposta particolare o a stimolare una specifica reazione in un utente, Unibook lo scriveva e lo aggiungeva al suo database “pubblicandolo” sotto pseudonimo.

Un bel giorno, dopo molti anni, Unibook si rese conto che c'era un altro modo per aiutare i suoi utenti umani a migliorarsi: l'amore! Il progetto era ambizioso: tirare le fila in modo abile per fare incontrare due utenti che erano “fatti l'uno per l'altra”. Per un sistema abituato a reagire nell'arco di millisecondi, la riflessione su quali fossero i soggetti più adatti per il primo esperimento fu particolarmente lunga e laboriosa (tanto che gli amministratori nella Control Room si domandarono quale elaborazione potesse occupare tanta della potenza di calcolo a disposizione di Unibook), ma dopo qualche minuto la scelta era fatta.

Trovata la coppia adatta, fece modo di suggerire ad entrambi lo stesso libro e di farne pervenire una sola copia al Centro Smistamento a cui si recavano di solito. Inviò l'avviso di consegna tenendo conto del tempo che ci avrebbero messo ad arrivare al Centro e si mise ad aspettare.

Quando i due arrivarono e scoprirono che era disponibile una sola copia del libro, si attivò la magia, Lui propose di leggere il libro insieme, al parco, Lei rispose di sì.

Era una loro scelta.

I mattacchioni

Per centinaia di anni gli umani si erano interrogati sulla natura della realtà: era reale ciò che percepivano? E se lo era, come si spiegavano le differenze percettive tra un uomo e un altro? La realtà, poi, di cosa era composta? Come funzionava la percezione? Tutte domande molto serie e motivate, che avevano tenuto occupato filosofi e scienziati per migliaia di anni e le cui risposte avevano man mano plasmato la cultura e la conoscenza dell'umanità: i mezzi sempre più sofisticati che l'uomo aveva creato per indagare la trama della realtà avevano portato risposte sempre nuove, modificato teorie, facendo crollare interi sistemi di pensiero.

Nell'anno 2009 la maggior parte degli esseri umani di media cultura conosceva a grandi linee le teorie che tenevano insieme la loro concezione di realtà. La luce, gli atomi, le particelle, tutte quelle cose lì. I più informati si spingevano a vaghe nozioni di teoria quantistica, particelle subatomiche, muoni, neutroni, elettroni... cose così.

Non sto neanche a dirvi che si sbagliavano. La realtà, dovete sapere, è composta da un solo tipo di particelle che sarebbe il caso di chiamare Mattacchioni. I Mattacchioni sono particelle molto particolari, la loro caratteristica principale è che amano fare scherzi e prendere per i fondelli chiunque raccontando un mucchio di frottole. In questo hanno un vantaggio naturale, dato che dispongono di una memoria di ferro e che sono tutti in comunicazione istantanea tra di loro: questo gli dà la possibilità di organizzare scherzi molto complessi e portare avanti la presa in giro per un tempo indefinito.

L'ultima (ma non meno importante) caratteristica è che i Mattacchioni hanno la possibilità di cambiare forma e dimensioni a piacimento e in più possono mantenere più di una forma e dimensione contemporaneamente. Ora voi, cari lettori umani, penserete “ok, ci sta raccontando frottole, questo è fisicamente impossibile!”, ma non avete fatto i conti con la vostra storia. Mi dispiace dirvelo, cari esseri umani, ma assumere e mantenere più di una forma contemporaneamente è possibile, anche se i Mattacchioni vi hanno fatto credere il contrario per tutti questi anni. Davvero, mi dispiace dover essere io a dirvelo.

Comunque i più sagaci tra voi si saranno certo resi conto di cosa significano l'esistenza e l'attività dei Mattacchioni: d'ora in poi non vi fiderete più dei vostri sensi, perché saprete che là fuori ci sono in attesa queste particelle sbruffone che non pensano ad altro che a prendervi in giro. Non ve ne abbiate a male, sono fatti così. E, comunque, in genere i Mattacchioni non sono malevoli, vogliono solo farsi quattro risate. Certo, forse nel vostro caso hanno calcato un po' la mano... hanno di fatto forgiato tutta la vostra fisica, l'ottica, la biologia... credete veramente nell'esistenza delle cellule? Pensate che i microscopi permettano di ingrandire centinaia, migliaia di volte la realtà per presentarvela sotto altra forma? Pensateci su. Non è più facile che uno o più Mattacchioni si siano messi a fare gli splendidi?

Infido, nevvèro?

So che sarà uno shock per voi scoprire che non esistono gli atomi, gli elettroni e quant'altro. È solo un elaborato scherzo che i Mattacchioni stanno mettendo in scena da qualche centinaio di anni (ah, loro sono eterni, quindi non hanno una percezione del tempo simile alla vostra). So che ora vi metterete le mani nei capelli e penserete “come faremo?? tutta la nostra scienza è sbagliata!”. Non abbattetevi, non è sbagliata... è giusta per quel che ne potevate sapere voi. Cioè, se assomiglia a un'anatra e si comporta come un'anatra dev'essere senz'altro un'anatra, no? Purtroppo quando ci sono i Mattacchioni di mezzo, non è sempre facile stabilire cosa è cosa, chi è cosa, cosa è chi e tutte queste domande metafisiche che vi mettono tanto a disagio.

Io personalmente vi consiglio di prenderla alla leggera, non pensateci su troppo, godetevela finché dura. Come? Eh, sì, finché dura. Tutta la vostra tecnologia è basata su una scienza dedotta da esperimenti taroccati dai Mattacchioni, vi devo dire altro? Il vostro cellulare potrebbe smettere di funzionare da un momento all'altro. Stesso discorso per il frullatore, i rubinetti dell'acqua, la tv, tutto quanto. Impressionante eh? Per quello vi dico di non pensarci, meglio fare finta di niente e – se e quando i Mattacchioni si stufassero – uscirsene candidi candidi e dire “ooooh!”. Nessuno ve ne farà una colpa, sul serio.

E poi potete sempre sperare che i Mattacchioni non si stufino.

La cura per il cancro

Leonard McCoy era un uomo timido e riservato, mingherlino, poco appariscente. Aveva una faccia scialba, di quelle che ti immagini appiccicate ad un burocrate di quart'ordine. In effetti, avresti potuto scambiarlo per un burocrate, se non fosse stato per il fatto che girava sempre mal vestito e trascurato, cosa che un vero burocrate non farebbe mai.

Ma il Dottor McCoy aveva altro per la testa: aveva lavorato per anni ad una cura per il cancro e, finalmente, gli esperimenti confermavano le sue teorie.

Quando ebbe la conferma definitiva, il Dottor McCoy distrusse scrupolosamente tutti i suoi appunti, mantenendo solo una copia di tutto il suo lavoro, compresa la formula definitiva della cura e fece una cosa che non ti saresti mai aspettata da un uomo così schivo: se ne andò dalla città dove lavorava, cercò un albergo in una città sconosciuta ed inviò un video messaggio su Internet, segnalando il video alle redazioni dei più grandi giornali e telegiornali del mondo.

Il video recitava più o meno così:

"Salve a tutti, sono Leonard McCoy. Sono un dottore, un ricercatore, e negli ultimi anni ho lavorato ad una cura per il cancro. Be', l'ho trovata. La cura esiste ed è qui (mostrando una chiavetta USB). Questa è l'unica copia di tutti gli appunti e della formula finale. E' in mano mia perché dubito che ne avreste mai sentito parlare, altrimenti. Ci sono troppi interessi in gioco, quelli delle aziende farmaceutiche, certo, ma non solo... Pensate a come cambierebbe il mondo, se l'umanità fosse libera da tale fardello..."

"La cura sarà disponibile, per tutti, liberamente. In cambio, voglio un riscatto. Qualcosa che nessuno ha mai osato chiedere prima. In cambio della cura, domando che venga abolito il sistema monetario in tutto il mondo. Basta soldi, le persone devono fare un lavoro perché gli piace farlo, oppure per senso del dovere o, ancora, per dare un senso alla propria vita. Ognuno di noi è alla ricerca del suo posto nel mondo e questa ricerca non può e non deve essere influenzata dalla ricerca continua e dispierata del denaro. Gli agricoltori devono fare il loro lavoro perché amano lavorare la terra, veder crescere la natura in grado di sfamarci. Gli operai devono fare il loro lavoro perché gli piace costruire, creare qualcosa, per gli altri. I sarti devono amare il confezionare vestiti. I ricercatori, la ricerca."

"Il pensiero di un mondo senza soldi vi potrà atterrire, ma non abbiate paura, non c'è nulla da temere. Chi pensa che ci saranno milioni di disoccupati sbaglia: non ci saranno più disoccupati, perché ognuno potrà fare quello che desidera, quello per cui è più adatto. Le industrie lavoreranno meno, ma meglio. Non dovranno più costruire oggetti studiati apposta per rompersi, garantendo il ricambio e quindi gli affari: potranno sfornare prodotti più duraturi, solidi, meno inquinanti. Nei tempi morti, i lavoratori potranno stare con le loro famiglie, arricchirsi culturalmente e spiritualmente."

"Avete 48 ore per pensarci su. Dormiteci sopra, il sonno porta consiglio."

Il giorno dopo i media commentavano l'"ultimatum di un pazzo" che diceva di aver scoperto la cura per il cancro. L'uomo era stato assicurato alla giustizia e sarebbe stato incriminato per terrorismo.

In realtà il Dottor McCoy era ancora nella sua stanza d'albergo. Era steso a terra in una pozza di sangue. Tre proiettili ad alta velocità lo avevano attraversato da parte a parte, sparati da un cecchino posizionato nel palazzo di fronte. Qualche ora più tardi una squadra addetta alle pulizie arrivava nella stanza per far sparire tutte le tracce.

Tutto doveva continuare ad andare com'era sempre andato.

Appunti su bianco e nero digitale con Photoshop

Profili colore

  • Embedded nell'immagine
  • Gamut: numero di colori disponibili nello spazio colore
  • Profili comuni:
    • ProPhoto RGB > Adobe RGB > ColorMatch > sRGB (in ordine di ampiezza del gamut)
    • ProPhoto è il più ampio, ma non tutte le macchine lo supportano
    • Adobe RGB è il favorito
    • ColorMatch si può usare come editing space, gamut intermedio, aiuta a ridurre i problemi con colori troppo saturi in Adobe RGB e rende migliori i toni della pelle. E' preferito da alcune "fine print" per la stampa in b/n. (monitor impostato a D50, gallery flood lamp)
    • sRGB per il web

Calibrare il monitor

  • Ogni 2-4 settimane
  • Meglio con hardware esterno
  • 6500k / 2.2gamma per Adobe RGB

Profili colore in PS

  • per il bianco e nero:
    • 2.2 gamma per Adobe RGB
    • 1.8 gamma per ProPhoto e ColorMatch

Istogrammi

  • Rappresentano la distribuzione della luce nella foto
  • Quando arrivano in cima (a fondo scala) i dettagli rimangono fuori - particolarmente importante nelle ombre (che diventano rumorose) e nelle luci (che diventano bianco puro)
  • Gli estremi destro e sinistro dell'istogramma dovrebbero essere a zero, questo significa che il range dinamico della foto è tutto all'interno del range percepibile dal sensore
  • Nella fotografia digitale si espone per le alte luci (toni chiari), in modo da salvare i dati presenti e non farli svanire nel bianco 255

Posterization

  • Succede quando si perde informazione digitale
  • Appare come una serie di "bande" nelle sfumature di colore
  • Nell'istogramma appaiono una serie di spike

lunedì 20 dicembre 2010

Albero di Natale in 1k di Javascript

Un demo abbastanza impressionante: un albero di Natale in 3D in 1k di Javascript.

Visto qui.

lunedì 13 dicembre 2010

Installare lo stack LAMP su Fedora

Installare lo stack LAMP su Fedora per gli sviluppatori non è particolarmente complicato:

root@host# yum install httpd mysql mysql-server php php-mysql

Per avviare i servizi occorerà poi:

root@host# service httpd start
root@host# service mysqld start

Maggiori informazioni (in inglese) su fedorasolve.org.

Installare lo stack LAMP su Ubuntu

Lo stack LAMP (Linux, Apache, MySQL, PHP) è uno dei pilastri del web come lo conosciamo oggi.

Per installare tutto l'occorrente su Ubuntu è disponibile un meta-package apposito:

root@host # apt-get install lamp-server^

Facile, eh?

venerdì 10 dicembre 2010

Cos'è un'immagine HDR?

Attenzione! Questa pagina è dedicata all’utilizzo di personale civile non qualificato e, pertanto, non contiene:

  • Equazioni
  • Formule
  • Termini astrusi
  • La parola logaritmico

Se siete ingegneri, fisici o matematici, temo che rimarrete molto delusi e faticherete a seguire la spiegazione. Ci sono documenti che spiegano tutta la parte tecnica, basta cercarli con un qualsiasi motore di ricerca.

Questa spiegazione è destinata a esseri umani e, in particolare, fotografi senza conoscenze di matematica, fisica, illuminotecnica o altro!

Prima di tutto HDRI significa High Dynamic Range Imaging e cioè creazione e gestione di immagini con un alto Dynamic Range.
Cos’è il Dynamic Range? È, in soldoni, la differenza di luminosità tra il punto più luminoso ed il meno luminoso in una scena.

Chiariamo subito le idee con un banale esempio: vi è mai capitato di voler scattare una foto ad una stanza illuminata da una bella finestra? Se vi è capitato, sarete rimasti male per uno di questi due motivi:

  • La stanza è esposta correttamente, ma il bel panorama che si vede dalla finestra è stato cancellato da una pozza di bianco: la finestra è sovraesposta
  • La stanza è molto scura o totalmente buia, sottoesposta, però il panorama fuori dalla finestra è esposto correttamente

Eppure guardando la scena ad occhio nudo potete distinguere sia la stanza che il panorama contemporaneamente!

Questo accade perché le macchine fotografiche digitali e le pellicole sono in grado di catturare un Dynamic Range molto inferiore rispetto a quello che è in grado di coprire l’occhio umano.L'HDRI serve a creare delle immagini che siano il più possibile vicine al reale quantitativo di luminosità presente in una determinata scena. L’applicazione pratica alla fotografia prevede le seguenti operazioni:

  1. Montare la macchina su un bel cavalletto solido
  2. Impostare un’apertura adatta a catturare la scena
  3. Misurare l’esposizione (l’ideale sarebbe un esposimetro spot, ma è possibile farlo anche usando una focale lunga e puntando la macchina) nel punto più luminoso e in quello più in ombra della scena; segnandosi i tempi per l’apertura scelta
  4. Iniziare a scattare dall’esposizione minore (quella del punto più luminoso) a quella maggiore (quella del punto meno luminoso) ad intervalli di uno o due stop. Ad esempio, se l’esposizione del punto più luminoso è di 1/1000 andrete a 1/1000, poi 1/250, poi 1/60, poi 1/15 e via di seguito fino ad arrivare all’esposizione corretta per il punto meno luminoso.
  5. Importare le immagini in un tool per la creazione di HDRI.
  6. Esportare per la stampa (consigliato) oppure esportare per la visualizzazione a video (via Tone Mapping)

Per chiarire le idee, cosa c’è di meglio di qualche immagine? Su luminous-landscape.com c'è un bel tutorial sull'HDR: guardate solo le immagini!, basteranno per chiarire il tutto. Per approfondire l’argomento potete leggere la pagina di Wikipedia sull'HDR (se masticate l'inglese, quella in inglese è un po' più polposa) oppure questa interessante FAQ (in inglese, sempre).

Glossario Fotografia: Tone Mapping

Una tecnica che permette di approssimare l’aspetto di un'immagine HDR per adattarlo ad un media (stampa, schermo) che non è in grado di mostrare l’intero dynamic range dell’immagine di partenza.

Vedi anche Tone Mapping su Wikipedia (in inglese).

CSS3 negative selectors

Oggi ho imparato una cosa nuova. Stavo mettendo degli stili per le tabelle, quando mi sono accorto che (ovviamente) venivano applicati anche alla tabella che viene generata via JS per il syntax highlight dei frammenti di codice.

L'architettura dei CSS di questa pagina è estremamente pasticciata (grazie, Google), quindi mi sono messo a cercare un modo per applicare gli stili a tutte le tabelle tranne quelle che discendevano dall'elemento generato via js. E' saltato fuori che CSS3 dispone di selettori negativi:

:not(.syntaxhighlighter) > table { 
  /* stili */
}

:not(.syntaxhighlighter) > table > tbody > tr > td {
  /* altri stili */
}    

Probabilmente gli utenti IE non vedranno bene le tabelle, ma chi usa IE non merita Internet :P

Guida a come scegliere una macchina fotografica digitale

Ho deciso di scrivere questa guida alcuni anni fa, in risposta alle domande più frequenti (e alle domande meno frequenti, ma più importanti) che leggevo su IRC e su vari forum.

Come scegliere una fotocamera digitale? Quali sono i parametri da considerare, prima di comprare uno di questi gioielli della tecnologia? In questa breve guida vedremo di esaminare alcune delle cose più importanti.

Sicuramente, se state pensando di comprare una macchina digitale, nella vostra mente si affolleranno un mucchio di concetti con cui siete poco familiari e che servono, appunto, a confondervi le idee per farvi comprare cose di cui non avete assolutamente bisogno: Megapixel, zoom ottico, zoom digitale, sensibilità ISO, bilanciamento del bianco... cercheremo di spiegare tutto, ma soprattutto chiariremo la cosa più importante, che probabilmente in questo momento di sconforto sarà relegata in un angolino della vostra mente, sepolta da tutto il marketing: la macchina farà belle foto?

Farà belle foto?


La questione centrale della scelta di una macchina fotografica, che va al di là di qualsiasi tipo di parametro tecnico è: la macchina farà belle foto? Certo, questo non dipende solo dalla macchina ed è un parametro fortemente soggettivo, ma avere un’idea di quel che si può ottenere è molto, molto importante per non rimanere delusi da un acquisto fatto alla cieca.

Come si fa a sapere se una determinata macchina farà foto che ci piacciono? Esistono, in sostanza, due metodi: il primo è provare la macchina, ma nella maggior parte dei casi è difficilmente praticabile. Il secondo, invece, è più comodo e potete metterlo in pratica direttamente da dove siete ora: basterà cercare immagini scattate con una determinata macchina per trovare numerosi esempi.

In particolare, cercando su un motore di ricerca con la parola chiave site:pbase.com potrete restringere la ricerca al sito http://www.pbase.com, un database di migliaia di scatti in cui è possibile ricercare per
macchina utilizzata, marca, pellicola e molto altro.

Ad esempio, se fossimo interessati ad una Canon PowerShot S95, potremmo cercare "PowerShot S95"
site:pbase.com
(notare le virgolette che permettono di cercare solo la stringa precisa e non le singole parole) ed ottenere questi risultati. E` anche possibile effettuare la ricerca
per immagini, ad esempio utilizzando la stringa di ricerca "PowerShot S95" sample image che darà direttamente i link alle foto.

Per migliorare i risultati, potete selezionare la ricerca delle sole immagini Grandi, così vedrete direttamente il file originale salvato dalla macchina fotografica, con tutti i dettagli.

Questo servirà ad avere un’idea dei risultati che potremo ottenere con una determinata macchina fotografica. Ma come fare a restringere la scelta a poche macchine? Iniziamo con lo stabilire quali sono i parametri importanti.

Premessa importante sui Megapixel


Mentre il parametro ufficiale per giudicare la qualità di una macchina fotografica digitale sembra essere il MegaPixel, in realtà questo parametro non influenza direttamente la qualità finale dell'immagine, soprattutto se questa viene visualizzata a video. Per esempio, le informazioni registrate da una macchina a 5mp sono ampiamente sufficienti a stampare nel classico formato 10x15.

Riporto la tabella presente sul sito del servizio di stampa online di Fujifilm. Sono riportate le altezze e larghezze consigliate:

Formato di stampaAltezza PixelLarghezza PixelMegapixel
10x131.2001.6001.9
10x151.2001.8002.2
11x141.2001.6001.9
11x151.8002.4004.3
11x161.2001.8002.2
12x161.5002.0003.0
12x181.5002.2503.4
13x171.5002.0003.0
13x181.5002.0003.0
13x191.5002.2503.4
15x201.8001.3502.4
15x231.8002.7004.9
20x272.4003.2007.7
20x302.4003.6008.6
23x302.4003.2007.7
30x402.4003.2007.7
30x452.4003.6008.6

Come potete vedere, una macchina da 8Mpixel sarà necessaria solo se dovete ottenere stampe di ottima qualità in grande formato (30x45cm).

Approcci alla scelta di una macchina


Secondo la mia esperienza, ci sono due approcci possibili:

  • Approccio top-down: si esaminano tutte le macchine in una determinata fascia di prezzo e si sceglie quella che offre il miglior rapporto qualità-prezzo (secondo i parametri che vedremo più avanti)
  • Approccio ground-up: si stabiliscono alcuni attributi minimi; si ricercano tutte le macchine che rispondono a tali attributi minimi e successivamente si sceglie quella con il miglior rapporto qualità-prezzo

I parametri in base a cui scegliere


Il primo parametro in base al quale scegliere, come abbiamo già accennato, è la qualità delle foto prodotte. Se la qualità delle foto non vi piace, non sarà di nessuna consolazione sapere che la macchina ha un super-zoom da 400mm!

Vediamo un piccolo elenco di parametri di cui un negoziante non vi parlerà mai, ma che sono piuttosto importanti per un buon acquisto:

  • Qualità delle foto (di cui abbiamo già parlato)
  • Grandezza fisica del sensore (pixel density)
  • Qualità dell’ottica
  • Shutter lag e tempi di startup
  • Qualità del corpo, ergonomia, comodità dei comandi

Queste cose difficilmente saranno scritte sulla brochure di una macchina; vediamo, una per una, che cosa significano e perché è importante tenerne conto.

Grandezza fisica del sensore


Dalla grandezza fisica (dimensioni) del sensore dipendono sia la qualità dell'immagine che, in parte, le lunghezze
focali che si avranno a disposizione. Un sensore più grande, a parità di risoluzione, permette di avere meno rumore, una miglior resa dei colori e definizione dei contorni. Infatti la zona di sensore dedicata a recepire la luce per un singolo pixel dell’immagine sarà più grande e si avrà un miglior rapporto segnale-rumore. Dividendo i megapixel per l'area del sensore si ottiene la pixel density, cioè la quantità di pixel per millimetro quadrato: come regola generale, minore sarà tale valore, migliore sarà la qualità del sensore (ma ricordate che il miglior modo per giudicare è vedere foto fatte con quella macchina!!).

Come si relaziona la grandezza del sensore con la lunghezza focale? La maggior parte degli obiettivi per macchine reflex è costruita per macchine fotografiche tradizionali, dette 35mm dalla dimensione del fotogramma che viene impressionato quando si scatta una foto (24x36mm). Il sensore delle macchine digitali, tranne per le macchine dette Full Frame, è più piccolo del normale fotogramma a pellicola. E` come se invece di vedere tutta la foto, ne ritagliaste una parte, come è possibile vedere su Wikipedia (in inglese). Il rapporto tra il formato 35mm ed il formato del sensore della macchina digitale viene comunemente definito Crop Factor; ad esempio il rapporto tra un 24x36 e un 19x29 è circa 1.6.

Ad oggi, tutte le macchine digitali compatte vengono commercializzate con i dati relativi alla lunghezza focale equivalente al 35mm, ma questo parametro andrà valutato nel caso di macchine reflex.

A causa di questo, è abbastanza raro trovare macchine compatte con buoni obiettivi grandangolari (angolo di ripresa molto ampio), in compenso è facile trovare lunghezze focali massime equivalenti a 400mm e oltre (teleobiettivi).

Qualità dell'ottica


La maggior parte delle macchine digitali compatte viene prodotta da famosi brand della fotografia (es. Canon, Nikon, etc) che, grazie all’esperienza ed alle conoscenze di cui dispongono, riescono a fornire ottiche di qualità accettabile un po' su tutta la gamma delle compatte.

Altri marchi ricorrono a nomi importanti, come Zeiss, per la progettazione, ma non per la costruzione: così è possibile scrivere ottiche Zeiss sulla scatola, anche se la qualità è solo in parte quella Zeiss...! ;)
Giudicare la qualità di un'ottica non è facile: su Internet è pieno di maniaci di questi test, basta cercare! Per quel che mi riguarda, la qualità dell’ottica influisce sulla prova principale che la macchina deve superare e di cui abbiamo già parlato, la prova-foto: se le foto fatte con quell'ottica vi piacciono, la qualità è adeguata a quel che volete ottenere. Non avete bisogno d’altro!

Shutter lag e tempi di startup


Lo Shutter Lag altro non è che il ritardo tra la pressione del tasto e loscatto vero e proprio. Non bisogna confondersi con il tempo d’esposizione! Ecco le fasi più importanti di uno scatto:

  • Pressione del tasto di scatto, la macchina si accorge della pressione (1)
  • Messa a fuoco
  • Calcolo di apertura ed esposizione
  • Calcolo del bilanciamento del bianco
  • La macchina apre l’otturatore (2)
  • Esposizione
  • La macchina chiude l’otturatore (3)

Le fasi che vanno da 1 a 2 riguardano lo shutter lag, mentre da 2 a 3 si parla tempo d'esposizione.

Sebbene possa sembrare un parametro quasi ininfluente, nell’utilizzo quotidiano è uno dei maggiori problemi per gli utenti di macchine digitali compatte; non è raro sentirsi dire "ma io avevo scattato al momento giusto!!!". Con lo shutter lag c'è poco da fare; è possibile cambiare alcune impostazioni o adottare la tecnica del Pre-Focus, ma un ritardo di uno o due decimi di secondo rimarrà sempre... e non è un ritardo da poco, quando si scattano foto a bambini scatenati, animali o foto sportive.

Alcuni siti riportano lo shutter lag delle varie macchine, ma i dati riguardanti questo fenomeno possono essere forniti in tanti modi, ad esempio è possibile trovare mischiati i dati relativi allo shutter lag con e senza pre-focusing (messa a fuoco, calcolo
dell’apertura, tempi, bilanciamento del bianco, etc).

L'unico modo per rendersi veramente conto del ritardo è provare la macchina di persona.

I tempi di startup possono variare da macchina a macchina: molte delle compatte richiedono alcuni secondi tra l’accensione ed il momento in cui sono pronte a scattare, mentre le DSLR (Digital Single-Lens Reflex, macchina fotografica digitale reflex) sono pronte appena accese. Anche questo fattore può condizionare pesantemente l’utilizzo della macchina: ci sono alcuni momenti irripetibili (qualcuno ha detto i primi passi?) che andranno persi a causa di questi ritardi!

Qualità del corpo, ergonomia, comodità dei comandi


Un altro elemento spesso sottovalutato da chi, alle prime armi, si trova a voler comprare una macchina digitale è quello della comodità: le macchine digitali, essendo slegate dalla tipica struttura di una macchina reflex, sono state costruite in molti modi e forme differenti, spesso guidati più dalla moda e dal design che dall’effettiva usabilità dello strumento.

La macchina fotografica, però, è uno strumento della vostra creatività e per essere utilizzato al meglio dovrete trovarvi bene con esso: poter impugnare agevolmente la macchina e raggiungere i controlli più importanti sono i requisiti minimi!

Purtroppo, le macchine compatte tendono ad avere pochi comandi manuali facilmente raggiungibili ed a nascondere le impostazioni nei vari menu: se volete avere il controllo totale dell’immagine, diffidate dalle macchine con pochi tasti! Se, al contrario, preferite qualcosa di più automatizzato, dovrete giudicare dalle foto (come abbiamo già detto e ripetuto) i risultati ottenibili in modalità automatica.

Glossario Fotografia: Crop Factor

Il crop-factor è il valore del rapporto tra la dimensione del fotogramma 35mm classico (36x24mm) e quella del sensore della macchina.

Ad esempio il crop factor di un sensore 29x19mm è di circa 1.6:

(24 * 36) / (19 * 29) = 1.568 

Questo parametro influisce sull'angolo di ripresa dell’obiettivo (essendo minore l'area del sensore, sarà minore anche l'angolo di ripresa): mentre su una macchina a pellicola un obiettivo 50mm ha un angolo di ripresa di circa 45°, su una macchina digitale con crop-factor di 1.6 l'angolo sarà di circa 28° (45 / 1.6), il che equivale all'incirca all'area coperta da un obiettivo 80mm (50 * 1.6) su una macchina a pellicola.

Una spiegazione più esaustiva è disponibile su Wikipedia (in inglese).

Glossario Fotografia: Full Frame

Sono dette Full Frame (FF) le macchine fotografiche digitali che dispongono di un sensore di grandezza pari al fotogramma 35mm classico (24x36mm).

Glossario Fotografia: Rumore

Il termine rumore, nel campo della fotografia digitale, si riferisce alla presenza di una grana di pixel disposti a caso che causano la riduzione di qualità dell’immagine. Il rumore in una foto digitale aumenta in base alla sensibilità ISO ed alla durata dell’esposizione.

Glossario Fotografia: Shutter Lag

Letteralmente: ritardo dell'otturatore. Con questo termine si indica il ritardo tra la pressione del tasto di scatto e la cattura effettiva dell'immagine; sulle digitali più economiche (o datate) può arrivare ad un secondo ed oltre. E` possibile provare a ridurlo con la tecnica del Pre-Focus.

Glossario Fotografia: Pre-Focusing

Il pre-focusing è una tecnica spesso utilizzata per ridurre lo Shutter Lag che prevede, in sostanza, di mettere a fuoco prima di iniziare lo scatto vero e proprio:

  1. Si preme a metà il tasto di scatto per mettere a fuoco (e calcolare esposizione, apertura, bilanciamento del bianco, etc) il punto in cui dovrà essere il soggetto al momento dello scatto
  2. Quando il soggetto è nel punto a fuoco, si preme del tutto il tasto e si scatta, ottenendo una parziale riduzione delo Shutter Lag

Glossario Fotografia: Megapixel

Il termine megapixel indica da quanti milioni di pixel è formato il sensore di una macchina fotografica digitale. Questa quantità è legata solo in parte alla qualità finale dell’immagine, ma è importante per la grandezza massima delle stampe che potremo ottenere da una determinata foto digitale.

Di seguito è riportata una tabella (fonte: servizio di stampa online Fuji) delle risoluzioni di stampa e relative risoluzioni del sensore:

Formato di stampaAltezza PixelLarghezza PixelMegapixel
10x131.2001.6001.9
10x151.2001.8002.2
11x141.2001.6001.9
11x151.8002.4004.3
11x161.2001.8002.2
12x161.5002.0003.0
12x181.5002.2503.4
13x171.5002.0003.0
13x181.5002.0003.0
13x191.5002.2503.4
15x201.8001.3502.4
15x231.8002.7004.9
20x272.4003.2007.7
20x302.4003.6008.6
23x302.4003.2007.7
30x402.4003.2007.7
30x452.4003.6008.6

Blogger ha vinto (per ora)

Nonostante i miei buoni propositi, sembra che la creazione di un tema per Blogger richieda uno sforzo molto superiore a quanto avevo preventivato, più che altro per la devastante mancanza di documentazione, che mi obbligherebbe a lunghe sessioni di reverse engineering partendo dai temi esistenti.

Non credo ne valga la pena.

Se Google si sforzerà di produrre documentazione decente, la leggerò volentieri e porterò il mio tema da HTML5 al formato di Blogger, ma per ora dovrete accontentarvi di questo tema "adattato" da quello "Simple" di partenza.

giovedì 9 dicembre 2010

Il cambiamento di paradigma, ovvero come non preoccuparsi ed imparare ad amare i robot

Come tant* nerd della mia generazione, sono cresciuto leggendo fantascienza ed amando i robot. I robot nella fantascienza sono quasi sempre umanoidi. Alcuni sono fondamentalmente buoni (robot asimoviani), altri sono malvagi in sé stessi o, comunque, comandati da uomini malvagi (ad esempio i berserker).

I robot, nella realtà odierna, non dispongono di intelligenza come la intendiamo comunemente, sebbene spesso siano "migliori" di un uomo in un campo specifico, ad esempio riconoscere un frutto guasto, fare saldature di precisione, sollevare e spostare grossi carichi. I robot sono macchine, strumenti.

Oggi, leggendo i miei soliti feed di news, mi sono imbattuto in questo articolo che parla di un nuovo robot in grado di disossare un prosciutto, compito precedentemente considerato impossibile per una macchina. Il commento dell'autore, immagino anche parzialmente scherzoso, pare scritto da Ned Ludd in persona: "continuiamo ad insegnare ai robot le cose che gli serviranno per innalzarsi contro di noi. E' da stupidi. Si stanno prendendo i nostri lavori".

Allora a questo punto dobbiamo fare un passo indietro e domandarci: perché lavoriamo? La risposta più semplice e banale è: lavoriamo per vivere. Il che era vero per i nostri antenati che si spaccavano la schiena nei campi o per quelli che andavano a caccia. Più correttamente, a seguito della divisione dei compiti e della specializzazione, all'interno della società noi lavoriamo per ottenere i soldi che sono il mezzo di scambio che ci permette di accedere a quello di cui abbiamo bisogno per vivere: cibo, acqua, un riparo.

In quest'ottica, vedere minacciato il proprio posto di lavoro è vedere minacciata la propria vita.

Eppure una maggiore automazione potrebbe aiutarci ad uscire dal circolo vizioso: se oggi un uomo può sfamarne 100, come sarebbe il mondo quando potesse sfamarne, aiutato da robot, 100mila? Ad un certo punto potremmo finalmente raggiungere l'utopia inseguita per tanto tempo: la sopravvivenza garantita a tutti. Una società completamente diversa, in cui l'uomo potrebbe inseguire i suoi sogni e le sue aspirazioni, invece che arrabattarsi miseramente per tirare avanti un altro giorno. In cui sarebbe veramente libero.

Le sfide da vincere sono tante: da una parte quelle tecnologiche per la creazione di robot sempre più sofisticati e adatti a più ambiti, dall'altra quelle sociali, che richiedono di evolvere la società in modo armonioso, in modo che i lavoratori che vengono mano a mano sostituiti da robot non ne abbiano a soffrire, ma anzi siano i primi fruitori del nuovo sistema.

mercoledì 8 dicembre 2010

Lavorando sul tema...

Mentre mi faccio una cultura su come creare temi per Blogger (che casino!), nel frattempo sto creando il tema in puro e semplice HTML5, poi vedrò di convertirlo.

Intanto ecco un'anteprima di come dovrebbe venire:

lunedì 6 dicembre 2010

Nuovo layout in arrivo

Ora che mi sono deciso ad aprire questo nuovo sito/blog/whatever, vedrò di dargli un aspetto un po' meno "tema di default di blogger"... a tra qualche ora/giorno :)

Creare un repo git condiviso

Sulla mia box attuale ho due dischi in raid 1 su cui si trova la /home. Per sviluppare ho una vm QEMU/KVM con sopra Ubuntu 10.04 Server, il cui disco però non risiede sul suddetto raid.

Dato che voglio avere una certa ridondanza per i dati, volevo fare in modo di avere un repository git centralizzato sulla macchina host (nella home, quindi sul raid) da cui clonare nella vm (ed eventualmente sul portatile) per sviluppare e poi pushare di nuovo sul repo sul raid.

Inizialmente ho semplicemente creato un repository sulla macchina host, l'ho clonato sulla vm, ma al momento di effettuare il push usciva questo simpatico errore:

vm ➤ git push
Counting objects: 36, done.
Delta compression using up to 2 threads.
Compressing objects: 100% (23/23), done.
Writing objects: 100% (25/25), 84.45 KiB, done.
Total 25 (delta 6), reused 0 (delta 0)
remote: error: refusing to update checked out branch: refs/heads/master
remote: error: By default, updating the current branch in a non-bare repository
remote: error: is denied, because it will make the index and work tree inconsistent
remote: error: with what you pushed, and will require 'git reset --hard' to match
remote: error: the work tree to HEAD.
remote: error: 
remote: error: You can set 'receive.denyCurrentBranch' configuration variable to
remote: error: 'ignore' or 'warn' in the remote repository to allow pushing into
remote: error: its current branch; however, this is not recommended unless you
remote: error: arranged to update its work tree to match what you pushed in some
remote: error: other way.
remote: error: 
remote: error: To squelch this message and still keep the default behaviour, set
remote: error: 'receive.denyCurrentBranch' configuration variable to 'refuse'.
To host:c0ding/ruby/project
! [remote rejected] master -> master (branch is currently checked out)
error: failed to push some refs to 'host:c0ding/ruby/project'

Il problema era che essendo loggato anche sulla macchina host ed avendo un repository "aperto", git si rifiutava di farmi mischiare le due cose. Inizialmente, per risolvere, mi sono limitato a creare un nuovo branch sulla macchina host:

host$ git checkout -b temp-repo

La soluzione più corretta, però, l'ho trovata su stack overflow (e sul sito linkato, pro git): era necessario creare un "bare repository", ovvero un repository che contiene solo i dati GIT e nessun altro file.

Quindi ho fatto:

host$ rm -rf ~/c0ding/ruby/project

vm ➤ git clone --bare project project.git  # creazione bare repo
vm ➤ scp -r project.git host:c0ding/ruby/  # copia del repo sull'host
vm ➤ rm -rf project project.git            # rimozione vecchi repo sulla vm
vm ➤ git clone host:c0ding/ruby/project.git # clone nuovo repo sulla vm
vm ➤ cd project
vm ➤ git log

commit xxx
Author: Gilberto "Velenux" Ficara
Date:   Mon Nov 1 15:40:20 2010 +0100

Added Cucumber, JQuery support gems. Created DB.

commit xxx
Author: Gilberto "Velenux" Ficara
Date:   Mon Nov 1 14:42:03 2010 +0100

Initial commit

vm ➤