Archive for the ‘ Information Technology ’ Category

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 ;)

Xorg 1.6 – Ctrl + alt + backspace

Una delle feature introdotte nella versione 1.6 di Xorg è la disabilitazione di default della combinazione ctrl+alt+backspace.

Sulle mailing list è possibile leggere molto a riguardo, sul fatto che “normalmente” un riavvio del server X non dovrebbe essere necessario e su quanto, per un nuovo utente, possa essere semplice digitare accidentalmente la combinazione e ritrovarsi con il lavoro perso e una bella schermata di login senza sapere perché.

In effetti le ragioni sono plausibili, ma per alcuni il “normalmente”, significa aver necessità di riavviare X senza dover eseguire il kill del processo da un terminale: in passato mi sono capitate delle situazioni in cui X si è completamente congelato e con un ctrl+alt+backspace si è ripristinato il tutto senza dover riavviare l’intero sistema. Avendo l’opzione disabilitata, se il terminale (ctrl+alt+f1…f6) non risponde ai comandi allora non resta che il reset. Nel mio caso, ho preferito riabilitare l’opzione, aggiungendo al file xorg.conf (solitamente in /etc/X11) l’opzione “DontZap” ed impostandola a “false“. In proposito, riporto la sezione del mio file di configurazione:

Section "ServerFlags"
#   Option "AllowMouseOpenFail"  "true"
#      Option "AutoAddDevices" "False"
 Option  "DontZap" "False"
EndSection

In successivi aggiornamenti, è stata introdotta anche su HAL una disabilitazione della combinazione. Per riattivarla è sufficiente aggiungere questa entry

<merge key="input.xkb.options" type="string">
terminate:ctrl_alt_bksp
</merge>

all’interno del file /etc/hal/fdi/policy/10-keymap.fdi

In caso il file non fosse presente, copiarlo da /usr/share/hal/fdi/policy/10osvendor

cp /usr/share/hal/fdi/policy/10osvendor/10-keymap.fdi \
    /etc/hal/fdi/policy/

E modificarlo aggiungendo la entry di cui sopra.

Riporto di seguito il mio file keymap che funziona correttamente utilizzando entrance come login manager:

 <deviceinfo version="0.2">
  <device>
    <match key="info.capabilities" contains="input.keymap">
      <append key="info.callouts.add" type="strlist">hal-setup-keymap</append>
    </match>

    <match key="info.capabilities" contains="input.keys">
      <merge key="input.xkb.rules" type="string">base</merge>

      <!-- If we're using Linux, we use evdev by default (falling back to
          keyboard otherwise). -->
      <merge key="input.xkb.model" type="string">keyboard</merge>
      </match><match key="/org/freedesktop/Hal/devices/computer:system.kernel.name"
            string="Linux">
        <merge key="input.xkb.model" type="string">evdev</merge>
      </match>

      <merge key="input.xkb.layout" type="string">it</merge>
      <merge key="input.xkb.variant" type="string" />
      <merge key="input.xkb.options" type="string">terminate:ctrl_alt_bksp</merge>
   
  </device>
</deviceinfo>

Infine, se non si sta usando l’integrazione Xorg/HAL occorrerà aggiungere una opzione nel file /etc/X11/xorg.conf all’interno della sezione keyboard

Option         "XkbOptions" "terminate:ctrl_alt_bksp"

Al solito, spero che a qualcuno sia utile ;)

Shutdown HSQLDB

Ultimamente sto usando Hypersonic SQL DB in un software che sto scrivendo. Il driver utilizzato è “embedded” ovvero non è presente un server in attesa di ricevere comandi SQL, ma il database è un file gestito direttamente dal driver di hypersonic.

Con questo tipo di accesso però, avevo notato perdite di dati sul database, non tutto infatti diventava persistente e, certo di non aver scritto codice errato, iniziavo a pensare di non capirci più nulla.

Il fatto è che, a differenza di quanto ero solito fare con altri RDBMS, non è sufficiente chiudere una connessione con

connection.close()

al termine dell’esecuzione del programma, il driver effettua caching delle tabelle per ottimizzare gli accessi al file system e non tutte le modifiche vengono scritte sul file.

È necessario fornire al driver l’istruzione di “SHUTDOWN” di modo che tutti i dati eventualmente ancora in cache vengano correttamente resi persistenti:

Statement shutdown = connection.createStatement("SHUTDOWN");
shutdown.execute();
shutdown.close();
connection.close();

Esiste inoltre, una funzione di shutdown che effettua anche una riorganizzazione del database ed una compressione dei dati. Essendo un’operazione lenta è bene non usarla troppo di frequente, il criterio d’uso è lo stesso di “SHUTDOWN”, “SHUTDOWN COMPACT”.

Alla prossima :)