GrammyClient 0.1


Alla fine è nato! Dopo un bel poco di settimane di sviluppo (a causa dei miei impiegni universitari) vede finalmente la luce GrammyClient 0.1, un semplicissimo client che permette di scaricare comodamente sul proprio desktop le canzoni presenti nell’enorme archivio di grammy.ru. L’applicazione è stata totalmente scritta usando la libreria PyQt4 e il parser HTML/XML BeautifulSoup, senza il quale sarebbe stato impossibile proseguire nello sviluppo.

Potete scaricare il file binario per Windows XP/Vista/7 da questa pagina. Per usare l’applicazione è necessario scaricare e installare Python versione 2.6 o 2.7 (scaricabili qui).

GrammyClient è dotato di una semplicissima interfaccia grafica, spero abbastanza intuitiva da essere capita e usata al primo (o secondo) colpo. Di seguito riporto uno screenshot:

Come potete vedere, l’interfaccia è essenziale, divisa in 3 colonne. Nella colonna più a sinistra abbiamo un campo di ricerca, in cui inserire l’artista da cercare. Non occorre che inseriate il nome completo, basta anche una porzione; il motore di ricerca del sito ricercherà tutte quelle voci che contengono la stringa da voi inserita.

Al di sotto del campo di ricerca compariranno i risultati della ricerca: una tabella con i nomi degli artisti e il numero di tracce audio che potete scaricare. Facendo doppio click su una riga (o usando il menu contestuale) potrete visualizzare nella colonna centrale gli album associati all’artista. Facendo nuovamente doppio click sul titolo di un album potrete vedere sulla colonna più a destra l’elenco delle canzoni contenute nell’album.

Per scaricare una canzone basta fare doppio click sul suo titolo. Comparirà una finestra di dialogo che vi permetterà di scegliere dove salvare il file.

In ogni istante solo 4 download possono avvenire contemporaneamente. Se aggiungete più di 4 download, quelli in eccesso verranno messi in coda in attesa del completamento di uno dei primi 4. Questo limite è imposto dai server di grammy.ru per limitare i download simultanei.

L’applicazione è naturalmente in uno stato embrionale, ma funziona dignitosamente. Non esitate a contattarmi per qualsiasi malfunzionamento. Coerentemente con i miei impegni accademici cercherò di correggere eventuali bachi.

VirtualBox(R) Images: statistiche annuali


Dopo un anno di esistenza del progetto VirtualBox(R) Images, fondato da Emanuele Cipolla e portato avanti anche da me, mi piace tirare le somme di questa interessante esperienza.

Il progetto nacque nel gennaio del 2008 e dopo un anno ha raggiunto dei livelli di successo davvero inaspettati, forse perchè siamo stati i primi ad offire un servizio del genere per la piattaforma di virtualizzazione VirtualBox(R) o forse perchè abbiamo fatto un buon lavoro (o forse abbiamo avuto solo culo 😀 ).

All’inizio il progetto forniva immagini di poche distro di Linux (Debian, Slackware, OpenSUSE); oggi le distribuzioni di Linux son ben 23, dalla piccola Damn Small Linux alla distribuzione server-oriented CentOS. Oltre a distribuzioni di Linux il progetto fornisce immagini di sistemi basati su OpenSolaris (Nexenta, Milax, Indiana) e immagini di sistemi “non convenzionali”, come Haiku, AROS, ReractOS.

Vediamo un poco di numeri. Questo grafico mostra il numero di visite al sito del nostro progetto a partire dal gennaio 2008

Statistiche del 2008
Statistiche del 2008

Dalle 1805 visite di gennaio 2008 siamo passati alle 43315 visite di dicembre 2008; le visite sono quasi raddoppiate rispetto al mese di ottobre.

Passiamo adesso al grafico che mostra il numero di download e la quantità di dati scaricata.

detail-graph2008

Il picco è stato raggiunto nel mese di novembre con ben 8035 download, per un totale di 2.6 TB! Come è possibile vedere dal grafico, per tutto l’anno il numero di download mensili ha subito un incremento davvero notevole. In totale, sono stati effettuati 39487 download, per un totale di 12.6 TB di immagini.

Speriamo di continuare a mantenere questi notevoli risultati anche nel 2009!

Buon anno

VirtualBox® Images: che successo!


