Visualizzazione post con etichetta Python. Mostra tutti i post
Visualizzazione post con etichetta Python. Mostra tutti i post

Python problem on ubuntu raring ringtail upgrade

If the upgrade to *buntu 13.04 raring ringtail fails on Python2.7 try to configure it:
dpkg -configure python2.7
If it fails with a message like this:
Setting up python2.7 (2.7.4-2ubuntu3) ...
Traceback (most recent call last):
  File "/usr/lib/python2.7/py_compile.py", line 170, in 
    sys.exit(main())
  File "/usr/lib/python2.7/py_compile.py", line 162, in main
    compile(filename, doraise=True)
  File "/usr/lib/python2.7/py_compile.py", line 106, in compile
    with open(file, 'U') as f:
IOError: [Errno 2] No such file or directory: '/usr/lib/python2.7/profile.py'
do not get fooled!

Probably you have a copy of that file named /usr/lib/python2.7/profile.py.distrib! So copy to the original place. You will also need to copy pstats.py.distrib.
cp /usr/lib/python2.7/profile.py.distrib /usr/lib/python2.7/profile.py
cp /usr/lib/python2.7/pstats.py.distrib /usr/lib/python2.7/pstats.py
Then you can continue with your upgrade:
dpkg -configure python2.7
dpkg -configure -a
apt-get dist-upgrade
I suspect the reason for that is an easy installed distribute. More on this later.

Come installare Python 2.6 su Precise Pangolin

La nuova Release di Ubuntu (Precise Pangolin, 12.04), ha rimosso il supporto a Python2.6 in favore di Python2.7.

Al momento non ci sono PPA dedicati all'installazione di Python2.6 per questa release.

Se volete installare una versione pacchettizzata di Python2.6 potete usare questo script (ispirato da questo thread) ovviamente a vostro rischio e pericolo ®  :) :

How to install Python 2.6 on Precise Pangolin

The new Ubuntu Release (Precise Pangolin, 12.04), dropped Python2.6 support in favor of Python2.7.

At the moment there is no PPA repository set up to install Python2.6.

If you want to install a packaged version of Python2.6 you can use this script, inspired by this thread, of course at your own risk ® :):

Ripristinare lo stato delle variabili locali in Python

Esempio istruttivo che mostra come cancellare variabili in un programma Python
Quanto leggerete qui di seguito vi mostrera' alcune tecniche che raramente userete in codice di produzione, ma nonostante tutto sono di indubbio interesse le enormi potenzialita' che il linguaggio di programmazione mette a disposizione dei suoi utenti.


Utilizzeremo in questo esempio, una shell Python interattiva, ma il codice funzionera' altrettanto bene se lanciato dall'interprete.
Il nostro scopo e' definire un numero indefinito di nuove variabili e poi cancellarle. E' possibile ottenere un dizionario delle variabili locali usando la funzione builtin locals.
Subito dopo aver avviato la shell fotografiamo lo stato delle variabili locali, salvando le chiavi di suddetto dizionario in una variabile di nome oldlocals.

>>> oldlocals=locals().keys()

Definiamo ora alcune variabili nuove.

>>> a,b,c,d = 1,2,3,4

Il contenuto di locals sara' diversi ora:

>>> newlocals=locals().keys()
>>> oldlocals
['__builtins__', '__file__', '__name__', 'readline', 'rlcompleter', '__doc__']
>>> newlocals
['a', 'oldlocals', 'b', 'd', '__builtins__', '__file__', 'c', '__name__', 'readline', 'rlcompleter', '__doc__']

Per cancellare le variabili definite dopo la nostra "foto" possiamo usare le funzioni insiemistiche del tipo set.

>>> newly_defined=set(newlocals).difference(oldlocals).difference(set(('oldlocals',)))
>>> newly_defined
set(['a', 'c', 'b', 'd'])
>>> a,b,c,d
(1, 2, 3, 4)

Ora andiamo a cancellare le variabili che siamo andati a definire.

>>> for var in newly_defined: del(locals()[var])
...
>>> a,b,c,d
Traceback (most recent call last):
File "", line 1, in
NameError: name 'a' is not defined
>>>

Perfetto, ora le variabili a,b,c e d sono libere!

Il discorso si potrebbe approfondire con risvolti molto interessanti: ad esempio potrete eliminare solo le variabili di un determinato tipo o le istanze di una certa classe.
Lascio a voi tutto il divertimento.

