Blog

Wednesday 26 January 2011

read/add comments (3)

Oggi ho passato una mezza giornata a rifattorizzare il mio codice.

Sposta una classe di qua, un metodo di là, aggiusta questo e quello in modo che i campi siano pubblici solo quando è strettamente necessario e che non ci sia né troppo stato all’interno dell’oggetto né troppi parametri nelle chiamate ai metodi.

Mentre facevo questo lavoro, spesso meccanico e quasi sempre poco appagante, che ha portato il mio programma a smettere di funzionare almeno una decina di volte, maledivo me stesso per non aver seguito un design migliore fin dal principio.

Poi ho realizzato.

Una delle cose positive del lavorare quotidianamente nell’ambiente del Software Libero è che, con l’andare del tempo, acquisisci automaticamente alcune buone abitudini, come quella di utilizzare sempre un VCS, quella di scrivere codice portabile, quella di utilizzare un build system decente, quella di documentare almeno un po’ il tuo lavoro. Lavori, insomma, partendo dal presupposto che qualcuno prima o poi possa voler mettere mano al tuo codice, e cerchi di fare sì che la sua esperienza non si riveli un incubo.

Tra le altre cose, questo significa anche utilizzare un buon design. Quindi, istintivamente, quando mi sono messo al lavoro su quel progetto sono partito seguendo il miglior design che sono stato in grado di sviluppare con le conoscenze che avevo in quel momento. Il quale poi si è rivelato una mezza schifezza.

Il punto chiave è proprio il fatto che, quando ho iniziato, avevo solamente una vaga idea di quello che avrei dovuto fare per raggiungere il mio scopo: mano a mano che proseguivo ho cominciato ad aggiungere librerie, molte delle quali non avevo mai usato, ho provato vari approcci che si sono rivelati poco furbi, e in generale ho riscritto più volte praticamente ogni riga del programma. Molti di questi cambiamenti mi hanno costretto a rivedere parte della mia idea iniziale.

Arrivato a quel punto, le alternative erano due: proseguire con l’implementazione, ormai quasi completa ma figlia di un design cresciuto organicamente e disordinatamente, oppure creare un nuovo design e riorganizzare il tutto. Ho scelto la strada più scomoda, ma non me ne pento.

E ho smesso pure di maledirmi da solo, dal momento che ho capito che non sarei mai riuscito a sviluppare il nuovo, migliore design se non avessi prima implementato quasi interamente l’applicazione, cosa che (ovviamente) mi ha fatto capire molto meglio il problema che stavo cercando di risolvere.

Insomma, come dice il saggio: build one to throw away.

Tuesday 04 January 2011

read/add comments (2)

Tra i vari regali di laurea ho ricevuto anche un delizioso Sony Reader Touch Edition, che sto adorando in ogni modo immaginabile. Se vi piace leggere e avete un po’ di soldi da spendere, consideratelo un investimento a lungo termine e compratene uno subito. Se ve lo regalano è anche meglio, ovviamente ;)

Finora mi sono concentrato principalmente su classici in inglese per i quali il copyright è scaduto (scaricati da Project Gutenberg) e libri con licenze permissive come quello scritto dall’amico Ivan in occasione del NaNoWriMo 2010 o quelli di Cory Doctorow. Tutta roba in formato EPUB e priva di DRM, il che rende il trasferimento sul Reader una semplice questione di copia del file.

Ora, ho acquistato dei libri su uno store online, e qui sono cominciati i casini: perché i libri che si acquistano sono quasi sempre protetti da DRM Adobe, il che significa che bisogna utilizzare ADE per caricarli sul Reader.

ADE ovviamente non è disponibile per GNU/Linux, ma gira sotto Wine; tuttavia, sotto Wine non è in grado di riconoscere il Reader e di caricarci sopra i libri. Il modo migliore per procedere è quello di rimuovere il DRM dai libri, in modo che si possano semplicemente copiare sul dispositivo. Inutile dire che questa procedura va effettuata esclusivamente su libri che sono stati acquistati in maniera legale; anche perché sono sicuro ci siano modi molto più semplici per ottenere copie piratate, nel caso uno lo desideri.

