Javascript4SPA – Ereditarietà e prototipi

25 ottobre 2013 § Lascia un commento

Quarto video della serie, nel quale parliamo di ereditarietà, oggetti e prototipi..

Un’Introduzione alla Rappresentazione, Serializzazione e Gestione del Tempo nel Software

17 aprile 2013 § Lascia un commento

Gran parte dei problemi nello sviluppo del software deriva di solito da una conoscenza scarsa e inconsistente del dominio in questione. Un argomento apparentemente semplice come la rappresentazione, serializzazione e gestione del tempo può facilmente causare una serie di problemi sia al neofita che allo sviluppatore esperto.

In questo post vedremo che non è necessario essere dei Signori del Tempo per comprendere i pochi e semplici concetti che sono necessari ad evitare di incappare nell’inferno della gestione del tempo nel software.

Rappresentazione

Una semplice domanda come “Che ore sono?”, nasconde un numero di sottigliezze contestuali che sono ovvie per il cervello umano, ma diventano nonsense per il computer.

Ad esempio, se tu mi ponessi questa domanda proprio ora, potrei rispondere: “Sono le 3:39″ e, se tu fossi un collega nel mio ufficio, questa informazione ti sarebbe sufficiente per inferire che sono le tre e trentanove pomeridiane in un fuso orario che si chiama Central European Summer Time (CEST), ovvero l’ora standard estiva del Centro Europa. Ciò è possibile perché saresti già in possesso di una serie di informazioni contestuali, quali:

  • siamo nel pomeriggio perché abbiamo già mangiato il pranzo
  • siamo a Roma, quindi il nostro fuso orario è il Central European Time (CET) oppure il Central European Summer Time (CEST)
  • siamo passati all’ora legale estiva qualche settimana fa, quindi il fuso è il CEST

“3:39″ è una rappresentazione conveniente del tempo solo se siamo già in possesso di altri pezzi di informazioni contestuali. Per rappresentare il tempo in maniera universale, dovresti avere un’idea di cosa è il Tempo Coordinato Universale (UTC o Universal Coordinated Time) e cosa è un fuso orario.

Ora, immagina che debba prendere un appuntamento su skype con un collega americano. Potrei mandargli una mail scrivendo una cosa come: “ci vediamo il 2/3″. Per noi italiani, quella data rappresenta il secondo giorno del terzo mese dell’anno (ovvero il 2 marzo) ma, per un americano, quello è il terzo giorno del secondo mese dell’anno (ovvero il 3 febbraio). Poi facilmente immaginare come il nostro appuntamento non avrà mai luogo.

Questi sono solo alcuni esempi dei problemi che possono capitare quando si rappresentano informazioni su data e ora. Fortunatamente, la soluzione a questi problemi esiste, e la troviamo nello standard ISO 8601.

Tanto per fare un esempio, in ISO 8601, 1994-11-05T08:15:30-05:00 corrisponde al 5 Novembre 1994, 8:15:30 am, US Eastern Standard Time. 1994-11-05T13:15:30Z corrisponde allo stesso instante (la Z sta per UTC). Stesso istante, diverse rappresentazioni.

Lo standard ISO 8601 ha anche il piacevole effetto collaterale di fornire un ordinamento naturale nei sistemi che usano l’ordinamento lessicografico (ad esempio i filesystem) perché l’informazione è organizzata dalla più alla meno significativa, ovvero anno, mese, giorno, ora, minuti, secondo, frazione di secondo.

Anche se hai a che fare solo con date locali nel tuo software, devi sapere che, a meno che non mostri il fuso orario, non puoi mai essere sicuro dell’ora. Non ricordo più quante volte uno sviluppatore mi ha chiesto di aggiustare l’ora sul server, solo per scoprire che stava stampando l’ora in UTC.

A display time va bene avere a che fare con una rappresentazione parziale del tempo perché l’esperienza utente lo richiede. Fai solo attenzione, quando sei in debug, a stampare tutte le informazioni, incluso il fuso orario, altrimenti non puoi mai essere sicuro che la cosa che stai guardando è ciò che effettivamente tu pensi che sia.