Python nose: scrivere test senza fatica per il nostro codice

Presto o tardi chi scrive codice deve fare i conti con imprevisti!
Uno dei modi per evitare sorprese e' quello di testare il codice scrivendo dei test che ne confermino la validita' di funzionamento.

Chi scrive codice in Python potra' giovarsi dalle comodita' offerte da Python Nose per scrivere test senza grossa fatica. La particolarita' di Python Nose e' che riesce a scovare le funzioni e le classi di test nel codice basandosi sul loro nome e senza bisogno di importare moduli esterni.

Per esempio...

Supposto che abbiate installato nose, andiamo a cimentarci con una funzione molto semplice ma che puo' riservare sorprese!
Guardate qua:
def fattoriale(n):
"""Funzione ricorsiva per il calcolo del fattoriale di un mnumero
"""
if n == 0:
return 1
else:
return fattoriale(n-1)*n
Che ne pensate? A prima vista sembra scritta bene, ma in realta' riserva qualche sorpresa.
Prima di tutto siamo sicuri funzioni?

Per esserne certi salviamo questa funzione in un file con estensione ".py" e aggiungiamo ad essa una prima funzione di validazione che controlli che i risultati siano corretti.
Affinche' nose si accorga della funzione di test, il suo nome dovra' contenere il prefisso "test" (geniale! :)). Il concetto e' che il test avra' successo la funzione ritornera' dei valori coerenti con quelli che sono calcolabili per altra via. Ad esempio i fattoriali dei numeri 0,1,2,3,4,5 corrispondono ai valori 1,1,2,6,24 e 120.
E' ovvio che se troviamo risultati diversi da questi significa che qualcosa nella funzione non torna.

La funzione che fa il test assomigliera' a questa:
def test_fattoriale():
"""Funzione invocata per testare la correttezza nel calcolo
"""
checks = (1,1,2,6,25,120)
for i, check in enumerate(checks):
f = fattoriale(i)
assert f == check,\
"Il fattoriale di %s e' %s" % (f, check)
Come vedete definiamo nella variabile checks i valori "corretti" e li confrontiamo con quelli che andremo a calcolare con la nostra fantastica funzione!

Il vostro file, fatto questo, assomigliera' a questo:

#!/usr/bin/env python
def fattoriale(n):
"""Funzione ricorsiva per il calcolo del fattoriale di un mnumero
"""
if n == 0:
return 1
else:
return fattoriale(n-1)*n

def test_fattoriale():
"""Funzione invocata per testare la correttezza nel calcolo
"""
checks = (1,1,2,6,25,120)
for i, check in enumerate(checks):
f = fattoriale(i)
assert f == check,\
"Il fattoriale di %s e' %s" % (f, check)
E' arrivato il momento della verita'!!!
Per lanciare il test date il comando nosetest seguito dal nome del file, ad es.:
nosetests prova.py

A questo punto dovreste scoprire che il test e' miseramente fallito!
Il motivo di questo non sta nella funzione bensi' nel test, che e' scritto male... Infatti come ci dice l'output si aspettava che il fattoriale di 4 fosse 25 (non 24 come si puo' ottenere moltiplicando i numeri interi da uno a quattro e come giustamente sostiene la funzione scritta).

Correggiamo la tupla di controllo, sostituendo 25 con 24 e rilanciamo il test. Questa volta tutto dovrebbe filare liscio.

Aggiungiamo test meno banali
Come avete visto la funziona supera brillantemente il test. Pero' fallira' quest'altro test:
def test_tipo():
"""Controlla che la funzione fattoriale ritorni un numero di tipo long
"""
for i in (0,1,2,10,200):
assert type(fattoriale(i)) == long ,\
"Il fattoriale di %s non e' di tipo long!" % i

Questo potrebbe rappresentare un problema in certi casi!
Per far passare alla funzione il test occorre modificarla in questo modo:
#!/usr/bin/env python
def fattoriale(n):
"""Funzione ricorsiva per il calcolo del fattoriale di un mnumero
"""
if n == 0:
return 1L
else:
return fattoriale(n-1)*n

Come vedete nel caso n sia 0 ritorna 1L, (prima ritornava semplicemente 1) ovvero un intero di tipo long. Questo forzera' il tipo del risultato ritornato dalle altre iterazioni, facendoci passare il test!

