Un mio articolo su JavATE è appena stato pubblicato sul sito di ZK.
Lo potete raggiungere a questo URL.
Grazie agli amici del team di ZK per questa possibilità di dare visibilità a JavATE.
martedì 15 settembre 2009
venerdì 28 agosto 2009
JavATE 0.3
Di recente ho rilasciato la versione 0.3 del mio framework JavATE.
Le novità principali riguardano:
Le novità principali riguardano:
- Un sottoprogetto completamente nuovo chiamato "AuthorizATE". Come si può intuire dal nome questo progetto si occupa dell'autorizzazione degli utenti.
- TreeBrowser e TreeEditor per navigare ed editare alberi di oggetti.
- Il meccanismo di validazione è stato completamente riscritto ed ora è indipendente dal progetto GuidATE. Ora può essere utilizzato anche da chi decide di utilizzare solamente DominATE.
- Il ListEditor è stato completamente riscritto ed ora è molto più flessibile la gestione della lista che si sta modificando.
- E' stato aggiunto un meccanismo basato sulle annotazioni che consente di dichiarare una property come dipendente da altre, in modo che quando scatta un evento di PropertyChange di una, scatta il corrispondente evento per tutte le property che da questa dipendono
sabato 18 aprile 2009
Non è mai troppo tardi ...
... per imparare qualcosa di nuovo. Pensavo di sapere praticamente tutto sul "linguaggio" Java. Non parlo delle librerie o delle specifiche collaterali, ma del linguaggio vero e proprio. Eppure proprio ieri ho scoperto qualcosa che non conoscevo.
Così come è possibile aggiungere ad una classe un inizializzatore statico che viene eseguito prima di qualsiasi utilizzo della classe:
ho scoperto che è possibile aggiungere un inizializzatore di istanza:
Il codice dell'inizializzatore di istanza viene eseguito dopo l'inizializzazione degli attributi della classe ma prima del costruttore.
Con questo inizializzatore non solo è possibile fattorizzare la parte comune dell'inizializzazione di una classe, che spesso viene ripetuta in ciascun costruttore, ma è fondamentale soprattutto per l'inizializzazione delle istanze di classi anonime, che non possiedono un costruttore. Sarà infatti possibile scrivere:
Questo permette una tecnica detta Double Braced Initialization per l'inizializzazione delle Collection e delle Map. Basta infatti usare la seguente sintassi:
per avere in m una Map subito pronta.
Così come è possibile aggiungere ad una classe un inizializzatore statico che viene eseguito prima di qualsiasi utilizzo della classe:
public class MiaClasse {
static {
// Codice da eseguire
}
}
ho scoperto che è possibile aggiungere un inizializzatore di istanza:
public class MiaClasse {
{
// Codice da eseguire
}
}
Il codice dell'inizializzatore di istanza viene eseguito dopo l'inizializzazione degli attributi della classe ma prima del costruttore.
Con questo inizializzatore non solo è possibile fattorizzare la parte comune dell'inizializzazione di una classe, che spesso viene ripetuta in ciascun costruttore, ma è fondamentale soprattutto per l'inizializzazione delle istanze di classi anonime, che non possiedono un costruttore. Sarà infatti possibile scrivere:
new ParentClass() {
{
//codice di inizializzazione della classe anonima
}
// resto della classe anonima
};
Questo permette una tecnica detta Double Braced Initialization per l'inizializzazione delle Collection e delle Map. Basta infatti usare la seguente sintassi:
Map m = new HashMap() {{
put("primo", 1L);
put("secondo", 2L);
put("terzo", 3L);
}};
per avere in m una Map subito pronta.
giovedì 16 aprile 2009
Open Source Business Intelligence
Mi è capitato recentemente di dover effettuare uno studio di fattibilità per un progetto per un nuovo cliente che aveva tra i requisiti una serie di analisi statistiche abbastanza sofisticate.
Mi sono immediatamente reso conto che era esattamente il tipico problema risolvibile tramite l'analisi dati multidimensionale ma ... di solito i tool di Business Intelligence sono estremamente costosi.
Ovviamente non mi sono perso d'animo, mi sono messo a cercare e la ricerca ha dato i suoi frutti.
Ho scoperto inizialmente l'esistenza di Jasper Server. Ovviamente avevo già usato più volte Jasper Report per realizzare piccoli report da lanciare dall'interno degli applicativi, ma Jasper Server, oltre ad agire da reporting server (esecuzione centralizzata, schedulazione, ecc.) può agire anche da semplice tool di analisi multidimensionale.
Ma Jasper Server in realtà mi ha aperto un mondo, perchè ho scoperto che al suo interno utilizza Mondrian, una libreria open source per l'analisi multidimensionale con supporto per il linguaggio MDX.
Inoltre, per l'interfaccia utente Web based, viene usato jPivot, che permette di visualizzare il risultato delle query MDX effettuate con Mondrian con la possibilità di effetuare drill-up / drill-down e molte altre delle operazioni tipiche dei tool di business intelligence. Peccato che la documentazione sia un po' scarsa!
Tramite jPivot e Mondrian non è difficile integrare all'interno di un applicativo web un'interfaccia per l'analisi dati. Niente di particolarmente sofisticato ma di sicura efficacia per clienti che non si possono permettere di acquistare una costosissima licenza di un tool di cui poi useranno circa l'1% delle funzionalità.
Mi sono immediatamente reso conto che era esattamente il tipico problema risolvibile tramite l'analisi dati multidimensionale ma ... di solito i tool di Business Intelligence sono estremamente costosi.
Ovviamente non mi sono perso d'animo, mi sono messo a cercare e la ricerca ha dato i suoi frutti.
Ho scoperto inizialmente l'esistenza di Jasper Server. Ovviamente avevo già usato più volte Jasper Report per realizzare piccoli report da lanciare dall'interno degli applicativi, ma Jasper Server, oltre ad agire da reporting server (esecuzione centralizzata, schedulazione, ecc.) può agire anche da semplice tool di analisi multidimensionale.
Ma Jasper Server in realtà mi ha aperto un mondo, perchè ho scoperto che al suo interno utilizza Mondrian, una libreria open source per l'analisi multidimensionale con supporto per il linguaggio MDX.
Inoltre, per l'interfaccia utente Web based, viene usato jPivot, che permette di visualizzare il risultato delle query MDX effettuate con Mondrian con la possibilità di effetuare drill-up / drill-down e molte altre delle operazioni tipiche dei tool di business intelligence. Peccato che la documentazione sia un po' scarsa!
Tramite jPivot e Mondrian non è difficile integrare all'interno di un applicativo web un'interfaccia per l'analisi dati. Niente di particolarmente sofisticato ma di sicura efficacia per clienti che non si possono permettere di acquistare una costosissima licenza di un tool di cui poi useranno circa l'1% delle funzionalità.
sabato 28 marzo 2009
Firefox vs Internet Explorer
SourceForge permette di attivare sul sito di un progetto una serie di software per controllare il progetto stesso. Tra questi c'è anche Piwik, che permette di analizzare gli accessi al sito del progetto. E tra le informazioni statistiche c'è anche il browser utilizzato dal visitatore.
Ho attivato Piwik sul sito di JavATE, il progetto open source a cui lavoro e guardando queste statistiche si nota una netta preponderanza di Firefox. Su 45 visite al sito soltanto 3 sono state effettuate usando Internet Explorer!
Probabilmente come statistica non è molto valida, il campione è piccolo e c'è sicuramente un forte bias dovuto al tipo di utente interessato a JavATE (sviluppatori Java) ma proprio per quest'ultima considerazione la dice tutto sulla qualità del browser Microsoft: gli esperti preferiscono sicuramente Firefox
Ho attivato Piwik sul sito di JavATE, il progetto open source a cui lavoro e guardando queste statistiche si nota una netta preponderanza di Firefox. Su 45 visite al sito soltanto 3 sono state effettuate usando Internet Explorer!
Probabilmente come statistica non è molto valida, il campione è piccolo e c'è sicuramente un forte bias dovuto al tipo di utente interessato a JavATE (sviluppatori Java) ma proprio per quest'ultima considerazione la dice tutto sulla qualità del browser Microsoft: gli esperti preferiscono sicuramente Firefox
lunedì 29 dicembre 2008
Three state logic
In un applicativo che sto sviluppando mi è capitato di dover gestire una logica a tre stati:
- Vero
- Falso
- Indifferente
Nell'object model è abbastanza agevole svilupparlo con un attributo di tipo Boolean che ammette i valori: true, false, null. Ma cosa succede nell'interfaccia utente?
Non è possibile usare un check-box, perchè ammette soltanto due valori, sembra più adatto un listbox!
Per poter usare agevolmente il listbox è però più opportuno avere un'enumerazione invece del Boolean. Si possono però prendere due piccioni con una sola fava creando l'enumerazione come segue:
A questo punto nella classe dell'object model potete usarlo così:
Ovviamente, se necessario, potete anche aggiungere degli accessor method che manipolano direttamente l'attributo Boolean
- Vero
- Falso
- Indifferente
Nell'object model è abbastanza agevole svilupparlo con un attributo di tipo Boolean che ammette i valori: true, false, null. Ma cosa succede nell'interfaccia utente?
Non è possibile usare un check-box, perchè ammette soltanto due valori, sembra più adatto un listbox!
Per poter usare agevolmente il listbox è però più opportuno avere un'enumerazione invece del Boolean. Si possono però prendere due piccioni con una sola fava creando l'enumerazione come segue:
public enum TreStati {
VERO(Boolean.TRUE),
FALSO(Boolean.FALSE),
INDIFFERENTE(null);
private Boolean val;
private TreStati(Boolean val) {
this.val = val;
}
public Boolean getVal() {
return val;
}
public static TreStati fromBoolean(Boolean val) {
if (val == null) {
return INDIFFERENTE;
} else if (val) {
return VERO;
} else {
return FALSO;
}
}
}
A questo punto nella classe dell'object model potete usarlo così:
private Boolean attr;
public TreStati getAttr() {
return TreStati.fromBoolean(attr);
}
public void setAttr(TreStati attr) {
this.attr = attr.getVal();
}
Ovviamente, se necessario, potete anche aggiungere degli accessor method che manipolano direttamente l'attributo Boolean
mercoledì 13 agosto 2008
JBoss
Finora ho fatto il deploy degli applicativi di Matica su una installazione di Tomcat 6.0, ma recentemente cominciano a sorgere delle necessità che con Tomcat non sono proprio banali da risolvere, come, ad esempio, quella di utilizzare delle code JMS. In questo caso avrei dovuto installare un gestore JMS esterno, configurarlo ecc... Allora mi sono detto: perchè non proviamo con JBoss che invece questi servizi ce li ha già?
Non avevo mai usato JBoss perciò ho cominciato a provare e ho avuto qualche problemino già in fase di startup. Niente di insormontabile, ovviamente. Ecco cosa è successo.
Innanzitutto ho provato a seguire il manuale:
- ho scompattato il pacchetto di JBoss 4.2.3GA in /opt/jboss
- ho impostato nel mio .bashrc le variabili JAVA_HOME e JBOSS_HOME rispettivamente alle directory che contengono l'installazione della JVM e di JBoss
- ho lanciato lo script di startup con /opt/jboss/bin/run.sh
E lo script è andato in errore! Forse il mio utente non ha abbastanza privilegi, proviamo con sudo:
sudo -E /opt/jboss/bin/run.sh
Stavolta funziona! Ho dovuto usare l'opzione -E di sudo per fare in modo che le variabili d'ambiente che avevo impostato nel mio .bashrc fossero mantenute anche nella shell che lancia JBoss.
Ho provato a connettermi alla pagina di benvenuto di JBoss prima da un browser sulla stessa macchina, poi da uno su un'altra macchina (virtuale, poichè al momento ho un solo PC). La cosa strana è che funziona solamente da localhost. Se provo ad usare l'indirizzo della macchina, sia da loacle che da remoto, JBoss non risponde.
Ho cercato un po' in rete e ho scoperto che dalla 4.2 in poi JBoss si mette in ascolto solamente sull'indirizzo 127.0.0.1 (per gli amici "localhost") mentre per metterlo in ascolto su un altro indirizzo occorre usare il parametro -b, ad esempio:
sudo -E /opt/jboss/bin/run.sh -b 192.168.0.165
Così però non funziona più se lo chiamo da localhost. Se si vuole farlo funzionare in ogni caso basta usare -b 0.0.0.0
Nel cercare questa informazione ho scoperto anche la pagina del wiki di JBoss dove sono elencate le opzioni dello script di startup:
http://wiki.jboss.org/wiki/JBossRunParameters
e che nella stessa directory dello script c'è un file, chiamato run.conf, che permette, sotto unix/linux/ecc. , di impostare le variabili d'ambiente.
Perciò ho spostato la definizione della JAVA_HOME dal mio .bashrc a run.conf e ora posso lanciare il tutto senza l'opzione -E di sudo. Riassumendo:
sudo /opt/jboss/bin/run.sh -b 0.0.0.0
Ora sarebbe carino riuscire a lanciarlo come servizio! Ma questa è un'altra storia
Non avevo mai usato JBoss perciò ho cominciato a provare e ho avuto qualche problemino già in fase di startup. Niente di insormontabile, ovviamente. Ecco cosa è successo.
Innanzitutto ho provato a seguire il manuale:
- ho scompattato il pacchetto di JBoss 4.2.3GA in /opt/jboss
- ho impostato nel mio .bashrc le variabili JAVA_HOME e JBOSS_HOME rispettivamente alle directory che contengono l'installazione della JVM e di JBoss
- ho lanciato lo script di startup con /opt/jboss/bin/run.sh
E lo script è andato in errore! Forse il mio utente non ha abbastanza privilegi, proviamo con sudo:
sudo -E /opt/jboss/bin/run.sh
Stavolta funziona! Ho dovuto usare l'opzione -E di sudo per fare in modo che le variabili d'ambiente che avevo impostato nel mio .bashrc fossero mantenute anche nella shell che lancia JBoss.
Ho provato a connettermi alla pagina di benvenuto di JBoss prima da un browser sulla stessa macchina, poi da uno su un'altra macchina (virtuale, poichè al momento ho un solo PC). La cosa strana è che funziona solamente da localhost. Se provo ad usare l'indirizzo della macchina, sia da loacle che da remoto, JBoss non risponde.
Ho cercato un po' in rete e ho scoperto che dalla 4.2 in poi JBoss si mette in ascolto solamente sull'indirizzo 127.0.0.1 (per gli amici "localhost") mentre per metterlo in ascolto su un altro indirizzo occorre usare il parametro -b
sudo -E /opt/jboss/bin/run.sh -b 192.168.0.165
Così però non funziona più se lo chiamo da localhost. Se si vuole farlo funzionare in ogni caso basta usare -b 0.0.0.0
Nel cercare questa informazione ho scoperto anche la pagina del wiki di JBoss dove sono elencate le opzioni dello script di startup:
http://wiki.jboss.org/wiki/JBossRunParameters
e che nella stessa directory dello script c'è un file, chiamato run.conf, che permette, sotto unix/linux/ecc. , di impostare le variabili d'ambiente.
Perciò ho spostato la definizione della JAVA_HOME dal mio .bashrc a run.conf e ora posso lanciare il tutto senza l'opzione -E di sudo. Riassumendo:
sudo /opt/jboss/bin/run.sh -b 0.0.0.0
Ora sarebbe carino riuscire a lanciarlo come servizio! Ma questa è un'altra storia
Iscriviti a:
Post (Atom)