Thursday, February 09, 2012

I Generics e la magia nera.

 Il problema generale

La JVM non supporta e non supporterà ancora per lungo tempo (JAVA 8 ??) i reified generics . Questo ha dato luogo, negli anni, a molte polemiche sull'usabilità effettiva dei generics.
In realtà se ci si trova ad utilizzare i Generics per fare qualcosa di più avanzato, ci si scontra prima o poi col problema di dover fare qualcosa del genere:




class MyClass<T> {
private final T o;
public MyClass() {
this.o = new T();
}
}



questo NON si può fare poiché a runtime MyClass non sa niente circa la natura del parametro generico T. Vedete, il fatto è che laddove javac è capace di effettuare un controllo sintattico e di validazione semantica del nostro codice, la jre non sa niente circa il tipo generico T che è stato inferito perché l'informazione è andata completamente persa in compilazione (type erasure).
Ma, -incredibile ma vero- c'è un ma, in determinate circostanze ciò diventa possibile mediante l'utilizzo di alcune booster feature abbastanza nascoste di Java che sono le Classi Anonime.

Tramite questa feature è possibile creare a runtime delle copie "personalizzate" delle classi che sono, per così dire, "usa e getta".

Classi Anonime (CA)

Ma che cosa sono le classi anonime? E soprattutto: che cosa NON sono?
Con le CA diviene possibile fare questa cosa:


MyClass<Double> myClass = new MyClass<Double>() {

// In questo blocco si aggiungono funzionalità

// a MyClass, specializzandola


// };


può essere cioè creato un oggetto myClass istanza di una classe anonima MyClass; il che non significa che MyClass sia una classe anonima.

Infatti MyClass non è assolutamente anonima (la dichiariamo), d'altra parte utilizziamo il "potere" di aggiungere funzionalità al codice di base, cosa che caratterizza le classi anonime.

javac e le CA

Già, ma come fa il compilatore in questi casi? Da quello che abbiamo visto è chiaro: traduce nel bytecode delle strutture dati completamente caratterizzate dal punto di vista dei parametri dei tipi generici utilizzati (che è bene) e dunque non attiva la type erasure (che è male).Messa diversamente:

la summenzionata MyClass non conosce nessuna informazione di tipo quando è chiamata così:


MyClass<Double> myClass = new MyClass<Double>();

ma conosce l'informazione che deve manipolare un tipo generico quando è chiamata così:


MyClass<Double> myClass = new MyClass<Double>() { /*something here */ };

Deve essere dunque cambiata la chiamata utilizzando la nostra classe "anonimizzata", dunque:


MyClass<Double> myClass1 = new MyClass<Double>(); //type erasure happens

MyClass<Double> myClass2 = new MyClass<Double>() { }; //type erasure DOES NOT happen! :)


Come vedete, abbiamo bisogno solo dello scheletro della nostra classe anonima, e non di tutta l'implementazione, se non abbiamo bisogno di logica aggiuntiva.

La soluzione classica


Se ricordiamo per un momento il tema generale, vediamo che quello che abbia mo visto finora, benché interessante e certamente utilizzabile, non è tutto. Per completare il discorso serve...la magia (nera?).
Qui noi non siamo solo interessati a che non intervenga la type erasure da parte del compilatore, ma anche ci interessa dare alla nostra classe MyClass la possibilità di sapere che il suo parametro generico T è effettivamente un tipo (ovvero T.class).

La soluzione classica di questo problema prevede che si faccia una chiamata di questo tipo:


MyClass<Double>myClass = new MyClass<Double>(Double.class);



Questa non è una soluzione ottimale sebbene è proprio quello che fanno gli sviluppatori, in ogni caso è perfettamente lecita. Ma..è tipo...magia! Sì però non è proprio buona. Non è ottimale per esempio il ricorso alle ripetizioni del tipo "reificato" Double: chissà che sforzo il compilatore!! Scherzi a parte, quando il nostro codice cuba 5k o 10k linee (seppure organizzate secondo tutte le best practices del mondo) diventa difficile da manutenere.
Fin qui la teoria, ma io mi sono chiesto se questa cosa funzionasse sul serio, l'ho implementata per un problema abbastanza complicato (ok,ok...me lo sono complicato da solo :) ) e grazie a questo "trucchetto" ho portato a casa la giornata.
La soluzione più smart è nell'articolo da cui ho tratto spunto per redigere questo post, e del quale ringrazio l'autore. Seppure si tratta di un articolo esplicativo di un particolare framework che serve ad un task ancora più particolare, la parte generale è ben scritta e comprensibile.
Fin quando non avremo in java un'implementazione nativa dei reified generics dovremo attrezzarci con le arti...magiche! Tant'è. Stay Tuned!









Monday, January 16, 2012

Autenticazione NTLM con Axis 1.x

Affrontare lo "spinoso" problema della WS-I (web services interoperability) non è facile, specie con un attrezzo nato prima delle linee guida al riguardo. Quando ci si deve collegare con un ws sviluppato in .NET e pubblicato su IIS, molto probabilmente verrà applicata l'autenticazione NTLM e se dobbiamo collegarci attraverso le classi client java prodotte con Axis 1.x incontriamo problemi dovuti al fatto che il protocollo di autenticazione funziona un pò diversamente dagli Application Server cui siamo abituati nel mondo java.
Qui ho trovato uno dei migliori tutorial che si basa sulle esperienze di un altro blogger.

Sostanzialmente la raccomandazione è di utilizzare le commons-httpclient-3.1 per utilizzare il meccanismo di autenticazione NTLM invece di quelle utilizzate normalmente nel mondo java (p.es. BASIC).

Successivamente si dovrà utilizzare il costruttore della classe client
ServiceLocator(org.apache.axis.EngineConfiguration config)

e fare un piccolo metodo nel quale si prepara un SOAP header customizzato in modo tale da modificare il trasporto SOAP di Axis con la classe delle commons-httpclient adatta (org.apache.axis.transport.http.CommonsHTTPSender). I particolari al link citato.

Da provare. Funziona perfettamente.
Stay tuned!

Monday, July 25, 2011

Eclipse ScalaIDE un plugin nato male e cresciuto peggio

Questo post, nelle intenzioni dell'autore, vorrebbe rappresentare una garbata "protesta" nei confronti degli sviluppatori dell'unico plugin di Eclipse per il linguaggio Scala, ScalaIDE.
Premetto che utilizzo Eclipse (e derivati) dalla versione 2.0.1, tempi in cui i plugin funzionanti realmente si contavano sulle dita di una mano, ebbene con l'installazione di questo plugin ho vissuto un revival dei "bei" tempi andati: installazione riuscita, funzionalità inesistente.
Le configurazioni testate sono Eclipse Indigo (3.7) JEE e Platfom, ed Eclipse Helios (3.6) JEE. Per queste versioni è consigliato la release 2.0.0.beta9 del plugin.
Dicevo funzionalità inesistente perché la feature semplicemente non funziona, ossia viene installata (scorrettamente) la perspective




però né si trova la voce specifica del plugin (scala) tra le preferences né il plugin riconosce i progetti Scala fatti con le versioni passate dello stesso plugin, confondendoli con progetti Java.
Per quest'ultimo problema la wiki del plugin consiglia di abilitare il JDTWeaving e di riavviare. Solo che in tutte le installazioni che ho provato la feature in questione era invariabilmente "alive and kicking".
Inutile dire che ogni altra ricerca in rete non ha avuto l'esito sperato di spiegazione di questo comportamento "strano".
Già le altre versioni del plugin non funzionavano tanto bene, ma funzionavano!!! E peggio sarebbe scoprire che è un problema legato alla configurazione del mio pc...per ovvi motivi.
Insomma non mi rimasto altro da fare che disinstallare il plugin, erano anni che non lo facevo, anzi credo che da quando esistono gli install online sia la prima volta che lo faccio...spero che con la RC venga superato questo problema qualsiasi esso sia. Quando funzionerà ne darò prontamente conto. Stay tuned!

Saturday, July 23, 2011

Evviva...il mio primo GitHub!!

Stasera, siccome sono tornato dal mare dopo cena con la mia famiglia e non avevo da fare, dopo aver messo a letto i bambini ovviamente, mi sono detto: "come posso farmi venire sonno?", la risposta è stata:"girella su internet!" ma siccome non mi andava proprio di fare il solito tour gmail-fb-google news, ho detto:"facciamo qualcosa di utile, impariamo ad usare git e github".
Oh, non sono improvvisamente impazzito, è che avevo da tempo su Google Code dei progettini a cui dovevo fare delle modifiche (cambiare i nomi dei package e rivedere la alberatura) e mi sono detto, non hai ancora il tuo primo GitHub sebbene tu abbia fatto da tempo la iscrizione al sito, perché non impari come si fa?
Il processo è stato un pò laborioso, anche perché ho dovuto installare EGit, il plugin per Eclipse, e imparare ad usarlo (almeno basicamente) ma alla fine ce l'ho fatta ed ho "pushato" il mio primo progetto. Adesso sono curioso di testare il sistema di scm che in questo momento è maistream, nella "vita reale". Stay tuned!!

Saturday, July 16, 2011

...And we're back!

Dopo quasi tre anni di stop, riprendo a scrivere il mio blog tecnico...è stato un periodo molto frenetico e denso di esperienze, lavorative e non, e per questo motivo non ho avuto mai occasione di postare. Comunque trarrò spunto anche dalle cose che mi sono successe e dai problemi che mi sono trovato ad affrontare in questo periodo. Credo che alcuni di questi siano interessanti soprattutto per la mancanza di documentazione in rete. Stay tuned!

Tuesday, December 16, 2008

Rilasciato JBoss AS 5.0GA

Stamattina mi è arrivata la newsletter di RedHat/JBoss che ritengo una delle più complete e utili.
La notizia "di copertina" è il rilascio della nuova versione del più famoso AS open source del mondo: JBoss 5.0 GA. Le differenze rispetto al branch 4.x sono notevoli e sono puntualizzate in un articolo del blog di Jaikiran Pai.
La principale feature di questa ultima release si trova nella full-compliance (finalmente) alla specifica JEE5 condita con una scelta architetturale che apre questo AS anche ad altri contesti di sviluppo oltre a quello Java, scelta che, d'altra parte, è stata perseguita anche dagli sviluppatori della piattaforma Java stessa con il rilascio della versione 6.0 del jdk.
Alcuni use case per delle architetture basate su JBoss 5.0 sono illustrati nel famoso blog di Bob McWhirter.
Dove lavoro abbiamo un'architettura basata sul framework JBoss-Seam, quale miglior occasione di provare il nuovo nato di casa RedHat/JBoss...

Stay Tuned!!

Thursday, September 04, 2008

Prime impressioni su Chrome

Oggi ho installato la versione beta del nuovo browser di Google: Chrome; e quelle che seguono sono le primissime impressioni che ho usandolo.
Minimale, pulito, sembra abbastanza rapido, utilizza Google Search già dalla barra degli indirizzi (prevedibile, ma non so quanto comodo). 
Ehi, ma cos'è? Premendo il bottone a tendina dei documenti, trovo una voce abbastanza inquietante da un lato e particolare dall'altro: Nuova Finestra di Navigazione in Incognito...boh provo...si apre una finestra con scritto un disclaimer che mi segnala che la navigazione non lascerà traccia sul pc una volta chiuso il browser (!!!) ed una scritta che mi invita a diffidare, tra gli altri, di Agenti segreti e di persone che mi stanno alle spalle (LOL !!) insomma...
Si dice destinato a eclissare tanto IE7 (facile...) quanto Firefox 3.0.x (più difficile da credere...), in questa versione beta non presenta particolari "attractive features" per le quali è famoso ed usato l'epigono di Mozilla (scelta progettuale ??).
Si mormora pure che sia un browser BBO (Big Brother Oriented), ossia per esempio tenga traccia (lato Google) delle navigazioni di ognuno....vedremo.

Sono già stati trovati i primi immancabili buchi di sicurezza 

Insomma tutto si sta svolgendo secondo la normalità delle cose... un buon inizio ma niente di più.
Stay tuned!