martedì 27 dicembre 2011

Introduzione a Maven

Per qualche tempo ho girato intorno a Maven, senza capire bene cosa fosse e come potessi usarlo per i miei progetti: poi ho provato ad usarlo, e me ne sono letteralmente innamorato.
Intanto diciamo cosa è Maven: "Apache Maven é un tool per la software project management and comprehension. Basato sul concetto di Project Object Model (POM), Maven può gestire build, reporting e documentazione di un progetto, da un punto centrale di informazione" Questa è la definizione (magari mal tradotta) dal sito Apache Software Foundation. Ma in pratica, cosa fa Maven? Gestisce, da un solo file di configurazione, la struttura e le dipendenze di progetto ed aiuta ad automatizzare le fasi di build, test, documentazione e in alcuni casi deploy di un progetto.
Facciamo un esempio: a me piace usare Spring per il mio sviluppo. E' un framework potente, flessibile, ma ha una grossa complicazione. La gestione delle dipendenze. Non è facile ricordarsi di includere tutte le dipendenze, se si usa una repository non è comodo aggiungere i jar o definire un posto dove metterli. Maven risolve proprio questo aspetto: nel file descrittore del progetto basta indicare come dipendenza Spring e maven si occuperà di scaricare tutte le dipendenze dal repository appropriato, compilare i sorgenti e impacchettarli nel modo corretto. Inoltre, ed ancor prima di questo, definisce una struttura standard per i progetti: si può quindi lavorare allo stesso progetto con Eclipse piuttosto che con Netbeans senza dover stravolgere la struttura dei sorgenti.
E questo è solo l'inizio. Se avrò tempo mi piacerebbe fare un esempio su come usare Maven per i progetti GWT, perché ci sono piccoli accorgimenti da usare.

giovedì 8 settembre 2011

Ubuntu punta ai mainframe IBM?

http://www.oneopensource.it/08/09/2011/ubuntu-punta-ai-mainframe-ibm/?utm_source=feedburner&utm_medium=feed&utm_campaign=Feed%3A+oneOpenSource+%28oneOpenSource%29

Il futuro di PostgreSQL è nel cloud

http://it.toolbox.com/blogs/database-soup/postgresqls-future-grows-cloudy-48174?rss=1

Il corretto uso dell'If

Molto spesso mi trovo a leggere codice di altri. Personalmente ritengo che scrivere codice sia come scrivere in lingua, a parte i formalismi. Per quanto mi riguarda sono molto coinciso nello scrivere frasi, periodi brevi, poche subordinate. Allo stesso modo, quando scrivo codice, mi piace essere il più coinciso possibile.
Riguardo all'uso di if preferisco non farne in cascata, se non strettamente necessario, ritenendo questo tipo di codice brutto da vedere e lento da eseguire.
Del mio stesso avviso sono quelli di AntiIfCampaign, al grido di "less if, more power!"
E voi, quanti if usate?

venerdì 26 agosto 2011

Un tranquillo sabato di fanatismo informatico.

Sabato scorso era caldo, ero in città e per trovare un po' di fresco sono andato a vedere il nuovo negozio di una famosa marca appena inaugurato.
Entro e due commessi mi augurano il buongiorno. Finalmente un po' di civiltà in un mare di ignoranza, penso: non capita spesso infatti che i commessi diano il buongiorno al cliente.
Comincio a girare fra i tavoli, vedo che ad uno c'è una dimostrazione di prodotto ma non ho voglia di ascoltarla e gironzolo un po', tanto per capire che aria tira. Ad un certo punto sento partire un applauso, mi giro e vedo che i commessi stanno applaudendo ad un nuovo possessore. Penso che, essendo di natura timido, mi vergognerei di essere applaudito, ma evidentemente quando acquisti un prodotto della famosa marca entri a far parte di una famiglia e vieni acclamato per questo.
Ad un tavolo vedo un portatile libero, mi metto a guardare le caratteristiche e a provare ad usarlo. Un commesso gentile mi si avvicina e mi chiede se ho bisogno di informazioni