Arrivato alla fine di ogni mese mi piace guardare le statistiche del progetto VirtualBox® Images, che porto avanti da qualche mese insieme all’amico Emanuele.

Il numero di visite al sito del progetto è aumentato in maniera considerevole rispetto agli inizi, come si evince da questo grafico

Nel mese di ottobre abbiamo ricevuto ben 26141 visite, 5300 in più rispetto al mese di settembre. Un successo davvero notevole, che va ben oltre le nostre aspettative.

Passiamo ad un altro dato interessante e forse più concreto: il numero di download effettuati e il numero di TB serviti fino ad oggi.

Ecco un altro grafico

Dal grafico possiamo vedere come nel solo mese di ottobre siano stati fatti circa 5000 download di immagini dal nostro spazio su Sourceforge.net, per un totale di circa 1.6 TB di dati! Dalla creazione del progetto sono stati scaricati circa 7.4 TB di immagini da Sourceforge.net, per un totale di 24,244 download. Davvero notevole, se si considera che il progetto viene mandato avanti da studenti universitari con poco tempo libero e squattrinati!

Il numero delle distribuzioni di GNU/Linux che attualmente sono disponibili è pari 18 e c’è la volontà di aumentarne il numero e di creare immagini adatte a scopi più specifici:finora abbiamo soltanto fornito immagini general purpose, configurate in modo da funzionare, ma senza alcuna caratteristica in più. Sarebbe interessante creare immagini più specializzate, orientate per esempio allo sviluppo software o allo sviluppo per il web.

Abbiamo aperto il nostro progetto anche alle distribuzioni di OpenSolaris, come la Nexenta o come il progetto Indiana della Sun Microsystems.

Speriamo di migliorare ulteriormente i risultati per il futuro!

Performance di alcuni linguaggi di programmazione


Non avendo nulla di meglio da fare, mi son messo a valutare le performance di esecuzione dei linguaggi che conosco nella risoluzione del “Problema di Flavio Giuseppe”, la cui soluzione vi permetterà di salvarvi nel caso abbiate deciso all’ultimo minuto di salvarvi da un suicidio di massa (leggete prima in cosa consiste il problema per capire la battutaccia 🙂 ).

Ho testato le prestazioni di C, Java, Python, Ruby, C# usando per tutti le stesse condizioni:

  • 100000 iterazioni
  • risoluzione, ad ogni iterazione, del problema che dovette affrontare Flavio Giuseppe in persona: 40 partecipanti al suicidio e determinazione del prossimo suicida contando a 3 a 3 a giro

I test sono stati fatti con questa configurazione:

OS: Mac OS 10.5.4

CPU: Intel(R) Core(TM)2 CPU T7600 @ 2.33GHz

RAM :2 GB

Il risultato del test è dato dal tempo medio (su 10 test )per ogni iterazione espresso in microsecondi.

Ecco la tabella dei risultati.

Linguaggio Versione Note Tempo medio per iterazione (microsecondi)
Ansi C Compilatore: i686-apple-darwin9-gcc-4.0.1 (GCC) 4.0.1 (Apple Inc. build 5465) Compilazione con flag -O3 0.235951
Ansi C++ Compilatore: i686-apple-darwin9-g++-4.0.1 (GCC) 4.0.1 (Apple Inc. build 5465) Compilazione con flag -O3
Uso di funzioni inline
0.205846
C# Mono Framework – 1.9.1_3 0.846871
Java java version “1.5.0_13” 1.898368
java version “1.6.0_5” 0.665434
Python Python 2.5.1 (r251:54863, Jan 17 2008, 19:35:17) 24.0439097881
Uso del compilatore JIT Psyco 1.6 5.55800628662
Ruby ruby 1.8.6 (2008-03-03 patchlevel 114) 55.700048

Per analizzare i risultati occorre precisare che mi sono rifatto allo standard C89 per il C (che non prevede le funzioni inline); ecco perchè il C++ con le funzioni inline risulta più performante.

Se provate a compilare i sorgenti C che seguono mettendo la parola chiave inline nell’implementazione della funzione e compilando usando il flag -std=c99 vedrete che le prestazioni di C e C++ saranno uguali. Nel C++ ciò che fa perder prestazioni è il binding tardivo: polimorfismo, template ecc.

Con notevole sorpresa, ho constatato come la JVM non sfigura affato; addirittura con Java 6 i tempi medi sono più che dimezzati.

