Python Singleton

You may find better alternatives to this one, since it’s just not thread-safe. Anyway, this is how I solve the singleton pattern in Python language. As people who knows me know, I like the decorator pattern :-)

class singleton:
    def __init__(self, clazz):
        self.clazz = clazz
        self.instance = None
    def __call__(self, *args, **kwargs):
        if not self.instance:
            self.instance = self.clazz(*args, **kwargs)
        return self.instance

@singleton
class Dog:
    def __init__(self, name='Fido'):
        self.name = name
    def bark(self):
        print("{} --> BAU!".format(self.name))

if __name__ == '__main__':
    f = Dog('Fido')
    k = Dog('Krusty')
    f.bark()
    k.bark()
    print("Same instance? {}".format(k is f))

Dog is the class I want as a singleton in this silly snippet of code, while singleton is the actual implementation of the decorator which will make any class act like a singleton.
As you can see, only one instance is created, and my dog is just “Fido”. The output is:

Fido --> BAU!
Fido --> BAU!
Same instance? True

Ok, maybe not so impressive but I like to put my notes somewhere and share them :-)

See ya!

mod_wsgi on OSX

It’s been quite a while since my last words on these pages. And yes, I’m writing in english, my bad english for a number of reasons… But this is out of scope, so let’s put away the dust and start to write something (hopefully) useful :)

These days I’m experiencing Python and the web full-stack framework Django. They both are impressive, really: starting the development of a webapp is almost straightforward, if you have the time to read the really good documentation available at https://docs.djangoproject.com.

After a bit of exercise, I developed a tutorial application, and I wanted to deploy it with the Apache Web Server since django offers a built-in web server during the development phase (and it’s written in python). Since I’m using a mac, I got some troubles to get mod_wsgi working. So far nothing too much annoying, but I wasted a bit of time so I hope these words can save someone else’s time :-)

I was not happy to use the Apache httpd which come built-in in OSX, so I downloaded the latest release from the Apache site (http://www.apache.org/dyn/closer.cgi ) and built it from scratch. Ensure you have the development tools installed in your OS, if not you can download them from the Mac App Store getting Xcode 4 for free…

So after a successful compile of sources

anubis:httpd-2.2.21 fabio$ ./configure \
&& make \
&& sudo make install

I found my apache 2 server ready under the directory /usr/local/apache2.

The next thing, is to install mod_wsgi . If you don’t want to use the built-in osx httpd, you have to download the sources (http://code.google.com/p/modwsgi/wiki/DownloadTheSoftware), and build them from scratch. This time, take care of where is the apache installation (did just some moments before) and where is your python!

Since I’m using virtualenv, I was almost sure to activate the environment settings and build mod_wsgi from the shell was sufficient… So far this is not the case, I needed to provide the installation path to the configure script, otherwise it will continue to use the python built-in with OSX:

anubis:mod_wsgi-3.3 fabio$ ./configure \
--with-apxs="/usr/local/apache2/bin/apxs" \
--with-python="/Users/fabio/Sviluppo/python-2.7/bin/python" \
&& make \
&& sudo make install

where /Users/fabio/Sviluppo/python-2.7/bin/python is the directory where I installed python 2.7 and django via virtualenv and pip.

It’s now time to configure Apache. Of course using vi :)

anubis:conf fabio$ sudo vi httpd.conf

and inside I added the following lines

Alias /media/ /Users/fabio/Sviluppo/booklibrary/media/

<directory /Users/fabio/Sviluppo/booklibrary/media>
Order deny,allow
Allow from all
</directory>

#MOD_WSGI
LoadModule wsgi_module modules/mod_wsgi.so

WSGIDaemonProcess books user=fabio group=staff python-path=/Users/fabio/Sviluppo/python-2.7/lib/python2.7/site-packages processes=2 threads=25

WSGIProcessGroup books

WSGIScriptAlias / /Users/fabio/Sviluppo/booklibrary/apache/booklibrary.wsgi
#WSGIScriptAlias /books /Users/fabio/Sviluppo/booklibrary/apache/test.wsgi

<directory /Users/fabio/Sviluppo/booklibrary/apache>
Order deny,allow
Allow from all
</directory>

Since the django app is in my home directory, we must ensure apache is able to run the code. This is accomplished with the lines

  • WSGIDaemonProcess books user=fabio group=staff …
  • WSGIProcessGroup books
The others are simply mappings and aliases which are almost straightforward.
Last but not least, the file .wsgi. I wrote 2 versions, one was a mere test of a correct installation of mod_wsgi in apache (test.wsgi):

import sys

def application(environ, start_response):
    status = '200 OK'
    output = 'It Works! -- Python executable at '+ sys.executable
    response_headers = [('Content-Type', 'text/plain'), ('Content-Length',   str(len(output)))]
    start_response(status, response_headers)
    return [output]

the other is the one which make the django app start:

import os
import sys

#sys.path.append('/usr/lib/python2.4/site-packages/django')
#/Users/fabio/Sviluppo/python-2.7/bin/
paths = ['/Users/fabio/Sviluppo',
        '/Users/fabio/Sviluppo/booklibrary']
for path in paths:
    if path not in sys.path:
        sys.path.append(path)

os.environ['DJANGO_SETTINGS_MODULE'] = 'booklibrary.settings'

import django.core.handlers.wsgi
application = django.core.handlers.wsgi.WSGIHandler()

And that’s all ;)

