Usare l’openmoko come antenna gps esterna (condividere gpsd sulla rete usb)

Può tornare utile utilizzare l’openmoko come antenna gps esterna o, in maniera più complessa, far leggere i dati gps forniti dal demone di gestione del gps dell’openmoko, fso-gpsd, a tutti i computer connessi alla stessa rete dell’openmoko.

Gpsd può rimanere in ascolto per fornire i dati via rete e siccome l’openmoko si collega alla rete tramite un pc, possiamo usarlo come antenna esterna. In questo modo è possibile, ad esempio, utilizzare tangoGPS sul proprio pc usano l’openmoko come un (costoso!) ricevitore gps semplicemente impostando nel campo “Server gpsd” l’ip dell’openmoko (grazie a Matthias Apitz per il felice suggerimento) .

In SHR fso-gpsd  è configurato in modo da rimanere in ascolto solo su localhost, impedendo di fatto ad altri client di rete di accedere alle informazioni. Per modificare questo comportamento è sufficiente modificare una riga nel file /etc/init.d/fso-gpsd, cambiando:

-S localhost:gpsd

in

-S 0.0.0.0:gpsd

In questo modo tutti i computer della rete, e l’openmoko stesso, potranno accedere a gpsd anche *contemporaneamente* (cosa che non si può fare via bluetooth ad esempio) semplicemente sfruttando l’indirizzo di rete dell’openmoko e la porta su cui è in ascolto gpsd: solitamente 192.168.0.202:2947.

Cambiare la cartella di salvataggio delle mappe di TangoGPS su OpenMoko

TangoGPS è sicuramente uno dei migliori software di tracking disponibili su OpenMoko, tra le tante funzioni utili sicuramente la migliore è quella di poter visualizzare la posizione attuale e il percorso che si sta tracciando sulle mappe di OpenStreetMap.

Purtroppo la memoria interna dell’OpenMoko è limitata e non è possibile, ad esempio, scaricare tutta l’Italia al livello massimo, per cui è comodo salvare le mappe sulla memory card esterna. Se si prova a cambiare il percorso di storage dalla tab config di TangoGPS, il software restituisce un errore di segmentation fault e va in crash.

Per cambiare la cartella di salvataggio dal terminale, basta loggarsi via ssh all’OpenMoko e digitare:

gconftool-2 -s /apps/tangogps/repos \
"[OSM|http://tile.openstreetmap.org/%d/%d/%d.png|/media/card/Maps/OSM|\
0,Topo|maps-for-free|/media/card/Maps/maps4free|\
0,Aerial|openaerial|/media/card/Maps/openaerial|\
0,Opencyclemap|http://a.andy.sandbox.cloudmade.com/tiles/cycle/%d/%d/%d.png|/media/card/Maps/opencyclemap|\
0,Google Sat (testing only)|http://khm1.google.com/kh?v=34&hl=en&x=%d&s=&y=%d&z=%d|/media/card/Maps/googlesat|1]" \
--type list --list-type string

OSMit 2009

Che dire di OSMit 2009? Semplicemente un’esperienza fantastica che ha riunito buona parte delle persone che gravitano intorno al progetto.

Guest star è stato il fondatore stesso di OpenStreetMap – Steve Coast – con cui non poteva mancare una foto che è stato così gentile sa spiegarmi personalmente come funziona il tile cache server personalizzato di Cloudmade. :D

dscf31111

dscf3125

Durante i due giorni della conferenza si sono discussi temi importanti e ci sono state dimostrazioni reali di possobili applicazioni di mappe e dati messi a disposizione dal progetto OpenStreetMap.

Io ho presentato il software OSMQuake, di cui a breve rilascerò il codice, per visualizzare gli ultimi eventi sismici dell’Istituto Nazionale di Geofisica sulle mappe di OpenStreetMap.

pres

Di seguito poteve visualizzare le slide con slideshare e da scaricarle da qui.



Installare tastiere finger friendly per OpenMoko