ADE non si riesce nemmeno a scaricare con GNU/Linux, quindi le alternative sono modificare gli header inviati dal proprio browser o usare il link diretto alla versione 1.7.2. Una volta installato bisogna creare un account Adobe per attivarlo.

La rimozione del DRM si effettua utilizzando inept, un piccolo tool scritto in Python. Per farlo funzionare servono Python 2.7 per Windows e PyCrypto, sempre da installare sotto Wine.

Il tool ineptkey va eseguito la prima volta per estrarre la chiave di cifratura; la riga di comando

wine ~/.wine/drive_c/Python27/pythonw.exe ineptkey.pyw

ha come risultato la creazione di un file chiamato adeptkey.der nella directory corrente.

Ora, supponendo di aver acquistato un libro online, ci si trova tra le mani con un file .acsm che ADE si rifiuta di aprire. Fantastico. Il file contiene dell’XML, e a prima vista sembra che l’elemento <src> contenga esattamente quello che ci interessa; in realtà le altre informazioni contenute nel file vengono usate in qualche modo per recuperare il file EPUB, quindi non si può fare a meno di usare ADE per il download.

Per convincere ADE ad aprire il file bisogna specificarlo sulla sua riga di comando come path in formato Windows: il che significa che, se il file si trova in /home/andrea/URLLink.acsm, bisognerà usare il comando

wine ~/.wine/drive_c/Program\ Files/Adobe/Adobe\ Digital\ Editions/digitaleditions.exe 'z:\home\andrea\URLLink.acsm'

dove il path di digitaleditions.exe potrebbe essere diverso, e il drive z: sotto Wine fa riferimento alla root del filesystem.

A questo punto ADE ha scaricato il libro, che viene salvato in ~/My\ Digital\ Editions. Per decifrare il file, si usa ineptepub, al quale bisogna dare in pasto il file adeptkey.der creato precedentemente e l’EPUB. Il risultato è un EPUB privo di DRM che si può, finalmente, copiare sul Reader.

Tutta la faccenda del DRM è insomma una grandissima fregatura. Una volta che ho acquistato un libro, lo posso caricare su massimo sei dispositivi, che devo aver autorizzato tramite ADE, dichiarandoli di fatto “miei”.

E se volessi fare qualcosa di assurdo e totalmente insensato come, che so, prestare uno dei libri che ho acquistato alla mia ragazza, che possiede a sua volta un Reader? L’unico modo che ho di farlo è condividendo un unico account Adobe. E se per caso un giorno (ciclopica toccata di palle) ci lasciassimo? E se invece che alla mia ragazza volessi per caso prestarlo ad un amico? Me ne rendo conto, sono solo speculazioni prive di fondamento. È ridicolo: chi mai potrebbe voler prestare un libro ad un amico?

Paradossalmente, mentre prestare un libro elettronico ad un amico è impossibile, rimuovere ogni protezione dallo stesso libro, e potenzialmente condividerlo con decine di migliaia di sconosciuti, è poco più complicato che tenerlo per sé, come appena dimostrato. Quindi il DRM non fa nulla per impedire la pirateria – visto che chi distribuisce copie piratate solitamente ha conoscenze molto maggiori di quelle necessarie per far girare uno script Python – e limita solamente la libertà di chi ha acquistato legalmente un libro.

Per quanto mi riguarda, cercherò sempre di acquistare libri da negozi che li offrono privi di DRM, cercando nel mio piccolo di favorire il trend. Se Cory Doctorow è diventato un autore di successo regalando i propri libri, forse il problema non è il numero di persone a cui presto i libri che ho acquistato, indipendendemente da quello che dicono le case editrici.