Perdita della connessione con WAG320n

Forse, forse, forse ho risolto un bel problema del mio modem/router linksys. In sostanza dopo 15/20 ore di funzionamento ininterrotto, il modem perdeva la connessione internet, pur continuando ad avere la portante ADSL.

Non me ne ero mai accorto perché lo spegnevo quasi tutte le sere, un po’ per risparmiare, un po’ per le radiofrequenze che non si sa se siano dannose (ma quando non ci sono di certo non fanno male :-) ). In effetti, ho preso questo modello anche perché ha il tasto di accensione/spegnimento.

Ho provato anche con reset di fabbrica, flash del firmware, ma niente, per i primi giorni sembrava andare e poi tutto ad un tratto si disconnetteva.

Veniamo al dunque, che magari interessa chi cerca la medesima soluzione, come ho risolto? Semplicemente disattivando l’opzione “SPI Firewall Protection” nella tab “Security” (https://192.168.1.1/setup.cgi?next_file=Security.htm ovviamente sostituite il vostro indirizzo IP se lo avete cambiato…).

Le disconnessioni avvenivano piuttosto regolarmente, per cui ho pensato che doveva esserci qualcosa che andava a saturare le risorse del modem. SPI sta per “Stateful Packet Inspection” il che significa che per ogni connessione il firewall deve tenere traccia dello stato. Molto probabilmente questa funzionalità soffre di memory leak e ad un certo punto le risorse si esauriscono diventando insufficienti alla connessione internet.

Devo dire che è capitato comunque di trovare il led “Internet” spento e quello “DSL” acceso, è successo anche in caso di temporali abbastanza forti. Resto quindi nel dubbio se non vi siano altre funzionalità che soffrano dello stesso problema, o magari fosse dovuto a cause esterne. In ogni caso adesso il modem riesce a rimanere tranquillamente connesso per almeno 10 giorni, che dalle 15/20 ore precedenti è di sicuro un bel guadagno.

Spero che questo post sia stato utile a qualcun altro nella stessa situazione e, come sempre, alla prossima!

PS: Se il post vi è stato utile nel risolvere il problema, o al contrario non ha sortito alcun effetto lasciatemi un commento! Grazie ;-)

Android 2.2 (Froyo) su x86

Il porting su piattaforma intel è stato rilasciato da qualche giorno su http://www.android-x86.org/. Oggi ho deciso di provarlo su una virtuale con 256MB di ram e disco da 8GB, di cui 4 li ho destinati per una SD finta. E’ molto carino, anche se ovviamente l’utilità sarebbe nell’averlo su un netbook con abilitata la connettività 3g e quindi un test per l’effettiva funzionalità merita di un dispositivo reale piuttosto che una macchina virtuale.