Anche se finalmente shr sta cominciando ad assomigliare a qualcosa di simile ad un telefono utilizzabile (la velocità di apertura delle applicazioni è molto migliorata), le tastiere di default di Illume non sono molto comode da usare con le dita.

Fortunatamente alcuni utilizzatori volenterosi hanno creato delle tastiere, anche con lettere accentate, più semplici da usare senza l’ausilio di un pennino, vediamo come installarne qualcuna.

La prima tastiera è quella scritta da Carlo Minucci, è molto utile per scrivere gli sms perché contiente le lettere accentate, per installarla basta un:

#: opkg install http://minucci.net/file/opkg/illume-keyboard-italian-sms_0.1_all.opk

Minucci illume italian keyboard

Se navigate su internet dal mokkolo allora dovete assolutamente installare la tastiera per il browser:

#: opkg install http://www.opkg.org/packages/illume-keyboards-browse_0.2_all.opk

Anche la tastiera dei numeri ha i tasti piccoli, per usarla con più comodità è possibile installare una tastiera numerica alternativa:

#:opkg install http://www.opkg.org/packages/illume-keyboards-numbers-alt_0.3_all.opk

Un’altra tastiera ottimizzata per gli sms -senza lettere accentate- è OptimSMS:

#: opkg install http://www.opkg.org/packages/OptimSMS_1.1_armv4t.opk

optimsms_illume_keyboard

Tutte le tastiere possono convivere fra di loro e per passare da una tastiera all’altra si può usare il pulsante di alto a destra nella tastiera attuale:

keyboard_switch

Visualizzare gli ultimi eventi sismici dal sito INGV (usando OpenStreetMap)

Stamattina un amico (TheDom), studente dell’Università dell’Aquila fortunatamente scampato al terremoto, mi ha chiesto di aiutarlo a creare uno script che si interfacciasse con il sito dell’Istituto Nazionale di Geofisica e Vulcanologia e che visualizzasse i dati degli ultimi eventi sismici e restituisse un link ad OpenStreetMap per visualizzare la cartina.

Guardando il codice dell’homepage del sito mi sono accorto che i singoli eventi erano racchiusi nel tag <tr class=”print_light”> e i dati dell’evento erano racchiusi nei tag figli <td class=”td_events”>.

<tr class="print_light"  [...]>
<td class="td_events">1206577780</td>
<td class="td_events">&nbsp;</td>
<td class="td_events">2009/04/11</td>
<td class="td_events">16:18:34</td>
<td class="td_events">42.264</td>
<td class="td_events" width="45px">13.486</td>
<td class="td_events">9</td>
<td class="td_events">Ml:2.8</td>
<td class="td_events">&nbsp;</td>
<td class="td_events">Valle_dell'Aterno</td>
</tr>


Considerata la regolarità del codice, ho sfruttato le potenti funzionalità del modulo di parsing BeautifulSoup, per raccogliere facilmente i dati dal sito.

Il cuore dello script è costituito dalla funzione DataCollect che, preso il codice della pagina in input, trova tutti i tag che corrispondono a <tr class=”print_light”>. In seguito, cercando all’interno dei singoli tag <tr>, restituisce, sotto forma di lista, il testo contenuto nei tag figli <td>.

def DataCollect(pagina,id):
     """Restituisce una lista con i dati desiderati"""
     lista = []
     dati = pagina.findAll('tr',attrs={"class":"print_light"})[id]
     dati = dati.findAll('td',attrs={"class":"td_events"})
     for i in dati:
     lista.append(i.string)
     return lista


La riga di codice numero 4 trova tutti i tag tr avente gli attributi definiti nel dizionario {“class”:”print_light”} passato come variabile. Considerando che l’istanza findAll dell’oggetto pagina restituisce, sotto forma di tupla, il contenuto dei singoli tag tr, è possibile accedere al contenuto di un solo tag tr usando gli indici della tupla (il numero tra parentesi quadre). Dopodiché è possibile rieseguire una seconda istanza findAll sull’oggetto dati (riga 5), che come abbiamo visto in precedenza contiene solo il contenuto di un solo tag, cercando questa volta tutti i tag td. A questo punto l’oggetto dati è una tupla contenente tutti i tag td, figli del tag tr (quelli mostrati nel codice html precedente). Infine basta iterare all’interno di questa tupla (riga 6), assegnando ad una lista (inizializzata alla riga 3) il contenuto dei signoli tag td ottenuti attraverso l’istanza string (riga 7).