Fattoriale di un numero molto alto
La nostra funzione non e' ancora a prova di bomba. Facciamola scoppiare!
def test_boom():
"""Controlliamo che la funzione reagisca bene quando si trova a che fare
con numeri grandi
"""
fattoriale(1e10)
Per fare in modo che la funzione gestisca questo test occorrera' gestire l'eccezione che viene sollevata nel caso in cui il numero di cui si vuole calcolare il fattoriale sia troppo alto.

Installare plone su mandriva

Ecco poche semplici istruzioni passi per avere un sito plone funzionante
Quanto leggerete e' stato testato su Mandriva ma dovrebbe facilmente essere trasferibile su altre distribuzioni.
Dopo aver settato correttamente le vostre sorgenti di pacchetti [1] sara' sufficiente la seguente serie di comandi come root:
urpmi zope-Plone
urpmi python2.4-setuptools # [2]
service zope stop # [3]
zopectl adduser USERNAME PASSWORD # [4]

Ovviamente potete usare valori a piacere per la coppia USERNAME e PASSWORD.

Fatto questo Zope dovrebbe essere a posto.
A questo punto aprite un browser (konqueror, firefox o quello che vi pare...) all'indirizzo http://localhost:9080/manage
Vi sara' chiesto di immettere le credenziali (USERNAME e PASSWORD) inserite prima. Una volta che vi sarete autenticati sulla destra trovate un menu' a tendina con, a fianco, un pulsante "Add".
Dal menu' a tendina selezionate "Plone site" e cliccate su "Add". Vi si aprira' la pagina di configurazione del sito in gestazione, contenente un form con tre campi principali: Id, Title e Description.
Come Id mettete un nome semplice, ad esempio "pippo": andra' a comporre la url del vostro sito in questo modo: http://localhost:9080/pippo. Vi esorto a non inserire nomi complicati strani o con spazi.
Title e description sono frasi che potete inserire per descrivere al meglio il vostro nuovo sito.
Completato il form (per il momento bastano questi tre campi), cliccate sul bottone "Add plone site", situato in fondo alla pagina.

A questo punto andate con il vostro browser all'indirizzo: http://localhost:9080/pippo
Buon divertimento!

P.s.: Ho scritto questa guida perche' reperire queste banali informazioni mi e' costato piu' tempo di quel che pensassi. Qualora incontraste problemi vi prego di segnalarmelo in modo che altre persone non perdano tempo e coraggio approcciandosi a questo fantastico CMS. Grazie!

[1] In caso di necessita' vi consiglio di dare un occhio a questo post
[2] python2.4-setuptools e' un pacchetto necessario per evitare che le pagine non vengano generate correttamente. Se non lo installate vedrete un tipico messaggio di errore Python contente (tra l'altro) la stringa "No traversable adapter found"
[3] zope deve essere fermato prima di aggiungere un utente amministratore
[4] ci mettera' un po'...

qombinatorics

Nei giorni scorsi ho parlato spesso di calcolo delle probabilita', piu' specificatamente ho scritto di come calcolare la probabilita' di certi eventi al gioco delle carte.

I conti da svolgere non sono complicati, benche' spesso noiosi. Siccome non sopporto la noia ho pensato bene di sviluppare un programma che mi permettesse di farli in fretta, una sorta di calcolatrice per lo studio del calcolo combinatorio.

Il risultato e' l'ottimo qombinatorics!
Sono molto soddisfatto del risultato. :) L'applicazione e' gia' stata distribuita presso i siti specializzati e sto gia' raccogliendo molti consensi!

Vi lascio con un'immagine del mio ultimo parto!

PyQt4: inserire una icona nel vassoio di sistema

Una applicazione ospitata nel vassoio di sistema (system tray, in inglese) da grandi vantaggi, quale quello di essere facilmente accessibile, pur occupando uno spazio ridotto. Lo svantaggio di questo tipo di applicazioni e' che spesso il vassoio di sistema e' pieno zeppo di icone.

