Portare avanti o indietro una data in python

Quando si opera nel campo dei software gestionali, si ha sempre la necessità di lavorare con le date e le loro mille sfaccettature. Gestire una data non è sempre cosa facile poiché essa può essere formattata in modi diversi e la necessità del momento può spingerci a doverla nuovamente riformattare secondo un canone decisamente diverso (se non opposto) rispetto all’originale.

In questo articolo vedremo come, grazie all’ausilio delle librerie del linguaggio, è possibile, con poche righe di codice, “muovere” una data nel passato o nel futuro partendo da una a nostra disposizione.

Immaginiamo di dove gestire la scadenza di un servizio. All’utente verrà chiesto (nel modo che si richiede più opportuno) di fornire una data di avvio del servizio e la sua durata. Nel nostro caso l’utente dovrà specificare quest’ultimo parametro in giorni. Riversiamo i dati così ottenuti rispettivamente nelle variabili data_avvio e durata_giorni e calcoliamo la data di chiusura del servizio.

—python—————-
from datetime import date, datetime, time, timedelta
def calcola_scadenza(data_attivazione, durata_giorni):
        str_data_attivazione = datetime.strptime(data_attivazione,’%Y-%m-%d’)
        data_fine = data_attivazione + timedelta(days=durata_giorni)
        res = datetime.strftime(data_fine,’%Y-%m-%d’)
        return res
——————————

Innanzitutto partiamo con l’importazione del necessario dalla libreria datetime. Questa libreria è molto versatile ed utilissima quando si vuole lavorare con questo particolare tipo di dati. Inoltre è ben documentata ed è semplice da usare nei propri progetti. Ora definiamo la nostra funzione che accetta come parametri la data di avvio e la durata in giorni del servizio. Successivamente, mediante l’ausilio della funzione datetime.strptime si converte la stringa in un formato data che rispetta la formattazione definita come secondo parametro. Nel nostro caso la data avrà formato anno-mese-giorno. Qui arriva la parte interessante dell’algoritmo. Come si può vedere la data di fine servizio viene calcolata grazie all’uso di timedelta. Come il nome della funzione lascia intendere, timedelta serve a creare una data con un offset calcolato in base ai parametri passati alla stessa. In questo caso abbiamo deciso di spostare la data attuale di n giorni nel fututo dicendo a timedelta di spostarsi in base ai giorni (days). Infine con datetime.strftime compiamo l’operazione inversa rispetto a datetime.strptime, ovvero otteniamo una stringa partendo da una data e lasciamo la funzione ritornando il valore appena ottenuto.

Nonostante l’esempio sia volutamente ridotto al minimo indispensabile, è possibile notare con facilità come gli strumenti mostrati siano potenti e versatili semplificando non di poco il lavoro dello sviluppatore. Timedelta, ad esempio, ci permette di tornare indietro passando i parametri in forma negativa. Questo può essere notevolmente utile quando si vuole sapere la data di qualche giorno o mese fa. Importante è anche l’uso di datetime. Grazie a strftime e strptime è possibile ottenere date formattate come meglio si crede. Ora non resta che sperimentare quanto imparato.
      

Gambas – Conoscere il proprio indirizzo IP

Lavorando ad un progettino avevo pensato alla possibilità di conoscere l’indirizzo IP dell’utente. Questo può essere utile quando si ha la necessità di conoscere l’indirizzo con cui ci si affaccia alla rete magari per comunicare con altri computer. Gambas, che io sappia, non ha librerie o funzioni particolari che permettano di svolgere tale compito e pertanto ci si deve affidare ad un semplice comando esterno che verrà intercettato e mostrato a schermo.

Il nostro lavoro verrà svolto da una riga di comando:

wget http://checkip.dyndns.org/ -q -O – |grep -Eo ‘\’

Esso non fa altro che rivolgersi al servizio http://checkip.dyndns.org/ (che altri non è che una riga di testo del tipo)

Current IP Address: 93.xxx.xxx.xx

e ne preleva solo le cifre, ovvero l’indirizzo IP. In questo modo ci verrà restituito il nostro indirizzo.

La funzione Gambas che ci restituirà l’IP sarà:


Come si vede la funzione è semplice. Essa dichiara una variabile di nome result di tipo stringa che conterrà l’output del comando. La riga successiva è l’esecuzione del comando visto prima con relativo redirect sulla variabile appena dichiarata. Ottenuto l’IP lo restituiamo con RETURN.

Strutture dati: Array


DEFINIZIONE

Con il termine array si intende un tipo di struttura dati complessa che trae le proprie caratteristiche dalla definizione matematica di vettore.

Un array può essere visto come una serie di celle contigue ognuna delle quali ha il compito di contenere un determinato dato. Ogni cella che compone tale struttura è accessibile mediante una chiave denominata indice. L’’indice è un fattore fondamentale per accedere ai dati interni al vettore e nella maggior parte dei linguaggi di programmazione è di tipo numerico intero. I valori di tali parametro sono spesso contigui e possono partire da 0 o da 1.