Anche se un certo momento nel tempo è immutabile, esiste un numero arbitrario di modi per esprimerlo. E non abbiamo neanche parlato del calendario giuliano o indiano o di roba come esprimere una durata!

Lasciami riassumere alcuni punti essenziali da portare a casa fin qui:

  • impara a conoscere i fusi orari e l’UTC
  • lo standard ISO 8601 è il tuo migliore amico
  • stampa sempre il fuso orario durante il debug

Serializzazione

Parlando di software, la serializzazione è un processo in cui si prende un’entità e la si impacchetta in maniera tale che essa possa essere interamente ricostruita, esattamente come l’originale, a partire dal formato impacchettato (serializzato).

Nel mondo binario dei computer, il tempo è di solito serializzato e immagazzinato usando la convenzione del tempo Unix. Mentre scrivo, il tempo Unix è 1366191727 UTC. Vale a dire: 1366191727 secondi sono trascorsi dal primo gennaio 1970 alle 00:00 UTC. Non è un modo intelligente, consistente e compatto di rappresentare una pletora di informazioni, come 17 Aprile 2013 alle 11:42:07am CEST?

Il tempo Unix è solo un’altro arbitrario formato di rappresentazione di un dato momento nel tempo, anche se uno non molto leggibile per un essere umano. Ma puoi prendere quel numero, scriverlo su un pezzo di carta, attaccarlo a un piccione viaggiatore, e il tuo destinatario sarebbe in grado di decifrare il tuo vitale messaggio semplicemente andando su Internet e visitando un sito come unixtimestamp.com.

Così come puoi scrivere quel numero su un pezzo di carta e poi riportare in vita l’intero istante, lo puoi immagazzinare in un file o in una tupla nel tuo RDBMS preferito. Anche se faresti meglio a parlare al tuo RDBMS con un driver, dandogli in pasto una semplice istanza di timestamp; il tuo driver si prenderà cura della conversione nel formato di serializzazione del tuo database.

Immagazzinando il tempo usando un formato nativo, hai gratuitamente le funzionalità di formattazione, ordinamento, interrogazione, ecc del tuo RDBMS, quindi è meglio che ci pensi due volte prima di immagazzinare timestamp Unix duri e puri.

Fai attenzione a quale fuso orario il tuo timestamp Unix si riferisce, o potresti generare confusione durante la deserializzazione.

L’ISO 8601 è anche molto usato in serializzazione. Infatti è usato nello standard XML Schema. Molti framework xml sono capaci nativamente di serializzare e deserializzare avanti e indietro da xs:date, xs:time e xs:dateTime al formato nativo del tuo linguaggio di programmazione (e viceversa). Fai solo attenzione quando hai a che fare con una rappresentazione parziale: ad esempio, se ometti il fuso orario, assicurati di esserti messo d’accordo in precedenza con chi sta all’altro capo del filo su un fuso di default (di solito UTC o il fuso orario locale se entrambi i capi del filo risiedono nello stesso fuso).

Gestione

Prima di tutto, se pensi di poter scrivere la tua libreria software di gestione del tempo, o anche solo una piccola routine che aggiunge o sottrae valori arbitrari dall’ora del giorno, lascia che ti mostri il codice sorgente delle classi java.util.Date e java.util.GregorianCalendar dal JDK 7, rispettivamente 1331 e 3179 linee di codice.

Ok, questi probabilmente non sono i migliori esempio di routine software che lavorano col tempo, siamo d’accordo. È proprio questo il motivo per cui librerie Java come Joda Time sono state scritte (così che io e te non dobbiamo farlo)! Infatti, Joda Time è diventato così popolare che ha dato luce alla JSR-310, che è ora parte del JDK 8.

L’uso di framework ben disegnati ed implementati ti salverà la vita. Dico sul serio. Prenditi il tuo tempo per acquistare familiarità con l’API di tua scelta. Se ti piace Scala, ti posso suggerire di guardare nscala-time. Se usi altri linguaggi di programmazione, onestamente, non ne ho la più pallida idea, ma chiedi al tuo guru locale: lei saprà aiutarti.

Ulteriori risorse

Questi sono alcuni link utili al riguardo che ho accumulato nel tempo:

