giovedì 29 novembre 2012

Utilizzo SQLite con C

Per terminare la carrellata dell'utilizzo di SQLite (gia' visto qui e qui) si vede l'utilizzo con C sia su Linux che su Windows (mediante Dev-C++ con il DevPack SQLite). Verrano ripetute le operazioni (piu' o meno) gia' eseguite con gli altri linguaggi

Nel progetto Dev-C++ si devono impostare l'utlizzo della libreria SQLite come indicato nella figura sottostante


per utilizzare il programma mediante Dev-C++ e' necessario che la libreria libsqlite3-0.dll sia accessibile (nella stessa directory dove viene ubicato l'eseguibile oppure in una directory di sistema di Windows...attenzione che dal sito di SQLite si scarica una dll nominata sqlite3.dll che non funziona all'interno di Dev-C++..si deve impiegare quella inserita nel DevPack)

Altrimenti dentro Linux il file puo' essere compilato con la seguente riga di comando
gcc -o sqlite_test sqlite_test.c  -Wall -O3 -lsqlite3

di seguito viene riportato il codice sorgente che e' sostanzialmente autoesplicativo in quanto effettua delle exec di comandi SQL
------------------------------------------------------------------------

#include <stdio.h>
#include <stdlib.h>
#include <sqlite3.h>


int main(int argc, char **argv){
sqlite3 *db;
char *zErrMsg = 0;
int rc;

rc = sqlite3_open("utenti.db", &db);
if (rc == SQLITE_OK)
{
rc = sqlite3_exec(db, "CREATE TABLE IF NOT EXISTS users  (Id INTEGER PRIMARY KEY,username TEXT, password TEXT, email TEXT)", NULL, 0, &zErrMsg);
if (rc != SQLITE_OK) fprintf(stderr, "SQL error: %s\n", zErrMsg);

rc = sqlite3_exec(db, "INSERT INTO users VALUES (NULL,\"luca\",\"password\",\"lucainnoc@gmail.com\")", NULL, 0, &zErrMsg);
if (rc != SQLITE_OK) fprintf(stderr, "SQL error: %s\n", zErrMsg);
rc = sqlite3_exec(db, "INSERT INTO users VALUES (NULL,\"chiara\",\"password\",\"chiara@gmail.com\")", NULL, 0, &zErrMsg);
if (rc != SQLITE_OK) fprintf(stderr, "SQL error: %s\n", zErrMsg);

sqlite3_stmt *stmt;
rc = sqlite3_prepare_v2(db, "SELECT * FROM users", -1, &stmt, 0);
if (rc == SQLITE_OK) {
int nCols = sqlite3_column_count(stmt);
if (nCols)
{
for (int nCol = 0; nCol < nCols; nCol++)
printf("%s\t", sqlite3_column_name(stmt, nCol));
printf("\n");
while ((rc = sqlite3_step(stmt)) == SQLITE_ROW)
for (int nCol = 0; nCol < nCols; nCol++)
printf("%s\t", sqlite3_column_text(stmt, nCol));
printf("\n");
}
sqlite3_finalize(stmt);
}

rc = sqlite3_exec(db, "DELETE FROM users", NULL, 0, &zErrMsg);
if (rc != SQLITE_OK) fprintf(stderr, "SQL error: %s\n", zErrMsg);

sqlite3_close(db);
} else {
fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db));
sqlite3_close(db);
return 1;
}
return 0;

}

mercoledì 28 novembre 2012

Utilizzo di SQLite con Android

Riprendendo il precedente post qui verra' mostrato come usare SQLite all'interno di Android partendo da questo esempio

Per prima cosa si deve scrivere una classe di helper in cui sono identificate la struttura del Db e le operazioni da eseguire...per semplicita' viene utilizzata la struttura gia' vista nello script Python

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

package com.example.sqlite;

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteDatabase.CursorFactory;
import android.database.sqlite.SQLiteOpenHelper;

