martedì 2 dicembre 2014

Serializzare da e verso Xml

"Se i ragazzi di Spring lo hanno scelto, deve avere delle potenzialità"
Questo mi sono detto, quando ho provato ad usare XStream, una libreria per serializzare e deserializzare gli oggetti da XML.
E in effetti, le potenzialità ci sono. Innanzitutto perché xStream permette di serializzare e deserializzare senza uso di annotations, e questo fa davvero TANTO comodo. E poi perché permette, qualora il semplice mapping non bastasse, di scrivere dei converter in modo molto semplice (anzi se magari un po' lungo, visto che si può solo navigare l'albero dei nodi.

domenica 30 novembre 2014

Java ed SSH

Recentemente mi son trovato a dover lanciare da Java una serie di comandi su un server linux, ed ho scoperto JSch, un'implementazione di SSH2 tutta in Java.
Pur non essendo intuitivissimo da usare, è però un modo perfetto per lanciare comandi remoti, e scaricare files.

giovedì 30 ottobre 2014

AngularJs, Internet Explorer e la cache

Oggi ho combattuto un mostro invisibile: la cache di Internet Explorer.
Scrivendo un'applicazione con AngularJs, ricaricavo via XmlHttpRequest una lista, che ero sicuro doveva essere variata, e su Internet Explorer 11 ottenevo sempre gli stessi dati, mentre su Chrome e Firefox la lista veniva correttamente ricaricata.
Dopo quasi un giorno di ricerche, ho scoperto che il motivo è la cache.
Sembra che Internet Explorer faccia caching delle chiamate, almeno con AngularJs. Come specificato nell'esempio, un trucco molto semplice per "scuotere" IE è quello di passare a parametro un timestamp. Ma mi sembra poco elegante, sinceramente.
C'è un modo per far funzionare correttamente le cose, come ci spiegano in questo articolo, e cioè disabilitando la cache nell'http provider.
Da notare che la risposta, molto velocemente, dice di mettere un

$httpProvider.defaults.headers.get['If-Modified-Since'] = '0';

A me questa direttiva andava in conflitto con l'autenticazione, perchè cancellava tutti i cookies a bordo.
Invece, usando il codice

$httpProvider.defaults.headers.get['Cache-Control'] = 'no-cache';
$httpProvider.defaults.headers.get['Pragma'] = 'no-cache';

tutto funziona, anche l'autenticazione.

venerdì 24 ottobre 2014

File Upload con Spring

A completamento del post precedente, come fare a gestire l'upload di un file via Spring?
Spring offre un automatismo eccezionale per la gestione del file uplaod: in un controller, basta dichiarare un parametro di tipo MultipartFile per poter subito avere il file a portata di mano (vedi qui)
C'è una sola cosa da ricordarsi (e che invece puntualmente mi scordo): dichiarare nei beans un multipartResolver. Senza questa dichiarazione le cose non funzionano.
Se, come nell'esempio precedente, la chiamata viene da un framework come Angularjs, attenti al parametro ritorno! Anche se non è necessario comunicare niente al client, non omettere mai la declaration @ResonseBody

sabato 18 ottobre 2014

File Upload con Angularjs

Angular, essendo un framework Ajax-based, parte dal presupposto di fare tutte le chiamate via XMLHttpRequest. E allora, come si può fare un file-upload con Ajax?
Questo tutorial spiega molto bene come fare.
Le uniche due modifiche che farei sono sulla definizione di direttiva che viene data, e sulla serializzazione dell'oggetto.
L'esempio scrive nel codice dell'application una direttiva. Esiste però un modulo di Angularjs che fa esattamente la stessa cosa.
Sulla serializzazione dell'oggetto, l'esempio la fa mettendo, correttamente il Content-Type ad undefined, lasciando libero il modo di interpretare il contenuto all'applicazione ricevente (e al browser, che a volte lo completa automaticamente), mentre usa transformResponse: angular.identity.
Forse sarebbe più opportuno non demandare ad Angularjs la serializzazione, ma definirla in modo esplicito, magari così

transformResponse: function (data,) {
    return data;
}

Questo è quanto, poi bisognerebbe scrivere un post su come salvare sul server il contenuto.

mercoledì 25 giugno 2014

mercoledì 16 aprile 2014

IKVM

Recentemente ho dovuto usare IKVM, una Virtual Machine Java implementata in .Net.
Devo dire che sono partito un po' prevenuto, perché la commistione tra i due mondi mi sembrava strana, ma devo dire che alla fine l'idea mi ha conquistato.
In pratica IKVM permette di creare assembly o eseguibili a partire da jar, e gli rende quindi fruibili da applicazioni .Net.
Dopo aver realizzato il jar basta chiamare ikvmc.exe, con gli appositi parametri, per avere un assembly (parametro -target:library) oppure un eseguibile (parametro -target:exe).
Ciò a cui si deve prestare particolare attenzione è il Class Loading, perché le due V.M. lo gestiscono in modo diverso e ci possono essere incompatibilità.
Nel mio caso, ad esempio, non venivano caricate in maniera corretta alcune risorse contenute nella library: ho dovuto forzare il caricamento della library, pur usandola alla riga successiva. L'ho fatto attraverso il comando

ikvm.runtime.Startup.addBootClassPathAssemby(Assembly.Load(""));

Altra cosa che mi è successa, e a cui non sono stato capace di porre rimedio, è l'impossibilità di chiamare le classi da un oggetto Com fatto in .Net. Questo perchè Com che chiama .Net che istanzia Java genera una StackOverflowException, eccezione generata a livello di Framework, e quindi non trappabile... chiunque abbia notizie sulla fattibilità della cosa mi faccia sapere.

mercoledì 5 febbraio 2014

AngularDart

Mi sembrava strano che non potessero fare a meno di avere un linguaggio più solido di Javascript...
https://angulardart.org/

Ancora la cosa è abbastanza in embrione, ma potrebbe essere "cosa buona e giusta".
Prima o poi lo provo...

venerdì 31 gennaio 2014

AngularJS: primi approcci

Recentemente ho avuto modo di provare AngularJS
Devo dire che, dopo i primi momenti di smarrimento, sono rimasto veramente colpito.
L'approccio da cui questo framework parte è "la tela bianca". HTML non è più un linguaggio con tag fissati, ma diventa veramente estensibile.
Ma partiamo dall'inizio: le prime due lettura da fare sono il tutorial e "10 ragioni per cui usare AngularJS"
E proprio quei 10 punti fanno capire le vere potenzialità del framework

Il modello MVC è implementato pesantemente, ma talmente bene che alla fine risulta veramente comodo. All'inizio è un po' complesso, specialmente capire che tutto si basa sulla Iniezione di Dipendenza. Si creano servizi e Controller, li si inietta nell'applicazione e poi si usano.

Il Data Model è implementato molto bene. Il Data Binding è un modello 2-Way, quindi ogni variazione agli oggetti nello scope si ripercuote immediatamente sulla pagina HTML. Insomma, non bisogna proprio fare niente (vedi esempio).

Service Providers: l'idea di dividere in maniera netta la parte di presentation (Controllers + HTML) e i servizi di recupero dati (con chiamate asincrone Ajax fatteattraverso gli oggetti $http e $resource) permettono sia una scrittura di codice molto snella che una grande riusabilità del codice stesso. Ad esempio un servizio per la gestione di anagrafiche clienti (l'esempio più banale che mi viene in mente) esporrà i metodi query() (eventualmente con filtri), get() per la singola anagrafica save() per creare/modificare un'anagrafica esistente e delete() per eliminare. Questo servizio può essere usato ovunque nell'applicazione, senza ridondanza di codice. Lo so, sono concetti banali per chi ha esperienza di programmazione strutturata lato server, ma applicato ad un'applicazione web HTML/Javascript suonano quasi rivoluzionari. Impostare il progetto con un'architettura del genere, fatta son JavaScript puro, prevede un gran controllo ed un grande sforzo.