Come connettere la jconsole (o un’altra jmx console) ad una jvm remota e vivere felici

22 marzo 2013 § Lascia un commento

Quali sono i parametri da inserire all’avvio della jvm a cui mi devo connettere?

-Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.port=9011 -Dcom.sun.management.jmxremote.local.only=false -Dcom.sun.management.jmxremote.authenticate=false

N.B. Con questi parametri si disabilita totalmente la sicurezza per la connessione (no autenticazione, no ssl) quindi attenzione!!

A questo punto potete utilizzare una jmx console qualsiasi (jconsole e jvisualvm per esempio) e connettervi.

La console mi da connection refused cosa devo fare?

Se il server a cui vi state connettendo è linux probabilmente avete una configurazione errata sul file /etc/hosts. Per accorgervene basta lanciare la jconsole con l’opzione -debug (quindi jconsole -debug da terminale).

Sul terminale, in seguito alla connection refused, vi apparirà l’errore con l’ip a cui si sta connettendo jconsole. Se l’ip è un ip che è locale al server (per linux spesso è 127.0.1.1) allora il problema è sul server.

Eseguite su un terminale del server il comando hostname -i (vi dovrebbe tornare l’ip a cui sta cercando di connettersi la jconsole, ad es. 127.0.1.1).

A questo punto dovete modificare il file hosts (sotto etc) in modo che il nome ritornato dal comando hostname (senza -i) venga tradotto nell’ip della macchina (se il nome è conosciuto dal dns potete rimuovere la linea del file hosts che lo traduce in 127.0.1.1).

Fatte queste operazioni rieseguite hostname -i e controllate che traduca il nome in maniera corretta.

Prima di rilanciare la jconsole, la jvm a cui volete connettervi va spenta e riaccesa in modo che recuperi l’ip corretto (questo vale in special modo per gli application server, i servlet container etc..).

Ok ma io ho tomcat o jboss, come faccio?

I server java girano su istanze di jvm (e dovreste saperlo!!!!) quindi dovete modificare i parametri di lancio della jvm aggiungendo quelli che vi ho detto precedentemente. Per tomcat se nella vostra installazione avete il file setenv.sh modificate quello, altrimenti il catalina.sh inserendo le righe precedenti.

 

 

 

 

 

Programmazione Funzionale in Scala

22 marzo 2013 § Lascia un commento

La programmazione funzionale, da curiosità accademica, ha assunto la dimensione di realtà di mercato. Come SWAT Team stiamo puntando molto su Scala e lo stack TypeSafe perché siamo convinti che nei prossimi anni questa tecnologia assumerà sempre più importanza.

Vorremmo segnalarti perciò il Corso di Programmazione Funzionale in Scala tenuto da Martin Odersky (il creatore del linguaggio) sulla piattaforma Coursera. Il corso è completamente gratuito, inizia il 25 marzo e comprende una serie di videolezioni ed esercizi, al termine dei quali è possibile conseguire un certificato.

Crediamo sia una ottima occasione per prendere dimestichezza con tecnologie che nei prossimi mesi incontrerai sempre più all’interno dell’azienda.

Javascript4SPA – le funzioni

15 gennaio 2013 § Lascia un commento

Nel terzo video della serie parliamo di funzioni, la parte più importante del linguaggio.

Javascript4SPA – gli oggetti

11 gennaio 2013 § Lascia un commento

Continuiamo la nostra serie  di video orientata ad una comprensione più approfondita del linguaggio orientata allo sviluppo di applicazioni single page.

Javascript4SPA video series

8 gennaio 2013 § Lascia un commento

Ciao a tutti. Iniziamo la pubblicazione della serie di video dedicati alle tecnologie per lo sviluppo di applicazioni web Single Page.

Per garantire una relativa snellezza nella fruizione cercheremo di mantenerci su una durata massima di 40 minuti. Sono disponibile a qualsiasi chiarimento anche tramite mail o skype, vi prego tuttavia di commentare il post in modo che si possa tener traccia dei vari feedback ed aumentare la comprensione di tutti.

Buona visione.

Iscriviti

Ricevi al tuo indirizzo email tutti i nuovi post del sito.

Unisciti agli altri 222 follower