Archivio per il mese di giugno 2007



Transformers

Divaghiamo un pò, ieri sera ho visto Transformers e in tutta sincerità ero preparato a un film ben peggiore, invece sorprendentemente non è stato per niente malvagio. Occorre iniziare con una considerazione molto semplice: è un film di Michael Bay, però sembrerebbe essere anche il suo migliore e forse pure lui stesso ne è convinto considerando una battuta che viene detta da un ragazzino durante il film. 140 minuti, circa $1 milione al minuto visto il costo del film che si è attestato sui $147 milioni, infarciti con parecchia azione, scene molto movimentate (a volte anche troppo, tanto che in alcune occasioni la concitazione degli scontri diventa quasi confusione), storia minimale e caratterizzazione dei personaggi veramente basilare, americanate a tutto andare (ci sono militari, si gasano tutti, ci sono alieni e c’è il presidente degli Stati Uniti sull’Air Force One… un film di Bay, appunto) e diversi momenti tra il divertente e il goliardico, soprattutto nella prima metà del film. Lo sviluppo della trama è quanto di più lineare possa esistere, ma diciamocelo chiaramente: va benissimo così. La costruzione delle scene è molto buona e gli effetti speciali sono indubbiamente notevoli, in più l’integrazione tra la dinamica delle trasformazioni e le azioni in corso è venuta veramente molto bene. Il film è molto diverso dalla serie animata, tenetelo bene a mente se mai andrete a vederlo, però ci sono tanti richiami all’originale che vanno dal riconoscibilissimo suono delle trasformazioni mantenuto in due o tre occasioni fino al rapporto tra alcuni robot che trapela in alcuni momenti (Megatron e Starscream), passando per qualche chicca non casuale inserita nel film. Forse le uniche pecche possono essere identificate nella dilatazione secondo me un po’ troppo forzata di alcune scene e in alcune battute che stonano un po’ in certe situazioni e per certi personaggi, però nel complesso mi è sembrato un ottimo film di azione che strizza l’occhio ai nostalgici della serie originale e che difficilmente potrà annoiare sia il fan di vecchia data che lo spettatore occasionale. Mi è piaciuto e non ci avrei sperato, se il film avrà successo avrà quasi certamente un seguito per cui staremo a vedere.

Pescando a caso dal mucchio… – la vendetta