I fanalini di coda (c’era da aspettarselo) sono Python e Ruby, col primo in vantaggio sul secondo; per l’occasione ho sperimentato in Python l’uso di Psyco, un compilatore JIT, e devo dire che i risultati si vedono: l’esecuzione del codice col modulo Psyco attivo è più veloce di circa l’80% rispetto a quella senza Psyco.

L’algoritmo che ho usato per risolvere il problema è trattato in questa pubblicazione; tale algoritmo ha una complessità pari a O(m + \log_{\frac{m}{m-1}} \left ( \frac{n}{m} \right ) ), dove n è il numero di persone nel gruppo e m è il numero usato per la conta.

Di seguito troverete il codice usato per fare il test nei vari linguaggi.

Codice C:
Continua a leggere “Performance di alcuni linguaggi di programmazione”

registerimage 1.0.3


Ho completamente riscritto in Python registerimage, la mia applicazioncina per registrare le immagini virtuali preconfezionate del progetto VirtualBox Images.

Ho deciso di usare Python per vari motivi:

  • per imparare un nuovo linguaggio;
  • per aumentare la portabilità;
  • per realizzare un’applicazione self-contained;

Questa nuova versione di registerimage non usa alcuna libreria esterna, ma solo moduli nativi della Python Standard Library; non uso più la libxml2 per fare il parsing dei file .xml, ma uso il modulo built-in xml.dom.minidom.

Ho semplificato pure l’interfaccia del programma; questa nuova versione prende sempre due argomenti in input dalla riga di comando:

  1. il path del file .xml di configurazione della macchina virtuale scaricata dal nostro progetto;
  2. il path del file .vdi della macchina virtuale;

L’utente non avrà più la necessità di spostare a mano i file .xml e .vid: ci pensa il mio programma a farlo.

Per usare la nuova versione di registerimage avrete bisongno di un interprete Python (versione >= 2.5); potete scaricare quello per Windows cliccando qui. Nei sistemi GNU/Linux e Mac OS X spesso Python è già preinstallato.

Prima di lasciarvi, devo fare un altro piccolo appunto per gli utenti Window: per usare l’interprete Python dalla riga di comando occorre che modifichiate la variabile d’ambiente PATH in modo che contenga il path dove avete installato l’interprete. A chi non sapesse come modificare tale variabile, consiglio di leggere questa guida.
Nell’immagine seguente trovate uno screenshot di come dovreste settare la variabile PATH

Ecco uno screenshot che mostra come ho usato registerimage per registrare l’immagine del sistema MINIX 3.1.2

Potete scaricare lo script cliccando qui.

Come ordinare e “ripulire” una wordlist gigante


In questi giorni ho contribuito ad aumentare la temperatura della mia stanza facendo lavorare come un matto il mio povero computer.

Mi sono ritrovato con una wordlist da 700MB con più di 75 milioni di parole; mi sono accorto che era piena di ripetizioni: la sola lettera “a” compariva 59 volte!

Mi sono ingegnato per risolvere il problema.

Occorreva innanzitutto ordinare la wordlist.

Per fare questo ho pensato di usare il comando sort dei sistemi Unix. Purtroppo il file gigante è codificato in unicode e sort si incazza un poco.

Per risolvere il problema ho reimpostato la variabile LC_ALL in questo modo:

export LC_ALL=C; sort wordlist.txt > sortedwordlist.txt

Dopo un poco di elaborazione, mi sono ritrovato con un bel file ordinato.

Occorreva eliminare le ripetizioni. Per fare questo ho implementato un piccolo script Python.
Ecco il codice:

#!/usr/bin/python

from __future__ import with_statement
import sys

with open(sys.argv[1],'w' ) as fileoutput:
	with open(sys.argv[2],'r' ) as fileinput:

		oldline=''

		for line in fileinput:

			if line!=oldline:
				fileoutput.write(line)

			oldline=line

Il primo argomento dello script è il file di output, il secondo è il file di input.

Dopo un poco di elaborazione, mi sono ritrovato una bella wordlist di 441 MB, 260MB in meno di quella di partenza; nella wordlist iniziale c’erano circa 35 milioni di ripetizioni!

Dive Into Python


In questi giorni mi sono “immerso” nello studio del Python, un interessante linguaggio di scripting che mi ero promesso di imparare data la sua crescente diffusione nel mondo del software open (e non).