Ho idea di installarlo su un vecchio portatile ormai non più utilizzato, ma i suoi 64MB di ram credo siano uno scoglio anche per android, quanto meno la VM si blocca… Ma vedremo prossimamente, appena avrò un po’ di tempo da spendere in questo modo, intanto ecco alcuni screenshot presi dalla macchina virtuale :)

Alla prossima :)

Xperia x10 fermo alla 2.1… Quindi?

My droids :)

My droids :)

Sebbene la decisione di Sony Ericsson di fermare il sistema operativo dei terminali Xperia X10 alla versione 2.1 possa sembrare sciocca e irritante per chi, come me, ha deciso di sviluppare qualche applicazione su Android, ci si dovrebbe soffermare a considerare anche un po’ gli aspetti dell’effettivo utilizzo del terminale. La cosiddetta “user experience“.

Un terminale come il mio, un X10 mini, non da adito a molti utilizzi, lo schermo estremamente piccolo è veramente comodo per un utilizzo veloce della messaggistica mail/sms, passatempo e per le normali attività “telefoniche”, tuttavia non è certo considerabile al top per la navigazione web e la lettura di documenti… Seppure sia stato una delle caratteristiche che mi ha spinto a comprarlo in modo da non avere una “ciabatta” nelle tasche, per alcune attività occorre uno schermo ed una risoluzione maggiore.

L’esempio dello schermo è per indicare che le esigenze devono trovare riscontro con dei compromessi (costi, dimensioni, autonomia ecc.) ai quali una versione maggiore dell’OS android non è detto riesca a soddisfare… Soprattutto se si pensa ad un prodotto che Sony ha personalizzato in alcune parti.

Se scrivo questo post è perché un po’ sono dispiaciuto di non poter avere versioni successive da poter provare su questo telefono, tuttavia mi ritengo comunque soddisfatto a pieno per le funzionalità e la versatilità di un prodotto dal costo che 6 mesi fa non aveva rivali.

Alla prossima… :)

VMware player 3.1 su Windows 7

Non è che mi sia dimenticato di questo spazio, sono tante le cose che ultimamente si sovrappongono e anche il tempo di fare qualche scatto è poco. In vista dell’estate cercherò di darmi una scrollata :)

Voglio appuntare su questa pagina una nota riguardo l’installazione di VMware player, che a partire da questa versione (3.1) permette anche la creazione di macchine virtuali, mentre precedentemente le si potevano solo eseguire. Di fatto è una versione “lite” di VMware Workstation.

Da notare che anche la versione 2.0.2 di VMware Server è disponibile gratuitamente (previa registrazione) e devo dire che sono rimasto piacevolmente stupito da tutte le cose che supporta, sebbene carattarestiche interessanti in ambito enterprise (magari per le migrazioni delle VM) non siano disponibili. Credo che sia anche ragionevole :)

Comunque sto divagando un po’ troppo, quello che voglio appuntare è una workaround (o anche porkaround :D ) perché l’installazione di VMware player su host Windows 7 x86_64 non andava a buon fine. Dall’event viewer di sistema l’errore che si mostrava era sempre il seguente

VMware Error

VMware Error

Le opzioni che si possono scegliere all’installazione non sono molte e qualsiasi combinazione… patatrack :|

Le cause tuttora sono ignote, se avete idee vi sono grato se le lasciate nei commenti, ho pensato che potesse essere un problema di ISA, infatti nel messaggio dell’errore riporta x86. La soluzione? Molto più semplice del previsto:

Ho estratto il contenuto dell’eseguibile con il comando

VMware-player-3.1.0-261024.exe /extract VMware

Ovviamente lanciato dalla directory dove è il file di setup. Questo estrarrà tutto il contenuto all’interno della directory VMware (si può anche chiamarla pippo). All’interno, lanciando il file .msi l’installazione è andata a buon fine.

Alla prossima :)

JNI su HP-UX, le dimensioni dello stack contano

Arrugginito forse un po’, quando si passa tanto tempo a fare altro ci si dimentica di avere anche uno spazio web dove annotare quei piccoli successi che potrebbero tornare utili ad altri, ma anche a te semmai te ne dovessi dimenticare :)

