Ho trovato un buggettino a cElementTree!

Giorni fa ho trovato il mio primo bug in un codice sorgente “serio”!

Playing with PyInstaller I have found that the final part of _elementtree.c:
Index: Modules/_elementtree.c
===================================================================
--- Modules/_elementtree.c (revisione 59540)
+++ Modules/_elementtree.c (copia locale)
@@ -2780,7 +2780,10 @@

);

- PyRun_String(bootstrap, Py_file_input, g, NULL);
+ if (PyRun_String(bootstrap, Py_file_input, g, NULL) == NULL) {
+ m = PyErr_Occurred();
+ return;
+ }

elementpath_obj = PyDict_GetItemString(g, "ElementPath");

execute a bit of python code without checking the return value.
That can lead to weird things playing with import hooks,
for example an assert like this can fail:

Continua a leggere

Lavoro

Ho cominciato a lavorare! Lavoro per la [Develer](http://www.develer.com/), azienda di sviluppo software e non solo, credo di aver capito specializzata nel non specializzarsi.

Sono stato assegnato ad un progetto interno un po’ noioso che consiste nell’adattare [Achievo](http://www.achievo.org/) per consentire la visione delle statistiche delle ore lavorate anche ai clienti, limitando l’accesso ai soli progetti a cui i clienti sono interessati.

Nel farlo ho notato che Achievo è un po’ limitato nell’interfaccia di gestione delle ore lavorate, prevede l’inserimento di un giorno e di un numero di ore.

Lavorando con orari liberi in Develer, il totale ore è spesso la somma di strani intervalli, tipo *10:30-12:30 + 13:50-19:20*

Continua a leggere

Prestazioni delle tabelle partizionate in PostgreSQL

Uso di informazioni statistiche e partizionamento delle tabelle per incrementare le performances in PostgreSQL

Variazione del tempo di query in funzione del numero di record inseriti

*In rosso i tempi di accesso delle tabella unica (prova1) in verde i tempi della tabella partizionata (prova2) al crescere delle dimensioni dell’archivio.*

Per una presentazione del problema: [tagschema.com](http://tagschema.com/blogs/tagschema/)

Piccoli archivi crescono

Il database che contiene i dati della mia tesi ha raggiunto dimensioni considerevoli!!

La tabella di collegamento principale ha raggiunto i 4 milioni di record!! wow!

La tesi si propone lo studio di metodi di suggerimento mirati per il singolo utente, però il problema della velocità di calcolo si fa sentire anche con solo 2000 utenti inseriti.

È possibile però osservare che, come in tutti gli archivi di risorse internet, il 90% dei bookmark di ogni utente sono pesonali e non condivisi con nessun altro utente ([long tail](http://en.wikipedia.org/wiki/The_Long_Tail)).

Quindi selezionando solo le risorse condivise fa almeno 2 utenti, la parte attiva del database viene ridotta ad un decimo.

Operando su questo dataset, ho considerato l’intero insieme degli href come una previsione per l’utente, previsione valutabile ad esempio con l’uso di indici come la Precisione ed il Recupero (Precision and Recall).

Si definisce *Precisione* di una predizione:

Precisione = {numero predizioni corrette}/{numero totale predizioni}

Si definisce *Recupero* di una predizione:

Recupero = {numero predizioni corrette}/{numero totale elementi da predire}

Ad esempio, se dovendo indovinare 6 numeri, si fa una previsione di 10 numeri, di cui 3 risultano corretti, Precisione e Recupero risultano pari a:

* Precisione = 3 / 10 = 30%
* Recupero = 3 / 6 = 50%

Possiamo immaginare l’intero insieme degli href come una previsione con
Precisione minima e Recupero massimo.

Possiamo selezionare solo gli href associati agli N user vicini
all’utente candidato.

Confrontando la scelta basata su due kernel normalizzati,
con la scelta casuale degli N utenti “vicini” abbiamo le seguenti
prestazioni:

Precision and Recall

Quindi, usando il kernel prodotto scalare, abbiamo un Recupero del 40% con soli 30 utenti, mentre selezionando casualmente gli utenti, per avere lo stesso Recupero ne sono necessari 150.

Modificare il titolo del teminale da Python

Una delle particolarità di gentoo è l’attenzione ai particolari, ed una delle caratteristiche che rimpiango in altri gestori di pacchetti è l’uso intelligente della barra del titolo della finestra del terminale per comunicare lo stato di avanzamento di una lunga installazione.

Andando a scavare nei sorgenti di portage ho trovato una comoda funzione, xtermTitle(message) (nel file output.py), che modifica il titolo di xTerm (o similari) con il messaggio inviato.

Qua ho adattato (minimamente) la funzione ai miei usi:


def xtermTitle(message):
if os.environ.has_key("TERM") and sys.stderr.isatty():
this_term = os.environ["TERM"]
legal_terms = ["xterm", "Eterm", "aterm", "rxvt",
"screen", "kterm", "gnome"]
for term in legal_terms:
if this_term.startswith(term):
sys.stderr.write("\x1b]2;" + str(message) + "\x07")
sys.stderr.flush()
break

Funziona egregiamente, e fa rimpiangere un po’ meno l’assenza di Growl quando parto con Ubuntu.