Sqlite e' un database basato su un unico file che ha bindings in numerosi linguaggi; l'aspetto piu' interessanto dell'impiego con Python e' quello di essere inserito all'interno del linguaggio (per lo meno dalla versione 2.5 e superiori) e per questo motivo non e' necessario utilizzare librerie esterne per il suo impiego
Di seguito un esempio delle operazioni base effettuate impiegando Python...attenzione al commit finale (Sqlite ammette le transazioni atomiche)
-----------------------------------------------------------------
from sqlite3 import dbapi2 as sqlite
con = sqlite.connect('utenti.db')
cur = con.cursor()
#crea una tabella con un indice ad autoincremento
cur.execute('CREATE TABLE users (Id INTEGER PRIMARY KEY,username TEXT, password TEXT, email TEXT)')
#effettua alcuni inserimenti
# NULL serve per l'indice ad autoincremento
cur.execute('INSERT INTO users VALUES (NULL,"luca","password","lucainnoc@gmail.com")')
cur.execute('INSERT INTO users VALUES (NULL,"chiara","password","chiara@gmail.com")')
print "-----------------------"
#estrae tutte le righe
cur.execute('SELECT * FROM users')
for row in cur:
print row
print row[0]
print row[1]
print row[2]
print "-----------------------"
#estrae solo una riga
nome = "luca"
cur.execute("SELECT * FROM users WHERE username=:username", {"username": nome})
for row in cur:
print row
print "-----------------------"
#cancella una riga
cur.execute("DELETE FROM users WHERE username=:username", {"username": nome})
cur.execute('SELECT * FROM users')
for row in cur:
print row
print "-----------------------"
#cancella la tabella
cur.execute('DROP TABLE users')
con.commit()
cur.close()
mercoledì 28 novembre 2012
lunedì 26 novembre 2012
Ottenere l'Ip del telefono Android
Questa soluzione e' stata ripresa da questo post per poter ottenere l'indirizzo Ip del proprio terminale Android
Si devono per prima cosa impostare i permessi
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
--------------------------------------------------------
package com.example.ip;
import java.net.InetAddress;
import java.net.NetworkInterface;
import java.util.Enumeration;
import android.os.Bundle;
import android.app.Activity;
import android.util.Log;
import android.view.Menu;
import android.widget.EditText;
import android.widget.TextView;
public class MainActivity extends Activity {
private TextView ip_t;
public String getLocalIpAddress()
{
try {
for (Enumeration<NetworkInterface> en = NetworkInterface.getNetworkInterfaces(); en.hasMoreElements();) {
NetworkInterface intf = en.nextElement();
for (Enumeration<InetAddress> enumIpAddr = intf.getInetAddresses(); enumIpAddr.hasMoreElements();) {
InetAddress inetAddress = enumIpAddr.nextElement();
if (!inetAddress.isLoopbackAddress()) {
return inetAddress.getHostAddress().toString();
}
}
}
} catch (Exception ex) {
Log.e("IP Address", ex.toString());
}
return null;
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ip_t = (TextView) findViewById(R.id.ip);
String ip = getLocalIpAddress();
ip_t.setText(ip);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.activity_main, menu);
return true;
}
}
Si devono per prima cosa impostare i permessi
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
--------------------------------------------------------
package com.example.ip;
import java.net.InetAddress;
import java.net.NetworkInterface;
import java.util.Enumeration;
import android.os.Bundle;
import android.app.Activity;
import android.util.Log;
import android.view.Menu;
import android.widget.EditText;
import android.widget.TextView;
public class MainActivity extends Activity {
private TextView ip_t;
public String getLocalIpAddress()
{
try {
for (Enumeration<NetworkInterface> en = NetworkInterface.getNetworkInterfaces(); en.hasMoreElements();) {
NetworkInterface intf = en.nextElement();
for (Enumeration<InetAddress> enumIpAddr = intf.getInetAddresses(); enumIpAddr.hasMoreElements();) {
InetAddress inetAddress = enumIpAddr.nextElement();
if (!inetAddress.isLoopbackAddress()) {
return inetAddress.getHostAddress().toString();
}
}
}
} catch (Exception ex) {
Log.e("IP Address", ex.toString());
}
return null;
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ip_t = (TextView) findViewById(R.id.ip);
String ip = getLocalIpAddress();
ip_t.setText(ip);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.activity_main, menu);
return true;
}
}
--------------------------------------------------------
Se si esegue il programma sull'emulatore Android l'indirizzo IP mostrato e' 10.0.2.15 che tradisce chiaramente il fatto che l'emulatore stesso discenda direttamente da QEmu
Codici a barre in Android
Implementare un lettore di codici a barre all'interno della propria applicazione e' piuttosto semplice ma usa un approccio piuttosto differente alla norma....al posto di inserire una libreria all'interno della propria applicazione si richiama l'app esterna BarCodeScanner appartenente al progetto ZXing
Tramite una chiamata Intent il controllo viene mandato al BarCodeScanner che risponde il risultato all'interno delle variabili contents e format.
----------------------------------------------------------------------------
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_racecontrol);
Intent intent = new Intent("com.google.zxing.client.android.SCAN");
intent.putExtra("SCAN_MODE", "QR_CODE_MODE");
startActivityForResult(intent, 0);
}
});
}
public void onActivityResult(int requestCode, int resultCode, Intent intent) {
if (requestCode == 0) {
if (resultCode == RESULT_OK) {
String contents = intent.getStringExtra("SCAN_RESULT");
String format = intent.getStringExtra("SCAN_RESULT_FORMAT");
} else if (resultCode == RESULT_CANCELED) {
// Handle cancel
}
}
Tramite una chiamata Intent il controllo viene mandato al BarCodeScanner che risponde il risultato all'interno delle variabili contents e format.
----------------------------------------------------------------------------
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_racecontrol);
Intent intent = new Intent("com.google.zxing.client.android.SCAN");
intent.putExtra("SCAN_MODE", "QR_CODE_MODE");
startActivityForResult(intent, 0);
}
});
}
public void onActivityResult(int requestCode, int resultCode, Intent intent) {
if (requestCode == 0) {
if (resultCode == RESULT_OK) {
String contents = intent.getStringExtra("SCAN_RESULT");
String format = intent.getStringExtra("SCAN_RESULT_FORMAT");
} else if (resultCode == RESULT_CANCELED) {
// Handle cancel
}
}
domenica 25 novembre 2012
Inviare SMS in Android
Inviare SMS via programma in Android e' particolarmente semplice (2 linee) indicando solo il numero di cellulare ed il testo
------------------------------------------------------------------
SmsManager sms = SmsManager.getDefault();
sms.sendTextMessage(nr_cellulare, null, testo_sms, null, null);
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" />
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);
//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
#manda la richiesta
udp.sendto(data, (hostname, port))
#aspetta e stampa la risposta
data, server = udp.recvfrom(1024)
print data
#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
---------------------------------------------
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)
Iscriviti a:
Post (Atom)
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...