Io: "Volevo capire se è possibile aprire il terminale"
C.: "Si, lanci il finder e lo apri, si fa così. Ma tu usi molto il terminale?"
Io: "Sai, sono uno sviluppatore, il terminale è comunque la mia ancora di salvezza"
C.: "Ah bello, e in cosa sviluppi?"
Io: "Java, C#..."
C.: "Allora hai fatto anche qualcosa per Android?"
Io: "Niente di concreto, ma ho guardato gli esempi e fatto qualche prova"
C.: "Hai provato a sviluppare per iPad?"
Io.: "Ho visto gli esempi anche li, ma niente di più"
C.: "A livello di Look&Feel avrai visto che è migliore."
Io: "Si certo, però ObjectiveC è un linguaggio più difficile da gestire che non il Java, i tempi di sviluppo sono più lunghi"
C.: "Beh, però in questo caso forse sei tu che non sei abbastanza esperto, devi studiare di più"
Io: "Può darsi. Ora ti saluto, grazie di tutto"
C.: "Grazie a te, buona giornata"

Ora, io non sono esperto di ObjectiveC, però tra un linguaggio dove devo ricordarmi di disallocare i puntatori e uno dove me ne frego altamente di liberare la memoria perché viene gestita dalla macchina virtuale, quale pensate che sia più produttivo?
Bisognerebbe forse dare una maggiore infarinatura ai tecnici su come funzionano le cose, ed essere un po' più obbiettivi.

giovedì 4 agosto 2011

Run Jetty Run

"running a web application in Eclipse should be as simple as 'clicking run' "
Anch'io l'ho sempre pensata così, e la gestione dei server in Eclipse mi era sempre sembrata tanto pesante. E' vero, strutturata in quel modo puoi incastrarci dentro qualsiasi server anche molto complesso, tipo JBoss o WebSphere, ma manca molto di immediatezza.
Se si vogliono fare cose semplici, o si decide di usare piattaforme di base, non c'è un modo "veloce" in Eclipse per configurare il tutto.
Con Run Jetty Run, invece, con un semplice click si può far partire una applicazione web in maniera semplice e leggera.
L'ho trovato veramente molto comodo, e usando maven per creare l'archetipo di progetto mi permette di fare veramente in un batter d'occhio.

sabato 2 luglio 2011

WCF Basic Authentication

Ultimamente ho avuto a che fare con un WebService che richiede esplicitamente la Basic Authentication.
Il mio client è in C# .Net 4.0, e quindi usa le Windows Communication Foundation.
Il protocollo HTTP, per quanto riguarda la Basic Authentication assume che il client debba authenticarsi con una username ed una password per ciascun realm (vedi qua). In pratica deve essere aggiunto, in modo esplicito uh Header alla chiamata HTTP contenente username e password encodate in base64.

Per un WebService client pensavo che fosse sufficiente impostare il tipo di autenticazione (Basic) e settare le credenziali. Purtroppo, facendo la chiamata, ottenevo sempre un errore di autenticazione. Verificando con un proxy http il messaggio che viene composto, mi sono accorto che l'Header non viene aggiunto automaticamente alla chiamata. Non ho verificato, lo ammetto, se questo è un bug del framework .Net o se è il comportamento standard.

Il problema si risolve comunque aggiungendo l'Header "a mano" nella chiamata. Per i WebServices WCF non si usa direttamente l'oggetto client, ma si lavora sull'operation scope, acquisendo da qui la request ed aggiungendo a questa l'autenticazione. L'esempio me lo ha dato questo articolo, che ringrazio dal profondo del cuore.

English translation here

mercoledì 4 maggio 2011

Quale sarà la fine di Mono?

Dopo l'acquisto di Novell da parte di Attachmate, sono stati "liberati" un numero imprecisato di sviluppatori che lavoravano al progetto Mono. Quale sarà ora il suo destino?
http://blog.internetnews.com/skerner/2011/05/attachmate-lays-off-mono-emplo.html

domenica 17 aprile 2011

Gestire il file Upload con Spring

