giovedì 12 gennaio 2012

Datalogger (prima versione funzionante)

Uno degli obbiettivi che mi sono posto nella programmazione in Python SL4A e' quello di realizzare un sensore a basso costo (una sorta di datalogger con la possibilita' anche di invio dei dati via Internet)
Il primo passo e' quello di registrare i dati ed inserirli in DB

Di seguito il programma ed una prima prova

Struttura del Database



Script Python SL4A
Il programma registra le accelerazione e le inclinazione sui tre assi del telefono e li inserisce in DB SQLite
------------------------------------------------------------------------------------------------------
import android, time, sqlite3
from time import strftime

droid = android.Android()
conn = sqlite3.connect('/sdcard/datalogger.db')
cursor = conn.cursor()
cursor.execute("CREATE TABLE IF NOT EXISTS dati (accx  REAL,accy  REAL,accz  REAL,tiltx REAL,tilty REAL,tiltz REAL,id INTEGER  PRIMARY KEY AUTOINCREMENT,tempo DATETIME)")


droid.startSensingTimed(1,1000)
time.sleep(3)
while True:
accx = str(droid.sensorsReadAccelerometer().result[0])
accy = str(droid.sensorsReadAccelerometer().result[1])
accz = str(droid.sensorsReadAccelerometer().result[2])
az = str(droid.sensorsReadOrientation().result[0])
pitch = str(droid.sensorsReadOrientation().result[1])
roll =  str(droid.sensorsReadOrientation().result[2])
orario = strftime("%Y-%m-%d %H:%M:%S")
sql_string = "INSERT INTO dati (accx,accy,accz,tiltx,tilty,tiltz,tempo) VALUES ('"+accx+"','"+accy+"','"+accz+"','"+az+"','"+pitch+"','"+roll+"','"+orario+"')"
cursor.execute(sql_string)
conn.commit()
time.sleep(1)

droid.stopSensing()
conn.close()
----------------------------------------------------------------------------------------------

Grafico della prima prova
La prima prova e' stata eseguita salendo e scendendo due rampe di scale (in rosso l'asse Z)



mercoledì 11 gennaio 2012

OS/2


 Quando gli uomini erano uomini ed il West era selvaggio esisteva OS/2...solo pochi fortunati lo hanno visto in esecuzione con i suoi task protetti (con Win3.1 ed MS/DOS suoi contemporanei si usava ancora il tasto di accensione/spengimento per terminare un processo)

 Adesso il tutto rivive in macchina virtuale...ma e' chiaro che tutto sarebbe stato diverso se non avesse vinto Windows




Debian+ACPI+BIOS+OldLaptop=Kaboom

una brutta esperienza con un portatile debianizzato...
il calcolatore ha installato Debian 6 ed ha funzionato correttamente per un po' quando una volta spento non si e' piu' riacceso. Niente Nada Nix. Nessuna schermata del BIOS, monitor nero e solo il led verde di presenza di tensione.
Mi sono ricordato che tempo prima su un portatile circa dello stesso periodo e funzionante con una vecchia versione di Debian era accaduta la stessa cosa una volta effettuata una installazione ex-novo della Debian 6.

Che il BIOS venga corrotto da Linux??? ci sono diversi post a giro per internet che dicono cio' ma sono per lo piu' molto specifici su modelli di macchine con BIOS con presenza di BUG

