Blog

Tuesday 01 March 2011

read/add comments (2)

Un po’ per burla, un po’ per sincera curiosità, ho installato Emacs sul mio computer.

Non sono rimasto sorpreso quando mi sono reso conto che l’applicazione compare sia nella categoria Accessories che nella categoria Programming: più che altro, mi ha stupito che manchi da tutte le altre.

Sunday 13 February 2011

read/add comments (3)

Oggi mi è stato chiesto di configurare una chiavina Internet Tre su un portatile con Ubuntu 10.04. Mi ero preparato al peggio (ho avuto a che fare con una chiavina simile un po’ di tempo fa, non era stata un’esperienza piacevole), ma la mia preparazione non copriva in alcun modo quello che ho visto.

Appena inserita la chiavina, questa viene riconosciuta come unità ottica: trucco standard per dispositivi di questo tipo, che hanno una piccola memoria flash interna contenente i driver, la quale viene nascosta al sistema operativo una volta che i driver in questione sono stati installati.

Dentro la finta unità ottica ci sono una manciata di file, tra i quali spiccano due directory dal nome piuttosto interessante: Linux e Linux Driver. Interessante, dicevo, soprattutto perché sulla scatola non si accenna in alcun modo al supporto per il pinguino…

La directory Linux Driver contiene un tarball, quindi lascio perdere per il momento e guardo dentro l’altra: i file chiamati autorun.sh e install_linux sembrano essere molto promettenti.

Ovviamente a questo punto mi scontro con il fatto che nessuno dei due file è marcato come eseguibile, e non si possono cambiare i permessi in un filesystem read–only, quindi copio tutto nella home ed eseguo install_linux come root (autorun.sh è solo un piccolo wrapper).

Succede qualcosa! Lo script mi chiede dove installare il programma, proponendo una directory sotto /usr/local. Mi sembra il posto migliore dove relegare dei loschi eseguibili di dubbia qualità, quindi accetto. A questo punto salta fuori un xterm, sul quale scorrono tutta una serie di scritte – scompatta cose in /usr/src? Cerca di compilare un modulo del kernel? Sta usando in qualche modo ndiswrapper? Troppo veloce per capirlo – che si fermano pochi secondi dopo, lasciando una scritta rossa che mi suggerisce di installare make, gcc e gli header del kernel.

Torno in cima all’xterm, cercando di capire cosa diavolo abbia cercato di fare quello script, e ho appena iniziato a leggere quando compare una finestra, grande, con davanti una più piccola: quest’ultima i chiede il codice PIN, ed entrambe sembrano uscite da Windows XP, decorazioni comprese.

Inserisco il PIN, pigio “Connetti”, e dopo pochi istanti si apre il browser. Si è effettivamente connesso.

Faccio un giro veloce in /usr/local, e trovo 47MB di librerie varie, compresa una copia delle Qt, più tutta una serie di eseguibili, sia in formato 32bit che 64bit, più altri file binari divisi in directory che hanno il nome di distribuzioni. Ubuntu e Debian brillano nella loro assenza.

Conclusione: la chiavina funziona. Non so come faccia. Non credo di volerlo sapere. Quello che posso fare è sperare in un futuro in cui i produttori di hardware, invece di pagare persone per stare chiuse in uno scantinato a scrivere in totale segretezza loschi driver per Linux, paghino li stessi tizi per mantenere quei driver all’interno del kernel, e lascino perdere gli orrendi programmini personalizzati per passare a Network Manager, eventualmente contribuendo allo sviluppo delle funzionalità che ritengono necessarie.

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.

Monday 29 November 2010

read/add comments (6)

A quanto pare, per mandare in confusione un router è sufficiente collegare entrambe le estremità di un cavo Ethernet. Semplice e veloce.

Quello che è molto meno veloce è, per chi arriva a fatto avvenuto, capire come mai non solo Internet non funzioni, ma l’arnese si rifiuti persino di assegnare indirizzi IP.

Insomma, un (tipico?) caso di PEBRAR.