Il bug che non ti aspetti

Per chi lavora in ambito IT è una esperienza comune sentire un utente lamentarsi per un programma che ha un errore e non funziona correttamente.
Per quanto il mondo informativo sia spesso oggetto di scherno, sappiamo che in generale gli applicativi vengono sottoposti a un debug abbastanza attento prima del rilascio e normalmente non contengono errori di grande entità, soprattutto in relazione alla loro complessità. Normalmente si tratta semplicemente di un utente che non ha mai letto il manuale e sta cercando di far fare al software qualche operazione in maniera scorreta.
Tuttavia i bug esistono e se ne trovano anche in software blasonati.

Settimana scorsa stavo scrivendo un frammento di codice che interpreta un feed RSS e crea tanti oggetti quanti sono i posts in modo da poterli manipolare all’interno della mia applicazione. Le proprietà dell’oggetto post nel mio applicativo sono fortemente tipizzate, quindi la classe post contiene una proprietà PubDate che rappresenta un oggetto di tipo DateTime. Dato che la data nel feed è semplicemente una stringa di testo, questa va sottoposta a una operazione di Parsing per essere identificata come una data.

Questo è molto semplice da fare nel .NET Framework: la data nel feed è formattata in quello che è volgarmente definito RFC1123 (che in effetti si basa sullo standard ISO8601) e il framework mette a disposizione la funzione DateTime.Parse che fa tutto il lavoro di conversione dandole semplicemente come input la stringa di testo.

Provo la funzione, tutto bene.
Tutto bene fino a quando il software non arriva a processare la data Sun, 15 Mar 2009 22:02:44 +0000. Leggi tutto “Il bug che non ti aspetti”

Testo nelle immagini

Naked Security illustra i dettagli di un tipo di attacco molto subdolo.

Si tratta di nascondere un codice JavaScript nei pixel di un’immagine a toni di grigio; una versione modificata ad arte di jQuery è in grado di decodificare i dati contenuti nel file ed eseguirli come JavaScript.

Questo metodo potrebbe evadere molti, se non tutti, tipi di scansione perché il codice JavaScript non è riconoscibile come pattern.

Incuriosito da questa tecnica, ho provato a ricreare il metodo per codificare e decodificare un testo in un’immagine PNG. Leggi tutto “Testo nelle immagini”

Mal di testa vettoriale

xmlMi sto dedicando in questi giorni a una revisione del mio sito web e sono incappato in un interessante problema la cui soluzione penso possa interessare gli altri geek.
Dovevo inserire alcune icone social da utilizzare sia nella classica dimensione 32×32 pixel, sia in altre grandezze in pagine diverse. La soluzione iniziale a cui avevo pensato era salvare le immagini nella dimensione più grande necessaria e poi utilizzarle ridimensionadole dove servivano più piccole.
Idea apparentemente buona, ma all’atto pratico non molto gradevole esteticamente: il layout engine del browser si occupa anche di scalare le immagini e applicare lo anti-aliasing dove necessario, ma i risultati visivi variano di molto. Mentre Firefox e Chrome fanno un lavoro abbastanza buono, Internet Explorer – guarda un po’ – fa una riduzione pessima; in nessuno dei tre casi, però, il risultato è ottimale.
Tutte le immagini erano in formato PNG, quello che possiamo definire a grandi linee il GIF dell’informatica moderna: supporta, tra le altre cose, lo alpha compositing e la tavolozza RGB a 24bit. Non è adatto per la grafica professionale – dove dominano JPEG, TIFF e i vari formati proprietari – ma è perfettamente equipaggiato per fornire le grafiche decorative su internet.

Per risolvere il problema della riduzione in maniera definitiva, avrei dovuto preparare immagini di diverse dimensioni a monte: un software di fotoritocco può rimpicciolire una immagine in maniera decisamente migliore rispetto a motore di rendering di un browser. In questo caso però avrei dovuto creare tante copie della immagine quante le dimnsioni di cui avevo bisogno.
Ho quindi iniziato a ragionare su una soluzione diversa più pratica e, possibilmente, più geek. Leggi tutto “Mal di testa vettoriale”

Da Flickr a Ipernity

ipernityPer anni sono utente a pagamento di Flickr, ma le ultime modifiche al sito non mi hanno convinto molto.

Ero alla ricerca di un nuovo sito simile a Flickr 1.0 e Corrado Giustozzi mi ha suggerito Ipernity.

