Python: Creare entry con autocompletamento

L’autocompletamento è sicuramente una delle funzionalità più utili per velocizzare l’uso dei nostri software ai nostri utenti. Basti vedere quanto è utile avere una lista delle possibili parole chiave ricercate quando utilizziamo un motore di ricerca.

Vediamo come realizzare una semplice completition, per un entry, scritta in pygtk.


Analizziamo il codice saltando le funzioni tipiche e basilari del linguaggio per concentrarci su quelle di nostro interesse.

Dalla riga 9 alla riga 12 abbiamo creato la nostra finestra e ci abbiamo collocato all’interno la nostra entry. Nella riga 13 si nota l’istanza per una completition. Una gtkCompletition è un oggetto ausiliare da usare in combinazione con una entry. Esso si occupa di creare il popup contenente le stringhe utili da poter poi gestire e mostrare all’interno dell’oggetto a cui esso è connesso. Nella riga successiva, 14, c’è, invcece, l’istanza per una liststore. Essa non è altro che un contenitore che si occuperà di contenere dei dati del tipo definito dal costruttore. Nel nostro caso i dati al suo interno saranno stringhe poichè al costruttore è stato passato come argomento str. Le righe 15–17 rappresentano un ciclo for che si occupa di riempire la liststore, precedentemente creata, con un passaggio iterativo dei dati contenuti in una lista. Ciò viene fatto poichè, come detto, la liststore è costruita in modo tale da contenere stringhe e perciò ogni elemento prelevato dalla nostra lista è di per sè una stringa se preso singolarmente. La riga 18 ci dice che la completition viene riempita con i dati presenti nella liststore mentre la 19 connette la completition al rispettivo metodo della nostra entry. La riga 20, come facilmente intuibile, setta una caratteristica della completition, le colonne. la riga 21, se analizzata con attenzione, mostra come un evento viene connesso alla entry in modo tale da richiamare, quando necessario, la funzione definita successivamente, autocompletamento. La riga 22 mostra il form creato.

Passiamo all’analisi della funzione autocompletamento. Come si vede essa ha due paramenti, il tradizionale self e la entry alla quale la stessa viene applicata. La riga 26 trasferisce il testo contenuto nella entry in una variabile di tipo testo e di nome text, l’if alla riga 27 controlla che tale stringa sia piena. Se text contiene qualche carattere allora c’è il controllo dell’if alla riga 28 che si occupa di ridefinire il contenuto della liststore con le stringhe filtrate con il contenuto della nostra entry.

Spero che l’analisi sia stata abbastanza dettagliata e possa essere utile a qualche sviluppatore. In caso di dubbi basta un commento.

Guida al C: parte 2 (Il resto del Pinguino)

Le variabili e le costanti in C

Per variabile si intende una porzione di memoria atta a contenere un determinato dato che potrà poi essere modificato nel corso dell’uso del programma. Essa può essere inizializzata all’atto della sua dichiarazione con un valore di default o può essere dichiarata senza alcun valore. In tal caso il linguaggio non garantisce un valore
iniziale utile. Ad esempio una variabile può essere dichiarata ed inizializzata in due modi diversi. Per doppio passaggio:

// dichiaro
int x;
// inizializzo
x = 14;

o direttamente:

// dichiaro ed inizializzo
int x = 14;

Una costante, invece, è una porzione di memoria che viene dichiarata per contenere un determinato tipo di dato e ne conserva il valore per tutta la durata dell’uso del programma senza mai poterne modificare il valore. Ogni variabile o costante nel C deve essere identificata da un nome al quale si farà poi riferimento nel corso dello svolgimento del programma per leggere o scriverci dati. Il nome delle variabili in C è arbitrario e può
avere lunghezza variabile però il compilatore si interesserà solo delle prime 8 lettere che lo compongono. Quindi anche se a prima vista un dato di nome “variabile1” pare diverso da “variabile2”, il compilatore restituirà errore poichè vedrà due variabili con lo stesso nome ovvero “variabil”. Il C è un linguaggio che basa la sua struttura sui dati. Dati diversi, infatti, equivalgono a cose diverse. Questo tipo di gestione permette di avere un buon uso della memoria perché ad ogni tipo di dato è dedicata la giusta quantità di memoria e in più dà la possibilità di usare o creare strutture ad hoc per le diverse esigenze di sviluppo. Il C gode delle presenza di 6 tipi di dati base:

char
int
long
short
float
double

Il char è il dato adibito alla gestione dei caratteri. Ogni volta che viene dichiarata una variabile di tipo char essa occupa una quantità di memoria pari a 8 bit (1 byte). Il char, nonostante sia effettivamente un tipo di dato numerico, permette la gestione del suo valore come una normale “lettera”. Un array (vettore) di char permette la virtualizzazione di una stringa mentre, in altri linguaggi, esiste ormai un tipo di dato string dedicato. Un esempio di dichiarazione di un dato char inizializzato è:

char carattare = ‘ a’ ;

E’ importante notare come definire il carattere ‘8’, ad esempio, è totalmente diverso dalla definizione di un valore intero 8. Un char che contiene il carattere ‘8’ in realtà avrà al suo intero il valore numerico che, in base alla codifica in uso, equivale a quel determinato carattere mentre una variabile numerica che contiene 8 avrà proprio quel valore preciso in memoria.

