<?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-4104693577726899381</id><updated>2011-12-08T10:31:16.862+01:00</updated><category term='Random'/><category term='MegaGo'/><category term='File Nascosti'/><category term='Path'/><category term='InputStream'/><category term='AppleScript'/><category term='ArrayList'/><category term='Mysql'/><category term='ActionScript'/><category term='clob'/><category term='String'/><category term='Tutorial'/><category term='Log'/><category term='Finder'/><category term='Awt'/><category term='Ajax'/><category term='SelectBox'/><category term='HTTP'/><category term='Job'/><category term='Swing'/><category term='vettori'/><category term='buzz'/><category term='QueryString'/><category term='Clone'/><category term='Flash'/><category term='File'/><category term='msn'/><category term='Udp'/><category term='Padding'/><category term='MyEclipse'/><category term='GIT'/><category term='MegaVideo'/><category term='Rmi'/><category term='Safari'/><category term='Mac OS X'/><category term='standard error'/><category term='windows'/><category term='Terminal'/><category term='Anchor'/><category term='Multi-window'/><category term='banner'/><category term='POST'/><category term='JVM'/><category term='Running'/><category term='MegaUpload'/><category term='Thread'/><category term='REST'/><category term='Javascript'/><category term='RapidShare'/><category term='Input'/><category term='Tcp'/><category term='pl/sql'/><category term='Comparator'/><category term='varie'/><category term='Java'/><category term='URLConnection'/><category term='ripristino'/><category term='Snow Leopard'/><category term='oracle'/><category term='JDBC'/><category term='Assert'/><category term='standard output'/><category term='Ordinamento'/><category term='DvdPedia'/><category term='Anatomia'/><category term='Browser'/><category term='netsons'/><category term='android'/><category term='Dwr'/><category term='printscreen'/><category term='Mootools'/><category term='Charset'/><category term='Maven'/><category term='Socket'/><category term='Singleton'/><category term='PreparedStatement'/><category term='Eclipse'/><category term='Comparable'/><category term='Php'/><category term='ResultSet'/><category term='Debug'/><category term='GET'/><category term='gmail'/><category term='google'/><title type='text'>All Around the e-World</title><subtitle type='html'>Questo Blog ha come idea di base quella di un mondo OPEN in cui un utente qualsiasi della rete mette a disposizione le proprie esperienze in maniera tale da evitare perdite di tempo altrui.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://franziale.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4104693577726899381/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://franziale.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Alessandro Franzi</name><uri>http://www.blogger.com/profile/08478173128603059576</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_Ds8LLsbVUlc/SNa0YcPXutI/AAAAAAAAAAM/D3DZA5UBU-4/S220/go_with_the_flow_281x211.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>58</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-4104693577726899381.post-8072932713021991800</id><published>2010-12-07T00:41:00.009+01:00</published><updated>2010-12-07T00:58:51.381+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='HTTP'/><category scheme='http://www.blogger.com/atom/ns#' term='URLConnection'/><title type='text'>URLConnection : richiesta http + login</title><content type='html'>E' da tanto tempo che non scrivo un post sul mio blog, trovo l'occasione grazie ad un client che stò sviluppando che permette di eseguire il login su un sito mediante classi standard java.net, anzichè utilizzare librerie note come quella di &lt;a href="http://httpd.apache.org/apreq/"&gt;apache&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;In particolare in questo post vedremo come creare un wrapper per eseguire connessioni tramite l'oggetto &lt;span style="font-style:italic;"&gt;URLConnection&lt;/span&gt;.&lt;br /&gt;Quella che vedremo di seguito è una classe di utilità per la gestione delle richieste http con parametri post e/o invio delle informazioni presenti nei cookies.&lt;br /&gt;&lt;br /&gt;Ecco il codice sorgente della classe : &lt;br /&gt;&lt;pre class="code" name="Java"&gt;package util;&lt;br /&gt;import java.io.BufferedReader;&lt;br /&gt;import java.io.InputStreamReader;&lt;br /&gt;import java.net.URL;&lt;br /&gt;import java.io.OutputStreamWriter;&lt;br /&gt;import java.net.URLConnection;&lt;br /&gt;import java.util.ArrayList;&lt;br /&gt;import java.util.List;&lt;br /&gt;import java.util.Map;&lt;br /&gt;&lt;br /&gt;import util.entity.ResponseWrapper;&lt;br /&gt;&lt;br /&gt;/***&lt;br /&gt; * Classe di utilità per l'utilizzo delle connessioni mediante UrlConnection del package java.net&lt;br /&gt; *&lt;br /&gt; */&lt;br /&gt;public class ConnectionUtils {&lt;br /&gt;&lt;br /&gt; /***&lt;br /&gt;  * Metodo per eseguire una chiamata http.&lt;br /&gt;  * Il metodo richiama un link, passandogli nell'header del pacchetto le informazioni sui parametri&lt;br /&gt;  * e le informazioni sui cookies.&lt;br /&gt;  * Dopo la chiamata http, recupera le informazioni dei cookies ed il contenuto html della risposta&lt;br /&gt;  * e li restituisce in un oggetto modellato per contenere tali informazioni.&lt;br /&gt;  * &lt;br /&gt;  * @param link   : link da chiamare&lt;br /&gt;  * @param params  : parametri post da passare&lt;br /&gt;  * @param cookiesToSend : cookies da inviare nell'header&lt;br /&gt;  * @return&lt;br /&gt;  */&lt;br /&gt; public static ResponseWrapper downloadPagePost(String link, Map&lt;String,String&gt; params,List&lt;String&gt; cookiesToSend) { &lt;br /&gt;&lt;br /&gt;  ResponseWrapper ouputRequest = null;&lt;br /&gt;  try {&lt;br /&gt;   URL url = new URL(link);&lt;br /&gt;   URLConnection conn = url.openConnection();&lt;br /&gt;   // mantiene la connessione anche dopo la richiesta&lt;br /&gt;   conn.setDoOutput(true); &lt;br /&gt;   conn.setRequestProperty("User-Agent","Java1.6 / "+System.getProperty("os.name")+" ("+System.getProperty("os.version")+")");&lt;br /&gt;   conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");&lt;br /&gt;   conn.setRequestProperty("Cookie", CookiesUtils.getMyCookiesString(cookiesToSend));&lt;br /&gt;&lt;br /&gt;   OutputStreamWriter wr = new OutputStreamWriter(conn.getOutputStream());&lt;br /&gt;   String paramsEncoded = RequestUtils.getEncodedParameters(params);&lt;br /&gt;   wr.write(paramsEncoded);&lt;br /&gt;   wr.flush();&lt;br /&gt;&lt;br /&gt;   System.out.println("Call page : "+link);&lt;br /&gt;   String headerName = null;&lt;br /&gt;   List&lt;String&gt; cookiesretrieved = new ArrayList&lt;String&gt;(); &lt;br /&gt;&lt;br /&gt;   for (int i = 1; (headerName = conn.getHeaderFieldKey(i)) != null; i++) {&lt;br /&gt;    //    System.out.println("------------------");&lt;br /&gt;    //    System.out.println("header : "+headerName);&lt;br /&gt;    //    System.out.println("Content : "+conn.getHeaderField(i));&lt;br /&gt;&lt;br /&gt;    if (headerName.equals("Set-Cookie")) {&lt;br /&gt;     String cookie = conn.getHeaderField(i);&lt;br /&gt;     //System.out.println("cookie : "+cookie);&lt;br /&gt;     // Estraggo il cookie corrente e lo metto nella lista per il wrapper&lt;br /&gt;     String currCook = cookie.substring(0, cookie.indexOf(";"));&lt;br /&gt;     cookiesretrieved.add(currCook);&lt;br /&gt;    } //end if&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   StringBuffer output = new StringBuffer();&lt;br /&gt;   BufferedReader rd = new BufferedReader(new InputStreamReader(conn.getInputStream()));&lt;br /&gt;   String line;&lt;br /&gt;   while ((line = rd.readLine()) != null) {&lt;br /&gt;    output.append(line);&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   ouputRequest = new ResponseWrapper(output,cookiesretrieved);&lt;br /&gt;&lt;br /&gt;  } catch (Exception e) {&lt;br /&gt;   e.printStackTrace();&lt;br /&gt;  }&lt;br /&gt;  return ouputRequest;&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;In dipendenza a questa classe è necessario definire la classe ResponseWrapper : &lt;br /&gt;&lt;pre class="code" name="Java"&gt;package util.entity;&lt;br /&gt;&lt;br /&gt;import java.io.FileWriter;&lt;br /&gt;import java.io.IOException;&lt;br /&gt;import java.util.List;&lt;br /&gt;&lt;br /&gt;public class ResponseWrapper {&lt;br /&gt; private List&lt;String&gt; cookies;&lt;br /&gt; private StringBuffer content;&lt;br /&gt; &lt;br /&gt; public ResponseWrapper(StringBuffer acontent,List&lt;String&gt; cookin){&lt;br /&gt;  cookies = cookin;&lt;br /&gt;  content = acontent;&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; public List&lt;String&gt; getCookies() {&lt;br /&gt;  return cookies;&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; public void setCookies(List&lt;String&gt; cookies) {&lt;br /&gt;  this.cookies = cookies;&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; public StringBuffer getContent() {&lt;br /&gt;  return content;&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; public void setContent(StringBuffer content) {&lt;br /&gt;  this.content = content;&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; public boolean writeToFile(String fileName){&lt;br /&gt;  FileWriter out;&lt;br /&gt;  try {&lt;br /&gt;   out = new FileWriter(fileName);&lt;br /&gt;   out.write(getContent().toString());&lt;br /&gt;   out.close();&lt;br /&gt;  } catch (IOException e) {&lt;br /&gt;   return false;&lt;br /&gt;  }&lt;br /&gt;  &lt;br /&gt;  return true;&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Questa classe è ha il compito di incapsulare le informazioni recuperate mediante la richiesta http, in particolare l'html contenuto e la lista di cookies generati dal sito.&lt;br /&gt;&lt;br /&gt;Definiamo adesso un metodo per eseguire il login a cui passiamo username, password e cookies generati dal sito&lt;br /&gt;&lt;br /&gt;&lt;pre class="code" name="Java"&gt; public static boolean login(String username, String password,List&lt;String&gt; cookies){&lt;br /&gt;  Map&lt;String,String&gt; parametri = new HashMap&lt;String,String&gt;();&lt;br /&gt;  parametri.put("username",username);&lt;br /&gt;  parametri.put("password",password);&lt;br /&gt;  parametri.put("otherParam","param");&lt;br /&gt;  &lt;br /&gt;  ResponseWrapper responseLogin = ConnectionUtils.downloadPagePost("mysite.org/login.php", parametri,cookies);&lt;br /&gt;  &lt;br /&gt;  boolean loggedin = true ;// Here we can check login&lt;br /&gt;  &lt;br /&gt;                // write html content to a file named checklogin.html&lt;br /&gt;  responseLogin.writeToFile("checklogin.html");&lt;br /&gt;  &lt;br /&gt;  return loggedin;&lt;br /&gt; }&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Come utilizzare questo metodo ? Semplice : &lt;br /&gt;&lt;pre class="code" name="Java"&gt;List&lt;String&gt; cookies = new ArrayList&lt;String&gt;();&lt;br /&gt;cookies.add("PHPSESSID=asd5nkl4nmnskdfjsidd=");  &lt;br /&gt;MySampleLogin.login("myUsr","myPasw",cookies);&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Spero che la classe vi possa rendere le cose più semplici.&lt;br /&gt;Alla prossima!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4104693577726899381-8072932713021991800?l=franziale.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://franziale.blogspot.com/feeds/8072932713021991800/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4104693577726899381&amp;postID=8072932713021991800' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4104693577726899381/posts/default/8072932713021991800'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4104693577726899381/posts/default/8072932713021991800'/><link rel='alternate' type='text/html' href='http://franziale.blogspot.com/2010/12/urlconnection-richiesta-http.html' title='URLConnection : richiesta http + login'/><author><name>Alessandro Franzi</name><uri>http://www.blogger.com/profile/08478173128603059576</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_Ds8LLsbVUlc/SNa0YcPXutI/AAAAAAAAAAM/D3DZA5UBU-4/S220/go_with_the_flow_281x211.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4104693577726899381.post-1094589222341696169</id><published>2010-05-10T22:27:00.005+02:00</published><updated>2010-05-10T22:35:55.864+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Javascript'/><category scheme='http://www.blogger.com/atom/ns#' term='Mootools'/><category scheme='http://www.blogger.com/atom/ns#' term='Browser'/><title type='text'>Browser.Engine : distinguere i Browser con mootools</title><content type='html'>I mootools tra la miriade di funzionalità, ci permette di individuare la versione del browser mediante la classe &lt;a href="http://mootools.net/docs/core/Core/Browser"&gt;Browser&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Un classico esempio di distinzione tra i browser possiamo vederla nel seguente esempio.&lt;br /&gt;&lt;span id="fullpost"&gt;&lt;br /&gt;&lt;pre class="code" name="Java"&gt;&lt;br /&gt;var BE = Browser.Engine;  &lt;br /&gt;if (!this.BE.webkit &amp;&amp; !this.BE.gecko &amp;&amp; !this.BE.trident){&lt;br /&gt;  // firefox 3.6 bug&lt;br /&gt;  BE = Browser.Engines;&lt;br /&gt;}&lt;br /&gt;if (BE.webkit) {&lt;br /&gt;   alert ("webkit : Safari, Google Chrome, Konqueror";&lt;br /&gt;}&lt;br /&gt;if (BE.gecko) {&lt;br /&gt;   alert ("gecko : Firefox, or any Mozilla Browser";&lt;br /&gt;}&lt;br /&gt;if (BE.trident) {&lt;br /&gt;   alert ("trident : Internet Explorer";&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Come potete vedere nell'esempio nel caso in cui si tratti di firefox 3.6, visto che l'oggetto Broser.Engine.gecko non è definito (undefined), è stato fixato con un workaround, utilizzando l'oggetto Browser.Engines.gecko per intercettare il browser.&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/4104693577726899381-1094589222341696169?l=franziale.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://franziale.blogspot.com/feeds/1094589222341696169/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4104693577726899381&amp;postID=1094589222341696169' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4104693577726899381/posts/default/1094589222341696169'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4104693577726899381/posts/default/1094589222341696169'/><link rel='alternate' type='text/html' href='http://franziale.blogspot.com/2010/05/browserengine-distinguere-i-browser-con.html' title='Browser.Engine : distinguere i Browser con mootools'/><author><name>Alessandro Franzi</name><uri>http://www.blogger.com/profile/08478173128603059576</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_Ds8LLsbVUlc/SNa0YcPXutI/AAAAAAAAAAM/D3DZA5UBU-4/S220/go_with_the_flow_281x211.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4104693577726899381.post-5065603625315270278</id><published>2010-03-17T09:58:00.003+01:00</published><updated>2010-03-17T10:08:36.998+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='msn'/><category scheme='http://www.blogger.com/atom/ns#' term='windows'/><title type='text'>Risolvere il problema 80048051 di msn</title><content type='html'>Tra tutti gli errori derivanti dall'utilizzo di un OS Windows, ve ne segnalo uno in cui mi imbatto diverse volte a lavoro, specialmente quando interrompo la connessione di rete del mio pc e lo metto in standBy.&lt;br /&gt;Nel momento in cui tento di riconnettermi a MSN ottengo un magnifico errore 80048051. &lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_Ds8LLsbVUlc/S6Ca2-Fxo6I/AAAAAAAAAHc/REVB3rg-c6k/s1600-h/err_msn_7_5.JPG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 220px;" src="http://3.bp.blogspot.com/_Ds8LLsbVUlc/S6Ca2-Fxo6I/AAAAAAAAAHc/REVB3rg-c6k/s400/err_msn_7_5.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5449525818289136546" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Per poterlo risolvere non è necessario come al solito chiudere e riaprire il programma, ma è necessario eseguire i seguenti passi : &lt;br /&gt;&lt;br /&gt;- Aprire il broswer;&lt;br /&gt;- Selezionare il menù "file", posto in alto a sinistra e vi si aprirà un ulteriore menù;&lt;br /&gt;- Togliere la spunta (ovvero la v), dalla modalità "non in linea".&lt;br /&gt;&lt;br /&gt;Alla prossima!!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4104693577726899381-5065603625315270278?l=franziale.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://franziale.blogspot.com/feeds/5065603625315270278/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4104693577726899381&amp;postID=5065603625315270278' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4104693577726899381/posts/default/5065603625315270278'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4104693577726899381/posts/default/5065603625315270278'/><link rel='alternate' type='text/html' href='http://franziale.blogspot.com/2010/03/risolvere-il-problema-80048051-di-msn.html' title='Risolvere il problema 80048051 di msn'/><author><name>Alessandro Franzi</name><uri>http://www.blogger.com/profile/08478173128603059576</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_Ds8LLsbVUlc/SNa0YcPXutI/AAAAAAAAAAM/D3DZA5UBU-4/S220/go_with_the_flow_281x211.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_Ds8LLsbVUlc/S6Ca2-Fxo6I/AAAAAAAAAHc/REVB3rg-c6k/s72-c/err_msn_7_5.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4104693577726899381.post-2898510627521448752</id><published>2010-02-26T13:01:00.012+01:00</published><updated>2010-02-26T14:08:19.744+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Ordinamento'/><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='File'/><title type='text'>FileUtils : funzionalità aggiuntive per la gestione dei files in Java</title><content type='html'>Tramite questo post metto a disposizione l'implementazione di una classe di utilità che implementa alcune funzionalità per la gestione dei Files in Java.&lt;br /&gt;&lt;br /&gt;In dettagli le funzionalità implementate sono le seguenti : &lt;br /&gt;&lt;br /&gt;- Cancellare i files più vecchi di un certo numero di giorni da una cartella&lt;br /&gt;- Creare una cartella nel caso in cui non esista&lt;br /&gt;- Recuperare l'elenco dei files da una cartella ordinandoli per data crescente / decrescente.&lt;br /&gt;&lt;br /&gt;Il codice qui di seguito : &lt;br /&gt;&lt;pre name="code" class="Java"&gt;package it.fritzzz.utils;&lt;br /&gt;&lt;br /&gt;import java.io.File;&lt;br /&gt;import java.io.IOException;&lt;br /&gt;import java.util.Arrays;&lt;br /&gt;import java.util.Calendar;&lt;br /&gt;import java.util.Collections;&lt;br /&gt;import java.util.Comparator;&lt;br /&gt;import java.util.List;&lt;br /&gt;&lt;br /&gt;/***&lt;br /&gt; * Classe di utilità per la gestione dei files&lt;br /&gt; * @author a.franzi&lt;br /&gt; *&lt;br /&gt; */&lt;br /&gt;public class FileUtils {&lt;br /&gt; &lt;br /&gt; /***&lt;br /&gt;  * Ordina e restituisce i files per data di ultima modifica&lt;br /&gt;  * @param directory : directory su cui eseguire il list del files&lt;br /&gt;  * @param asc  : boolean (true = dal più lontano al più recente ; false = il contrario)&lt;br /&gt;  * @return   : List di nomi files&lt;br /&gt;  */&lt;br /&gt; public static List listFilesOfDirOrderByLastModifiedDate(final File directory,boolean asc){&lt;br /&gt;  if (directory!=null &amp;&amp; directory.isDirectory()) {&lt;br /&gt;   String[] children = directory.list();&lt;br /&gt;   if (children!=null &amp;&amp; children.length&amp;gt;0){&lt;br /&gt;    List childList = Arrays.asList(children);&lt;br /&gt;    Collections.sort(childList,new Comparator() {&lt;br /&gt;     &lt;br /&gt;     public int compare(Object o1, Object o2) {&lt;br /&gt;      if (o1 !=null &amp;&amp; o2 !=null){&lt;br /&gt;       File file1 = new File(directory, (String)o1);&lt;br /&gt;       File file2 = new File(directory, (String)o2);&lt;br /&gt;       &lt;br /&gt;       if (file1.lastModified()==file2.lastModified()){&lt;br /&gt;        return 0;&lt;br /&gt;       }else if (file1.lastModified()&amp;gt;file2.lastModified()){&lt;br /&gt;        return 1;&lt;br /&gt;       }else if (file1.lastModified()&amp;lt;file2.lastModified()){&lt;br /&gt;        return -1;&lt;br /&gt;       }&lt;br /&gt;      }&lt;br /&gt;      return 0;&lt;br /&gt;     }&lt;br /&gt;    });&lt;br /&gt;    return childList;&lt;br /&gt;   }&lt;br /&gt;  }&lt;br /&gt;  return null;&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt;&lt;br /&gt; /***&lt;br /&gt;  * Metodo per rimuovere i files troppo vecchi da una determinata cartella&lt;br /&gt;  * @param folderName : nome della cartella&lt;br /&gt;  * @param numberOfDays : numero di giorni di tolleranza&lt;br /&gt;  * @return    : boolean true se tutto è andato a buon fine&lt;br /&gt;  */&lt;br /&gt; public static boolean removeTooOldFilesFromDir(String folderName, int numberOfDays){&lt;br /&gt;  boolean ok = true;&lt;br /&gt;  &lt;br /&gt;  try{&lt;br /&gt;   File dir = new File(folderName);&lt;br /&gt;      &lt;br /&gt;   if (dir.isDirectory()){&lt;br /&gt;    File[] filesIntoDir = dir.listFiles();&lt;br /&gt;    if (filesIntoDir!=null &amp;&amp; filesIntoDir.length&amp;gt; 0){&lt;br /&gt;     for (int i = 0 ; i &amp;lt; filesIntoDir.length; i++){&lt;br /&gt;      if (filesIntoDir[i].isFile()){&lt;br /&gt;       long lastUpdateOfFile = filesIntoDir[i].lastModified();&lt;br /&gt;       Calendar cal = Calendar.getInstance();&lt;br /&gt;       cal.setTimeInMillis(lastUpdateOfFile);&lt;br /&gt;       Calendar today = Calendar.getInstance();&lt;br /&gt;       today.add(Calendar.DAY_OF_YEAR, -numberOfDays);&lt;br /&gt;       if (cal.before(today)){&lt;br /&gt;        boolean currDelete = filesIntoDir[i].delete();&lt;br /&gt;        if (!currDelete){&lt;br /&gt;         System.out.println("Problem removing too old file : "+filesIntoDir[i].getAbsolutePath());&lt;br /&gt;         ok = false;&lt;br /&gt;        }else{&lt;br /&gt;         System.out.println("Removed too old file : "+filesIntoDir[i].getAbsolutePath());&lt;br /&gt;        }&lt;br /&gt;       }&lt;br /&gt;      }&lt;br /&gt;     }&lt;br /&gt;    }else{&lt;br /&gt;     throw new IOException("nessun file presente nella cartella : "+folderName);&lt;br /&gt;    }&lt;br /&gt;    &lt;br /&gt;   }else{&lt;br /&gt;    throw new IOException("il path : "+folderName+" non è una directory");&lt;br /&gt;   }&lt;br /&gt;  }catch(IOException ex){&lt;br /&gt;   System.out.println("Eccezione : "+ex.getMessage());&lt;br /&gt;   ok = false;&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;  return ok;&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; /***&lt;br /&gt;  * Metodo per creare una cartella nel caso non esiste gia'&lt;br /&gt;  * @param path : path&lt;br /&gt;  * @return  : boolean&lt;br /&gt;  */&lt;br /&gt; public static boolean createFolderIfNotExits(String path){&lt;br /&gt;  File folder = new File(path);&lt;br /&gt;  if (!folder.exists()){&lt;br /&gt;   return folder.mkdirs();&lt;br /&gt;  }else{&lt;br /&gt;   System.out.println("la cartella : "+path+" esiste gia'");   &lt;br /&gt;  }&lt;br /&gt;  return false;&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4104693577726899381-2898510627521448752?l=franziale.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://franziale.blogspot.com/feeds/2898510627521448752/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4104693577726899381&amp;postID=2898510627521448752' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4104693577726899381/posts/default/2898510627521448752'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4104693577726899381/posts/default/2898510627521448752'/><link rel='alternate' type='text/html' href='http://franziale.blogspot.com/2010/02/fileutils-funzionalita-aggiuntive-per.html' title='FileUtils : funzionalità aggiuntive per la gestione dei files in Java'/><author><name>Alessandro Franzi</name><uri>http://www.blogger.com/profile/08478173128603059576</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_Ds8LLsbVUlc/SNa0YcPXutI/AAAAAAAAAAM/D3DZA5UBU-4/S220/go_with_the_flow_281x211.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4104693577726899381.post-3081640958621731045</id><published>2010-02-22T10:54:00.004+01:00</published><updated>2010-02-22T11:10:45.541+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Job'/><category scheme='http://www.blogger.com/atom/ns#' term='Running'/><category scheme='http://www.blogger.com/atom/ns#' term='oracle'/><title type='text'>ORACLE : Visualizzare lista di job in esecuzione</title><content type='html'>Per poter visualizzare l'elenco dei job in esecuzione la query da eseguire è la seguente : &lt;br /&gt;&lt;pre name="code" class="Java"&gt;SELECT r.sid,r.job,r.this_date,r.this_sec,SUBSTR(what,1,40),total_time&lt;br /&gt;FROM dba_jobs_running r,dba_jobs j&lt;br /&gt;WHERE r.job = j.job&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4104693577726899381-3081640958621731045?l=franziale.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://franziale.blogspot.com/feeds/3081640958621731045/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4104693577726899381&amp;postID=3081640958621731045' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4104693577726899381/posts/default/3081640958621731045'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4104693577726899381/posts/default/3081640958621731045'/><link rel='alternate' type='text/html' href='http://franziale.blogspot.com/2010/02/oracle-visualizzare-lista-di-job.html' title='ORACLE : Visualizzare lista di job in esecuzione'/><author><name>Alessandro Franzi</name><uri>http://www.blogger.com/profile/08478173128603059576</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_Ds8LLsbVUlc/SNa0YcPXutI/AAAAAAAAAAM/D3DZA5UBU-4/S220/go_with_the_flow_281x211.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4104693577726899381.post-8949935869856716978</id><published>2010-02-19T11:17:00.005+01:00</published><updated>2010-02-19T11:40:10.774+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='windows'/><category scheme='http://www.blogger.com/atom/ns#' term='standard output'/><category scheme='http://www.blogger.com/atom/ns#' term='Log'/><category scheme='http://www.blogger.com/atom/ns#' term='standard error'/><title type='text'>Eseguire il redirect degli output di un batch in un file di log su Windows</title><content type='html'>Qualche semplice suggerimento per eseguire il redirect degli output dell'esecuzione di un file batch su windows.&lt;br /&gt;&lt;br /&gt;E' necessario sapere che ci sono 2 livelli di output in maniera analoga ai sistemi Linux/Unix, il primo livello è lo STANDARD OUTPUT mentre il secondo livello è lo STANDARD ERROR.&lt;br /&gt;Per cui le applicazioni ridirezionano gli output su questi 2 livelli a seconda delle esigenze.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Come è possibile salvare gli output dell'esecuzione di un batch?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Per poter eseguire delle prove creare con &lt;span style="font-style:italic;"&gt;blocco note&lt;/span&gt; un nuovo di nome "&lt;span style="font-style:italic;"&gt;test.bat&lt;/span&gt;" e copiare al suo interno i seguenti comandi :&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="Java"&gt;&lt;br /&gt;@ECHO OFF&lt;br /&gt;ECHO This text goes to Standard Output&lt;br /&gt;ECHO This text goes to Standard Error 1&gt;&amp;2&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Eseguendo il file "&lt;span style="font-style:italic;"&gt;test.bat&lt;/span&gt;" da riga di comando (Start-&gt;Esegui..-&gt;cmd) otterremo il seguente risultato : &lt;br /&gt;&lt;br /&gt;&lt;pre&gt;C:\&gt;test.bat&lt;br /&gt;This text goes to Standard Output&lt;br /&gt;This text goes to Standard Error&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;REDIRECT DEGLI STANDARD OUTPUT SU FILE DI LOG&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Eseguendo il comando "&lt;span style="font-style:italic;"&gt;test.bat &gt; logFile.log&lt;/span&gt;" otterremo il seguente risultato : &lt;br /&gt;&lt;pre&gt;C:\&gt;test.bat &gt; logFile.log&lt;br /&gt;This text goes to Standard Error&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;nel file di log &lt;span style="font-style:italic;"&gt;logFile.log&lt;/span&gt; il contenuto sarà il seguente : &lt;br /&gt;&lt;pre&gt;This text goes to Standard Output&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;REDIRECT DEGLI STANDARD ERORR SU FILE DI LOG&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Eseguendo il comando "&lt;span style="font-style:italic;"&gt;test.bat 2&gt; logFile.log&lt;/span&gt;" otterremo il seguente risultato : &lt;br /&gt;&lt;pre&gt;C:\&gt;test.bat 2&gt; logFile.log&lt;br /&gt;This text goes to Standard Output&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;nel file di log &lt;span style="font-style:italic;"&gt;logFile.log&lt;/span&gt; il contenuto sarà il seguente : &lt;br /&gt;&lt;pre&gt;This text goes to Standard Error&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;REDIRECT DI TUTTI GLI OUTPUT SU UN UNICO FILE DI LOG&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Eseguendo il comando "&lt;span style="font-style:italic;"&gt;test.bat &gt; logFile.log 2&gt;&amp;1&lt;/span&gt;" otterremo il seguente risultato : &lt;br /&gt;&lt;pre&gt;C:\&gt;test.bat &gt; logFile.log 2&gt;&amp;1&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;nel file di log &lt;span style="font-style:italic;"&gt;logFile.log&lt;/span&gt; il contenuto sarà il seguente : &lt;br /&gt;&lt;pre&gt;This text goes to Standard Output&lt;br /&gt;This text goes to Standard Error&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;N.B : è possibile loggare separatamente errori e output su 2 files differenti con il comando "&lt;span style="font-style:italic;"&gt;test.bat &gt; logFile.log 2&gt; logFile.2.log&lt;/span&gt;"&lt;br /&gt;&lt;br /&gt;E' possibile anche evitare che errori o output non siano visualizzati nè loggati. Nel seguente esempio verranno visualizzati solo gli errori tramite il comando "&lt;span style="font-style:italic;"&gt;test.bat &gt; NUL&lt;/span&gt;"&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;C:\&gt;test.bat &gt; NUL&lt;br /&gt;This text goes to Standard Error&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4104693577726899381-8949935869856716978?l=franziale.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://franziale.blogspot.com/feeds/8949935869856716978/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4104693577726899381&amp;postID=8949935869856716978' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4104693577726899381/posts/default/8949935869856716978'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4104693577726899381/posts/default/8949935869856716978'/><link rel='alternate' type='text/html' href='http://franziale.blogspot.com/2010/02/eseguire-il-redirect-degli-output-di-un.html' title='Eseguire il redirect degli output di un batch in un file di log su Windows'/><author><name>Alessandro Franzi</name><uri>http://www.blogger.com/profile/08478173128603059576</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_Ds8LLsbVUlc/SNa0YcPXutI/AAAAAAAAAAM/D3DZA5UBU-4/S220/go_with_the_flow_281x211.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4104693577726899381.post-4687661447698091661</id><published>2010-02-14T15:15:00.016+01:00</published><updated>2010-02-16T21:47:49.601+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='Mysql'/><category scheme='http://www.blogger.com/atom/ns#' term='JDBC'/><title type='text'>Usare JDBC per connettersi a Mysql da Java</title><content type='html'>&lt;span style="font-weight:bold;"&gt;Introduzione&lt;/span&gt;&lt;br /&gt;Lo scopo di questo tutorial è quello di eseguire i seguenti passi : &lt;br /&gt;- Scaricare e installare un database MySQL&lt;br /&gt;- Preparare il database per essere usato tramite i JDBC&lt;br /&gt;- Scrivere e testare la nostra prima applicazione che usa i JDBC&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Che cosa è JDBC ?&lt;/span&gt;&lt;br /&gt;&lt;a href="http://it.wikipedia.org/wiki/JDBC"&gt;JDBC&lt;/a&gt; (Java DataBase Connectivity), è un connettore per database che consente l'accesso alle basi di dati da qualsiasi programma scritto con il linguaggio di programmazione Java, indipendentemente dal tipo di DBMS utilizzato. È costituita da una API, raggruppata nel package java.sql, che serve ai client per connettersi a un database. Fornisce metodi per interrogare e modificare i dati. È orientata ai database relazionali ed è Object Oriented. La piattaforma Java 2 Standard Edition contiene le API JDBC, insieme all'implementazione di un bridge JDBC-ODBC, che permette di connettersi a database relazionali che supportino ODBC. Questo driver è in codice nativo e non in Java.&lt;br /&gt;&lt;br /&gt;Per poter utilizzare MySQL dalle vostre applicazioni Java è necessario scaricare il Connector/J dal seguente &lt;a href="http://www.mysql.com/downloads/"&gt;link&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Cosa è MySQL ?&lt;/span&gt;&lt;br /&gt;&lt;a href="http://it.wikipedia.org/wiki/Mysql"&gt;MySQL&lt;/a&gt; è un Relational database management system (RDBMS), composto da un client con interfaccia a caratteri e un server, entrambi disponibili sia per sistemi Unix come GNU/Linux che per Windows, anche se prevale un suo utilizzo in ambito Unix.&lt;br /&gt;Dal 1996 supporta la maggior parte della sintassi SQL e si prevede in futuro il pieno rispetto dello standard ANSI. Possiede delle interfacce per diversi linguaggi, compreso un driver ODBC, due driver Java e un driver per Mono e .NET.&lt;br /&gt;&lt;br /&gt;Per poter installare MySQL è necessario scaricare il pacchetto adatto al vostro Sistema Operativo dal seguente &lt;a href="http://www.mysql.com/downloads/"&gt;link&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Adesso abbiamo tutto il necessario per poter utilizzare MySQL all' interno della nostra applicazione java.&lt;br /&gt;&lt;span id="fullpost"&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;CONFIGURARE TOMCAT e MYSQL per il recupero della connessione&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Prima di procedere, è necessario copiare il Driver JDBC (Connector) nella cartella : &lt;span style="font-style:italic;"&gt;$CATALINA_HOME/lib.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;In secondo luogo nel caso si tratti di un applicazione WEB è possibile definire un datasource nel file di configurazione del server &lt;span style="font-style:italic;"&gt;context.xml&lt;/span&gt;:&lt;br /&gt;&lt;pre name="code" class="Java"&gt;&amp;lt;Resource name=&amp;quot;jdbc/TestDB&amp;quot; auth=&amp;quot;Container&amp;quot; type=&amp;quot;javax.sql.DataSource&amp;quot;&lt;br /&gt;maxActive=&amp;quot;100&amp;quot; maxIdle=&amp;quot;30&amp;quot; maxWait=&amp;quot;10000&amp;quot;&lt;br /&gt;username=&amp;quot;javauser&amp;quot; password=&amp;quot;javadude&amp;quot; driverClassName=&amp;quot;com.mysql.jdbc.Driver&amp;quot;&lt;br /&gt;url=&amp;quot;jdbc:mysql://localhost:3306/javatest?autoReconnect=true&amp;quot;/&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Adesso tramite l'applicazione ed in particolare con il seguente pezzo di codice sarà possibile recuperare una connessione : &lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="Java"&gt;/***&lt;br /&gt; * Classe di utilità per gestione connessioni&lt;br /&gt; * @author alessandrofranzi&lt;br /&gt; *&lt;br /&gt; */&lt;br /&gt;public class DBAccess {&lt;br /&gt; private static Logger logger = Logger.getRootLogger();&lt;br /&gt; &lt;br /&gt; public DBAccess() {&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; /***&lt;br /&gt;  * Recupera la connessione&lt;br /&gt;  * @return : connessione&lt;br /&gt;  * @throws DatabaseException : eccezione personalizzata&lt;br /&gt;  */&lt;br /&gt; public static Connection getConnection() throws DatabaseException{&lt;br /&gt;  try {&lt;br /&gt;    InitialContext ic = new InitialContext();&lt;br /&gt;    DataSource ds = (DataSource) ic.lookup("java:comp/env/jdbc/TestDB");&lt;br /&gt;    return ds.getConnection();&lt;br /&gt;  } catch (NamingException e){&lt;br /&gt;   System.out.println("Eccezione : "+e.getMessage());&lt;br /&gt;  } catch (SQLException e){&lt;br /&gt;   System.out.println("Eccezione : "+e.getMessage());&lt;br /&gt;  } catch (Exception e){&lt;br /&gt;   System.out.println("Eccezione : "+e.getMessage());&lt;br /&gt;  }&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&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/4104693577726899381-4687661447698091661?l=franziale.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://franziale.blogspot.com/feeds/4687661447698091661/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4104693577726899381&amp;postID=4687661447698091661' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4104693577726899381/posts/default/4687661447698091661'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4104693577726899381/posts/default/4687661447698091661'/><link rel='alternate' type='text/html' href='http://franziale.blogspot.com/2010/02/usare-jdbc-per-connettersi-mysql-da.html' title='Usare JDBC per connettersi a Mysql da Java'/><author><name>Alessandro Franzi</name><uri>http://www.blogger.com/profile/08478173128603059576</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_Ds8LLsbVUlc/SNa0YcPXutI/AAAAAAAAAAM/D3DZA5UBU-4/S220/go_with_the_flow_281x211.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4104693577726899381.post-430013445213169667</id><published>2010-02-11T13:27:00.015+01:00</published><updated>2010-02-11T14:40:18.534+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='buzz'/><category scheme='http://www.blogger.com/atom/ns#' term='gmail'/><category scheme='http://www.blogger.com/atom/ns#' term='google'/><title type='text'>Eliminare le notifiche Buzz dalle mail di Gmail</title><content type='html'>Nel caso in cui non abbiate abbastanza tempo/voglia/banda per gestire la miriade di notifiche che vi arrivano da qualsiasi social network e vi siete spaventati dal numero di notifiche ricevute a causa del nuovo &lt;a href="http://www.google.com/buzz?hl=it"&gt;Buzz&lt;/a&gt; non preoccupatepi, è semplice non visualizzare le notifiche nella vostra "inbox".&lt;br /&gt;&lt;br /&gt;Ciascuna notifica di Buzz automaticamente soddisfa la query label:buzz, per cui è necessario solamente settare un quick filter per mantenere queste notifiche fuori dalla inbox. &lt;br /&gt;&lt;br /&gt;&lt;span id="fullpost"&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Filtrare le notifiche Buzz dalla inbox&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;1. Cliccare sul pulsante "Create a Filter", accanto alla search box&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_Ds8LLsbVUlc/S3QBOS9UimI/AAAAAAAAAG4/UwWFlqsPQ0U/s1600-h/1Buzz.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 93px;" src="http://4.bp.blogspot.com/_Ds8LLsbVUlc/S3QBOS9UimI/AAAAAAAAAG4/UwWFlqsPQ0U/s400/1Buzz.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5436971995261864546" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;2. Quindi, nella casella di testo "Has the word" nella finestra dei criteri inserire la stringa "label:buzz". Si può anche testare la ricerca per essere sicuri che vengano matchate le giuste mail. &lt;br /&gt;Cliccare il pulsante "Next";&lt;br /&gt;A questo punto si aprirà una finestra di avviso, cliccate su OK.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_Ds8LLsbVUlc/S3QBWZVneVI/AAAAAAAAAHA/Qo8ZGkOYqSg/s1600-h/2buzz.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 88px;" src="http://3.bp.blogspot.com/_Ds8LLsbVUlc/S3QBWZVneVI/AAAAAAAAAHA/Qo8ZGkOYqSg/s400/2buzz.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5436972134413334866" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;3. Infine, selezionare la checkbox corrispondente a "Skip the Inbox" e quindi clicca sul pulsante "Create Filter".&lt;br /&gt;E' possibile opzionalmente aggiungere una label alle notifiche in maniera tale da raggruppare le notifiche in un altra cartella.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_Ds8LLsbVUlc/S3QBdZ7g8nI/AAAAAAAAAHI/OlsRHb9fDmA/s1600-h/3buzz.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 110px;" src="http://4.bp.blogspot.com/_Ds8LLsbVUlc/S3QBdZ7g8nI/AAAAAAAAAHI/OlsRHb9fDmA/s400/3buzz.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5436972254831374962" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Disabilitare Buzz completamente&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Altrimenti (anche se lo dico con rammarico, essendo un sostenitore delle GoogleApps), è possibile disattivare completamente Buzz mediante il link nella parte basse della finestra di Gmail : &lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_Ds8LLsbVUlc/S3QIudNjlWI/AAAAAAAAAHQ/Y9GIgbC5wno/s1600-h/4buzz.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 70px;" src="http://3.bp.blogspot.com/_Ds8LLsbVUlc/S3QIudNjlWI/AAAAAAAAAHQ/Y9GIgbC5wno/s400/4buzz.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5436980244351522146" /&gt;&lt;/a&gt;&lt;br /&gt;&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/4104693577726899381-430013445213169667?l=franziale.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://franziale.blogspot.com/feeds/430013445213169667/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4104693577726899381&amp;postID=430013445213169667' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4104693577726899381/posts/default/430013445213169667'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4104693577726899381/posts/default/430013445213169667'/><link rel='alternate' type='text/html' href='http://franziale.blogspot.com/2010/02/eliminare-le-notifiche-buzz-dalle-mail.html' title='Eliminare le notifiche Buzz dalle mail di Gmail'/><author><name>Alessandro Franzi</name><uri>http://www.blogger.com/profile/08478173128603059576</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_Ds8LLsbVUlc/SNa0YcPXutI/AAAAAAAAAAM/D3DZA5UBU-4/S220/go_with_the_flow_281x211.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_Ds8LLsbVUlc/S3QBOS9UimI/AAAAAAAAAG4/UwWFlqsPQ0U/s72-c/1Buzz.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4104693577726899381.post-2426119633100265907</id><published>2010-02-08T22:26:00.001+01:00</published><updated>2010-02-10T21:03:57.579+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Snow Leopard'/><category scheme='http://www.blogger.com/atom/ns#' term='AppleScript'/><category scheme='http://www.blogger.com/atom/ns#' term='Path'/><category scheme='http://www.blogger.com/atom/ns#' term='Mac OS X'/><title type='text'>Copiare il path di un file su Mac Os X Snow Leopard tramite il finder</title><content type='html'>Precedentemente su questo Blog (&lt;a href="http://franziale.blogspot.com/2009/02/mostrare-il-percorso-di-uno-o-piu-files.html"&gt;link&lt;/a&gt;) avevo pubblicato un post per aggiungere funzionalità al finder di &lt;span style="font-style:italic;"&gt;Mac Os X Leopard&lt;/span&gt; mediante automator.&lt;br /&gt;In particolare era stato implementato uno script &lt;span style="font-weight:bold;"&gt;Applescript&lt;/span&gt; mediante il cui era possibile aprire nella finestra contestuale dal Finder un menu per poter recuperare il path di uno o più files.&lt;br /&gt;&lt;br /&gt;Mi è stato fatto notare che ci sono stati dei cambiamenti in Snow Leopard per cui ho adattato lo script al nuovo sistema operativo.&lt;br /&gt;&lt;br /&gt;Ho deciso quindi di implementare una nuova versione dello script. Anzi 2 nuove versioni da usare in 2 modalità alternative.&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;METODO 1 - MENU CONTESTUALE NEL FINDER&lt;/span&gt;&lt;br /&gt;I passi da eseguire sono pochi e semplici, cercherò di rendere la cosa il meno possibile complessa con l'ausilio di opportune immagini.&lt;br /&gt;&lt;br /&gt;1. Aprire l'applicazione &lt;span style="font-weight:bold;"&gt;AUTOMATOR&lt;/span&gt; (applicazione davvero utile, potete trovare maggiori informazioni al &lt;a href="http://it.wikipedia.org/wiki/Automator"&gt;link&lt;/a&gt;) e selezionare come tipo di progetto "&lt;span style="font-style:italic;"&gt;Servizio&lt;/span&gt;".&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_Ds8LLsbVUlc/S3CKjDX9caI/AAAAAAAAAEg/ADyMyZGH2FE/s1600-h/Schermata+2010-02-08+a+22.34.51.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 297px;" src="http://4.bp.blogspot.com/_Ds8LLsbVUlc/S3CKjDX9caI/AAAAAAAAAEg/ADyMyZGH2FE/s320/Schermata+2010-02-08+a+22.34.51.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5435997085042045346" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;2. Nei menù a tendina presenti nella parte centrale della finestra dovrete scegliere rispettivamente le voci : "documenti e cartelle" e "Finder.app"&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_Ds8LLsbVUlc/S3CLMhvyFxI/AAAAAAAAAEo/nVNt6TJkaE4/s1600-h/Schermata+2010-02-08+a+22.38.22.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 111px;" src="http://3.bp.blogspot.com/_Ds8LLsbVUlc/S3CLMhvyFxI/AAAAAAAAAEo/nVNt6TJkaE4/s320/Schermata+2010-02-08+a+22.38.22.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5435997797569664786" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;3. Nel menà alla sinistra della vostra pagina dovrete scegliere "Utility" e "Esegui Applescript".&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_Ds8LLsbVUlc/S3CLwqQz12I/AAAAAAAAAEw/Y8expHxVQ9I/s1600-h/Schermata+2010-02-08+a+22.38.34.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 224px;" src="http://4.bp.blogspot.com/_Ds8LLsbVUlc/S3CLwqQz12I/AAAAAAAAAEw/Y8expHxVQ9I/s320/Schermata+2010-02-08+a+22.38.34.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5435998418330965858" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;4. Dovrete copiare e incollare questo pezzo di codice all'interno dell' opportuno riquadro, come in figura : &lt;br /&gt;&lt;pre name="code" class="Java"&gt;(* &lt;br /&gt; author : Franzi Alessandro &lt;br /&gt;*)&lt;br /&gt;on run {input, parameters}&lt;br /&gt; &lt;br /&gt; set sel to input&lt;br /&gt; if sel is {} then&lt;br /&gt;  display dialog "Devi selezionare almeno un file prima" buttons {"Cancel"} default button "Cancel" giving up after 15&lt;br /&gt;  return {}&lt;br /&gt; end if&lt;br /&gt; &lt;br /&gt; -- se sono state selezionate piu voci&lt;br /&gt; set baseList to {}&lt;br /&gt; repeat with selItem in sel&lt;br /&gt;  -- Recupero la corrente&lt;br /&gt;  set lastItem to POSIX path of (selItem as text)&lt;br /&gt;  -- Inserisco in lista&lt;br /&gt;  set baseList to baseList &amp; lastItem&lt;br /&gt; end repeat&lt;br /&gt; &lt;br /&gt; -- recupero le directory se piu di una&lt;br /&gt; set pathList to my baseList&lt;br /&gt; &lt;br /&gt; &lt;br /&gt; if pathList is {} then&lt;br /&gt; else&lt;br /&gt;  set scelte to (choose from list pathList with prompt "Path:" with title "Show Path" with multiple selections allowed)&lt;br /&gt;  &lt;br /&gt;  if scelte is {} then&lt;br /&gt;  else&lt;br /&gt;   set myString to ""&lt;br /&gt;   --set the clipboard to selected&lt;br /&gt;   repeat with theItem in scelte&lt;br /&gt;    set myString to theItem &amp; "&lt;br /&gt;" &amp; myString&lt;br /&gt;   end repeat&lt;br /&gt;   --set the clipboard to selected&lt;br /&gt;   try&lt;br /&gt;    &lt;br /&gt;    set the clipboard to myString&lt;br /&gt;   on error&lt;br /&gt;    display dialog "Problemi"&lt;br /&gt;   end try&lt;br /&gt;  end if&lt;br /&gt;  &lt;br /&gt; end if&lt;br /&gt;end run&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_Ds8LLsbVUlc/S3CMweIpehI/AAAAAAAAAE4/KoGCr6V93-E/s1600-h/Schermata+2010-02-08+a+23.00.06.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 127px;" src="http://1.bp.blogspot.com/_Ds8LLsbVUlc/S3CMweIpehI/AAAAAAAAAE4/KoGCr6V93-E/s320/Schermata+2010-02-08+a+23.00.06.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5435999514587134482" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;5. Scegliere di Salvare il file e inserire il nome con cui volete registrare il servizio (stesso nome con cui lo vedrete nel menu contestuale nel vostro Finder)&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_Ds8LLsbVUlc/S3CNED4ru7I/AAAAAAAAAFA/rvqqKVxUAtk/s1600-h/Schermata+2010-02-08+a+23.00.19.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 286px; height: 266px;" src="http://2.bp.blogspot.com/_Ds8LLsbVUlc/S3CNED4ru7I/AAAAAAAAAFA/rvqqKVxUAtk/s320/Schermata+2010-02-08+a+23.00.19.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5435999851138235314" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_Ds8LLsbVUlc/S3CNMheDt5I/AAAAAAAAAFI/vt9znCvundE/s1600-h/Schermata+2010-02-08+a+23.00.31.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 66px;" src="http://4.bp.blogspot.com/_Ds8LLsbVUlc/S3CNMheDt5I/AAAAAAAAAFI/vt9znCvundE/s320/Schermata+2010-02-08+a+23.00.31.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5435999996518578066" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;6. Adesso utilizzando il finder potrete accedere alla nuova funzionalità&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_Ds8LLsbVUlc/S3CNkW_dvFI/AAAAAAAAAFQ/xuGxJVGZG4k/s1600-h/Schermata+2010-02-08+a+23.00.42.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 201px;" src="http://1.bp.blogspot.com/_Ds8LLsbVUlc/S3CNkW_dvFI/AAAAAAAAAFQ/xuGxJVGZG4k/s320/Schermata+2010-02-08+a+23.00.42.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5436000406022765650" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;METODO 2 - BARRA CONTESTUALE MAC OS X&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Il seguente metodo consiste semplicemente nell' aggiungere nella barra di Mac Os X il pulsante per accedere alla funzionalità relative agli AppleScript del vostro sistema. I passi sono semplici come nel caso precedente, anche lo script cambia, visto che il contesto in cui viene utilizzato è diverso. Naturalmente l'utilizzo è lo stesso, per cui tramite il finder potrete selezionare i files e tramite l'icona accedere alla funzionalità.&lt;br /&gt;&lt;br /&gt;1. Lanciare l'applicazione "AppleScript Editor", entrare nelle preferenze ed abilitare l'icona per gli script nella barra di Mac Os X :&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_Ds8LLsbVUlc/S3CPOp6INzI/AAAAAAAAAFY/TYyo4FZXZUw/s1600-h/Schermata+2010-02-08+a+23.20.06.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 310px; height: 221px;" src="http://1.bp.blogspot.com/_Ds8LLsbVUlc/S3CPOp6INzI/AAAAAAAAAFY/TYyo4FZXZUw/s320/Schermata+2010-02-08+a+23.20.06.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5436002232166790962" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_Ds8LLsbVUlc/S3CPWCMuhmI/AAAAAAAAAFg/ihcHyDNXeAU/s1600-h/Schermata+2010-02-08+a+23.20.16.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 241px;" src="http://1.bp.blogspot.com/_Ds8LLsbVUlc/S3CPWCMuhmI/AAAAAAAAAFg/ihcHyDNXeAU/s320/Schermata+2010-02-08+a+23.20.16.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5436002358946334306" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_Ds8LLsbVUlc/S3CPuIzv_5I/AAAAAAAAAFo/bNTIjm-fZzc/s1600-h/Schermata+2010-02-08+a+23.20.26.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 22px;" src="http://2.bp.blogspot.com/_Ds8LLsbVUlc/S3CPuIzv_5I/AAAAAAAAAFo/bNTIjm-fZzc/s320/Schermata+2010-02-08+a+23.20.26.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5436002773037481874" /&gt;&lt;/a&gt;(Come potete vedere la seconda icona in alto da sinistra è quella di applescript).&lt;br /&gt;&lt;br /&gt;2. Tramite automator salvare il seguente codice in un file di script : &lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="Java"&gt;(* &lt;br /&gt; author : Franzi Alessandro &lt;br /&gt;*)&lt;br /&gt;&lt;br /&gt;set debug to true&lt;br /&gt;&lt;br /&gt;global windowTitle&lt;br /&gt;set windowTitle to "Show Path"&lt;br /&gt;&lt;br /&gt;on findPath()&lt;br /&gt;end findPath&lt;br /&gt;&lt;br /&gt;-- Restituisce la lista dei path selezionati &lt;br /&gt;on getPathList(sel)&lt;br /&gt; if sel is {} then&lt;br /&gt;  display dialog "Devi selezionare almeno un file prima" buttons {"Cancel"} default button "Cancel" giving up after 15 with title windowTitle&lt;br /&gt;  return {}&lt;br /&gt; end if&lt;br /&gt; &lt;br /&gt; -- se sono state selezionate piu voci&lt;br /&gt; set baseList to {}&lt;br /&gt; repeat with selItem in sel&lt;br /&gt;  -- Recupero la corrente&lt;br /&gt;  set lastItem to POSIX path of (selItem as text)&lt;br /&gt;  -- Inserisco in lista&lt;br /&gt;  set baseList to baseList &amp; lastItem&lt;br /&gt; end repeat&lt;br /&gt; return baseList&lt;br /&gt;end getPathList&lt;br /&gt;&lt;br /&gt;on getSelected(selected)&lt;br /&gt; if selected is {} then&lt;br /&gt; else&lt;br /&gt;  set myString to ""&lt;br /&gt;  --set the clipboard to selected&lt;br /&gt;  repeat with theItem in selected&lt;br /&gt;   set myString to theItem &amp; "&lt;br /&gt;" &amp; myString&lt;br /&gt;  end repeat&lt;br /&gt;  --set the clipboard to selected&lt;br /&gt;  try&lt;br /&gt;   &lt;br /&gt;   set the clipboard to myString&lt;br /&gt;  on error&lt;br /&gt;   display dialog "Problemi"&lt;br /&gt;  end try&lt;br /&gt; end if&lt;br /&gt;end getSelected&lt;br /&gt;&lt;br /&gt;tell application "Finder"&lt;br /&gt; &lt;br /&gt; -- recupero le directory se piu di una&lt;br /&gt; set pathList to my getPathList(selection)&lt;br /&gt; &lt;br /&gt; -- se non sono i debug mostro una dialog&lt;br /&gt; --if debug then display dialog cmd with title windowTitle&lt;br /&gt; &lt;br /&gt; if pathList is {} then&lt;br /&gt; else&lt;br /&gt;  set scelte to (choose from list pathList with prompt "Path:" with title windowTitle with multiple selections allowed)&lt;br /&gt;  &lt;br /&gt;  set return to my getSelected(scelte)&lt;br /&gt;  &lt;br /&gt; end if&lt;br /&gt; &lt;br /&gt;end tell&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;3. Copiare i files degli script nella cartella dove essi verranno recuperati. Cliccare sull'icona appena aggiunta, navigare il menù "apri la cartella Script", dopodichè "Apri la cartella script Finder" (scegliendo in quale cartella copiare i files potrete usare gli script a livello locale sull'applicazione, altrimenti a livello globale su tutto il sistema operativo)&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_Ds8LLsbVUlc/S3CRB8TWXAI/AAAAAAAAAGA/TyY9wWf64vQ/s1600-h/Schermata+2010-02-08+a+23.21.55.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 178px;" src="http://4.bp.blogspot.com/_Ds8LLsbVUlc/S3CRB8TWXAI/AAAAAAAAAGA/TyY9wWf64vQ/s320/Schermata+2010-02-08+a+23.21.55.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5436004212789369858" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_Ds8LLsbVUlc/S3CQo0z4cMI/AAAAAAAAAF4/rYpRjr30ZZs/s1600-h/Schermata+2010-02-08+a+23.22.07.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 166px;" src="http://2.bp.blogspot.com/_Ds8LLsbVUlc/S3CQo0z4cMI/AAAAAAAAAF4/rYpRjr30ZZs/s320/Schermata+2010-02-08+a+23.22.07.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5436003781281607874" /&gt;&lt;/a&gt; &lt;br /&gt;&lt;br /&gt;4. Adesso accedendo mediante l'icona nella barra contestuale di Mac Os X potrete usare lo script che ai fini pratici analizzeremo tra un pò.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_Ds8LLsbVUlc/S3CQibdxSvI/AAAAAAAAAFw/Bk1Tq6Kd5UA/s1600-h/Schermata+2010-02-08+a+23.19.33.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 96px;" src="http://1.bp.blogspot.com/_Ds8LLsbVUlc/S3CQibdxSvI/AAAAAAAAAFw/Bk1Tq6Kd5UA/s320/Schermata+2010-02-08+a+23.19.33.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5436003671398763250" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;COME FUNZIONA&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Il funzionamento è semplice, è possibile selezionare uno o più files di cui si intende visualizzare il percorso completo. Dopodichè mediante il menù contestuale o la barra contestuale richiamare lo script appena salvato.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_Ds8LLsbVUlc/S3CSETcvzPI/AAAAAAAAAGI/XUinLkRXYsg/s1600-h/Schermata+2010-02-08+a+23.19.33.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 96px;" src="http://3.bp.blogspot.com/_Ds8LLsbVUlc/S3CSETcvzPI/AAAAAAAAAGI/XUinLkRXYsg/s320/Schermata+2010-02-08+a+23.19.33.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5436005352874167538" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_Ds8LLsbVUlc/S3CSLl3TQkI/AAAAAAAAAGQ/pznlJA47I8Y/s1600-h/Schermata+2010-02-08+a+23.01.03.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 82px;" src="http://4.bp.blogspot.com/_Ds8LLsbVUlc/S3CSLl3TQkI/AAAAAAAAAGQ/pznlJA47I8Y/s320/Schermata+2010-02-08+a+23.01.03.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5436005478076465730" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;In questa finestra, è possibile selezionare una o più voci (mediante il tasto ctrl + click è possibile selezionarne più di una) dopodichè premendo sul tasto OK si ha la possibilità di copiare nella clipboard il percorso dei vostri files.&lt;br /&gt;&lt;br /&gt;Spero che questo strumento vi sia d'aiuto, tendo a ribadire che è davvero strano che la Apple non abbia implementato in maniera nativa questo strumento, io lo trovo davvero comodo.&lt;br /&gt;Alla prossima...Stay Tuned!!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4104693577726899381-2426119633100265907?l=franziale.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://franziale.blogspot.com/feeds/2426119633100265907/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4104693577726899381&amp;postID=2426119633100265907' title='1 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4104693577726899381/posts/default/2426119633100265907'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4104693577726899381/posts/default/2426119633100265907'/><link rel='alternate' type='text/html' href='http://franziale.blogspot.com/2010/02/copiare-il-path-di-un-file-su-mac-os-x.html' title='Copiare il path di un file su Mac Os X Snow Leopard tramite il finder'/><author><name>Alessandro Franzi</name><uri>http://www.blogger.com/profile/08478173128603059576</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_Ds8LLsbVUlc/SNa0YcPXutI/AAAAAAAAAAM/D3DZA5UBU-4/S220/go_with_the_flow_281x211.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_Ds8LLsbVUlc/S3CKjDX9caI/AAAAAAAAAEg/ADyMyZGH2FE/s72-c/Schermata+2010-02-08+a+22.34.51.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4104693577726899381.post-3099230090402361353</id><published>2009-09-01T17:18:00.000+02:00</published><updated>2009-09-01T18:01:40.976+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='vettori'/><category scheme='http://www.blogger.com/atom/ns#' term='ArrayList'/><title type='text'>Da ArrayList a vettore in Java</title><content type='html'>Mi capita spessisimo di dover integrare componenti scritte da me con vecchie componenti che utilizzano ancora semplici vettori.&lt;br /&gt;Personalmente tendo ad usare spessissimo gli ArrayList, ma mi capita altrettanto spesso di dimenticare come convertire gli stessi in vettori.&lt;br /&gt;Ecco come si fà :&lt;br /&gt;&lt;pre name="code" class="Java"&gt;(MyClass[]) mioArrayList.toArray(new MyClass[0])&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Nel caso volessimo avere almeno un elemento per il vettore generato la sinstassi sarebbe la seguente : &lt;br /&gt;&lt;pre name="code" class="Java"&gt;(MyClass[]) mioArrayList.toArray(new MyClass[1])&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4104693577726899381-3099230090402361353?l=franziale.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://franziale.blogspot.com/feeds/3099230090402361353/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4104693577726899381&amp;postID=3099230090402361353' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4104693577726899381/posts/default/3099230090402361353'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4104693577726899381/posts/default/3099230090402361353'/><link rel='alternate' type='text/html' href='http://franziale.blogspot.com/2009/09/da-arraylist-vettore-in-java.html' title='Da ArrayList a vettore in Java'/><author><name>Alessandro Franzi</name><uri>http://www.blogger.com/profile/08478173128603059576</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_Ds8LLsbVUlc/SNa0YcPXutI/AAAAAAAAAAM/D3DZA5UBU-4/S220/go_with_the_flow_281x211.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4104693577726899381.post-5473348325061763955</id><published>2009-08-30T16:27:00.000+02:00</published><updated>2009-08-30T16:39:27.623+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='banner'/><category scheme='http://www.blogger.com/atom/ns#' term='Javascript'/><category scheme='http://www.blogger.com/atom/ns#' term='netsons'/><title type='text'>Nascondere banner pubblicitario su Netsons</title><content type='html'>Da poco tempo Netsons ha introdotto una nuova policy per quanto riguarda l' hosting gratuito e cioè quella di inserire nella vostra pagina un banner pubblicitario fastidiiosissimo.&lt;br /&gt;&lt;br /&gt;In pochissimi passi vi spiego come evitare di mostrare il banner, ricordandovi che è illegale in quanto al momento della firma del vostro contratto avete accettato di mostrare eventuali pubblicità aggiunte.&lt;br /&gt;&lt;br /&gt;Innanzitutto è necessario creare un file .html o .php da includere nel template del vostro sito oppure nella pagina in cui non intendete visualizzare eventuale pubblicità.&lt;br /&gt;Nel mio caso la pagina l' ho chiamata deleteBanner.php&lt;br /&gt;&lt;br /&gt;Guardiamo il codice all'interno della pagina : &lt;br /&gt;&lt;pre name="code" class="Java"&gt;&amp;lt;html&amp;gt;&lt;br /&gt; &amp;lt;script&amp;gt;&lt;br /&gt;  function addLoadEventToHideBanner(func) {&lt;br /&gt;    var oldonload = window.onload;&lt;br /&gt;    if (typeof window.onload != 'function') {&lt;br /&gt;      window.onload = func;&lt;br /&gt;    } else {&lt;br /&gt;      window.onload = function() {&lt;br /&gt;      if (oldonload) {&lt;br /&gt;        oldonload();&lt;br /&gt;      }&lt;br /&gt;      func();&lt;br /&gt;      }&lt;br /&gt;    }&lt;br /&gt;  }&lt;br /&gt;addLoadEventToHideBanner( function () {&lt;br /&gt; var banner = document.getElementById('frameBanner');&lt;br /&gt; if (banner){&lt;br /&gt;  var divsInsideBanner = banner.getElementsByTagName('div');&lt;br /&gt;  for(i=0; i &lt; divsInsideBanner.length; i++){&lt;br /&gt;   var functionClose = divsInsideBanner[i].onclick;&lt;br /&gt;   functionClose.call(divsInsideBanner[i]);&lt;br /&gt;  } &lt;br /&gt; }&lt;br /&gt;}); &lt;br /&gt; &amp;lt;/script&amp;gt;&lt;br /&gt;&amp;lt;/html&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Dopo aver creato questa pagina, è necessario includerla ad esempio nel vostro template. In questo caso copiare deleteBanner.php nella stessa cartella del template e modificare l'ultimo aggiungendo la seguente riga:&lt;br /&gt;&lt;pre name="code" class="Java"&gt;&amp;lt;?php&lt;br /&gt;require('./deleteBanner.php');&lt;br /&gt;?&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4104693577726899381-5473348325061763955?l=franziale.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://franziale.blogspot.com/feeds/5473348325061763955/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4104693577726899381&amp;postID=5473348325061763955' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4104693577726899381/posts/default/5473348325061763955'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4104693577726899381/posts/default/5473348325061763955'/><link rel='alternate' type='text/html' href='http://franziale.blogspot.com/2009/08/nascondere-bannere-pubblicitario-su.html' title='Nascondere banner pubblicitario su Netsons'/><author><name>Alessandro Franzi</name><uri>http://www.blogger.com/profile/08478173128603059576</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_Ds8LLsbVUlc/SNa0YcPXutI/AAAAAAAAAAM/D3DZA5UBU-4/S220/go_with_the_flow_281x211.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4104693577726899381.post-7517660980979385429</id><published>2009-07-25T09:51:00.000+02:00</published><updated>2009-07-25T10:06:24.506+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='printscreen'/><category scheme='http://www.blogger.com/atom/ns#' term='Mac OS X'/><title type='text'>Eseguire print screen con Mac Os X</title><content type='html'>Quando un utente windows passa ad un sistema più semplice e completo come Mac OS X a volte si trova di fronte all' enigma di come si svolgano alcuni task nel nuovo OS.&lt;br /&gt;&lt;br /&gt;Uno dei task che oggi andremo ad analizzare è quello della print screen. Sulla tastiera di un Mac come noterete non esiste il pulsante per eseguire la print screen, ma vi assicuro che tale funzionalità è implementata e nauturalmente in un modo molto più che efficiente.&lt;br /&gt;&lt;br /&gt;Analizziamo 3 modalità di print screen disponibili : &lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Schermo intero&lt;/span&gt;&lt;br /&gt;Questa è la tipologia di printScreen presente su windows, mediante cui si salva l'intero contenuto del vostro monitor in un determinato moemento. Per fare questo è necessario visualizzare ciò che si intende ottenere nella print screen e premere i seguenti tasti : &lt;br /&gt;&lt;span style="font-style:italic;"&gt;Apple key ⌘ + Shift + 3&lt;/span&gt;&lt;br /&gt;In questo modo sul vostro desktop comparirà una nuova immagine contenente l'immagine appena stampata. La differenza da windows è che non dovrete usare paint o qualsiasi altro programma di grafica per incollare la print screen e salvarla, ma il sistema farà tutto in automatico per voi.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Catturare una determinata porzione di schermo&lt;/span&gt;&lt;br /&gt;Per poter eseguire questa modalità è necessario premere i seguenti tasti:&lt;br /&gt;&lt;span style="font-style:italic;"&gt;Apple key ⌘ + Shift + 4&lt;/span&gt;&lt;br /&gt;Dopodichè noterete che il vostro mouse si sarà trasformato in un puntatore con un +, eseguendo il drag con il mouse potrete selezionare la porzione di schermo da visualizzare sulla print screen.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Catturare una particolare finestra applicativa&lt;/span&gt;&lt;br /&gt;I primi passi per l'esecuzione di questa modalità sono praticamente identici al punto precedente. Quindi è necessario premere i seguenti tasti : &lt;br /&gt;&lt;span style="font-style:italic;"&gt;Apple key ⌘ + Shift + 4&lt;/span&gt;&lt;br /&gt;Quando il cursore si sarà trasformato in un puntatore a forma di +, è necessario premere la &lt;span style="font-style:italic;"&gt;barra spaziatrice&lt;/span&gt;, in questo modo il puntatore si sarà trasformato in una macchina fotografica e sul mouseover delle finestre, esse verranno colorate in maniera differente. Tramite il click sarà possibile salvare l'immagine sul desktop in maniera analoga alle modalità analizzate precedentemente.&lt;br /&gt;&lt;br /&gt;Spero che questo articolo vi sia stato utile. Alla prossima.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4104693577726899381-7517660980979385429?l=franziale.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://franziale.blogspot.com/feeds/7517660980979385429/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4104693577726899381&amp;postID=7517660980979385429' title='1 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4104693577726899381/posts/default/7517660980979385429'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4104693577726899381/posts/default/7517660980979385429'/><link rel='alternate' type='text/html' href='http://franziale.blogspot.com/2009/07/eseguire-print-screen-con-mac-os-x.html' title='Eseguire print screen con Mac Os X'/><author><name>Alessandro Franzi</name><uri>http://www.blogger.com/profile/08478173128603059576</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_Ds8LLsbVUlc/SNa0YcPXutI/AAAAAAAAAAM/D3DZA5UBU-4/S220/go_with_the_flow_281x211.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4104693577726899381.post-1408164627457312182</id><published>2009-07-25T09:41:00.000+02:00</published><updated>2009-07-25T09:50:24.996+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='MegaUpload'/><category scheme='http://www.blogger.com/atom/ns#' term='MegaGo'/><category scheme='http://www.blogger.com/atom/ns#' term='RapidShare'/><category scheme='http://www.blogger.com/atom/ns#' term='MegaVideo'/><title type='text'>MegaGo, scaricare utilizzando account premium per Megavideo, Megaupload e Rapidshare.</title><content type='html'>Non volete spendere soldi per acquistare un account premium su Rapidshrare, Megaupload e Megavideo?&lt;br /&gt;Eccovi una delle tante soluzioni disponibili, un generatore di account premium per questi due siti di hosting file che si chiama &lt;a href="http://megago.info/index.php"&gt;MegaGo&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_Ds8LLsbVUlc/Smq5Gk3JOII/AAAAAAAAAEY/8VU0ZalvkrA/s1600-h/Immagine+1.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 200px; height: 138px;" src="http://4.bp.blogspot.com/_Ds8LLsbVUlc/Smq5Gk3JOII/AAAAAAAAAEY/8VU0ZalvkrA/s200/Immagine+1.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5362301828963317890" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;MegaGo ha la particolarità di essere un generatore valido per più siti di hosting, la maggior parte infatti sono validi o solo per Megavideo o per Rapidshare, in alcuni casi per tutti e due ma pochissimi sono quelli che comprendono anche Megaupload.&lt;br /&gt;Ci sono delle limitazioni per quando riguarda i file che si possono scaricare, per Megavideo e Megaupload non si possono prelevare file di dimensione maggiore a 900MB mentre per Rapidshare di 200MB.&lt;br /&gt;&lt;br /&gt;Il link generato con MegaGo rimarrà valido per 120 minuti dopo di che verrà cancellato.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4104693577726899381-1408164627457312182?l=franziale.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://franziale.blogspot.com/feeds/1408164627457312182/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4104693577726899381&amp;postID=1408164627457312182' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4104693577726899381/posts/default/1408164627457312182'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4104693577726899381/posts/default/1408164627457312182'/><link rel='alternate' type='text/html' href='http://franziale.blogspot.com/2009/07/megago-scaricare-utilizzando-account.html' title='MegaGo, scaricare utilizzando account premium per Megavideo, Megaupload e Rapidshare.'/><author><name>Alessandro Franzi</name><uri>http://www.blogger.com/profile/08478173128603059576</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_Ds8LLsbVUlc/SNa0YcPXutI/AAAAAAAAAAM/D3DZA5UBU-4/S220/go_with_the_flow_281x211.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_Ds8LLsbVUlc/Smq5Gk3JOII/AAAAAAAAAEY/8VU0ZalvkrA/s72-c/Immagine+1.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4104693577726899381.post-9043403254739503771</id><published>2009-06-22T23:14:00.000+02:00</published><updated>2009-06-23T00:02:36.552+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='HTTP'/><category scheme='http://www.blogger.com/atom/ns#' term='REST'/><category scheme='http://www.blogger.com/atom/ns#' term='POST'/><category scheme='http://www.blogger.com/atom/ns#' term='GET'/><category scheme='http://www.blogger.com/atom/ns#' term='android'/><title type='text'>Richieste HTTP GET, POST, REST con Android</title><content type='html'>Dopo il &lt;a href="http://franziale.blogspot.com/2009/06/tutorial-cose-rest.html"&gt;tutorial su cos'è rest&lt;/a&gt; ecco un' implementazione per poter utilizzare REST sulla piattaforma Android.&lt;br /&gt;&lt;br /&gt;In particolare ciò che ho creato è una classe di utilità in cui sono presenti una serie di metodi utili per l'esecuzionedi richieste di tipo GET e POST ed un wrapper mediante il quale è possibile eseguire una chiamata REST modellata in base al tipo di method che gli si passa in input.&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="Java"&gt;public class RestUtils {&lt;br /&gt; private final static String METHOD_POST = "post";&lt;br /&gt; private final static String METHOD_GET= "get";&lt;br /&gt; private final static String TAG= "RestUtils";&lt;br /&gt; &lt;br /&gt; /***&lt;br /&gt;  * Esegue una richiesta REST&lt;br /&gt;  * &lt;br /&gt;  * @param host   : hostname&lt;br /&gt;  * @param method  : methodo (GET,POST supportati per ora)&lt;br /&gt;  * @param path   : percorso&lt;br /&gt;  * @param parameters : parametri&lt;br /&gt;  * @return    : Stringa contenente la response&lt;br /&gt;  * @throws RestRequestException : Eccezione personalizzata&lt;br /&gt;  */&lt;br /&gt; public static String doRESTRequest (String host,  String method, String path, Map&amp;lt;String,String&amp;gt; parameters) &lt;br /&gt;  throws RestRequestException{&lt;br /&gt;  &lt;br /&gt;  return doRESTRequest(host, "80", method, path, parameters);&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; /***&lt;br /&gt;  * Esegue una richiesta REST&lt;br /&gt;  * &lt;br /&gt;  * @param host   : hostname&lt;br /&gt;  * @param port   : porta&lt;br /&gt;  * @param method  : methodo (GET,POST supportati per ora)&lt;br /&gt;  * @param path   : percorso&lt;br /&gt;  * @param parameters : parametri&lt;br /&gt;  * @return    : Stringa contenente la response&lt;br /&gt;  * @throws RestRequestException : Eccezione personalizzata&lt;br /&gt;  */&lt;br /&gt; public static String doRESTRequest (String host, String port, String method, String path, Map&amp;lt;String,String&amp;gt; parameters) &lt;br /&gt;  throws RestRequestException{&lt;br /&gt;  &lt;br /&gt;  String returnString = null;&lt;br /&gt;  try{&lt;br /&gt;    &lt;br /&gt;   String url = host+":"+port+path;&lt;br /&gt;   Log.i(TAG,METHOD_GET+" Request - URL : "+url );&lt;br /&gt;   &lt;br /&gt;   if (METHOD_GET.equalsIgnoreCase(method)){&lt;br /&gt;    returnString = doGETRequest(url,parameters); &lt;br /&gt;   }else if (METHOD_POST.equalsIgnoreCase(method)){&lt;br /&gt;    returnString = doPOSTRequest(url, parameters);&lt;br /&gt;   }&lt;br /&gt;  }catch(GetRequestException e){&lt;br /&gt;   throw new RestRequestException(e.getMessage());  &lt;br /&gt;  }catch(PostRequestException e){&lt;br /&gt;   throw new RestRequestException(e.getMessage());&lt;br /&gt;  }&lt;br /&gt;    &lt;br /&gt;  return returnString;&lt;br /&gt;  &lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; /***&lt;br /&gt;  * Metodo per eseguire una request di tipo GET&lt;br /&gt;  * @param url : url della request&lt;br /&gt;  * @return  : stringa contenente la response&lt;br /&gt;  * @throws GetRequestException : Eccezione modellata&lt;br /&gt;  */&lt;br /&gt; public static String doGETRequest(String url,Map&amp;lt;String, String&amp;gt; parameters) throws GetRequestException{&lt;br /&gt;  String paramStr = composeParametersForGetRequest(parameters);&lt;br /&gt;  &lt;br /&gt;  if (paramStr!=null &amp;&amp; paramStr.length() &amp;gt; 0 ) url = url +"?"+paramStr;&lt;br /&gt;  String websiteData = null;&lt;br /&gt;  &lt;br /&gt;  try {&lt;br /&gt;   Log.i(TAG,"GetRequest - url : "+url);&lt;br /&gt;   DefaultHttpClient client = new DefaultHttpClient();&lt;br /&gt;   URI uri = new URI(url);&lt;br /&gt;   HttpGet method = new HttpGet(uri);&lt;br /&gt;   HttpResponse res = client.execute(method);&lt;br /&gt;   InputStream data = res.getEntity().getContent();&lt;br /&gt;   websiteData = parseISToString(data);&lt;br /&gt;  } catch (ClientProtocolException e) {&lt;br /&gt;   throw new GetRequestException(e.getMessage());&lt;br /&gt;  } catch (IOException e) {&lt;br /&gt;   throw new GetRequestException(e.getMessage());&lt;br /&gt;  } catch (URISyntaxException e) {&lt;br /&gt;   throw new GetRequestException(e.getMessage());&lt;br /&gt;  }finally{&lt;br /&gt;   Log.i(TAG,"GetRequest - Request &amp; Response completed");&lt;br /&gt;  }&lt;br /&gt;  return websiteData;&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; public static String doPOSTRequest(String url,Map&amp;lt;String, String&amp;gt; parameters) &lt;br /&gt;  throws PostRequestException{&lt;br /&gt;  &lt;br /&gt;  String returnString = null;&lt;br /&gt;     // Creo un nuovo HttpClient e l'Header del post&lt;br /&gt;     HttpClient httpclient = new DefaultHttpClient();&lt;br /&gt;     HttpPost httppost = new HttpPost(url);&lt;br /&gt;     httppost.setHeader(HTTP.CONTENT_TYPE, "application/x-www-form-urlencoded");&lt;br /&gt;&lt;br /&gt;     try {&lt;br /&gt;         // aggiungo i dati alla richiesta&lt;br /&gt;         List&amp;lt;NameValuePair&amp;gt; nameValuePairs = composeParametersForPostRequest(parameters);&lt;br /&gt;         httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));&lt;br /&gt;&lt;br /&gt;         // Eseguo la richiesta HTTP&lt;br /&gt;         HttpResponse response = httpclient.execute(httppost);&lt;br /&gt;         if (response.getStatusLine().getStatusCode() == 200) { &lt;br /&gt;          returnString = EntityUtils.toString(response.getEntity()); &lt;br /&gt;                response = null; &lt;br /&gt;                 &lt;br /&gt;         }&lt;br /&gt;     } catch (ClientProtocolException e) {&lt;br /&gt;      throw new PostRequestException(e.getMessage());&lt;br /&gt;     } catch (IOException e) {&lt;br /&gt;      throw new PostRequestException(e.getMessage());&lt;br /&gt;     }&lt;br /&gt;     &lt;br /&gt;     return returnString;&lt;br /&gt; &lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; public static List&amp;lt;NameValuePair&amp;gt; composeParametersForPostRequest(Map&amp;lt;String,String&amp;gt; parameters){&lt;br /&gt;  &lt;br /&gt;  List&amp;lt;String&amp;gt; chiavi = new ArrayList&amp;lt;String&amp;gt;(parameters.keySet());&lt;br /&gt;  List&amp;lt;NameValuePair&amp;gt; nameValuePairs = new ArrayList&amp;lt;NameValuePair&amp;gt;();&lt;br /&gt;  &lt;br /&gt;  for (int i = 0 ; i &amp;lt; chiavi.size(); i++){&lt;br /&gt;   String chiave = chiavi.get(i);&lt;br /&gt;   nameValuePairs.add(new BasicNameValuePair(chiave, parameters.get(chiave)));&lt;br /&gt;  }&lt;br /&gt;  &lt;br /&gt;  return nameValuePairs;&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; /***&lt;br /&gt;  * Metodo per comporre la parte di URL relativa ai parametri&lt;br /&gt;  * @param parameters : mappa di parametri&lt;br /&gt;  * @return    : Stringa contenente i parametri concatenati&lt;br /&gt;  */&lt;br /&gt; public static String composeParametersForGetRequest(Map&amp;lt;String, String&amp;gt; parameters){&lt;br /&gt;  String paramStr = "";&lt;br /&gt;  List&amp;lt;String&amp;gt; chiavi = new ArrayList&amp;lt;String&amp;gt;(parameters.keySet());&lt;br /&gt;  &lt;br /&gt;  for (int i = 0 ; i &amp;lt; chiavi.size(); i++){&lt;br /&gt;   String chiave = chiavi.get(i);&lt;br /&gt;   paramStr += chiave+"=";  &lt;br /&gt;   paramStr += URLEncoder.encode(parameters.get(chiave));  &lt;br /&gt;   paramStr += "&amp;";  &lt;br /&gt;  }&lt;br /&gt;  return paramStr;&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Innanzitutto noterete che mancano alcune componenti per cui non potrete compilare questa classe:&lt;br /&gt;- Metodi per la conversione da Stringa ad InputStream e viceversa che potrete trovare su &lt;a href="http://franziale.blogspot.com/2009/06/string-ed-inputstream-in-java.html"&gt;questo post&lt;/a&gt;.&lt;br /&gt;- Eccezioni personalizzate...potete ricrearvele voi, l'importante è che estandano Exception.&lt;br /&gt;&lt;br /&gt;Adesso analizziamo i metodi : &lt;br /&gt;- &lt;span style="font-weight:bold;"&gt;doRESTRequest&lt;/span&gt; : ci sono 2 overload utilizzabili uno in cui è possibile utilizzare una porta diversa da quella di default (80). Tramite questo metodo è possibile eseguire qualsiasi tipo di richiesta REST in base al parametro method che può essere "get" o "post". Gli altri parametri sono facilmente intuibili e troverete un esempio più avanti.&lt;br /&gt;- &lt;span style="font-weight:bold;"&gt;doGETRequest&lt;/span&gt; : è un metodo che dato un url ed una mappa di parametri esegue una richiesta di tipo GET e restituisce una stringa contenente la response.&lt;br /&gt;- &lt;span style="font-weight:bold;"&gt;doPOSTRequest&lt;/span&gt; : è un metodo che dato un url e una mappa di parametri esegue una richiesta di tipo POST e restituisce una stringa contenente la response.&lt;br /&gt;- &lt;span style="font-weight:bold;"&gt;composeParametersForPostRequest&lt;/span&gt; : metodo per comporre i parametri in maniera adeguata per poter eseguire una richiesta di tipo POST.&lt;br /&gt;- &lt;span style="font-weight:bold;"&gt;composeParametersForGetRequest&lt;/span&gt; : metodo per comporre i parametri in maniera adeguata per completare l'url per una richiesta di tipo GET.&lt;br /&gt;&lt;br /&gt;Vediamo un esempio di utilizzo della classe di utilità per una richiesta di tipo POST. L'esempio utilizza le API REST di Yahoo per  eseguire una ricerca : &lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="Java"&gt;Map&amp;lt;String,String&amp;gt; paramz = new HashMap&amp;lt;String,String&amp;gt;();&lt;br /&gt;        paramz.put("appid", "YahooDemo");&lt;br /&gt;        paramz.put("query", "umbrella");&lt;br /&gt;        paramz.put("results", "10");&lt;br /&gt;        try {&lt;br /&gt;   String retString = RestUtils.doRESTRequest("http://api.search.yahoo.com", "POST", "/WebSearchService/V1/webSearch", paramz);&lt;br /&gt;   Log.i(TAG,"Return : "+retString);&lt;br /&gt;        } catch (RestRequestException e) {&lt;br /&gt;   Log.e(TAG,"Eccezione : ",e);&lt;br /&gt;  }&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Spero che questo post vi sia stato di aiuto.&lt;br /&gt; Accetto domande e proponimenti a riguardo.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4104693577726899381-9043403254739503771?l=franziale.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://franziale.blogspot.com/feeds/9043403254739503771/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4104693577726899381&amp;postID=9043403254739503771' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4104693577726899381/posts/default/9043403254739503771'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4104693577726899381/posts/default/9043403254739503771'/><link rel='alternate' type='text/html' href='http://franziale.blogspot.com/2009/06/richieste-http-get-post-rest-con.html' title='Richieste HTTP GET, POST, REST con Android'/><author><name>Alessandro Franzi</name><uri>http://www.blogger.com/profile/08478173128603059576</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_Ds8LLsbVUlc/SNa0YcPXutI/AAAAAAAAAAM/D3DZA5UBU-4/S220/go_with_the_flow_281x211.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4104693577726899381.post-1395239757853705104</id><published>2009-06-22T21:53:00.001+02:00</published><updated>2009-06-22T21:58:58.026+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='InputStream'/><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='String'/><title type='text'>String ed InputStream in Java</title><content type='html'>Premetto che non sono dotato di ottima memoria, quindi mi ritrovo ogni volta a riscrivere funzioni di conversione per ogni genere di Type in ogni genere di linguaggio di programmazione. Naturalmente ogni volta dimentico di come si convertano i diversi type... un esempio di conversione che avrò implementato milioni di volte ma che ogni volta devo riscrivere da zero è quella da Stringa ad InputStream e viceversa.&lt;br /&gt;&lt;br /&gt;Per cui per mia comodità e per vostra necessità ecco 2 metodi con i quali potrete convertire questi due tipi di dati Java.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Da InputStream a String&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="Java"&gt;public static String parseISToString(InputStream is){&lt;br /&gt;  java.io.DataInputStream din = new java.io.DataInputStream(is);&lt;br /&gt;  StringBuffer sb = new StringBuffer();&lt;br /&gt;  try{&lt;br /&gt;   String line = null;&lt;br /&gt;   while((line=din.readLine()) != null){&lt;br /&gt;    sb.append(line+"\n");&lt;br /&gt;   }&lt;br /&gt;  }catch(Exception ex){&lt;br /&gt;   ex.getMessage();&lt;br /&gt;  }finally{&lt;br /&gt;   try{&lt;br /&gt;    is.close();&lt;br /&gt;   }catch(Exception ex){}&lt;br /&gt;  }&lt;br /&gt;  return sb.toString();&lt;br /&gt; }&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Da String a InputStream&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="Java"&gt;public java.io.InputStream parseStringToIS(String str){&lt;br /&gt;  if(str==null) return null;&lt;br /&gt;  str = str.trim();&lt;br /&gt;  java.io.InputStream in = null;&lt;br /&gt;  try{&lt;br /&gt;   in = new java.io.ByteArrayInputStream(str.getBytes("UTF-8"));&lt;br /&gt;  }catch(Exception ex){}&lt;br /&gt;  return in;      &lt;br /&gt; }&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Spero che questo breve post vi sia d'aiuto spessissime volte.&lt;br /&gt;Alla prossima&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4104693577726899381-1395239757853705104?l=franziale.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://franziale.blogspot.com/feeds/1395239757853705104/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4104693577726899381&amp;postID=1395239757853705104' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4104693577726899381/posts/default/1395239757853705104'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4104693577726899381/posts/default/1395239757853705104'/><link rel='alternate' type='text/html' href='http://franziale.blogspot.com/2009/06/string-ed-inputstream-in-java.html' title='String ed InputStream in Java'/><author><name>Alessandro Franzi</name><uri>http://www.blogger.com/profile/08478173128603059576</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_Ds8LLsbVUlc/SNa0YcPXutI/AAAAAAAAAAM/D3DZA5UBU-4/S220/go_with_the_flow_281x211.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4104693577726899381.post-4696998195563410921</id><published>2009-06-20T17:04:00.000+02:00</published><updated>2009-12-08T20:06:52.113+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Tutorial'/><category scheme='http://www.blogger.com/atom/ns#' term='REST'/><category scheme='http://www.blogger.com/atom/ns#' term='Ajax'/><title type='text'>Tutorial : Cos' è REST ?</title><content type='html'>&lt;span style="font-weight:bold;"&gt;Cos'è REST&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;REST stà per &lt;span style="font-style:italic;"&gt;Representational State Transfer&lt;/span&gt;.&lt;br /&gt;Esso si basa su un protocollo di comunicazione stateless, client-server, chacheable e si appoggia sul protocollo HTTP.&lt;br /&gt;&lt;br /&gt;REST è uno stile arichitetturale per il disegno di applicazioni di rete. L'idea è quella di usare una comunicazione tra macchine basata su richieste HTTP anzichè utilizzare meccanismi come CORBA, RPC o SOAP.&lt;br /&gt;&lt;br /&gt;In molti casi, il World Wide Web, basato sull' HTTP, può essere visto come un' architettura REST-based.&lt;br /&gt;Le applicazioni basate su REST dette anche &lt;span style="font-weight:bold;"&gt;RESTful&lt;/span&gt; usano richieste HTTP per inviare dati (creare e/o aggiornare), leggere dati (eseguire query), e cancellare dari.&lt;br /&gt;Quindi REST usa richieste HTTP per tutti e 4 le operazioni  di CRUD (Create/Read/Update/Delete).&lt;br /&gt;&lt;br /&gt;REST è un alternativa leggere al meccanismo di RPC (Remote Procedure Calls) e quella dei Web Services (SOAP, WSDL, ..).&lt;br /&gt;Dopo vedremo quanto è semplice utilizzare REST.&lt;br /&gt;&lt;br /&gt;Malgrado la sua semplicità, REST è permettamente completo, non c'è nulla che si possa fare tramite un Web Service che non si possa fare mediante un'architettura RESTful.&lt;br /&gt;REST non è uno "STANDARD", e mai lo sarà per la W3C.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;REST visto come un Web Service leggero&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Come un approccio di programmazione, REST è un alternativa leggera i Web Services e ad RPC.&lt;br /&gt;In maniera molto simile ai Web Services, un servizio REST è : &lt;br /&gt;- Indipendente dalla piattaforma&lt;br /&gt;- Indipendente dal linguaggio di programmazione&lt;br /&gt;- Basato su un protocollo di comunicazione Standard (HTTP)&lt;br /&gt;- Poichè usa la porta 80 (porta di default per traffico HTTP) non ha bisogno che ci siano particolari configurazioni del firewall&lt;br /&gt;&lt;br /&gt;Per la sicurezza, i token di username/password sono spesso usati.&lt;br /&gt;Per la crittografia, REST può basarsi su protocolli sicuri come HTTPS&lt;br /&gt;&lt;br /&gt;Una cosa che non fà parte di un buon disegno di REST sono i cookies: Nell' acronimo di REST, "ST" stà per "State transfer", e quindi, in un buon design queste operazioni sono auto-contenute, e in ogni richiesta vanno trasferite tutte le informazioni (stato) di cui il server ha bisogno per completare la richiesta.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Quanto è semplice REST&lt;/span&gt;&lt;br /&gt;Guardiamo un semplice Web Service come esempio : interrogare un applicazione per gli elenchi telefonici per richiedere i dettagli di un utente. Tutto ciò che abbiamo è l'ID dell'utente.&lt;br /&gt;&lt;br /&gt;Usando un Web Service e SOAP, la richiesta assomiglierebbe alla seguente:&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="Java"&gt;&amp;lt;?xml version=&amp;quot;1.0&amp;quot;?&amp;gt;&lt;br /&gt;&amp;lt;soap:Envelope&lt;br /&gt;xmlns:soap=&amp;quot;http://www.w3.org/2001/12/soap-envelope&amp;quot;&lt;br /&gt;soap:encodingStyle=&amp;quot;http://www.w3.org/2001/12/soap-encoding&amp;quot;&amp;gt;&lt;br /&gt; &amp;lt;soap:body pb=&amp;quot;http://www.acme.com/phonebook&amp;quot;&amp;gt;&lt;br /&gt;  &amp;lt;pb:GetUserDetails&amp;gt;&lt;br /&gt;   &amp;lt;pb:UserID&amp;gt;12345&amp;lt;/pb:UserID&amp;gt;&lt;br /&gt;  &amp;lt;/pb:GetUserDetails&amp;gt;&lt;br /&gt; &amp;lt;/soap:Body&amp;gt;&lt;br /&gt;&amp;lt;/soap:Envelope&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;I dettagli non sono importanti, è solo un esempio.&lt;br /&gt;L'intero xml verrà inviato usando una richista HTTP POST al server.&lt;br /&gt;Il risultato sarà probabilmente un file XML, ma sarà incluso, come payload, dentro l'envelope della risposta SOAP.&lt;br /&gt;&lt;br /&gt;E con Rest?&lt;br /&gt;La query probabilmente assomiglierà alla seguente : &lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;http://www.acme.com/phonebook/UserDetails/12345&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Nota che questo non è il body della richiesta -- è solo un URL. Questo URL è inviato al server usando una semplice richiesta GET, e la risposta HTTP è il campo con i dati del risultato. Tale risposta non è inclusa all'interno di nulla, i dati saranno trasmessi in maniera tale da essere subito disponibili per un eventuale utilizzo.&lt;br /&gt;&lt;br /&gt;E' semplice vedere perchè i Web Services sono spesso usati con librerie che creano la richiesta SOAP/HTTP e la inviano e quindi parsano la risposta SOAP.&lt;br /&gt;Con REST, una semplice connessione di rete è ciò che ti serve. Puoi testare le API direttamente usando il browser.&lt;br /&gt;&lt;br /&gt;Comunque le librerie REST esistono (per semplificare le cose), ne discuteremo dopo.&lt;br /&gt;Da notare come nell'URL il metodo non è chiamato "GetUserDetails" ma semplicemente "UserDetails". E' una convenzione comune usata nel disegno di REST di usare nomi anzichè verbi per denotare semplici risorse.&lt;br /&gt;&lt;br /&gt;Simpatica Similutudine&lt;br /&gt;Una similitudine simpatica tra REST e SOAP è quella tra una lettera e una cartolina : con SOAP, devi usare una busta da lettera, con REST è una cartolina. La cartolina è più semplice da gestire. Tralaltro c'è una convenienza per quanto riguarda il fattore banda da utilizzare, in quanto i contenuti sono di gran  lunga inferiori.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Richieste REST più complesse&lt;/span&gt;&lt;br /&gt;La sezione precedente includeva un esempio semplice per una richiesta REST con un unico parametro.&lt;br /&gt;REST può semplicemente gestire richieste più complesse che includono molti parametri.&lt;br /&gt;In molti casi, si possono semplicemente utilizzare parametri GET nell'URL della richiesta HTTP.&lt;br /&gt;&lt;br /&gt;Ad esempio:&lt;br /&gt;&lt;br /&gt;http://www.acme.com/phonebook/UserDetails?firstName=John&amp;lastName=Doe&lt;br /&gt;&lt;br /&gt;Se si ha la necessità di passare parametri lunghi, o binari, è necessario utilizzare richieste HTTP di tipo POST ed includere i parametri nel body della richiesta POST.&lt;br /&gt;&lt;br /&gt;Per regola, le richieste GET vengono utilizzare per query di sola lettura, esse non cambiano lo stato del server e dei suoi dati.&lt;br /&gt;Per la creazione, aggiornamento, e cancellazione si usano richieste POST. (POST può anche essere usato per lettura nel caso in cui vengono inviati parametri più complessi).&lt;br /&gt;&lt;br /&gt;In un modo, questa pagina web (così come altre) può essere vista offrendo servizi mediante API rest. E' possibile usare una richiesta GET per leggere i dati e una POST per postare un commento.&lt;br /&gt;&lt;br /&gt;Mentre un servizio REST può uesare XML nelle sue risposte (come un modo di organizzare dati strutturati), le richieste REST raramente usano l'XML. Come mostrato prima, in molti casi, i parametri di richiesta sono semplici, e non c'è bisogno di utilizzare XML.&lt;br /&gt;&lt;br /&gt;Un vantaggio di usare XML è la "safety" dei tipi. Comunque, in un sistema stateless come REST, devi solo verificare la validità del tuo input, XML o altro.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Risposta REST del server&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Una risposta del server in REST è spesso un file XML. Per esempio : &lt;br /&gt;&lt;pre name="code" class="Java"&gt;&amp;lt;parts-list&amp;gt;&lt;br /&gt; &amp;lt;part id=&amp;quot;3322&amp;quot;&amp;gt;&lt;br /&gt;  &amp;lt;name&amp;gt;ACME Boomerang&amp;lt;/name&amp;gt;&lt;br /&gt;  &amp;lt;desc&amp;gt;&lt;br /&gt;   Used by Coyote in &amp;lt;i&amp;gt;Zoom at the Top&amp;lt;/i&amp;gt;, 1962&lt;br /&gt;  &amp;lt;/desc&amp;gt;&lt;br /&gt;  &amp;lt;price currency=&amp;quot;usd&amp;quot; quantity=&amp;quot;1&amp;quot;&amp;gt;17.32&amp;lt;/price&amp;gt;&lt;br /&gt;  &amp;lt;uri&amp;gt;http://www.acme.com/parts/3322&amp;lt;/uri&amp;gt;&lt;br /&gt; &amp;lt;/part&amp;gt;&lt;br /&gt; &amp;lt;part id=&amp;quot;783&amp;quot;&amp;gt;&lt;br /&gt;  &amp;lt;name&amp;gt;ACME Dehydrated Boulders&amp;lt;/name&amp;gt;&lt;br /&gt;  &amp;lt;desc&amp;gt;&lt;br /&gt;   Used by Coyote in &amp;lt;i&amp;gt;Scrambled Aches&amp;lt;/i&amp;gt;, 1957&lt;br /&gt;  &amp;lt;/desc&amp;gt;&lt;br /&gt;  &amp;lt;price currency=&amp;quot;usd&amp;quot; quantity=&amp;quot;pack&amp;quot;&amp;gt;19.95&amp;lt;/price&amp;gt;&lt;br /&gt; &amp;lt;uri&amp;gt;http://www.acme.com/parts/783&amp;lt;/uri&amp;gt;&lt;br /&gt; &amp;lt;/part&amp;gt;&lt;br /&gt;&amp;lt;/parts-list&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Comunque, altri formati possono essere anche usati, diversamente dai servizi SOAP, REST non è obbligato ad utilizzare XML.&lt;br /&gt;Possibili formati possono essere CVS (comma-separated values) e JSON (JavaScript Object Notation)&lt;br /&gt;&lt;br /&gt;Ciascun formato ha i suoi vantaggi e svantaggi. XML è facilmente espandibile (i client possono ignorare campi sconosciuti) ed è type-safe, CSV è molto compatto e JSON è facilmente parsabile dai client Javascript (ed è facilmente parsabile anche in altri linguaggi).&lt;br /&gt;&lt;br /&gt;Un opzione non è accettabile come formato di risposta REST, eccetto in casi molto specifici : HTML, o altri formati non sono facilmente processabili dai client. L'eccezione specifica è, sicuramente, quando il servizio REST è documentato per ritornare un documento human-readable (facilmente leggibile dall'uomo). Comunque guardando l'intero WWW come ritorno di un applicazione RESTful, troviamo che l'HTML è infatti il formato di risposta REST più comunemente usato.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Esempi Rest reali&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Potete trovare esempi di API REST utilizzate da portali abbastanza noti:&lt;br /&gt;&lt;br /&gt;- &lt;a href="http://apiwiki.twitter.com/Twitter-API-Documentation"&gt;Twitter API&lt;/a&gt;&lt;br /&gt;- &lt;a href="http://developer.yahoo.com/search/rest.html"&gt;Search API&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;In rete comunque, ne troverete un' infinità.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;REST e Ajax&lt;/span&gt;&lt;br /&gt;AJAX è una tecnica popolarissima per lo sviluppo web che permette alle pagine di essere interattive mediante il semplice utilizzo di Javascript.&lt;br /&gt;&lt;br /&gt;In AJAX, le richieste sono inviate al server usando oggetti di tipo XMLHttpRequest. La risposta è usata dal Javascript che dinamicamente cambia la pagina corrente.&lt;br /&gt;&lt;br /&gt;In molti casi, le applicazioni AJAX seguono i principi del disegno REST. Ciascuna XMLHttpRequest può essere vista come una richiesta ad un servizio REST, inviata tramite il metodo GET.&lt;br /&gt;La risposta è spesso in JSON, un formato popolare di risposta per REST.&lt;br /&gt;&lt;br /&gt;Per rendere le vostre applicazioni AJAX veramente RESTful, è necessario seguire gli standard di disegno  per REST.&lt;br /&gt;Troverete che molto di questo contribuirà ad un buon design.&lt;br /&gt;&lt;br /&gt;Comunque in seguito analizzeremo meglio richieste eseguite mediante javascript e AJAX.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Componenti di un architettura REST&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Le componenti chiave di un architettura REST sono le seguenti:&lt;br /&gt;&lt;br /&gt;- Risorse, che sono dentificate mediante URL logici. Sia &lt;span style="font-style:italic;"&gt;stato&lt;/span&gt; che &lt;span style="font-style:italic;"&gt;funzionalità&lt;/span&gt; sono rappresentati usando risorse.&lt;br /&gt;Gli &lt;span style="font-weight:bold;"&gt;URL logici&lt;/span&gt; implacano che le risorse sono universalmente indirizzabili da altre parti del sistema.&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Risorse&lt;/span&gt; sono gli elementi chiave di un design RESTful, in opposizione ai "metodi" e "servizi" rispettivamente usati nell'RPC e nelle richieste SOAP dei servizi WEB.&lt;br /&gt;- Un web di risorse, significa che una singola risorsa non dovrebbe essere eccessivamente largo e contenere troppi dettagli.&lt;br /&gt;In qualsiasi momento rilevante, una risorsa dovrebbe contenere i link ad informazioni addizionali, così come in pagine Web.&lt;br /&gt;- Il sistema è client-server, ma sicuramente una componente server può essere una componente client.&lt;br /&gt;- Non ci sono connessioni agli stati, l'interazione è stateless. Ogni nuova richiesta può trasportare le informazioni richieste per poterla completare, e non deve contare sulle interazioni precedenti con lo stesso client.&lt;br /&gt;- Le risorse devono essere cachable quando possibile con una data di scadenza. Il protocollo deve permettere al server di specificare esplicitamente quali risorse possono essere messe in chache e per quanto tempo.&lt;br /&gt;Sin da quando l' HTTP è universalmente usato per il protocollo RET, gli header di controllo della cache dell' HTTP sono usati per questo scopo. I clients devono rispettare le specifiche di cache del server per ogni risorsa.&lt;br /&gt;- I server Proxy possono essere usati come parte dell'architettura, per perfezionare le performance e la scalabilità. Ogni proxy HTTP standard può essere usato.&lt;br /&gt;&lt;br /&gt;Da notare che l' applicazione può usare i servizi REST senza essere stats scritta per essere un architettura REST. Ad esempio una macchina non pragrammata per REST può accedere a servizi REST di terze parti.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Linee guida per il design di REST&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Alcune semplici linee guida per il design di un architettura REST:&lt;br /&gt;&lt;br /&gt;Non usare URL fisici. Un URL fisico punta a qualcosa di fisico, ad esempio un file XML:&lt;br /&gt;"http://www.acme.com/inventory/product003.xml". Un URL logico non implica un file fisico : "http://www.acme.com/inventory/product/003".&lt;br /&gt;Certo, tutto ciò che comunque ha estensione .xml potrebbe essere generato dinamicamente. Ma deve essere "umanamente visibile" che un URL è logico e non fisico.&lt;br /&gt;&lt;br /&gt;Le Query non devono ritornare troppi dati. Se necessario, fornire un meccanismo di paging. Per esempio una richiesta di tipo GET che chiede ad esempio una "product list) deve restituire i primi n prodotti con i link al prossimo/precedente.&lt;br /&gt;Pensare sempre al fatto che le risposte REST possono essere di qualsiasi tipo, è necessario essere sicuri che tutto sia ben documentato, e non cambiare il formato di output leggermente.&lt;br /&gt;&lt;br /&gt;Ricordarsi, nel caso in cui l'output sia umanamente-leggibile, che i client snon sono utenti umani.&lt;br /&gt;Se l'output è un XML, essere sicuri che il documento faccia riferimento ad uno schema o a un DTD.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt; ROA vs. SOA, REST vs. SOAP&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;ROA (REST Oriented Architecture) è solo un nome di fantasia per una SOA (Service Oriented Architecture) che usa servizi REST.&lt;br /&gt;&lt;br /&gt;Il principale vantaggio di una SOA basata su SOAP riepetto a ROA è che ci sono tool di supporto più "maturi", comunque questo potrà variare nel tempo.&lt;br /&gt;Un altro vantaggio della SOA include la tipatura Safe delle richieste XML (per le risposte, ROA può anch'essa utilizzare XML se gli sviluppatori lo desiderano).&lt;br /&gt;&lt;br /&gt;Il vantaggio principale di ROA è la facilità nell' implementazione, agilità nel progetto, e l' approccio alleggerito nell'approccio alle cose. SOA e SOAP è per gente che sviluppa suite business ed è quello che troverete nel sistemi bancari e finanziari. &lt;br /&gt;Viceversa quando c'è la necessità di qualcosa di più veloce, con buone performance e basso sovraccarico, è spesso più indicato utilizzare REST e la ROA. &lt;br /&gt;&lt;br /&gt;Per esempio, quando viene spiegato il perchè si scelga REST anzichè SOAP da yahoo, la gente dice che REST ha poche barriere, è più semplice di SOAP, ed è sufficiente per i servizi che yahoo fornisce. Questo è vero non solo tra REST e SOAP, ma più in generale tra ROA e SOA.&lt;br /&gt;&lt;br /&gt;Un altro vantaggio è dato dalla performance : con un supporto alla cache migliore, richieste e risposte più leggere, quindi un parsing delle risposte più leggero, REST permette di ridurre notevolmente il traffico.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Documentare i servizi REST : WSDL e WADL&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Il WSDL, è uno standard W3C che definisce un linguaggio per la descrizione di servizi web. Esso è comunemente usato per descrivere i servizi offerti dal server SOAP. Mentre il WSDL è flessibile nell' opzione di bind dei servizi, esso non supporta originariamente operazioni HTTP come GET e POST. Sin dall' inizio invece i servizi REST usano altri verbi HTTP, come PUT e DELETE. Il WSDL è una scelta troppo povera per documentare i servizi REST.&lt;br /&gt;&lt;br /&gt;Nella versione 2.0, i WSDL supportano tutti i verbi HTTP ed è ora considerato essere un metodo accettabile per la documentazione dei servizi REST.&lt;br /&gt;&lt;br /&gt;La seconda alternativa è il WADL ( Web Application Description Language) adottata da Sun Microsystem.&lt;br /&gt;così come REST, il WADL è leggero, semplice da capire e semplice da scrivere rispetto ai WSDL. In alcuni aspetti non è flessibile come il WSDL ma è sufficiente per ogni servizio REST ed è molto meno complesso.&lt;br /&gt;&lt;br /&gt;Ecco un frammento di una specifica WADL, che descrive un servizio di "Item Search" di Amazon :  &lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="Java"&gt; &amp;lt;method name=&amp;quot;GET&amp;quot; id=&amp;quot;ItemSearch&amp;quot;&amp;gt;&lt;br /&gt; &amp;lt;request&amp;gt;&lt;br /&gt;  &amp;lt;param name=&amp;quot;Service&amp;quot; style=&amp;quot;query&amp;quot;&lt;br /&gt;   fixed=&amp;quot;AWSECommerceService&amp;quot;/&amp;gt;&lt;br /&gt;  &amp;lt;param name=&amp;quot;Version&amp;quot; style=&amp;quot;query&amp;quot; fixed=&amp;quot;2005-07-26&amp;quot;/&amp;gt;&lt;br /&gt;  &amp;lt;param name=&amp;quot;Operation&amp;quot; style=&amp;quot;query&amp;quot; fixed=&amp;quot;ItemSearch&amp;quot;/&amp;gt;&lt;br /&gt;  &amp;lt;param name=&amp;quot;SubscriptionId&amp;quot; style=&amp;quot;query&amp;quot;&lt;br /&gt;   type=&amp;quot;xsd:string&amp;quot; required=&amp;quot;true&amp;quot;/&amp;gt;&lt;br /&gt;  &amp;lt;param name=&amp;quot;SearchIndex&amp;quot; style=&amp;quot;query&amp;quot;&lt;br /&gt;   type=&amp;quot;aws:SearchIndexType&amp;quot; required=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;    &amp;lt;option value=&amp;quot;Books&amp;quot;/&amp;gt;&lt;br /&gt;    &amp;lt;option value=&amp;quot;DVD&amp;quot;/&amp;gt;&lt;br /&gt;    &amp;lt;option value=&amp;quot;Music&amp;quot;/&amp;gt;&lt;br /&gt;  &amp;lt;/param&amp;gt;&lt;br /&gt;  &amp;lt;param name=&amp;quot;Keywords&amp;quot; style=&amp;quot;query&amp;quot;&lt;br /&gt;   type=&amp;quot;aws:KeywordList&amp;quot; required=&amp;quot;true&amp;quot;/&amp;gt;&lt;br /&gt;  &amp;lt;param name=&amp;quot;ResponseGroup&amp;quot; style=&amp;quot;query&amp;quot;&lt;br /&gt;   type=&amp;quot;aws:ResponseGroupType&amp;quot; repeating=&amp;quot;true&amp;quot;&amp;gt;&lt;br /&gt;    &amp;lt;option value=&amp;quot;Small&amp;quot;/&amp;gt;&lt;br /&gt;    &amp;lt;option value=&amp;quot;Medium&amp;quot;/&amp;gt;&lt;br /&gt;    &amp;lt;option value=&amp;quot;Large&amp;quot;/&amp;gt;&lt;br /&gt;    &amp;lt;option value=&amp;quot;Images&amp;quot;/&amp;gt;&lt;br /&gt;  &amp;lt;/param&amp;gt;&lt;br /&gt; &amp;lt;/request&amp;gt;&lt;br /&gt; &amp;lt;response&amp;gt;&lt;br /&gt;  &amp;lt;representation mediaType=&amp;quot;text/xml&amp;quot;&lt;br /&gt;   element=&amp;quot;aws:ItemSearchResponse&amp;quot;/&amp;gt;&lt;br /&gt; &amp;lt;/response&amp;gt;&lt;br /&gt;&amp;lt;/method&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Come puoi vedere, il formato è molto più self-explanatory, ed arricchisce il REST con alcune aggiunte come la tipizzazione safety usando i tipi dell' Xml schema.&lt;br /&gt;&lt;br /&gt;L' intero documento è lungo solo 10 righe in più di quello precedente (include i namespace dell' XML, importa le grammatiche degli schema, etc. ) e può essere trovato nelle specifiche WADL.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Usare REST con php&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;Richieste GET&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Moderne versioni di PHP rendono insignificante la richiesta di pagine web : ogni funzione che accede ai file funziona in maniera analoga con gli URL. Così si può usare fopen, file_get_contents, o ogni altro tipo di comando eseguendo una richiesta GET. Ad esempio : &lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="Java"&gt;$url = "http://www.acme.com/products/3322";&lt;br /&gt;$response = file_get_contents($url);&lt;br /&gt;echo $response;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Ogni parametro passato a richieste GET deve essere encodato. Si possono encodare stringhe usando la funzione &lt;span style="font-style:italic;"&gt;urlencode&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;Richieste POST&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;In forte contrasto alla facilità con cui fare una richiesta GET, non c'è un modo semplice per farlo via POST in php.&lt;br /&gt;E' necessario aprire una connessione con il server e manualmente inviare tutti gli headers HTTP. Qui c'è una semplice funzione che fà tutto il lavoro per ogni metodo HTTP : &lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="Java"&gt;function httpRequest($host, $port, $method, $path, $params) {&lt;br /&gt;  // Params are a map from names to values&lt;br /&gt;  $paramStr = "";&lt;br /&gt;  foreach ($params as $name, $val) {&lt;br /&gt;    $paramStr .= $name . "=";&lt;br /&gt;    $paramStr .= urlencode($val);&lt;br /&gt;    $paramStr .= "&amp;";&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  // Assign defaults to $method and $port, if needed&lt;br /&gt;  if (empty($method)) {&lt;br /&gt;    $method = 'GET';&lt;br /&gt;  }&lt;br /&gt;  $method = strtoupper($method);&lt;br /&gt;  if (empty($port)) {&lt;br /&gt;    $port = 80; // Default HTTP port&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  // Create the connection&lt;br /&gt;  $sock = fsockopen($host, $port);&lt;br /&gt;  if ($method == "GET") {&lt;br /&gt;    $path .= "?" . $data;&lt;br /&gt;  }&lt;br /&gt;  fputs($sock, "$method $path HTTP/1.1\r\n");&lt;br /&gt;  fputs($sock, "Host: $host\r\n");&lt;br /&gt;  fputs($sock, "Content-type: " .&lt;br /&gt;               "application/x-www-form-urlencoded\r\n");&lt;br /&gt;  if ($method == "POST") {&lt;br /&gt;    fputs($sock, "Content-length: " . &lt;br /&gt;                 strlen($paramStr) . "\r\n");&lt;br /&gt;  }&lt;br /&gt;  fputs($sock, "Connection: close\r\n\r\n");&lt;br /&gt;  if ($method == "POST") {&lt;br /&gt;    fputs($sock, $paramStr);&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  // Buffer the result&lt;br /&gt;  $result = "";&lt;br /&gt;  while (!feof($sock)) {&lt;br /&gt;    $result .= fgets($sock,1024);&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  fclose($sock);&lt;br /&gt;  return $result;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Eseguire una richiesta POST usando questa funzione è semplice come : &lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="Java"&gt;$resp = httpRequest("www.acme.com",&lt;br /&gt;    80, "POST", "/userDetails",&lt;br /&gt;    array("firstName" =&gt; "John", "lastName" =&gt; "Doe"));&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Un alternativa a questo approccio è usando il supporto ai CURL di PHP.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Usare REST con Java&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Bisognerebbe partire con la spiegazione di come eseguire richieste mediante le classi base come &lt;span style="font-style:italic;"&gt;HttpURLConnection&lt;/span&gt;, però ritengo sia molto più utile utilizzare le &lt;a href="http://commons.apache.org/"&gt;Apache Commons library&lt;/a&gt; ed in particolare i packages &lt;span style="font-style:italic;"&gt;httpclient&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;Richieste GET&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="Java"&gt;String request = "http://api.search.yahoo.com/WebSearchService/V1/webSearch?appid=YahooDemo&amp;query=umbrella&amp;results=10";&lt;br /&gt;HttpClient client = new HttpClient();&lt;br /&gt;GetMethod method = new GetMethod(request);&lt;br /&gt;// Send GET request&lt;br /&gt;int statusCode = client.executeMethod(method);&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;In questo modo con qualche riga di codice eseguiamo una richiesta GET ed otteniamo lo statusCode del risultato della stessa.&lt;br /&gt;Adesso vediamo come processare la risposta:&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="Java"&gt;InputStream rstream = null;&lt;br /&gt;rstream = method.getResponseBodyAsStream();&lt;br /&gt;BufferedReader br = new BufferedReader(new InputStreamReader(rstream));&lt;br /&gt;String line;&lt;br /&gt;while ((line = br.readLine()) != null) {&lt;br /&gt; System.out.println(line);&lt;br /&gt;}&lt;br /&gt;br.close();&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Naturalmente è possibile usare strumenti per eseguire il marshalling dell' xml... &lt;br /&gt;Per questo stò preparando un tutorial.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;Richieste POST&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Le richeiste post sono usate dai browser web quando eseguono il submit di dati con le form HTML. Il content type di tipo "multipart/form-data" può essere usato per eseguire il submit  di form che contengono files, dati non-ASCII e dati binary.&lt;br /&gt;Per le richieste POST, costruiamo i dati POST separatamente dall' URL.&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="Java"&gt;String request = "http://api.search.yahoo.com/WebSearchService/V1/webSearch";&lt;br /&gt;HttpClient client = new HttpClient();&lt;br /&gt;PostMethod method = new PostMethod(request);&lt;br /&gt;// Add POST parameters&lt;br /&gt;method.addParameter("appid","YahooDemo");&lt;br /&gt;method.addParameter("query","umbrella");&lt;br /&gt;method.addParameter("results","10");&lt;br /&gt;// Send POST request&lt;br /&gt;int statusCode = client.executeMethod(method);&lt;br /&gt;InputStream rstream = null;    &lt;br /&gt;// Get the response body&lt;br /&gt;rstream = method.getResponseBodyAsStream();&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;Richieste POST con i socket&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;E' possibile anche eseguire le richieste post utilizzando i socket...Vediamo un esempio : &lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="Java"&gt;// Create POST data string&lt;br /&gt;String postdata = "appid" + "=" + URLEncoder.encode("YahooDemo", "UTF-8");&lt;br /&gt;postdata += "&amp;" + "query" + "=" + URLEncoder.encode("umbrella", "UTF-8");&lt;br /&gt;postdata += "&amp;" + "results" + "=" + URLEncoder.encode("10", "UTF-8");&lt;br /&gt;// Create a socket to the host&lt;br /&gt;String hostname = "api.search.yahoo.com";&lt;br /&gt;int port = 80;&lt;br /&gt;InetAddress addr = InetAddress.getByName(hostname);&lt;br /&gt;Socket socket = new Socket(addr, port);&lt;br /&gt;// Send header&lt;br /&gt;String path = "/WebSearchService/V1/webSearch";&lt;br /&gt;BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream(), "UTF8"));&lt;br /&gt;bw.write("POST " + path + " HTTP/1.0\r\n");&lt;br /&gt;bw.write("Content-Length: " + postdata.length() + "\r\n");&lt;br /&gt;bw.write("Content-Type: application/x-www-form-urlencoded\r\n");&lt;br /&gt;bw.write("\r\n"); &lt;br /&gt;// Send POST data string&lt;br /&gt;bw.write(postdata);&lt;br /&gt;bw.flush();&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;La fonte dell'articolo in inglese potete trovarla al seguente &lt;a href="http://rest.elkstein.org/"&gt;link&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4104693577726899381-4696998195563410921?l=franziale.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://franziale.blogspot.com/feeds/4696998195563410921/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4104693577726899381&amp;postID=4696998195563410921' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4104693577726899381/posts/default/4696998195563410921'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4104693577726899381/posts/default/4696998195563410921'/><link rel='alternate' type='text/html' href='http://franziale.blogspot.com/2009/06/tutorial-cose-rest.html' title='Tutorial : Cos&apos; è REST ?'/><author><name>Alessandro Franzi</name><uri>http://www.blogger.com/profile/08478173128603059576</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_Ds8LLsbVUlc/SNa0YcPXutI/AAAAAAAAAAM/D3DZA5UBU-4/S220/go_with_the_flow_281x211.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4104693577726899381.post-4370306776237924963</id><published>2009-06-14T20:14:00.000+02:00</published><updated>2009-06-14T20:48:44.525+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Mac OS X'/><category scheme='http://www.blogger.com/atom/ns#' term='GIT'/><title type='text'>Installare GIT su Mac Os x 10.5</title><content type='html'>&lt;span style="font-weight:bold;"&gt;Cos' è GIT&lt;/span&gt;&lt;br /&gt;Git è un progetto Open Souce ed in particolare è un sistema per il controllo del versioning distribuito.&lt;br /&gt;Lo scopo di utilizzare GIT è quello di permettere la gestione di progetti di grandi o piccole dimensioni con velocità ed efficenza.&lt;br /&gt;Ogni clonde di Git è un repository completo di una propria history ed un tracking delle revision completo, indipendente dagli accessi di rete su un sistema centrale.&lt;br /&gt;&lt;br /&gt;Vediamo in pochi passi come configurare GIT sul tuo sistema Mac Os X 10.5&lt;br /&gt;&lt;span id="fullpost"&gt;&lt;br /&gt;Il primo passo è quello di scaricare &lt;span style="font-weight:bold;"&gt;GnuPG&lt;/span&gt; dal link : &lt;a href="ftp://ftp.gnupg.org/gcrypt/gnupg/gnupg-1.4.7.tar.bz2"&gt;ftp://ftp.gnupg.org/gcrypt/gnupg/gnupg-1.4.7.tar.bz2&lt;/a&gt;.&lt;br /&gt;Dopo aver scaricato il pacchetto è necessario decomprimerlo ed installarlo con i seguenti comandi:&lt;br /&gt;&lt;pre name="code" class="Java"&gt;&lt;br /&gt;tar -xjvf gnupg-1.4.7.tar.bz2&lt;br /&gt;cd gnupg-1.4.7&lt;br /&gt;./configure&lt;br /&gt;make&lt;br /&gt;sudo make install&lt;br /&gt;cd ..&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Dopo aver installato GnuPG è necessario passare all'installazione di &lt;span style="font-weight:bold;"&gt;GetText&lt;/span&gt; che potrete trovare al link : &lt;a href="http://mirrors.usc.edu/pub/gnu/gettext/gettext-0.17.tar.gz"&gt;http://mirrors.usc.edu/pub/gnu/gettext/gettext-0.17.tar.gz&lt;/a&gt;.&lt;br /&gt;Dopo averlo scaricato è necessario decomprimere e installare anch'esso mediante i seguenti comandi:&lt;br /&gt;&lt;pre name="code" class="Java"&gt;&lt;br /&gt;tar xvf gettext-0.17.tar&lt;br /&gt;cd gettext-0.17&lt;br /&gt;./configure&lt;br /&gt;make&lt;br /&gt;sudo make install&lt;br /&gt;cd ..&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Dopo aver installato GetText passiamo al passo finale e quindi all'installazione di &lt;span style="font-weight:bold;"&gt;GIT&lt;/span&gt;.&lt;br /&gt;E' possibile scaricare il pacchetto per l'installazione al link :&lt;a href="http://kernel.org/pub/software/scm/git/git-1.5.5.tar.bz2"&gt;http://kernel.org/pub/software/scm/git/git-1.5.5.tar.bz2&lt;/a&gt;.&lt;br /&gt;Dopo averlo scaricato eseguiamo i seguenti comandi per l'installazione:&lt;br /&gt;&lt;pre name="code" class="Java"&gt;&lt;br /&gt;tar -xjvf git-1.5.5.tar.bz2&lt;br /&gt;cd git-1.5.5&lt;br /&gt;./configure&lt;br /&gt;make&lt;br /&gt;sudo make install&lt;br /&gt;cd ..&lt;br /&gt;curl  http://www.kernel.org/pub/software/scm/git/git-manpages-1.5.5.tar.bz2  \&lt;br /&gt;sudo tar xj -C /usr/local/share/man&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Dopodichè eseguire in cascata tutti questi comandi :&lt;br /&gt;&lt;pre name="code" class="Java"&gt;&lt;br /&gt;# you&lt;br /&gt;git config --global user.name "Mr Man"&lt;br /&gt;git config --global user.email "mr@man.com"&lt;br /&gt;&lt;br /&gt;# colors&lt;br /&gt;&lt;br /&gt;git config --global color.diff auto&lt;br /&gt;git config --global color.status auto&lt;br /&gt;git config --global color.branch auto&lt;br /&gt;git config --global color.interactive auto&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;# shortcuts&lt;br /&gt;git config --global alias.st status&lt;br /&gt;git config --global alias.ci commit&lt;br /&gt;git config --global alias.co checkout&lt;br /&gt;git config --global alias.br branch&lt;br /&gt;&lt;br /&gt;# if you ever have conflicts you can type git-mergetool&lt;br /&gt;# to use Apple opendiff (FileMerge) for resolving conflicts&lt;br /&gt;git config --global merge.tool opendiff&lt;br /&gt;# Whenever we merge provide a summary of commits&lt;br /&gt;git config --global merge.summary true&lt;br /&gt;&lt;br /&gt;# globally ignore some cruft files&lt;br /&gt;git config --global core.excludesfile ~/.gitignore&lt;br /&gt;echo "*~" &gt;~/.gitignore&lt;br /&gt;echo ".DS_Store" &gt;&gt;~/.gitignore&lt;br /&gt;&lt;br /&gt;# setup nice fonts on gitk&lt;br /&gt;cat &gt;~/.gitk &lt;&lt;\EOF&lt;br /&gt;set mainfont {Monaco 10}&lt;br /&gt;set textfont {Monaco 10}&lt;br /&gt;set uifont {Monaco 10}&lt;br /&gt;EOF&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Dopo l'esecuzione di questi semplici passi il tuo MAC è configurato per poter usare GIT.&lt;br /&gt;&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/4104693577726899381-4370306776237924963?l=franziale.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://franziale.blogspot.com/feeds/4370306776237924963/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4104693577726899381&amp;postID=4370306776237924963' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4104693577726899381/posts/default/4370306776237924963'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4104693577726899381/posts/default/4370306776237924963'/><link rel='alternate' type='text/html' href='http://franziale.blogspot.com/2009/06/installare-git-su-mac-os-x-105.html' title='Installare GIT su Mac Os x 10.5'/><author><name>Alessandro Franzi</name><uri>http://www.blogger.com/profile/08478173128603059576</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_Ds8LLsbVUlc/SNa0YcPXutI/AAAAAAAAAAM/D3DZA5UBU-4/S220/go_with_the_flow_281x211.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4104693577726899381.post-9025327211575473358</id><published>2009-06-08T13:41:00.000+02:00</published><updated>2009-06-18T17:16:05.509+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Anatomia'/><category scheme='http://www.blogger.com/atom/ns#' term='android'/><title type='text'>Anatomia di un applicazione Android</title><content type='html'>Ci sono 4 blocchi fondamentali in un applicazione Android:&lt;br /&gt;&lt;br /&gt;    * Activity&lt;br /&gt;    * Intent Receiver&lt;br /&gt;    * Service&lt;br /&gt;    * Content Provider&lt;br /&gt;&lt;br /&gt;Naturalmente la maggiorparte delle applicazioni non sviluppano tutti e 4 i blocchi, ma con una qualsiasi combinazione degli stessi.&lt;br /&gt;&lt;br /&gt;Dopo aver deciso quali componenti sono necessari per la tua applicazione, è necessario elencarli in un file chiamato &lt;span style="font-style:italic;"&gt;AndroidManifest.xml&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;E' un file XML dove vengono dichiarate le componenti di un' applicazione e quali sono i relativi requisiti e capacità. Per poterne sapere di più è possibile guardare la documentazione relativa al file di manifest di Android.&lt;br /&gt;&lt;br /&gt;Vediamo i 4 macro blocchi in dettaglio...&lt;br /&gt;&lt;br /&gt;&lt;span id="fullpost"&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Activity&lt;/span&gt;&lt;br /&gt;Le Activities sono le componenti più comuni presenti tra i 4 blocchi.&lt;br /&gt;Un attività è di solito una schermata di un' applicazione.&lt;br /&gt;Ogni attività è implementata in una singola classe che estende la classe base &lt;span style="font-style:italic;"&gt;Activity&lt;/span&gt;.&lt;br /&gt;La tua classe visualizzerà una User Interface composta da &lt;span style="font-style:italic;"&gt;Views &lt;/span&gt; e risponderà a degli eventi.&lt;br /&gt;La maggiorparte delle applicazioni sono composte da molteplici schermate.&lt;br /&gt;Ad esempio un applicazione per l'invio di messaggi avrà una schermata in cui si avrà a disposizione l'elenco dei contatti a cui poter inviare il messaggio, una seconda scermata in cui si eseguirà la scrittura vera e propria del messaggio e schermate in cui modificare i setting o consultare la lista di messaggi in ingresso.&lt;br /&gt;&lt;br /&gt;Ciascuna di queste schermate sarà implementata come un attività.&lt;br /&gt;Muoversi su un altra schermata consisterà allo START di una nuova attività.&lt;br /&gt;In alcuni casi un attività può restituire un valore all' attività precedente.&lt;br /&gt;&lt;br /&gt;Quando viene aperta una nuova schermata, quella precedente viene messa in pausa ed inserita all'interno di un &lt;span style="font-style:italic;"&gt;history stack&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;L'utente potrà navigare indietro mediante questa history. Si può inoltra forzare l'eliminazione di una attitivà dall' history stack nel caso in cui non si ritenesse appropriata la relativa permanenza.&lt;br /&gt;Android mantiene uno stack per ogni applicazione lanciata dalla schermata HOME.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Intent and Intent Filters&lt;/span&gt;&lt;br /&gt;Android usa una classe speciale chiamata &lt;span style="font-weight:bold;"&gt;Intent&lt;/span&gt; per muoversi da una schermata all'altra.&lt;br /&gt;Un intent descrive cosa vuole fare un applicazione. Le due parti più importanti della struttura dati di un intent sono le azioni e i dati su cui si basano.&lt;br /&gt;Tipicalmente valori per le azioni sono MAIN (la pagina principale delle attività), VIEW, PICK, EDIT, etc.&lt;br /&gt;I dati sono espressi come URI. &lt;br /&gt;Per esempio, per visualizzare le informazioni di un contatto, si dovrà creare un intent con l'azione VIEW e i dati settati all'interno dell' URI che rappresentano la persona.&lt;br /&gt;&lt;br /&gt;C'è una classe connessa chiamata &lt;span style="font-weight:bold;"&gt;IntentFilter&lt;/span&gt;.&lt;br /&gt;Mentre un intent è effettivamente una richiesta di eseguire qualcosa, un intent filter è una descrizione di quali intents un attività è capace di gestire.&lt;br /&gt;Un attività che è capace di visualizzare le informazioni di un contatto pubblicherà un IntentFilter che dice che essa conosce il modo di gestire l'azione VIEW che verrà applicata ai dati per rappresentare la persona. Le attività pubblicano i propri IntentFilters nel file &lt;span style="font-style:italic;"&gt;AndroidManifest.xml&lt;/span&gt;.&lt;br /&gt;Navigare da schermata a schermata è compiuto risolvendo gli intents.&lt;br /&gt;Per navigare in avanti, un attività chiama il metodo &lt;span style="font-style:italic;"&gt;startActivity(myIntent)&lt;/span&gt;.&lt;br /&gt;Il sistema cerca l'intent filter tra tutte le applicazioni installate e prende quello che ha il miglior match con myIntent.&lt;br /&gt;La nuova activity verrà informata dell'intent, che causerà la propria esecuzione.&lt;br /&gt;Il processo di risoluzione degli intent viene eseguito a run time quando la startActivity viene chiamata e questo offre 2 benefici:&lt;br /&gt;* Le attività possono riusare funzionalità da altre componenti semplicemente eseguendo una richiesta mediante una Intent.&lt;br /&gt;* Le attività possono essere rimpiazzare in ogni istante da un Activity con lo stesso IntentFilter.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Intent Receiver&lt;/span&gt;&lt;br /&gt;Puoi usare un &lt;span style="font-weight:bold;"&gt;IntentReceiver&lt;/span&gt; quando desideri eseguire qualcosa nella tua applicazione in relazione ad un evento esterno. Per esempio, quando il telefono suona, oppure quando una rete è disponibile, oppure quando è mezzanotte. Gli intent receivers non visualizzano una UI, sebbene esse possano usare il &lt;span style="font-style:italic;"&gt; NotificationManager &lt;/span&gt; per alertare l'utente che qualcosa di interessante stà succedendo.&lt;br /&gt;&lt;br /&gt;Gli Intent receivers sono registrati sempre nel file &lt;span style="font-style:italic;"&gt;AndroidManifest.xml&lt;/span&gt;, ma si possono registrare tramite il codice mediante l'uso dell'istruzione:&lt;br /&gt;&lt;pre name="code" class="Java"&gt;Context.registerReceiver();&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;La tua applicazione non deve essere in esecuzione per ricevere delle chiamate agli intent receivers.&lt;br /&gt;Il sistema eseguirà la tua applicazione, se necessario, quando l'event receiver viene triggerato.&lt;br /&gt;&lt;br /&gt;Le applicazioni possono anche inviare il proprio intent in broadcast alle altre applicazioni mediante l'istruzione:&lt;br /&gt;&lt;pre name="code" class="Java"&gt; Context.broadcastIntent();&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Service&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Un &lt;span style="font-weight:bold;"&gt;Service&lt;/span&gt; è un codice che è in esecuzione come long-lived e viene eseguito senza una UI.&lt;br /&gt;Un buon esempio è il media player che riproduce delle canzoni da una play list.&lt;br /&gt;Mediante una schermata l'utente potrà scegliere i brani da inserire o eliminare dalla playlist. Ma l'utente vorrà anche uscire da questa gestione, in questo caso l'attività del player potrà eseguire un nuovo servizio usando l'istruzione : &lt;br /&gt;&lt;pre name="code" class="Java"&gt;Context.startService();&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;In questo modo il servizio sarà eseguito in background per poter continuare l'esecuzione della musica.&lt;br /&gt;Il sistema quindi continuerà ad eseguire il servizio finchè esso avrà necessità di essere eseguito.&lt;br /&gt;Nota che è possibile connettersi ad un servizio (e farlo partire se esso non è ancora in esecuzione) mediante il comando:&lt;br /&gt;&lt;pre name="code" class="Java"&gt;Context.bindService();&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Quando si è connessi con un service, puoi comunicare con esso mediante una serie di interfaccie esposte dal servizio.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Content Provider&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Le applicazioni possono immagazzinare i dati in files, in un database SQLite, o mediante qualsiasi altro meccanismo abbia senso utilizzare.&lt;br /&gt;Un content provider, comunque, è utile nel caso si voglia che i dati della propria applicazione siano condivisi con altre applicazioni. Un content provider è una classe che implementa un set standard di metodi per permettere alle altre applicazioni di salvare o utilizzare i tipi di dati che sono gestiti dal content provider.&lt;br /&gt;&lt;br /&gt;Spero che questo post sia stato utile...buon divertimento :|&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/4104693577726899381-9025327211575473358?l=franziale.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://franziale.blogspot.com/feeds/9025327211575473358/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4104693577726899381&amp;postID=9025327211575473358' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4104693577726899381/posts/default/9025327211575473358'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4104693577726899381/posts/default/9025327211575473358'/><link rel='alternate' type='text/html' href='http://franziale.blogspot.com/2009/06/anatomia-di-un-applicazione-android.html' title='Anatomia di un applicazione Android'/><author><name>Alessandro Franzi</name><uri>http://www.blogger.com/profile/08478173128603059576</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_Ds8LLsbVUlc/SNa0YcPXutI/AAAAAAAAAAM/D3DZA5UBU-4/S220/go_with_the_flow_281x211.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4104693577726899381.post-4596882960699132506</id><published>2009-05-15T11:38:00.000+02:00</published><updated>2009-05-15T11:46:18.987+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='android'/><category scheme='http://www.blogger.com/atom/ns#' term='ripristino'/><title type='text'>Eseguire un backup completo del sistema Android</title><content type='html'>Il "googleFonino" per quanto stupendo, potente, figo sia naturalmente permettendo l'installazione di applicazioni al di fuori del google Market è soggetto e sarà soggetto come qualsiasi altro dispositivo a problemi legati a software non affidabile.&lt;br /&gt;In questo articolo descriverò brevemente come poter eseguire di tanto in tanto un backup del tuo telefonino in maniera tale da poterlo ripristinare con facilità ad uno stato sicuramente funzionante.&lt;br /&gt;&lt;span id="fullpost"&gt;&lt;br /&gt;E'  necessario innanzitutto far partire android in &lt;span style="font-weight:bold;"&gt;Recovery mode&lt;/span&gt; (HOME+pulsante di accensione) da spento.&lt;br /&gt;Dopo questo primo passo è necessario eseguire un backup (ALT+B)&lt;br /&gt;Nel caso ti interessasse avere maggiori informazioni sullà modalità di recoveri puoi istruirti tramite questo &lt;a href="http://www.androidiani.com/wiki/RecoveryMode"&gt;link&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Una volta che nandroid ha eseguito il backup sulla sd, basta recuperare i files dal telefonino e copiarli sul proprio pc.&lt;br /&gt;&lt;br /&gt;Scaricati fastboot.exe, e lo usi con i files di nandroid tramite i seguenti comandi:&lt;br /&gt;&lt;pre name="code" class="Java"&gt;&lt;br /&gt;fastboot.exe flash boot boot.img&lt;br /&gt;fastboot.exe flash recovery recovery.img&lt;br /&gt;fastboot.exe flash system system.img&lt;br /&gt;fastboot.exe flash userdata data.img&lt;br /&gt;fastboot.exe flash cache cache.img&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Spero che questo post sia stato utile a molti di voi androidiani. &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/4104693577726899381-4596882960699132506?l=franziale.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://franziale.blogspot.com/feeds/4596882960699132506/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4104693577726899381&amp;postID=4596882960699132506' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4104693577726899381/posts/default/4596882960699132506'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4104693577726899381/posts/default/4596882960699132506'/><link rel='alternate' type='text/html' href='http://franziale.blogspot.com/2009/05/eseguire-un-backup-completo-del-sistema.html' title='Eseguire un backup completo del sistema Android'/><author><name>Alessandro Franzi</name><uri>http://www.blogger.com/profile/08478173128603059576</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_Ds8LLsbVUlc/SNa0YcPXutI/AAAAAAAAAAM/D3DZA5UBU-4/S220/go_with_the_flow_281x211.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4104693577726899381.post-4004846919950431534</id><published>2009-04-08T21:53:00.000+02:00</published><updated>2009-04-08T22:50:41.720+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Javascript'/><category scheme='http://www.blogger.com/atom/ns#' term='Mootools'/><category scheme='http://www.blogger.com/atom/ns#' term='Anchor'/><title type='text'>Scrolling fluido sugli anchor usando i Mootools</title><content type='html'>Una delle funzionalità implementate dai more dei &lt;a href="http://mootools.net/more"&gt;mootools-more&lt;/a&gt; è quella legata al modulo &lt;span style="font-weight:bold;"&gt;SmoothScroll&lt;/span&gt;.&lt;br /&gt;I mootools infatti hanno prestato parecchia attenzione allo sviluppo delle funzionalità legata al “Fx” all'interno del proprio framework.&lt;br /&gt;&lt;br /&gt;Gli ancoraggi all'interno delle pagine HTML sono molto importanti, permettono infatti di poter accedere in maniera istantanea a determinati contenuti sommersi della marea di informazioni contenute nella pagina.&lt;br /&gt;&lt;br /&gt;Un altro esempio di ancoraggio è quello che permette di poter accedere al "top" della pagina senza dover forzare l'utente a dover scrollare per tutta la lunghezza della stessa. Il problema è che in maniera nativa questa funzionalità è troppo istantanea, infatti la pagina esegue un salto immediato che trasmette all'utente una sorta di risveglio immediato da quello che può essere il relax trasmesso della pagina.&lt;br /&gt;&lt;br /&gt;Per questo in questo post si vuole suggerire un modo mediante cui eseguire uno scrolling fluido e graduale della pagina quando si clicca sugli ancoraggi.&lt;br /&gt;&lt;br /&gt;La potenza stà nel fatto che l'html da inserire nella pagina è lo stesso che inseriremmo in una normale situazione di utilizzo degli ancoraggi.&lt;br /&gt;Esempio;&lt;br /&gt;&lt;pre name="code" class="java"&gt;&amp;lt;a href=&amp;quot;#top&amp;quot; &amp;gt;Top&amp;lt;/a&amp;gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Questo è il codice da inserire nella vostra pagina per ottenere l'effetto desiderato su tutti gli ancoraggi.&lt;br /&gt;&lt;pre name="code" class="java"&gt;window.addEvent('load', function() { new SmoothScroll({ duration: 1800 }); }); &lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;E' necessario importare all'interno della pagina 2 file javascript:&lt;br /&gt;- Il core dei mootools&lt;br /&gt;- il more dei mootools contenente il plugin &lt;a href="http://mootools.net/docs/Plugins/Assets"&gt;Asset&lt;/a&gt;&lt;br /&gt;I 2 files sono disponibili &lt;a href="http://www.franziale.netsons.org/src/js/mootools/mootools-1.2.1-core-nc.js"&gt;qui (core)&lt;/a&gt; e &lt;a href="http://www.franziale.netsons.org/src/js/mootools/mootools-1.2-more.js"&gt;qui (more)&lt;/a&gt;.&lt;br /&gt;&lt;pre name="code" class="java"&gt;&amp;lt;script type=&amp;quot;text/javascript&amp;quot; language=&amp;quot;JavaScript&amp;quot; src=&amp;quot;http://www.franziale.netsons.org/src/js/mootools/mootools-1.2.1-core-nc.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;&amp;lt;script type=&amp;quot;text/javascript&amp;quot; language=&amp;quot;JavaScript&amp;quot; src=&amp;quot;http://www.franziale.netsons.org/src/js/mootools/mootools-1.2-more.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;E' possibile trovare un esempio di questa funizionalità a questo link &lt;a href="http://www.franziale.netsons.org/mootoolsSmoother.php"&gt;Ancoraggi fluidi&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4104693577726899381-4004846919950431534?l=franziale.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://franziale.blogspot.com/feeds/4004846919950431534/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4104693577726899381&amp;postID=4004846919950431534' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4104693577726899381/posts/default/4004846919950431534'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4104693577726899381/posts/default/4004846919950431534'/><link rel='alternate' type='text/html' href='http://franziale.blogspot.com/2009/04/scrolling-fluido-su-anchor-usando-i.html' title='Scrolling fluido sugli anchor usando i Mootools'/><author><name>Alessandro Franzi</name><uri>http://www.blogger.com/profile/08478173128603059576</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_Ds8LLsbVUlc/SNa0YcPXutI/AAAAAAAAAAM/D3DZA5UBU-4/S220/go_with_the_flow_281x211.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4104693577726899381.post-6651111018646475417</id><published>2009-03-31T00:02:00.000+02:00</published><updated>2009-03-31T01:05:41.976+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='Charset'/><category scheme='http://www.blogger.com/atom/ns#' term='JVM'/><title type='text'>Recuperare Charset di default della Java Virtual Machine (JVM)</title><content type='html'>A volte in fase di compilazione si può incorrere in problemi di charset, specialmente se si sviluppa in ambienti eterogenei (Linux, Windows, Unix). &lt;br /&gt;A volte si incorre in classi Java compilate con virtual machine che utilizzano charset diverse, causando problemi nelle stringhe che contengono caratteri speciali.&lt;br /&gt;Il metodo mediante cui è possibile riconoscere il charset utilizzato dalla Virtual Machine per compilare è il seguente.&lt;br /&gt;&lt;span id="fullpost"&gt;&lt;br /&gt;Questo esempio presenta una sezione compatibile con la versione 1.4 della jdk ed un altra con la 1.5. Per poter eseguire lo script è necessario commentare la sezione non interessata.&lt;br /&gt;&lt;pre name="code" class="Java"&gt;public class Hello {&lt;br /&gt; public static void main(String args[]) throws Exception{&lt;br /&gt;  // not crossplateform safe&lt;br /&gt;  System.out.println(System.getProperty("file.encoding"));&lt;br /&gt;  // jdk1.4&lt;br /&gt;  System.out.println(&lt;br /&gt;     new java.io.OutputStreamWriter(&lt;br /&gt;        new java.io.ByteArrayOutputStream()).getEncoding()&lt;br /&gt;     );&lt;br /&gt;  // jdk1.5&lt;br /&gt;  System.out.println(java.nio.charset.Charset.defaultCharset().name());&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;L'output sarà del tipo:&lt;br /&gt;&lt;pre&gt;&amp;gt;java Hello&lt;br /&gt;Cp1252&lt;br /&gt;Cp1252&lt;br /&gt;windows-1252&lt;br /&gt;&lt;/pre&gt;&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/4104693577726899381-6651111018646475417?l=franziale.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://franziale.blogspot.com/feeds/6651111018646475417/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4104693577726899381&amp;postID=6651111018646475417' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4104693577726899381/posts/default/6651111018646475417'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4104693577726899381/posts/default/6651111018646475417'/><link rel='alternate' type='text/html' href='http://franziale.blogspot.com/2009/03/recuperare-charset-di-default-della.html' title='Recuperare Charset di default della Java Virtual Machine (JVM)'/><author><name>Alessandro Franzi</name><uri>http://www.blogger.com/profile/08478173128603059576</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_Ds8LLsbVUlc/SNa0YcPXutI/AAAAAAAAAAM/D3DZA5UBU-4/S220/go_with_the_flow_281x211.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4104693577726899381.post-828914087610188374</id><published>2009-03-30T23:12:00.000+02:00</published><updated>2009-03-30T23:17:32.456+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Javascript'/><category scheme='http://www.blogger.com/atom/ns#' term='ActionScript'/><category scheme='http://www.blogger.com/atom/ns#' term='Flash'/><title type='text'>Chiamare Javascript da filmato Flash</title><content type='html'>Potrebbe risultare utile dover chiamare una funzione javascript da un filmato flash.&lt;br /&gt;Tale azione può essere associata ad un evento o richiamata alla fine dell'esecuzione del filmato in base alle esigenze dello sviluppatore.&lt;br /&gt;&lt;br /&gt;Di seguito potete trovare un esempio di actionScript da includere in un qualunque frame del vostro flash:&lt;br /&gt;&lt;span id="fullpost"&gt;&lt;br /&gt;&lt;pre name="code" class="Java"&gt;function runJS(script:String):Void {&lt;br /&gt; getURL("javascript:" +  script + "");&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;var js = "var doc = document.URL; alert(doc);";&lt;br /&gt;runJS(js);&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Nell' esempio viene richiamata la funzione alert, ma è possibile richiamare qualsiasi funzione dichiarata nel documento.&lt;br /&gt;Questo risulterà senz'altro utile per chi ha a che fare con entrambe le tecnologie all'interno della propria applicazione web.&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/4104693577726899381-828914087610188374?l=franziale.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://franziale.blogspot.com/feeds/828914087610188374/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4104693577726899381&amp;postID=828914087610188374' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4104693577726899381/posts/default/828914087610188374'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4104693577726899381/posts/default/828914087610188374'/><link rel='alternate' type='text/html' href='http://franziale.blogspot.com/2009/03/chiamare-javascript-da-filmato-flash.html' title='Chiamare Javascript da filmato Flash'/><author><name>Alessandro Franzi</name><uri>http://www.blogger.com/profile/08478173128603059576</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_Ds8LLsbVUlc/SNa0YcPXutI/AAAAAAAAAAM/D3DZA5UBU-4/S220/go_with_the_flow_281x211.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4104693577726899381.post-8215407525577055904</id><published>2009-03-15T21:30:00.000+01:00</published><updated>2009-03-15T21:48:54.711+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='Padding'/><title type='text'>Padding di una stringa in Java</title><content type='html'>Questo post ha come scopo quello di illustrare una possibile implementazione della funzionalità di padding per le stringhe in Java.&lt;br /&gt;In questo esempio la funzionalità di padding è una funzione generica in cui è possibile specificare come parametri di input le seguenti informazioni :&lt;br /&gt;- Stringa di cui effettuare il padding&lt;br /&gt;- Carattere o stringa con cui eseguire il padding&lt;br /&gt;- Numero di caratteri della stringa di output&lt;br /&gt;- Orientamento del padding (sinistra, destra)&lt;br /&gt;Ecco l'implementazione:&lt;br /&gt;&lt;pre name="code" class="Java"&gt;public class Padding {&lt;br /&gt; &lt;br /&gt;   public static final int PADDING_LEFT = 0;&lt;br /&gt;     public static final int PADDING_RIGHT = 1;&lt;br /&gt;&lt;br /&gt;     public static String padString(String str, String paddingChar, int lngth, int paddingSide) {&lt;br /&gt;         if (str == null) {&lt;br /&gt;             str = "";&lt;br /&gt;         }&lt;br /&gt;&lt;br /&gt;         if (str.length() &lt; lngth) {&lt;br /&gt;             for (int k = str.length(); k &lt; lngth; k++) {&lt;br /&gt;                 if (paddingSide == PADDING_LEFT)&lt;br /&gt;                     str = paddingChar + str;&lt;br /&gt;                 else if (paddingSide == PADDING_RIGHT)&lt;br /&gt;                     str = str + paddingChar;&lt;br /&gt;                 else throw new IllegalArgumentException("paddingSide argument wrong!");&lt;br /&gt;             }&lt;br /&gt;         }&lt;br /&gt;         return str;&lt;br /&gt;     }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Di seguito un esempio di un possibile utilizzo di questo metodo : &lt;br /&gt;&lt;pre name="code" class="Java"&gt;String padded = Padding.padString("Hello World","-",50,Padding.PADDING_LEFT);&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4104693577726899381-8215407525577055904?l=franziale.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://franziale.blogspot.com/feeds/8215407525577055904/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4104693577726899381&amp;postID=8215407525577055904' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4104693577726899381/posts/default/8215407525577055904'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4104693577726899381/posts/default/8215407525577055904'/><link rel='alternate' type='text/html' href='http://franziale.blogspot.com/2009/03/padding-di-una-stringa-in-java.html' title='Padding di una stringa in Java'/><author><name>Alessandro Franzi</name><uri>http://www.blogger.com/profile/08478173128603059576</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_Ds8LLsbVUlc/SNa0YcPXutI/AAAAAAAAAAM/D3DZA5UBU-4/S220/go_with_the_flow_281x211.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4104693577726899381.post-3404950204710525065</id><published>2009-03-03T10:33:00.001+01:00</published><updated>2009-03-04T23:12:04.258+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='Debug'/><category scheme='http://www.blogger.com/atom/ns#' term='Eclipse'/><title type='text'>Java : Eseguire Jar o Web Application in modalità debug</title><content type='html'>Capita spesso di dover rintracciare determinati errori o comportamenti anomali della propria applicazione. Ritorna utilissimo utilizzare l'esecuzione in modalità debug rendendo possibile tramite il proprio IDE l'esecuzione passo passo di una determinato blocco di codice, controllare lo stato delle variabili in un determinato stato del sistema, controllare lo stack trace, valutare determinate espressioni personalizzate e modificare a runtime il valore delle variabili. &lt;br /&gt;Con un utilizzo corretto e avanzato di questa modalità è possibile rintracciare e risolvere i problemi delle nostre applicazioni in pochissimi istanti.&lt;br /&gt;&lt;span id="fullpost"&gt;&lt;br /&gt;Non starò a spiegare come eseguire il debug in maniera ottimale. Questo post ha il semplice scopo di voler aiutare gli utenti a configurare il proprio ide, la propria web application o applicazione stand alone ad essere eseguita in modalità debug.&lt;br /&gt;Il primo passo da eseguire è quello di lanciare l'application server o l'applicazione con i seguenti parametri : &lt;br /&gt;&lt;pre name="code" class="Java"&gt;-Xdebug -Xrunjdwp:server=y,transport=dt_socket,address=4142,suspend=n&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Ad esempio se volessi lanciare il mio container, in questo caso un Oc4j:&lt;br /&gt;&lt;pre name="code" class="Java"&gt;&lt;br /&gt;java -XX:PermSize=128m -Xmx512m -Xdebug -Xrunjdwp:server=y,transport=dt_socket,address=4142,suspend=n -jar oc4j.jar -userThreads&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Se invece volessi lanciare il jar della mia applicazione:&lt;br /&gt;&lt;pre name="code" class="Java"&gt;javaw -jar -Xmx512M -Xdebug -Xrunjdwp:server=y,transport=dt_socket,address=4142,suspend=n -jar externalEPG.jar&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Dopodichè è necessario configurare il proprio IDE per poter comunicare con la virtual machine ed eseguire il codice in debug.&lt;br /&gt;N.B : E' necessario che eclipse utilizzi la stessa virtual machine utilizzata dall'applicazione.&lt;br /&gt;E' necessario andare nel menù Run -&gt; Open Debug dialog...&lt;br /&gt;Settare le impostazioni come nell'immagine:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_Ds8LLsbVUlc/Saz_ylWVDNI/AAAAAAAAADE/18c9IY5lLrc/s1600-h/debug.JPG"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 200px; height: 134px;" src="http://2.bp.blogspot.com/_Ds8LLsbVUlc/Saz_ylWVDNI/AAAAAAAAADE/18c9IY5lLrc/s200/debug.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5308899305247280338" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;E' necessario quindi scegliere il progetto da cui eclipse andrà  recuperare i relativi sources, la connection type: Socket (metodo con cui eclipse si connette alla VirtualMachine) e la porta che abbiamo impostato precedentemente nei parametri passati alla VM (nel nostro caso 4142).&lt;br /&gt;Adesso è necessario solamente avviare il debug mediante il corrispondente pulsante e switchare la modalità di visualizzazione in quella di debug. Il risultato che otterrete sarà il seguente:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_Ds8LLsbVUlc/Sa0BjHNMqZI/AAAAAAAAADM/E-l-Xay3VPw/s1600-h/debug2.JPG"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 200px; height: 116px;" src="http://4.bp.blogspot.com/_Ds8LLsbVUlc/Sa0BjHNMqZI/AAAAAAAAADM/E-l-Xay3VPw/s200/debug2.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5308901238481136018" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Molti non adorano "Debuggare" ma altri riescono a coglierne a pieno la potenza. Buon divertimento!&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/4104693577726899381-3404950204710525065?l=franziale.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://franziale.blogspot.com/feeds/3404950204710525065/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4104693577726899381&amp;postID=3404950204710525065' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4104693577726899381/posts/default/3404950204710525065'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4104693577726899381/posts/default/3404950204710525065'/><link rel='alternate' type='text/html' href='http://franziale.blogspot.com/2009/03/java-eseguire-jar-o-application-server.html' title='Java : Eseguire Jar o Web Application in modalità debug'/><author><name>Alessandro Franzi</name><uri>http://www.blogger.com/profile/08478173128603059576</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_Ds8LLsbVUlc/SNa0YcPXutI/AAAAAAAAAAM/D3DZA5UBU-4/S220/go_with_the_flow_281x211.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_Ds8LLsbVUlc/Saz_ylWVDNI/AAAAAAAAADE/18c9IY5lLrc/s72-c/debug.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4104693577726899381.post-5211398975356742507</id><published>2009-02-23T18:50:00.000+01:00</published><updated>2009-02-23T19:02:28.320+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='DvdPedia'/><category scheme='http://www.blogger.com/atom/ns#' term='Mac OS X'/><title type='text'>Catalogare Film con Mac OSX e DVDpedia</title><content type='html'>Per chi avesse necessità  di catalogare la propria collezione di film in DVD potrebbe essere interessante provare lo “shareware” per OSX &lt;a href="http://www.bruji.com/dvdpedia/"&gt;DVDpedia&lt;/a&gt;. La versione dimostrativa consente di testare il programma e di archiviare fino ad un limite di 10 titoli cinematografici, acquistando la licenza (ad un prezzo accessibilissimo) è possibile usufruire di alcuni extra (plugin, temi grafici, bottoni) messi a disposizione dal sito produttore.&lt;br /&gt;&lt;span id="fullpost"&gt;&lt;br /&gt;L’utilizzo di DVDpedia è molto semplice ed intuitivo in tutte le sue molteplici opzioni. La ricerca dei titoli sfrutta circa una ventina di motori di ricerca come IMDb, Amazon, BOL IT, dvd.it ed altri ancora. E’ presente inoltre una funzione di ricerca tramite iSight e il codice a barre, se presente sulla copertina del DVD. Un’altra comoda opzione è quella di poter gestire i prestiti (nel caso si dia uno o piu DVD ad un amico) tramite Rubrica Indirizzi, iCal ed eventualmente sollecitarne la restituzione via Mail.&lt;br /&gt;&lt;br /&gt;Per effettuare la ricerca di un film andiamo sul menu’ Modifica e scegliamo Aggiungi DVD (o usiamo semplicemente da tastiera la combinazione tasti Mela + F). DVDpedia interrogherÃ  i motori sopracitati e in base ai criteri di ricerca da noi impostati (titolo, regia, prezzo, DVD, VHS, etc) ci restituirà  una serie di risultati che andremo a visionare. Nel caso di titoli abbastanza famosi la ricerca fornirà  opzioni di scelta molto mirate, titolo originale, copertina DVD, edizione, data di pubblicazione, regia etc.&lt;br /&gt;&lt;br /&gt;Una volta individuato il nostro DVD, selezioniamo il titolo e aggiungiamolo al nostro Archivio (Biblioteca). Se non dovessimo essere completamente soddisfatti dei risultati, possiamo ottenere informazioni ancor piu’ mirate per la selezione, interrogando i singoli motori di ricerca (consiglio &lt;a href="http://www.imdb.com/"&gt;IMDb&lt;/a&gt; e &lt;a href="http://www.dvd.it/"&gt;dvd.it&lt;/a&gt; per le produzioni italiane) o aggiungendo manualmente i dati mancanti o inesatti in seguito. Nel caso la ricerca non producesse alcun risultato, armiamoci di pazienza ed effettuiamo una nuova ricerca in rete affidandoci a Google.&lt;br /&gt;&lt;br /&gt;E’ presente inoltre in DVDpedia la funzione Esporta che permette di salvare la nostra collezione cinematografica in vari formati (.Mac, iPod, FTP, HTML, Backup e nel formato proprietario .dvdpedia). E’ possibile anche esportare l’intera collezione per creare una copia di sicurezza o spedirla ad una altro utente di DVDpedia (ho avuto modo di provarla solo in rete locale, per cui non saprei come si comporti questa funzione al di fuori di una LAN). Nei vari formati di esportazione troviamo inoltre diverse opzioni di scelta. Il formato HTML ad esempio fornisce diversi temi grafici per personalizzare la nostra collezione, alcuni dei quali scaricabili dalla pagina degli extra di DVDpedia.&lt;br /&gt;&lt;br /&gt;L’esportazione via FTP permette di creare una directory DVDs della nostra collezione, precedentemente esportata in locale in formato HTML, direttamente sul nostro spazio web (nel caso ne avessimo uno). E’ una comoda funzione che permette di consultare la propria lista di film anche se non siamo a casa o non abbiamo con noi il nostro portatile. (sconsiglio pero’ di aggiornare la collezione dal programma stesso ma di effettuare l’aggiornamento manualmente via FTP).&lt;br /&gt;&lt;br /&gt;Di seguito un immagine di DVDPedia:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_Ds8LLsbVUlc/SaLj7_oOISI/AAAAAAAAACs/FdKh2byFosg/s1600-h/Immagine+9.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 200px; height: 126px;" src="http://2.bp.blogspot.com/_Ds8LLsbVUlc/SaLj7_oOISI/AAAAAAAAACs/FdKh2byFosg/s200/Immagine+9.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5306053930827784482" /&gt;&lt;/a&gt;&lt;br /&gt;Per concludere, la mia voleva essere solo una semplice presentazione e veloce panoramica del programma. Esiste già  in rete un’ottima guida su DVDpedia in italiano e la troviamo &lt;a href="http://www.comefarea.it/vitadigitale/dvdpedia/"&gt;qui&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;La fonte di questo articolo è il &lt;a href="http://macavanzi.info/macavanzi/"&gt;blog di macavanzi&lt;/a&gt;&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/4104693577726899381-5211398975356742507?l=franziale.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://franziale.blogspot.com/feeds/5211398975356742507/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4104693577726899381&amp;postID=5211398975356742507' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4104693577726899381/posts/default/5211398975356742507'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4104693577726899381/posts/default/5211398975356742507'/><link rel='alternate' type='text/html' href='http://franziale.blogspot.com/2009/02/catalogare-film-con-mac-osx-e-dvdpedia.html' title='Catalogare Film con Mac OSX e DVDpedia'/><author><name>Alessandro Franzi</name><uri>http://www.blogger.com/profile/08478173128603059576</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_Ds8LLsbVUlc/SNa0YcPXutI/AAAAAAAAAAM/D3DZA5UBU-4/S220/go_with_the_flow_281x211.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_Ds8LLsbVUlc/SaLj7_oOISI/AAAAAAAAACs/FdKh2byFosg/s72-c/Immagine+9.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4104693577726899381.post-613409431901057132</id><published>2009-02-15T22:36:00.001+01:00</published><updated>2009-02-15T22:51:25.311+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Finder'/><category scheme='http://www.blogger.com/atom/ns#' term='Path'/><category scheme='http://www.blogger.com/atom/ns#' term='Mac OS X'/><title type='text'>Mostrare il percorso di uno o più files con il finder mediante un azione automator</title><content type='html'>Gli sviluppatori quotidianamente compiono le stesse operazioni una miriade di volte, e velocizzarne l'esecuzione permette un risparmio di tempo considerevole. Per questo motivo tendo a creare facilitazioni mediante cui potermi facilitare il lavoro e farlo in maniera più veloce. Per uno sviluppatore, o per chiunque si trovi a dover recuperare in maniera istantanea il percorso assoluto di uno o più files sul proprio file system, questo post potrebbe risultare alquanto utile.&lt;br /&gt;&lt;span id="fullpost"&gt;Per questo motivo ho creato uno script mediante cui, una volta aggiunto, è possibile selezionare uno o più file tramite il finder, premere il tasto destro del mouse e trovare sotto la voce Automator -&gt; Mostra percorso la funzionalità adatta a tale scopo (visualizzare il path assoluto del file).&lt;br /&gt;I passi da seguire sono i seguenti passi:&lt;br /&gt;Aprire Automator&lt;br /&gt;Creare un nuovo Script ad Hoc&lt;br /&gt;Incollare il seguente script :&lt;br /&gt;&lt;pre name="code" class="Java"&gt;on run {input, parameters}&lt;br /&gt; global textString&lt;br /&gt; &lt;br /&gt; if (count of input) is equal to 1 then&lt;br /&gt;  repeat with theItem in input&lt;br /&gt;   set textString to POSIX path of (theItem as alias)&lt;br /&gt;   tell application "Finder"&lt;br /&gt;    set choice to display dialog "Percorso" default answer textString buttons {"Copia", "OK"} default button 1&lt;br /&gt;    set textString to text returned of the result&lt;br /&gt;    if the button returned of choice is not equal to "OK" then&lt;br /&gt;     set the clipboard to textString&lt;br /&gt;    end if&lt;br /&gt;   end tell&lt;br /&gt;  end repeat&lt;br /&gt; else&lt;br /&gt;  tell application "TextEdit"&lt;br /&gt;   make new document at the beginning of documents&lt;br /&gt;  end tell&lt;br /&gt;  tell application "TextEdit"&lt;br /&gt;   make new paragraph at the end of document 1 with data ("Percorso file: " &amp; return) with properties {font:titleFont, size:titleSize}&lt;br /&gt;  end tell&lt;br /&gt;  repeat with theItem in input&lt;br /&gt;   &lt;br /&gt;   tell application "TextEdit"&lt;br /&gt;    make new paragraph at the end of document 1 with data (theItem)&lt;br /&gt;    make new paragraph at the end of document 1 with data (return) with properties {font:titleFont, size:titleSize}&lt;br /&gt;   end tell&lt;br /&gt;  end repeat&lt;br /&gt; end if&lt;br /&gt; return input&lt;br /&gt;end run&lt;br /&gt;&lt;/pre&gt; &lt;br /&gt;Scegliere dal menù Archivio-&gt;Registra come plugin&lt;br /&gt;Inserire come nome : Mostra percorso&lt;br /&gt;Scegliere nella combobox "Plugin in" la voce : Finder.&lt;br /&gt;&lt;br /&gt;Il comportamento dello script si differenzia nel caso stiate selezionando una o più voci. Guardiamo insieme il caso in cui viene selezionato un solo file : &lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_Ds8LLsbVUlc/SZiNPhO533I/AAAAAAAAACU/Q0_VJs_oLQw/s1600-h/Immagine+4.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 200px; height: 104px;" src="http://2.bp.blogspot.com/_Ds8LLsbVUlc/SZiNPhO533I/AAAAAAAAACU/Q0_VJs_oLQw/s200/Immagine+4.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5303143858987196274" /&gt;&lt;/a&gt;&lt;br /&gt;Mediante la pressione del tasto Copia è possibile copiare il percorso nella clipboard.&lt;br /&gt;Nel caso in cui invece si siano selezionati più files il risultato sarà visualizzato all'interno di una finestra di textEdit così come in figura:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_Ds8LLsbVUlc/SZiOAkN6GmI/AAAAAAAAACc/czW0880pHts/s1600-h/Immagine+8.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 200px; height: 188px;" src="http://3.bp.blogspot.com/_Ds8LLsbVUlc/SZiOAkN6GmI/AAAAAAAAACc/czW0880pHts/s200/Immagine+8.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5303144701601913442" /&gt;&lt;/a&gt;&lt;br /&gt;Nel caso abbiate suggerimenti o commenti su questo script vi prego di contattarmi.Alla prossima!&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/4104693577726899381-613409431901057132?l=franziale.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://franziale.blogspot.com/feeds/613409431901057132/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4104693577726899381&amp;postID=613409431901057132' title='1 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4104693577726899381/posts/default/613409431901057132'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4104693577726899381/posts/default/613409431901057132'/><link rel='alternate' type='text/html' href='http://franziale.blogspot.com/2009/02/mostrare-il-percorso-di-uno-o-piu-files.html' title='Mostrare il percorso di uno o più files con il finder mediante un azione automator'/><author><name>Alessandro Franzi</name><uri>http://www.blogger.com/profile/08478173128603059576</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_Ds8LLsbVUlc/SNa0YcPXutI/AAAAAAAAAAM/D3DZA5UBU-4/S220/go_with_the_flow_281x211.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_Ds8LLsbVUlc/SZiNPhO533I/AAAAAAAAACU/Q0_VJs_oLQw/s72-c/Immagine+4.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4104693577726899381.post-1275370530005012148</id><published>2009-01-21T17:23:00.000+01:00</published><updated>2009-01-21T17:25:54.490+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='android'/><category scheme='http://www.blogger.com/atom/ns#' term='varie'/><title type='text'>Htc G1, arriva in Europa il Google phone</title><content type='html'>"&lt;span style="font-weight:bold;"&gt;The wait is over&lt;/span&gt;": l'attesa è finita. Così recita lo slogan scelto da T-Mobile per accompagnare l'Htc G1 sulla terraferma del continente europeo. Il primo smartphone equipaggiato con la piattaforma &lt;a href="http://code.google.com/intl/it-IT/android/"&gt;Android&lt;/a&gt;, sviluppata da Google, sarà disponibile a partire da fine gennaio anche in Olanda, Repubblica Ceca e Austria. Dal 2 febbraio sarà venduto in Germania e, a seguire, in Polonia. L'Htc G1 aveva già varcato l'Oceano dopo il lancio negli Usa: dallo scorso autunno il telefonino è in vendita anche in Gran Bretagna. Sempre per merito di T-Mobile. Nei cinque nuovi paesi europei il G1 sarà proposto a prezzi stracciati.&lt;br /&gt;&lt;span id="fullpost"&gt;&lt;br /&gt;Sottoscrivendo il solito contratto con un vincolo di fedeltà di 24 mesi, basterà versare 1 euro per mettersi in tasca il primo GooglePhone. Negli Stati Uniti, lo smartphone con Android, sistema operativo peraltro derivato da Linux, si acquista a 179 dollari.&lt;br /&gt;Nonostante i prezzi aggressivi, giustificati anche dalla necessità di rintuzzare l'Apple iPhone, la dotazione dell'Htc è di tutto rispetto.&lt;br /&gt;Vanta antenna Gps, che opera insieme con Google Maps, e connessioni Umts, Bluetooth e Wi-Fi. In più, il touchscreen da 3,2 pollici (480x320 pixel) ruota rivelando una tastiera Qwerty completa. Non manca nemmeno la fotocamera da 3,2 Mpixel. Con l'apertura di nuovi mercati in Europa, T-Mobile punta a superare il milione di unità vendute in breve tempo: secondo alcune stime, il numero di G1 venduti solo negli Stati Uniti sono tra 400 mila e 600 mila unità (stando ai dati più ottimistici).&lt;br /&gt;E in Italia? Ancora sconosciuti i tempi di commercializzazione di Android; il fatto, però, che lo smartphone sia distribuito da T-Mobile lascia pensare a un possibile accordo con Tim.&lt;br /&gt;Entrambi i gestori sono membri del consorzio Freemove Alliance, oltre che della Open Handset Alliance che comprende provider telefonici e aziende produttrici impegnate nello sviluppo di Android. In quest'ultima categoria rientra, però, anche Vodafone. Dunque, nel Bel Paese, il G1 deve ancora trovare un operatore che decida di importarlo. Anche perché il dispositivo necessita di un pacchetto ad hoc per la navigazione sul Web che consenta di sfruttare appieno le funzioni connesse; per esempio, per scaricare le numerose applicazioni accessorie dall'Android Market che prende spunto dall'AppStore per l'iPhone. E poi il sistema operativo di Google è stato studiato per apparecchi fortemente orientati all'Internet in mobilità. A conti fatti, è ragionevole supporre che in Italia il telefonino sarà in vendita per l'estate. Nel frattempo, stando ad alcune indiscrezioni, Htc starebbe già lavorando al suo successore: il G2. Si vocifera che avrà un display più ampio e funzioni migliorate.&lt;br /&gt;&lt;br /&gt;Fonte : &lt;a href="http://www.ilsole24ore.com"&gt;Il Sole 24 Ore&lt;/a&gt;&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/4104693577726899381-1275370530005012148?l=franziale.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://franziale.blogspot.com/feeds/1275370530005012148/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4104693577726899381&amp;postID=1275370530005012148' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4104693577726899381/posts/default/1275370530005012148'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4104693577726899381/posts/default/1275370530005012148'/><link rel='alternate' type='text/html' href='http://franziale.blogspot.com/2009/01/htc-g1-arriva-in-europa-il-google-phone.html' title='Htc G1, arriva in Europa il Google phone'/><author><name>Alessandro Franzi</name><uri>http://www.blogger.com/profile/08478173128603059576</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_Ds8LLsbVUlc/SNa0YcPXutI/AAAAAAAAAAM/D3DZA5UBU-4/S220/go_with_the_flow_281x211.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4104693577726899381.post-6744333876208467141</id><published>2009-01-18T17:29:00.000+01:00</published><updated>2009-01-18T18:08:39.193+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Socket'/><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='Udp'/><category scheme='http://www.blogger.com/atom/ns#' term='Tcp'/><title type='text'>Socket in Java (tcp e udp)</title><content type='html'>Molti sistemi distribuiti ed applicazioni sono costruiti e basati semplicemente sul modello &lt;span style="font-weight:bold;"&gt;message-oriented&lt;/span&gt; del livello di trasporto.&lt;br /&gt;In fase di progettazione del livello di trasporto è stata prestata molta attenzione alle standardizzazioni delle interfaccie per permettere ai programmatori di utilizzare l'intera suite di protocolli mediante un semplice set di primitive.&lt;br /&gt;Un classico esempio sono le interfaccie &lt;span style="font-weight:bold;"&gt;socket&lt;/span&gt; introdotte in &lt;span style="font-style:italic;"&gt;Berkley Unix&lt;/span&gt;.&lt;br /&gt;&lt;span id="fullpost"&gt;&lt;br /&gt;Concettualmente un &lt;span style="font-weight:bold;"&gt;socket&lt;/span&gt; è un endpoint di comunicazione tramite cui un applicazione può scrivere dati che vengono inviati tramite la rete e tramite cui dati in ingresso possono essere letti.&lt;br /&gt;Consideriamo le primitive : &lt;br /&gt;1. SOCKET :  crea un nuovo endpoint di comunicazione&lt;br /&gt;2. BIND : attacca un indirizzo locale ad un socket&lt;br /&gt;3. LISTEN : annuncia l'approvazione di accettare la connessione&lt;br /&gt;4. ACCEPT : blocca il chiamante finchè non arriva una richiesta di connessione&lt;br /&gt;5. CONNECT : tenta attivamente di stabilire una connessione&lt;br /&gt;6. SEND : invia dati mediante la connessione&lt;br /&gt;7. RECEIVE : riceve dati dalla connessione&lt;br /&gt;8. CLOSE : rilascia la connessione&lt;br /&gt;&lt;br /&gt;I &lt;span style="font-weight:bold;"&gt;server&lt;/span&gt; generalmente eseguono le prime 4 nell'ordine dato:&lt;br /&gt;1. Il sistema operativo locale riserva la risorsa per garantire l'invio e la ricezione di messaggi per il protocollo specificato&lt;br /&gt;2. Dice al S.O. che il server vuole ricevere dati solo su quell'indirizzo e su quella porta&lt;br /&gt;3. E' chiamata solo in caso di comunicazione orientata alla connessione, serve a dire al S.O di allocare abbastanza buffer per un numero massimo di connessioni.&lt;br /&gt;4. Quando arriva una richiesta il S.O. crea un nuovo socket con le stesse proprietà di quello originale e lo restituisce al chiamante.&lt;br /&gt;&lt;br /&gt;Guardiamo il &lt;span style="font-weight:bold;"&gt;Client&lt;/span&gt;:&lt;br /&gt;1. Va creato il SOCKET utilizzando la primitiva&lt;br /&gt;5. La primitiva CONNECTION richiede che il chiamante specifichi l'indirizzo del livello di trasporto al quale la richiesta di connessione deve essere inviata. Il client si blocca finchè la richiesta è completata. Quindi le 2 parti possono iniziare a scambiare dati mediante le primitive READ e RECEIVE.&lt;br /&gt;&lt;br /&gt;8. La chiusura è simmetrica e può avvenire sia lato client che lato server.&lt;br /&gt;&lt;br /&gt;Vediamo un esempio di implementazione in cui avvengono i seguenti passi :&lt;br /&gt;- Il client legge una linea dallo standard input (inFromUser stream) , e lo invia al server mediante socket (outToServer stream)&lt;br /&gt;- Il server legge la linea dal socket&lt;br /&gt;- Il server converte la line in uppercase e la restituisce al client&lt;br /&gt;- Il client legge e stampa la linea modificata mediante il socket (inFromServer stream)&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;IMPLEMENTAZIONE TCP&lt;/span&gt;&lt;br /&gt;Nella versione TCP dell'implementazione dei socket distinguiamo le seguenti caratteristiche peculiari:&lt;br /&gt;Poichè il TCP fornisce un affidabile e ordinato trasferimento di bytes tra client e server (orientato alla connessione),&lt;br /&gt;è necessario che il processo server sia il primo ad essere eseguito, in maniera tale da creare il socket (door) che accetta la connessione da parte dei client.&lt;br /&gt;Quando i client creano il socket, il client TCP stabilisce una connessione con il server TCP il quale crea un nuovo socket per la comunicazione con il client. Questo permette di avere una comunicazione simultanea con più client.&lt;br /&gt;Ecco l'implementazione del server : &lt;br /&gt;&lt;pre name="code" class="Java"&gt;/***&lt;br /&gt; * Classe per la gestione del server&lt;br /&gt; * &lt;br /&gt; * @author Alessandro Franzi&lt;br /&gt; *&lt;br /&gt; */&lt;br /&gt;public class TCPServer {&lt;br /&gt; public static final int PORT = 6768;&lt;br /&gt; &lt;br /&gt; public static void main(String[] args){&lt;br /&gt;  String fraseClient;&lt;br /&gt;  String fraseMaiuscola;&lt;br /&gt;  try{&lt;br /&gt;   // creo il socket di benvenuto&lt;br /&gt;   ServerSocket welcomeSocket = new ServerSocket(PORT);&lt;br /&gt;   &lt;br /&gt;   // ciclo infinitamente (server)&lt;br /&gt;   while (true){&lt;br /&gt;    &lt;br /&gt;    // aspetto il socket per il contatto con il client&lt;br /&gt;    Socket connectionSocket = welcomeSocket.accept();&lt;br /&gt;    &lt;br /&gt;    System.out.println("Accettata connessione socket");&lt;br /&gt;    System.out.println("Il client è connesso dall'ip : "+connectionSocket.getRemoteSocketAddress());&lt;br /&gt;    &lt;br /&gt;    //creo uno stream di input attaccato al socket&lt;br /&gt;    BufferedReader inFromClient = new BufferedReader(new InputStreamReader(connectionSocket.getInputStream()));&lt;br /&gt;    &lt;br /&gt;    DataOutputStream outToClient = new DataOutputStream(connectionSocket.getOutputStream());&lt;br /&gt;    &lt;br /&gt;    // leggo la frase del client&lt;br /&gt;    fraseClient = inFromClient.readLine();&lt;br /&gt;    &lt;br /&gt;    // trasformo la frase in maiuscolo&lt;br /&gt;    fraseMaiuscola = fraseClient.toUpperCase();&lt;br /&gt;    &lt;br /&gt;    System.out.println("frase da inviare : "+fraseMaiuscola);&lt;br /&gt;    &lt;br /&gt;    outToClient.writeBytes(fraseMaiuscola+'\n');&lt;br /&gt;    &lt;br /&gt;   }&lt;br /&gt;  }catch (IOException e) {&lt;br /&gt;   System.out.println("Errore :"+e.getMessage());&lt;br /&gt;  }&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Questa invece è l'implementazione del client : &lt;br /&gt;&lt;pre name="code" class="Java"&gt;/***&lt;br /&gt; * Classe client TCP&lt;br /&gt; * &lt;br /&gt; * @author Alessandro Franzi&lt;br /&gt; *&lt;br /&gt; */&lt;br /&gt;public class TCPClient {&lt;br /&gt; &lt;br /&gt; private static final String HOSTNAME = "1.46.193.82";&lt;br /&gt; public static final int PORT = 6768;&lt;br /&gt; &lt;br /&gt; public static void main(String[] args){&lt;br /&gt;  String host ="";&lt;br /&gt;  int port = PORT;&lt;br /&gt;  String frase ="";&lt;br /&gt;  String fraseModificata;&lt;br /&gt;  &lt;br /&gt;  if (args.length==0){&lt;br /&gt;   System.out.println("Parametri di default.");&lt;br /&gt;   System.out.println("Host : "+HOSTNAME+" Porta : "+PORT);&lt;br /&gt;   host = HOSTNAME;&lt;br /&gt;  }else{&lt;br /&gt;   if (args.length==1){&lt;br /&gt;    host = args[0];&lt;br /&gt;   }&lt;br /&gt;   if (args.length==2){&lt;br /&gt;    host = args[0];&lt;br /&gt;    port = new Integer(args[1]).intValue();&lt;br /&gt;   }&lt;br /&gt;  }&lt;br /&gt;  // dichiaro un buffer Reader&lt;br /&gt;  BufferedReader inFromUser = new BufferedReader(new InputStreamReader(System.in));&lt;br /&gt;  &lt;br /&gt;  try{&lt;br /&gt;   // connetto il socket locale&lt;br /&gt;   &lt;br /&gt;   Socket clientSocket = new Socket(host,port);&lt;br /&gt;   &lt;br /&gt;   System.out.println("Connessione accettata dal server ");&lt;br /&gt;   // crea un outputStream connesso allo stram di output del socket&lt;br /&gt;   DataOutputStream outToServer = new DataOutputStream(clientSocket.getOutputStream());&lt;br /&gt;   &lt;br /&gt;   // creo un buffer di lettura dal server&lt;br /&gt;   BufferedReader inFromServer = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));&lt;br /&gt;   &lt;br /&gt;   &lt;br /&gt;   // prelevo la frase dallo standard input&lt;br /&gt;   frase = inFromUser.readLine();&lt;br /&gt;   &lt;br /&gt;   // passo la frase al server&lt;br /&gt;   outToServer.writeBytes(frase + '\n');&lt;br /&gt;   &lt;br /&gt;   // recupero la frase modificata dal server&lt;br /&gt;   fraseModificata = inFromServer.readLine();&lt;br /&gt;   &lt;br /&gt;   System.out.println(fraseModificata);&lt;br /&gt;   &lt;br /&gt;   // chiudo il socket&lt;br /&gt;   clientSocket.close();&lt;br /&gt;   &lt;br /&gt;  }catch(UnknownHostException e){&lt;br /&gt;   System.out.println("Host sconosciuto : "+e.getMessage());&lt;br /&gt;  }catch(IOException e){&lt;br /&gt;   System.out.println("Problema con il server : "+e.getMessage());&lt;br /&gt;  }&lt;br /&gt;  &lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;IMPLEMENTAZIONE UDP&lt;/span&gt;&lt;br /&gt;Il protocollo UDP non fornisce una connessione tra client e server, il server infatti esplicitamente si attacca ad un indirizzo IP ed una porta di un client del destinatario. Il server deve estrarre l'indirizzo IP e la porta del mittende ricavandoli dal datagram ricevuto.&lt;br /&gt;Vediamo l'implementazione del server UDP:&lt;br /&gt;&lt;pre name="code" class="Java"&gt;public class UDPServer {&lt;br /&gt; public static final int PORT = 6769;&lt;br /&gt; &lt;br /&gt; public static void main(String[] args) {&lt;br /&gt;  &lt;br /&gt;  try {&lt;br /&gt;   &lt;br /&gt;   // creo il socket&lt;br /&gt;   DatagramSocket serverSocket = new DatagramSocket(PORT);&lt;br /&gt;   &lt;br /&gt;   byte[] sendData = new byte[1024];&lt;br /&gt;   byte[] receiveData = new byte[1024];&lt;br /&gt;   &lt;br /&gt;   while (true){&lt;br /&gt;    &lt;br /&gt;    // istanzio il datagramma in input&lt;br /&gt;    DatagramPacket receivePacket = new DatagramPacket(receiveData,receiveData.length);&lt;br /&gt;    &lt;br /&gt;    // ricevo il datagramma dal socket&lt;br /&gt;    serverSocket.receive(receivePacket);&lt;br /&gt;    &lt;br /&gt;    // recupero la frase&lt;br /&gt;    String frase = new String(receivePacket.getData());&lt;br /&gt;    &lt;br /&gt;    // indirizzo ip&lt;br /&gt;    InetAddress iPAddress = receivePacket.getAddress();&lt;br /&gt;    &lt;br /&gt;    // porta&lt;br /&gt;    int port = receivePacket.getPort();&lt;br /&gt;    &lt;br /&gt;    // modifico la porta&lt;br /&gt;    String fraseModificata = frase.toUpperCase();&lt;br /&gt;    &lt;br /&gt;    // trasformo in byte &lt;br /&gt;    sendData = fraseModificata.getBytes();&lt;br /&gt;    &lt;br /&gt;    // creo un datagramma per inviare al client&lt;br /&gt;    DatagramPacket sendPacket = new DatagramPacket(sendData,sendData.length,iPAddress,port);&lt;br /&gt;    &lt;br /&gt;    //scrivo il datagramma sul socket&lt;br /&gt;    serverSocket.send(sendPacket); &lt;br /&gt;   } &lt;br /&gt;  }catch(SocketException e){&lt;br /&gt;   System.out.println("Problemi nell'apertura del socket "+e.getMessage());&lt;br /&gt;  }catch(IOException e){&lt;br /&gt;   System.out.println("Problemi di I/O : "+e.getMessage());&lt;br /&gt;  }&lt;br /&gt; } &lt;br /&gt; &lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Ecco invece l'implementazione del corrispettivo client&lt;br /&gt;&lt;pre name="code" class="Java"&gt;/***&lt;br /&gt; * Classe per la gestione del client UDP&lt;br /&gt; * &lt;br /&gt; * @author Alessandro Franzi&lt;br /&gt; *&lt;br /&gt; */&lt;br /&gt;public class UDPClient {&lt;br /&gt; public static final String HOSTNAME = "localhost";&lt;br /&gt; public static final int PORT = 6769;&lt;br /&gt; &lt;br /&gt; public static void main(String[] args) {&lt;br /&gt;  String host ="";&lt;br /&gt;  int port = PORT;&lt;br /&gt;  &lt;br /&gt;  if (args.length==0){&lt;br /&gt;   System.out.println("Parametri di default.");&lt;br /&gt;   System.out.println("Host : "+HOSTNAME);&lt;br /&gt;   host = HOSTNAME;&lt;br /&gt;  }else{&lt;br /&gt;   if (args.length==1){&lt;br /&gt;    host = args[0];&lt;br /&gt;   }&lt;br /&gt;   if (args.length==2){&lt;br /&gt;    host = args[0];&lt;br /&gt;    port = new Integer(args[1]).intValue();&lt;br /&gt;   }&lt;br /&gt;  }&lt;br /&gt;  &lt;br /&gt;  // buffer di input del client&lt;br /&gt;  BufferedReader inFromUser = new BufferedReader(new InputStreamReader(System.in));&lt;br /&gt;  &lt;br /&gt;  try{&lt;br /&gt;   &lt;br /&gt;   // creo il socket client&lt;br /&gt;   DatagramSocket clientSocket = new DatagramSocket();&lt;br /&gt;  &lt;br /&gt;   // creo l'indirizzo ip&lt;br /&gt;   InetAddress IPAddress = InetAddress.getByName(host);&lt;br /&gt;   &lt;br /&gt;   byte[] sendData = new byte[1024];&lt;br /&gt;   byte[] receiveData = new byte[1024];&lt;br /&gt;   &lt;br /&gt;   String frase = inFromUser.readLine();&lt;br /&gt;   &lt;br /&gt;   sendData = frase.getBytes();&lt;br /&gt;   &lt;br /&gt;   // creo un datagramma con i dati da inviare, lunghezza, ip e porta&lt;br /&gt;   DatagramPacket sendPacket = new DatagramPacket(sendData,sendData.length,IPAddress,port);&lt;br /&gt;   &lt;br /&gt;   // invio il datagramma al server&lt;br /&gt;   clientSocket.send(sendPacket);&lt;br /&gt;   &lt;br /&gt;   // credo un pacchetto &lt;br /&gt;   DatagramPacket receivePacket = new DatagramPacket(receiveData,receiveData.length);&lt;br /&gt;   &lt;br /&gt;   clientSocket.receive(receivePacket);&lt;br /&gt;   &lt;br /&gt;   // frase ricevuta dal server&lt;br /&gt;   String fraseModificata = new String(receivePacket.getData());&lt;br /&gt;   &lt;br /&gt;   System.out.println("Frase ricevuta : "+fraseModificata);&lt;br /&gt;   &lt;br /&gt;   // chiudo il socket&lt;br /&gt;   clientSocket.close();&lt;br /&gt;  }catch(SocketException e){&lt;br /&gt;   System.out.println("Problemi con il socket : "+e.getMessage());&lt;br /&gt;  }catch(UnknownHostException e){&lt;br /&gt;   System.out.println("Host sconosciuto : "+e.getMessage());&lt;br /&gt;  }catch (IOException e){&lt;br /&gt;   System.out.println("I/O exception : "+e.getMessage());&lt;br /&gt;  }&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Spero che questi esempi siano sufficienti a chiarire il funzionamento dei socket in Java. Per qualsiasi perplessità o chiarimento non esitate a contattarmi. Alla prossima.&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/4104693577726899381-6744333876208467141?l=franziale.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://franziale.blogspot.com/feeds/6744333876208467141/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4104693577726899381&amp;postID=6744333876208467141' title='1 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4104693577726899381/posts/default/6744333876208467141'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4104693577726899381/posts/default/6744333876208467141'/><link rel='alternate' type='text/html' href='http://franziale.blogspot.com/2009/01/socket-in-java-tcp-e-udp.html' title='Socket in Java (tcp e udp)'/><author><name>Alessandro Franzi</name><uri>http://www.blogger.com/profile/08478173128603059576</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_Ds8LLsbVUlc/SNa0YcPXutI/AAAAAAAAAAM/D3DZA5UBU-4/S220/go_with_the_flow_281x211.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4104693577726899381.post-8102047548892709161</id><published>2009-01-11T20:41:00.000+01:00</published><updated>2009-01-11T21:20:52.036+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Php'/><category scheme='http://www.blogger.com/atom/ns#' term='Log'/><title type='text'>Scrivere file di log con php</title><content type='html'>E' indispensabile sia in fase di sviluppo che di manutenzione di un sito php utilizzare dei files di log per intercettare gli errori o comunque ricostruire il comportamento o il valore delle variabili prima che lo stesso si verifichi.&lt;br /&gt;Per venire in contro agli sviluppatori ci sono framework come &lt;span style="font-weight:bold;"&gt;log4j&lt;/span&gt; tramite cui è possibile "smistare" la scrittura dei log su diversi files.&lt;br /&gt;Personalmente ho ritenuto più semplice e leggero implementare una mia versione di un manager per i log.&lt;br /&gt;&lt;span id="fullpost"&gt;&lt;br /&gt;Innanzitutto vediamo i parametri di configurazione che utilizzerà il Manager dei log:&lt;br /&gt;&lt;pre name="code" class="Java"&gt; // logging &lt;br /&gt; $log_path = "log/";&lt;br /&gt; $debugLogFile = "debug.log";&lt;br /&gt; $errorLogFile = "error.log";&lt;br /&gt; &lt;br /&gt; define("LOGPATH",   $log_path);&lt;br /&gt; define("DEBUGFILE",   $debugLogFile);&lt;br /&gt; define("DEBUGLOG",                    'DEBUGLOG');&lt;br /&gt; define("ERRLOG",                         'ERRLOG');&lt;br /&gt; define("ERRORFILE",   $errorLogFile);&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Le righe relative alle &lt;span style="font-style:italic;"&gt;define&lt;/span&gt; hanno essenzialmente lo scopo di dichiarare delle costanti utilizzabili in qualsiasi scope dell'applicazione.&lt;br /&gt;&lt;br /&gt;Di seguito l'implementazione del Manager vero e proprio:&lt;br /&gt;&lt;pre name="code" class="Java"&gt;/***&lt;br /&gt; * Classe per il logger&lt;br /&gt; * &lt;br /&gt; * @author Alessandro Franzi&lt;br /&gt; * &lt;br /&gt; */&lt;br /&gt;Class ManageLogger{&lt;br /&gt;&lt;br /&gt;    private $FILELIST = array();&lt;br /&gt;    private $HANDLER = array();&lt;br /&gt;    private $ROOT = "";&lt;br /&gt;    private $WIN32 = false;&lt;br /&gt;    private $FORMAT = "%b %d %H:%M:%S";&lt;br /&gt;    private $DEBUG = true;&lt;br /&gt;&lt;br /&gt; /***&lt;br /&gt;  * Costruttore della classe logger&lt;br /&gt;  */&lt;br /&gt;    public function ManageLogger ( $LogRoot, $FileArray = "" ){&lt;br /&gt;        if(empty($LogRoot)){&lt;br /&gt;   // se non è stata specificata la root del logger&lt;br /&gt;            if($this-&gt;DEBUG){&lt;br /&gt;                error_log("[ErrorLog]: C'è bisogno della Root Folder per creare il logger",0);&lt;br /&gt;            }&lt;br /&gt;            return;&lt;br /&gt;        }&lt;br /&gt;        $this-&gt;set_root($LogRoot);&lt;br /&gt;        if(!empty($FileArray)){&lt;br /&gt;            // se non è vuoto l'array contenente i nomi dei files di log&lt;br /&gt;            $this-&gt;initialize($FileArray);&lt;br /&gt;        }&lt;br /&gt;        return;&lt;br /&gt;    }&lt;br /&gt; &lt;br /&gt; /***&lt;br /&gt;  * Inizializza l'array dei file di log&lt;br /&gt;  */&lt;br /&gt;    public function initialize ($FileArray){&lt;br /&gt;        if ( (gettype($FileArray)) != "array"){&lt;br /&gt;            if($this-&gt;DEBUG){&lt;br /&gt;                error_log("[ErrorLog]: Tipo di Array per i file di log invalido",0);&lt;br /&gt;            }&lt;br /&gt;            return;&lt;br /&gt;        }&lt;br /&gt;        while ( list ($key,$val) = each ($FileArray) ){&lt;br /&gt;            if ( (!empty($key)) and (!empty($val)) ){&lt;br /&gt;                // associo i vari file di log al relativo compito&lt;br /&gt;                $val = "$this-&gt;ROOT"."$val";&lt;br /&gt;                $this-&gt;FILELIST[$key] = $val;&lt;br /&gt;                $this-&gt;HANDLER[$key] = null;&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;        return;&lt;br /&gt;    }&lt;br /&gt; &lt;br /&gt; /***&lt;br /&gt;  * Metodo per scrivere il log&lt;br /&gt;  * &lt;br /&gt;  */&lt;br /&gt;    public function log ($Handle,$LogEntry)&lt;br /&gt;    {&lt;br /&gt;        global $php_errormsg;&lt;br /&gt;&lt;br /&gt;        $filename = $this-&gt;FILELIST[$Handle];&lt;br /&gt;        $TimeStamp = strftime($this-&gt;FORMAT,time());&lt;br /&gt;        // associo la mia formattazione alla stringa&lt;br /&gt;        $LogEntry = "$TimeStamp - $LogEntry";&lt;br /&gt;&lt;br /&gt;        if (!$this-&gt;HANDLER[$Handle]){&lt;br /&gt;            $fd = fopen($filename,"a");&lt;br /&gt;            if ( (!$fd) or (empty($fd)) ){&lt;br /&gt;                if($this-&gt;DEBUG)&lt;br /&gt;                {&lt;br /&gt;                    error_log("[ErrorLog]: Errore fatale sul file:  $php_errormsg",0);&lt;br /&gt;                }&lt;br /&gt;                return;&lt;br /&gt;            }&lt;br /&gt;            fwrite($fd,"$LogEntry\n");&lt;br /&gt;            $this-&gt;HANDLER[$Handle] = $fd;&lt;br /&gt;        }else{&lt;br /&gt;            fwrite($this-&gt;HANDLER[$Handle],"$LogEntry\n");&lt;br /&gt;        }&lt;br /&gt;        return;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt; /***&lt;br /&gt;  * Metodo per chiudere i file di log&lt;br /&gt;  */&lt;br /&gt;    public function close_logs (){&lt;br /&gt;        while ( list ($Handle, $Val) = each ($this-&gt;FILELIST) ){&lt;br /&gt;            if($this-&gt;HANDLER[$Handle]){&lt;br /&gt;                $TimeStamp = strftime($this-&gt;FORMAT,time());&lt;br /&gt;                fclose($this-&gt;HANDLER[$Handle]);&lt;br /&gt;                unset($this-&gt;HANDLER[$Handle]);&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt; /***&lt;br /&gt;  * Metodo per settare la root dei file di log&lt;br /&gt;  */&lt;br /&gt;    public function set_root ($root){&lt;br /&gt;        if(!$this-&gt;WIN32){&lt;br /&gt;            if(!ereg("\/$",$root)){&lt;br /&gt;                $root = "$root"."/";&lt;br /&gt;            }&lt;br /&gt;            if(is_dir($root)){&lt;br /&gt;                $this-&gt;ROOT = $root;&lt;br /&gt;            }else{&lt;br /&gt;                $this-&gt;ROOT = "";&lt;br /&gt;                if($this-&gt;DEBUG){&lt;br /&gt;                    error_log("La root specificata: [$root] non è una directory",0);&lt;br /&gt;                }&lt;br /&gt;            }&lt;br /&gt;        }else{&lt;br /&gt;            // Macchine Winzozz&lt;br /&gt;            if(!ereg("\\$",$root)){&lt;br /&gt;                $root = "$root"."\\";&lt;br /&gt;            }&lt;br /&gt;            $this-&gt;ROOT = $root;&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;    /***&lt;br /&gt;     * Metodo per loggare messaggi di errore&lt;br /&gt;     * &lt;br /&gt;     */&lt;br /&gt;    public function error ($messaggio){&lt;br /&gt;     $this-&gt;log(ERRLOG,"[".pagina::getNomePagina()."] - ".$messaggio);&lt;br /&gt;    }&lt;br /&gt; /***&lt;br /&gt;     * Metodo per loggare messaggi di debug&lt;br /&gt;     * &lt;br /&gt;     */&lt;br /&gt;    public function debug ($messaggio){&lt;br /&gt;     $this-&gt;log(DEBUGLOG,"[".pagina::getNomePagina()."] - ".$messaggio);&lt;br /&gt;    }&lt;br /&gt;    &lt;br /&gt;    /***&lt;br /&gt;     * Distruttore della classe che invoca la chiusura dei file di log&lt;br /&gt;     */&lt;br /&gt;    public function __destruct() {&lt;br /&gt;     $this-&gt;close_logs();&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Osserviamo come istanziare e inizializzare il ManageLogger : &lt;br /&gt;&lt;pre name="code" class="Java"&gt;$ManageLogger = new ManageLogger("./".LOGPATH);&lt;br /&gt;$ManageLogger-&gt;initialize(array('ERRLOG' =&gt; ERRORFILE ,'DEBUGLOG' =&gt; DEBUGFILE));&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;E' chiaro che se si volessero utilizzare altri appender per i file di log, basterebbe aggiungerli all'array.&lt;br /&gt;Queste sezioni di codice sarebbero sufficienti per poter avere un logger funzionante, richiamando i metodi opportuni (debug e error) sul manager, ma è sicuramente più comodo implementare una classe mediante cui interfacciarsi con il manager.&lt;br /&gt;Il compito della classe Logger infatti è proprio quella di utilizzare i metodi del manageLogger da noi facilmente raggiungibile mediante i suoi metodi statici.&lt;br /&gt;Ecco infine l'implementazione :&lt;br /&gt;&lt;pre name="code" class="Java"&gt;/**&lt;br /&gt; * Depends : ManageLogger&lt;br /&gt; * Classe di controllo per l'istanza dell'oggetto ManageLogger&lt;br /&gt; * &lt;br /&gt; * @author Alessandro Franzi&lt;br /&gt; * &lt;br /&gt; */&lt;br /&gt; class Logger{&lt;br /&gt; /***&lt;br /&gt;  * Metodo statico per la stampa del log di debug&lt;br /&gt;  */&lt;br /&gt; public static function debug ($msg) {&lt;br /&gt;  global $ManageLogger;&lt;br /&gt;  $ManageLogger-&gt;debug($msg);&lt;br /&gt; }&lt;br /&gt; /***&lt;br /&gt;  * Metodo statico per la stampa del log di errore&lt;br /&gt;  */&lt;br /&gt; public static function error ($msg,$e=null) {&lt;br /&gt;  global $ManageLogger;&lt;br /&gt;  $ManageLogger-&gt;error($msg);&lt;br /&gt;  if ($e!=null){&lt;br /&gt;   $ManageLogger-&gt;error("Causa : ".$e-&gt;getMessage()."\nStackTrace : ".$e-&gt;getTraceAsString());&lt;br /&gt;  }&lt;br /&gt; }  &lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Vediamo quindi come poter utilizzare nel nostro codice i log:&lt;br /&gt;&lt;pre name="code" class="Java"&gt;// esempio di logging dell'errore in un blocco try/catch&lt;br /&gt;try{&lt;br /&gt;....&lt;br /&gt;}catch(Exception $e){&lt;br /&gt;   logger::error("Eccezione",$e);&lt;br /&gt;}&lt;br /&gt;// esempio di logging per il debug&lt;br /&gt;Logger::debug("Il valore della variabile a è ".$a);&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Un buon utilizzo dei logger in fase di sviluppo certamente renderà molto più semplice eseguire manutenzioni correttive sullo stesso. Spero che questo codice sia semplice da comprendere, naturalmente sono ben accetti consigli o correzioni sullo stesso.&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/4104693577726899381-8102047548892709161?l=franziale.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://franziale.blogspot.com/feeds/8102047548892709161/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4104693577726899381&amp;postID=8102047548892709161' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4104693577726899381/posts/default/8102047548892709161'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4104693577726899381/posts/default/8102047548892709161'/><link rel='alternate' type='text/html' href='http://franziale.blogspot.com/2009/01/scrivere-log-in-php.html' title='Scrivere file di log con php'/><author><name>Alessandro Franzi</name><uri>http://www.blogger.com/profile/08478173128603059576</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_Ds8LLsbVUlc/SNa0YcPXutI/AAAAAAAAAAM/D3DZA5UBU-4/S220/go_with_the_flow_281x211.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4104693577726899381.post-1447474977139281960</id><published>2009-01-10T22:15:00.000+01:00</published><updated>2009-01-10T22:21:50.826+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Php'/><category scheme='http://www.blogger.com/atom/ns#' term='Random'/><title type='text'>Generazione valori random in php</title><content type='html'>Questo post ha come obiettivo quello di fornire una soluzione alla generazione di valori numerici random e alla creazione di stringhe random in &lt;span style="font-weight:bold;"&gt;php&lt;/span&gt;.&lt;br /&gt;L' utilizzo di stringhe random può essere utile ad esempio nel caso in cui si vogliano definire nomi di variabili javascript o identificatori di elementi per l'html univoci.&lt;br /&gt;Qui di seguito l'implementazione di una classe mediante cui, attraverso i relativi metodi statici mette a disposizione tali funzionalità.&lt;br /&gt;&lt;span id="fullpost"&gt;&lt;br /&gt;Ecco l'implementazione della classe : &lt;br /&gt;&lt;pre name="code" class="Java"&gt;/***&lt;br /&gt; * Classe per la generazione random&lt;br /&gt; * &lt;br /&gt; * @author Alessandro Franzi&lt;br /&gt; * &lt;br /&gt; */&lt;br /&gt;&lt;br /&gt;class Random{&lt;br /&gt; /***&lt;br /&gt;  * Genera una stringa random&lt;br /&gt;  * &lt;br /&gt;  * @param $caratteri : numero di caratteri della stringa random&lt;br /&gt;  * @return     : stringa generata in maniera random&lt;br /&gt;  */&lt;br /&gt; public static function string($caratteri=7){&lt;br /&gt;  $chars = "abcdefghijkmnopqrstuvwxyz023456789";&lt;br /&gt;  srand((double)microtime()*1000000);&lt;br /&gt;  $i = 0;&lt;br /&gt;  $pass = '' ;&lt;br /&gt; &lt;br /&gt;  while ($i &lt;= $caratteri) {&lt;br /&gt;   $num = rand() % 33;&lt;br /&gt;   $tmp = substr($chars, $num, 1);&lt;br /&gt;   $pass = $pass . $tmp;&lt;br /&gt;   $i++;&lt;br /&gt;  }&lt;br /&gt; &lt;br /&gt;  return $pass;&lt;br /&gt; }&lt;br /&gt; /***&lt;br /&gt;  * Metodo per generare un numero random&lt;br /&gt;  * @param $min : valore minimo del numero random (optional)&lt;br /&gt;  * @param $min : valore massimo del numero random (optional)&lt;br /&gt;  * @return   : numero random&lt;br /&gt;  */&lt;br /&gt; public static function numero ($min=null,$max=null){&lt;br /&gt;  if (empty($min)&amp;&amp;empty($max)){&lt;br /&gt;   return rand();&lt;br /&gt;  }else{&lt;br /&gt;   return rand($min,$max);&lt;br /&gt;  }&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Vediamo ora come è possibile invocare tali funzionalità:&lt;br /&gt;&lt;pre name="code" class="Java"&gt;// creare una stringa di 10 caratteri&lt;br /&gt;$strRand = Random::string(10);&lt;br /&gt;// creare una stringa di 7 caratteri (numero di default)&lt;br /&gt;$strRand = Random::string();&lt;br /&gt;// recuperare un valore numerico random senza stabilire un range&lt;br /&gt;$numRand = Random::numero();&lt;br /&gt;// recuperare un valore numerico il cui range è [2,23]&lt;br /&gt;$numRand = Random::numero(2,23);&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Spero che questo post sia stato utile. Alla prossima!&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/4104693577726899381-1447474977139281960?l=franziale.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://franziale.blogspot.com/feeds/1447474977139281960/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4104693577726899381&amp;postID=1447474977139281960' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4104693577726899381/posts/default/1447474977139281960'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4104693577726899381/posts/default/1447474977139281960'/><link rel='alternate' type='text/html' href='http://franziale.blogspot.com/2009/01/generazione-valori-random-in-php.html' title='Generazione valori random in php'/><author><name>Alessandro Franzi</name><uri>http://www.blogger.com/profile/08478173128603059576</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_Ds8LLsbVUlc/SNa0YcPXutI/AAAAAAAAAAM/D3DZA5UBU-4/S220/go_with_the_flow_281x211.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4104693577726899381.post-92472693638886346</id><published>2009-01-10T20:44:00.000+01:00</published><updated>2009-04-08T22:07:04.832+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Javascript'/><category scheme='http://www.blogger.com/atom/ns#' term='Php'/><category scheme='http://www.blogger.com/atom/ns#' term='Mootools'/><title type='text'>Importare dinamicamente un file css o js all'interno del body</title><content type='html'>Una limitazione nell'inclusione dei fogli di stile css mediante l'utilizzo del tag html &lt;span style="font-weight:bold;"&gt;&amp;lt;link&amp;gt;&lt;/span&gt; consiste nel fatto che lo stesso debba essere incluso all'interno del tag &lt;span style="font-weight:bold;"&gt;&amp;lt;head&amp;gt;&lt;/span&gt; affinchè gli stili inclusi possano essere utilizzati dal browser.&lt;br /&gt;Nel caso in cui si voglia includere un file css in un qualsiasi punto della pagina, ad esempio nel &lt;span style="font-weight:bold;"&gt;&amp;lt;body&amp;gt;&lt;/span&gt;, magari associando l'inclusione ad un determinato evento o ad una determinata condizione risulterebbe impossibile se non ci venisse in contro il framework Javascript : &lt;a href="http://mootools.net/"&gt;MooTools&lt;/a&gt;.&lt;br /&gt;&lt;span id="fullpost"&gt;&lt;br /&gt;E' possibile mediante questa classe includere anche file javascript a runtime, così come per i file css.&lt;br /&gt;E' necessario importare all'interno della pagina 2 file javascript:&lt;br /&gt;- Il core dei mootools&lt;br /&gt;- il more dei mootools contenente il plugin &lt;a href="http://mootools.net/docs/Plugins/Assets"&gt;Asset&lt;/a&gt;&lt;br /&gt;I 2 files sono disponibili &lt;a href="http://www.franziale.netsons.org/src/js/mootools/mootools-1.2.1-core-nc.js"&gt;qui (core)&lt;/a&gt; e &lt;a href="http://www.franziale.netsons.org/src/js/mootools/mootools-1.2-more.js"&gt;qui (more)&lt;/a&gt;.&lt;br /&gt;&lt;pre name="code" class="java"&gt;&amp;lt;script type=&amp;quot;text/javascript&amp;quot; language=&amp;quot;JavaScript&amp;quot; src=&amp;quot;http://www.franziale.netsons.org/src/js/mootools/mootools-1.2.1-core-nc.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;&amp;lt;script type=&amp;quot;text/javascript&amp;quot; language=&amp;quot;JavaScript&amp;quot; src=&amp;quot;http://www.franziale.netsons.org/src/js/mootools/mootools-1.2-more.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Il passo successivo è quello di utilizzare all'interno della pagina il seguente codice:&lt;br /&gt;&lt;pre name="code" class="java"&gt;// include un file css a runtime&lt;br /&gt;var myCSS = new Asset.css("style.css");&lt;br /&gt;// include un file javascript a runtime&lt;br /&gt;var myJS = new Asset.javascript("jsdefinition.js");&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Di seguito è presente il codice per poter gestire la stampa del javascript per la chiamata ai metodi dei mootools mediante una classe PHP.&lt;br /&gt;&lt;pre name="code" class="Java"&gt;/**&lt;br /&gt; * Classe Boundary per la gestione della stampa&lt;br /&gt; * @author a.franzi&lt;br /&gt; */&lt;br /&gt;class MooTools{&lt;br /&gt; &lt;br /&gt; /**&lt;br /&gt;  * Metodo per recuperare la chiamata al metodo della classe Asset dei mootools per &lt;br /&gt;  * importare un file css a runtime (quindi non necessariamente nell'head della pagina)&lt;br /&gt;  *&lt;br /&gt;  * @param $cssFile : path al file css&lt;br /&gt;  * @return    : stringa javaScritpt contenente la chiamata al metodo della clase&lt;br /&gt;  *        Asset dei mootools&lt;br /&gt;  */&lt;br /&gt; public static function getAssetCss($cssFile){&lt;br /&gt;  // nel caso in cui non si voglia usare un nome univoco , è possibile decommentare questa riga&lt;br /&gt;  // ed eliminare la seguente&lt;br /&gt;  //return "var myCss = new Asset.css('".$cssFile."');";&lt;br /&gt;  return "var myCss".Random::string()." = new Asset.css('".$cssFile."');";&lt;br /&gt; }&lt;br /&gt; /**&lt;br /&gt;  * Metodo per stampare la chiamata al metodo della classe Asset dei mootools per &lt;br /&gt;  * importare un file css a runtime (quindi non necessariamente nell'head della pagina)&lt;br /&gt;  *&lt;br /&gt;  * @param $cssFile : path al file css&lt;br /&gt;  */&lt;br /&gt; public static function printAssetCss($cssFile){&lt;br /&gt;  echo self::getAssetCss($cssFile);&lt;br /&gt; }&lt;br /&gt; /**&lt;br /&gt;  * Metodo per recuperare la chiamata al metodo della classe Asset dei mootools per &lt;br /&gt;  * importare un file js a runtime&lt;br /&gt;  *&lt;br /&gt;  * @param $cssFile : path al file js&lt;br /&gt;  * @return    : stringa javaScritpt contenente la chiamata al metodo della clase&lt;br /&gt;  *        Asset dei mootools&lt;br /&gt;  */&lt;br /&gt; public static function getAssetJs($jsFile){&lt;br /&gt;  // nel caso in cui non si voglia usare un nome univoco , è possibile decommentare questa riga&lt;br /&gt;  // ed eliminare la seguente&lt;br /&gt;  //return "var myJs = new Asset.javascript('".$jsFile."')";&lt;br /&gt;  return "var myJs".Random::string()." = new Asset.javascript('".$jsFile."')";&lt;br /&gt; }&lt;br /&gt; /**&lt;br /&gt;  * Metodo per stampare la chiamata al metodo della classe Asset dei mootools per &lt;br /&gt;  * importare un file js a runtime&lt;br /&gt;  *&lt;br /&gt;  * @param $cssFile : path al file js&lt;br /&gt;  * @return    : stringa javaScritpt contenente la chiamata al metodo della clase&lt;br /&gt;  *        Asset dei mootools&lt;br /&gt;  */&lt;br /&gt; public static function printAssetJs($jsFile){&lt;br /&gt;  echo self::getAssetJs($jsFile);&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Attenzione : nel codice si fà riferimento alla classe Random la cui implementazione è possibile recuperarla sul post &lt;a href="http://franziale.blogspot.com/2009/01/generazione-valori-random-in-php.html"&gt;Generazione valori random in php&lt;/a&gt;.&lt;br /&gt;Sicuramente questo post sarà utile a coloro, come nel mio caso utilizzino un controller per la gestione centralizzata dell'inclusione di file js e file css.&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/4104693577726899381-92472693638886346?l=franziale.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://franziale.blogspot.com/feeds/92472693638886346/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4104693577726899381&amp;postID=92472693638886346' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4104693577726899381/posts/default/92472693638886346'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4104693577726899381/posts/default/92472693638886346'/><link rel='alternate' type='text/html' href='http://franziale.blogspot.com/2009/01/importare-dinamicamente-un-file-css-o.html' title='Importare dinamicamente un file css o js all&apos;interno del body'/><author><name>Alessandro Franzi</name><uri>http://www.blogger.com/profile/08478173128603059576</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_Ds8LLsbVUlc/SNa0YcPXutI/AAAAAAAAAAM/D3DZA5UBU-4/S220/go_with_the_flow_281x211.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4104693577726899381.post-2760602001882652128</id><published>2008-12-17T11:37:00.000+01:00</published><updated>2008-12-17T12:05:46.920+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Mysql'/><title type='text'>Mysql : Cambiare la password di root o di un determinato utente</title><content type='html'>Nel normale utilizzo di un server Mysql si può incorrere in diverse situazioni in cui è necessario dover settare o resettare la password per un determinato utente.&lt;br /&gt;Qui di seguito analizziamo le situazioni in cui si può incorrere e i relativi metodo di risoluzione di tali problematiche.&lt;br /&gt;&lt;span id="fullpost"&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;SETTARE LA PASSWORD DI ROOT LA PRIMA VOLTA&lt;/span&gt;&lt;br /&gt;Il server di Mysql appena installato e lanciato per la prima volta non associa nessuna password di default per l'utente root.&lt;br /&gt;Ecco 2 modi in cui poter settare la password per l'utente root nel caso in cui non sia stata ancora settata.&lt;br /&gt;La prima soluzione è la seguente ed è seguita mediante il comando &lt;span style="font-style:italic;"&gt;mysqladmin&lt;/span&gt;&lt;br /&gt;&lt;pre name="code" class="Java"&gt;mysqladmin -u root password NEWPASSWORD&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Una seconda soluzione è eseguire una serie di comandi mysql per poter settare la password. E' necessario seguire i seguenti passaggi:&lt;br /&gt;1) Loggarsi al server mysql, e eseguire i seguenti comandi sul promt di mysql:&lt;br /&gt;&lt;pre name="code" class="Java"&gt;mysql -u root&lt;/pre&gt;&lt;br /&gt;2) Cambiare la password:&lt;br /&gt;&lt;pre name="code" class="Java"&gt;SET PASSWORD FOR root@localhost = PASSWORD('tua_nuova_password');&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;In questo modo al prossimo tentativo di login è sufficiente utilizzare il seguente comando&lt;br /&gt;&lt;pre name="code" class="Java"&gt;mysql -u root -p&lt;/pre&gt;&lt;br /&gt;ed inserire la password per loggarsi.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;RESETTARE LA PASSWORD DIMENTICATA&lt;/span&gt;&lt;br /&gt;Può accadere che ci si dimentichi della password di root di un sistema db MySQL. Per resettare la password è necessario operare come segue: fermare mysql - su sistemi *nix da root con :&lt;br /&gt;&lt;pre name="code" class="Java"&gt;/etc/init.d/mysql stop&lt;/pre&gt;&lt;br /&gt;su windows - con privilegi di amministrazione - con:&lt;br /&gt;&lt;span style="font-style:italic;"&gt;Menu Start --&gt; Esegui --&gt; cmd --&gt; services.msc&lt;/span&gt;&lt;br /&gt;localizzare il servizio &lt;span style="font-style:italic;"&gt;MySQL &lt;/span&gt;quindi selezionarlo con il tasto destro e stopparlo.&lt;br /&gt;&lt;br /&gt;Una volta fermato MySQL:&lt;br /&gt;# riavviarlo con (linux):&lt;br /&gt;&lt;pre name="code" class="Java"&gt;mysqld_safe --skip-grant-tables&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;su windows:&lt;br /&gt;portarsi nella sottocartella bin della cartella in cui si trova il programma mysql, quindi:&lt;br /&gt;&lt;pre name="code" class="Java"&gt;mysqld --skip-grant-tables&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;aprire una nuova shell mysql (da windows o linux) e digitare solo:&lt;br /&gt;&lt;pre name="code" class="Java"&gt;mysql -h localhost&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;si è avuto accesso senza inserire la password. Per modificarla:&lt;br /&gt;&lt;pre name="code" class="Java"&gt;use mysql;&lt;br /&gt;UPDATE user SET password=password("NUOVAPASSWORD") WHERE user="root";&lt;/pre&gt;&lt;br /&gt;Una volta completata l'operazione, fermare di nuovo il server MySQL e riavviarlo normalmente, cioè come demone o servizio.&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;SETTARE LA PASSWORD PER UN UTENTE&lt;/span&gt;&lt;br /&gt;1) Loggarsi al server Mysql &lt;br /&gt;&lt;pre name="code" class="Java"&gt;mysql -u root -p&lt;/pre&gt;&lt;br /&gt;2) Usare il database Mysql (digitare il comando sul promt mysql&gt;):&lt;br /&gt;&lt;pre name="code" class="Java"&gt;use mysql;&lt;/pre&gt;&lt;br /&gt;3) Cambiare la password per l'utente utenteProva:&lt;br /&gt;&lt;pre name="code" class="Java"&gt;update user set password=PASSWORD("NEWPASSWORD") where User='utenteProva';&lt;/pre&gt;&lt;br /&gt;4) Ricaricare i privilegi&lt;br /&gt;&lt;pre name="code" class="Java"&gt;flush privileges;&lt;/pre&gt;&lt;br /&gt;Questi esempi dovrebbero coprire la maggiorparte delle situzioni in cui si può incorrere.&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/4104693577726899381-2760602001882652128?l=franziale.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://franziale.blogspot.com/feeds/2760602001882652128/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4104693577726899381&amp;postID=2760602001882652128' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4104693577726899381/posts/default/2760602001882652128'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4104693577726899381/posts/default/2760602001882652128'/><link rel='alternate' type='text/html' href='http://franziale.blogspot.com/2008/12/mysql-cambiare-la-password-di-root-o-di.html' title='Mysql : Cambiare la password di root o di un determinato utente'/><author><name>Alessandro Franzi</name><uri>http://www.blogger.com/profile/08478173128603059576</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_Ds8LLsbVUlc/SNa0YcPXutI/AAAAAAAAAAM/D3DZA5UBU-4/S220/go_with_the_flow_281x211.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4104693577726899381.post-6531267056317272046</id><published>2008-12-14T20:17:00.000+01:00</published><updated>2008-12-14T20:26:29.645+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Multi-window'/><category scheme='http://www.blogger.com/atom/ns#' term='Safari'/><category scheme='http://www.blogger.com/atom/ns#' term='AppleScript'/><category scheme='http://www.blogger.com/atom/ns#' term='Mac OS X'/><title type='text'>Abilitare/disabilitare il multi-window Mode in Safari</title><content type='html'>Per chi come me utilizza Mac Os X potrebbe essere davvero utile un appleScript mediante il quale poter abilitare e disabilitare l'apertura di nuove finestre di Safari.&lt;br /&gt;Di default Safari, tende ad aprire i link in nuove Finestre anzichè utilizzare un nuovo Tab. Questo rende la navigazione alquanto caotica. Personalmente non ricordo se esista una voce nel menù di Safari per gestire questa particolare opzione.&lt;br /&gt;&lt;span id="fullpost"&gt;&lt;br /&gt;Una soluzione è quella di crearsi uno script per poter scegliere la configurazione desiderata mediante una seplice Dialog.&lt;br /&gt;Vediamo il codice: &lt;br /&gt;&lt;pre name="code" class="Java"&gt;beep&lt;br /&gt;set choice to (display dialog ("Vuoi abilitare/disabilitare Safari in single window mode?") buttons {"Cancella", "Abilita", "Disabilita"} default button 1 with icon 1 with title "SSWM")&lt;br /&gt;&lt;br /&gt;if the button returned of choice is not equal to "Cancellal" then&lt;br /&gt; if the button returned of choice is equal to "Abilita" then&lt;br /&gt;  -- Terminal command to enable SWM&lt;br /&gt;  set cmd to ("defaults write com.apple.Safari TargetedClicksCreateTabs -bool true")&lt;br /&gt; else&lt;br /&gt;  -- Terminal command to disable SWM    &lt;br /&gt;  set cmd to ("defaults write com.apple.Safari TargetedClicksCreateTabs -bool false")&lt;br /&gt; end if&lt;br /&gt; &lt;br /&gt; try&lt;br /&gt;  -- Execute command&lt;br /&gt;  set x to (do shell script cmd)&lt;br /&gt;  -- Positive feedback&lt;br /&gt;  set x to (result &amp; "Operazione eseguita!")&lt;br /&gt; on error e&lt;br /&gt;  -- Return Error&lt;br /&gt;  set x to e&lt;br /&gt; end try&lt;br /&gt; &lt;br /&gt; -- Display feedback&lt;br /&gt; if the button returned of choice is equal to "Abilita" or "Disabilita" then&lt;br /&gt;  &lt;br /&gt;  set choice2 to (display dialog ((x as string) &amp; return &amp; "E' necessario riavviare Safari. Riavviare ora?") buttons {"Yes", "No"} default button 1 with icon 1 with title "SSWM")&lt;br /&gt;  &lt;br /&gt;  -- Quit and restart Safari&lt;br /&gt;  if the button returned of choice2 is equal to "Yes" then&lt;br /&gt;   if application "Safari" is running then&lt;br /&gt;    tell application "Safari"&lt;br /&gt;     quit&lt;br /&gt;    end tell&lt;br /&gt;    delay 1&lt;br /&gt;    tell application "Safari"&lt;br /&gt;     activate&lt;br /&gt;    end tell&lt;br /&gt;   end if&lt;br /&gt;  end if&lt;br /&gt; end if&lt;br /&gt;end if&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Il risultato ottenuto è la seguente finestrella : &lt;br /&gt;&lt;br&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_Ds8LLsbVUlc/SUVdl1VmlPI/AAAAAAAAACM/F4SgXbGJkHI/s1600-h/Immagine+13.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 200px; height: 90px;" src="http://1.bp.blogspot.com/_Ds8LLsbVUlc/SUVdl1VmlPI/AAAAAAAAACM/F4SgXbGJkHI/s200/Immagine+13.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5279729042716005618" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br&gt;&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/4104693577726899381-6531267056317272046?l=franziale.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://franziale.blogspot.com/feeds/6531267056317272046/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4104693577726899381&amp;postID=6531267056317272046' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4104693577726899381/posts/default/6531267056317272046'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4104693577726899381/posts/default/6531267056317272046'/><link rel='alternate' type='text/html' href='http://franziale.blogspot.com/2008/12/abilitaredisabilitare-il-multi-window.html' title='Abilitare/disabilitare il multi-window Mode in Safari'/><author><name>Alessandro Franzi</name><uri>http://www.blogger.com/profile/08478173128603059576</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_Ds8LLsbVUlc/SNa0YcPXutI/AAAAAAAAAAM/D3DZA5UBU-4/S220/go_with_the_flow_281x211.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_Ds8LLsbVUlc/SUVdl1VmlPI/AAAAAAAAACM/F4SgXbGJkHI/s72-c/Immagine+13.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4104693577726899381.post-4912521637688000913</id><published>2008-12-14T19:54:00.000+01:00</published><updated>2008-12-14T20:10:45.729+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Finder'/><category scheme='http://www.blogger.com/atom/ns#' term='AppleScript'/><category scheme='http://www.blogger.com/atom/ns#' term='Mac OS X'/><category scheme='http://www.blogger.com/atom/ns#' term='File Nascosti'/><title type='text'>Abilitare/disabilitare visualizzazione file nascosti nel Finder di Mac Os X</title><content type='html'>Nonstante Mac Os X sia davvero semplice ed intuitivo da utilizzare a volte trovare nei menù alcune opzioni può risultare una noia, specialmente per chi, come me, non è dotato di una memoria eccellente.&lt;br /&gt;Ad esempio spesso mi imbatto nel dilemma : "&lt;span style="font-style:italic;"&gt;Dov'è la voce di menù del finder per abilitare/disabilitare la visualizzazione dei file nascosi?&lt;/span&gt;".&lt;br /&gt;La risposta è ....&lt;br /&gt;&lt;span id="fullpost"&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt; Se Maometto non va dalla montagna, la montagna va da Maometto&lt;/span&gt;.&lt;br /&gt;Per cui mi sono creato uno script mediante cui abilitare e disabilitare i file nascosti tramite una semplicissima dialog.&lt;br /&gt;Vediamo il codice : &lt;br /&gt;&lt;pre name="code" class="Java"&gt;tell application "Finder" to quit&lt;br /&gt;&lt;br /&gt;display dialog "Visualizza Files nascosti…" buttons {"Si", "No", "Annulla"} default button 3 with title "File Nascosti"&lt;br /&gt;copy the result as list to {buttonpressed}&lt;br /&gt;&lt;br /&gt;try&lt;br /&gt; if the buttonpressed is "No" then do shell script ¬&lt;br /&gt;  "defaults write com.apple.finder AppleShowAllFiles OFF"&lt;br /&gt; if the buttonpressed is "Si" then do shell script ¬&lt;br /&gt;  "defaults write com.apple.finder AppleShowAllFiles ON"&lt;br /&gt;end try&lt;br /&gt;&lt;br /&gt;tell application "Finder" to launch&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;E' necessario quindi creare un nuovo file mediante lo &lt;span style="font-weight:bold;"&gt;script editor&lt;/span&gt;, salvare il file ed esegurlo quando desiderate.&lt;br /&gt;Il risultato è il seguente :&lt;br /&gt;&lt;br/&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_Ds8LLsbVUlc/SUVaGd1OGFI/AAAAAAAAACE/KaUpTqyvKtk/s1600-h/Immagine+12.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 200px; height: 88px;" src="http://3.bp.blogspot.com/_Ds8LLsbVUlc/SUVaGd1OGFI/AAAAAAAAACE/KaUpTqyvKtk/s200/Immagine+12.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5279725205295339602" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br/&gt;&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/4104693577726899381-4912521637688000913?l=franziale.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://franziale.blogspot.com/feeds/4912521637688000913/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4104693577726899381&amp;postID=4912521637688000913' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4104693577726899381/posts/default/4912521637688000913'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4104693577726899381/posts/default/4912521637688000913'/><link rel='alternate' type='text/html' href='http://franziale.blogspot.com/2008/12/abilitaredisabilitare-visualizzazione.html' title='Abilitare/disabilitare visualizzazione file nascosti nel Finder di Mac Os X'/><author><name>Alessandro Franzi</name><uri>http://www.blogger.com/profile/08478173128603059576</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_Ds8LLsbVUlc/SNa0YcPXutI/AAAAAAAAAAM/D3DZA5UBU-4/S220/go_with_the_flow_281x211.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_Ds8LLsbVUlc/SUVaGd1OGFI/AAAAAAAAACE/KaUpTqyvKtk/s72-c/Immagine+12.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4104693577726899381.post-5504624499078631740</id><published>2008-12-12T10:46:00.000+01:00</published><updated>2008-12-14T10:14:39.836+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Comparator'/><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='Comparable'/><category scheme='http://www.blogger.com/atom/ns#' term='ArrayList'/><title type='text'>Ordinare ArrayList in Java</title><content type='html'>In Java è indispensabile a volte dover ordinare collezioni di oggetti in maniera "&lt;span style="font-style:italic;"&gt;custom&lt;/span&gt;". Se ad esempio avessimo un &lt;span style="font-style:italic;"&gt;ArrayList&lt;/span&gt; di stringhe e volessimo ordinare tale collezione in ordine lessicologico, basterebbe richiamare il metodo : &lt;span style="font-style:italic;"&gt;Collections.sort(arrayList);&lt;/span&gt;.&lt;br /&gt;Tale operazione però su altri tipi di oggetti non funziona, poichè bisogna definire i criteri in base ai quali tale collezione andrebbe ordinata.&lt;br /&gt;&lt;span id="fullpost"&gt;&lt;br /&gt;Ci sono 2 possibili approcci per la risoluzione di questo genere di problematiche.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Modificare la classe facendole implementare l'interfaccia Comparable&lt;/span&gt;&lt;br /&gt;E' necessario che l'oggetto che inseriamo all'interno della collection implementi l'interfaccia &lt;span style="font-style:italic;"&gt;Comparable&lt;/span&gt; e quindi bisogna definire il metodo &lt;span style="font-style:italic;"&gt;compareTo&lt;/span&gt; che rappresenta il metodo richiamato dal Collections.sort per poter stabilire con quale criterio ordinare.&lt;br /&gt;Vediamo un esempio : &lt;br /&gt;&lt;pre name="code" class="Java"&gt;public class MyClass implements Comparable {&lt;br /&gt;public int ordine;&lt;br /&gt;....&lt;br /&gt; public int compareTo(Object o) {&lt;br /&gt;     if (o!=null){&lt;br /&gt;      MyClass objOfMyClass = (MyClass)o;&lt;br /&gt;      // qui ci arriva solo se i titoli sono uguali o un titolo è nullo quindi confronto i codici edizione&lt;br /&gt;      if (ordine&gt;objOfMyClass.ordine){&lt;br /&gt;       return 1;&lt;br /&gt;      }else{&lt;br /&gt;       if (ordine==objOfMyClass.ordine){&lt;br /&gt;        return 0;&lt;br /&gt;       }&lt;br /&gt;      }&lt;br /&gt;     }&lt;br /&gt;     return -1;&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Per poter ordinare L'ArrayList quindi basta richiamare il metodo:&lt;br /&gt;&lt;pre name="code" class="Java"&gt;List arrayList = new ArrayList ();&lt;br /&gt;arrayList.add(myObj1);&lt;br /&gt;arrayList.add(myObj2);&lt;br /&gt;.....&lt;br /&gt;Collections.sort(arrayList);&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Creare una classe che implementa Comparator&lt;/span&gt;&lt;br /&gt;Questo metodo necessita la creazione di una classe che funge da "Comparator" tra 2 oggetti. E' necessario quindi che tale classe implementi il metodo &lt;span style="font-style:italic;"&gt;compare&lt;/span&gt; mediante cui il metodo Collection.sort riesce a stabilire l'ordine richiamandolo con i 2 oggetti che intende confrontare.&lt;br /&gt;Vediamo un esempio :&lt;br /&gt;&lt;pre name="code" class="Java"&gt;public class OrderComparator implements Comparator {&lt;br /&gt;    public int compare(Object obj1, Object obj2) {&lt;br /&gt;        if (obj1!=null &amp;&amp; obj1!=null){&lt;br /&gt;      MyClass objOfMyClass1 = (MyClass)obj1;&lt;br /&gt;   MyClass objOfMyClass2 = (MyClass)obj2;&lt;br /&gt;      if (objOfMyClass1.ordine&gt;objOfMyClass2.ordine){&lt;br /&gt;       return 1;&lt;br /&gt;      }else{&lt;br /&gt;       if (objOfMyClass1.ordine==objOfMyClass2.ordine){&lt;br /&gt;        return 0;&lt;br /&gt;       }&lt;br /&gt;      }&lt;br /&gt;     }&lt;br /&gt;     return -1;&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Per poter ordinare L'ArrayList quindi basta richiamare il metodo:&lt;br /&gt;&lt;pre name="code" class="Java"&gt;List arrayList = new ArrayList ();&lt;br /&gt;arrayList.add(myObj1);&lt;br /&gt;arrayList.add(myObj2);&lt;br /&gt;.....&lt;br /&gt;Collections.sort(arrayList,new OrderComparator () );&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Naturalmente è possibile definire una serie di comparator da utilizzare quando e come si vuole, in maniera tale da poter avere a disposizione diversi criteri di ordinamento per uno stesso tipo di Classe.&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/4104693577726899381-5504624499078631740?l=franziale.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://franziale.blogspot.com/feeds/5504624499078631740/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4104693577726899381&amp;postID=5504624499078631740' title='1 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4104693577726899381/posts/default/5504624499078631740'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4104693577726899381/posts/default/5504624499078631740'/><link rel='alternate' type='text/html' href='http://franziale.blogspot.com/2008/12/ordinare-arraylist-in-java.html' title='Ordinare ArrayList in Java'/><author><name>Alessandro Franzi</name><uri>http://www.blogger.com/profile/08478173128603059576</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_Ds8LLsbVUlc/SNa0YcPXutI/AAAAAAAAAAM/D3DZA5UBU-4/S220/go_with_the_flow_281x211.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4104693577726899381.post-4447960367302048269</id><published>2008-12-10T12:26:00.000+01:00</published><updated>2008-12-10T12:44:47.360+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Assert'/><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='Eclipse'/><category scheme='http://www.blogger.com/atom/ns#' term='MyEclipse'/><title type='text'>Assert in Java :  cosa sono e come configurare Eclipse o MyEclipse per poterle utilizzare</title><content type='html'>Mi è capitato in questi giorni di aver a che fare con CheckStyle, un progetto openSource che ho scaricato da sourceForge ed ho importato come Java Project nel mio Eclipse.&lt;br /&gt;Mi sono ritrovato davanti ad una serie di errori provocati da alcune istruzioni del tipo &lt;span style="font-style:italic;"&gt;assert line != null;&lt;/span&gt; la cui sintassi mi era del tutto sconosciuta. &lt;br /&gt;Non ero l'unico a cui era sconosciuta... anche il mio Eclipse segnava tutte le occorrenza di questa keyword con un errore.&lt;br /&gt;&lt;span id="fullpost"&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Cosa sono le assert?&lt;/span&gt;&lt;br /&gt;Le assert sono istruzioni che verificano la verità di una condizione booleana, e provocano la terminazione del programma (mediante il lancio di un AssertionError) nel caso in cui tale condizione risulti falsa. Ad esempio l'istruzione:&lt;br /&gt;&lt;pre name="code" class="Java"&gt;assert a + b &gt; 0;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;provocherà la terminazione del programma qualora la somma dei valori a e b sia uguale o inferiore a zero. In prima istanza, la semantica dell'assert si riconduce ad una forma compatta per espressioni del tipo:&lt;br /&gt;&lt;pre name="code" class="Java"&gt;if(!(a+b&gt;0))&lt;br /&gt;throw new AssertException();&lt;/pre&gt;&lt;br /&gt; Da un punto di vista tecnico, il costrutto delle assert prevede la possibilità di disabilitare in blocco il controllo delle condizioni: come vedremo più avanti, le assert vengono usate essenzialmente in fase di test e debugging: durante la normale esecuzione, è possibile disabilitarle, eliminando in tal modo l'overhead legato alla loro gestione. Ma esiste anche una differenza assai sottile sul piano filosofico, che rende l'assert un qualcosa di completamente diverso da qualunque altro costrutto presente in Java. Contrariamente a quanto avviene con i costrutti standard dei linguaggi imperativi, una assert non rappresenta un ordine, ma un punto di vista: essa indica una condizione che il programmatore ritiene debba essere vera in un determinato momento dell'esecuzione di un programma. La violazione di tale condizione causerà la terminazione del programma, dal momento che si è verificato qualcosa che il programmatore non aveva previsto. Mai e in nessun caso una assert potrà contenere direttive che influenzino la normale esecuzione del programma.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Come configurare Eclipse o MyEclipse per compilare le assert&lt;/span&gt;&lt;br /&gt;Nella versione 3.1 o successive di Eclipse (Per MyEclipse dalla versione 6.0), è necessario accedere al menù &lt;span style="font-style:italic;"&gt;Window -&gt; Preferences -&gt; Java -&gt; Compiler&lt;/span&gt; e settare per quanto riguarda il gruppo &lt;span style="font-style:italic;"&gt;JDK Compliance&lt;/span&gt; il Compiler Compliance Level su 1.4 o 5.0 in base alla versione desiderata e selezionare le seguenti voci : &lt;br /&gt;&lt;br /&gt;        Compiler Compliance Level: 1.4 (o 5.0)&lt;br /&gt;        Use default compliance settings : non Selezionata&lt;br /&gt;        Generated .class files compatibility: 1.4 (o 5.0)&lt;br /&gt;        Source compatibility: 1.4 (o 5.0)&lt;br /&gt;        Disallow identifiers called 'assert': Error&lt;br /&gt;        .....&lt;br /&gt;&lt;br /&gt;In questo modo eclipse dopo aver eseguito il rebuild del progetto riconoscerà tali costrutti e vi permetterà di utilizzarli e compilarli.&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/4104693577726899381-4447960367302048269?l=franziale.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://franziale.blogspot.com/feeds/4447960367302048269/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4104693577726899381&amp;postID=4447960367302048269' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4104693577726899381/posts/default/4447960367302048269'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4104693577726899381/posts/default/4447960367302048269'/><link rel='alternate' type='text/html' href='http://franziale.blogspot.com/2008/12/assert-in-java-cosa-sono-e-come.html' title='Assert in Java :  cosa sono e come configurare Eclipse o MyEclipse per poterle utilizzare'/><author><name>Alessandro Franzi</name><uri>http://www.blogger.com/profile/08478173128603059576</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_Ds8LLsbVUlc/SNa0YcPXutI/AAAAAAAAAAM/D3DZA5UBU-4/S220/go_with_the_flow_281x211.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4104693577726899381.post-972553963945470287</id><published>2008-12-02T13:06:00.000+01:00</published><updated>2008-12-04T13:34:50.608+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Javascript'/><title type='text'>Recuperare un oggetto Javascript senza problemi (in popup, frame, etc..)</title><content type='html'>Chiunque ami o odi Javascript può trovarsi ad un problema del tipo : "Litigare con la gerarchia degli oggetti oggetti del documento per poterne individuare uno" come ad esempio &lt;span style="font-style:italic;"&gt;window.parent.window.opener.document....&lt;/span&gt;. A volte questo lavoro è talmente arduo da indurre il programmatore a ridurre la propria pazienza in brandelli.&lt;br /&gt;La perdita di tempo può notevolmente aumentare quando ad esempio si utilizzano popup o frame.&lt;br /&gt;Però una soluzione esiste....&lt;br /&gt;&lt;span id="fullpost"&gt;&lt;br /&gt;Il sottoscritto non adora dover incorrere 2 volte nello stesso problema, così mi sono creato una funzione alla quale dare in pasto il nome dell'oggetto da recuperare e il nome del primo oggetto non nullo da cui far partire la nostra ricerca.&lt;br /&gt;Ecco il codice : &lt;br /&gt;&lt;pre name="code" class="Java"&gt;function takeObject(){                                                             &lt;br /&gt; objReceived = searchElement("window","objtoFind"); &lt;br /&gt; if (objReceived == null){&lt;br /&gt;  alert ('non trovato');&lt;br /&gt; }else{&lt;br /&gt;  alert(objReceived.value);&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;var ArrayFramesToJump = ["onbeforeunload","onafterprint","top",&lt;br /&gt; "location","parent","offscreenBuffering","frameElement",&lt;br /&gt; "onerror","screen","event","clipboardData","onresize","defaultStatus",&lt;br /&gt; "onblur","window","onload","onscroll","screenTop","onfocus","Option",&lt;br /&gt; "length","onbeforeprint","frames","self","clientInformation","external",&lt;br /&gt; "screenLeft","opener","onunload","document","closed","history","Image",&lt;br /&gt; "navigator","status","onhelp","name"];&lt;br /&gt;&lt;br /&gt;String.prototype.endsWith = function(str)&lt;br /&gt;{return (this.match(str+"$")==str)}&lt;br /&gt;&lt;br /&gt;Array.prototype.contains = function (element) {&lt;br /&gt;for (var i = 0; i &lt; this.length; i++) {&lt;br /&gt;if (this[i] == element) {&lt;br /&gt;return true;&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;return false;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;function searchElement (lastNotNull,divName){&lt;br /&gt; &lt;br /&gt; eval ("var last = "+lastNotNull+";");&lt;br /&gt; // DEBUG : alert(lastNotNull);&lt;br /&gt; if (last){&lt;br /&gt;  // document (non posso concatenare 2 document)&lt;br /&gt;  if (!lastNotNull.endsWith("document")){&lt;br /&gt;   eval("var docum = "+lastNotNull+".document;");&lt;br /&gt;   if (docum!=null){&lt;br /&gt;    if (docum.getElementById(divName)!=null){&lt;br /&gt;     alert (lastNotNull+".document.getElementById('"+divName+"')");&lt;br /&gt;     return docum.getElementById(divName);&lt;br /&gt;    }else{&lt;br /&gt;     var objReceived = searchElement(lastNotNull+".document",divName);&lt;br /&gt;                                        if (objReceived !=null){&lt;br /&gt;      return objReceived;&lt;br /&gt;     }&lt;br /&gt;    }&lt;br /&gt;   }&lt;br /&gt;  }&lt;br /&gt;  // parent (evito di avere 2 parent per non incorrere in problemi ma&lt;br /&gt;  // potenzialmente è possibile che ce ne siano 2)&lt;br /&gt;  eval("var par = "+lastNotNull+".parent;");&lt;br /&gt;  if (lastNotNull.indexOf('parent') == -1){&lt;br /&gt;   if (par!=null){&lt;br /&gt;    var objReceived = searchElement(lastNotNull+".parent",divName);&lt;br /&gt;    if (objReceived !=null){&lt;br /&gt;     return objReceived;&lt;br /&gt;    }&lt;br /&gt;   }&lt;br /&gt;  }&lt;br /&gt;  // window (non posso concatenare 2 window&lt;br /&gt;  eval("var windo= "+lastNotNull+".window;");&lt;br /&gt;  if (!lastNotNull.endsWith("window")){&lt;br /&gt;   if (windo!=null){&lt;br /&gt;    var objReceived = searchElement(lastNotNull+".window",divName);&lt;br /&gt;    if (objReceived !=null){&lt;br /&gt;     return objReceived;&lt;br /&gt;    }&lt;br /&gt;   }&lt;br /&gt;  }&lt;br /&gt;  // opener&lt;br /&gt;  eval("var ope= "+lastNotNull+".opener;");&lt;br /&gt;  if (ope!=null){&lt;br /&gt;   var objReceived = searchElement(lastNotNull+".opener",divName);&lt;br /&gt;   if (objReceived !=null){&lt;br /&gt;    return objReceived;&lt;br /&gt;   }&lt;br /&gt;  }&lt;br /&gt; &lt;br /&gt; // tutti i frame fratelli&lt;br /&gt;  if (lastNotNull.endsWith("parent")){&lt;br /&gt;   eval("var frameset= "+lastNotNull+".frames;");&lt;br /&gt;   if (frameset){&lt;br /&gt;    // se esiste il frameset&lt;br /&gt;    for (var framecurr in frameset) {&lt;br /&gt;     if (!ArrayFramesToJump.contains(framecurr)){&lt;br /&gt;      var currframeObj = frameset[framecurr];&lt;br /&gt;      if (currframeObj!=null){&lt;br /&gt;       // se ho intercettato il frame&lt;br /&gt;       var objReceived = searchElement(lastNotNull+".frames['"+framecurr+"']",divName);&lt;br /&gt;       if (objReceived !=null){&lt;br /&gt;        return objReceived;&lt;br /&gt;       }&lt;br /&gt;       }&lt;br /&gt;     }&lt;br /&gt;    }&lt;br /&gt;   }&lt;br /&gt; }&lt;br /&gt; }&lt;br /&gt; return null;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;// richiamo la funzione &lt;br /&gt;takeObject();&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Come si può notare la funzione esegue ricorsivamente la ricerca dell'oggetto, senza ingappare in loop infiniti visto che in Javascript ad esempio è possibile utilizzare &lt;span style="font-style:italic;"&gt;window.window&lt;/span&gt; oppure &lt;span style="font-style:italic;"&gt;window.parent.window.parent&lt;/span&gt;.&lt;br /&gt;Il risultato è il riferimento all'oggetto nel caso venga trovato o &lt;span style="font-style:italic;"&gt;null &lt;/span&gt; per un esito negativo della ricerca.&lt;br /&gt;Spero sia utile a farvi risparmiare un sacco di tempo.&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/4104693577726899381-972553963945470287?l=franziale.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://franziale.blogspot.com/feeds/972553963945470287/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4104693577726899381&amp;postID=972553963945470287' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4104693577726899381/posts/default/972553963945470287'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4104693577726899381/posts/default/972553963945470287'/><link rel='alternate' type='text/html' href='http://franziale.blogspot.com/2008/12/recuperare-un-oggetto-javascript-senza.html' title='Recuperare un oggetto Javascript senza problemi (in popup, frame, etc..)'/><author><name>Alessandro Franzi</name><uri>http://www.blogger.com/profile/08478173128603059576</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_Ds8LLsbVUlc/SNa0YcPXutI/AAAAAAAAAAM/D3DZA5UBU-4/S220/go_with_the_flow_281x211.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4104693577726899381.post-2808583026400987952</id><published>2008-11-30T19:20:00.000+01:00</published><updated>2008-11-30T19:52:05.054+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Terminal'/><category scheme='http://www.blogger.com/atom/ns#' term='Mac OS X'/><title type='text'>Terminale colorato su Mac Os X</title><content type='html'>Potrebbe risultare "simpatico" perchè di utilità ha ben poco, rendere il terminale di Mac Os X colorato come potete trovarlo su diverse distro di Linux.&lt;br /&gt;&lt;br /&gt;&lt;span id="fullpost"&gt;&lt;br /&gt;Il primo passo da eseguire è editare il file &lt;span style="font-style:italic;"&gt;/private/etc/bashrc&lt;/span&gt; con il seguente comando :&lt;br /&gt;&lt;pre name="code" class="java"&gt;nano /private/etc/bashrc&lt;/pre&gt;&lt;br /&gt;Basterà quindi appendere in coda al vostro file le seguenti righe :&lt;br /&gt;&lt;pre name="code" class="java"&gt;case $TERM in&lt;br /&gt;xterm* | aterm | rxvt | screen )&lt;br /&gt;PROMPT_COMMAND='echo -ne "\033]0;${PWD/$HOME/~}\007"'&lt;br /&gt;;;&lt;br /&gt;* )&lt;br /&gt;;;&lt;br /&gt;esac&lt;br /&gt;&lt;br /&gt;PS1='\[\e[33m\]\u\[\e[36m\]@\[\e[31m\]\h\[\e[32m\]:\W\[\e[0m\]&gt; '&lt;br /&gt;&lt;br /&gt;alias ls='ls -G'&lt;br /&gt;LSCOLORS='gxbxcxdxexegedabagabce'&lt;br /&gt;export LSCOLORS&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Salvate il file e riavviate il terminale. Otterrete come risultato il vostro terminale colorato.&lt;br /&gt;Naturalmente i colori potrete modificarli a vostro piacimento nel seguente modo : &lt;br /&gt;Per cambiare i colori bisogna modificare l'assegnazione di LSCOLORS, dove ogni coppia di due lettere corrisponde all'effetto che otterrete sull'oggetto(1: colore testo - 2: colore sfondo) a cui si riferisce secondo questo elenco:&lt;br /&gt;&lt;br /&gt;a nero&lt;br /&gt;b rosso&lt;br /&gt;c verde&lt;br /&gt;d marrone&lt;br /&gt;e blu&lt;br /&gt;f magenta&lt;br /&gt;g ciano&lt;br /&gt;h grigio chiaro&lt;br /&gt;A nero matto, solitamente visualizzato come grigio scuro&lt;br /&gt;B rosso matto&lt;br /&gt;C verde matto&lt;br /&gt;D marrone matto, solitamente visualizzato come giallo&lt;br /&gt;E blu matto&lt;br /&gt;F magenta matto&lt;br /&gt;G cyan matto&lt;br /&gt;H grigio chiaro matto; sembra color panna&lt;br /&gt;x sfondo o scritta del colore prefefinito&lt;br /&gt;&lt;br /&gt;Per quanto riguarda le posizioni :&lt;br /&gt;&lt;br /&gt;1. directory&lt;br /&gt;2. link simbolico (alias)&lt;br /&gt;3. socket&lt;br /&gt;4. pipe&lt;br /&gt;5. eseguibile&lt;br /&gt;6. blocco speciale&lt;br /&gt;7. carattere special&lt;br /&gt;8. eseguibile con setuid bit impostato&lt;br /&gt;9. eseguibile con setgid bit impostato&lt;br /&gt;10. directory scrivibile da altri, con sticky bit&lt;br /&gt;11. directory scrivibile da altri, senza sticky bit&lt;br /&gt;12. Quindi prendendo la seguente '&lt;span style="font-weight:bold;"&gt;gxbxcxdxexegedabagabce&lt;/span&gt;' si ottiene:&lt;br /&gt;&lt;br /&gt;gx bx cx dx ex eg ed ab ag ab ce&lt;br /&gt;&lt;br /&gt;ed interpretandola con l'oggetto che va a puntare risulta:&lt;br /&gt;&lt;br /&gt;1) directory -&gt; gx (g = ciano | x = sfondo di default) -- ottengo le directory colorate di ciano&lt;br /&gt;2) link simbolico -&gt; bx (f = rosso | x = sfondo di default) -- ottengo gli alias di colore rosso&lt;br /&gt;&lt;br /&gt;e così via, ricordando che la prima lettera è il colore della scritta mentre la seconda si riferisce al colore dello sfondo. Se io per esempio (qui sopra) al posto di "gx" mettessi "bf" otterrei "scritta rossa su sfondo magenta".&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/4104693577726899381-2808583026400987952?l=franziale.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://franziale.blogspot.com/feeds/2808583026400987952/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4104693577726899381&amp;postID=2808583026400987952' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4104693577726899381/posts/default/2808583026400987952'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4104693577726899381/posts/default/2808583026400987952'/><link rel='alternate' type='text/html' href='http://franziale.blogspot.com/2008/11/terminale-colorato-su-mac-os-x.html' title='Terminale colorato su Mac Os X'/><author><name>Alessandro Franzi</name><uri>http://www.blogger.com/profile/08478173128603059576</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_Ds8LLsbVUlc/SNa0YcPXutI/AAAAAAAAAAM/D3DZA5UBU-4/S220/go_with_the_flow_281x211.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4104693577726899381.post-910528965056531700</id><published>2008-11-27T23:03:00.000+01:00</published><updated>2008-11-27T23:12:43.240+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Finder'/><category scheme='http://www.blogger.com/atom/ns#' term='AppleScript'/><category scheme='http://www.blogger.com/atom/ns#' term='Mac OS X'/><title type='text'>Inviare file come allegato mediante il Finder di Mac Os X</title><content type='html'>La potenza di &lt;span style="font-weight:bold;"&gt;Mac Os X&lt;/span&gt; come OS risiede proprio nella caratteristica di riuscire ad eseguire qualunque operazione con un numero di click davvero minimi. E' un OS davvero incredibile, ma nella sua incredibilità alcune funzionalità sembrano mancare, come ad esempio la possibilità di Inviare un file come allegato di una mail mediante il menù contestuale (quello che si ottiene mediante la pressione del tasto destro del mouse).&lt;br /&gt;&lt;span id="fullpost"&gt;&lt;br /&gt;Per questo motivo ho creato uno script mediante cui, una volta aggiunto, è possibile selezionare uno o più file tramite il finder, premere il tasto destro del mouse e trovare sotto la voce &lt;span style="font-style:italic;"&gt;Automator&lt;/span&gt; -&gt; &lt;span style="font-style:italic;"&gt;Invia tramite Mail&lt;/span&gt;.&lt;br /&gt;Quello che bisogna fare sono i seguenti passi:&lt;br /&gt;Aprire Automator&lt;br /&gt;Creare un nuovo Script ad Hoc&lt;br /&gt;Incollare il seguente script : &lt;br /&gt;&lt;pre name="code" class="Java"&gt;on run {input, parameters}&lt;br /&gt; tell application "Mail"&lt;br /&gt;  set new_message to make new outgoing message with properties {visible:true}&lt;br /&gt;  repeat with theItem in input&lt;br /&gt;   set selectedItem to (theItem) &lt;br /&gt;   tell content of new_message&lt;br /&gt;    make new attachment with properties {file name:selectedItem} at after last paragraph&lt;br /&gt;   end tell&lt;br /&gt;  end repeat&lt;br /&gt; end tell&lt;br /&gt; return input&lt;br /&gt;end run&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Scegliere dal menù &lt;span style="font-style:italic;"&gt;Archivio&lt;/span&gt;-&gt;&lt;span style="font-style:italic;"&gt;Registra come plugin&lt;/span&gt;&lt;br /&gt;Inserire come nome : &lt;span style="font-style:italic;"&gt;Invia come allegato di posta elettronica&lt;/span&gt;&lt;br /&gt;Scegliere nella combobox "Plugin in" la voce : &lt;span style="font-style:italic;"&gt;Finder&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Adesso avrete questa funzionalità anche con Mac Os X.&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/4104693577726899381-910528965056531700?l=franziale.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://franziale.blogspot.com/feeds/910528965056531700/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4104693577726899381&amp;postID=910528965056531700' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4104693577726899381/posts/default/910528965056531700'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4104693577726899381/posts/default/910528965056531700'/><link rel='alternate' type='text/html' href='http://franziale.blogspot.com/2008/11/inviare-file-come-allegato-mediante-il.html' title='Inviare file come allegato mediante il Finder di Mac Os X'/><author><name>Alessandro Franzi</name><uri>http://www.blogger.com/profile/08478173128603059576</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_Ds8LLsbVUlc/SNa0YcPXutI/AAAAAAAAAAM/D3DZA5UBU-4/S220/go_with_the_flow_281x211.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4104693577726899381.post-8687515684942906872</id><published>2008-11-25T21:11:00.000+01:00</published><updated>2008-11-25T21:22:09.305+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Javascript'/><category scheme='http://www.blogger.com/atom/ns#' term='Ajax'/><title type='text'>Interpetare il Javascript incluso in un DIV mediante innerHTML con Ajax</title><content type='html'>Una classica modalità di utilizzo di Ajax è quella in cui in maniera asincrona viene chiamata una pagina (jsp,aspx,php,..) la quale alla fine della propria esecuzione restituisce al controller Ajax l'html ottenuto.&lt;br /&gt;Nella maggiorparte dei casi si tende ad utilizzare tale html per visualizzare nella pagina chiamante il risultato ottenuto in un DIV senza dover ricaricare la pagina.&lt;br /&gt;Un problema in cui si incorre in questa tipologia di approccio è rappresentato dall'interpretazione da parte del browser del javascript che può essere contenuto in questa pagina inclusa all'interno del DIV.&lt;br /&gt;Il problema stà nel fatto che il browser, carica i javascript man mano che carica la pagina, quando in maniera asincrona si và a "riempire" un div mediante la proprietà innerHTML, il browser non si preoccupa di caricare i javascript contenuti.&lt;br /&gt;&lt;span id="fullpost"&gt;&lt;br /&gt;A volte, quando non si ha la necessità di dover generare gli script in maniera dinamica, è possibile ovviare a tale problema includendo il codice all'interno della pagina principale. In altri casi è necessario costruire gli script in maniera dinamica, quindi può essere davvero utile adottare la seguente strategia per poter risolvere il problema.&lt;br /&gt;Il sorgente seguente rappresenta la pagina principale.&lt;br /&gt;&lt;pre name="code" class="Html"&gt;&amp;lt;!DOCTYPE html PUBLIC &amp;quot;-//W3C//DTD XHTML 1.0 Transitional//EN&amp;quot; &amp;quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd&amp;quot;&amp;gt;&lt;br /&gt;&amp;lt;html xmlns=&amp;quot;http://www.w3.org/1999/xhtml&amp;quot; &amp;gt;&lt;br /&gt;&amp;lt;head&amp;gt;&lt;br /&gt;    &amp;lt;title&amp;gt;Pagina senza titolo&amp;lt;/title&amp;gt;&lt;br /&gt;    &amp;lt;script type=&amp;quot;text/javascript&amp;quot; src=&amp;quot;../js/libreria.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;&amp;lt;script language=&amp;quot;javascript&amp;quot; type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;// &amp;lt;!CDATA[&lt;br /&gt;&lt;br /&gt;function Button1_onclick() &lt;br /&gt;{&lt;br /&gt;    //faccio la richiesta alla pagina php o jsp che restituisce&lt;br /&gt;    //&amp;lt;p&amp;gt;Ciao&amp;lt;/p&amp;gt;&amp;lt;_script language=\&amp;quot;javascript\&amp;quot;&amp;gt;alert('pippo')&amp;lt;/_script&amp;gt;&lt;br /&gt;    ajax(&amp;quot;a.asp&amp;quot;, onload);&lt;br /&gt;    function onload()&lt;br /&gt;    {&lt;br /&gt;        //t contiene la risposta&lt;br /&gt;        var t = this.request.responseText;&lt;br /&gt;        &lt;br /&gt;        //execJS esegue javascript contenuto in t e restituisce&lt;br /&gt;        //t senza javascript&lt;br /&gt;        t = execJS(t);&lt;br /&gt;        &lt;br /&gt;        //finalmente metto t 'pulito' dento il div&lt;br /&gt;        $(&amp;quot;div1&amp;quot;).innerHTML = t;&lt;br /&gt;        &lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;// ]]&amp;gt;&lt;br /&gt;&amp;lt;/script&amp;gt;&lt;br /&gt;&amp;lt;/head&amp;gt;&lt;br /&gt;&amp;lt;body&amp;gt;&lt;br /&gt;    &amp;lt;input id=&amp;quot;Button1&amp;quot; type=&amp;quot;button&amp;quot; value=&amp;quot;button&amp;quot; onclick=&amp;quot;return Button1_onclick()&amp;quot; /&amp;gt;&lt;br /&gt;    &amp;lt;div id=&amp;quot;div1&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&amp;lt;/body&amp;gt;&lt;br /&gt;&amp;lt;/html&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;La funzione javascript &lt;span style="font-style:italic;"&gt;execJS&lt;/span&gt; è definita così:&lt;br /&gt;&lt;pre name="code" class="Java"&gt;function execJS(t)&lt;br /&gt;{&lt;br /&gt;    var p1 = 0, p2 = 0, p3 = 0, p4 = 0;&lt;br /&gt;    p1 = t.indexOf("&lt;" + "script", 0);&lt;br /&gt;    if(p1 == -1) return t;&lt;br /&gt;    &lt;br /&gt;    p2 = t.indexOf("&gt;", p1 + 7) + 1;&lt;br /&gt;    p3 = t.indexOf("&lt;" + "/script&gt;", p2);&lt;br /&gt;    p4 = p3 + 9;&lt;br /&gt;    &lt;br /&gt;    var c = t.substring(p2, p3);&lt;br /&gt;    var s = document.createElement("script");&lt;br /&gt;    s.type = "text/javascript";&lt;br /&gt;    s.text = c;&lt;br /&gt;    document.getElementsByTagName("head")[0].appendChild(s);&lt;br /&gt;    &lt;br /&gt;    t = t.substring(0, p1) + t.substr(p4);&lt;br /&gt;    return execJS(t);&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&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/4104693577726899381-8687515684942906872?l=franziale.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://franziale.blogspot.com/feeds/8687515684942906872/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4104693577726899381&amp;postID=8687515684942906872' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4104693577726899381/posts/default/8687515684942906872'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4104693577726899381/posts/default/8687515684942906872'/><link rel='alternate' type='text/html' href='http://franziale.blogspot.com/2008/11/interpetare-il-javascript-incluso-in-un.html' title='Interpetare il Javascript incluso in un DIV mediante innerHTML con Ajax'/><author><name>Alessandro Franzi</name><uri>http://www.blogger.com/profile/08478173128603059576</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_Ds8LLsbVUlc/SNa0YcPXutI/AAAAAAAAAAM/D3DZA5UBU-4/S220/go_with_the_flow_281x211.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4104693577726899381.post-9001884070882902579</id><published>2008-11-25T15:59:00.000+01:00</published><updated>2008-11-25T19:39:21.337+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Javascript'/><category scheme='http://www.blogger.com/atom/ns#' term='Input'/><title type='text'>Inserire solo numeri in un Input Text</title><content type='html'>Ecco un piccolo javascript tramite il quale permettere ad una textbox di accettare solamente cifre durante la digitazione.&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="Java"&gt;function isNumberKey(evt){&lt;br /&gt;   var charCode = (evt.which) ? evt.which : event.keyCode&lt;br /&gt;   if (charCode &gt; 31 &amp;&amp; (charCode &lt; 48 || charCode &gt; 57))&lt;br /&gt;      return false;&lt;br /&gt;&lt;br /&gt;   return true;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Questo script può essere utilizzando in maniera semplicissima all'interno del tag HTML nel seguente modo:&lt;br /&gt;&lt;pre name="code" class="html"&gt;&amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;codice&amp;quot; maxlength=&amp;quot;7&amp;quot; size=&amp;quot;8&amp;quot; onkeypress=&amp;quot;return isNumberKey(event)&amp;quot;&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4104693577726899381-9001884070882902579?l=franziale.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://franziale.blogspot.com/feeds/9001884070882902579/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4104693577726899381&amp;postID=9001884070882902579' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4104693577726899381/posts/default/9001884070882902579'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4104693577726899381/posts/default/9001884070882902579'/><link rel='alternate' type='text/html' href='http://franziale.blogspot.com/2008/11/inserire-solo-numeri-in-un-input-text.html' title='Inserire solo numeri in un Input Text'/><author><name>Alessandro Franzi</name><uri>http://www.blogger.com/profile/08478173128603059576</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_Ds8LLsbVUlc/SNa0YcPXutI/AAAAAAAAAAM/D3DZA5UBU-4/S220/go_with_the_flow_281x211.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4104693577726899381.post-8679927591352904973</id><published>2008-11-25T13:07:00.000+01:00</published><updated>2008-11-25T19:40:54.961+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Javascript'/><title type='text'>Stampare in Javascript il contenuto di un DIV</title><content type='html'>Ecco un utile funzione per stampare il contenuto di un solo div mediante la funzione &lt;span style="font-style:italic;"&gt;window.open&lt;/span&gt; di javascript.&lt;br /&gt;&lt;span id="fullpost"&gt;&lt;br /&gt;Il codice da utilizzare è il seguente:&lt;br /&gt;&lt;pre name="code" class="Java"&gt;&amp;lt;script&amp;gt;&lt;br /&gt;function printDiv()&lt;br /&gt;{&lt;br /&gt; var a = window.open('','','width=300,height=300');&lt;br /&gt; a.document.open(&amp;quot;text/html&amp;quot;);&lt;br /&gt; a.document.write(document.getElementById('foo').innerHTML);&lt;br /&gt; a.document.close();&lt;br /&gt; a.print();&lt;br /&gt;}&lt;br /&gt;&amp;lt;/script&amp;gt;&lt;br /&gt;&amp;lt;div id=&amp;quot;foo&amp;quot;&amp;gt;stuff to print&amp;lt;/div&amp;gt;&lt;br /&gt;&amp;lt;input type=&amp;quot;button&amp;quot; onclick=&amp;quot;printDiv()&amp;quot; value=&amp;quot;print div&amp;quot;&amp;gt;&lt;br /&gt;&lt;/pre&gt;&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/4104693577726899381-8679927591352904973?l=franziale.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://franziale.blogspot.com/feeds/8679927591352904973/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4104693577726899381&amp;postID=8679927591352904973' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4104693577726899381/posts/default/8679927591352904973'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4104693577726899381/posts/default/8679927591352904973'/><link rel='alternate' type='text/html' href='http://franziale.blogspot.com/2008/11/stampare-in-javascript-il-contenuto-di.html' title='Stampare in Javascript il contenuto di un DIV'/><author><name>Alessandro Franzi</name><uri>http://www.blogger.com/profile/08478173128603059576</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_Ds8LLsbVUlc/SNa0YcPXutI/AAAAAAAAAAM/D3DZA5UBU-4/S220/go_with_the_flow_281x211.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4104693577726899381.post-3486912071773272662</id><published>2008-11-25T09:51:00.000+01:00</published><updated>2008-11-25T12:10:36.065+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='Clone'/><title type='text'>Come clonare un oggetto Java</title><content type='html'>Un giorno mi sono imbattuto in un problema alquanto strano, in cui magari si sarà imbattuto chi, come me, ha iniziato a programmare in linguaggi come C o C++ in cui la referenza agli oggetti e il relativo passaggio parametri per valore o per riferimento essendo esplicito era facilmente gestibile.&lt;br /&gt;In Java tutti gli oggetti vengono passati per riferimento, tranne alcuni come le Stringhe ad esempio, per cui ci si può imbattere nell'utilizzo di uno stesso bean in più contesti. Il problema si presenta nel caso in cui venga modificato il valore di qualche proprietà del bean in una parte remota del codice, quindi in tutti i contesti lo stesso viene utilizzato presenterà tali informazioni variate. In alcuni casi è necessario quindi eseguire una copia dell'oggetto. Per questo ci torna utile il metodo &lt;span style="font-weight:bold;"&gt;Clone&lt;/span&gt;.&lt;br /&gt;&lt;span id="fullpost"&gt;&lt;br /&gt;Il metodo &lt;span style="font-style:italic;"&gt;clone&lt;/span&gt; per gli &lt;span style="font-style:italic;"&gt;Object&lt;/span&gt; è di tipo protected, quindi richiamare il metodo clone su un qualsiasi oggetto porta ad un problema di compilazione. E' necessario in primo luogo ridefinire il metodo &lt;span style="font-style:italic;"&gt;clone &lt;/span&gt;, in secondo luogo implementare l'interfaccia Clobeable in modo tale da non incorrere in un eccezione di tipo &lt;span style="font-style:italic;"&gt;CloneNotSupportedException&lt;/span&gt;. Il codice corretto risulta quindi: &lt;br /&gt;&lt;pre name="code" class="Java"&gt;class A implements Cloneable {&lt;br /&gt;        private int x;&lt;br /&gt;        public A(int i) {&lt;br /&gt;            x = i;&lt;br /&gt;        }&lt;br /&gt;        public Object clone() {&lt;br /&gt;            try {&lt;br /&gt;                return super.clone();&lt;br /&gt;            }&lt;br /&gt;            catch (CloneNotSupportedException e) {&lt;br /&gt;                throw new InternalError(e.toString());&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;        public int getx() {&lt;br /&gt;            return x;&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;    &lt;br /&gt;    public class CloneDemo3 {&lt;br /&gt;        public static void main(String args[])&lt;br /&gt;          throws CloneNotSupportedException {&lt;br /&gt;            A obj1 = new A(37);&lt;br /&gt;            A obj2 = (A)obj1.clone();&lt;br /&gt;            System.out.println(obj2.getx());&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&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/4104693577726899381-3486912071773272662?l=franziale.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://franziale.blogspot.com/feeds/3486912071773272662/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4104693577726899381&amp;postID=3486912071773272662' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4104693577726899381/posts/default/3486912071773272662'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4104693577726899381/posts/default/3486912071773272662'/><link rel='alternate' type='text/html' href='http://franziale.blogspot.com/2008/11/come-clonare-un-oggetto-java.html' title='Come clonare un oggetto Java'/><author><name>Alessandro Franzi</name><uri>http://www.blogger.com/profile/08478173128603059576</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_Ds8LLsbVUlc/SNa0YcPXutI/AAAAAAAAAAM/D3DZA5UBU-4/S220/go_with_the_flow_281x211.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4104693577726899381.post-393187049503287355</id><published>2008-11-10T20:09:00.001+01:00</published><updated>2008-11-10T20:18:44.916+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Javascript'/><category scheme='http://www.blogger.com/atom/ns#' term='Dwr'/><category scheme='http://www.blogger.com/atom/ns#' term='SelectBox'/><title type='text'>Javascript, aggiungere options ad una selectbox</title><content type='html'>Una problematica classica di chiunque utilizzi javascript è quella di dover aggiungere delle &lt;span style="font-style:italic;"&gt;option&lt;/span&gt; alle &lt;span style="font-weight:bold;"&gt;selectbox&lt;/span&gt;.&lt;br /&gt;E' possibile facilitarsi il compito creando delle opportune funzioni alle quali passando l'id della select box e un elenco (in questo caso &lt;span style="font-style:italic;"&gt;map&lt;/span&gt; da cui recuperare le opzioni da inserire nella select box esistente aggiorna la textbox senza dover ricaricare la pagina.&lt;br /&gt;Queste funzioni sono utilissime qualora si stessero utilizzando framework Ajax come ad esempio Dwr. In tal caso è sufficiente richiamarle come postback di una chiamata asincrona mediante Ajax.&lt;br /&gt;&lt;span id="fullpost"&gt;&lt;br /&gt;Ecco un esempio di un metodo che svolge questo compito:&lt;br /&gt;&lt;pre name="code" class="javascript"&gt; // metodo per aggiornare qualsiasi tipo di elenco di options&lt;br /&gt; // per id si intende l'id della selectbox&lt;br /&gt; function addOptionValues(_id,_map){ &lt;br /&gt;     var sel = document.getElementById(_id);&lt;br /&gt;     var opt = null;&lt;br /&gt;     if(sel != null){&lt;br /&gt;         for(var prop in _map) {&lt;br /&gt;             opt=document.createElement("option");&lt;br /&gt;             opt.setAttribute("value",prop);&lt;br /&gt;             opt.appendChild(document.createTextNode(_map[prop]));&lt;br /&gt;             sel.appendChild(opt);&lt;br /&gt;         }&lt;br /&gt;     }&lt;br /&gt; }&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Una possibile estensione è la seguente, in cui oltre a specificare l'elenco delle opzioni da aggiungere, ne seleziona una specifica il cui valore viene passato in input : &lt;br /&gt;&lt;pre name="code" class="javascript"&gt;// metodo per aggiornare qualsiasi tipo di elenco di options selezionandone una&lt;br /&gt; // per id si intende l'id della selectbox&lt;br /&gt; function addOptionValuesSel(_id,_map,selez){&lt;br /&gt;  var sel = document.getElementById(_id);&lt;br /&gt;     var opt = null;&lt;br /&gt;     if(sel != null){&lt;br /&gt;         for(var prop in _map) {&lt;br /&gt;             opt=document.createElement("option");&lt;br /&gt;             opt.setAttribute("value",prop);&lt;br /&gt;             if (prop == selez){&lt;br /&gt;              opt.setAttribute("selected","selected");&lt;br /&gt;             }&lt;br /&gt;             opt.appendChild(document.createTextNode(_map[prop]));&lt;br /&gt;             sel.appendChild(opt);&lt;br /&gt;         }&lt;br /&gt;     }     &lt;br /&gt; }&lt;br /&gt;&lt;/pre&gt;&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/4104693577726899381-393187049503287355?l=franziale.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://franziale.blogspot.com/feeds/393187049503287355/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4104693577726899381&amp;postID=393187049503287355' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4104693577726899381/posts/default/393187049503287355'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4104693577726899381/posts/default/393187049503287355'/><link rel='alternate' type='text/html' href='http://franziale.blogspot.com/2008/11/javascript-aggiungere-options-ad-una.html' title='Javascript, aggiungere options ad una selectbox'/><author><name>Alessandro Franzi</name><uri>http://www.blogger.com/profile/08478173128603059576</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_Ds8LLsbVUlc/SNa0YcPXutI/AAAAAAAAAAM/D3DZA5UBU-4/S220/go_with_the_flow_281x211.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4104693577726899381.post-6169420076452093852</id><published>2008-11-10T20:03:00.000+01:00</published><updated>2008-11-10T20:06:44.260+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Javascript'/><category scheme='http://www.blogger.com/atom/ns#' term='QueryString'/><title type='text'>Recuperare parametri da QueryString con Javascript</title><content type='html'>In Javascript può essere utile un metodo per recuperare un determinato parametro da QueryString. Vediamo come poter scrivere una funzione javascript che invocata con il nome del parametro ci restiruisce il valore associato.&lt;br /&gt;&lt;span id="fullpost"&gt;&lt;br /&gt;&lt;pre name="code" class="javascript"&gt;// recuperare parametro query string&lt;br /&gt;function queryString(parameter) { &lt;br /&gt;  var loc = location.search.substring(1, location.search.length);&lt;br /&gt;  var param_value = false;&lt;br /&gt;&lt;br /&gt;  var params = loc.split("&amp;");&lt;br /&gt;  for (i=0; i&lt; params.length;i++) {&lt;br /&gt;      param_name = params[i].substring(0,params[i].indexOf('='));&lt;br /&gt;      if (param_name == parameter) {&lt;br /&gt;          param_value = params[i].substring(params[i].indexOf('=')+1)&lt;br /&gt;      }&lt;br /&gt;  }&lt;br /&gt;  if (param_value) {&lt;br /&gt;      return param_value;&lt;br /&gt;  }&lt;br /&gt;  else {&lt;br /&gt;      return false; //Nel caso in cui nn ci siano parametri&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&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/4104693577726899381-6169420076452093852?l=franziale.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://franziale.blogspot.com/feeds/6169420076452093852/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4104693577726899381&amp;postID=6169420076452093852' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4104693577726899381/posts/default/6169420076452093852'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4104693577726899381/posts/default/6169420076452093852'/><link rel='alternate' type='text/html' href='http://franziale.blogspot.com/2008/11/in-javascript-pu-essere-utile-un-metodo.html' title='Recuperare parametri da QueryString con Javascript'/><author><name>Alessandro Franzi</name><uri>http://www.blogger.com/profile/08478173128603059576</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_Ds8LLsbVUlc/SNa0YcPXutI/AAAAAAAAAAM/D3DZA5UBU-4/S220/go_with_the_flow_281x211.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4104693577726899381.post-3555956166122965785</id><published>2008-11-09T15:58:00.001+01:00</published><updated>2008-11-09T16:58:14.120+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='varie'/><title type='text'>Contare righe di codice di un progetto Java</title><content type='html'>Potrebbe tornare utile, forse più per questioni di esaltazione personale che per reale utilità, uno script mediante il quale avere un elenco delle righe di codice di un determinato progetto. &lt;br /&gt;&lt;span id="fullpost"&gt;&lt;br /&gt;Il seguente script oltre a fornire un elenco completo dei files, con relativo numero di codice, esegue anche la somma degli stessi.&lt;br /&gt;&lt;pre name="code" class= "javascript"&gt;find . \( -name '*.java' -o -name '*.jsp' \) -print0 | xargs -0 wc -l&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;E' possibile modificare il riferimento al path cambiando il "." dopo il comando con qualsiasi percorso assoluto o relativo.&lt;br /&gt;E' inoltre possibile adattarlo a qualsiasi linguaggio, cambiando i filtri relativi all'estensione del file "*.java" o "*.jsp".&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/4104693577726899381-3555956166122965785?l=franziale.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://franziale.blogspot.com/feeds/3555956166122965785/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4104693577726899381&amp;postID=3555956166122965785' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4104693577726899381/posts/default/3555956166122965785'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4104693577726899381/posts/default/3555956166122965785'/><link rel='alternate' type='text/html' href='http://franziale.blogspot.com/2008/11/contare-righe-di-codice-di-un-progetto.html' title='Contare righe di codice di un progetto Java'/><author><name>Alessandro Franzi</name><uri>http://www.blogger.com/profile/08478173128603059576</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_Ds8LLsbVUlc/SNa0YcPXutI/AAAAAAAAAAM/D3DZA5UBU-4/S220/go_with_the_flow_281x211.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4104693577726899381.post-6569975827147578202</id><published>2008-11-07T21:50:00.000+01:00</published><updated>2009-03-07T17:34:35.556+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Php'/><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='Singleton'/><title type='text'>Come creare un Singleton in Java o Php</title><content type='html'>Il &lt;span style="font-weight:bold;"&gt;Singleton&lt;/span&gt; è un design pattern creazionale, il suo scopo è assicurare che una classe abbia una sola istanza e fornire un punto di accesso globale a tale istanza. Questo può essere usato ad esempio per caricare delle informazione da database e gestirle durante tutto il flusso dell'applicazione senza doverle necessariamente ricaricare. Un suo utilizzo ponderato può renderne l'utilizzo davvero vantaggioso.&lt;br /&gt;&lt;span id="fullpost"&gt;&lt;br /&gt;Guardiamo un esempio di Singleton in Java. Il codice presenta un metodo opzionale : &lt;span style="font-style:italic;"&gt;invalidate&lt;/span&gt;&lt;br /&gt; che invalida la prima istanza della classe, forzandone la creazione di una nuova istanza nel successivo accesso alla classe.&lt;br /&gt;&lt;pre name="code" class="Java"&gt;public class Singleton {&lt;br /&gt; private static Singleton instance;&lt;br /&gt; &lt;br /&gt; public static Singleton getInstance(){&lt;br /&gt;  if (instance == null) instance = new Singleton();&lt;br /&gt;  return instance;&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; public static void invalidate(){&lt;br /&gt;  instance = null;&lt;br /&gt;  // si possono invalidare eventuali altre proprietà della classe&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; private Singleton(){&lt;br /&gt;  // qui si eseguono le eventuali operazioni di inizializzazione delle informazioni necessarie&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Ecco un implementazione alternativa in PHP.&lt;br /&gt;&lt;pre name="code" class="Java"&gt;/**&lt;br /&gt;* Semplice implementazione del design pattern singleton.&lt;br /&gt;* Data la struttura sintattica di PHP non è possibile sfruttare l'ereditarietà&lt;br /&gt;* per poter riutilizzare il pattern, se non utilizzando piccoli stratagemmi sintattici.&lt;br /&gt;*/&lt;br /&gt;class MySingleton&lt;br /&gt;{&lt;br /&gt;   /**&lt;br /&gt;   * La variabile statica privata che conterrà l'istanza univoca&lt;br /&gt;   * della nostra classe.&lt;br /&gt;   */&lt;br /&gt;   private static $instance = null;&lt;br /&gt;   &lt;br /&gt;   /**&lt;br /&gt;   * Il costruttore in cui ci occuperemo di inizializzare la nostra&lt;br /&gt;   * classe. E' opportuno specificarlo come privato in modo che venga&lt;br /&gt;   * visualizzato automaticamente un errore dall'interprete se si cerca&lt;br /&gt;   * di istanziare la classe direttamente.&lt;br /&gt;   */&lt;br /&gt;   private function __construct()&lt;br /&gt;   {&lt;br /&gt;      // ... codice ...&lt;br /&gt;   }&lt;br /&gt;   &lt;br /&gt;   /**&lt;br /&gt;   * Il metodo statico che si occupa di restituire l'istanza univoca della classe.&lt;br /&gt;   * per facilitare il riutilizzo del codice in altre situazioni, si frutta la&lt;br /&gt;   * costante __CLASS__ che viene valutata automaticamente dall'interprete con il&lt;br /&gt;   * nome della classe corrente (ricordo che "new $variabile" crea un'istanza della classe&lt;br /&gt;   * il cui nome è specificato come stringa all'interno di $variabile)&lt;br /&gt;   */&lt;br /&gt;   public static function getInstance()&lt;br /&gt;   {&lt;br /&gt;      if(self::$instance == null)&lt;br /&gt;      {   &lt;br /&gt;         $c = __CLASS__;&lt;br /&gt;         self::$instance = new $c;&lt;br /&gt;      }&lt;br /&gt;      &lt;br /&gt;      return self::$instance;&lt;br /&gt;   }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&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/4104693577726899381-6569975827147578202?l=franziale.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://franziale.blogspot.com/feeds/6569975827147578202/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4104693577726899381&amp;postID=6569975827147578202' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4104693577726899381/posts/default/6569975827147578202'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4104693577726899381/posts/default/6569975827147578202'/><link rel='alternate' type='text/html' href='http://franziale.blogspot.com/2008/11/come-creare-un-singleton.html' title='Come creare un Singleton in Java o Php'/><author><name>Alessandro Franzi</name><uri>http://www.blogger.com/profile/08478173128603059576</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_Ds8LLsbVUlc/SNa0YcPXutI/AAAAAAAAAAM/D3DZA5UBU-4/S220/go_with_the_flow_281x211.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4104693577726899381.post-803549053614393314</id><published>2008-11-02T22:30:00.000+01:00</published><updated>2008-11-02T23:18:44.771+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='Thread'/><title type='text'>java.lang.IllegalThreadStateException problema restart di un thread java</title><content type='html'>In alcuni casi è necessario dover gestire un numero di thread paralleli considerevole.&lt;br /&gt;Si noti che in queste situazioni si presenta un &lt;span style="font-weight:bold;"&gt;deterioramento delle prestazioni&lt;/span&gt; dovuto principalmente al costo computazione di creazione e distruzione dei thread.&lt;br /&gt;In questi casi è opportuno sviluppare una strategia tale da riuscire a riutilizzare i thread senza crearne altri. Il problema è che in Java, dopo aver creato un thread non è possibile riavviare la propria esecuzione mediante il metodo &lt;span style="font-style:italic;"&gt;start()&lt;/span&gt;. &lt;br /&gt;&lt;span id="fullpost"&gt;&lt;br /&gt;Ecco un esempio di come creare un thread, escogitando un metodo per poterne gestire il "re"start.&lt;br /&gt;&lt;pre name="code" class="java"&gt;public class MyThread extends Thread{ &lt;br /&gt; public Integer semaforoThread = new Integer(0);&lt;br /&gt; // metodo run&lt;br /&gt; public void run(){&lt;br /&gt;  try{&lt;br /&gt;   while(true){&lt;br /&gt;    // codice da far eseguire al thread&lt;br /&gt;    ....&lt;br /&gt;     &lt;br /&gt;    synchronized(semaforoThread){&lt;br /&gt;     semaforoThread.wait();&lt;br /&gt;    }&lt;br /&gt;   }&lt;br /&gt;  }catch(InterruptedException e){&lt;br /&gt;   System.out.println("Problemi con il thread : "+e.getMessage());&lt;br /&gt;  }&lt;br /&gt; }&lt;br /&gt; // metodo per far ripartire il thread&lt;br /&gt; public void restart(){&lt;br /&gt;  synchronized (this.semaforoThread) {&lt;br /&gt;   this.semaforoThread.notify();&lt;br /&gt;  }&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Questo è il codice per poter utilizzare tale thread : &lt;br /&gt;&lt;pre name="code" class="java"&gt;MyThread thread = new MyThread();&lt;br /&gt;thread.start();&lt;br /&gt;....&lt;br /&gt;// si intende restartare il thread&lt;br /&gt;thread.restart();&lt;br /&gt;&lt;/pre&gt;&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/4104693577726899381-803549053614393314?l=franziale.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://franziale.blogspot.com/feeds/803549053614393314/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4104693577726899381&amp;postID=803549053614393314' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4104693577726899381/posts/default/803549053614393314'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4104693577726899381/posts/default/803549053614393314'/><link rel='alternate' type='text/html' href='http://franziale.blogspot.com/2008/11/javalangillegalthreadstateexception.html' title='java.lang.IllegalThreadStateException problema restart di un thread java'/><author><name>Alessandro Franzi</name><uri>http://www.blogger.com/profile/08478173128603059576</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_Ds8LLsbVUlc/SNa0YcPXutI/AAAAAAAAAAM/D3DZA5UBU-4/S220/go_with_the_flow_281x211.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4104693577726899381.post-1816721735193246056</id><published>2008-10-31T12:07:00.001+01:00</published><updated>2008-10-31T12:12:34.923+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Javascript'/><category scheme='http://www.blogger.com/atom/ns#' term='Browser'/><title type='text'>Riconoscere funzionalità e verisione dei browser con javascript</title><content type='html'>Chiunque abbia mai utilizzato un linguaggio di scripting client side come Javascript ad un livello medio-avanzato, si sarà trovato di fronte al problema della compatibilità del codice scritto da parte del motore javascript del proprio browser.&lt;br /&gt;In questo caso è stato sicuramente necessario distinguere diversi comportamenti in base alle diverse funzionalità attive nel browser.&lt;br /&gt;&lt;span id="fullpost"&gt;&lt;br /&gt;Ecco un esempio di distinzione di tali funzionalità e versioni del browser.&lt;br /&gt;&lt;pre name="code" class="javascript"&gt;// recupero le informazioni del browser&lt;br /&gt;var AgntUsr=navigator.userAgent.toLowerCase();&lt;br /&gt;&lt;br /&gt;// controllo se il browser utilizza i dom&lt;br /&gt;var DomYes=document.getElementById?1:0;&lt;br /&gt;&lt;br /&gt;// controllo se il browser è firefox&lt;br /&gt;var NavYes=AgntUsr.indexOf('mozilla')!=-1&amp;&amp;AgntUsr.indexOf('compatible')==-1?1:0;&lt;br /&gt;&lt;br /&gt;// controllo se il browser è explorer&lt;br /&gt;var ExpYes=AgntUsr.indexOf('msie')!=-1?1:0;&lt;br /&gt;&lt;br /&gt;// controllo se il browser è opera&lt;br /&gt;var Opr=AgntUsr.indexOf('opera')!=-1?1:0;&lt;br /&gt;&lt;br /&gt;// controllo se si tratta di una versione di opera maggiore o uguale alle 6&lt;br /&gt;var Opr6orless=window.opera &amp;&amp; navigator.userAgent.search(/opera.[1-6]/i)!=-1 //DynamicDrive.com added code&lt;br /&gt;&lt;br /&gt;// controllo se viene utilizzato il modello dom di firefox&lt;br /&gt;var DomNav=DomYes&amp;&amp;NavYes?1:0;&lt;br /&gt;&lt;br /&gt;// controllo se viene utilizzato il modello dom di explorer&lt;br /&gt;var DomExp=DomYes&amp;&amp;ExpYes?1:0;&lt;br /&gt;&lt;br /&gt;// controllo se si utilizza una versione di firefox che non utilizza i dom &lt;br /&gt;var Nav4=NavYes&amp;&amp;!DomYes&amp;&amp;document.layers?1:0;&lt;br /&gt;&lt;br /&gt;// controllo se si utilizza una versione di exlorer che non utilizza i dom&lt;br /&gt;var Exp4=ExpYes&amp;&amp;!DomYes&amp;&amp;document.all?1:0;&lt;br /&gt;&lt;br /&gt;// controllo se la versione di explorer è la 7&lt;br /&gt;var ie7 = ExpYes&amp;&amp;typeof document.body.style.maxHeight != "undefined"?1:0;&lt;br /&gt;&lt;br /&gt;// controllo se la versione di explorer è la 6&lt;br /&gt;var ie6 = ExpYes&amp;&amp;!ie7?1:0;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Naturalmente chi volesse segnalare altri generi di controlli lo faccia e questi verranno aggiunti.&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/4104693577726899381-1816721735193246056?l=franziale.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://franziale.blogspot.com/feeds/1816721735193246056/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4104693577726899381&amp;postID=1816721735193246056' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4104693577726899381/posts/default/1816721735193246056'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4104693577726899381/posts/default/1816721735193246056'/><link rel='alternate' type='text/html' href='http://franziale.blogspot.com/2008/10/riconoscere-funzionalit-e-verisione-dei.html' title='Riconoscere funzionalità e verisione dei browser con javascript'/><author><name>Alessandro Franzi</name><uri>http://www.blogger.com/profile/08478173128603059576</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_Ds8LLsbVUlc/SNa0YcPXutI/AAAAAAAAAAM/D3DZA5UBU-4/S220/go_with_the_flow_281x211.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4104693577726899381.post-7381872131230744577</id><published>2008-10-16T23:53:00.000+02:00</published><updated>2008-10-17T00:06:27.682+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Eclipse'/><category scheme='http://www.blogger.com/atom/ns#' term='MyEclipse'/><category scheme='http://www.blogger.com/atom/ns#' term='Mac OS X'/><title type='text'>Problema di Out Of Memory di Eclipse o MyEclipse su Mac OS X</title><content type='html'>Recentemente ho avuto un problema di &lt;span style="font-style:italic;"&gt;Out of Memory&lt;/span&gt; con MyEclipse 6.0 su Mac OS X.&lt;br /&gt;Così come su altre piattaforme e con altre versioni di Eclipse per poter ovviare a questo problema è necessario editare il file eclipse.ini aumentando la dimensione massima dell' heap e la PermGen size.&lt;br /&gt;Su mac tale file è un pò nascosto infatti bisogna modificare il file &lt;span style="font-style:italic;"&gt;Eclipse.app/Contents/MacOS/eclipse.ini&lt;/span&gt;. Per poter accedere con il Finder è necessario cliccare con il tasto destro sul file eclipse.app e scegliere "mostra contenuto pacchetto" quindi entrare nella cartella Contents &gt; MacOS e modificare il file eclipse.ini. In particolare il parametro XX:MaxPermSize è possibile aumentarlo fino a 256m&lt;br /&gt;&lt;span id="fullpost"&gt;&lt;br /&gt;Ecco il mio file .ini&lt;br /&gt;&lt;pre name="code" class="css"&gt;&lt;br /&gt;-vmargs&lt;br /&gt;-Dosgi.splashLocation=/Applications/MyEclipse 6.0/eclipse/MyEclipseSplash.bmp&lt;br /&gt;-showsplash&lt;br /&gt;org.eclipse.platform&lt;br /&gt;&lt;br /&gt;-Xdock:icon=../Resources/Eclipse.icns&lt;br /&gt;-XstartOnFirstThread&lt;br /&gt;-Xms512m&lt;br /&gt;-Xmx1024m&lt;br /&gt;-XX:MaxPermSize=256m&lt;br /&gt;-Xdock:name=MyEclipse&lt;br /&gt;-Dorg.eclipse.swt.internal.carbon.smallFonts&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Spero di esservi stato utile anche questa volta.&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/4104693577726899381-7381872131230744577?l=franziale.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://franziale.blogspot.com/feeds/7381872131230744577/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4104693577726899381&amp;postID=7381872131230744577' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4104693577726899381/posts/default/7381872131230744577'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4104693577726899381/posts/default/7381872131230744577'/><link rel='alternate' type='text/html' href='http://franziale.blogspot.com/2008/10/problemi-out-of-memory-di-eclipse-o.html' title='Problema di Out Of Memory di Eclipse o MyEclipse su Mac OS X'/><author><name>Alessandro Franzi</name><uri>http://www.blogger.com/profile/08478173128603059576</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_Ds8LLsbVUlc/SNa0YcPXutI/AAAAAAAAAAM/D3DZA5UBU-4/S220/go_with_the_flow_281x211.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4104693577726899381.post-1600399451004780207</id><published>2008-10-13T22:35:00.000+02:00</published><updated>2008-10-14T00:31:22.256+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ResultSet'/><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='PreparedStatement'/><title type='text'>Ottenere il numero di righe recuperate da un ResultSet</title><content type='html'>Una domanda che prima o poi uno sviluppatore Java si pone è : come posso recuperare il numero di risultati di una query da un java.sql.ResultSet.&lt;br /&gt;La risposta potrebbe sembrare non banale, ma lo è in quanto di default i &lt;a href="http://java.sun.com/j2se/1.4.2/docs/api/java/sql/ResultSet.html"&gt;ResultSet&lt;/a&gt; vengono istanziati in maniera sequenziale, ma ciò può essere modificato mediante un opportuna dichiarazione, con cui è possibile accedere ai dati in maniera non sequenzioale. E' possibile infatti muoversi anche in senso opposto, oppure accedere direttamente ad una riga.&lt;br /&gt;&lt;span id="fullpost"&gt;&lt;br /&gt;Vediamo un esempio di codice:&lt;br /&gt;&lt;pre name='code' class='Java'&gt;PreparedStatement pstmt4 = medpConnection.prepareStatement(&lt;br /&gt;    "SELECT * FROM USERS",&lt;br /&gt;    ResultSet.TYPE_SCROLL_INSENSITIVE, &lt;br /&gt;    ResultSet.CONCUR_READ_ONLY);&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Vediamo ora come si può recuperare il numero di righe ottenute come risultato dalla query:&lt;br /&gt;&lt;pre name='code' class='Java'&gt;ResultSet rs4 =  pstmt4.executeQuery();&lt;br /&gt;rs4.last();&lt;br /&gt;int numberList = rs4.getRow();&lt;br /&gt;rs4.beforeFirst();&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;In questo modo si posiziona il ResultSet in ultima riga ottenuta, si recupera il numero della riga e si riposiziona il ResultSet nella posizione iniziale, cioè prima del primo risultato.&lt;br /&gt;In tal modo è possibile utilizzare il ResultSet in un semplicissimo ciclo del tipo:&lt;br /&gt;&lt;pre name='code' class='Java'&gt;&lt;br /&gt;while (rs4.next()) {&lt;br /&gt;...&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&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/4104693577726899381-1600399451004780207?l=franziale.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://franziale.blogspot.com/feeds/1600399451004780207/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4104693577726899381&amp;postID=1600399451004780207' title='1 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4104693577726899381/posts/default/1600399451004780207'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4104693577726899381/posts/default/1600399451004780207'/><link rel='alternate' type='text/html' href='http://franziale.blogspot.com/2008/10/ottenere-il-numero-di-righe-recuperate.html' title='Ottenere il numero di righe recuperate da un ResultSet'/><author><name>Alessandro Franzi</name><uri>http://www.blogger.com/profile/08478173128603059576</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_Ds8LLsbVUlc/SNa0YcPXutI/AAAAAAAAAAM/D3DZA5UBU-4/S220/go_with_the_flow_281x211.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4104693577726899381.post-1142930884849556181</id><published>2008-10-10T15:39:00.000+02:00</published><updated>2008-10-13T12:47:12.578+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><title type='text'>Eseguire un unica istanza di un'applicazione Java</title><content type='html'>Tempo fa mi sono imbattuto nel dilemma su come gestire in Java l'esecuzione di una sola istanza di una determinata applicazione, la rete mi è stata d'aiuto proponendomi una serie di soluzioni.&lt;br /&gt;Una soluzione trovata è quella di recuperare tale informazione dall'elenco dei Thread in esecuzione, ma a parer mio è la peggiore.&lt;br /&gt;&lt;br /&gt;Un altra soluzione è quella di istanziare un Server Socket su una determinata porta nel main dell'applicazione, nel caso in cui tale porta sia stata già Bindata, significa che si tratta della seconda istanza della stessa applicazione.&lt;br /&gt;&lt;br /&gt;Una terza la soluzione, la migliore a pare mio è quella Unix Like in cui si esegue il lock su di un file durante l'esecuzione e sbloccare il lock al termine della stessa.&lt;br /&gt;&lt;span id="fullpost"&gt;&lt;br /&gt;Di seguito l'esempio sul mio esempio di implementazione : &lt;br /&gt;&lt;pre name='code' class='Java'&gt;public class JustOneLock {&lt;br /&gt;    private String appName;&lt;br /&gt;    private File file;&lt;br /&gt;    private FileChannel channel;&lt;br /&gt;    private FileLock lock;&lt;br /&gt;&lt;br /&gt;    public JustOneLock(String appName) {&lt;br /&gt;        this.appName = appName;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public boolean isAppActive() {&lt;br /&gt;        try {&lt;br /&gt;            file = new File(System.getProperty(&amp;quot;user.home&amp;quot;), appName + &amp;quot;.tmp&amp;quot;);&lt;br /&gt;            channel = new RandomAccessFile(file, &amp;quot;rw&amp;quot;).getChannel();&lt;br /&gt;            try {&lt;br /&gt;                lock = channel.tryLock();&lt;br /&gt;            } catch (OverlappingFileLockException e) {&lt;br /&gt;                // il file &amp;#232; gi&amp;#224; loccato&lt;br /&gt;                closeLock();&lt;br /&gt;                return true;&lt;br /&gt;            }&lt;br /&gt;&lt;br /&gt;            if (lock == null) {&lt;br /&gt;                closeLock();&lt;br /&gt;                return true;&lt;br /&gt;            }&lt;br /&gt;&lt;br /&gt;            Runtime.getRuntime().addShutdownHook(new Thread() {&lt;br /&gt;                    // distrugge il lock quando la JVM viene chiusa&lt;br /&gt;                    public void run() {&lt;br /&gt;                        closeLock();&lt;br /&gt;                        deleteFile();&lt;br /&gt;                    }&lt;br /&gt;                });&lt;br /&gt;            return false;&lt;br /&gt;        }&lt;br /&gt;        catch (Exception e) {&lt;br /&gt;            closeLock();&lt;br /&gt;            return true;&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    // metodo per chiudere il lock sul file&lt;br /&gt;    private void closeLock() {&lt;br /&gt;        try { &lt;br /&gt;            lock.release();  &lt;br /&gt;        }catch (Exception e) {  &lt;br /&gt;            &lt;br /&gt;        }&lt;br /&gt;        try { &lt;br /&gt;            channel.close(); &lt;br /&gt;        }&lt;br /&gt;        catch (Exception e) {  &lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;    &lt;br /&gt;    // metodo per cancellare il file di lock&lt;br /&gt;    private void deleteFile() {&lt;br /&gt;        try { &lt;br /&gt;            file.delete(); &lt;br /&gt;        }&lt;br /&gt;        catch (Exception e) { &lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Vediamo ora come utilizzare tale classe :&lt;br /&gt;&lt;pre name='code' class='Java'&gt;JustOneLock ua = new JustOneLock(&amp;quot;JustOneId&amp;quot;);&lt;br /&gt; &lt;br /&gt;if (ua.isAppActive()) {&lt;br /&gt;    System.out.println(&amp;quot;Applicazione gi&amp;#224; in esecuzione. &amp;quot;);&lt;br /&gt;}else {&lt;br /&gt;    // caso in cui si tratta della prima istanza dell'applicazione&lt;br /&gt;        System.out.println(&amp;quot;Applicazione eseguita&amp;quot;);&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Spero che questo esempio sia stato utile. Alla prossima&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/4104693577726899381-1142930884849556181?l=franziale.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://franziale.blogspot.com/feeds/1142930884849556181/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4104693577726899381&amp;postID=1142930884849556181' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4104693577726899381/posts/default/1142930884849556181'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4104693577726899381/posts/default/1142930884849556181'/><link rel='alternate' type='text/html' href='http://franziale.blogspot.com/2008/10/eseguire-un-unica-istanza-di.html' title='Eseguire un unica istanza di un&apos;applicazione Java'/><author><name>Alessandro Franzi</name><uri>http://www.blogger.com/profile/08478173128603059576</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_Ds8LLsbVUlc/SNa0YcPXutI/AAAAAAAAAAM/D3DZA5UBU-4/S220/go_with_the_flow_281x211.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4104693577726899381.post-5685051397229908979</id><published>2008-10-09T12:33:00.001+02:00</published><updated>2008-12-14T10:08:45.256+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='Swing'/><category scheme='http://www.blogger.com/atom/ns#' term='Awt'/><title type='text'>Centrare a video una componente AWT o SWING</title><content type='html'>Ecco un semplice &lt;span style="font-weight:bold;"&gt;hint&lt;/span&gt; per centrare a video un qualsiasi componente Swing o Awt come ad esempio un frame.&lt;br /&gt;&lt;pre name='code' class='Java'&gt;public static void centra(Component componente){&lt;br /&gt;   Dimension dim = Toolkit.getDefaultToolkit().getScreenSize();&lt;br /&gt;   componente.setLocation((int) (dim.getWidth() - componente.getWidth()) / 2,&lt;br /&gt;   (int) (dim.getHeight() - componente.getHeight()) / 2);&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;span id="fullpost"&gt;&lt;br /&gt;N.B. Il meotod accetta un oggetto di tipo &lt;span style="font-style:italic;"&gt;Component&lt;/span&gt; che non è altro che la classe da cui derivano le componenti Awt e Swing.&lt;br /&gt;Si potrebbe quindi creare un metodo apposito per ogni tipo di componente, altrimenti accettare in input un Component e gestire in maniera generica ogni tipo di oggetto che ne deriva.&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/4104693577726899381-5685051397229908979?l=franziale.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://franziale.blogspot.com/feeds/5685051397229908979/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4104693577726899381&amp;postID=5685051397229908979' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4104693577726899381/posts/default/5685051397229908979'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4104693577726899381/posts/default/5685051397229908979'/><link rel='alternate' type='text/html' href='http://franziale.blogspot.com/2008/10/centrare-video-una-componente-awt-o.html' title='Centrare a video una componente AWT o SWING'/><author><name>Alessandro Franzi</name><uri>http://www.blogger.com/profile/08478173128603059576</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_Ds8LLsbVUlc/SNa0YcPXutI/AAAAAAAAAAM/D3DZA5UBU-4/S220/go_with_the_flow_281x211.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4104693577726899381.post-2760201427033546091</id><published>2008-10-06T20:33:00.000+02:00</published><updated>2008-10-06T20:51:48.973+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='Rmi'/><title type='text'>Server RMI + Registry + Client Rmi</title><content type='html'>Java Remote Method Invocation (&lt;a href="http://java.sun.com/javase/technologies/core/basic/rmi/index.jsp"&gt;Java RMI&lt;/a&gt;) non è altro che una tecnologia Java per la gestione degli oggetti distribuiti. Nell' RMI i metodi di un oggetto remoto possono essere invocati dal client ubicato anche su un altra istanza di Java Virtual Machine.&lt;br /&gt;La potenza è proprio nel fatto di poter recuperare un istanza ben precisa di oggetto senza avere a disposizione l'implementazione di tale classe e invocarne i metodi mediante lo stub messo a disposizione dal server.&lt;br /&gt;&lt;span id="fullpost"&gt;&lt;br /&gt;Ho utilizzato RMI per un progetto universitario e la mia difficoltà è stata quella di recuperare informazioni chiare e dettagliate su come realizzare un Server in grado di istanziare un &lt;span style="font-style:italic;"&gt;Registry&lt;/span&gt;.&lt;br /&gt;Il &lt;span style="font-weight:bold;"&gt;Registry&lt;/span&gt; non è altro che una sorta di elenco telefonico che converte una determinata stringa (ES: rmi://localhost/nomeOggetto ) in una vera e propria istanza di tale oggetto remoto.&lt;br /&gt;Esaminiamo i package che ci fornisce Java per tale architettura:&lt;br /&gt;&lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;code&gt;import java.rmi.RemoteException;&lt;br /&gt;import java.rmi.registry.LocateRegistry;&lt;br /&gt;import java.rmi.registry.Registry;&lt;br /&gt;import java.rmi.server.UnicastRemoteObject;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;Passiamo alla vera e propria implementazione : &lt;br /&gt;&lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;code&gt;public class Runner{&lt;br /&gt;    public static int DEFAULT_PORT = 6669;&lt;br /&gt;    &lt;br /&gt;    // main&lt;br /&gt;    public static void main(String[] args) throws RemoteException{&lt;br /&gt;        int port = DEFAULT_PORT;&lt;br /&gt;        if (args.length&amp;gt;0){&lt;br /&gt;            try{&lt;br /&gt;                port = Integer.parseInt(args[0]);&lt;br /&gt;            }catch(NumberFormatException ex){&lt;br /&gt;                System.out.println(&amp;quot;Formato utilizzato per il numero di porta non valido &amp;quot;);&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;        try{&lt;br /&gt;            Registry registry = LocateRegistry.getRegistry(port);&lt;br /&gt;            bindObjectInRegistry(registry);&lt;br /&gt;        }catch(RemoteException ex){&lt;br /&gt;            System.out.println(&amp;quot;Registry non raggiungibile &amp;quot;);&lt;br /&gt;            try{&lt;br /&gt;                Registry registry = LocateRegistry.createRegistry(port);&lt;br /&gt;                System.out.println(&amp;quot;Creato registry in ascolto sulla porta : &amp;quot;+port);&lt;br /&gt;                bindObjectInRegistry(registry);&lt;br /&gt;            }catch(RemoteException e){&lt;br /&gt;                System.out.println(&amp;quot;Problemi nel creare il registry&amp;quot;);&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;    /***&lt;br /&gt;     * Metodo che esegue il bind di un oggetto su un registry passatogli in input&lt;br /&gt;     * &lt;br /&gt;     * @param registry            : registry allocato&lt;br /&gt;     * @throws RemoteException    : eccezione remota&lt;br /&gt;     */&lt;br /&gt;    private static void bindObjectInRegistry(Registry registry) throws RemoteException{&lt;br /&gt;        CentralizedSrvIF remoteReference = &lt;br /&gt;            (CentralizedSrvIF) UnicastRemoteObject.exportObject(new CentralizedSrv());&lt;br /&gt;        registry.rebind(CentralizedSrvIF.SHAREDOBJECTNAME, remoteReference);&lt;br /&gt;        System.out.println(&amp;quot;Oggetto registrato&amp;quot;);&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;Osserviamo che il server tenta di linkarsi al registry e nel caso in cui non trova un istanza dello stesso lo istanzia su una porta di default (nel caso in cui non venga specificata da riga di comando).&lt;br /&gt;Attenzione &lt;span style="font-style:italic;"&gt; CentralizedSrvIF &lt;/span&gt; non è altro che l'implementazione dell'interfaccia dell'oggetto remoto come da esempio : &lt;br /&gt;&lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;code&gt;public interface CentralizedSrvIF extends Remote{&lt;br /&gt;    // nome dell'oggetto remoto&lt;br /&gt;    public static final String SHAREDOBJECTNAME =&amp;quot;chatRoomManager&amp;quot;;&lt;br /&gt;    // metodo per entrare in una chatRoom&lt;br /&gt;    public UserID[] joinChat(String chatRoomName, String userName, Integer port) throws UserAlreadyExistException,RemoteException,UnknownHostException;&lt;br /&gt;    // metodo per abbandonare la chatroom&lt;br /&gt;    public void leaveChat(String chatRoomName, UserID theUser) throws RemoteException;    &lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;La relativa implementazione è una classica implementazione custom dei metodi specificati nell'interfaccia.&lt;br /&gt;Passiamo ora all'implementazione del client : &lt;br /&gt;&lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;code&gt;public class ChatClient {&lt;br /&gt;    public static final String SHAREDOBJECTNAME =&amp;quot;chatRoomManager&amp;quot;;&lt;br /&gt;    &lt;br /&gt;    try{&lt;br /&gt;            &lt;br /&gt;            // connetto al server e recupero l'oggetto &lt;br /&gt;            String name = &amp;quot;rmi://&amp;quot;+host+&amp;quot;:&amp;quot;+portRmi+&amp;quot;/&amp;quot;+SHAREDOBJECTNAME;&lt;br /&gt;            System.out.println(&amp;quot;Bindato oggetto : &amp;quot;+name);&lt;br /&gt;            Remote obj = Naming.lookup(name);&lt;br /&gt;            CentralizedSrvIF chatServer = (CentralizedSrvIF)obj;&lt;br /&gt;            System.out.println(&amp;quot;Connesso al server&amp;quot;);&lt;br /&gt;            ....&lt;br /&gt;            // chiamo il metodo remoto&lt;br /&gt;            UserID[] sdd = chatServer.joinChat(chatRoomName, userName, new Integer(port));&lt;br /&gt;            System.out.println(&amp;quot;Connesso alla chatRoom : &amp;quot;+chatRoomName);&lt;br /&gt;            // rebindo l'oggetto salvandone le modifiche&lt;br /&gt;            Naming.rebind(name, obj);&lt;br /&gt;        }catch(MalformedURLException e){&lt;br /&gt;            System.out.println(&amp;quot;Problema con l'url : &amp;quot;+e.getMessage());&lt;br /&gt;        }catch(IOException e){&lt;br /&gt;            System.out.println(&amp;quot;Problema in input/output :&amp;quot;+e.getMessage());&lt;br /&gt;        }catch(NotBoundException e){&lt;br /&gt;            System.out.println(&amp;quot;Problema con il lookup : &amp;quot;+e.getMessage());&lt;br /&gt;        }catch(UserAlreadyExistException ex){&lt;br /&gt;            System.out.println(&amp;quot;Problema : &amp;quot;+ex.getMessage());&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;Prestare particolare attenzione al metodo Rebind, con esso si sostituisce l'istanza bindata mediante il registry, sovrascrivendo lo stato dell'oggetto con il nuovo stato dell'istanza corrente.&lt;br /&gt;Spero che questo esempio sia servito a chiarire i vostri dubbi nei confronti dell' RMI.&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/4104693577726899381-2760201427033546091?l=franziale.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://franziale.blogspot.com/feeds/2760201427033546091/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4104693577726899381&amp;postID=2760201427033546091' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4104693577726899381/posts/default/2760201427033546091'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4104693577726899381/posts/default/2760201427033546091'/><link rel='alternate' type='text/html' href='http://franziale.blogspot.com/2008/10/server-rmi-registry-client-rmi.html' title='Server RMI + Registry + Client Rmi'/><author><name>Alessandro Franzi</name><uri>http://www.blogger.com/profile/08478173128603059576</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_Ds8LLsbVUlc/SNa0YcPXutI/AAAAAAAAAAM/D3DZA5UBU-4/S220/go_with_the_flow_281x211.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4104693577726899381.post-5463213231716807508</id><published>2008-09-28T10:47:00.000+02:00</published><updated>2008-10-25T21:02:19.672+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='Thread'/><title type='text'>Thread Concorrenti in Java</title><content type='html'>In alcuni casi, quando ci si trova nella situazione in cui vengono eseguiti diversi task in sequenza, ciascuno dei quali è indipendente dagli altri, e si ha la necessità di dover ridurre i tempi di elaborazione, strutturare il coidice in maniera tale da eseguire &lt;a href="http://java.sun.com/j2se/1.4.2/docs/api/java/lang/Thread.html"&gt;thread&lt;/a&gt; paralleli può essere una soluzione.&lt;br /&gt;Nel mio esempio si ha la necessità di eseguire 3 chiamate a &lt;a href="http://it.wikipedia.org/wiki/Web_service"&gt;WebServices&lt;/a&gt;, che come ben sapete sono chiamate sincrone (bloccano il processo chiamante fino ad una risposta o un failure), quindi il tempo totale di esecuzione è dato da :&lt;br /&gt;&lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;sub&gt;n_task&lt;/sub&gt;&lt;br /&gt;  &amp;sum;     ExecTime(i)&lt;br /&gt; &lt;sup&gt;i=0&lt;/sup&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Introducendo una strategia di gestione mediante thread paralleli si può ridurre il tempo di esecuzione al :&lt;br /&gt;&lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;sub&gt;n_task&lt;/sub&gt;&lt;br /&gt;  Max(ExecTime(i))&lt;br /&gt; &lt;sup&gt;i=0&lt;/sup&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;span id="fullpost"&gt;&lt;br /&gt;Supponiamo di modificare il codice di una classe &lt;span style="font-style:italic;"&gt;ClassSample&lt;/span&gt; inserendo tra le proprietà le seguenti 3 dichiarazioni:&lt;br /&gt;&lt;pre name="code" class="java"&gt;public Integer cont = new Integer(0);&lt;br /&gt;public Integer sincronizzatore = new Integer(0);&lt;br /&gt;public static final int NUM_THREAD = 3;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;La variabile &lt;span style="font-style:italic;"&gt;cont&lt;/span&gt; rappresenta il contatore dei thread che hanno già terminato la propria esecuzione.&lt;br /&gt;La variabile &lt;span style="font-style:italic;"&gt;sincronizzatore&lt;/span&gt; rappresenta l'oggetto che funge da sincronizzatore.&lt;br /&gt;La variabile statica &lt;span style="font-style:italic;"&gt;NUM_THREAD&lt;/span&gt; che rappresenta il numero di thread che verranno eseguiti (tale numero è statico ma può dipendere dal contesto)&lt;br /&gt;&lt;br /&gt;A questo punto è necessario definire i Thread, nel mio esempio assumiamo che i thread siano delle chiamate a servizi Web che come ben sapete sono chiamate bloccanti : &lt;br /&gt;&lt;pre name="code" class="java"&gt;class Servizio1Thread extends Thread { &lt;br /&gt;        /***&lt;br /&gt;         * Metodo run per avviare il thread&lt;br /&gt;         */&lt;br /&gt;        public void run() { &lt;br /&gt;            // Parte thread Ws&lt;br /&gt;            RisultatoServizio risultatoServizio = chiamoServizio(parametro1,parametro2);&lt;br /&gt;            controllaSemaforo();&lt;br /&gt;            &lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Definiamo la funzione che controlla l'esecuzione di tutti i Threads&lt;br /&gt;&lt;pre name="code" class="java"&gt;&gt;/***&lt;br /&gt; * Metodo controllore dei thread completati. Nel caso in cui&lt;br /&gt; * siano stati completati tutti i thread invoca una notifica al thread&lt;br /&gt; * principale che &amp;#232; temporaneamente in stato di wait&lt;br /&gt; */&lt;br /&gt;public void controllaSemaforo (){&lt;br /&gt;    synchronized (sincronizzatore){&lt;br /&gt;        logger.debug(&amp;quot;processi chiusi &amp;quot;+(cont.intValue()+1)+&amp;quot;/&amp;quot;+NUM_THREAD);&lt;br /&gt;        if (cont.intValue()+1&amp;lt;NUM_THREAD){&lt;br /&gt;            cont = new Integer(cont.intValue()+1);&lt;br /&gt;        }else{&lt;br /&gt;            logger.debug(&amp;quot;notifico al thread principale&amp;quot;);&lt;br /&gt;            sincronizzatore.notifyAll();&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Ora passiamo all'implementazione del Thread principale, che si occuperà di lanciare i 3 Thread paralleli e attenderne il completamento prima di continuare con il normale flusso di esecuzione.&lt;br /&gt;&lt;pre name="code" class="java"&gt;//Thread 1 &lt;br /&gt;Servizio1Thread myFirstThread = new Servizio1Thread ();&lt;br /&gt;myFirstThread.start();&lt;br /&gt;//Thread 2 &lt;br /&gt;Servizio2Thread  myRirThread = new Servizio1Thread ();&lt;br /&gt;myRirThread.start();&lt;br /&gt;//Thread 3 &lt;br /&gt;Servizio3Thread  myWsThread = new Servizio1Thread ();&lt;br /&gt;myWsThread.start();&lt;br /&gt;&lt;br /&gt;try{&lt;br /&gt;    &lt;br /&gt;    // blocco sincronizzato per attendere i risultati&lt;br /&gt;    synchronized(sincronizzatore) {&lt;br /&gt;        //Fermo il thread principale&lt;br /&gt;        sincronizzatore.wait();&lt;br /&gt;        // Hanno finito i thread che hanno sbloccato l'esecuzione del Thread principale&lt;br /&gt;    }&lt;br /&gt;    // qui continua il normale flusso di esecuzione&lt;br /&gt;}catch(InterruptedException ex){&lt;br /&gt;    System.out.println(&amp;quot;Eccezione : &amp;quot;+ex.getMessage());&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Naturalmente si può giocare con le chiamate in maniera opportuna all'operazione che si intende eseguire. Spero che tale soluzione velocizzerà le vostre applicazioni. Alla prossima!&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/4104693577726899381-5463213231716807508?l=franziale.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://franziale.blogspot.com/feeds/5463213231716807508/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4104693577726899381&amp;postID=5463213231716807508' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4104693577726899381/posts/default/5463213231716807508'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4104693577726899381/posts/default/5463213231716807508'/><link rel='alternate' type='text/html' href='http://franziale.blogspot.com/2008/09/thread-concorrenti-in-java.html' title='Thread Concorrenti in Java'/><author><name>Alessandro Franzi</name><uri>http://www.blogger.com/profile/08478173128603059576</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_Ds8LLsbVUlc/SNa0YcPXutI/AAAAAAAAAAM/D3DZA5UBU-4/S220/go_with_the_flow_281x211.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4104693577726899381.post-1443027613622101000</id><published>2008-09-27T21:10:00.000+02:00</published><updated>2008-10-02T20:23:47.051+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Maven'/><category scheme='http://www.blogger.com/atom/ns#' term='MyEclipse'/><title type='text'>Problemi plugin Maven4MyEclipse nella gestione di un progetto Java su MyEclipse 6.5 GA</title><content type='html'>L'ultima versione di &lt;a href="http://www.myeclipseide.com/"&gt;Myclipse&lt;/a&gt;, in particolare la 6.5 GA include nella propria Relese un plugin proprietario per &lt;a href="http://maven.apache.org/"&gt;Maven&lt;/a&gt;(Maven4MyEclipse).&lt;br /&gt;Nel caso in cui si voglia creare un nuovo progetto con il supporto di Maven, non si verifica nessun tipo di problema nell'includere nel classpath le librerie referenziate importate mediante il vostro &lt;span style="font-style:italic;"&gt;pom.xml&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Il problema sorge quando importate un progetto Java già esistente, in tal caso switchare tra apache maven plugin e maven4myeclipse presenta un incompatibilità delle informazioni contenute all'interno dei files: &lt;span style="font-style:italic;"&gt;.classpath&lt;/span&gt; and&lt;span style="font-style:italic;"&gt; .project&lt;/span&gt; .&lt;br /&gt;&lt;span id="fullpost"&gt;&lt;br /&gt;La soluzione ottimale è la seguente, almeno finchè gli sviluppatori rilascieranno un altra versione, magari con un bugFix per una capability così importante.&lt;br /&gt;&lt;br /&gt;Innanzitutto editare il file &lt;span style="font-weight:bold;"&gt;.project&lt;/span&gt; che dovrà presentarti con la seguente struttura. N.B : il tag &lt;span style="font-style:italic;"&gt;&lt;name&gt;&lt;/span&gt;&lt;br /&gt;&lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;code&gt;&amp;lt;buildCommand&amp;gt;&lt;br /&gt;   &amp;lt;name&amp;gt;org.maven.ide.eclipse.maven2Builder&amp;lt;/name&amp;gt;&lt;br /&gt;   &amp;lt;arguments&amp;gt;&lt;br /&gt;   &amp;lt;/arguments&amp;gt;&lt;br /&gt;&amp;lt;/buildCommand&amp;gt;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;Inoltre rimpiazzare l' org.apache maven nature con : &lt;br /&gt;&lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;code&gt;&amp;lt;nature&amp;gt;com.genuitec.eclipse.maven.maven2Nature&amp;lt;/nature&amp;gt;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;Nel file &lt;span style="font-weight:bold;"&gt;.classpath&lt;/span&gt; aggiungere la entry ;&lt;br /&gt;&lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;code&gt;&amp;lt;classpathentry kind=&amp;quot;con&amp;quot; path=&amp;quot;org.maven.ide.eclipse.MAVEN2_CLASSPATH_CONTAINER&amp;quot;/&amp;gt;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&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/4104693577726899381-1443027613622101000?l=franziale.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://franziale.blogspot.com/feeds/1443027613622101000/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4104693577726899381&amp;postID=1443027613622101000' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4104693577726899381/posts/default/1443027613622101000'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4104693577726899381/posts/default/1443027613622101000'/><link rel='alternate' type='text/html' href='http://franziale.blogspot.com/2008/09/problemi-plugin-maven4myeclipse-nella.html' title='Problemi plugin Maven4MyEclipse nella gestione di un progetto Java su MyEclipse 6.5 GA'/><author><name>Alessandro Franzi</name><uri>http://www.blogger.com/profile/08478173128603059576</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_Ds8LLsbVUlc/SNa0YcPXutI/AAAAAAAAAAM/D3DZA5UBU-4/S220/go_with_the_flow_281x211.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4104693577726899381.post-4428659820718804702</id><published>2008-09-27T07:17:00.000+02:00</published><updated>2008-10-02T20:28:21.789+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='pl/sql'/><category scheme='http://www.blogger.com/atom/ns#' term='oracle'/><category scheme='http://www.blogger.com/atom/ns#' term='clob'/><title type='text'>Inserire un CLOB</title><content type='html'>Come alcuni sapranno, in una pl/sql il numero massimo di caratteri consentiti per una variabile è di 32.000 e questo può risultare un problema quando ad esempio si esporta una riga contenente un &lt;a href="http://www.orafaq.com/wiki/CLOB"&gt;CLOB&lt;/a&gt; e si vuole reinserire il contenuto del campo di tipo clob mediante pl/sql.&lt;div&gt;Per questo ho escogitato un workaround non flessibilissimo, ma che funziona.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;span id="fullpost"&gt;&lt;br /&gt;&lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;code&gt;DECLARE&lt;br /&gt;lob_loc       CLOB;&lt;br /&gt;amount       INTEGER;&lt;br /&gt;writeAmount    BINARY_INTEGER;&lt;br /&gt;intermediaField CLOB;&lt;br /&gt;newData CLOB;&lt;br /&gt;primaParte VARCHAR2(4000);&lt;br /&gt;lunPrimaParte INTEGER;&lt;br /&gt;secondaParte VARCHAR2(4000);&lt;br /&gt;lunSecondaParte INTEGER;&lt;br /&gt;terzaParte VARCHAR2(4000);&lt;br /&gt;lunTerzaParte INTEGER;&lt;br /&gt;BEGIN&lt;br /&gt;&lt;br /&gt;  DBMS_LOB.createtemporary(intermediaField, true); &lt;br /&gt;  primaParte := 'testo prima parte';&lt;br /&gt;  secondaParte := 'testo seconda parte';&lt;br /&gt;  terzaParte:= 'testo terza parte';&lt;br /&gt;  lunPrimaParte := length(primaParte);&lt;br /&gt;  DBMS_LOB.write(intermediaField, lunPrimaParte, 1, primaParte);&lt;br /&gt;  lunSecondaParte := length(secondaParte);&lt;br /&gt;  DBMS_LOB.writeappend(intermediaField, lunSecondaParte, secondaParte);&lt;br /&gt;  lunTerzaParte := length(terzaParte);&lt;br /&gt;  DBMS_LOB.writeappend(intermediaField, lunTerzaParte, terzaParte);    &lt;br /&gt;&lt;br /&gt;  SELECT CAMPOCLOB INTO lob_loc FROM TABELLAESEMPIO&lt;br /&gt;  WHERE NUMEROCLOB = 18&lt;br /&gt;  FOR UPDATE;&lt;br /&gt;&lt;br /&gt;  /*cancello il contenuto del CLOB */&lt;br /&gt;  amount := DBMS_LOB.getlength(lob_loc);&lt;br /&gt;  IF amount &amp;gt; 0 THEN&lt;br /&gt;     DBMS_LOB.erase(lob_loc, amount, 1);&lt;br /&gt;  END IF;&lt;br /&gt;  writeAmount := DBMS_LOB.getlength(intermediaField);&lt;br /&gt;  DBMS_LOB.copy(lob_loc, intermediaField, writeAmount, 1, 1);&lt;br /&gt;&lt;br /&gt;END;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&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/4104693577726899381-4428659820718804702?l=franziale.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://franziale.blogspot.com/feeds/4428659820718804702/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4104693577726899381&amp;postID=4428659820718804702' title='0 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4104693577726899381/posts/default/4428659820718804702'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4104693577726899381/posts/default/4428659820718804702'/><link rel='alternate' type='text/html' href='http://franziale.blogspot.com/2008/09/inserire-un-clob.html' title='Inserire un CLOB'/><author><name>Alessandro Franzi</name><uri>http://www.blogger.com/profile/08478173128603059576</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_Ds8LLsbVUlc/SNa0YcPXutI/AAAAAAAAAAM/D3DZA5UBU-4/S220/go_with_the_flow_281x211.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4104693577726899381.post-1466609221181911520</id><published>2008-09-21T23:25:00.000+02:00</published><updated>2008-09-27T11:34:05.469+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='varie'/><title type='text'>My First Blog</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_Ds8LLsbVUlc/SNkU8Z0r0ZI/AAAAAAAAABQ/dpphOqpL_7I/s1600-h/primo.jpg"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;" src="http://4.bp.blogspot.com/_Ds8LLsbVUlc/SNkU8Z0r0ZI/AAAAAAAAABQ/dpphOqpL_7I/s200/primo.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5249249868633592210" /&gt;&lt;/a&gt;&lt;br /&gt;Sul &lt;a href="http://it.wikipedia.org/wiki/Web"&gt;web&lt;/a&gt; sono pubblicati blog di molteplici categorie ormai, la rete è colma di wiki, pubblicazioni, portali dove si può trovare la soluzione a qualsiasi tipo di problema.&lt;div&gt;Questo &lt;a href="http://it.wikipedia.org/wiki/Blog"&gt;blog&lt;/a&gt; vuole essere una sorta di raccoglitore di tutte quelle che sono le esperienze vissute sul campo da uno sviluppatore smanettone.&lt;/div&gt;&lt;div&gt;L'obiettivo è quello (così come avrete sicuramente letto nel sottotitolo del blog) di condividere le mie esperienze con gli altri in maniera tale da poter evitare sprechi di tempo inutili.&lt;/div&gt;&lt;div&gt;Durante la mia giornata è routine ormai quella di ricercare informazioni sulla rete, per alcuni utenti è davvero una droga: un infinità di informazioni messe a disposizione da un numero di fonti impressionante.&lt;/div&gt;&lt;div&gt;Nella stessa maniera in cui molti blogger hanno inconsapevolmente risolto miei problemi, mi auguro di poter risolvere i problemi di molti altri...&lt;/div&gt;&lt;div&gt;Chiunque sia interessato a comunicare articoli da pubblicare è pregato di contattarmi.&lt;/div&gt;&lt;div&gt;Spero di aver espresso quella che è l'idea dietro questo "inedito" blog. &lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4104693577726899381-1466609221181911520?l=franziale.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://franziale.blogspot.com/feeds/1466609221181911520/comments/default' title='Commenti sul post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4104693577726899381&amp;postID=1466609221181911520' title='1 Commenti'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4104693577726899381/posts/default/1466609221181911520'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4104693577726899381/posts/default/1466609221181911520'/><link rel='alternate' type='text/html' href='http://franziale.blogspot.com/2008/09/my-first-blog.html' title='My First Blog'/><author><name>Alessandro Franzi</name><uri>http://www.blogger.com/profile/08478173128603059576</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='24' src='http://1.bp.blogspot.com/_Ds8LLsbVUlc/SNa0YcPXutI/AAAAAAAAAAM/D3DZA5UBU-4/S220/go_with_the_flow_281x211.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_Ds8LLsbVUlc/SNkU8Z0r0ZI/AAAAAAAAABQ/dpphOqpL_7I/s72-c/primo.jpg' height='72' width='72'/><thr:total>1</thr:total></entry></feed>