Qualora trovaste indispensabile aggiungere nel vassoio di sistema la vostra iconcina ma non sapete come fare, allora siete nel posto giusto!
Ecco un esempio commentato che vi spieghera' come cominciare
from PyQt4 import QtCore, QtGui
# Creiamo un'applicazione Qt, ...
app = QtGui.QApplication([])
# e un'icona
icon=QtGui.QIcon("/usr/lib/firefox-2.0.0.10/res/samples/raptor.jpg")
# Mettiamola nel systray
systray=QtGui.QSystemTrayIcon(icon)
# e mostriamola
systray.show()
# Interagiamo con l'utente
titolo="Titolo" # Ma che fantasia!
messaggio="Messaggio per l'utente!\nClicca per chiudere l'applicazione"
tempo=10000 # in millisecondi
systray.showMessage(titolo,
messaggio,
QtGui.QSystemTrayIcon.Information,
tempo)
# connettiamo il click alla chiusura dell'applicazione
QtCore.QObject.connect(systray, QtCore.SIGNAL("messageClicked()"), app.quit)
# Eseguiamo l'applicazione
app.exec_()

Ovviamente potete cambiare il titolo, il messaggio, l'icona, ecc...
Quel che e' certo e' che per rendere l'applicazione interessante e fruibile potreste aggiungerci un menu' contestuale e altre amenita' e impostare connessioni piu' sensate.

PyQt4: creare connessioni signal slot senza usare Qt designer

Qt designer 3 permetteva di creare connessioni a funzioni definite dall'utente. Questa caratteristica e' stata rimossa nella versione 4 poiche' si e' preferito rimanere quanto piu' fedeli possibile al concetto che il designer serve per disegnare e non per programmare.
Le connessioni andranno quindi scritte a mano nel codice.

Il metodo da usare per le connessioni e' QtCore.QObject.connect. Al posto di QtCore.QObject ovviamente mettere qualsiasi oggetto erede di questa classe (una QApplicatio per esempio). Vediamo quali sono gli argomenti corretti da inserire in questo metodo.
Le connessioni ammesse sono tra uno o piu' segnali con uno o piu' slot o segnale e sono schematizzate qui di seguito:
QtCore.QObject.connect(widget1, Segnale, Funzione o metodo Python)
QtCore.QObject.connect(widget1, Segnale, widget2, Slot)
Nel primo caso, che molto probabilmente e' il piu' frequente, viene emesso un segnale dalla widget1 e viene collegato ad una funzione o ad un metodo definito nel nostro codice.
Nel secondo caso il segnale viene collegato ad uno slot della widget 2.

Allo stesso modo e' possibile scollegare gli oggetti in questione con il metodo QtCore.QObject.disconnect.

Uno sguardo a Qt designer

Scrivere interfacce grafiche non e' una cosa da ridere, disegnarle si'!
Il concetto dietro al favoloso programma che permette di disegnare interfacce grafiche per le librerie Qt, e' che le applicazioni grafiche sono costituiti di tanti elementi interagenti tra loro: le widget (o i widget? boh?!).

Widget in inglese significa grosso modo "aggeggio. robo", ma nel contesto della programmazione, detta molto alla buona, un(a) widget rappresenta qualsiasi elemento autoconsistente dell'interfaccia grafica: un bottone, uno slider, una spinbox, una combobox, un layout, ecc...

Le widget si possono combinare insieme per creare nuove widget piu' complesse: per esempio, se prendiamo una spinbox e colleghiamola ad uno slider in maniera tale da collegare la mutua variazione di uno all'altro, otteniamo una nuova widget.

L'interazione: il meccanismo signal-slot
L'interazione tra le widget contenute nell'interfaccia grafica avviene a livello di applicazione: tutte le volte che accade qualcosa (si preme un bottone, si digita del testo, una funzione fa qualcosa di interessante, ecc...)un segnale puo' essere emesso. Se una o piu' widget sono in ascolto di quel segnale (hanno uno slot connesso a quel segnale, nel lessico Qt) all'atto della ricezione possono decidere di fare qualcosa.

Cosa puo' fare designer?
In sostanza designer puo' fare principalmente due cose:
  1. disporre e organizzare le widget all'interno di un form (una finestra)
  2. mettere in comunicazione le widget
  3. utilizzare le funzioni predefinite delle widget
Cosa non puo' fare:
  1. creare nuove widget
  2. creare nuove operazioni che coinvolgano una o piu' widget

E dopo aver disegnato?
Dopo aver utilizzato qt designer potrete salvare il vostro form. L'estensione standard e' ".ui", che non e' altro che un file XML particolare. Cosi' com'e' non vi servira' a molto, anche se a volte puo' essere utile aprirlo con un editor di testo per modificarlo.
Questo file andra' incluso, previa opportuna "compilazione", nelle vostre applicazioni.
Per trasformarlo in codice Python potete usare il programma "pyuic4".