Il problema di fondo era che la chiamata JNI_CreateJavaVM produceva il segnale SIGABRT quando invocato all’interno di un altro framework, nello specifico stavo utilizzando l’SDK BoKS.

La porzione di codice interessata, a parte dovuti accorgimenti, era del tutto coerente con quanto riportato da HP al link

http://www.docs.hp.com/en/JAVAPROGUIDE/JNI_java2.html

Provando ad utilizzare i parametri di inizializzazione della VM più svariati non si è cavato un ragno dal buco, seguendo comunque le linee guida riportate qui http://www.docs.hp.com/en/JAVAPROGUIDE/JNI_java2.html#primordial, si è ipotizzato da subito un problema con lo stacksize su HP-UX, su Solaris, infatti, non erano stati riscontrati problemi di sorta.

Una sessione con tusc ha confermato quanto supposto:

[19196] #6 kwakeup(PTH_CONDVAR_OBJECT, 0x60000000000ea400, WAKEUP_ONE, 0x9fffffff7f63cb50) = 0
[19196] #2 ksleep(PTH_CONDVAR_OBJECT, 0x60000000000ea400, 0x60000000000d75b8, NULL) = 0
[19196] #6 gettimeofday(0x9fffffff7f63cb30, NULL) ........ = 0
[19196] #2 write(1, 0x9fffffffef4c0400, 43) .............. = 43
E r r o r   o c c u r r e d   d u r i n g   i n i t i a l i z a
t i o n   o f   V M \n
[19196] #2 write(1, 0x60000000001683a0, 28) .............. = 28
j a v a . l a n g . S t a c k O v e r f l o w E r r o r
[19196] #2 write(1, 0xc000000015cf08b8, 1) ............... = 1
\n
[19196] #2 unlink("/var/tmp/hsperfdata_boksa/19196") ..... = 0
[19196] #2 sigaction(SIGILL, 0x9fffffffef7c6740, NULL) ... = 0
[19196] #2 sigprocmask(SIG_UNBLOCK, NULL, 0x9fffffffef4c0b80) = 0
[19196] #2 sigaction(SIGABRT, NULL, 0x9fffffffef4c0ba0) .. = 0
[19196] #2 getpid() ...................................... = 19196 (19194)
[19196] #2   Received signal 6, SIGABRT, in kill(), [0x9fffffffef76bfd0]
[19196] #2     Siginfo: sent by pid 19196 (uid 600), si_errno: 0

La soluzione?

Un semplice export della variabile PTHREAD_DEFAULT_STACK_SIZE a 524288.

export PTHREAD_DEFAULT_STACK_SIZE=524288

Si sarebbe anche potuta usare la chiamata pthread_default_stacksize_np(), ma poiché la parte di codice che crea i thread non è personalizzabile in quel dato SDK, l’export della variabile d’ambiente è stata l’unica soluzione attuabile.

Alla prossima!

VirtualBox – Error 1603

Era un po’ di tempo che non battevo qualche tasto da queste parti… Torno con qualcosa di utile, spero, una soluzione semplice ad un problema che mi ha fatto perdere non poco tempo. Per le foto… Beh ultimamente sono un po’ a digiuno, presto finirò di riempire queste pagine, sperando di riuscire a tirarne fuori una degna di nota!

Avere a disposizione una macchina virtuale ha numerosi vantaggi, e VirtualBox è una scelta da non trascurare, gratuito per uso personale (licenza PUEL), veramente semplice da usare e multipiattaforma. Lo uso tranquillamente su OSX e Archlinux, su Windows XP… Non proprio! :)

Volevo aggiornare alla versione 3.0.1, ma il risultato dell’installer era sempre il seguente “VirtualBox setup ended prematurely” seguito da un “Error 1603″. Anche la disinstallazione della versione precedente (2.2) non dava cenni di voler funzionare, di fatto sia l’installazione di una nuova versione che la rimozione della vecchia si interrompevano portando al rollback delle modifiche.