È un sito del tutto analogo alla prima versione di Flickr con il chiaro intento di far sentire a casa propria tutti gli utenti che si trovavano bene con il vecchio layout del sito.

Visti gli ultimi fatti di cronaca, uno dei vantaggi di Ipernity è che i server sono in territorio europeo, a Sophia Antipolis; anche i termini dell’accordo di utilizzo hanno come foro di riferimento quello di Cannes.

La migrazione delle immagini da Flickr è facilitata da una serie di script per Grasemonkey (Firefox) o Tampermonkey (Chrome) che importano un’immagine alla volta, un album alla volta oppure tutte le immagini 90 alla volta. Questi script trasferiscono tutti i metadati comuni ad entrambe le piattaforme, inclusi i tag e la geolocalizzazione. Non vengono importati tra gli altri:

  • il numero di visite
  • l’appartenenza ai gruppi
  • le note sulle foto
  • i commenti (che potrebbe non essere poi così male…).

La comodità di questo metodo è che non viene utilizzata la banda del browser che sta eseguendo l’importazione, ma la copia avviene direttamente dai server di Flickr a quelli di Ipernity.

Leggi tutto “Da Flickr a Ipernity”

Generatore di password via command line

Ogni tanto serve generare un po’ di password casuali, questo è un metodo rapido e, si spera, efficace.

Tutto quello che serve è un *NIX e un /dev/urandom con una ragionevole entropia, magari aiutato da un software come haveged.

Questa è l’invocazione per richiamare 1024 byte di password casuali (deve essere scritta su una riga sola, vado a capo per praticità):

strings /dev/urandom |
tr -c -d '\!-~' |
dd bs=1 count=1k 2>/dev/null |
sed -r 's/(.{12})/\1\n/g' ;
echo

Quello che fa questa command line è prendere da /dev/urandom solamente i gruppi di byte che corrispondono a caratteri stampabili (prima riga), filtrarli secondo un range ASCII (seconda riga), fermarsi a 1024 caratteri (terza riga), visualizzarli su righe di 12 caratteri l’una (quarta riga) e andare a capo dopo l’ultima password (ultima riga).

Il range sulla seconda riga è uno dei più ampi possibile nel set ASCII stampabile perché lascia fuori solamente lo spazio e può essere modificato a piacere, ad esempio se si vogliono solamente lettere minuscole e numeri la seconda riga diventa

tr -c -d 'a-z0-9' |

Sulla quarta riga si può variare il numero 12 per avere password di lunghezze differenti o sostituire \n con \t per avere le password incolonnate separate da tab.

Jurassic news, Back to the 80′

Issue_46.jpg

Era una sera dove, come spesso avrei dovuto fare un sacco di cose, ma altrettantemente non avevo voglia di fare un bel niente. Mentre vagavo astrattamente su alcuni siti, non so come e non so perché mi si è materializzata una immagine di una vecchio computer di cui ricordavo con precisione il nome e l’aspetto, e che ai suoi tempi, non ero mai riuscito ne a toccare ne a vedere dal vivo. E’ rimasto per sempre una specie di chimera. Tale computer si chiamava New Brain ed aveva un display VFD alfanumerico con un paio di righe per una manciata di caratteri e una piccola tastiera.

Ho quindi concentrato le mie forze al fine di trovare un po’ di informazioni su quel computer, per vedere quale sia stata la sua sorte e quali erano le sue caratteristiche.
Googla… Googla… ed arrivo ad un sito che mi attira particolarmente, lo studio meglio e non riesco più a staccarmi. Il sito in questione si chiama Jurassic News e come tanti altri siti è orientato al retrocomputing, con però una marcia in più.

Il sito gestito da un gruppo di appassionati di lunga data, che grazie alla loro esperienza e passione cercano di mantenere attivo un patrimonio che è in via di estinzione
attraverso delle ben fatte fanzine gratuite che ad ogni numero tratta in modo dettagliato una serie di dispositivi che vanno dalle prime schede di sviluppo con microprocessori tipo Z80, 6502, 6800, ai veri e propri computer sia piccoli HP41C che più grandicelli CRAY.

Una delle cose che più mi ha colpito è la precisione e il dettaglio tecnico con cui vengono presentati i dispositivi. E’ evidente che chi scrive gli articoli sa bene di cosa si sta parlando.