dopo averle provate di tutte ho smontato il portatile, rimosso la batteria della CMOS per una notte insieme alla batteria (che non funziona piu' ma volevo evitare che potesse comunque erogare un minimo di corrente per tenere in vita il BIOS) e riprovato il giorno successivo.


Giusto per avere un'idea smontare la batteria della CMOS nel portatile in esame non e' proprio una passeggiata...si deve prima smontare la tastiera, rimuovere un pannello in metallo per accedere alla motherboard, poi rimuovere una flat (quella di colore marrone in basso nella fotografia) e poi si riesce ad intravedere la batteria che e' ancora mezza nascosta dallo chassis


Il computer e' ripartito in splendida forma.
Il problema potrebbe essere individuato nel sistema di gestione dell'alimentazione..magari ha tentato di mandare in sleep un computer che non prevede quel determinato comando BIOS ed ha mandato a pallino tutto.

Per sicurezza ho quindi rimosso dal GRUB la gestione del risparmio energetico mettendo acpi=off nel file

cd /etc/default/grub

la stringa da modificare e'

GRUB_CMDLINE_LINUX="acpi=off"  

per rendere operativa la modifica si deve poi digitare

update-grub 

il calcolatore al momento non esegue lo spengimento in automatico (fa lo shutdown ma e' necessario l'intervento dell'utente per togliere la corrente mediante il pulsante di accensione) ma almeno sembra lavorare in modo corretto


IBM 380 DX

Nella ricerca di mettere in piedi vecchi portatili mi sono imbattuto in un IBM 380 DX, un computer datato 1997 con un processore P2 a 233 MHz, disco fisso da 1 Gb, memoria RAM di 96 Mb (la massima installabile !!!), un Cdrom ed una porta USB

In origine supportava Win 3.11, Win 95

Ho provato in tutti i modi possibili a renderlo vivo ma alla fine la scelta e' andata su PuppyLinux e Damn Small Linux; per la prima la poca esperienza ha fatto diventare l'installazione un inferno di reboot e tentativi, con la seconda una volta impostata il parametro FB800x600 al boot tutto ha funzionato alla mervaglia considerato il modesto hardware





Memoria in uso 14 Mb!!!

Accesso della memoria da cui si puo' sostituire la batteria CMOS (i due fili che escono a destra della foto)

Disgraziatamente il portatile soffre di grossi problemi di BIOS per cui alcune volte gli errori di boot sono superabili mentre in altri casi la macchina si pianta e non accenna ad andare in POST (in particolar modo dopo averla impiegata per circa un'ora diventa non piu' recuperabile)

martedì 10 gennaio 2012

Un visualizzatore di immagini veloce (molto)

Mi sono imbattuto un po' per caso in questo visualizzatore di immagini .... avendo da sfogliare gallerie molto grandi derivanti dalla fotocamera e' estremamente utile la velocita'.. consigliatissimo



domenica 8 gennaio 2012

Le mie applicazione Android

Una lista delle applicazioni per Android di cui non fare a meno:

  1. Aldiko (e-book reader)
  2. Bluetooth file transfer
  3. ConnectBot (Client SSH)
  4. Google Docs
  5. eGeo Compass (Bussola geologica)
  6. Emulatore di terminale
  7. File Expert (File Manager)
  8. Google Sky Map (planetario)
    gStrings (accordatore chitarra)
  9. Mame4droid (Mame)
  10. My Backup
  11. Orux Maps (gestore GPS con cartografia Google offline)
  12. Python per Android
  13. QuickPic (visualizza iimagini)
  14. RunKeeper (allenatore podistico)
  15. SL4A
  16. Stato GPS
  17. Waw (cracca password Alice)
  18. Tape-a-talk (registratore vocale)
  19. Navigon (navigatore stradale)

venerdì 6 gennaio 2012

Exim + Dovecot su localhost

Per lavoro ho la necessita' di provare un programma che impiega il protocollo Imap per cui mi sono dovuto montare un server Imap sul portatile per le prove....non e' poi cosi' banale come sembra.

I server che hanno dato meno problemi di configurazione sono stati

Exim come MTA
Dovecot come IMAP

Exim smista la posta su localhost senza nessuna modifica alle configurazioni.
I file della posta non sono nella home degli utenti ma di default vanno in /var/mail

per questo motivo il file di configurazione di Dovecot deve essere modificato come segue
-------------------------------------------------------------------------------------------

protocols = imap imaps
listen = localhost
disable_plaintext_auth = no
shutdown_clients = yes

mail_location = mbox:~/mail:INBOX=/var/mail/%u
protocol imap {
}
protocol pop3 {
}
protocol lda {
  postmaster_address = postmaster@example.com
}
auth default {
  mechanisms = plain
  passdb pam {
    args = "*"
  }
  userdb passwd {
  }
  user = root
}
dict {
}
plugin {
}


--------------------------------------------------------------------------------------------

per testare il programma si possono mandare le mail tra due utenti (per esempio root e l'utente non privilegiato). Per farlo si puo' usare il vetusto comando mail da linea di comando
mail - s titolo luca
premendo invio due volte si puo' scrivere il testo del messaggio. Per terminare bisogna battere invio andando su una riga vuota e successivamente premere CTRL+D

per testare se il server funziona si puo' usare il programma Mutt dei bei vecchi tempi con l'interfaccia a caratteri. Per collegarsi con il protocollo Imap si deve usare la sintassi
mutt -f imap://luca@localhost
La prima volta viene richiesta di accettare la chiave di identificazione del server e successivamente si deve inserire la password dell'utente (la stessa del login dell'utente Linux)

mercoledì 4 gennaio 2012

Egroupware su Ubuntu

Un curioso comportamento di Egroupware su Ubuntu che avrebbe potuto mandarmi fuori di testa se avessi dovuto risolverlo da solo.

Il programma genera un errore
Error 324 (net::ERR_EMPTY_RESPONSE): Unknown error
visualizzando alcune pagine in modo sostanzialmente casuale

fortunatamente si tratta di un fenomeno conosciuto e descritto qui a cui si risolve semplicemente disabilitando la cache APC di Php commentando l'unica riga contenuta nel file /etc/php5/apache2/conf.d/apc.ini e riavviando Apache

martedì 3 gennaio 2012

Backup incrementale con versioning su Linux

Uno dei problemi piu' comuni nel gestire un file server e' quello di realizzare un sistema affidabile di backup che sia incrementale e gestisca anche il versioning ovvero mantenga distinte le varie fasi di lavorazione di programma o file CAD che si voglia

la soluzione definitiva e' Rsnapshot

il programma si installa da
apt-get install rsnapshot

la configurazione si esegue da root editando il file /etc/rsnapshot.conf

modificando la voce snapshot_root si decide dove devono essere salvati i file di backup
al termine del file vengono configurate quali sono le directory da salvare riunendoli in gruppi
(nell'esempio localhost e' il gruppo)

La rotazione dei backup avviene semplicemente mediante crontab editando il file /etc/cron.d/rsnapshot


Una volta in esecuzione vengono generati i file con nomi che terminano con un numero; il numero 0 indica la versione piu' recente

Uno degli aspetti piu' fuorvianti e' che in tutte le directory ci sono gli stessi file e non e' immediato capire come viene gestito il versioning. Per risparmiare spazio disco i file che sono rimasti immutati dall'ultima esecuzione non vengono copiati ma viene creati un hard link visibile con il comando ls -l


Per eseguire un restore e' sufficiente copiare il file desiderato dal backup alla postazione originale. Da notare che il restore puo' essere eseguito solo da root in quando la directory di backup ha permessi 700


lunedì 2 gennaio 2012

GPS+Python+Android


Un esempio base per la gestione del GPS su Android via Python
(molto molto grezzo ma funzionante)

------------------------------------------------------------------------------------
import android, math
from time import sleep
droid = android.Android()
droid.startLocating()




title = ''
message = 'Acquisizione del punto'
droid.dialogCreateSpinnerProgress(title, message)
droid.dialogShow()
sleep(15)
droid.dialogDismiss()


location = droid.readLocation().result


if location == {}:
        location = droid.getLastKnownLocation().result


print location
print location['gps']
print location['network']
print location['network']['latitude']
print location['network']['longitude']
print location['network']['altitude']
print location['network']['accuracy']
print location['network']['speed']

Semplice esempio di SqlLite con Python per Android


nessuna pretesa...giusto una snippet
---------------------------------------------------------------------------
import sqlite3
import android


nome = ""
droid=android.Android()
# Connect to database file, create it if it does not exist
conn = sqlite3.connect('/sdcard/sqlitedemo.db')




# Get a cursor
cursor = conn.cursor()




# Create a table
cursor.execute("CREATE TABLE IF NOT EXISTS anagrafica (nome text)")




# Insert some data
while nome<>"exit":
     nome=droid.dialogGetInput("","Il nome prego").result
     sql_string = "INSERT INTO anagrafica VALUES ('"+str(nome)+"')"
     print sql_string
     cursor.execute(sql_string)
     conn.commit()




# Read the data back out
cursor.execute("SELECT * from anagrafica")
for row in cursor:
     print row

Client/Server in UDP tra Android e PC tutto con Python

per scambiare messaggi via rete tra il cellulare Android ed un PC la soluzione piu' semplice e' usare il protocollo UDP.
Di seguito una breve implementazione di prova tutta in Python

--------------------------------- SERVER su PC------------------------

# Server program

from socket import *

# Set the socket parameters
host = "192.168.1.98" #Importante - settare l'indirizzo reale della macchina SERVER
port = 21567
buf = 1024
addr = (host,port)

# Create socket and bind to address
UDPSock = socket(AF_INET,SOCK_DGRAM)
UDPSock.bind(addr)

# Receive messages
while 1:
data,addr = UDPSock.recvfrom(buf)
if not data:
print "Client has exited!"
break
else:
print "\nReceived message '", data,"'"

# Close socket
UDPSock.close()
--------------------------------------------------------------------------------------

---------------------------- Client UDP su Android ---------------------------

import android
import socket
droid = android.Android();


hostname = "192.168.1.98"; # Hostname o IP del server
port = 21567;# Port
data = "";
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM);
s.connect((hostname,port));
print "Connected!";

data = "test"
exit = False;
while not exit:
    s.sendto(data,(hostname,port)); # Sending command  

--------------------------------------------------------------------------------------

s

Sensori su Android in Python

Un esempio di come leggere i sensori sul telefono mediante Python su Android

Attenzione : la lettura del sensore di luce, almeno per me, ha funzionato solo disattivando il gestore automatico dell'illuminazione dello schermo dal widget Risparmio energia
-------------------------------------------------------------------------------------------

import android, time
droid = android.Android()
droid.startSensingTimed(1,1000)
time.sleep(3)
for x in range(0,10):
#print "Accelorometro " + str(droid.sensorsReadAccelerometer().result)
print "Accelorometro asse X " + str(droid.sensorsReadAccelerometer().result[0])
print "Accelorometro asse Y " + str(droid.sensorsReadAccelerometer().result[1])
print "Accelorometro asse Z " + str(droid.sensorsReadAccelerometer().result[2])
#print "Magnetometro " + str(droid.sensorsReadMagnetometer().result)
print "Magnetometro asse X" + str(droid.sensorsReadMagnetometer().result[0])
print "Magnetometro asse Y" + str(droid.sensorsReadMagnetometer().result[1])
print "Magnetometro asse Z" + str(droid.sensorsReadMagnetometer().result[2])
#print "Orientazione "+ str(droid.sensorsReadOrientation().result)
print "Azinuth "+ str(droid.sensorsReadOrientation().result[0])
print "Pitch "+ str(droid.sensorsReadOrientation().result[1])
print "Roll "+ str(droid.sensorsReadOrientation().result[2])
# Azimuth e' l'orientazione rispetto al Nord come la bussola da 0 a 360 in senso orario
#Pitch e' l'inclinazione con la parte sinistra inclinata al massimo si ha +90, con la parte
#destra sollevata si ha -90
#Roll e' l'inclinazione del telefono in avanti ed indietro
print "Luce "+ str(droid.sensorsGetLight().result)
# Valore Luce
# 0 = luce stellare
# 1 = Luna piena
# 5 = scintillio
# 30 = luce da stanza
# 80 = corridoio
# 100 = giornata nuvolosa e coperta
# 400 = luce da ufficio
# 500 = Alba o tramonto
# 1000 =
# 25000 = pieno giorno non illuminato direttamente dal Sole
# 200000 = illuminazione diretta solare
print "Accuratezza "+ str(droid.sensorsGetAccuracy().result)
# 3 valore piu' alto di accuratezza

time.sleep(1)
droid.stopSensing()
---------------------------------------------------------------------------------

Orientamento degli assi




domenica 1 gennaio 2012

Utilizzare un client NTP

A volte, specialmente su hardware vecchio, il BIOS fa le bizze e si perdono le impostazioni di ora e data.
E' utile quindi utilizzare il servizio NTP per aggiornare l'ora via rete

Su Debian deve essere installato il pacchetto

apt-get install ntpdate

da utilizzare poi con il comando

ntpdate ntp1.ien.it

FigSpec FS-60CL

A lavoro mi hanno rifilato questo sensore iperspettrale cinese (pushbroom 400-1000 nm con larghezza di banda di 0.5 nm compatibile con DJI M...