Rimuovendo tutti i file dalla directory “Programmi”, eliminando i riferimenti dal registro (quelli che sono riuscito ad individuare), disinstallando le interfacce di rete virtuali e cancellando anche i loro driver non sono riuscito ad ottenere altro che  un nulla di fatto.

Alla fine ho trovato questo articolo http://www.virtualbox.org/ticket/3701 e riporto di seguito quello che ho fatto anche io per risolvere:

1. tasto windows+r -> regedit ;
2. Export della chiave HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\DIFxApp\Components su un file qualsiasi per comodità sul desktop (per esempio vbox.reg);
3. Sostituzione di tutte le occorrenze di HKEY_CURRENT_USER all’interno del file con HKEY_LOCAL_MACHINE in modo da ottenere il file come di seguito:

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\DIFxApp\Components]

[HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\DIFxApp\Components\{010FE46A-E358-43E2-8BDC-38BC8BEC82E0}]
"CleanupNeeded"=dword:00000001
"Reboot"=dword:00000000

[HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\DIFxApp\Components\{7ADF3E12-AF3C-4D36-8BEC-36D5064CF84F}]

[HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\DIFxApp\Components\{AC3FB68C-FE7D-40FC-BFF4-3A6B3B41513B}]

[HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\DIFxApp\Components\{B7D782D2-96DF-4775-A0E1-A76CF7B04B65}]
"CleanupNeeded"=dword:00000001
"Reboot"=dword:00000000

[HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\DIFxApp\Components\{BC01FCCB-D7AB-4ADB-9657-B6F7ED514715}]
"CleanupNeeded"=dword:00000001
"Reboot"=dword:00000000

[HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\DIFxApp\Components\{D3E2F2BB-569F-46A2-836C-BDF30FF1EDF8}]

4. Import del file .reg nel registro (basta un doppio click sul file);
5. Rimozione della chiave HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\DIFxApp ;

Dopo il passo 5 l’installazione della versione 3 è andata senza alcun problema.

Alla prossima! :)

iSync con Samsung SGH-E250

La cosa bella di un Mac è che presenta una rosa di software pronta all’uso. La cosa brutta è che non essendo software OpenSource spesso non è possibile personalizzare al meglio le funzionalità che più ci occorrono.

iSync è un’applicazione veramente ben fatta, mi ha dato subito soddisfazione con il mio vecchio Nokia 6600 per il quale, installando un agent sul cellulare stesso, tutto è andato alla grande. Con il Samsung SGH-E250, invece, il risultato era sempre lo stesso: dispositivo non supportato.

Con un po’ di ricerche con Google, però, ho visto che telefoni come il Samsung D900, che è molto simile nell’aspetto e nelle specifiche al mio, funzionano alacremente.

Sono andato dunque dentro la cartella di iSync ( /Applications/iSync.app/ ) a cercare qualcosa ed ho trovato appunto i driver del D900 dentro la cartella

/Applications/iSync.app/Contents/PlugIns/ApplePhoneConduit.syncdevice/Contents/PlugIns/Samsung-D900.phoneplugin

e mi son detto che magari come per le stampanti il mio telefono potrebbe funzionare con un driver di un altro molto simile a lui… E di fatti ha funzionato!

In sostanza mi sono limitato a copiare la cartella in

/Applications/iSync.app/Contents/PlugIns/ApplePhoneConduit.syncdevice/Contents/PlugIns/Samsung-E250.phoneplugin

All’interno della cartella ho sostituito tutte le occorrenze di “D900″ con “E250″ nei seguenti file

/Applications/iSync.app/Contents/PlugIns/ApplePhoneConduit.syncdevice/Contents/PlugIns/Samsung-E250.phoneplugin/Contents/Info.plist
/Applications/iSync.app/Contents/PlugIns/ApplePhoneConduit.syncdevice/Contents/PlugIns/Samsung-E250.phoneplugin/Contents/Resources/MetaClasses.plist

ed infine ho rinominato il file (situato nella cartella /Applications/iSync.app/Contents/PlugIns/ApplePhoneConduit.syncdevice/Contents/PlugIns/Samsung-E250.phoneplugin/Contents/Resources/) com.samsung.D900.tiff in com.samsung.E250.tiff.