Il codice cosi' ottenuto e' utile che sia separato dal codice scritto in altri modi, visto che una modifica tramite qt designer andra' a sovrascrivere eventuale altro codice.

PyQt4: un tutorial facile facile

Python e qt4 sono un binomio vincente che permette a tutti di realizzare velocemente applicazioni con un accattivante interfaccia grafica. Vediamo come!

Nel corso del mio lavoro di scienziato mi e' capitato di dover sviluppare interfaccie grafiche a programmi scritti da me o da qualcun altro. La prima che sviluppai fu in IDL (per dirla all'ammericana... a pain in the 455!)
Poi mi sono avvicinato alle librerie wx, attratto dalla loro portabilita' e dal fatto di poterle utilizzare con Python. Programmare con le wx mi ha dato parecchie soddisfazioni, ma mai quanto programmare con PyQt4!

Come si fa?
Ora vi mostro come essere operativi da subito!
Realizzeremo un software minimale, in grado di accettare parametri di input e rielaborarli, presentando il risultato ottenuto all'utente!
Posto che le librerie siano installate, aprite qt4 designer:
/usr/lib/qt4/bin/designer # per mandriva
Se designer vi apre una marea di finestre e non vi piace potete usare la modalita' "docked windows" (si setta da un dialogo che si apre dal menu' della finestra principale: "Edit->Preferences...").

A questo punto create un nuovo Form dal menu' file. Per questo tutorial scegliamo la strada della comodita': scegliete "Dialog with buttons: bottom" (vedi Fig. 1)!
Fig.1: Cominciamo da qualcosa di gia' preimpostato
Se tutto e' andato bene dovreste avere qualcosa di simile a quanto mostrato in figura 2... Ora siete pronti a lavorare sul serio!
Fig. 2: L'ambiente di lavoro e' pronto!
Come vedete a sinistra ci sono elementi per creare la parte grafica della nostra applicazione. Mettiamone uno per l'input (il LineEdit) e uno per l'output, un text browser (Fig. 3):
Fig. 3: Inseriamo widget per l'input e l'output
Come vedete fa schifo! Ma non e' un problema! Basta
cliccare su una parte vuota del dialog e poi sul bottone "Lay Out Vertically"... Gia' questo e' sufficiente per ottenere un risultato piu' che gradevole (Fig.4)!
Fig. 4: l'interfacia e' pronta!
Salvatelo in una directory che vi piace con il nome di "myGui.ui" (o quello che vi pare...).
Bene! La parte grafica e' finita... anche se di Python, per ora, non c'e' neanche l'ombra!!!

Comincia la pythonificazione!!!!!
Ora dovrete trasformare la vostra applicazione in codice Python. Facilissimo, basta usare il comando:
pyuic4 myGui.ui -o myGui.py
e siete a posto! Se non trovate pyuic4 probabilmente dovrete installare le librerie di sviluppo di qt4 (per mandriva urpmi python-qt4-devel).
Ora create un altro file chiamato myApp.py, che vi servira' per usare la GUI e per farle fare qualcosa di interessante.

Il motivo per cui e' comodo usare due file e' che se volete potete modificare la GUI con designer e poi riconvertirla in codice Python senza preoccuparvi di perdere del codice!

Nel file metteci questo codice:
#!/usr/bin/env python
from myGui import * # Importa la parte grafica

# La funzione che fa girare il programma
app = QtGui.QApplication([]) # Crea un'applicazione Qt, ...
Dialog = QtGui.QDialog() # ... un dialogo, ...
ui = Ui_Dialog() # ... e una user interface.
ui.setupUi(Dialog) # Infila il dialog nella user interface

def run():
Dialog.show() # mostra il dialog precedentemente creato
return app.exec_() # esegue l'applicazione ed esce dal
# programma ritornando lo stesso intero che ritorna app.exec_()

if __name__ == "__main__":
run()
Il comando python myApp.py gia' dovrebbe presentarvi la vostra interfaccia, perfettamente funzionante: se cliccate sui pulsanti si chiudera'! E cosa doveva fare di piu'?!