Durante la settimana passata non ho avuto molto tempo e neppure troppa voglia di scrivere qualcosa, per cui riassumo un po’ di vicissitudini, eventi e impressioni in un post unico:

  • Python: dopo anni finalmente ho deciso di impararlo, del resto potrebbe tornarmi utile e potrei riutilizzare le conoscenze anche in ambiente .NET attraverso IronPython. Per ora non sto facendo molto e mi sto limitando a curiosare un po’ nelle caratteristiche del linguaggio, ogni tanto mi metto davanti a SciTE chiedendomi come potrei fare in Python questa cosa che altrimenti in Ruby farei così? e scrivendo di conseguenza qualche breve snippet. L’indentazione forzata non mi crea problemi perché sono sempre stato molto ordinato da questo punto di vista, in più sto cominciando ad apprezzare le list comprehension e lo statement with insieme al decoratore contextmanager riescono a farmi sentire un po’ meno la mancanza dei blocchi di Ruby. Forse la filosofia dell’esplicito a tutti i costi è quello che per ora mi lascia un po’ perplesso, ci farò l’abitudine.
  • wikiPad: immaginate un editor di testo molto semplice, poi pensate a un wiki e infine unite i due concetti in un’unica applicazione standalone, otterrete così wikiPad. Si tratta di un programma open source e multi piattaforma in stile blocco note ma che permette di organizzare le proprie idee proprio come se fosse un wiki in piena regola, ma offline. Facile da utilizzare con collegamenti e completamento automatico delle wikiword, facile da organizzare, funzionalità di ricerca, base dati su testo semplice oppure su database SQLite e possibilità di esportare il wiki completamente o in parte in formato HTML o XML. L’applicazione è scritta interamente in Python con wxPython per la GUI ed è possibile estenderne le funzionalità con plugin scritti ovviamente sempre in Python (personalmente, un motivo in più impararlo).
  • Alleluja, finalmente con Visual Studio 2008 Orcas sarà supportato il multi-targeting delle versioni di .NET Framework, quindi si potranno creare e compilare progetti di .NET 2.0, 3.0 e 3.5 con un unico IDE.
  • DELL 1800 e dischi: questo server, che in azienda usiamo per sviluppo, è stato configurato con 2 dischi SATA Maxtor da 80GB in mirror e nonostante tutto ha deciso di decedere ugualmente con un disco in preda a tick-of-death forsennato e con l’altro disco cosparso di bad sectors. Morale: perso qualche pezzo fortunatamente di poca importanza, molta roba era sparsa in giro sotto forma di copie e altra era recuperabile dal disco più vivo dei due. Il rompimento di scatole più che altro sarà dover riconfigurare tutto, ma almeno il metabase di IIS c’è ed è integro.
  • Dream Theater: di 36,80€ euro per il biglietto del concerto di fine ottobre al DatchForum (ex FilaForum) di Assago, 4,80€ sono della ladrata dei diritti di prevendita. Vabbè, vale sempre la pena per questa band e per le loro 2h 30m di concerto che mediamente sono soliti tenere. Peccato abbiano fatto tutto Images and Words a inizio giugno per il Gods of Metal, per cui non è da escludere che per la data di ottobre non suoneranno pressoché nulla da questo album ma spero di essere smentito.
  • Sto cercando un masterizzatore DVD interno “da corsa” ma decente per averne uno nel computer da cui sto scrivendo per poter masterizzare CD o DVD poco importanti o di test senza sprecare il mio ottimo e fidato Sony DRU-510A esterno (un signor masterizzatore del 2003 che ancora oggi riesce a masterizzare dati pure sulle pizze margherita). Facendo un giro Mediaworld mi sono accorto che i prezzi si sono abbattuti in maniera impressionante: 35 euro per un masterizzatore DVD±R/RW Dual Layer Samsung (SH-S182D/RSMN) che masterizza pressoché tutto a velocità invereconde. Stavo per prenderlo, ma ho notato che occorre aggiornare il firmware per un problema nel lead-in dei DVD-R che può rendere illeggibili i supporti scritti con questo masterizzatore su diverse unità di lettura, per cui attendo i test di un mio collega che lo ha acquistato e che parrebbe non aver problemi.
  • Settimana prossima si va a vedere Transformers, sono veramente curioso. Chissenefrega se non avrà una storia degna di nota, è comunque un tuffo nel passato e l’importante è che sia pieno di azione e dai trailer sembra realizzato molto bene, tecnicamente parlando. Intanto ho preso via Amazon l’edizione deluxe del film animato del 1986, che ho già visto ma con qualità non propriamente decente mentre questa è stata rimasterizzata.

Un piccolo problema risolto prima in PHP e poi in Ruby

Ieri un mio amico mi ha esposto un problema che doveva risolvere in PHP: all’interno di una directory sono presenti svariate fotografie in formato JPG di alcuni prodotti identificati con NOME_PRODOTTO e per ogni prodotto sono quasi sempre presenti (da notare il quasi) due fotografie aventi nomi dei file nei formati NOME_PRODOTTO-fronte.jpg e NOME_PRODOTTO-retro.jpg. Partendo dal contenuto della directory e in maniera totalmente dinamica, occorre generare un elenco in forma tabellare di questi file avente un prodotto per ogni riga composta a sua volta da due colonne contenenti rispettivamente l’immagine fronte e l’immagine retro, il tutto escludendo dall’elenco tutti quei prodotti sprovvisti di una delle due immagini. Per semplificare ho rappresentato la forma tabellare descritta con un output in formato CSV, comunque questa è stata la soluzione a cui sono giunto:

1 require_once('File.php'); 2 define('SRC_DIRECTORY', 'D:/Temp/fronte-retro/'); 3 $file_table = array(); 4 5 foreach (glob(File::buildPath(array(SRC_DIRECTORY, '*-fronte.jpg'))) as $file_fronte) 6 { 7 preg_match("/(.*?)-fronte.jpg/", $file_fronte, $matches); 8 $file_retro = "{$matches[1]}-retro.jpg"; 9 10 if (file_exists($file_retro)) 11 $file_table[] = array(basename($file_fronte), basename($file_retro)); 12 } 13 14 foreach ($file_table as $fronteretro) 15 echo "\"{$fronteretro[0]}\",\"{$fronteretro[1]}\"\\n";