Altra idea folgorante sono, a mio avviso, le direttive. Permettono sostanzialmente di scrivere componenti da inserire nel codice semplicemente con un tag, senza dover fare workaround particolari.
Pensiamo ad esempio all'evento di click su un pulsante e confrontiamo l'approccio ad esempio di JQuery con quello AngularJs.
In JQuery (vedi esempio JQueryUI Button)si dichiara un tag button, e nello script di startup lo si manipola con una direttiva $("button").button().click( function()..... per linkare l'evento di click.
In AngularJS invece, tutto è già contenuto nella dichiarazione

Particolare attenzione poi è stata posta al test delle applicazioni. Essendo le applicazioni ben divise nei vari aspetti, risulta più facile testare i vari servizi, controller e quant'altro.

Questa è solo una prima panoramica sul mondo AngularJS. Spero di poter approfondire la mia conoscenza del framework, mi sembra che abbia grandi possibilità.

lunedì 13 gennaio 2014

Windows 9 arriverà ad Aprile 2015

Sembra che in casa Microsoft abbiano fretta di aggiornare i sistemi, dopo lo scarso risultato di vendite di Windows 8 (che, lo ricordo, è preinstallato su qualsiasi dispositivo, e anche così non riesce a sfondare sul mercato)
Leggendo l'articolo sembra che l'orizzonte sia sempre più quello dei dispositivi connessi, e quindi mi chiedo: chi usa il pc come me, anche per sviluppare, o un povero ragioniere che deve fare contabilità, che cavolo se ne fa di un o.s. per i dispositivi mobile?
Spero quindi che mantengano un desktop umano, altrimenti non vedo grossa diffusione negli ambienti di lavoro.

http://www.repubblica.it/tecnologia/2014/01/12/news/windows_9_arriver_ad_aprile_2015_e_quest_anno_aggiornamento_importante_per_l_8-75725577/?ref=HRERO-1