venerdì 23 novembre 2012

Comunicazione UDP tra PC e Android

In questo post viene descritta la possibilita' di stabilire una connessione UDP tra il telefono Android in funzione Server ed un PC mediante script Python

per il lato server (Android) si deve creare un programma che inserisca tra i permessi di AndroidManifest.xml la seguente riga

<uses-permission android:name="android.permission.INTERNET" />

sulla funzione OnCreate si puo' creare il server UDP come riportato nell'esempio seguente (porta di connessione 12345 e lunghezza massima del pacchetto 1024 bytes
------------------------------------------------------------

protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
   String lText;
   byte[] lMsg = new byte[1024];
   DatagramPacket dp = new DatagramPacket(lMsg, lMsg.length);
   DatagramSocket ds = null;
   while (true)
   {
   try {
       ds = new DatagramSocket(12345); //porta del server UDP 12345

//riceve il pacchetto


       ds.receive(dp);
       lText = new String(lMsg, 0, dp.getLength());
       Log.i("Richiesta", lText);
        //manda la risposta

        byte[] b = "Risposta".getBytes();
        DatagramPacket sendPacket = new DatagramPacket(b, b.length, dp.getAddress(), dp.getPort());
        ds.send(sendPacket);      
        
   } catch (SocketException e) {
       e.printStackTrace();
   } catch (IOException e) {
       e.printStackTrace();
   } finally {
       if (ds != null) {
           ds.close();
       }
   }
   }
}

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

creato il server si passa al lato client in Python da mettere sul PC Desktop
il programma manda un pacchetto al server ed il server lo mette nel file di log
--------------------------------------------------
from socket import socket, AF_INET, SOCK_DGRAM
data = 'Richiesta'
port = 12345
hostname = 'localhost'
udp = socket(AF_INET,SOCK_DGRAM)
#manda la richiesta
udp.sendto(data, (hostname, port))
#aspetta e stampa la risposta

data, server = udp.recvfrom(1024)
print data
--------------------------------------------------

per poter effettuare le prove con l'emulatore di Android ci si collega via telnet alla shell dell'emulatore(telnet localhost 5554) e si digita 
redir add udp:12345:12345

che reindirizza le chiamate alla porta localhost:12345 del Desktop alla porta 12345 dell'emulatore dove gira il server

Leggere SMS in Android



Per leggere  gli SMS contenuti nel telefono e' sufficiente inserire la regola in AndroidManifest.xml


<uses-permission android:name="android.permission.READ_SMS"/>

e poi usare il codice seguente 

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

Uri uriSms = Uri.parse("content://sms/inbox");
Cursor cursor = getContentResolver().query(uriSms, new String[]{"_id", "address", "date", "body"},null,null,null);
cursor.moveToFirst();
while  (cursor.moveToNext())
{
        String id = cursor.getString(0);
         String address = cursor.getString(1);
         String body = cursor.getString(3);
         Log.d("testo",id + " "+address + " "+body);
}

giovedì 22 novembre 2012

Convertire stringhe in datetime in Python

per lavoro ho avuto la necessita' di leggere in input un file testo con una serie di stringhe rappresentanti delle letture effettuate nel tempo e dover capire quale fosse la differenza di tempo tra le acquisizioni

Il metodo piu' semplice e' quindi convertire le stringhe in un formate datetime e poi effettuare le operazioni

In Python la cosa si risolve cosi

---------------------------------------------
from datetime import datetime

data1 = datetime.strptime('Jun 27 2012  7:14PM', '%b %d %Y %I:%M%p')

data2 = datetime.strptime('Jun 27 2012  7:16PM', '%b %d %Y %I:%M%p')
diff = data2 - data1
print diff
print diff.seconds 
---------------------------------------------
che riporta come risulta 0:02:00 ovvero l'attesa differenza di 2 minuti e la differenza espressa in secondi (120)

mercoledì 14 novembre 2012

Snail Mail da Google

E' troppo curioso ricevere una lettera di carta da Google per non pubblicarlo


fra parentesi e' un pubblicita' per AdWords




martedì 13 novembre 2012

Slax

Sempre alla ricerca di creare un sistema Linux da portarmi a giro come Live Cd mi sono imbattuto in SLAX una derivata da Slackware


Boot di Slax

la caratteristica piu' interessante e' quella di non fornire una ISO prestabilita ma di poter creare la propria Linux Box con la funzione Slax Build

In estrema sintesi si puo' partire da un sistema di base ed aggiungere i vari moduli di interesse (io mi sono creato un sistema per la programmazione) fino ad scaricare un file .iso con tutto montato
Il sistema non e' perfetto e le dipendenze devono essere in qualche caso corrette a mano ma in fin dei conti e' poca cosa

Il modulo CodeBlocks aggiunto alla ISO
Interessante e' anche la possibilita' di salvare la configurazione dei moduli su un file per poterlo correggere o riprendere la selezione in un secondo tempo

Creare una Live-Cd partendo da una installazione funzionante

Una delle cose che ho sempre desiderato e' quella di potermi portare dietro i programmi e le impostazioni che mi servono anche se non ho dietro il portatile

Ho cosi' provato un po' di soluzioni per poi decidere il sistema riportato da Remastersys

Non volendo sacrificare il portatile mi sono creato una macchina virtuale minimale partendo da una installazione standard di Ubuntu Server 12.04 (Remastersys non gestisce Debian Testing e quindi ho escluso di provare su Debian) per poi aggiungere openbox

apt-get install openbox obconf obmenu openbox-themes startx xterm

in questo modo si ha un ambiente grafico minimale
E' giunto il momento di creare una iso del nuovo sistema prima aggiungendo ad apt la chiave del repository di Remastersys

wget -O - http://www.remastersys.com/ubuntu/remastersys.gpg.key | apt-key add -

dopo si modifica il file /etc/apt/sources.list aggiungendo la riga
deb http://www.remastersys.com/ubuntu precise main

seguito dall'aggiornamento di apt
apt-get update
e
apt-get install remastersys

e' giunto il momento di creare il file iso includendo anche i file personali (e non solo quelli di sistema)
remastersys backup nome_file.iso

il file viene generato nella directory /home/remastersys

dopo un (bel) po' viene creato il file iso che puo' essere masterizzato o messo su chiavetta USB e distribuito
Al riavvio si presenta questo menu


e tutto funziona magnificamente

lunedì 12 novembre 2012

Wget dietro proxy server

Per utilizzare il comando wget in una rete schermata da un proxy server non e' sufficiente impostare la variabile bash http_proxy con il comando

export http_proxy=http://myproxy:8080

perche' il programma di fatto non legge questa impostazione

la soluzione piu' semplice e' creare un file .wgetrc inserendo la stringa
http_proxy=http://myproxy:8080

Physics informed neural network Fukuzono

Visto che puro ML non funziona per le serie tempo di cui mi sto occupando ed le regressioni basate su formule analitiche mostrano dei limiti...