public class database {
SQLiteDatabase mDb;
     DbHelper mDbHelper;
     Context mContext;
     private static final String DB_NAME="users";//nome del db
     private static final int DB_VERSION=1; //numero del db
     
     public database(Context ctx){
             mContext=ctx;
             mDbHelper=new DbHelper(ctx, DB_NAME, null, DB_VERSION);        
     }
     
     public void open(){  
             mDb=mDbHelper.getWritableDatabase();
             
     }
     
     public void close(){ 
             mDb.close();
     }
     
     public void insertUtente(String name,String password, String email){ // genera l'INSERT
             ContentValues cv=new ContentValues();
             cv.put(UsersMetaData.USERNAME_KEY, name);
             cv.put(UsersMetaData.PASSWORD_KEY, password);
             cv.put(UsersMetaData.EMAIL_KEY,email);
             mDb.insert(UsersMetaData.USERS_TABLE, null, cv);
     }
     
     public void deleteUtente(String id) {
         mDb.delete(UsersMetaData.USERS_TABLE, UsersMetaData.ID + "=" + id, null);
     }

    
     public Cursor fetchUtenti(){ //genera la SELECT
             return mDb.query(UsersMetaData.USERS_TABLE, null,null,null,null,null,null);               
     }

     public class UsersMetaData {  // variabili
             static final String USERS_TABLE = "users";
             static final String ID = "_id";
             static final String USERNAME_KEY = "username";
             static final String PASSWORD_KEY = "password";
             static final String EMAIL_KEY = "email";
     }

     private static final String USERS_TABLE_CREATE = "CREATE TABLE IF NOT EXISTS "  //CREATE TABLE
                     + UsersMetaData.USERS_TABLE + " (" 
                     + UsersMetaData.ID+ " integer primary key autoincrement, "
                     + UsersMetaData.USERNAME_KEY + " text not null, "
                     + UsersMetaData.PASSWORD_KEY + " text not null, "
                     + UsersMetaData.EMAIL_KEY + " text not null);";

     private class DbHelper extends SQLiteOpenHelper { //helper

             public DbHelper(Context context, String name, CursorFactory factory,int version) {
                     super(context, name, factory, version);
             }

             public void onCreate(SQLiteDatabase _db) { //solo quando il db viene creato, creiamo la tabella
                     _db.execSQL(USERS_TABLE_CREATE);
             }

             public void onUpgrade(SQLiteDatabase _db, int oldVersion, int newVersion) {

             }

     }
}
---------------------------------------------------------

a questo punto si puo' procedere utilizzando la classe helper 
il codice e' sostanzialmente autoesplicativo
----------------------------------------------------------
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
database utenti =new database(getApplicationContext());
utenti.open();
utenti.insertUtente("luca", "password", "lucainnoc@gmail.com");
utenti.insertUtente("chiara", "password", "chiara@gmail.com");
        
Cursor c=utenti.fetchUtenti(); // query
        
int usernameCol=c.getColumnIndex(UsersMetaData.USERNAME_KEY);  //indici delle colonne
int passwordCol=c.getColumnIndex(UsersMetaData.PASSWORD_KEY);
int mailCol=c.getColumnIndex(UsersMetaData.EMAIL_KEY);
        
       if(c.moveToFirst()){  
            do {
                Log.d("select",c.getString(usernameCol)+" "+c.getString(passwordCol)+" "+c.getString(mailCol));                    
                    } while (c.moveToNext());//iteriamo al prossimo elemento
        }
    
utenti.deleteUtente("1");
        
if(c.moveToFirst()){  
        do {
            Log.d("select",c.getString(usernameCol)+" "+c.getString(passwordCol)+" "+c.getString(mailCol));                    
             } while (c.moveToNext());//iteriamo al prossimo elemento
    }
utenti.close();
        

Utilizzo di base di Sqlite con Python

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

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

}
--------------------------------------------------------
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
}
}

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" />

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

Analisi MNF su spettri di riflettanza di plastica

Devo cerca di lavorare su spettri di riflettanza di plastica e la prima domanda e': quale sono le bande significative? Sono partito dal ...