GrammyClient 0.1.1: bugfix


Ho corretto un piccolo baco di GrammyClient. Adesso la gestione della finestra di download delle tracce MP3 avviene in maniera corretta. Potete scaricare l’ultima versione del programma da questo link se usate Python 2.7 o da questo link se usate Python 2.6. Potete scaricare Python 2.6.x o Python 2.7.x da questo link.

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.

Chromium updater


Per passatempo ho scritto in questi giorni un piccolissimo script python che controlla se esiste una nuova versione per il browser Chromium per Mac OS X; in tal caso scarica il file .zip da http://build.chromium.org/buildbot/snapshots/chromium-rel-mac, lo scompatta e salva l’applicazione Chromium.app sul Desktop, in modo che successivamente l’utente possa copiarla dove meglio crede.

Potete scaricare lo script cliccando qui.

Ecco il codice
Continua a leggere “Chromium updater”

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

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”