jump to navigation

GrammyClient 0.1 6 dicembre 2010

Posted by fripp in C++, GNU/Linux, Informatica, Mac OS X, Musica, Programmazione, Python, Scripting, Unix, Windows.
Tags: , , , , , , , , , , , ,
3 comments

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.

Annunci

Chromium updater 21 agosto 2009

Posted by fripp in Browser, Chrome, Chromium, Informatica, Mac OS X, Programmazione, Python, Scripting, Sistemi Operativi, Unix.
Tags: , , , , , , , , ,
6 comments

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
(altro…)

Performance di alcuni linguaggi di programmazione 14 luglio 2008

Posted by fripp in About me, Algoritmi, C, GNU/Linux, Informatica, Java, Mac OS X, Matematica, Programmazione, Python, Ruby, Sistemi Operativi, Unix.
Tags: , , , , , , , , , , , ,
add a comment

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:
(altro…)

registerimage 1.0.3 10 luglio 2008

Posted by fripp in About me, Debian, GNU/Linux, Informatica, Mac OS X, Programmazione, Python, Sistemi Operativi, Ubuntu, Unix, VirtualBox Images, Windows.
Tags: , , , , , , , , , ,
add a comment

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 22 giugno 2008

Posted by fripp in GNU/Linux, Informatica, Mac OS X, Ordinamento, Programmazione, Python, Scripting, Sistemi Operativi, Unix.
Tags: , , , , , , , , , ,
3 comments

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!

Mandare email a più persone usando AppleScript 9 giugno 2008

Posted by fripp in AppleScript, Informatica, Mac OS X, Programmazione, Sistemi Operativi.
Tags: , , ,
4 comments

Mi capita spesso di dover mandare la stessa email a tutte le persone del gruppo LiberaMente, di cui faccio parte.

Per automatizzare la cosa, ho creato un piccolo script AppleScript.

Ecco il sorgente:


set date_dialog to display dialog "Inserisci l'oggetto" default answer ""
set the_subject to text returned of date_dialog

tell application "Address Book"
    set name_list to every person of group "Liberamente"

    set email_value_list to {}
    
    repeat with p in name_list

        set end of email_value_list to value of every email of p

    end repeat

end tell

tell application "Mail"
    activate

    set new_message to make new outgoing message with properties {subject:the_subject, visible:true}

    tell new_message
        repeat with i from 1 to (count email_value_list)

            repeat with j from 1 to (count item i of email_value_list)
                make new to recipient with properties {address:item j of item i of email_value_list}
            end repeat

        end repeat

    end tell

end tell

Vediamo in breve come funziona.

Il primi due righi di codice
set date_dialog to display dialog "Inserisci l'oggetto" default answer ""
set the_subject to text returned of date_dialog

fanno comparire una finestra di dialogo che permette all’utente di inserire l’oggetto della mail.

Il blocco di codice

tell application "Address Book"
	set name_list to every person of group "Liberamente"
	
	set email_value_list to {}
	
	repeat with p in name_list
		
		set end of email_value_list to value of every email of p
		
	end repeat
	
	
	
end tell

estrae dalla Rubrica Indirizzi tutti i membri del gruppo “Liberamente” e li memorizza nella variabile name_list.
Il successivo ciclo repeat estrae le email di tutti i membri del gruppo e li aggiunge alla lista email_value_list.

Il successivo blocco tell dice a Mail di creare un nuovo messaggio di posta avente come oggetto quello inserito dall’utente:
set new_message to make new outgoing message with properties {subject:the_subject, visible:true}.

Il successivo blocco tell serve per inizializzare la lista dei destinatari con tutte le email contenute in email_value_list.

Dive Into Python 4 giugno 2008

Posted by fripp in GNU/Linux, Informatica, Mac OS X, Programmazione, Python, Scripting, Sistemi Operativi, Unix, VirtualBox Images.
Tags: , , , , , ,
add a comment

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:
(altro…)

Montare un file system HFS+ su Linux 28 maggio 2008

Posted by fripp in Debian, GNU/Linux, Informatica, Mac OS X, Sistemi Operativi, Ubuntu, Unix.
Tags: , , , , ,
1 comment so far

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 12 maggio 2008

Posted by fripp in C, Debian, GNU/Linux, Informatica, Mac OS X, Programmazione, Sistemi Operativi, Ubuntu, Unix, VirtualBox Images, Windows.
Tags: , , , , ,
1 comment so far

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

Quickselect 8 maggio 2008

Posted by fripp in Algoritmi, C, C++, Debian, GNU/Linux, Informatica, Java, Mac OS X, Matematica, Ordinamento, Programmazione, Quickselect, Quicksort, Selezione, Sistemi Operativi, Unix.
Tags: , , , , ,
add a comment

Il Quickselect è un algoritmo randomizzato ricorsivo che trova l’elemento che si troverebbe in k-esima posizione se l’array in cui si trova fosse ordinato.

Su un array di grandezza n l’algoritmo esegue O(n^2) confronti nel caso peggiore e O(n) nel caso atteso. Si basa sull’algoritmo Quicksort.

L’idea di base che sta alla base dell’algoritmo è molto semplice: se si deve estrarre l’elemento che si troverebbe in k-esima posizione se l’array fosse ordinato, basta ordinare di volta in volta la porzione dell’array in cui l’elemento si troverebbe, trascurando il resto dell’array.

Ecco un’implementazione in C di questo algoritmo:
(altro…)