Inoltre vengono trattati corsi di linguaggi di programmazione estinti, curiosità ed aneddoti vari, vengono presentate le più diffuse testate dell’epoca, interviste a personaggi che diedero il loro contributo in quegli anni e molte altre cose ancora tutte succulente e curiose.

Leggendole si viene letteralmente proiettati in periodi i quali per me, come per molti di voi, sono stati tra i più belli dell’incalzare del mondo dei computer.

Questa estate mi sono farcito il mio tablet di tutti i numeri e mi sono fatto una full immersion avendo proprio l’impressione in alcuni momenti di essere tornato indietro nel tempo. Il sito offre anche un interessante archivio di riviste dell’epoca oramai estinte.
Per certi versi è stato per me come aver trovato una macchina del tempo.
Consiglio a tutti quelli che come me quando avevano 16 o 17 anni passavano i pomeriggi alla GBC smanettando sui PET e sui VIC20, diventando a lungo andare promotori involontari (e non stipendiati) della GBC.

Buona immersione su JURASSIC NEWS

Movies {as code}

moviesascodeMovies {as code} è un sito creato da Ben Howdle con una raccolta di film e telefilm raccontati attraverso vari linguaggi di programmazione.

Il concetto di “linguaggio” è molto elastico perché si va da C al CSS.

Ci sono delle idee veramente geniali, ne riporto di seguito alcune, ma il sito merita davvero una visita.

Il sito permette, ovviamente, di proporre delle proprie versioni dei film.

public final class EpisodeVI {
  public static Movie theJedi;
  public Movie starWars() {
    return theJedi;
  }
}

 

.titanic {
    float: none;
}

 

var name = ["James","Bond"]
alert(name[1]+', '+name[0]+' '+name[1])

 

man tail

Leggi tutto “Movies {as code}”

I/O 2013

Per chi si fosse perso l’evento, questa settimana dal 15 al 17 si è tenuta l’edizione 2013 del Google I/O.
Si tratta della conferenza denominata appunto “Innovation in the Open”, dedicata agli sviluppatori interessati alle tecnologie di Google e Android.

Un po’ come le presentazioni dei prodotti Apple, la I/O è una conferenza sempre piuttosto interessante per gli argomenti discussi. A volte presenta buchi nell’acqua clamorosi – come il quasi defunto Google Wave, appunto presentato qui nel 2009 – ma è sempre un importante forum di discussione nel campo della tecnologia IT a cui vale la pena prestare attenzione.

Per chi non si fosse interessato alla conferenza in diretta, segnalo qui di seguito qualche link utile.
La pagina ufficiale dell’evento è https://developers.google.com/events/io/ mentre TechRadar ci presenta un esaustivo post riassuntivo sulle novità, con link a dettagli per ogni argomento.
Qui di seguito incorporo il video del keynote di apertura.

SimplePie

SimplePieGoogle ha annunciato la chiusura di Google Reader, il servizio di lettura online di feed RSS.

Costruire un proprio lettore di feed RSS con un linguaggio per il web non è un’impresa titanica e potrebbe anche essere l’occasione per approfondire la conoscenza di un linguaggio.

Noi che siamo geek e programmatori quando ci serve una procedura la scriviamo, non ci lamentiamo perché non esiste.

Se si protegge la procedura con una password di accesso e, magari, dietro un server https (con un certificato auto-emesso o con quelli che si comperano a 10 dollari l’anno), si ottiene un po’ più di tutela della privacy rispetto ad un servizio online. Senza contare che non si dipende più dai tagli dei costi di chi offre il servizio.

Volendo fare un reader in PHP e SQL (ma il SQL non è obbligatorio, se non lo si conosce potrebbe bastare un file di testo salvato sul file system e caricato in un array), si può immaginare una struttura testata-dettaglio a tre livelli (categoria, feed, articolo).

L’acquisizione dei dati da un feed RSS è la parte più pallosa, quindi meglio delegarla ad una libreria già fatta, come l’ottima SimplePie, che si smazza tutta la burocrazia del caso e gestisce anche una cache locale per ottimizzare i tempi di download.

Leggi tutto “SimplePie”

Poi non date la colpa al malware

Museo di Iraklio / Heraklion museumSpesso c’è la tendenza ad incolpare il malware per ogni tipo di danno causato ai sistemi informativi o per ogni tipo di furto di informazioni.

Se non si può parlare di colpa di chi scrive il software, certo il programmatore è in molti casi correo colposo (quando non è doloso, ma è un altro paio di maniche) di intrusioni illecite o furti di informazioni.

