<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-1562169188554654924</id><updated>2011-07-28T15:46:37.394+02:00</updated><category term='AJAX'/><category term='Java'/><category term='Web'/><title type='text'>JavIdea</title><subtitle type='html'>Piccole idee sul software</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://javidea.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1562169188554654924/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://javidea.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Andrea Mattioli</name><uri>http://www.blogger.com/profile/09976397651459021463</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_w-TyhXY6lPs/SwVnMMLkGOI/AAAAAAAAABU/E6GdaNdbZkc/S220/Andrea.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>13</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-1562169188554654924.post-8009850539934239620</id><published>2011-03-22T16:26:00.004+01:00</published><updated>2011-03-22T16:38:22.088+01:00</updated><title type='text'>Un po' di magia con le immagini</title><content type='html'>Sto sviluppando un applicativo per un grossista di penumatici e ho avuto la necessità di visualizzare i logo delle marche di pneumatici.&lt;div&gt;Apparentemente nulla di sconvolgente ... finché non ho visto i file che mi ha mandato il cliente.&lt;/div&gt;&lt;div&gt;Un centinaio di file jpeg tutti di dimensioni diverse! Andavano da circa 150x50 fino a circa 1000x500.&lt;/div&gt;&lt;div&gt;Sinceramente non avevo nessuna voglia di aprirli uno ad uno con GIMP per ridimensionarli.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Fortunatamente in ambiente Linux esiste un tool per la manipolazione di immagini da riga di comando: ImageMagick.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;E' bastato installarlo dal packet manager della mia distro Linux e con 3 righe di bash:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;pre&gt;for file in *.jpg; do&lt;br /&gt;  convert $file -strip -thumbnail 148x64 result/$file&lt;br /&gt;done&lt;br /&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Et voila, il gioco è fatto.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1562169188554654924-8009850539934239620?l=javidea.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javidea.blogspot.com/feeds/8009850539934239620/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1562169188554654924&amp;postID=8009850539934239620' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1562169188554654924/posts/default/8009850539934239620'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1562169188554654924/posts/default/8009850539934239620'/><link rel='alternate' type='text/html' href='http://javidea.blogspot.com/2011/03/un-po-di-magia-con-le-immagini.html' title='Un po&apos; di magia con le immagini'/><author><name>Andrea Mattioli</name><uri>http://www.blogger.com/profile/09976397651459021463</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_w-TyhXY6lPs/SwVnMMLkGOI/AAAAAAAAABU/E6GdaNdbZkc/S220/Andrea.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1562169188554654924.post-7575656913592823158</id><published>2009-11-19T16:43:00.005+01:00</published><updated>2009-11-19T17:05:29.171+01:00</updated><title type='text'>SqlTool</title><content type='html'>&lt;span style="font-family:times new roman;"&gt;Ho scoperto di recente che &lt;/span&gt;&lt;a style="font-family: times new roman;" href="http://hsqldb.org/"&gt;HSQLDB &lt;/a&gt;&lt;span style="font-family:times new roman;"&gt;possiede un piccolo tool, chiamato SqlTool, con cui è possibile connettersi ad un qualsiasi database e inviare comandi e script SQL da linea di comando.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:times new roman;"&gt;Già questo ne fa uno strumento fondamentale, visto che esistono database che non offrono tool per l'invio di script SQL da shell.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:times new roman;"&gt;Ma la vera forza è la possibilità di utilizzarlo dall'interno dei propri programmi.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:times new roman;"&gt;Immaginate un applicativo che la prima volta che viene lanciato crea il suo database senza bisogno di intervento, o la possibilità di applicare patch al db dopo l'installazione di una nuova versione.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:times new roman;"&gt;L'utilizzo è veramente semplice. Di seguito riporto un esempio:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;pre&gt;&lt;br /&gt;String url = "jdbc:hsqldb:file:/java/provehsql/provedb;shutdown=true";&lt;br /&gt;String user = "sa";&lt;br /&gt;String pwd = "";&lt;br /&gt;String sql = IOUtils.toString(Prova.class.getResourceAsStream("script.sql"));&lt;br /&gt;SqlTool.objectMain(new String[] {&lt;br /&gt;  "--inlineRc",&lt;br /&gt;  "URL=" + url + ",USER=" + user + ",PASSWORD=" + pwd,&lt;br /&gt;  "--sql",&lt;br /&gt;  sql&lt;br /&gt;});&lt;br /&gt;&lt;/pre&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;&lt;/span&gt;&lt;span style="font-family:times new roman;"&gt;Come si può notare ho caricato il contenuto di uno script file in una string (utilizzando Apache IOUtils) per poi passarlo al metodo objectMain() di SqlTool insieme all'url e alle credenziali per la connessione al DB.&lt;br /&gt;Il metodo accetta un array di stringhe analogo a quanto farebbe il metodo main per i parametri della riga di comando.&lt;br /&gt;L'unico reale impedimento che ho riscontrato è che non è possibile passare una password non vuota. Se l'utente del database ha una password impostata il metodo si ferma per leggerla dallo standard input, cosa che vanifica ogni tentativo di automatizzazione.&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1562169188554654924-7575656913592823158?l=javidea.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javidea.blogspot.com/feeds/7575656913592823158/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1562169188554654924&amp;postID=7575656913592823158' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1562169188554654924/posts/default/7575656913592823158'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1562169188554654924/posts/default/7575656913592823158'/><link rel='alternate' type='text/html' href='http://javidea.blogspot.com/2009/11/sqltool.html' title='SqlTool'/><author><name>Andrea Mattioli</name><uri>http://www.blogger.com/profile/09976397651459021463</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_w-TyhXY6lPs/SwVnMMLkGOI/AAAAAAAAABU/E6GdaNdbZkc/S220/Andrea.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1562169188554654924.post-1594013866003648136</id><published>2009-09-15T17:38:00.003+02:00</published><updated>2009-09-15T17:42:10.036+02:00</updated><title type='text'>Articolo su JavATE</title><content type='html'>Un mio articolo su &lt;a href="http://www.javate.amattioli.it"&gt;JavATE&lt;/a&gt; è appena stato pubblicato sul &lt;a href="http://www.zkoss.org"&gt;sito di ZK&lt;/a&gt;.&lt;br /&gt;Lo potete raggiungere a &lt;a href="http://docs.zkoss.org/wiki/ZK_and_JavATE"&gt;questo URL&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Grazie agli amici del team di ZK per questa possibilità di dare visibilità a JavATE.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1562169188554654924-1594013866003648136?l=javidea.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javidea.blogspot.com/feeds/1594013866003648136/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1562169188554654924&amp;postID=1594013866003648136' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1562169188554654924/posts/default/1594013866003648136'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1562169188554654924/posts/default/1594013866003648136'/><link rel='alternate' type='text/html' href='http://javidea.blogspot.com/2009/09/articolo-su-javate.html' title='Articolo su JavATE'/><author><name>Andrea Mattioli</name><uri>http://www.blogger.com/profile/09976397651459021463</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_w-TyhXY6lPs/SwVnMMLkGOI/AAAAAAAAABU/E6GdaNdbZkc/S220/Andrea.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1562169188554654924.post-7246956306084890302</id><published>2009-08-28T19:56:00.002+02:00</published><updated>2009-08-28T20:06:20.087+02:00</updated><title type='text'>JavATE 0.3</title><content type='html'>Di recente ho rilasciato la versione 0.3 del mio framework &lt;a href="http://www.javate.amattioli.it"&gt;JavATE&lt;/a&gt;. &lt;br /&gt;Le novità principali riguardano:&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;  &lt;li&gt;Un sottoprogetto completamente nuovo chiamato "AuthorizATE". Come si può intuire dal nome questo progetto si occupa dell'autorizzazione degli utenti.&lt;/li&gt;&lt;br /&gt;  &lt;li&gt;TreeBrowser e TreeEditor per navigare ed editare alberi di oggetti.&lt;/li&gt;&lt;br /&gt;  &lt;li&gt;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.&lt;/li&gt;&lt;br /&gt;  &lt;li&gt;Il ListEditor è stato completamente riscritto ed ora è molto più flessibile la gestione della lista che si sta modificando.&lt;/li&gt;&lt;br /&gt;  &lt;li&gt;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&lt;/li&gt; &lt;br /&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1562169188554654924-7246956306084890302?l=javidea.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javidea.blogspot.com/feeds/7246956306084890302/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1562169188554654924&amp;postID=7246956306084890302' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1562169188554654924/posts/default/7246956306084890302'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1562169188554654924/posts/default/7246956306084890302'/><link rel='alternate' type='text/html' href='http://javidea.blogspot.com/2009/08/javate-03.html' title='JavATE 0.3'/><author><name>Andrea Mattioli</name><uri>http://www.blogger.com/profile/09976397651459021463</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_w-TyhXY6lPs/SwVnMMLkGOI/AAAAAAAAABU/E6GdaNdbZkc/S220/Andrea.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1562169188554654924.post-3268133721846953094</id><published>2009-04-18T20:00:00.007+02:00</published><updated>2009-04-18T22:14:58.182+02:00</updated><title type='text'>Non è mai troppo tardi ...</title><content type='html'>... 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.&lt;br /&gt;&lt;br /&gt;Così come è possibile aggiungere ad una classe un inizializzatore statico che viene eseguito prima di qualsiasi utilizzo della classe:&lt;br /&gt;&lt;pre&gt;&lt;code&gt;&lt;br /&gt;public class MiaClasse {&lt;br /&gt;       static {&lt;br /&gt;               // Codice da eseguire&lt;br /&gt;       }&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;ho scoperto che è possibile aggiungere un inizializzatore di istanza:&lt;br /&gt;&lt;pre&gt;&lt;code&gt;&lt;br /&gt;public class MiaClasse {&lt;br /&gt;       {&lt;br /&gt;               // Codice da eseguire&lt;br /&gt;       }&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;Il codice dell'inizializzatore di istanza viene eseguito dopo l'inizializzazione degli attributi della classe ma prima del costruttore.&lt;br /&gt;&lt;br /&gt;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:&lt;br /&gt;&lt;pre&gt;&lt;code&gt;&lt;br /&gt;new ParentClass() {&lt;br /&gt;       {&lt;br /&gt;               //codice di inizializzazione della classe anonima&lt;br /&gt;       }&lt;br /&gt;&lt;br /&gt;       // resto della classe anonima&lt;br /&gt;&lt;br /&gt;};&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;Questo permette una tecnica detta &lt;a href="http://c2.com/cgi/wiki,%202004?DoubleBraceInitialization"&gt;Double Braced Initialization&lt;/a&gt; per l'inizializzazione delle Collection e delle Map. Basta infatti usare la seguente sintassi:&lt;br /&gt;&lt;pre&gt;&lt;code&gt;&lt;br /&gt;Map&lt;string, long=""&gt; m = new HashMap&lt;string, double=""&gt;() {{&lt;br /&gt;   put("primo", 1L);&lt;br /&gt;   put("secondo", 2L);&lt;br /&gt;   put("terzo", 3L);&lt;br /&gt;}};&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;per avere in m una Map subito pronta.&lt;/string,&gt;&lt;/string,&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1562169188554654924-3268133721846953094?l=javidea.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javidea.blogspot.com/feeds/3268133721846953094/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1562169188554654924&amp;postID=3268133721846953094' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1562169188554654924/posts/default/3268133721846953094'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1562169188554654924/posts/default/3268133721846953094'/><link rel='alternate' type='text/html' href='http://javidea.blogspot.com/2009/04/non-e-mai-troppo-tardi.html' title='Non è mai troppo tardi ...'/><author><name>Andrea Mattioli</name><uri>http://www.blogger.com/profile/09976397651459021463</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_w-TyhXY6lPs/SwVnMMLkGOI/AAAAAAAAABU/E6GdaNdbZkc/S220/Andrea.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1562169188554654924.post-1129576293548612455</id><published>2009-04-16T20:50:00.003+02:00</published><updated>2009-04-16T21:12:24.713+02:00</updated><title type='text'>Open Source Business Intelligence</title><content type='html'>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.&lt;br /&gt;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.&lt;br /&gt;Ovviamente non mi sono perso d'animo, mi sono messo a cercare e la ricerca ha dato i suoi frutti.&lt;br /&gt;&lt;br /&gt;Ho scoperto inizialmente l'esistenza di &lt;a href="http://www.jaspersoft.com/JasperSoft_JasperServer.html"&gt;Jasper Server&lt;/a&gt;. 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.&lt;br /&gt;&lt;br /&gt;Ma Jasper Server in realtà mi ha aperto un mondo, perchè ho scoperto che al suo interno utilizza &lt;a href="http://mondrian.pentaho.org/"&gt;Mondrian&lt;/a&gt;, una libreria open source per l'analisi multidimensionale con supporto per il linguaggio &lt;a href="http://en.wikipedia.org/wiki/Multidimensional_Expressions"&gt;MDX&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Inoltre, per l'interfaccia utente Web based, viene usato &lt;a href="http://jpivot.sourceforge.net/"&gt;jPivot&lt;/a&gt;, 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!&lt;br /&gt;&lt;br /&gt;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à.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1562169188554654924-1129576293548612455?l=javidea.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javidea.blogspot.com/feeds/1129576293548612455/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1562169188554654924&amp;postID=1129576293548612455' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1562169188554654924/posts/default/1129576293548612455'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1562169188554654924/posts/default/1129576293548612455'/><link rel='alternate' type='text/html' href='http://javidea.blogspot.com/2009/04/open-source-business-intelligence.html' title='Open Source Business Intelligence'/><author><name>Andrea Mattioli</name><uri>http://www.blogger.com/profile/09976397651459021463</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_w-TyhXY6lPs/SwVnMMLkGOI/AAAAAAAAABU/E6GdaNdbZkc/S220/Andrea.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1562169188554654924.post-2033060232479649011</id><published>2009-03-28T17:56:00.004+01:00</published><updated>2009-03-28T18:08:36.488+01:00</updated><title type='text'>Firefox vs Internet Explorer</title><content type='html'>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.&lt;br /&gt;&lt;br /&gt;Ho attivato Piwik sul sito di &lt;a href="http://javate.sourceforge.net"&gt;JavATE&lt;/a&gt;, 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!&lt;br /&gt;&lt;br /&gt;Probabilmente come statistica non è molto valida, il campione è piccolo e c'è sicuramente un forte bias dovuto al tipo di utente interessato a &lt;a href="http://javate.sourceforge.net"&gt;JavATE&lt;/a&gt; (sviluppatori Java) ma proprio per quest'ultima considerazione la dice tutto sulla qualità del browser Microsoft: gli esperti preferiscono sicuramente Firefox&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1562169188554654924-2033060232479649011?l=javidea.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javidea.blogspot.com/feeds/2033060232479649011/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1562169188554654924&amp;postID=2033060232479649011' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1562169188554654924/posts/default/2033060232479649011'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1562169188554654924/posts/default/2033060232479649011'/><link rel='alternate' type='text/html' href='http://javidea.blogspot.com/2009/03/firefox-vs-internet-explorer.html' title='Firefox vs Internet Explorer'/><author><name>Andrea Mattioli</name><uri>http://www.blogger.com/profile/09976397651459021463</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_w-TyhXY6lPs/SwVnMMLkGOI/AAAAAAAAABU/E6GdaNdbZkc/S220/Andrea.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1562169188554654924.post-3547344271188418928</id><published>2008-12-29T15:08:00.003+01:00</published><updated>2008-12-29T15:40:47.591+01:00</updated><title type='text'>Three state logic</title><content type='html'>In un applicativo che sto sviluppando mi è capitato di dover gestire una logica a tre stati:&lt;br /&gt;&lt;br /&gt;- Vero&lt;br /&gt;&lt;br /&gt;- Falso&lt;br /&gt;&lt;br /&gt;- Indifferente&lt;br /&gt;&lt;br /&gt;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?&lt;br /&gt;Non è possibile usare un check-box, perchè ammette soltanto due valori, sembra più adatto un listbox!&lt;br /&gt;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:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;pre&gt;&lt;br /&gt;public enum TreStati {&lt;br /&gt;    VERO(Boolean.TRUE),&lt;br /&gt;    FALSO(Boolean.FALSE),&lt;br /&gt;    INDIFFERENTE(null);&lt;br /&gt;&lt;br /&gt;    private Boolean val;&lt;br /&gt;&lt;br /&gt;    private TreStati(Boolean val) {&lt;br /&gt;        this.val = val;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public Boolean getVal() {&lt;br /&gt;        return val;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public static TreStati fromBoolean(Boolean val) {&lt;br /&gt;        if (val == null) {&lt;br /&gt;            return INDIFFERENTE;&lt;br /&gt;        } else if (val) {&lt;br /&gt;            return VERO;&lt;br /&gt;        } else {&lt;br /&gt;            return FALSO;&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;A questo punto nella classe dell'object model potete usarlo così:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;pre&gt;&lt;br /&gt;private Boolean attr;&lt;br /&gt;&lt;br /&gt;public TreStati getAttr() {&lt;br /&gt;    return TreStati.fromBoolean(attr);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public void setAttr(TreStati attr) {&lt;br /&gt;    this.attr = attr.getVal();&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Ovviamente, se necessario, potete anche aggiungere degli accessor method che manipolano direttamente l'attributo Boolean&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1562169188554654924-3547344271188418928?l=javidea.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javidea.blogspot.com/feeds/3547344271188418928/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1562169188554654924&amp;postID=3547344271188418928' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1562169188554654924/posts/default/3547344271188418928'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1562169188554654924/posts/default/3547344271188418928'/><link rel='alternate' type='text/html' href='http://javidea.blogspot.com/2008/12/three-state-logic.html' title='Three state logic'/><author><name>Andrea Mattioli</name><uri>http://www.blogger.com/profile/09976397651459021463</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_w-TyhXY6lPs/SwVnMMLkGOI/AAAAAAAAABU/E6GdaNdbZkc/S220/Andrea.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1562169188554654924.post-5714241815426087731</id><published>2008-08-13T11:23:00.002+02:00</published><updated>2008-08-13T11:49:29.704+02:00</updated><title type='text'>JBoss</title><content type='html'>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à?&lt;br /&gt;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.&lt;br /&gt;&lt;br /&gt;Innanzitutto ho provato a seguire il manuale:&lt;br /&gt;- ho scompattato il pacchetto di JBoss 4.2.3GA in /opt/jboss&lt;br /&gt;- ho impostato nel mio .bashrc le variabili JAVA_HOME e JBOSS_HOME rispettivamente alle directory che contengono l'installazione della JVM e di JBoss&lt;br /&gt;- ho lanciato lo script di startup con /opt/jboss/bin/run.sh&lt;br /&gt;&lt;br /&gt;E lo script è andato in errore! Forse il mio utente non ha abbastanza privilegi, proviamo con sudo:&lt;br /&gt;&lt;br /&gt;sudo -E /opt/jboss/bin/run.sh&lt;br /&gt;&lt;br /&gt;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.&lt;br /&gt;&lt;br /&gt;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.&lt;br /&gt;&lt;br /&gt;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 &lt;indirizzo&gt;, ad esempio:&lt;br /&gt;&lt;br /&gt;sudo -E /opt/jboss/bin/run.sh -b 192.168.0.165&lt;br /&gt;&lt;br /&gt;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&lt;br /&gt;&lt;br /&gt;Nel cercare questa informazione ho scoperto anche la pagina del wiki di JBoss dove sono elencate le opzioni dello script di startup:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://wiki.jboss.org/wiki/JBossRunParameters"&gt;http://wiki.jboss.org/wiki/JBossRunParameters&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;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.&lt;br /&gt;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:&lt;br /&gt;&lt;br /&gt;sudo /opt/jboss/bin/run.sh -b 0.0.0.0&lt;br /&gt;&lt;br /&gt;Ora sarebbe carino riuscire a lanciarlo come servizio! Ma questa è un'altra storia&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1562169188554654924-5714241815426087731?l=javidea.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javidea.blogspot.com/feeds/5714241815426087731/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1562169188554654924&amp;postID=5714241815426087731' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1562169188554654924/posts/default/5714241815426087731'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1562169188554654924/posts/default/5714241815426087731'/><link rel='alternate' type='text/html' href='http://javidea.blogspot.com/2008/08/jboss.html' title='JBoss'/><author><name>Andrea Mattioli</name><uri>http://www.blogger.com/profile/09976397651459021463</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_w-TyhXY6lPs/SwVnMMLkGOI/AAAAAAAAABU/E6GdaNdbZkc/S220/Andrea.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1562169188554654924.post-2198378152350260435</id><published>2008-07-06T21:43:00.005+02:00</published><updated>2008-07-06T21:58:51.313+02:00</updated><title type='text'>Restart Apache</title><content type='html'>In Matica (http://www.maticasrl.it) stiamo utilizzando una macchina Ubuntu Linux come application server. Ho creato diverse instanze di tomcat su questa macchina in modo da poterne fare il restart senza influenzarsi a vicenda.&lt;br /&gt;A questo punto ho utilizzato Apache HTTP come proxy di fronte a queste istanze e mi sono posto il problema di come farne il restart ogni volta che cambiavo il file di configurazione. Inizialmente ho scoperto che dalla finestra che elenca i servizi si poteva fare in questo modo:&lt;br /&gt;&lt;br /&gt; - togliere il segno di spunta accanto al servizio&lt;br /&gt; - chiudere e riaprire la finestra dei servizi&lt;br /&gt; - rimettere il segno di spunta&lt;br /&gt;&lt;br /&gt;Un po' troppo macchinoso! Anche perchè dovevo farlo proprio sulla consolle della macchina. Io volevo qualcosa da linea di comando in modo che lo potevo usare collegandomi con putty&lt;br /&gt;Tempo fa avevo usato xinet.d per avviare CVS, come consigliato sul manuale, ma non ho trovato nessuna configurazione di apache sotto /etc/xinet.d&lt;br /&gt;Ho cercato un po' in giro ma alla fine ho scoperto che nella cartella /etc/init.d ci sono le shell di startup dei servizi. Non ne so ancora molto ma per fare il restart di apache è bastato il seguente comando&lt;br /&gt;&lt;br /&gt;/etc/init.d/apache2 restart&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1562169188554654924-2198378152350260435?l=javidea.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javidea.blogspot.com/feeds/2198378152350260435/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1562169188554654924&amp;postID=2198378152350260435' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1562169188554654924/posts/default/2198378152350260435'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1562169188554654924/posts/default/2198378152350260435'/><link rel='alternate' type='text/html' href='http://javidea.blogspot.com/2008/07/restart-apache.html' title='Restart Apache'/><author><name>Andrea Mattioli</name><uri>http://www.blogger.com/profile/09976397651459021463</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_w-TyhXY6lPs/SwVnMMLkGOI/AAAAAAAAABU/E6GdaNdbZkc/S220/Andrea.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1562169188554654924.post-2582759433658514138</id><published>2008-01-04T19:23:00.000+01:00</published><updated>2008-01-04T21:15:40.585+01:00</updated><title type='text'>Trasloco</title><content type='html'>&lt;div style="text-align: justify;"&gt;No, non ho cambiato casa, ho soltanto cambiato PC.&lt;br /&gt;Stavo sviluppando la mia nuova applicazione con ZK sul notebook aziendale, ma dovendo cambiare azienda l'ho dovuto riconsegnare. Di conseguenza ho dovuto trasferire tutto sul PC fisso che ho a casa. Niente di problematico se non fosse che su quel PC c'è Linux. Ora sta funzionando tutto ma poichè ci ho messo un po' voglio raccontare la mia esperienza.&lt;br /&gt;&lt;br /&gt;Fortunatamente stavo salvando tutto ciò che sviluppavo su un repository Subversion che tenevo in locale sul mio notebook. Dunque la prima cosa che ho fatto è stato un back-up di questo repository. Grazie all'ottimo libro "Pragmatic Version Control using Subversion" è stato facilissimo. Linea di comando e:&lt;br /&gt;&lt;br /&gt;svadmin dump nomedir &gt; dumpfile&lt;br /&gt;&lt;br /&gt;dove nomedir è la directory contenente il repository e dumpfile è il nome del file che conterrà il back-up.&lt;br /&gt;&lt;br /&gt;Poichè sono previdente, quando avevo installato Linux (Ubuntu 7) sul PC avevo scelto di installare anche Subversion, dunque ricostruire il repository è stata una bazzecola. Sempre seguendo "Pragmatic ...", ho aperto una shell e:&lt;br /&gt;&lt;br /&gt;svnadmin create nomedir&lt;br /&gt;svnadmin load nomedir &lt; dumpfile&lt;br /&gt;&lt;br /&gt;dove nomedir, come prima, è il nome della directory che conterrà il repository e dumpfile è il file di back-up.&lt;br /&gt;&lt;br /&gt;Un po' di problemi me li ha dati, invece, Eclipse.&lt;br /&gt;L'installazione dell'ambiente Eclipse in se non è stata complicata, ma i plugin...&lt;br /&gt;Infatti ho la malsana abitudine di riempire Eclipse di numerosi plugin, dunque dovevo ripristinare la situazione sul nuovo PC.&lt;br /&gt;Inizialmente pensavo di procedere manualmente. Sono andato sul notebook, ho aperto Eclipse, Help/Software Updates/Find and install... e poi, scelto "Search for new features ...", è comparso l'elenco dei siti da cui ho scaricato i vari plugin. Ho cominciato a copiarlo su un foglio di carta per poi riportarlo sul nuovo e scaricare così tutti i plugin ma stavo per arrendermi!&lt;br /&gt;Finchè non ho visto il pulsante "Export sites" !&lt;br /&gt;Con questa funzione Eclipse copia tutto su un file xml che poi può essere ricaricato tramite il pulsante gemello "Import sites". Fantastico!&lt;br /&gt;E così anche l'installazione dei vari plugin è stata una passeggiata ... fino a Subversive.&lt;br /&gt;&lt;br /&gt;Subversive è un plugin di Eclipse che permette di sincronizzare i progetti con un repository Subversion. Tra tutti era proprio il plugin fondamentale!&lt;br /&gt;Ma, una volta installato, provo ad aprire la pagina di configurazione del plugin all'interno di Window/Preferences e... noto un bruttissimo errore. Sembra che il plugin non riesca a trovare la libreria JavaHL.&lt;br /&gt;&lt;br /&gt;E adesso cos'è JavaHL?!&lt;br /&gt;&lt;br /&gt;Dopo qualche ricerca su Internet l'ho capito. Per poter accedere ad un qualsiasi repository di un software di configuration management, un'applicazione ha bisogno di una qualche libreria. Al contrario di altri (es. CVS) Subversion possiede un proprio set di librerie che permettono di accedere ad un repository da vari linguaggi di programmazione. JavaHL è appunto la libreria standard per poter accedere ad un repository CVS da un'applicazione Java.&lt;br /&gt;&lt;br /&gt;Ma perchè non la trova?&lt;br /&gt;&lt;br /&gt;Presto detto! Mentre la distribuzione Windows di Subversion include JavaHL già bella e pronta, la distribuzione Linux di Subversion no (immagino per i soliti problemi di licenza, mah?!). Dunque bisognerebbe scaricarsi i sorgenti di Subversion e ricompilarli dicendogli di includere anche JavaHL.&lt;br /&gt;&lt;br /&gt;Fortunatamente il plugin Subversive permette di accedere ai repository anche utilizzando un'altra libreria: SVNKit. Questa viene distribuita direttamente con il plugin perciò si può utilizzare tranquillamente anche se, rispetto a JavaHL, ha qualche limitazione.&lt;br /&gt;La principale limitazione è che non è possibile utilizzare repository locali, quelli a cui si accede tramite un URL del tipo file://.... , ma solamente a repository svn server, quelli a cui si accede tramite un URL  tipo svn://....&lt;br /&gt;Ma anche qui non è stato difficile, sempre grazie a "Pragmatic...".&lt;br /&gt;Basta infatti avviare svn server facendolo puntare alla directory contenente il nostro repository con la seguente istruzione:&lt;br /&gt;&lt;br /&gt;svnserve --daemon --root nomedir&lt;br /&gt;&lt;br /&gt;A questo punto basta far puntare Subversive a svn://localhost per accedere al repository locale.&lt;br /&gt;&lt;br /&gt;Magari quando avrò un po' di tempo proverò anche a compilare JavaHL. Vi prometto un post sull'argomento!&lt;br /&gt;&lt;br /&gt;A presto&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1562169188554654924-2582759433658514138?l=javidea.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javidea.blogspot.com/feeds/2582759433658514138/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1562169188554654924&amp;postID=2582759433658514138' title='2 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1562169188554654924/posts/default/2582759433658514138'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1562169188554654924/posts/default/2582759433658514138'/><link rel='alternate' type='text/html' href='http://javidea.blogspot.com/2008/01/trasloco.html' title='Trasloco'/><author><name>Andrea Mattioli</name><uri>http://www.blogger.com/profile/09976397651459021463</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_w-TyhXY6lPs/SwVnMMLkGOI/AAAAAAAAABU/E6GdaNdbZkc/S220/Andrea.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1562169188554654924.post-308495651586698871</id><published>2007-12-31T14:51:00.000+01:00</published><updated>2007-12-31T16:09:36.641+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Web'/><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='AJAX'/><title type='text'>ZK - Simply Ajax and Mobile</title><content type='html'>&lt;div style="text-align: justify;"&gt;Chi lavora con me sa che già da qualche mese sto provando un framework per l'interfaccia utente chiamato &lt;a href="http://www.zkoss.org"&gt;ZK&lt;/a&gt;.&lt;br /&gt;In mezzo a questa guerra "tutti contro tutti" tra i vari framework per l'interfaccia utente questo post potrebbe essere giudicato poco interessante.&lt;br /&gt;In effetti tra i vari &lt;a href="http://www.sun.com/software/javafx/index.jsp"&gt;JavaFX&lt;/a&gt;, &lt;a href="http://code.google.com/webtoolkit/"&gt;Google Web Toolkit&lt;/a&gt;, &lt;a href="http://www.adobe.com/it/products/flex/"&gt;Flex2&lt;/a&gt;, &lt;a href="http://java.sun.com/javaee/javaserverfaces/"&gt;JSF&lt;/a&gt;, un framework come ZK potrebbe sembrare qualcosa di decisamente minore e destinato a soccombere, ma dopo averlo provato un po' vi giuro che ha delle potenzialità enormi che gli altri che ho provato non hanno.&lt;br /&gt;Cominciamo con il dire che è un tool per lo sviluppo di RIA (Rich Internet Applications) e non di interfacce Web classiche come &lt;a href="http://struts.apache.org/"&gt;Struts&lt;/a&gt; o &lt;a href="http://www.springframework.org/"&gt;Spring MVC&lt;/a&gt;. Dunque già ci poniamo un gradino avanti a numerosi concorrenti. Ma ne rimangono di decisamente agguerriti, come quelli che ho citato prima.&lt;br /&gt;&lt;br /&gt;La cosa principale con cui mi sono scontrato provando gli altri tool per lo sviluppo di RIA è la comunicazione con il server! Di solito ci troviamo di fronte a strumenti che ci mettono a disposizione interfacce di comunicazione di medio livello come un client HTTP oppure meccanismi di comunicazione "trasparenti" per lo più non Object Oriented come la possibilità di invocare metodi statici o di oggetti singleton che si trovano sul server.&lt;br /&gt;Ma per chi, come me, è convinto della bontà di avere un modello Object Oriented questo non è sufficiente. Ci si trova in balia di un modello che vive metà sul client e metà sul server e tenere sincronizzate le due metà è un vero incubo! Cerchiamo di chiarire questo fatto con un esempio.&lt;br /&gt;&lt;br /&gt;Supponiamo di sviluppare un modello ad oggetti di un software bancario. Avremo a che fare con oggetti quali: Cliente, ContoCorrente, ecc. Per incapsulare bene l'apertura di un nuovo conto corrente potremmo mettere nella classe Cliente un metodo apriNuovoConto(), che si preoccuperà di effettuare tutte le operazioni necessarie (che potrebbero anche essere molte e molto complesse). Volendo lavorare correttamente con questo modello dovremmo:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Ricostruire dal database l'oggetto Cliente per il quale si vuole aprire un nuovo conto. Supponiamo per semplicità dell'esempio che la persona sia già cliente della banca&lt;/li&gt;&lt;li&gt;Mostrare questo oggetto sullo schermo&lt;/li&gt;&lt;li&gt;Attendere che l'utente prema il pulsante "Apri Nuovo Conto" (o qualcosa di simile)&lt;/li&gt;&lt;li&gt;Chiamare il metodo apriNuovoConto() dell'oggetto&lt;/li&gt;&lt;/ol&gt;Per fare ciò in un'applicazione RIA dovremmo trasferire l'oggetto Cliente sul client (scusate il gioco di parole). Ma per poter lavorare questo oggetto avrà una serie di altri oggetti come attributi, che a loro volta avranno i loro attributi e così via a formare una rete che potrebbe coinvolgere moltissimi oggetti. Trasferire tutti questi oggetti sul client è impossibile e il prinicpio dell'Information Hiding ci proibisce di sapere quali caricare e quali no.&lt;br /&gt;&lt;br /&gt;Davanti a questa e altre difficoltà si tende a ricadere verso il "solito" modello procedurale in cui ci sono delle funzioni che manipolano dei finti oggetti che in realtà sono solamente dei record. E' facile far viaggiare questi record su e giù tra client e server ma ogni volta che abbiamo bisogno di qualcosa di leggermente diverso dobbiamo ricominciare da capo: un nuovo tipo di oggetto (stupido) e un nuovo insieme di funzioni per manipolare questi nuovi oggetti. Possibile che non ci sia qualcosa che ci permetta di ottenere un software un po' più manutenibile?&lt;br /&gt;&lt;br /&gt;Qui entra in gioco ZK! Non sarà la panacea di tutti i mali ma di certo per certe categorie di applicazioni ci permette di lavorare in maniera completamente Object Oriented senza dover impazzire.&lt;br /&gt;Il modello proposto da ZK è semplice: ogni volta che l'utente effettua un'operazione che genera un evento viene effettuata una chiamata al server, in risposta a questa chiamata il server esegue una porzione di codice (il gestore dell'evento) che può modificare le caratteristiche dell'interfaccia utente (aprire nuove finestre, modificare il contenuto dei campi, ecc.). Al termine il client riceve tutte queste modifiche e ridisegna di conseguenza l'interfaccia utente.&lt;br /&gt;&lt;br /&gt;Nel nostro esempio della banca l'oggetto Cliente non deve essere trasferito sul client. Sarà direttamente il server a tenere questo oggetto ,a chiamarne i metodi e a visualizzarne le informazioni all'interno dei campi dell'interfaccia utente.&lt;br /&gt;&lt;br /&gt;Ovviamente, come dice anche il manuale di ZK, non stiamo sfruttando affatto la potenza di calcolo del client ma quasi esclusivamente quella del server. Per questo ZK non è adatto ad applicazioni estremamente pesanti o con un carico di utenti molto elevato, ma per il tipo di applicazioni che ho sviluppato fino ad oggi (applicazioni aziendali con alcune centinaia di utenti), mi sembra più che adeguato.&lt;br /&gt;In più esiste una versione di ZK per J2ME, sempre con la stessa filosofia. Una Midlet che gira sul cellulare si preoccupa di fare le veci del browser web.&lt;br /&gt;Sto provando a scrivere un'applicazione demo utilizzando ZK. Nei prossimi post vi descriverò l'applicazione e la sua struttura per chiarire meglio i concetti che ho esposto oggi in maniera un po' troppo rapida.&lt;br /&gt;&lt;br /&gt;A presto&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1562169188554654924-308495651586698871?l=javidea.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javidea.blogspot.com/feeds/308495651586698871/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1562169188554654924&amp;postID=308495651586698871' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1562169188554654924/posts/default/308495651586698871'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1562169188554654924/posts/default/308495651586698871'/><link rel='alternate' type='text/html' href='http://javidea.blogspot.com/2007/12/zk-simply-ajax-and-mobile.html' title='ZK - Simply Ajax and Mobile'/><author><name>Andrea Mattioli</name><uri>http://www.blogger.com/profile/09976397651459021463</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_w-TyhXY6lPs/SwVnMMLkGOI/AAAAAAAAABU/E6GdaNdbZkc/S220/Andrea.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1562169188554654924.post-8444887947046642168</id><published>2007-12-28T21:46:00.000+01:00</published><updated>2007-12-28T22:15:39.404+01:00</updated><title type='text'>Benvenuti</title><content type='html'>&lt;div style="text-align: justify;"&gt;Sta per iniziare un nuovo anno, e per me non sarà l'unica novità.&lt;br /&gt;Dopo dieci anni di permanenza in Confor Informatica sto per iniziare una nuova avventura in un'altra azienda.&lt;br /&gt;Così ho deciso di iniziare anche qualcos'altro. Un blog mi è sembrata una buona idea, e poichè sono ormai da anni "Javizzato", ho deciso di chiamarlo JavIdea.&lt;br /&gt;Non vi sorprenderà, allora, che la maggior parte di quello che dirò qui riguarderà questo argomento, anche se spero di fare qualche digressione qua e là su altri temi.&lt;br /&gt;Di blog su Java in giro per la rete ne trovate veramente tanti, e di gente molto più autorevole di me. Allora cosa fare per renderlo un po' originale? Innanzitutto lo scrivo in italiano invece che in inglese! Così le persone che conosco mi seguono meglio. E questo blog è dedicato principalmente a loro: tutti quelli a cui giorno per giorno rompo le scatole. Magari così riesco a ripagarli facendogli un poco di pubblicità. O magari questo blog non lo leggerà mai nessuno e sarà inutile. Però mi piace pensare che servirà a qualcuno oltre me.&lt;br /&gt;Già, perchè ancora non l'ho detto ma voglio usare questo blog anche per me, per ricordarmi di quello che faccio e non lasciarlo esclusivamente alla mia memoria o su qualche riga di commento dentro una classe Java che chissà che fine farà. Già troppe idee le ho perse così, speriamo di cambiare rotta.&lt;br /&gt;Ma adesso basta con le chiacchere. Il prossimo post sarà sicuramente tecnico! Sto provando un sacco di cose in questi giorni e ho voglia di scriverci sopra qualcosa.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;A presto!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1562169188554654924-8444887947046642168?l=javidea.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javidea.blogspot.com/feeds/8444887947046642168/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1562169188554654924&amp;postID=8444887947046642168' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1562169188554654924/posts/default/8444887947046642168'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1562169188554654924/posts/default/8444887947046642168'/><link rel='alternate' type='text/html' href='http://javidea.blogspot.com/2007/12/benvenuti.html' title='Benvenuti'/><author><name>Andrea Mattioli</name><uri>http://www.blogger.com/profile/09976397651459021463</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_w-TyhXY6lPs/SwVnMMLkGOI/AAAAAAAAABU/E6GdaNdbZkc/S220/Andrea.jpg'/></author><thr:total>0</thr:total></entry></feed>