Certo, l’icona non è proprio la stessa però ci si avvicina molto ed è sempre meglio di niente :)

Avviando iSync la sincronizzazione è andata a buon fine, numeri di cellulare, indirizzi e-mail e compleanni sono stati caricati correttamente, solo le immagini personali non sono state caricate, ma direi che è accettabile anche questo :)

Il driver, ottenuto come sopra, per il Samsung SGH-E250 lo potete scaricare dal mio sito a questo link, ricordate però che non è ufficiale e che l’utilizzo è a vostro rischio e pericolo ;)

Perla

Spesso le cose belle sono ad un passo da noi e non ce ne accorgiamo perché tendiamo a vederle con occhi abitudinari. Ma basta un piccolo cambiamento per notare la bellezza che prima ci aveva lasciati indifferenti.

Che perla di saggezza eh? :)

San Pietro al tramonto

Mi riferisco anche alla foto, che mi lascia abbastanza soddisfatto. Devo dire che da quando guardo anche attraverso le lenti della mia reflex mi accorgo sempre più di quanto ci siano cose notevoli attorno a me che sfuggono allo sguardo della vita di tutti i giorni.

A tal proposito, diversi giorni fa su facebook ho letto queste righe che mi hanno molto colpito

Un violinista nella metropolitana. Una storia vera. Un uomo si mise a sedere in una stazione della metro a Washington DC ed iniziò a suonare il violino; era un freddo mattino di gennaio. Suonò sei pezzi di Bach per circa 45 minuti. Durante questo tempo, poiché era l’ora di punta, era stato calcolato che migliaia di persone sarebbero passate per la stazione, molte delle quali sulla strada per andare al lavoro. Passarono 3 minuti ed un uomo di mezza età notò che c’era un musicista che suonava. Rallentò il passo e si fermò per alcuni secondi e poi si affrettò per non essere in ritardo sulla tabella di marcia. Alcuni minuti dopo, il violinista ricevette il primo dollaro di mancia: una donna tirò il denaro nella cassettina e senza neanche fermarsi continuò a camminare. Pochi minuti dopo, qualcuno si appoggiò al muro per ascoltarlo, ma l’uomo guardò l’orologio e ricominciò a camminare. Quello che prestò maggior attenzione fu un bambino di 3 anni. Sua madre lo tirava, ma il ragazzino si fermò a guardare il violinista. Finalmente la madre lo tirò con decisione ed il bambino continuò a camminare girando la testa tutto il tempo. Questo comportamento fu ripetuto da diversi altri bambini. Tutti i genitori, senza eccezione, li forzarono a muoversi. Nei 45 minuti in cui il musicista suonò, solo 6 persone si fermarono e rimasero un momento. Circa 20 gli diedero dei soldi, ma continuarono a camminare normalmente. Raccolse 32 dollari. Quando finì di suonare e tornò il silenzio, nessuno se ne accorse. Nessuno applaudì, ne’ ci fu alcun riconoscimento. Nessuno lo sapeva ma il violinista era Joshua Bell, uno dei più grandi musicisti al mondo. Suonò uno dei pezzi più complessi mai scritti, con un violino del valore di 3,5 milioni di dollari. Due giorni prima che suonasse nella metro, Joshua Bell fece il tutto esaurito al teatro di Boston e i posti costavano una media di 100 dollari. Questa è una storia vera. L’esecuzione di Joshua Bell in incognito nella stazione della metro fu organizzata dal quotidiano Washington Post come parte di un esperimento sociale sulla percezione, il gusto e le priorità delle persone. La domanda era: “In un ambiente comune ad un’ora inappropriata: percepiamo la bellezza? Ci fermiamo ad apprezzarla? Riconosciamo il talento in un contesto inaspettato?”. Ecco una domanda su cui riflettere: “Se non abbiamo un momento per fermarci ed ascoltare uno dei migliori musicisti al mondo suonare la miglior musica mai scritta, quante altre cose ci stiamo perdendo?”

Non è poi un pensiero così banale allora ;)