La funziona Parsing legge semplicemente il contenuto della pagina html e lo passa a BeautifulSoup per l’elaborazione.

def Parsing(link):
     """Restituisce il parsing della pagina"""
     try:
         socket = urlopen(link)
         testo = BeautifulSoup(socket.read())
         socket.close()
     except:
         return ("""Si è riscontrato un errore durante l'apertura del link, prima \
         di procedere:\t
         1) controllare la connessione ad internet\t
         2) assicurarsi che il link esista\t
         3) assicurarsi che il link sia scritto correttamente (ricordarsi di scrivere \
         anche http://)\t
         4) controllare i permessi per accedere alla rete.""")
 return testo


Alla riga 5 la funzione apre il link dell’home page dell INGV e alla riga 6 l’istanza read(), che restituisce il contenuto html della pagina, viene passata all’elaboratore BeautifulSoup.

Infine l’ultima funzione, formatta l’output in maniera colorata e più “umana” sfruttando il modulo scritto da Checkm.

def HeartquakePrint(lista):
     """Formatta e stampa i dati dell'evento sismico"""
     print cms.color("<red>Dati riepilogativi evento sismico</red>")
     print cms.color("<green>Link diretto:</green>   <yellow>http://cnt.rm.ingv.it/~earthquake/data_id/%s/event.php</yellow>") % lista[0]
     print cms.color("<green>Data:</green> <yellow>%s</yellow>") % lista[2]
     print cms.color("<green>Ora:</green> <yellow>%s</yellow>") % lista[3]
     print cms.color("<green>Latitudine:</green> <yellow>%s N</yellow>") % lista[4]
     print cms.color("<green>Longitudine:</green> <yellow>%s E</yellow>") % lista[5]
     print cms.color("<green>Link OpenStreetMap:</green> <yellow>http://www.openstreetmap.org/?lat=%s&lon=%s&zoom=17&layers=B000FTF</yellow>") % (lista[4],lista[5])
     print cms.color("<green>Magnitudo:</green> <yellow>%s</yellow>") % lista[7]
     print cms.color("<green>Distretto sismico:</green> <yellow>%s</yellow>\n") % lista[9]

Il modo più semplice per eseguire lo script (sia su windows che su linux) è quello di scaricare l’archivio contenente tutti i file necessari all’esecuzione da qui. Scompattarlo ed eseguirlo digitando in un terminale:

$: python script.py

Questo è il risultato finale:

ingv_screen

Pycp: usare cp con una progress bar

Per quanti usano ancora il comando del terminale cp per copiare i file risuslterà comodo installare pycp, un wrapper di cp scritto in python che implementa una progress bar tetstuale per ogni singolo file trasferito.

E’ molto comondo nel caso di trasferimento di grosse cartelle, in cui il cursore rimane immobile (sembra quasi bloccato) fino a trasferimento completato. Con pycp è possibile vedere, oltre alla progress bar, anche la velocità di trasferimento e l’ETA (estimated time of arrival) di ogni singolo file!

Per installarlo è necessario scaricare ed installare prima il modulo python-progressbar:

$: wget http://pypi.python.org/packages/source/p/progressbar/progressbar-2.2.tar.gz

$:  tar xvf progressbar-2.2.tar.gz

$:  cd tar xvf progressbar-2.2.tar.gz

$: sudo python setup.py install

A questo punto scarichiamo ed installiamo pycp:

$: wget http://yannick-lm.dyndns.org/soft/pycp/pycp-3.2.tar.gz

$: tar xvf pycp-3.2.tar.gz

$: cd tar xvf pycp-3.2.tar.gz