Ad esempio, se volessi accedere al primo elemento di un array di nome vettore, il cui primo indice è 0 mi basterà usare la sintassi:

vettore[0]

mentre per accedere al terzo elemento dovrò utilizzare l’’indice 2:

vettore[2]

Bisogna precisare che nei linguaggi compilati, l’’uso degli indici di questa struttura, porta a degli errori se non si trattano in maniera consona questi parametri poiché tali linguaggi non hanno alcun riferimento in memoria della dimensione dei vettori con cui si lavora. Questo è un punto fondamentale poiché, l’’uso scorretto degli indici, può portare ad ottenere di dati errati e quindi potenzialmente pericolosi.

DATI DEGLI ARRAY

La concezione dei tipi di dati degli array varia in base ai diversi linguaggi di programmazione. Nel C, ad esempio, quando si definisce un vettore esso viene inizializzato con un tipo di dato che dovrà essere poi compatibile con i singoli dati in esso contenuti. Questo vuol dire che se all’’atto della definizione di un array lo dichiaro di tipo int, esso potrà contenere solo dati di tipo int. Nel PHP, invece, non importa il tipo di dato che l’’array andrà a contenere poiché il linguaggio è di tipo typeless.
Il prototipo di dichiarazione del lingaggio C è:

tipo nome_array[numero elementi];

pertanto un esempio di definizione può essere:

float vector[5];

Si nota come si sia definito un vettore di 6 elementi tutti di tipo float al quale è possibile accedere subito dopo la sua creazione. Se volessimo, infatti, inizializzare i suoi dati con i primi 6 numeri reali basterà utilizzare la sintassi

nome_array[indice] = dato;

Che nel nostro caso sarà:

vector[0] = 0.0;
vector[1] = 1.0;
vector[2] = 2.0;
vector[3] = 3.0;
vector[4] = 4.0;
vector[5] = 5.0;

DINAMICITÀ

Un array, nella maggior parte dei casi, può subire modifiche durante l’’uso del programma. Basti immaginare, ad esempio, un vettore che deve contenere le macchine parcheggiate in un parcheggio custodito. Ogni indice dell’’array indica un posto numerato e il dato in esso contenuto sarà il modello della macchina. Se un giorno il padrone del parcheggio decide di ampliare lo stabile aggiungendo nuovi posti allora anche l’’array dovrà essere ampliato per contenere nuovi indici. In tal caso basterà ricorrere ai mezzi che ogni linguaggio di programmazione pone a disposizione dello sviluppatore per riallocare la memoria utile a tale fine. Questo evidenzia come, se adeguatamente trattata, l’’array è una struttura dati dinamica. Tale concetto di dinamicità (array allocato dinamicamente) è da separare dal concetto di array dinamico.
Un array si definisce dimanico quando consente di aggiungere e/o rimuovere alcuni elementi. Esso si compone di due zone separate: la prima viene allocata e definita come un comune array mentre la seconda è nascosta ed è dedicata ai futuri allocamenti. Tale sezione può essere utilizzata sino a che la sua memoria non si esaurisce. L’’uso degli array dinamici risulta alle volte troppo dipspendioso sia in termini di spazio che di tempo poiché, una sua riscrittura, può richiedere anche la copia dell’’intero array.

ARRAY MULTIDIMENSIONALI

Sino ad ora abbiamo trattato vettori i cui dati erano accessibili mediante un solo indice. Può accadere, per esigenze di sviluppo, che si abbia bisogno di più indici da trattare. Tali elementi vengono chiamati array multidimensionali. Immaginiamo di voler utilizzare un array che mi indichi se in un determinato punto cartesiano ci sia o no un punto mediante la presenza di un 1 o un 0. I dati di tale vettore potranno essere accessibili mediante l’’uso di due indici: uno che indichi il valore dell’’asse delle ascisse da considerare ed uno quello delle ordinate.

Se, ad esempio, in un piano cartesiano prendiamo in considerazione le coppie di valori (2, 2), (2, 3), (3, 2) e (3, 3) e sappiamo che sono presenti solo due punti nelle coordinate (2, 2) e (3, 3), il nostro array potrà essere consultato accedendo ai dati mediante la sintassi:

nome_array[indice 1][indice 2]

Nel nostro caso sarà:

vettore[2][2] = 1;
vettore[2][3] = 0;
vettore[3][2] = 0;
vettore[3][3] = 1;

E’ facile notare come tale discorso può essere facilmente espanso ad array con un numero maggiore di indici.

CONCLUSIONI

L’array è sicuramente una delle strutture dati più semplice da gestire e da utilizzare. La sua convenienza, in termini tecnici, è da apprezzare per un suo uso basilare. Quando i dati iniziano a diventare eccessivamente numerosi e quando le dimensioni iniziano a crescere e sicuramente molto più pratico puntare ad altre strutture più consone a questi compiti.