Negli ultimi anni le cose stanno lentamente cambiando, ma fino a poco tempo fa chi scriveva software era assolutamente inconsapevole dei rischi della sicurezza perché o non se ne curava affatto o pensava che fosse un Problema Altrui.

Scrivere un software che tenga presente i problemi della sicurezza non è semplice, ma sta diventando rapidamente una necessità imperativa se non si vuole fare brutte figure, o peggio.

Leggi tutto “Poi non date la colpa al malware”

Programmare è un’arte?

WHAT IS THE MATRIX?Tom Armitage offre un punto di vista sull’attività di scrivere software.

Chi non si è mai posto il problema di come nasca il software spesso crede che sia un’attività di tipo prettamente tecnico, quasi meccanico.

Chi, sempre esterno al mondo della programmazione, ha visto all’opera alcuni programmatori spesso li definisce artisti, per come riescono ad utilizzare la creatività per risolvere i problemi (è capitato molte volte anche a me di sentirmi definire tale).

Chi scrive software probabilmente non si riconosce in nessuna delle due categorie.

Armitage nella sua trattazione paragona l’attività di programmare a quella dell’architetto, che deve bilanciare la parte ingegneristica-strutturale con quella estetica. Questa definizione probabilmente viene da una concezione piuttosto recente e minoritaria secondo la quale il software debba essere bellodi design prima ancora che utile, sicuro o efficiente.

Leggi tutto “Programmare è un’arte?”

Metadati

I metadati sono le informazioni che descrivono un insieme di dati.

Detta così, è una definizione che crea più dubbi di quanti non ne risolva. Prendiamo ad esempio una lettera scritta con un elaboratore di testi. Il contenuto e la formattazione della lettera sono l’insieme di dati, il nome del file, la data e ora di creazione e di ultimo aggiornamento sono i metadati.

Nell’informatica per anni i metadati sono stati largamente ignorati, sia perché i programmi non li gestivano sia perché non si sentiva la necessità di utilizzarli.

Quando la mole di documenti informatici è iniziata a diventare cospicua (vuoi per l’accumularsi dello storico, vuoi per l’uso preponderante del computer) è diventata sempre più pressante la necessità di catalogare i documenti elettronici in un modo tale da rendere semplice reperire un’informazione specifica.

Leggi tutto “Metadati”

MySQL: dimensioni delle tabelle e degli indici

Una semplice query per tenere d’occhio la situazione delle tabelle e degli indici di MySQL.

SELECT CONCAT(table_schema, '.', table_name) db_table,
CONCAT(ROUND(table_rows/1000000, 2), 'M') rows,
CONCAT(ROUND((data_length+index_length)/(1024*1024), 1), 'M') size,
CONCAT(ROUND(data_length/(1024*1024), 1), 'M') data,
CONCAT(ROUND(index_length/(1024*1024), 1), 'M') indx,
ROUND(index_length/data_length, 2) ratio
FROM information_schema.TABLES
ORDER BY data_length + index_length DESC;

(via Boris Huisgen)

Verifica dei certificati SSL

Pannello / PanelUno studio ha dimostrato che non è una bella idea verificare i certificati con chiamate alle librerie, ma è meglio delegare il compito a chi lo sa far bene, come il browser.

Il problema risiede nel modo in cui vengono utilizzate le API delle librerie, non si tratta, quindi, di una vulnerabilità intrinseca delle librerie medesime.

Secondo lo studio citato, le diverse API SSL espongono funzioni di basso livello e non offrono la possibilità di chiamare una serie di funzioni cappello con pochi e chiari parametri che permettono di effettuare la verifica di un certificato in maniera affidabile. Spesso i programmatori, vuoi per leggerezza, vuoi per poca informazione, interpretano male la documentazione delle funzioni e finiscono per commettere errori che espongono gli applicativi a vulnerabilità serie.

Un’ipotesi formulata dalla pubblicazione è che in almeno un caso, quello dell’applicazione Android di Chase Bank, la vulnerabilità introdotta a livello applicativo sia il retaggio di un codice di test che bypassa la verifica del certificato rimasto per errore anche nel codice finale. (via Bruce Schneier)

Un linguaggio senza ‘if’

Vanno bene i concetti di no frills e low cost, ma ci dovrebbero essere dei limiti ragionevoli.