La rete mi ha aiutato tantissimo: su Internet trovate tonnellate di documentazione, a partire dal sito ufficiale del linguaggio.

Come prima prova con Python, ho provato ad implementare registerimage-1.0.2, il software che ho scritto per automatizzare la registrazione delle immagini virtuali del progetto VirtualBox Images con il software VirtualBox della SUN.

La cosa che colpisce del Python è la semplicità enorme di codificazione; abituato a certe “astrusità” del C, programmare in Python è molto semplice e scorrevole.

Ecco un piccolo confronto tra l’implementazione in C di una funzione di registerimage-1.0.2 e quella in Python.

La funzione in questione effettua un parsing del file di configurazione della macchina virtuale che si vuole registrare per ottenere i parametri salienti della macchina virtuale stessa.

Versione C:
Continua a leggere “Dive Into Python”

Montare un file system HFS+ su Linux


In questi giorni ho avuto la necessità di montare un file system HFS+ sulla mia Debian Etch.

Cercando nella documentazione del kernel ho trovato che il che il kernel 2.6 supporta in lettura/scrittura i volumi formattati con HFS e HFS+.

Per chi non lo sapesse, HFS era il file system usato dai Macintosh dal 1985 al 1998; a partire da quest’ultima anno la Apple ha rilasciato HFS+, una versione migliorata del precedente file system.

Attualmente HFS+ con journaling è il file system di default dei sistemi operativi Apple.

Per maggiori informazioni vi rimando alle pagine di Wikipedia (HFS e HFS+).

Per potere leggere/scrivere su in file system HFS+ occorre disabilitare il Journaling.

Su Mac OS X è possibile farlo da riga di comando in maniera molto semplice:
diskutil disableJournal volumeName

Dopo essersi assicurati che il journaling sia disabilitato, occorre vedere se il nostro kernel è configurato in modo adatto.

Per vedere se il sistema riconosce i file system hfs e hfsplus digitiamo da riga di comando:

cat /proc/filesystems|grep 'hfs'

Se vi compare qualcosa di simile a questo:

significa che avete caricato i moduli hfs e hfsplus nel vostro sistema e che quindi potete montare i vostri volumi HFS o HFS+ senza journaling in lettura e scrittura.

Verificate se avete compilato o meno i moduli relativi a hfs e hfsplus: se sono già compilati potete aggiungere hfs e hfsplus al file /etc/modules (in una Debian-based, altrimenti in un file di inizializzazione locale su qualunque altra distribuzione) e riavviare; viceversa occorrerà ricompilare il kernel.

I moduli li trovate nella sezione File Systems -> Miscellaneous File Systems del menù di configurazione del kernel.

Se decidete di compilarli come moduli, dopo l’installazione del kernel fate in modo che siano caricati all’avvio.

registerimage 1.0.2


Il rilascio della versione 1.6 di VirtualBox della Sun mi ha portato ad effettuare qualche importante modifica al mio software registerimage per la registrazione automatica delle immagini virtuale create per il progetto VirtualBox Images.

L’ultima versione rilasciata è quindi la 1.0.2 (come si evince dal titolo del post).

L’ultima versione di VirtualBox ha introdotto delle novità nella struttura del file di configurazione di ciascuna macchina virtuale; questo ha reso inutilizzabile la versione 1.0.1 di registerimage, la quale è implementata per gestire solo la versione 1.2 del file xml.

La versione 1.0.2 introduce alcune novità:

  1. modifiche “stilistiche” nel codice.
  2. meccanismo di parsing dell’input da terminale più “intelligente” di quello usato nella versione 1.0.1.
  3. miglioramento nella procedura di registrazione delle immagini virtuali (adesso il programma sa gestire in maniera più funzionare i casi in cui l’hard disk virtuale è stato precedentemente registrato o i casi in cui si prova a ri-registrare un’immagine).
  4. meccanismo di conversione dei vecchi file xml versione 1.2 in file xml versione 1.3 (è quindi garantita la compatibilità tra le vecchie immagini presenti online e la nuova versione di VirtualBox)

Come al solito potete scaricare i sorgenti cliccando qui e il binario per Windows cliccando qui.

Non scaricate questa versione. Scaricate l’ultima versione (la 1.0.3) qui