Lo script in questione ricava l’elenco di tutti i file *-fronte.jpg all’interno della directory attraverso la funzione glob() e per ognuno di essi verifica che sia presente anche la relativa immagine del retro. Se è soddisfatta questa condizione, viene aggiunto all’array $file_table (tabella) un array (colonne) contenente il nome dell’immagine fronte e quello dell’immagine retro. A questo punto vorrei mettere in evidenza alcuni punti:

  • riga 1: viene incluso il pacchetto File da PEAR per sfruttarne poi nella riga 5 il metodo buildPath che permette di concatenare in maniera sicura gli elementi di un path ottenendo una stringa corretta identificante una risorsa sul filesystem. Il problema nasce nel momento in cui non si ha a disposizione PEAR, a questo punto per riprodurre il metodo buildPath occorrerebbe scrivere un’altra quindicina di righe perché tra le millemila funzioni built-in di PHP non ne esiste una simile. Se ciò vi sembra folle… beh tranquilli perché in effetti lo è.
  • riga 7: questa è una nota personale, comunque ho sempre odiato i nomi di svariate funzioni di PHP (anche perché diciamocelo, spesso soffre di inconsistenza cronica nella denominazione delle stesse) e quelli legati alle espressioni regolari mi sono sempre stati particolarmente antipatici, senza contare che a volte faccio ancora fatica a ricordarmi la corretta successione dei loro argomenti.
  • riga 14 e 15: iterando il contenuto dell’array $file_table (tabella) con foreach viene estratto per ogni elemento un ulteriore array (colonne) su cui però non è possibile applicare la funzione list() per estrarre direttamente i valori in due variabili distinte perché foreach non lo consente, per cui si è costretti ad accedere a questo array usando gli indici ma secondo me la soluzione non è propriamente il massimo a vedersi. Per farlo invece bisognerebbe utilizzare un ciclo di while insieme a each() e due list() innestati come nell’esempio seguente, anche se non sono sicuro molto convinto che si guadagni in leggibilità:
    while (list($index, list($fronte, $retro)) = each($file_table)) echo "\"{$fronte}\",\"{$retro}\"\\n";

Dopo aver completato lo script ho pensato a come avrei potuto risolvere lo stesso problema in Ruby e nel giro di 1 minuto ho raggiunto la soluzione in questo modo:

1 BASE_DIR = 'D:/Temp/fronte-retro/' 2 3 file_table = Dir[File.join(BASE_DIR, '*-fronte.jpg')].map do |fronte| 4 retro = /(.*?)-fronte.jpg/.match(fronte)[1] + '-retro.jpg' 5 [File.basename(fronte), File.basename(retro)] if File.exist?(retro) 6 end 7 8 file_table.each { |(fronte, retro)| puts "\"#{fronte}\",\"#{retro}\"\\n" }

Quasi la metà del codice rispetto alla soluzione in PHP e senza la necessità di includere pacchetti esterni, ottenendo comunque un listato che secondo me è molto più leggibile e intuitivo. Voi che pensate?

A me sembra di aver già visto il nuovo dock…

Il primo nell’immagine è Looking Glass di Sun (2003), l’altro è MacOS X 10.5 Leopard di Apple (2007): sbaglio o i due dock si somigliano un po’… tanto?

Looking Glass MacOS X 10.5 Leopard

Safari 3 per Windows

Per curiosità ho seguito il keynote tenuto da Steve Jobs al WWDC ‘07 di Apple e in mezzo a una piattezza nonché mancanza di novità piuttosto sorprendente (non so per l’utente Mac medio, ma personalmente mi sarei aspettato qualche annuncio degno di nota per il mondo Apple) è saltato fuori che per Safari 3 hanno deciso di sviluppare una versione Windows (XP e Vista) la cui beta è addirittura già disponibile in forma pubblica su un sito Apple che si presenta con una veste grafica pesantemente rivista. Le dimensioni dell’installer sono di circa 8MB e lo sto scaricando proprio in questo momento, mi piacerebbe vedere come va soprattutto dopo aver visto i confronti con altri browser (IE7 e FF2) fatti da Jobs sul palco, con slide a supporto che mostravano prestazioni spettacolari ma di cui sinceramente non sono del tutto convinto.

AGGIORNAMENTO: ho provato finalmente Safari in Windows ma l’esperienza non è durata molto, visto che in meno di 5 minuti il browser in questione è imploso 5 volte e tra un botto e l’altro ho notato una scarsa visualizzazione delle pagine (nemmeno la pagina dei risultati di ricerca di Google si salva!), font renderizzati male e velocità che non sembra rispecchiare quella messa in evidenza dai benchmark Apple. Certo è una beta è normale che ci siano problemi… peccato che la loro entità sia degna di una versione pre-alpha spinta e sembrerebbero essere problemi che hanno tutti. Rimosso senza pietà, vediamo con la prossima release.