Facciamo fare qualcosa di utile alla nostra applicazione!
Effettivamente il programma non e' stato istruito sulle azioni da compiere. La cosa piu' stupida che mi viene in mente e' copiare quello che mettiamo in input, rielaborarlo, e presentarlo come output. Modificate il codice come mostrato aggiungendo le righe in rosso.
#!/usr/bin/env python
from myGui import * # Importa la parte grafica

# La funzione che fa girare il programma
app = QtGui.QApplication([]) # Crea un'applicazione Qt, ...
Dialog = QtGui.QDialog() # ... un dialogo, ...
ui = Ui_Dialog() # ... e una user interface.
ui.setupUi(Dialog) # Infila il dialog nella user interface

# Reimpostiamo la gestione del bottone Ok
def action():
"""Quando Ok viene premuto ricopia il testo in grassetto nel textbrowser"""
ui.textBrowser.setText("%s" % ui.lineEdit.text())

app.disconnect(ui.buttonBox,QtCore.SIGNAL("accepted()"),Dialog.accept)
app.connect(ui.buttonBox,QtCore.SIGNAL("accepted()"),action)

def run():
Dialog.show() # mostra il dialog precedentemente creato
return app.exec_() # esegue l'applicazione ed esce dal
# programma ritornando lo stesso codice che ritorna app.exec_()

if __name__ == "__main__":
run()
Le righe in piu' ridefiniscono il comportamento del bottone Ok, facendogli eseguire il codice nella funzione "action".
Facile no!
Adesso e' compito vostro far fare ai vostri programmi qualcosa di utile per voi e il modo della comunita' open source!

Se avete dubbi o suggerimenti per migliorare questo micro tutorial vi prego di contattarmi!

gmailfs: 5 GB gratis per il vostro pinguino

Impariamo ad utilizzare i 5 GB (in continua crescita) di gmail come spazio disco.
Gmailfs e' una utility che permette di utilizzare l'enorme spazio che Google mette a disposizione dei suoi utenti come un normale disco fisso. Bisogna dire che l'accesso alla risorsa e' ovviamente molto piu' lento di un reale hard disk ed e' condizionato dal possesso di un account su gmail e dall'essere connessi al momento dell'utilizzo.

Se non avete fretta e avete una flat o se semplicemente vi va, considerate l'opportunita' di utilizzare gmailfs o per backup di emergenza [*] o come una sorta di ftp/chiavetta USB su cui mettere dei dati che vi potranno tornare utili ovunque voi siate.

[*] gmailfs e' ancora in test, percui usatelo solo come ultima spiaggia o come doppia copia!!!

Dipendenze
Vi occorre python-fuse (in mandriva si installa con "urpmi python-fuse") e l'ultima versione di libgmail.
Per montare gmailfs come utente normale dovete essere nel gruppo fuse.
Chi usa Mandriva 2008.0 notera' che questa distribuzione mette a disposizione solo la versione 0.1.7, ma non basta!!!
Nessun problema, arrivo io!!! Se volete ho gia' pronto un rpm per Python 2.5 costruito su mandriva 2008.0.
Si installa con i comandi:
wget http://alessandro.pisa.googlepages.com/libgmail-0.1.8-1.noarch.rpm
# inserite password di root se necessario.
# togliamo la vecchia versione e installiamo la nuova
su -c "rpm -e python-libgmail"
su -c "rpm -Uvh libgmail-0.1.8-1.noarch.rpm"
Il nome del pacchetto da togliere potrebbe cambiare qualora aveste un'altra distribuzione, ma quello da installare va bene per tutte quelle che hanno Python 2.5!

Se volete installare da sorgenti scaricate l'ultima versione [link] e poi date i seguenti comandi...
# scompattate il file
tar xfz libgmail-0.1.8.tar.gz
cd libgmail-0.1.8/
# inserite la password di root quando richiesto
su -c "python setup.py install"
Come installarlo
Il sito di gmailfs, dove troverete la documentazione ufficiale ed eventuali novita', e' il seguente:
http://richard.jones.name/google-hacks/gmail-filesystem/gmail-filesystem.html

La versione che ho installato oggi e la 0.8 scaricabile direttamente da qui.
Una volta scaricato il pacchetto aprite una console e date i seguenti comandi:
# scompatta l'archivio
tar xfz gmailfs-0.8.0.tar.gz
# cambiate directory
cd gmailfs-0.8.0/
# Copiate i file nei posti giusti. Inserite la password di root quando richiesto
su -c "cp gmailfs.py /usr/local/bin/"
su -c "cp mount.gmailfs /sbin/"
cp gmailfs.conf $HOME/.gmailfs
# Mettiamo permessi sicuri
chmod 600 $HOME/.gmailfs
A questo punto seguite le istruzioni per modificare le seguenti righe del il file $HOME/.gmailfs:
username = gmailusername # <- metteteci il vostro account senza @gmail.com