$: sudo python setup.py install

Per evitare di ricordarsi di digitare pycp al posto di cp è possibile creare un alias per la nostra shell, editando il file ~/.bashrc:

$: vim .bashrc

Inserendo la riga:

alias cp=’pycp’

Carichiamo le modifiche:

$: source .bashrc

In questo modo al comando cp verrà automaticamente sostituito pycp.

[How-to] Installare Lighttpd con MySQL e PHP5 su Debian Lenny

Lighttpd (pronuncia lighty) è un web-server , rilasciato sotto licenza BSD modificata, progettato per un uso ottimizzato delle risorse. Scritto da Jan Kneschke nel 2003, per distrarsi dal suo lavoro di tesi, è un potente web server che fa della scalabilità, dell’uso parsimonioso di risorse e dell’aderenza agli standard i suo cavalli di battaglia. E’ consigliato per macchine obsolete o per server con carichi di lavoro massicci, tra gli utilizzatori più famosi figurano Wikipedia ed OpenStreetMap.

Per installare Lighttpd con supporto MySQL e PHP5 su una macchina con Debian 5.0 Lenny, è sufficiente installare i seguenti pacchetti:

#: sudo apt-get install mysql-server mysql-client lighttpd php5-cgi php5-mysql

Durante l’installazione il sistema chiederà di inserire due volte la password di root, per cui non sarà necessario configurarla successivamente.

Puntando il browser su localhost, si ottiene la pagina di benvenuto di lighttpd in cui è descritta anche la configurazione del server:

pagina benvenuto lighttpd

Ricapitolando:

  • la document root è /var/www (come per apache)
  • il file di configurazione è /etc/lighttpd/lighttpd.conf
  • il programma cercherà i moduli cgi in /usr/lib/cgi-bin e il loro utilizzo deve essere abilitato con l’appropiata direttiva
  • i file di log sono salvati in /var/log/lighttpd e la loro rotazione può essere cambiata modificando il file /etc/logrotate.d/lighttpd

Abilitare il fastcgi per i file php

Per abilitare il fastcgi per i file php, per installare ad esempio un forum o un blog in php, è necessario editare due file.

In /etc/php5/cgi/php.ini, decommentare la riga

; cgi.fix_pathinfo = 0

Eliminando il punto e virgola e modificando la variabile zero in uno

cgi.fix_pathinfo = 1

In questo modo il percorso che indica il PHP-CGI viene impostata in maniera fissa piuttosto che essere ricavata da SCRIPT_FILENAME.

Nel file /etc/lighttpd/lighttpd.conf aggiungere la riga:

"mod_fastcgi",

dopo la riga

"mod_accesslog",

e in fondo al file aggiungere il percorso del PHP-CGI  (per le personalizzazioni e altri moduli si faccia riferimento alla documentazione ufficiale)

fastcgi.server = ( ".php" => ("localhost" => ( "bin-path" => "/usr/bin/php5-cgi",
"socket" => "/tmp/php.socket")))

Riavviare Lighttpd

#: /etc/init.d/lighttpd restart

Spostarsi nella DocumentRoot di Lighttpd e creare il file info.php in questo modo:

#: cd /var/www

#:  vi info.php

Premere il tasto i e aggiungere nel file la seguente riga:

<?php phpinfo(); ?>

Salvare e chiudere premendo Esc :wq.

Puntare il browser su localhost/info.php per controllare che tutto funzioni.

PasswordHasher, ovvero usare password multiple ricordandone soltanto una

La prima regola per ottenere un buon livello di sicurezza è utilizzare password diverse e molto complesse per ogni servizio. Quando si utilizzano tanti servizi, però, può risultare difficile ricordarsi tutte le password, soprattutto se sono lunghe e complesse, ed utilizzare una sola password può essere pericoloso perché in caso di compromissione della password tutti i servizi saranno accessibili!