Fare del file upload non è mai stata un'operazione facile, o comunque abbastanza automatica. Si deve creare una servlet e scodare il file dai parametri di request del form.
Usando Spring ho visto che è stato molto semplificato il file Upload, e l'operazione si incastra nel meccanismo della DispatcherServlet e dell'ApplicationContext.
In pratica nell'Application Context basta aggiungere un'istanza della classe org.springframework.web.multipart.commons.CommonsMultipartResolver
Questa classe, quando intercetta una post action con encoding attribute multipart/form-data, la gestisce e trasforma il file in un request parameter di tipo MultipartHttpServletRequest o MultipartFile
Così trasformata la request viene passata al controller, dichiarando come parametri di input il file e gli altri parametri dichiarati nella form.

lunedì 11 aprile 2011

Si diventa internazionali

Ho deciso di tradurre quegli articoli che secondo me sono di maggior interesse anche in inglese.
Per me è una sfida, sia per la lingua che per i contenuti, speriamo porti soddisfazione.
Questo il link

lunedì 4 aprile 2011

domenica 3 aprile 2011

Google Datastore e l'annotation @Unique

E' ormai ufficiale che mi sto gingillando da un bel po' con La Google App Engine. Qundo avrò qualcosa di minimamente presentabile vi dirò anche perché.
Devo dire che trovo un bel po' di problemi a lavorare con il Datastore. Sarà che non sono capace, oppure sarà che il prodotto è ancora giovane, ma ogni tanto ci scappa fuori il bug.

L'ultimo è stato l'uso della annotation @Unique nelle entità. Secondo le specifiche JDO questa annotation serve a creare una chiave univoca sulla proprietà a cui si applica. Ad esempio se ho la classe Author fatta così


@PersistenceCapable
public class Author {

 @PrimaryKey
 @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
 private Key id;
 
 @Persistent
 @Unique
 private String name;

   ... omessi getters e setters
}
il Datastore dovrebbe creare una chiave univoca sulla proprietà Name. Facendo qualche test mi sono accorto che questo non succede. Ho cercato un po' per vedere se qualcuno ha avuto i miei stessi problemi ed ho trovato questo. Il comportamento riscontrato è quindi un bug riconosciuto.
Come fare quindi? Per fortuna la Key può anche essere generata, non solo calcolata automaticamente: si può quindi seguire questo metodo. Se si segue il pattern Dao si avrà sempre una classe per gestire le entità. Nel mio caso la classe si chiama, con molta fantasia, AuthorDao e, prima di salvare l'entità sarà sufficiente calcolare la chiave nel seguente modo



In questo modo la chiave sarà la stessa a parità di nome, e quindi sarà garantita l'univocità.

martedì 15 marzo 2011

Google App Engine e le relazioni

Visto che voglio capire di più su come sono fatte le api Google App Engine per il DataStore mi sono chiesto: "come si gestiscono le relazioni?"
La pagina che spiega tutto è questa. In pratica la limitazione più forte che ho riscontrato è che, per creare una relazione tra due entità queste devono avere come chiave primaria un oggetto di tipo Key: questo perché l'oggetto Key supporta le informazioni sulla parent key. Leggendo la documentazione su Key si legge che "If the class is used as a "child" class in a relationship, the key field must be of a type capable of representing an entity group parent: either a Key instance, or a Key value encoded as a string." Evidentemente il meccanismo di storage delle informazioni ha bisogno di creare legami tra le classi, e questo è l'unico modo che ha per farlo.
Speriamo in futuri miglioramenti.

lunedì 28 febbraio 2011

Come migrare da Weblogic o Websphere a Tomcat

Questo articolo è interessante, più che per i tips di migrazione, per il confronto tra i vari Application Server ( e perché ho scoperto OpenEJB non si finisce mai di imparare)

sabato 26 febbraio 2011

Google AppEngine e le Query in Java