password = gmailpassword # <- metteteci la vostra password... Non siate paranoici!!!

fsname = linux_fs_3 # <- metteteci quello che vi pare, anche qualcosa di strano tanto non vi servira' granche'...

logfile = ~/gmailfs.log # <- metteteci ~/.gmailfs.log, sara' meno in mezzo ai piedi :)
Siete pronti???!!!
Tirate un bel sospiro di sollievo create la cartella sotto cui volete montare gmailfs
mkdir $HOME/gmailfs
e date il comando
/sbin/mount.gmailfs /usr/local/bin/gmailfs.py $HOME/gmailfs
Se date il comando df per due volte vedrete che la prima volta si lagnera', ma la seconda vi dira' qualcosa di simile:
python 5.0G 144M 4.8G 3% /home/xxx/gmailfs
Complimenti!!! ora potete usare la cartella $HOME/gmailfs come usaste una penna USB! Alla fine ricordatevi di smontarla con:
fusermount -u $HOME/gmailfs
Problemi incontrati e risolti
1) mount.gmailfs deve essere in grado di leggere il suo file di configurazione, altrimenti non funziona. Avete due scelte:
  1. metterlo sotto /etc/gmailfs.conf
  2. metterlo sotto $HOME/.gmailfs
Evitate di fare come me che l'ho messo sotto $HOME/.gmailfs.conf!!!!

2) Puo' essere che non riusciate ad usare fuse, in particolare ad accedere a /dev/fuse. Probabilmente non siete ancora nel gruppo fuse. Inseritevi in questo gruppo utilizzando vigr o gli appositi strumenti di gestione della vostra distribuzione e riloggatevi.
Una volta riloggati il comando groups dovrebbe aggiornarvi sulla vostra appartenenza al gruppo di fuse.

3) Se quando montate gmailfs vi da un messaggio del tipo: HTTP Error 400: Bad Request e poi non potete scrivere o leggere nulla da gmailfs perche' continuamente tormentati dall'errore "no space left on device", aggiornate libgmail all'ultima versione (piu' sopra spiego come fare).

Saluti e baci
Spero di esservi stato di aiuto. Qualora permanessero dubbi o riscontraste errori vi prego di scrivermi.
Grazie e ciao!

Python: progress bar con kde

Ovvero come implementare una simpatica e utile progress bar in Python sfruttando un'installazione funzionante di KDE

Requisiti: Python, KDE

Vi faccio dono di questo pezzo di codice che spesso e volentieri mi e' tornato utile.
Inserendo una progress bar in un programma con un tempo di esecuzione piuttosto elevato, posso ottenere in maniera rapida informazioni quali:
  1. stato di avanzamento del programma;
  2. stima del tempo trascorso;
  3. stima del tempo rimanente.
Il codice allegato sfrutta chiama mediante una l'apertura di una pipe l'utilissimo programma kdialog, parte dell'installazione base di KDE, per lanciare una finestra di dialogo con una progress bar che viene aggiornata e controllata dal codice Python sfruttando dcop.

Un esempio di come utilizzare questo codice e' inserito nella funzione test(), presente anch'essa nel codice e che viene eseguita in seguito al comando:
$ python progress_bar.py

L'immagine mostra la progress bar che dovrebbe apparire sul vostro schermo.


Come riciclare questo codice
La cosa piu' semplice che possiate fare e' copiarlo all'interno del codice che state sviluppando e creare un'istanza dell'oggetto Progressbar che partira' automaticamente, ad esempio cosi':
pbar=Progressbar(title='test title', name='test window', update_time=.1, steps=1000)
Per incrementare la barra e' sufficiente variare il contatore della barra stessa con il valore attuale, ad esempio:
pbar.index=500
Se volete chiudere la finestra di dialogo e' sufficiente cliccare sul tasto "Cancel". Questa azione, inoltre, settera' al valore True la variabile pbar.stop che potra' essere eventualmente usata nel programma principale per decidere di interrompere la sua esecuzione.