L’ int è il tipo adibito a contenere dati numerici di numeri interi o meglio definiti come numeri naturali. Tali numeri, pertanto, devono contenere numeri senza virgole, frazioni, parti immaginarie, etc… un dato di tipo int, all’atto della sua dichiarazione, occupa 16 bit (2 byte). I valori che un int può assumere vanno da -32.768 a +32.767 se si usa il segno (valori positivi o negativi) o va da 0 a 65535 per soli numeri interi. Un esempio di dichiarazione di un dato int inizializzato è:

int numIntero = 14;

Long può essere visto come un particolare int creato appositamente per ovviare al problema di uso di numeri più grandi di quelli che l’ int offre. Esso occupa una quantità di memoria pari a 32 bit (4 byte) ed offre la possibilità di usare valori che vanno da -2.147.483.648 a +2.147.483.647 per numeri con segno o da 0 a 4.294.967.295 per numeri privi del segno. Un esempio di dichiarazione di un dato long inizializzato è:

long numIntLong = 1000000000;

Lo short è un dato molto simile all’int ma che trova limitazioni più restrittive per quanto riguarda il suo valore massimo o minimo. Esso infatti occupa 8 bit (1 byte) e può perciò coprire un range che va da -127 a +128 pe numeri con segno mentre va da 0 a 256 per numeri senza segno.

I float e i double sono particolari tipi di dati che danno la posibilità di rappresentare i numeri in virgola mobile, ovvero i numeri reali. La differenza tra i due tipi di dati sta nella quantità di memoria utilizzata e pertanto nell’accuratezza con cui i numeri possono essere rappresentati. Un float, infatti, richiede una quantità di memoria pari a 32 bit (4 byte) mentre un double richiede 64 bit (8 byte). Un esempio di dichiarazione di un dato float e di un double inizializzato è:

double dblVirgola = 5.023;
float fltVirgola = 7.8;

SIGNED ed UNSIGNED

Come si è visto, ogni dato ha la possibilità di considerare l’insieme dei suoi valori limitato diversamente in base all’uso che se ne vuole fare. Ad esempio due dati, entrambi int, potranno assumere valori massimi diversi se uno è sempre positivo mentre l’altro assume sia valori positivi che negativi. E’ importante avere in mente tale concetto per poter avere a disposizione sempre il miglior tipo di dato per le nostre esigenze. Di default i dati in C vengon visti come signed e perciò è possibile usare il segno per definire il valore in maniera positiva o negativa. Qualora ci fosse bisogno di definire esplicitamente che un numero non necessita di una rappresentazione negativa allora si può dichiarare la viariabile in questo modo:

unsigned int Numero = 15;

altrimenti è possibile usare la sintassi:

signed int Numero = – 15;

che è equivalente a

int Numero = – 15;

COSTANTI

Il discorso trattato fin ora era studiato per l’uso delle variabili; tuttavia, tutte le regole di cui sopra valgono anche per quanto riguarda il trattamente di dati costanti. Bisogna comunque ricordare che essi mantengono il valore iniziale e perciò quanto detto vale solo all’atto della dichiarazione e mai durante lo svolgimento del programma. Un esempio di dichiarazione di una costante può essere:

const float PIGRECO = 3. 14;

Da notare la presenza della parola chiave const che definisce il dato come costante.

CASTING E CONCLUSIONE

Visto il tipo di gestione dei dati in C, esso viene definito come linguaggio a tipizzazione statica, ovvero dove i tipi di dati vengono definiti all’inizio e mantenuti pressoché
costanti per la durata del software. Tuttavia esiste una pratica definita casting mediante la quale è possibile cambiare il tipo di un dato per poterlo adattare ad una certa circostanza. Il casting si avvale della sintassi del tipo:

variabile1 = ( tipo) variabile2

Ad esempio per ottenere un int da un valore float è possibile seguire il seguente codice di esempio:

float fltNumero = 2. 36;
int intNumero;

intNumero = (int) fltNumero;

In questo modo intNumero assumerà valore 2, ovvero la parte intera del numero float.

Conoscere i dati in C significa essere a conoscenza delle fondamenta di un linguaggio ed è perciò importante studiare bene l’argomento prima di addentrarsi in argomenti più avanzati.

MySql : operatore BETWEEN

Nel post precedente abbiamo visto come sfruttare l’operatore IN di MySql per poter compattare il codice e renderlo sicuramente più veloce. Come detto l’operatore IN permette la selezione di un parametro tra una lista di possibili soluzioni candidate.

In questo post vedremo invece come effettuare una selezione in un range di valori mediante l’operatore BETWEEN. Immaginiamo di avere bisogno di selezionare da una tabella di utenti solo quelli che hanno un’altezza compresa tra 100 e 180 centimetri (ovvero 1 e 1.80 metri) per studiarne alcune composizioni statistiche. La query di selezione risulterebbe alquanto contorto se ci applicassimo la selezione usando gli operatori di comparazione di maggioranza e minoranza (“”). In tal caso il tutto si riduce ad una semplice query, abbastanza lineare del tipo:

SELECT * FROM ‘TabellaUtenti’ WHERE altezza BETWEEN 100 AND 180

L’uso di BETWEEN è sicuramente pratico quanto quello di IN e permette una soluzione stilistica decisamente migliore rispetto ad analoghi codici.