Questa mattina ho rinnovato un account di mail che devo avere per rispetto della legge e che acquisto dal fornitore che fa il minor prezzo. Insomma: la mailbox PEC per la mia società.

Una volta confermati i dati anagrafici e selezionata l’offerta desiderata (3 anni per la PEC meno cara) mi si è presentata davanti una videata di cui riproduco a fianco un pezzo.

Sfido qualsiasi programmatore a riuscire a far passare un software con un output simile senza essere, giustamente, coperto di insulti.

Countdown personalizzato

Come sviluppatore ho una decisa avversione verso il sistema di computo del tempo attualmente in uso.

Utilizzare cicli nidificati con periodi variabili da 7 a 24 a [28,29,30,31] a [59,60,61] a [365,366] unità per contare la medesima cosa non è esattamente quello che fa felice un programmatore. Se poi si aggiunge un lunedì festivo che va innanzi e indietro nel calendario a seconda (letteralmente) di come gli gira la luna, abbiamo completato il teatrino.

Nonostante i linguaggi attuali abbiano ricche funzioni di libreria per limitare i danni di questo metodo di computo del tempo figlio di tradizioni antiche mai cambiate, c’è ancora qualcuno che ne cade vittima:

Come tutti sappiamo che 19 Zellini fanno una Falce e che 17 Falci fanno un Galeone, sappiamo anche che 24 ore fanno un giorno, quindi il conto alla rovescia di cui sopra dovrebbe essere scritto (magari con un font più leggibile) -5g 3h eccetera.

Leggi tutto “Countdown personalizzato”

SHA-3

NEOS: Istruzioni di sicurezza Boeing 737-800Il NIST ha scelto l’algoritmo da utilizzare per la funzione hash SHA-3: la funzione Keccak (pron. [kɛtʃak] come ketchup) ideata da Guido Bertoni, Joan Daemen, Michaël Peeters e Gilles Van Assche.

Gli algoritmi di hash sono molto utili nell’informatica e nella crittografia.

In informatica si possono usare per confrontare più velocemente stringhe più lunghe: se voglio, ad esempio, individuare tutti i file uguali tra loro su un disco mi conviene creare un hash associato ad ogni file (con il suo path), metterli in ordine e verificare i doppi. Questo permette di elaborare delle stringhe di pochi byte anziché file considerevolmente più grossi.

In crittografia le funzioni di hash sono parte integrate dell’infrastruttura a chiave pubblica.

Leggi tutto “SHA-3”

La sicurezza dei database è in mano agli sviluppatori

Controllo siluri / Torpedo consoleAgli sviluppatori delle applicazioni che usano i database, ovviamente.

Dark Reading raccoglie in un articolo un decalogo di consigli per gli sviluppatori che vogliono mitigare i problemi di sicurezza delle applicazioni che utilizzano database (tipicamente SQL, ma non necessariamente).

Alcune norme sono ovvie e ne abbiamo parlato anche noi: la prima in assoluto è la SQL injection, molto più diffusa di quello che si possa credere. Basta, infatti, che un solo campo di un’intera applicazione non venga opportunamente sanificato per mettere a repentaglio la sicurezza dell’intero progetto.

Il secondo errore più comune commesso dagli sviluppatori è l’eccesso di informazioni di errore visualizzate all’utente. Ci dicono che non dobbiamo essere criptici nella messaggistica, però è anche bene evitare di esagerare per non rivelare involontariamente dati che potrebbero essere utili per un attacco mirato.

Leggi tutto “La sicurezza dei database è in mano agli sviluppatori”

Fammi eseguire il dannato script!

Chi si è avvicinato all’utilizzo della PowerShell ha cozzato quasi subito con la bella feature che impedisce di eseguire gli script.

Sembra una barzelletta, ma l’interprete di script di Microsoft per default non esegue gli script non firmati. Nulla di grave perché un Set-Execution-Policy Unrestricted rimette le cose a posto.

Nonostante ciò, oggi non riuscivo ad eseguire uno script che avevo caricato su un server di un cliente nonostante la policy Unrestricted confermata anche da Get-Execution-Policy.

Il problema era che avevo scaricato da Internet lo script: l’avevo creato a casa mia, l’avevo compresso e caricato su uno dei miei server e da lì l’avevo scaricato sul computer a cui ero connesso in VPN.

Tanto è bastato per far arrabbiare PowerShell.

Leggi tutto “Fammi eseguire il dannato script!”