Ho giocato un po' con Google App Engine.
In particolare ho cercato di capire come funziona la gestione del database da un'applicazione Java.
Google App Engine store i suoi dati su quello che viene chiamato Datastore. Il Datastore azzera totalmente per l'utente la gestione di replica, bilanciamento di carico e backup, che è tutta a carico dell'infrastruttura.
L'accesso ai dati viene quindi fatto attraverso un set di API, rese disponibili da Google. Sopra queste API è stato creato un meccanismo che permette di accedere ai dati in due modi standard: o via JPA, le Java Persistence API delle specifiche J2EE, o via JDO, i Java Data Objects di Apache.
Queste due tipologie di accesso vengono rese disponibili attraverso il framework DataNucleus, che si occupa di tradurre (fra l'altro in fase di compilazione) la gestione degli oggetti di persistenza.
La documentazione di Google focalizza i suoi esempi sull'uso di JDO, che non conoscevo, e che quindi mi ha stuzzicato l'appetito.
Per fare un test ho provato a creare una classe Author, con le sole proprietà id e name, fatta così



Le annotations contenute in questa classe consentono a DataNucleus di mappare la classe su una tabella.
Le chiavi primarie per il DataStore sono di tre tipi: Long, Key (un tipo dati custom del DataStore) o String: questo tipo di dati in particolare deve essere gestito dall'applicativo, non viene mai calcolato automaticamente.
Il DataStore richiede che un oggetto abbia una chiave primaria.
Nel mio esempio non volevo usare una String come chiave primaria, ma volevo però che il nome fosse univoco, ed ho quindi taggato con l'annotation @Unique la proprietà name.
Per salvare un oggetto è sufficiente, ottenuto quello che si chiama un PersistenceManager, invocare il metodo makePersistent(Object o).
Ora, supponiamo di aver salvato una serie di autori che iniziano con la A, ad esempio Asimov, Aristotele, Alighieri e di volergli ritrovare.
Se stessi usando Hibernate recupererei una Session, aggiungerei Criteria e Restrictions oppure farei una Query in HSQL.
Con JDO, guardando la documentazione, si ottiene un oggetto Query e su quello si può usare il metodo setFilter o il linguaggio JDOQL, simile a HSQL.
Vediamo quindi come scrivere una query che trovi tutti gli autori che cominciano per A



Dall'esempio si vede che, recuperato il PersistenceManager attraverso una classe si utilità, si crea una Query e su quella, dichiarato che si stanno facendo query sulla classe Author, si applica un filtro.
La clausola SQL LIKE si esprime in JDOQL con .startsWith() e poi si dichiarano i parametri  con la sintassi
Il metodo execute() della query recupera gli oggetti precedentemente salvati. Google App Engine ha un bug in questa operazione: quando gli oggetti vengono sganciati ("detached") dal DataStore, se si tenta di scorrere la List, viene lanciata un'eccezione. Bisogna quindi chiamare il metodo .size() prima di chiudere il PersistenceManager, per permettere il corretto caricamento di tutto l'array.

Tutto qua, per ora, il prossimo step sarà capire come gestire le relazioni 1-n e soprattutto come recuperare entità partendo dalla relazione figlia.
See You Next Time!!!

giovedì 17 febbraio 2011

eXtreme Programming: le regole della semplicità

http://www.c2.com/cgi/wiki?XpSimplicityRules
Che altro dire? Magari si riuscisse a fare sempre un lavoro del genere! :-D

lunedì 14 febbraio 2011

GWT 2.2 ed Eclipse Plugin ora disponibili

Google ha appena rilasciato una nuova versione di GWT e del plugin per Eclipse.
La notizia di maggior rilievo è che è stato integrato il GUI Designer nel plugin.
Inoltre sono stati migliorati il supporto per Html5 e le Api per CellTable

Creare partizioni in tempo reale: un errore comune

Josh Berkus, tra i fondatori di PostGreSQL, ci dice perchè, a suo avviso, è meglio non creare partizioni attraverso i trigger, ma schedulare, da bravi DBA, la creazione.
http://it.toolbox.com/blogs/database-soup/partition-at-insert-time-a-smart-mistake-44294?rss=1