Password Hasher è un componente aggiuntivo di Firefox che permette di risolvere il problema, sostituendo automaticamente nel campo password di un form, un hash complesso generato dall’unione tra una password -chiamata MasterKey- e l’Id del sito (di default il dominio di secondo livello). In questo modo tutto quello che dobbiamo fare è ricordarci la MasterKey che, combinata con l’Id, produrrà sempre password diverse e complesse.

Dopo averlo installato, accanto al campo delle password, comparirà un pulsante con il simbolo del cancelletto (#)

password hasher plugin button

Cliccandoci sopra compare il menù per generare l’hash

password hasher menu

Il campo Id sito, di default, viene automaticamente compilato con il dominio di secondo livello, ma è possibile personalizzarlo. Nel campo Master Key bisogna inserire la password (l’unica da ricordare) necessaria alla generazione dell’hash. Cliccando sul pulsante OK il plugin inserirà automaticamente l’hash appena generato nel campo password, sollevandoci dal dover ricordare ogni volta una password diversa.

Le caratteristiche della password finale sono completamente personalizzabili, sia in dimensione che in composizione, ovviamente consiglio di utilizzare cifre, lettere e caratteri di punteggiatura e una lunghezza di almeno 8 caratteri (più lunga sarebbe meglio, tanto non dobbiamo tenerla a mente!).

Aumentare ulteriormente la sicurezza

Password Haser genera automaticamente gli id partendo dal dominio di secondi livello ed inoltre memorizza gli id associati ad ogni sito e le caratteristiche delle relative password nel database di firefox in cui vengono salvate le password. Se siete paranoici e volete aumentareil grado di sicurezza potete impedire al plugin di salvare qualsiasi dato nel database di Firefox.

Dal menù del browser selezionate:

Strumenti –> Componenti Aggiuntivi –> PasswordHasher –> Preferenze

e impostate il grado di sicurezza su Alto, in questo modo dovrete anche inserire a mano (e quindi ricordare) l’id di ogni sito, la lunghezza e la composizione della password!

Utilizzare PasswordHasher su computer diversi dal proprio

Su computer diversi dal proprio è possibile utilizzare l’online tool ospitato sul sito ufficiale del progetto inserendo tutti i dati, compresi l’id, la composizione e la lunghezza della password.

Oppure è possibile creare un file html, da portarsi dietro su una penna usb o da caricare su un server, che memorizzi soltanto gli id e le caratteristiche delle password e che, dopo essere stato aperto in un browser, generi l’hash. Per creare il file html basta premere il pulsante Aiuto >> e poi Genera Html.

Sono tornato!

Dopo circa una settimana di interruzionea causa dell’account sospeso da parte del servizio di hosting, avevo inserito una email errata nel profilo e non mi è arrivato il nuovo contratto da sottoscrivere, il blog è di nuovo operativo e ci saranno presto nuovi post.
Stay tuned!

Flashing del modem GSM di OpenMoko (ovvero aggiornare il firmware)

Attenzione: questa procedura è pericolosa e potrebbe rendere definitivamente inutilizzabile il modem GSM del Neo, continuate a vostro rischio e pericolo!

Tra i (tanti!) problemi che ancora affliggono il Neo, uno dei più antipatici è il mancato riconoscimento di alcune sim (come quelle dell’operatore 3G) e il problema della continua oscillazione dello stato della sim da registrata a non registrata.

L’aggiornamento del firmware gsm alla versione Moko10 risolve il bug #666, permettendo l’utilizzo delle schede 3G con Openmoko; inoltre risolve, anche se non previsto espressamente, parte del bug #1024

La guida che segue è una traduzione del wiki ufficiale e mi ha permesso di utilizzare la sim 3G e la sim Vodafone da 128k che prima non si registrava alla rete.

Teoricamente la procedura di flashing può essere fatta da qualsiasi distribuzione che permetta un accesso SSH (cioè tutte!) ma, considerando che bisogna assicurarsi che niente stia utilizzando il modem gsm, è più comodo flashare il Moko con l’immagine FSO-console modificata da Mickey in modo da non far partire il modem all’avvio. In caso contrario assicuratevi che il modem sia completamente spento.

Flashiamo il Moko con l’immagine modificata digitando questi comandi dal terminale del nostro pc (o usando NeoTool):

$: wget http://people.openmoko.org/mickey/images/openmoko-fso-console-image-glibc-ipk--20081028-om-gta02.rootfs.jffs2.summary
$: sudo dfu-util -a rootfs -R -D ./openmoko-fso-console-image-glibc-ipk--20081028-om-gta02.rootfs.jffs2.summary
$: wget http://people.openmoko.org/mickey/images/uImage-2.6.24+r10+gitr75999+54524f4531c8b262431b794fea610d81bb351c86-r10-om-gta02.bin
$: sudo dfu-util -a kernel -R -D ./uImage-2.6.24+r10+gitr75999+54524f4531c8b262431b794fea610d81bb351c86-r10-om-gta02.bin

A flashing terminato accendiamo il Neo e una volta avviato (ricordate che non c’è la parte grafica!) ed ottenuto l’accesso SSH configuriamolo per accedere ad internet seguendo la guida.

Installiamo il software necessario alla procedura di flashing:

#: opkg install http://people.openmoko.org/joerg/calypso_moko_FW/fluid_0.0+svn20070817-r2_armv4t_eabi.ipk
#: opkg install http://people.openmoko.org/joerg/calypso_moko_FW/s3c24xx-gpio_1.0+svnr4130-r2.1_armv4t.ipk

Se non siamo nella home ritorniamoci e scarichiamo la versione moko10 del firmware

#: wget http://people.openmoko.org/joerg/calypso_moko_FW/gsm_ac_gp_fd_pu_em_cph_ds_vc_cal35_ri_36_amd8_ts0-moko10.m0

Accendiamo e spegniamo il modem GSM con questi comandi:

#: echo 0 >/sys/bus/platform/devices/neo1973-pm-gsm.0/power_on
#: echo 1 >/sys/bus/platform/devices/neo1973-pm-gsm.0/power_on
#: s3c24xx-gpio b7=0
#: echo "AT@POFF" >/dev/ttySAC0

Lanciamo FLUID specificando da dove leggere il nuovo file del firmware
(il secondo comando è tutto un rigo):

#: cd /usr/sbin
/usr/sbin #: FLUID_PORT=/dev/ttySAC0 FLUID_FLOWCONTROL=h fluid.exe \
-oO -b 115200 \ -f $HOME/gsm_ac_gp_fd_pu_em_cph_ds_vc_cal35_ri_36_amd8_ts0-moko10.m0

Dopo pochi secondi il terminale rimarrà in attesa mostrando questa scritta:

FLUID Revision 2.27, ...
Bootloader: (reset target)

A questo punto apriamo una nuova sessione SSH senza chiudere quella precedente e digitiamo:

#: s3c24xx-gpio b7=1

Sul terminale precedente noterete una specie di barra di avanzamento composta da dei meno racchiusi tra parentesi tonde che si trasformano prima in lettere e poi in asterischi. Dopo pochi minuti il processo termina e il terminale si presenta così:

(fluid, version 3) ok
Checksumming (269 * 8kB = 2152kB): ok
Flash Detect: (0xEC, 0x22A0) Samsung K5A3240CT ok
Program: (34 sectors, 267*8k=2136k) (*******************) ok

Adesso da uno dei due terminali digitiamo i seguenti comandi, io l’ho fatto dal secondo terminale (il terzo comando è su un solo rigo):

#: cat /dev/ttySAC0 &
#: echo -en 'AT\r' >/dev/ttySAC0
#: echo -en 'AT+CGMR\r' >/dev/ttySAC0 +CGMR: "HW: GTA, GSM: gsm_ac_gp_fd_pu_em_cph_ds_vc_cal_amd8_ts0-Moko10"
#: kill %1

Se non ci sono stati intoppi  la procedura di flashing è andata a buon fine e dovremmo riuscire ad utilizzare, dopo aver flashato una distribuzione usabile,  anche le sim che precedentemente non funzionavano.