<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:atom="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearch/1.1/" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr="http://purl.org/syndication/thread/1.0" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0"><channel><atom:id>tag:blogger.com,1999:blog-4364592042964713187</atom:id><lastBuildDate>Thu, 23 Feb 2012 10:46:03 +0000</lastBuildDate><category>lavoro</category><category>ruby</category><category>scala</category><category>java</category><category>air</category><category>costing</category><category>IE9</category><category>FX4</category><category>Xorg</category><category>enterprise architecture</category><category>nfc</category><category>mixin</category><category>IT</category><category>interfaccia</category><category>crisi</category><category>font</category><category>flex</category><category>linguaggi</category><category>switch</category><category>XAML</category><category>gps</category><category>Firefox 4</category><category>android</category><category>X3100</category><category>sinteticità</category><category>groovy</category><category>python</category><category>Linux</category><category>xorg.conf</category><category>closure</category><category>project management</category><category>Ubuntu 8.10</category><category>ereditarietà</category><category>computer languages</category><category>espressività</category><category>Intel</category><category>Silverlight</category><category>database</category><category>project costing</category><title>AlessioSaltarin WebLog</title><description>&lt;small&gt;&lt;i&gt;"Stanco dell’infinitamente piccolo e dell’infinitamente grande, lo scienziato si dedicò all’infinitamente medio"&lt;/i&gt; &lt;br&gt;
(Ennio Flaiano, 1956)&lt;/small&gt;</description><link>http://alessiosaltarin.blogspot.com/</link><managingEditor>noreply@blogger.com (Alessio Saltarin)</managingEditor><generator>Blogger</generator><openSearch:totalResults>21</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/alessiosaltarin" /><feedburner:info uri="alessiosaltarin" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4364592042964713187.post-8018255926183891688</guid><pubDate>Thu, 23 Feb 2012 10:15:00 +0000</pubDate><atom:updated>2012-02-23T11:46:03.026+01:00</atom:updated><title>Pensare in REST (Thinking in REST)</title><description>La progettazione di applicazioni &lt;i&gt;Web based&lt;/i&gt; ha subìto una silenziosa rivoluzione quando nel 2000 Roy Fielding ha pubblicato la sua ormai celebre dissertazione dal titolo: &lt;i&gt;"Architectural Styles and the Design of Network-based Software Architectures"&lt;/i&gt;, e in particolare il capitolo cinque: &lt;i&gt;"Representational State Transfer (REST)"&lt;/i&gt;.&lt;br /&gt;
&lt;br /&gt;
In cosa consiste questa rivoluzione? Esiste una modalità, diciamo così, "classica" di concepire un'applicazione per computer, e questa prevede la composizione di un algoritmo più o meno complesso che prende in input una serie di dati, li trasforma e poi li rende persistenti - ad esempio salvandoli su un database. L'essere umano interagisce con l'applicazione attraverso una "interfaccia utente" che viene aggiornata a seconda del cambiamento di stato - o dell'input o dell'output. Così, in modo appunto "classico", un'applicazione è costituita di un'interfaccia utente, una logica, e uno stato - cioè dei dati persistenti.&lt;br /&gt;
&lt;br /&gt;
Le prime applicazioni Web complesse, rese possibili dalle primigenie tecnologie di trasformazione dinamica dell'HTML, lato server con ASP o PHP ad esempio e lato client con DOM/Javascript, implementavano questo modello classico. Vale a dire, presentavano all'utente un'interfaccia grafica con la quale inserire i dati, offrivano una serie di comandi associati a una logica di esecuzione, e infine persistevano i risultati su un database.&lt;br /&gt;
&lt;br /&gt;
Il problema di questo approccio è che l'applicazione diventa un monolite che si può utilizzare solamente nel modo in cui è stata inizialmente concepita.&lt;br /&gt;
&lt;br /&gt;
Con l'aumentare delle necessità di servizi Web, con l'aumentare dei device eterogenei che vi accedono - dai computer ai telefonini, dai videogiochi alle lavastoviglie - questo tipo di approccio è diventato controproducente: l'applicazione monolitica impedisce di utilizzare i dati e le informazioni che è in grado di veicolare appunto perché è concepita per essere utilizzata &lt;i&gt;in un solo modo&lt;/i&gt;, che è quello inizialmente concepito dai suoi autori. La conseguenza di tutto ciò è che ogni nuova esigenza di accedere ad un dato o ad un servizio veicolato dall'applicazione necessita di un cambiamento nel codice applicativo o, peggio, nella creazione di una nuova applicazione &lt;i&gt;ad hoc&lt;/i&gt;. &lt;br /&gt;
&lt;br /&gt;
Oggi le aziende spendono moltissime risorse IT proprio perché hanno a che fare con applicazioni monolitiche che non riescono a "servire" il dato in maniera abbastanza neutra.&lt;br /&gt;
&lt;br /&gt;
L'idea alla base del protocollo REST inventato da Roy Fielding è che le applicazioni Web devono essere progettate in modo tale per cui immettendo direttamente le URL (che così diventano URI) su un browser si ottengano immediatamente i dati che servono, e che queste URL possano essere "combinate" tra loro in un workflow per ottenere un'applicazione, allo stesso modo con cui nelle architetture SOA noi combiniamo i "servizi" per ottenere sempre nuove applicazioni.&lt;br /&gt;
&lt;br /&gt;
La URL così richiamata deve essere in grado di rispondere in formato "neutro", possibilmente veicolando solamente "i dati", senza cioè alcuna informazione "grafica" di supporto. Le URL stesse devono specificare il formato dei dati che richiedono: se la URL finisce per ".xml" il dato verrà restituito in XML, per ".json" in JSON, e, naturalmente, di default rispondere con un HTML &lt;i&gt;human readable&lt;/i&gt;.&lt;br /&gt;
&lt;br /&gt;
Per finire un esempio. Supponiamo di scrivere un videogioco Web, magari per Facebook. Avremo da qualche parte una struttura dati che prende tutte le informazioni relative al giocatore (Player). Questa struttura dati raccoglie e persiste lo "stato" del giocatore durante il gioco. La modalità classica consiste nello scrivere un'applicazione che, a seconda dei comandi dati via web dal giocatore, cambia lo stato e aggiorna di conseguenza la tabella "Player". Esagerando, l'applicazione potrebbe essere costituita da un'unica "pagina" che, a seconda del comando HTTP ricevuto, risponde in un modo o in un altro. Ovviamente, così facendo, nessuno, ad esempio, potrebbe costruire un altro gioco a partire dai dati correnti dei giocatori: perché le informazioni di stato dei giocatori sono "chiuse", e utilizzabili solo dalla "pagina" di cui parlavamo prima.&lt;br /&gt;
&lt;br /&gt;
Se volessimo applicare il protocollo REST all'entità "Giocatore" (Player), come prima cosa dovremmo definire le "URL" che accedono a ciascuna informazione del giocatore, e le URL che vanno a modificare lo stato del giocatore stesso. Ad esempio:&lt;br /&gt;
&lt;br /&gt;
&lt;div class="rails" style="background-color: #f0f0f0; border: 1px solid #d0d0d0; color: #000066; font-family: monospace;"&gt;
GET &amp;nbsp; &amp;nbsp;&lt;span style="color: #006600; font-weight: bold;"&gt;/&lt;/span&gt;player&lt;span style="color: #006600; font-weight: bold;"&gt;/&lt;/span&gt;list&lt;span style="color: #006600; font-weight: bold;"&gt;(&lt;/span&gt;.:&lt;span style="color: #cc0066; font-weight: bold;"&gt;format&lt;/span&gt;&lt;span style="color: #006600; font-weight: bold;"&gt;)&lt;/span&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;player&lt;span style="color: green; font-style: italic;"&gt;#list&lt;/span&gt;&lt;br /&gt;
POST &amp;nbsp; &lt;span style="color: #006600; font-weight: bold;"&gt;/&lt;/span&gt;player&lt;span style="color: #006600; font-weight: bold;"&gt;/&lt;/span&gt;list&lt;span style="color: #006600; font-weight: bold;"&gt;(&lt;/span&gt;.:&lt;span style="color: #cc0066; font-weight: bold;"&gt;format&lt;/span&gt;&lt;span style="color: #006600; font-weight: bold;"&gt;)&lt;/span&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;player&lt;span style="color: green; font-style: italic;"&gt;#list&lt;/span&gt;&lt;br /&gt;
GET &amp;nbsp; &amp;nbsp;&lt;span style="color: #006600; font-weight: bold;"&gt;/&lt;/span&gt;player&lt;span style="color: #006600; font-weight: bold;"&gt;(&lt;/span&gt;.:&lt;span style="color: #cc0066; font-weight: bold;"&gt;format&lt;/span&gt;&lt;span style="color: #006600; font-weight: bold;"&gt;)&lt;/span&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; player&lt;span style="color: green; font-style: italic;"&gt;#index&lt;/span&gt;&lt;br /&gt;
POST &amp;nbsp; &lt;span style="color: #006600; font-weight: bold;"&gt;/&lt;/span&gt;player&lt;span style="color: #006600; font-weight: bold;"&gt;(&lt;/span&gt;.:&lt;span style="color: #cc0066; font-weight: bold;"&gt;format&lt;/span&gt;&lt;span style="color: #006600; font-weight: bold;"&gt;)&lt;/span&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; player&lt;span style="color: green; font-style: italic;"&gt;#create&lt;/span&gt;&lt;br /&gt;
GET &amp;nbsp; &amp;nbsp;&lt;span style="color: #006600; font-weight: bold;"&gt;/&lt;/span&gt;player&lt;span style="color: #006600; font-weight: bold;"&gt;/&lt;/span&gt;&lt;span style="color: #5a0a0a; font-weight: bold;"&gt;new&lt;/span&gt;&lt;span style="color: #006600; font-weight: bold;"&gt;(&lt;/span&gt;.:&lt;span style="color: #cc0066; font-weight: bold;"&gt;format&lt;/span&gt;&lt;span style="color: #006600; font-weight: bold;"&gt;)&lt;/span&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; player&lt;span style="color: green; font-style: italic;"&gt;#new&lt;/span&gt;&lt;br /&gt;
GET &amp;nbsp; &amp;nbsp;&lt;span style="color: #006600; font-weight: bold;"&gt;/&lt;/span&gt;player&lt;span style="color: #006600; font-weight: bold;"&gt;/&lt;/span&gt;:id&lt;span style="color: #006600; font-weight: bold;"&gt;/&lt;/span&gt;edit&lt;span style="color: #006600; font-weight: bold;"&gt;(&lt;/span&gt;.:&lt;span style="color: #cc0066; font-weight: bold;"&gt;format&lt;/span&gt;&lt;span style="color: #006600; font-weight: bold;"&gt;)&lt;/span&gt; &amp;nbsp; &amp;nbsp;player&lt;span style="color: green; font-style: italic;"&gt;#edit&lt;/span&gt;&lt;br /&gt;
GET &amp;nbsp; &amp;nbsp;&lt;span style="color: #006600; font-weight: bold;"&gt;/&lt;/span&gt;player&lt;span style="color: #006600; font-weight: bold;"&gt;/&lt;/span&gt;:id&lt;span style="color: #006600; font-weight: bold;"&gt;(&lt;/span&gt;.:&lt;span style="color: #cc0066; font-weight: bold;"&gt;format&lt;/span&gt;&lt;span style="color: #006600; font-weight: bold;"&gt;)&lt;/span&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; player&lt;span style="color: green; font-style: italic;"&gt;#show&lt;/span&gt;&lt;br /&gt;
PUT &amp;nbsp; &amp;nbsp;&lt;span style="color: #006600; font-weight: bold;"&gt;/&lt;/span&gt;player&lt;span style="color: #006600; font-weight: bold;"&gt;/&lt;/span&gt;:id&lt;span style="color: #006600; font-weight: bold;"&gt;(&lt;/span&gt;.:&lt;span style="color: #cc0066; font-weight: bold;"&gt;format&lt;/span&gt;&lt;span style="color: #006600; font-weight: bold;"&gt;)&lt;/span&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; player&lt;span style="color: green; font-style: italic;"&gt;#update&lt;/span&gt;&lt;br /&gt;
DELETE &lt;span style="color: #006600; font-weight: bold;"&gt;/&lt;/span&gt;player&lt;span style="color: #006600; font-weight: bold;"&gt;/&lt;/span&gt;:id&lt;span style="color: #006600; font-weight: bold;"&gt;(&lt;/span&gt;.:&lt;span style="color: #cc0066; font-weight: bold;"&gt;format&lt;/span&gt;&lt;span style="color: #006600; font-weight: bold;"&gt;)&lt;/span&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; player&lt;span style="color: green; font-style: italic;"&gt;#destroy&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
Questa tabella fornisce un verbo HTTP e una URL associata. Queste URL, se chiamate con il rispettivo verbo HTTP, sono già in grado di descrivere le funzionalità di base con cui l'utente può ottenere le informazioni sui giocatori! La prima fornisce una lista dei giocatori, la seconda modifica la lista, la terza ottiene informazioni generiche, la quarta e la quinta inseriscono nuovi giocatori, la sesta  permette di modificare i dati di uno specifico giocatore e via dicendo...&lt;br /&gt;&lt;br /&gt;

Se chiamo &lt;i&gt;/player/list&lt;/i&gt; ottengo una pagina HTML, &lt;i&gt;/player/list.json&lt;/i&gt; un array di giocatori, &lt;i&gt;/player/list.xml&lt;/i&gt; un documento XML. Applicazioni sempre diverse accedono agli stessi dati in maniera omogenea. In questo modo, se l'applicazione è ben scritta, sarà sempre possibile immaginare nuovi modi per accedere ai dati, e produrre applicazioni nuove senza dover modificare il codice lato server.&lt;br /&gt;&lt;br /&gt;

Chiaramente, progettare un'architettura Web in modalità REST comporta un ribaltamento del modo di pensare: invece che partire dalle esigenze "funzionali", bisogna partire dai dati, e dal modo con cui si può manipolarli. Ma il vantaggio di farlo fin dall'inizio, con disciplina, produrrà significativi risparmi nella gestione evolutiva dell'applicazione, e darà l'opportunità di costruire nuovi modi d'uso di applicazioni esistenti praticamente senza sforzo.&lt;br /&gt;&lt;br /&gt;

Oggi esistono molti framework che producono applicazioni Web RESTful. Il più famoso è &lt;a href="http://rubyonrails.org/"&gt;"Ruby On Rails"&lt;/a&gt;. Seguono &lt;a href="http://bowlerframework.org/"&gt;"Bowler"&lt;/a&gt; per Scala, &lt;a href="http://jersey.java.net/"&gt;"Jersey"&lt;/a&gt; per Java. E molti altri stanno nascendo.&lt;br /&gt;
&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4364592042964713187-8018255926183891688?l=alessiosaltarin.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/alessiosaltarin/~3/YkqIyErxmQA/pensare-in-rest-thinking-in-rest.html</link><author>noreply@blogger.com (Alessio Saltarin)</author><thr:total>0</thr:total><feedburner:origLink>http://alessiosaltarin.blogspot.com/2012/02/pensare-in-rest-thinking-in-rest.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4364592042964713187.post-3162894106302709360</guid><pubDate>Tue, 24 Jan 2012 14:47:00 +0000</pubDate><atom:updated>2012-01-25T09:02:39.863+01:00</atom:updated><title>Interoperabilità tra Scala e Java</title><description>&lt;a href="http://www.scala-lang.org/"&gt;Scala&lt;/a&gt; è interoperabile con Java, poiché entrambi i linguaggi producono Java bytecode. Questo significa che tutte le seguenti frasi sono vere:

&lt;ul&gt;
&lt;li&gt;Codice Scala può essere eseguito da una Java Virtual Machine&lt;/li&gt;
&lt;li&gt;Codice Java può essere "visto" da codice Scala&lt;/li&gt;
&lt;li&gt;Codice Scala può esserre "visto" da codice Java&lt;/li&gt;
&lt;/ul&gt;

Supponiamo di avere ad esempio la seguente classe di business in Scala, una generica struttura che rappresenta l'astrazione di un numero razionale. E' costruita passando numeratore e denominatore, ad esempio Rational(2,3) è due terzi (2/3).

&lt;pre  style="font-family:arial;font-size:12px;border:1px dashed #CCCCCC;width:99%;height:auto;overflow:auto;background:#f0f0f0;;background-image:URL(http://2.bp.blogspot.com/_z5ltvMQPaa8/SjJXr_U2YBI/AAAAAAAAAAM/46OqEP32CJ8/s320/codebg.gif);padding:0px;color:#000000;text-align:left;line-height:20px;"&gt;&lt;code style="color:#000000;word-wrap:normal;"&gt; package net.alessiosaltarin.rationals  
   
 class Rational(n: Int, d: Int) {  
   require(d != 0)  
   
   private val g = this.gcd(n.abs, d.abs)  
   val numer: Int = (n / g)  
   val denom: Int = (d / g)  
   println("Created " + this.toString())  
   
   def this(n: Int) = this(n, 1)  
   
   override def toString = this.numer + "/" + this.denom  
   
   def +(that: Rational): Rational =  
     new Rational(  
       this.numer * that.denom + that.numer * this.denom,  
       this.denom * that.denom)  
   
   def *(that: Rational): Rational =  
     new Rational(this.numer * that.numer, this.denom * that.denom)  
   
   private def gcd(a: Int, b: Int): Int =  
     if (b == 0) a else gcd(b, a % b)  
 }  
   
 object RationalComputer {  
   
   def performSum(r1: Rational, r2: Rational): String =  
     (r1 + r2).toString()  
   
   def performMultiply(r1: Rational, r2: Rational): String =  
     (r1 * r2).toString()  
   
 }  
   
 object RationalFactory {  
   
   def create(rationalStr: String): Rational =  
     {  
       val indexOfSlash = rationalStr indexOf '/'  
       val n = nrParse(rationalStr.substring(0, indexOfSlash))  
       val d = nrParse(rationalStr.substring(indexOfSlash + 1))  
       new Rational(n, d)  
     }  
   
   private def nrParse(nstr: String): Integer = Integer.parseInt(nstr)  
 }  
&lt;/code&gt;&lt;/pre&gt;

Se vogliamo offrire a questo codice una user interface, che non sia Web, abbiamo ben poche possibilità, se vogliamo rimanere nell'ambito di Scala, e cioè quelle di usare il wrapping delle librerie Swing scritto in Scala, vale a dire:

&lt;a href="http://www.scala-lang.org/api/current/scala/swing/package.html"&gt;
http://www.scala-lang.org/api/current/scala/swing/package.html
&lt;/a&gt;

Il problema di questo approccio è che alla data di questo post manca totalmente un editor visuale che generi in output un codice Scala.

Quello che abbiamo, invece, sono degli editor visuali che generano codice Swing in Java, ad esempio:

&lt;ul&gt;
&lt;li&gt; Netbeans Matisse &lt;/li&gt;
&lt;li&gt; Eclipse Visual Editor &lt;/li&gt;
&lt;/ul&gt;

La buona notizia è che, stanti le premesse di cui sopra, codice Scala può essere visto da Java come se fosse una "libreria" esterna (e viceversa, tra l'altro). Possiamo infatti pensare di realizzare un'interfaccia di questo tipo:

&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://4.bp.blogspot.com/-rOrTXQPpi0c/Tx6_0kn9KjI/AAAAAAAABSM/u7KFNlQpeTw/s1600/Capture.PNG" imageanchor="1" style=""&gt;&lt;img border="0" height="309" width="320" src="http://4.bp.blogspot.com/-rOrTXQPpi0c/Tx6_0kn9KjI/AAAAAAAABSM/u7KFNlQpeTw/s320/Capture.PNG" /&gt;&lt;/a&gt;&lt;/div&gt;

attraverso l'editor visuale che preferiamo, generare il codice Java equivalente, e poi eseguirlo.

Per farlo possiamo seguire due approcci, entrambi validi: eseguire dalla macchina virtuale Scala il codice Scala e il codice Java interpretarlo come bytecode esterno, oppure eseguire da una qualsiasi macchina virtuale Java il codice dell'interfaccia grafica e da questo richiamare il bytecode compilato da Scala come una libreria esterna.

Chiaramente, è il secondo approccio quello più interessante. Infatti nella pratica avremo a disposizione macchine virtuali Java, ottimizzate a seconda dell'uso.

Perché questo approccio sia percorribile, occorre costruirsi un proxy Java in grado di richiamare il codice di business in Scala. Il proxy conterrà i metodi richiamati direttamente dall'interfaccia - nell'esempio, il pulsante di 'esegui operazione'. Ad esempio:

&lt;pre  style="font-family:arial;font-size:12px;border:1px dashed #CCCCCC;width:99%;height:auto;overflow:auto;background:#f0f0f0;;background-image:URL(http://2.bp.blogspot.com/_z5ltvMQPaa8/SjJXr_U2YBI/AAAAAAAAAAM/46OqEP32CJ8/s320/codebg.gif);padding:0px;color:#000000;text-align:left;line-height:20px;"&gt;&lt;code style="color:#000000;word-wrap:normal;"&gt; package net.alessiosaltarin.javaproxy;  
   
 import net.alessiosaltarin.rationals.Rational;  
 import net.alessiosaltarin.rationals.RationalFactory;  
 import net.alessiosaltarin.rationals.RationalComputer;  
   
 public class ProxyLogic  
 {  
   public static String performOperation(Operation op,   
                           String rationalOne,   
                           String rationalTwo)  
   {  
     Rational r1 = RationalFactory.create(rationalOne);  
     Rational r2 = RationalFactory.create(rationalTwo);  
     String result;  
       
     switch (op)  
     {  
          case ADD:  
          default:  
               result = RationalComputer.performSum(r1, r2);  
               break;  
                 
          case SUBTRACT:  
               throw new UnsupportedOperationException();  
                 
          case MULTIPLY:  
               result = RationalComputer.performMultiply(r1, r2);  
               break;  
                 
          case DIVIDE:  
               throw new UnsupportedOperationException();  
     }  
       
     return result;  
   }    
 }  
&lt;/code&gt;&lt;/pre&gt;

Il codice sopra richiama il codice Scala - il namespace 

&lt;pre&gt;net.alessiosaltarin.rationals.Rational&lt;/pre&gt; 

Come fa? Semplicemente lo trova nel percorso del codice compilato come Java bytecode, a patto di avere la libreria Scala 

&lt;pre&gt;
scala-library.jar
&lt;/pre&gt;

nel classpath corrente. Supponendo che la classe RationalGUI sia quella generata dal tool visuale, il codice eterogeneo Scala/Java verrà eseguito dalla JVM in questo modo:

&lt;pre&gt;
java -cp scala-library.jar;[jre,...] net.alessiosaltarin.javaproxy.RationalGUI
&lt;/pre&gt;

Utilizzando ad esempio &lt;i&gt;Eclipse&lt;/i&gt;, è possibile aprire due progetti, uno in Scala e uno in Java, e in quello Java che contiene il metodo &lt;i&gt;main&lt;/i&gt;, referenziare come libreria esterna il codice Scala custom e la libreria &lt;i&gt;scala-library.jar&lt;/i&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4364592042964713187-3162894106302709360?l=alessiosaltarin.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/alessiosaltarin/~3/PHnzhn-l7_Q/interoperabilita-tra-scala-e-java.html</link><author>noreply@blogger.com (Alessio Saltarin)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/-rOrTXQPpi0c/Tx6_0kn9KjI/AAAAAAAABSM/u7KFNlQpeTw/s72-c/Capture.PNG" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://alessiosaltarin.blogspot.com/2012/01/interoperabilita-tra-scala-e-java.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4364592042964713187.post-705783240670469022</guid><pubDate>Fri, 30 Dec 2011 09:10:00 +0000</pubDate><atom:updated>2011-12-30T10:26:05.925+01:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">lavoro</category><category domain="http://www.blogger.com/atom/ns#">crisi</category><title>Il negozio di scarpe di mio nonno</title><description>&lt;br /&gt;
&lt;br /&gt;
"&lt;i&gt;Io appartengo a una grande azienda che produce scarpe...&lt;/i&gt;" disse l'ingegner Carozzi. "In questi tempi di crisi, l'azienda sta andando molto male, e sta cominciando a licenziare. Io mi guardo intorno, e credo di aver capito perchè l'azienda in cui lavoro sta fallendo: è perché noi siamo dei bravi venditori, siamo degli ottimi manager, ma non ci capiamo un gran che di scarpe! Anzi, nelle riunioni aziendali si sente spesso dire con una punta di orgoglio dai nostri capi che loro non ci capiscono molto di scarpe, del resto loro sono bravi dirigenti, bravi venditori, non importa che vendano scarpe oppure lustrini natalizi. Non importerà, d'accordo, intanto però l'azienda sta fallendo." L'ingegner Carozzi si scostò un attimo per accendersi la pipa. Fuori stava cominciando a nevicare. "Io dico queste cose con cognizione di causa, sapete." Fece una pausa di riflessione, poi continuò: "Mio nonno aveva un negozio di calzature in centro. Il suo negozio era sempre pieno di gente! E tutti erano molto sorpresi che il negozio di mio nonno fosse sempre pieno. Perché dovete sapere che mio nonno aveva un carattere difficile, era un burbero, un uomo molto pragmatico, era l'esatto contrario di un buon venditore. Lui era capace di dire a un cliente che aveva messo gli occhi su una scarpa molto costosa, che quella scarpa non era per lui, di lasciar perdere, di uscire dal negozio e risparmiare i suoi soldi. Il negozio di scarpe di mio nonno era sempre pieno perché la gente sapeva che quell'uomo burbero era davvero un intenditore di scarpe! Questo perché prima di essere un negoziante era stato un calzolaio. La gente sapeva che quando andava da lui poteva chiedere un consiglio sulla scarpa adatta a lui, e ricevere una risposta del tutto sincera e competente. La gente in quegli anni doveva risparmiare su tutto: non poteva permettersi un acquisto sbagliato! E sapeva che mio nonno gli avrebbe venduto la scarpa giusta. E il suo negozio era sempre pieno! Nonostante lui fosse un burbero, avesse un carattere difficile e non fosse tagliato per il mestiere di commerciante." L'ingegner Carozzi si voltò verso i suoi interlocutori, sorrise loro con un sorriso amaro, poi si voltò e se ne andò per la sua strada.&lt;br /&gt;
&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4364592042964713187-705783240670469022?l=alessiosaltarin.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/alessiosaltarin/~3/cTqR--QX5Yo/il-negozio-di-scarpe-di-mio-nonno.html</link><author>noreply@blogger.com (Alessio Saltarin)</author><thr:total>0</thr:total><feedburner:origLink>http://alessiosaltarin.blogspot.com/2011/12/il-negozio-di-scarpe-di-mio-nonno.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4364592042964713187.post-8437758525518638926</guid><pubDate>Wed, 31 Aug 2011 12:38:00 +0000</pubDate><atom:updated>2011-10-17T14:19:12.150+02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">nfc</category><category domain="http://www.blogger.com/atom/ns#">gps</category><category domain="http://www.blogger.com/atom/ns#">android</category><title>Navigazione e geolocalizzazione</title><description>Sono a P., una città a me sconosciuta, per un meeting. Ho bisogno di una farmacia - mi sono dimenticato le aspirine a casa! Fortunatamente ho con me il mio cellulare Android. Ecco cosa faccio:&lt;br /&gt;&lt;br /&gt;1) Apro &lt;a href="http://www.google.it"&gt;Google&lt;/a&gt;. Siccome ho attivato il geolocalizzatore, la pagina visualizzata riporta chiaramente che mi trovo a P.&lt;br /&gt;2) Seleziono &lt;a href="http://www.google.com/places/"&gt;Places&lt;/a&gt;&lt;br /&gt;3) Da lì digito "Farmacia". Appare un elenco delle farmacie, in ordine di vicinanza.&lt;br /&gt;4) Scelgo la prima e visualizzo la &lt;a href="http://maps.google.com/"&gt;mappa&lt;/a&gt;, con le informazioni in tempo reale del traffico.&lt;br /&gt;5) Ok, il traffico è leggero. Maps mi dice che ci arriverò in cinque minuti in macchina e in nove minuti a piedi! Sono in macchina, ci vado in macchina.&lt;br /&gt;6) Clicko sul &lt;a href="www.google.com/navigation"&gt;Navigatore&lt;/a&gt;, che immediatamente attiva il GPS. La voce di una signorina, in bell'italiano, mi racconta la strada da fare, nominando anche le vie.&lt;br /&gt;&lt;br /&gt;Il tutto con un Android senza nessuno speciale software a pagamento, con una configurazione "out-of-the-box". Niente male!&lt;br /&gt;&lt;br /&gt;Il prossimo passo è andare in un supermercato, fare la spesa, e uscire senza pagare alla cassa - ma ritrovandosi il conto esatto addebitato sulla carta di credito. (&lt;a href="http://en.wikipedia.org/wiki/Near_field_communication"&gt;Il che non è propriamente fantascienza...&lt;/a&gt;)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4364592042964713187-8437758525518638926?l=alessiosaltarin.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/alessiosaltarin/~3/kHPKzuCulz8/navigazione-e-geolocalizzazione.html</link><author>noreply@blogger.com (Alessio Saltarin)</author><thr:total>1</thr:total><feedburner:origLink>http://alessiosaltarin.blogspot.com/2011/08/navigazione-e-geolocalizzazione.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4364592042964713187.post-3052065587084137361</guid><pubDate>Fri, 24 Jun 2011 17:25:00 +0000</pubDate><atom:updated>2011-06-24T19:36:21.845+02:00</atom:updated><title>Fammi ripetere con parole mie</title><description>Come Software Architect, la lezione più preziosa è stata imparare che io e lo sponsor del progetto - o meglio, si dovrebbe dire gli stakeholder - parliamo lingue differenti.&lt;br /&gt;&lt;br /&gt;Abbiamo del resto una formazione differente, esperienze differenti, e significative difformità nei punti di vista.&lt;br /&gt;&lt;br /&gt;Per questo la chiave del successo di un progetto software, oggi, è la chiarezza di comunicazione tra chi fornisce la tecnologia - l'Architect, appunto - e chi intende utilizzarla per raggiungere i suoi scopi di business.&lt;br /&gt;&lt;br /&gt;Ecco perché è fondamentale che l'Architect si chieda sempre: ho capito quali sono gli obiettivi di questo progetto? Esiste uno strumento formidabile: dopo aver letto un documento, aver partecipato a una riunione, avere ascoltato le parole degli stakeholder, fermarsi un attimo e dire: "Ok, ora fammi ripetere con parole mie". Vediamo cosa ho capito davvero.&lt;br /&gt;&lt;br /&gt;Altrettando fondamentale è chiarire fin dall'inizio che cosa la tecnologia può offrire, e che cosa non può offrire. E' bene fin da subito spianare il campo da miti e leggende. (&lt;span style="font-style:italic;"&gt;E lo so che è difficile: è bello all'inizio avere uno sponsor che ci guarda come Bilbo Baggins guardava Gandalf nello Hobbit!&lt;/span&gt;)&lt;br /&gt;&lt;br /&gt;Direi quindi che sono due le chiavi importanti per il successo di un progetto software enterprise: &lt;br /&gt;&lt;br /&gt;1) Voglio capire bene quali sono gli obiettivi da ottenere con il sistema&lt;br /&gt;2) Voglio comunicare bene cosa un sistema è in grado di offrire (e cosa no)&lt;br /&gt;&lt;br /&gt;Le questioni tecniche, i disegni architetturali, i dettagli implementativi vengono molto dopo.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4364592042964713187-3052065587084137361?l=alessiosaltarin.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/alessiosaltarin/~3/au7Ywbyk2mg/fammi-ripetere-con-parole-mie.html</link><author>noreply@blogger.com (Alessio Saltarin)</author><thr:total>0</thr:total><feedburner:origLink>http://alessiosaltarin.blogspot.com/2011/06/fammi-ripetere-con-parole-mie.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4364592042964713187.post-829694376587546056</guid><pubDate>Fri, 17 Jun 2011 14:26:00 +0000</pubDate><atom:updated>2011-06-18T10:34:12.464+02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">enterprise architecture</category><category domain="http://www.blogger.com/atom/ns#">database</category><title>Basta Database!</title><description>Una domanda che non fareste mai ad un Cliente, che ha un sistema informativo con un suo potentissimo sistema di RDBMS (database relazionale, normalmente Oracle o MS Sql Server), è: "Ok, ma a cosa ti serve?"&lt;br /&gt;&lt;br /&gt;Come a cosa serve un database? (Ti guardano come un poveretto, con tanto di occhi sgranati)... Ma non lo sai che in un database ci sono tutti i dati aziendali? Ma non lo sai che è il cuore del sistema informatico? Ma non lo sai che nessuno nemmeno osa pensare di non averne uno...&lt;br /&gt;&lt;br /&gt;Mentre sento queste cose mi aggiro curioso tra gli utenti (solitamente disperati) di un tale eccellente sistema: sono lì che combattono con infinite tabelle, piene di dati ridondanti e infinitamente inutili, che per essere tirati fuori hanno bisogno di uno stranissimo linguaggio, perlopiù incomprensibile alle logiche umane, chiamato SQL.&lt;br /&gt;&lt;br /&gt;La maggior parte delle aziende, per cercare di tirar fuori qualcosa da quei mostri lì, compra sistemi di Datawarehouse e Business Intelligence che costano loro un ordine di grandezza in più...&lt;br /&gt;&lt;br /&gt;Mi aggiro tra sistemisti che sognano vacanze ai Caraibi e mondi senza computer - soprattutto senza database - e tra manager che guardano fuori dalla finestra cercando di capire con quali soldi pagare l'espertone Oracle (o quello che volete) che gli risolverà il loro maggior problema, e cioè: perché ho milioni di dati inutili e non trovo mai quelli che mi servono?&lt;br /&gt;&lt;br /&gt;A cosa serve un database? "Ad archiviare i dati". Sono scettico. "A gestire le transazioni..." ok, ci avviciniamo. "Ad estrarre dai miei dati le informazioni che servono per il mio business..." Ah no! Ecco il punto!&lt;br /&gt;&lt;br /&gt;Il punto è che la tecnologia delle basi di dati è nata quando i computer erano relativamente lenti, soprattutto i dischi, poco capienti e le applicazioni molto costose da scrivere, perché difficili da creare e debuggare. Perciò si è inventato un sistema altamente efficace nell'archiviare i dati (scrittura) e nel recuperarli (lettura), e questo a scapito della loro intelligibilità e facilità d'uso.&lt;br /&gt;&lt;br /&gt;Il sistema relazionale inventato da Cobb è un sistema efficace con computer poco potenti e capienti, esattamente il contrario dei computer di cui disponiamo oggi.&lt;br /&gt;&lt;br /&gt;Oggi possiamo tranquillamente immaginare (e realizzare!) un sistema informativo complesso senza database sotto. "E come fai ad archiviare i tuoi dati?" Li scrivo sul disco, ovvio. Sì ma in che formato?&lt;br /&gt;&lt;br /&gt;Ecco una buona domanda. Le cui risposte possono essere almeno tre, e ricoprire con ciò gran parte delle necessità di archiviazione di un'applicazione anche di media/grande complessità.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Prima possibilità&lt;/span&gt;: flat file. Salviamo tutti i nostri dati in file di testo in formato flat. Esempi: il win.ini, YAML, SQLite, TextDB ecc. ecc. (&lt;a href="http://en.wikipedia.org/wiki/Flat_file_database"&gt;http://en.wikipedia.org/wiki/Flat_file_database&lt;/a&gt;)&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Seconda possibilità&lt;/span&gt;: chi ha necessità di immagazzinare relazioni gerarchiche di tipo padre-figlio, o strutture fortemente innestate, può usare il formato di testo più potente in assoluto: XML. Il che è però fin troppo per la stragrande maggioranza delle applicazioni. &lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Terza possibilità&lt;/span&gt;: ok, proprio non potete fare a meno di Oracle! Almeno lasciatelo scrivere a chi lo sa fare, e voi non sporcatevi le mani. Utilizzate dunque uno strumento di ORM - &lt;span style="font-style:italic;"&gt;object relational mapping&lt;/span&gt; - che ha il compito di serializzare, deserializzare e ricercare i vostri oggetti di business in un normale database relazionale. &lt;br /&gt;&lt;br /&gt;Quest'ultima possibilità è quella secondo me più interessante, e che spero prenda piede nelle applicazioni enterprise del prossimo lustro. L'articolo che più concisamente descrive la tecnica è &lt;a href="http://www.service-architecture.com/object-relational-mapping/articles/transparent_persistence.html"&gt;questo&lt;/a&gt;.&lt;br /&gt;Seguito dall'ottima &lt;a href="http://it.wikipedia.org/wiki/Object-relational_mapping"&gt;voce su Wikipedia&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;In soldoni, nelle applicazioni moderne, le attività di DDL (Data Definition Language) e DML (Data Manipulation Language) debbono essere demandate ad un apposito strato software (l'ORM appunto) che le svolge al meglio e in modo "trasparente" per l'utente. In questo caso ciò che conta maggiormente nell'applicativo non è più il modello concettuale dei dati, ma il modello concettuale degli oggetti (sottinteso, di business, cioè a dire: web services, remote procedure calls e quant'altro). Il vantaggio consiste, di fatto, nella drastica diminuzione delle risorse necessarie al disegno e allo sviluppo della base dati - fino quasi ad annullarle.&lt;br /&gt;&lt;br /&gt;Per Java, il miglior strumento ORM è senz'altro &lt;a href="http://www.hibernate.org/"&gt;Hibernate&lt;/a&gt;, mentre per il mondo Microsoft è l'&lt;a href="http://msdn.microsoft.com/en-us/library/aa697427%28v=vs.80%29.aspx"&gt;Entity Framework&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Entrambi sono ottimi punti di partenza per dire definitivamente addio agli odiati database.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4364592042964713187-829694376587546056?l=alessiosaltarin.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/alessiosaltarin/~3/6OZALInTfqs/basta-database.html</link><author>noreply@blogger.com (Alessio Saltarin)</author><thr:total>1</thr:total><feedburner:origLink>http://alessiosaltarin.blogspot.com/2011/06/basta-database.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4364592042964713187.post-2308159710610453960</guid><pubDate>Thu, 24 Mar 2011 08:24:00 +0000</pubDate><atom:updated>2011-03-24T09:42:11.480+01:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">font</category><category domain="http://www.blogger.com/atom/ns#">FX4</category><category domain="http://www.blogger.com/atom/ns#">Firefox 4</category><category domain="http://www.blogger.com/atom/ns#">IE9</category><title>Testo e font sfocati in IE9 e Firefox 4</title><description>Ok, vi siete scaricati Internet Explorer 9 e/o Firefox 4 e, dopo un iniziale periodo di eccitazione mistica, avete pensato di avere bisogno di un nuovo paio di occhiali! "Ma sono io, o si vede tutto un po' sfocato?"&lt;br /&gt;&lt;br /&gt;Il fatto è che i nuovi engine grafici dei browser di ultima generazione utilizzano di default - quando la trovano - l'accelerazione hardware via scheda grafica. La rappresentazione di un documento HTML non è più la commistione di font raster (cioè disegnati pixel per pixel) e immagini, ma un'unica immagine che si va componendo mentre la pagina viene renderizzata. L'effetto "sfocatura" è dovuto al fatto che i font non sono più raster, ma vettoriali, e utilizzano le primitive grafiche per essere renderizzati - proprio come accade, ad esempio, nelle applicazioni Silverlight (WPF e compagnia).&lt;br /&gt;&lt;br /&gt;Ok, ma io adesso come faccio? E' inaccettabile che lo schermo si veda "peggio" che con IE8 o Firefox 3.&lt;br /&gt;&lt;br /&gt;Avete due possibilità: la prima è quella di disabilitare l'accelerazione hardware, ad es. in Firefox 4 sotto &lt;span style="font-style:italic;"&gt;Opzioni / Navigazione / Utilizza l'accelerazione hardware quando disponibile&lt;/span&gt;. Chiaramente con questo vi giocate una delle più importanti innovazioni dei browser di ultima generazione, cioè l'utilizzo della GPU nel rendering delle pagine, con un sostanziale aumento delle performance.&lt;br /&gt;&lt;br /&gt;Oppure potreste fare il "fine tuning" dell'engine di renderizzazione grafica dei font vettoriali. In Windows XP andando su questo sito:&lt;br /&gt;&lt;br /&gt;http://www.microsoft.com/typography/cleartype/tuner/step1.aspx&lt;br /&gt;&lt;br /&gt;Invece su Vista e 7, semplicemente da Menù Start, scrivendo "Ottimizzazione caratteri Clear Type"&lt;br /&gt;&lt;br /&gt;(Io ho seguito quest'ultima strada e sono soddisfatto, però è questione di gusti)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4364592042964713187-2308159710610453960?l=alessiosaltarin.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/alessiosaltarin/~3/yRoI9yjj41s/testo-e-font-sfocati-in-ie9-e-firefox-4.html</link><author>noreply@blogger.com (Alessio Saltarin)</author><thr:total>1</thr:total><feedburner:origLink>http://alessiosaltarin.blogspot.com/2011/03/testo-e-font-sfocati-in-ie9-e-firefox-4.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4364592042964713187.post-3468230336091224733</guid><pubDate>Tue, 14 Sep 2010 12:33:00 +0000</pubDate><atom:updated>2010-09-14T15:44:46.650+02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">project costing</category><category domain="http://www.blogger.com/atom/ns#">project management</category><category domain="http://www.blogger.com/atom/ns#">IT</category><title>Il fisico e il meteorologo o del perché i progetti IT falliscono</title><description>I progetti IT normalmente falliscono. Esiste tutta una letteratura di report e di statistiche sui fallimenti (v. rif. in calce). Quella dello Standish Group (1995 e 2009) stima una percentuale attorno al 70% di fallimenti. Più drastico Gartner Group, che in diversi report, stima attorno all'85% i progetti IT che producono ritorni negativi (ROI &lt; 0).&lt;br /&gt;&lt;br /&gt;Chiaramente esiste una moltitudine di risposte alla domanda "Perché i progetti IT falliscono", e molti autori forniscono la loro ipotesi. Io credo che il motivo principale sia dovuto a un errato processo di valutazione dei costi e degli effort di un progetto, dovuto a una serie di miti su come si realizza e si sviluppa un progetto informatico.&lt;br /&gt;&lt;br /&gt;Comincerò con un aneddoto. Un fisico e un meteorologo passeggiano in un parco. Entrambi guardano il cielo. Il fisico dice al meteorologo: "Non capisco. Noi fisici siamo in grado di predire al secondo la posizione di tutti i satelliti in cielo, e voi meteorologi non siete in grado di dire se domani pioverà o meno". Il meteorologo, per nulla scandalizzato, lo guarda e gli dice: "Hai ragione! Non siamo in grado di dirlo".&lt;br /&gt;&lt;br /&gt;Durante il mio ultimo progetto informatico ho assistito alla stessa obiezione. Siamo in una grande fabbrica di aeroplani. "Ma come" dice il Cliente al Consulente Informatico "io sono in grado di dire esattamente quanto ci metterò a costruire e a consegnare al mio cliente un aeroplano, e tu non sei in grado di dirmi quanto ci metterai a costruire il mio sistema informativo e quanto ti costerà". "Hai ragione" dice l'onesto consulente "non sono in grado di dirtelo."&lt;br /&gt;&lt;br /&gt;La verità è che di consulenti informatici onesti - o abbastanza coraggiosi da ammettere la dura realtà - ce ne sono pochi. Quando il progetto, com'è normale, esce dal budget previsto in termini di costi e tempi, si assiste al nascere di curiosissime scuse: il costo del vendor è aumentato, i dati storici erano sbagliati, il progettista che aveva fatto le stime aveva bevuto, il nostro miglior sviluppatore è dovuto andare in maternità, il server con i sorgenti si è impastato. Scuse, scuse, giusto?&lt;br /&gt;&lt;br /&gt;I progetti IT - tutti quelli di una certa complessità e novità - sono caratterizzati dalla legge: prima volta-primo uso. E' quasi impossibile calcolare con esattezza il costo di qualcosa che non è mai stato tentato. È così unico, così sfaccettato, e ha così tanti fronti che il numero e la dinamica delle sue variabili crea un problema insormontabile a chiunque stia cercando di valutare i suoi costi a preventivo.&lt;br /&gt;&lt;br /&gt;Il numero di variabili e la novità sono i tratti caratterizzanti di un progetto IT. La tecnologia cambia. Gli strumenti cambiano. Le soluzioni sono diverse e nuove. Gli sviluppatori bravi usano tecnologie obsolete, quelli che usano tecnologie nuove, sono impreparati e non hanno abbastanza esperienza. Inoltre, nessuno conosce "a preventivo" che cosa sarà effettivamente sviluppato.&lt;br /&gt;&lt;br /&gt;Paradossalmente, il modello di project-estimation e di creazione dell'offerta ancor oggi più usato in ambito consulenziale è quello "Waterfall", costituito da sei step seriali:&lt;br /&gt;&lt;br /&gt;1. Descrizione (sommaria e vaga) dei requisiti del progetto&lt;br /&gt;2. Valutazione e stima degli effort e delle risorse necessarie&lt;br /&gt;3. OFFERTA MONETARIA AL CLIENTE (spesso "chiavi in mano", tutto incluso e senza possibili variazioni)&lt;br /&gt;4. Analisi funzionale (dove si comincia a comprendere che cosa era sbagliato al punto 2)&lt;br /&gt;5. Analisi architetturale (dove i dubbi della fase 4 diventano certezze)&lt;br /&gt;6. Sviluppo &amp; Test (dove il disastro assume proporzioni irreparabili)&lt;br /&gt;&lt;br /&gt;Da tempo esistono risposte e metodologie per mitigare gli effetti di questa errata impostazione. Queste sono figlie del movimento Agile e del concetto di Ciclo di Vita dello Sviluppo del Software (Application Life-Cycle Management).&lt;br /&gt;&lt;br /&gt;Queste metodologie, abbastanza sorprendentemente, sono tuttora ignorate dalla gran parte del mondo consulenziale IT e delle aziende che hanno grandi e complesse realtà IT al loro interno. Questo per un motivo fondamentale, e cioè che la "stima a preventivo" è la testata d'angolo cui poggia tutto il business, sia per chi vende che per chi acquista soluzioni IT. Il problema, come si è visto, è che la "stima a preventivo" è quasi sempre totalmente errata, quando non addirittura una menzogna.&lt;br /&gt;&lt;br /&gt;Se per un momento facciamo l'ipotesi di poter fare a meno della "stima a preventivo", possiamo immaginare un processo di Project Costing &amp; Estimation efficace e, soprattutto, vantaggioso per tutti gli attori (win-win). Questo processo è un processo iterativo, che si svolge all'interno di uno "sprint" di tempo - solitamente pari a un mese. In un mese - ogni mese - si fanno:&lt;br /&gt;&lt;br /&gt;1. Analisi dei requisiti (e backlog)&lt;br /&gt;2. Analisi tecnica&lt;br /&gt;3. Sviluppo&lt;br /&gt;4. Test e stime (di completamento, di budget, di costo totale ecc.)&lt;br /&gt;&lt;br /&gt;e poi si ricomincia. Questa iteratività è alla base di qualunque processo di cambiamento in azienda, e risponde precisamente alla necessità di conoscere qualcosa che, all'inizio, è inconoscibile. E' un processo di raggiungimento della verità.&lt;br /&gt;&lt;br /&gt;Sono convinto che se le imprese che lavorano nel settore IT non cominceranno a predisporre processi inerentemente iterativi, i fallimenti non potranno che continuare a essere all'ordine del giorno. &lt;br /&gt;&lt;br /&gt;Le tecniche di sviluppo agili, l'intero Agile Movement, il mondo Open-Source insegnano tutti che il modello iterativo - che parte inoltre dal basso, e cioè dal codice sorgente - è un modello che assicura risultati grandemente maggiori rispetto al Waterfall classico. Le grandi realtà di sviluppo software globale (Google, Microsoft) da tempo seguono questo approccio.&lt;br /&gt;&lt;br /&gt;Riferimenti:&lt;br /&gt;STANDISH GROUP: &lt;a href="http://www.projectsmart.co.uk/docs/chaos-report.pdf"&gt;http://www.projectsmart.co.uk/docs/chaos-report.pdf&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.standishgroup.com/newsroom/chaos_2009.php"&gt;http://www.standishgroup.com/newsroom/chaos_2009.php&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.gartner.com/5_about/news/exec_reports.jsp"&gt;http://www.gartner.com/5_about/news/exec_reports.jsp&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.itarchitect.co.uk/articles/display.asp?id=203"&gt;http://www.itarchitect.co.uk/articles/display.asp?id=203&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.projectsmart.co.uk/project-cost-management.html"&gt;http://www.projectsmart.co.uk/project-cost-management.html&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.it-cortex.com/Stat_Failure_Cause.htm "&gt;http://www.it-cortex.com/Stat_Failure_Cause.htm &lt;/a&gt;(altri report di fallimenti)&lt;br /&gt;&lt;a href="http://www.infoq.com/presentations/Agile-Management-Google-Jeff-Sutherland"&gt;http://www.infoq.com/presentations/Agile-Management-Google-Jeff-Sutherland&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4364592042964713187-3468230336091224733?l=alessiosaltarin.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/alessiosaltarin/~3/BGFweSJoXfA/il-fisico-e-il-meteorologo-o-del-perche.html</link><author>noreply@blogger.com (Alessio Saltarin)</author><thr:total>1</thr:total><feedburner:origLink>http://alessiosaltarin.blogspot.com/2010/09/il-fisico-e-il-meteorologo-o-del-perche.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4364592042964713187.post-7890507122360795120</guid><pubDate>Fri, 02 Jul 2010 13:54:00 +0000</pubDate><atom:updated>2010-07-02T16:15:37.638+02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">scala</category><title>Differenza tra 'object' e 'class' in Scala</title><description>Una delle cose che trovo più intelligenti nel linguaggio Scala, è la netta distinzione tra Tipo Object e Tipo Class. Il primo è un tipo che può avere soltanto una istanza. Il secondo è un tipo che può avere molteplici istanze.&lt;br /&gt;&lt;br /&gt;Il primo ha sintassi 'object', il secondo 'class'.&lt;br /&gt;&lt;br /&gt;Chiaramente il primo, essendo sostanzialmente una classe "statica", non va istanziato, i suoi metodi possono essere chiamati direttamente. Il secondo va istanziato.&lt;br /&gt;&lt;br /&gt;Ecco un esempio:&lt;br /&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;class Molteplice(nr : Int)&lt;br /&gt;{&lt;br /&gt;  def id = nr;&lt;br /&gt;  &lt;br /&gt;  def parla()&lt;br /&gt;  {&lt;br /&gt;    println(&amp;quot;Buongiorno, sono il Molteplice nr = &amp;quot; + id);&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;object Singleton &lt;br /&gt;{&lt;br /&gt;  def parla() &lt;br /&gt;  {&lt;br /&gt;    println(&amp;quot;Buongiorno, sono un singleton.&amp;quot;);&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;object Main &lt;br /&gt;{&lt;br /&gt;  def main(args : Array[String]) : Unit = &lt;br /&gt;  {&lt;br /&gt;      Singleton.parla();&lt;br /&gt;      val range = 0.until(10);&lt;br /&gt;&lt;br /&gt;      for (i &amp;lt;- range)&lt;br /&gt;      {&lt;br /&gt;         val m = new Molteplice(i);&lt;br /&gt;         m.parla();&lt;br /&gt;      }&lt;br /&gt;      &lt;br /&gt;   } &lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Questo ci permette di capire subito le intenzioni del programmatore, che deve creare classi solamente dove questo ha realmente senso.&lt;br /&gt;&lt;br /&gt;Nella mia esperienza di programmatore OO (in Java, C++ e C#), direi che su 100 tipi in un programma normale, ad esempio di integrazione aziendale, 70 sono singleton (cioè in Scala 'object'), ovvero collezioni statiche di metodi e proprietà, e solo 30 classi vere e proprie (in Scala, 'class').&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4364592042964713187-7890507122360795120?l=alessiosaltarin.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/alessiosaltarin/~3/MG_MUixGPO4/differenza-tra-object-e-class-in-scala.html</link><author>noreply@blogger.com (Alessio Saltarin)</author><thr:total>0</thr:total><feedburner:origLink>http://alessiosaltarin.blogspot.com/2010/07/differenza-tra-object-e-class-in-scala.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4364592042964713187.post-348642504671060414</guid><pubDate>Fri, 10 Jul 2009 08:51:00 +0000</pubDate><atom:updated>2009-07-10T11:21:13.204+02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">ereditarietà</category><category domain="http://www.blogger.com/atom/ns#">mixin</category><category domain="http://www.blogger.com/atom/ns#">scala</category><title>Ereditarietà multipla in Scala</title><description>Il problema dell'ereditarietà multipla nei linguaggi fortemente tipizzati (C++) è, molto banalmente, che se un oggetto eredita da due differenti classi che implementano lo stesso metodo, il compilatore non sa quale implementazione di quel metodo associargli (bind).&lt;br /&gt;&lt;br /&gt;In Java e in C# perciò si è deciso di abolire l'ereditarietà multipla, e di inserire il concetto di interfaccia. Il problema delle interfacce, però, è che attraverso di loro viene descritto il comportamento di un oggetto (quali metodi sicuramente quel metodo avrà), ma non viene implementato, perché l'implementazione si demanda alla classe di quell'oggetto.&lt;br /&gt;&lt;br /&gt;Questa soluzione non è ottimale, perché se nella mia tassonomia di classi ho delle forti "somiglianze" tra una classe e l'altra, la scrittura dell'implementazione dell'interfaccia comune rischia di doversi ripetere da una classe all'altra. Insomma, rischiamo ripetizioni e riscritture.&lt;br /&gt;&lt;br /&gt;In &lt;a href="http://www.mrwebmaster.it/ruby/articoli/uso-mixin-ruby_905.html"&gt;Ruby esiste il concetto di mixin&lt;/a&gt;, per cui posso "prendere a prestito" del codice che esiste "altrove" e inserirlo nella mia classe, senza doverlo riscrivere. Il problema è che Ruby è un linguaggio di scripting, e non è tipizzato.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.scala-lang.org/"&gt;Scala &lt;/a&gt;è invece un linguaggio tipizzato che permette - in un certo senso! - l'ereditarietà multipla, e lo fa attraverso i "trait".&lt;br /&gt;&lt;br /&gt;Ecco un esempio:&lt;br /&gt;&lt;br /&gt;&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); font-size: 12px; line-height: 14px; width: 100%;"&gt;&lt;br /&gt;abstract class Animale&lt;br /&gt;{&lt;br /&gt;   def nome:String;&lt;br /&gt;   def classe:String;&lt;br /&gt;   def comeMiChiamo:String = ("Sono il " + this.nome + " e sono un " + this.classe);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;trait Mammifero extends Animale&lt;br /&gt;{&lt;br /&gt;   override def classe:String = "Mammifero";&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;trait Rettile extends Animale&lt;br /&gt;{&lt;br /&gt;   override def classe:String = "Rettile";&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;class Delfino(aName: String) extends Animale with Mammifero&lt;br /&gt;{&lt;br /&gt;   def nome:String = "delfino "+ aName;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;class Serpente(aName: String) extends Animale with Rettile&lt;br /&gt;{&lt;br /&gt;   def nome:String = "serpente "+aName;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;object Main&lt;br /&gt;{&lt;br /&gt;    def main(args: Array[String])&lt;br /&gt;    {  &lt;br /&gt;      parla(new Delfino("Pippo"));&lt;br /&gt;      parla(new Serpente("Pluto"));&lt;br /&gt;    }&lt;br /&gt; &lt;br /&gt;    def parla(animale: Animale)&lt;br /&gt;    {&lt;br /&gt;      println(animale.comeMiChiamo);&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;In questo esempio, la classe Animale è una classe astratta, che definisce il metodo "comeMiChiamo" (ok, non mi veniva niente di meglio!). Questo metodo è polimorfico rispetto alla "specie" dell'animale. Definisco perciò due nuove classi, che incidentalmente sono anche "classi di animali": i rettili e i mammiferi. &lt;br /&gt;&lt;br /&gt;L'output del programma in console è:&lt;br /&gt;&lt;br /&gt;&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; color: rgb(0, 238, 0); background-color: rgb(0, 0, 0); font-size: 12px; line-height: 14px; width: 100%;"&gt;&lt;br /&gt;Sono il delfino Pippo e sono un Mammifero&lt;br /&gt;Sono il serpente Pluto e sono un Rettile&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Quello che voglio dimostrare, è che posso scrivere in Scala una classe che eredita sia da Animale (il metodo "come mi chiamo"), sia da Rettile oppure Mammifero. Per farlo, "Rettile" e "Mammifero" sono due trait, di fatto la trasposizione dei Mixin per Scala. Se vogliamo, sono delle interfacce, solo che, a differenza delle interfacce in Java, il metodo che espongono è anche già implementato - evitandoci riscritture e copia/incolla nel codice (che è sempre male).&lt;br /&gt;&lt;br /&gt;PS: La questione della duplicazione dei metodi alla base del problema dell'ereditarietà multipla, non è risolta, in Scala, è solo "evitata", dal momento che il compilatore, quando si tratta di "trait", fa un bel copia e incolla e non si preoccupa di controllare la coerenza - provate infatti ad esempio a far ereditare a Delfino sia il trait Mammifero che il trait Rettile:&lt;br /&gt;&lt;br /&gt;&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); font-size: 12px; line-height: 14px; width: 100%;"&gt;&lt;br /&gt;class Delfino(aName: String) extends Animale with Mammifero with Rettile&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/4364592042964713187-348642504671060414?l=alessiosaltarin.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/alessiosaltarin/~3/KK-WMFKQDPk/ereditarieta-multipla-in-scala.html</link><author>noreply@blogger.com (Alessio Saltarin)</author><thr:total>1</thr:total><feedburner:origLink>http://alessiosaltarin.blogspot.com/2009/07/ereditarieta-multipla-in-scala.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4364592042964713187.post-2197185509779045328</guid><pubDate>Thu, 30 Apr 2009 12:15:00 +0000</pubDate><atom:updated>2009-04-30T14:33:19.339+02:00</atom:updated><title>Ajax su Https</title><description>Scenario: avete un'applicazione Ajax che funziona benissimo. Switchate il protocollo da &lt;span style="font-style: italic;"&gt;Http &lt;/span&gt;a &lt;span style="font-style: italic;"&gt;Https &lt;/span&gt;(SSL) e non funziona più.&lt;br /&gt;&lt;br /&gt;La prima cosa che vi viene da pensare (come è venuta a me) è che Ajax - o meglio, l'oggetto &lt;span style="font-style: italic;"&gt;XmlHttpRequest &lt;/span&gt;- non funziona su &lt;span style="font-style: italic;"&gt;Https&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Ricerche e un po' di approfondimenti hanno risolto la situazione.&lt;br /&gt;&lt;br /&gt;Intanto confermo che &lt;span style="font-style: italic;"&gt;XmlHttpRequest &lt;/span&gt;(su qualsiasi browser, in particolare Firefox 3 e Internet Explorer 8) funziona su &lt;span style="font-style: italic;"&gt;Https&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Il problema è che la pagina chiamante e lo script Javascript (e tutte le altre eventuali sorgenti che formano la pagina, ad esempio le immagini) devono assolutamente provenire da fonti sicure - cioè da fonti sotto Https.&lt;br /&gt;&lt;br /&gt;Nel mio caso, infatti, le pagine venivano servite da una directory virtuale sotto &lt;span style="font-style: italic;"&gt;Https&lt;/span&gt;, mentre gli script in &lt;span style="font-style: italic;"&gt;Javascript &lt;/span&gt;erano serviti via Http normale. Se questo è il caso, &lt;span style="font-style: italic;"&gt;XmlHttpRequest &lt;/span&gt; restituisce un errore di &lt;span style="font-style: italic;"&gt;Security&lt;/span&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4364592042964713187-2197185509779045328?l=alessiosaltarin.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/alessiosaltarin/~3/lv3thkmWKcY/ajax-su-https.html</link><author>noreply@blogger.com (Alessio Saltarin)</author><thr:total>0</thr:total><feedburner:origLink>http://alessiosaltarin.blogspot.com/2009/04/ajax-su-https.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4364592042964713187.post-1990853748920543761</guid><pubDate>Tue, 14 Apr 2009 07:33:00 +0000</pubDate><atom:updated>2009-04-14T09:43:08.396+02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">xorg.conf</category><category domain="http://www.blogger.com/atom/ns#">Xorg</category><category domain="http://www.blogger.com/atom/ns#">X3100</category><category domain="http://www.blogger.com/atom/ns#">Linux</category><category domain="http://www.blogger.com/atom/ns#">Ubuntu 8.10</category><category domain="http://www.blogger.com/atom/ns#">Intel</category><title>Xorg.conf per Intel X3100</title><description>Un bug introdotto nella release 7.4 di Xorg (Linux) comporta un problema di visualizzazione nelle schede video Intel X3100 - ad esempio montate sui notebook Lenovo T60.&lt;br /&gt;&lt;br /&gt;Questo bug fa sì che fallisca il riconoscimento dei driver corretti in automatico da parte di Xorg, cosicché occorre mettere mano direttamente alla configurazione nel file&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;/etc/X11/xorg.conf&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Dopo una serie di tentativi e di studi, sono approdato alla configurazione ottimale, che riporto qua sotto e che si deve immettere andando a editare il file di cui sopra, ad esempio con:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;sudo gedit /etc/X11/xorg.conf&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Sostituendo interamente il suo contenuto con questo:&lt;br /&gt;&lt;br /&gt;&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); font-size: 12px; line-height: 14px; width: 100%;"&gt;&lt;code&gt;&lt;br /&gt;# xorg.conf (X.Org X Window System server configuration file)&lt;br /&gt;#&lt;br /&gt;# This file was generated by dexconf, the Debian X Configuration tool, using&lt;br /&gt;# values from the debconf database.&lt;br /&gt;#&lt;br /&gt;# Edit this file with caution, and see the xorg.conf manual page.&lt;br /&gt;# (Type "man xorg.conf" at the shell prompt.)&lt;br /&gt;#&lt;br /&gt;# This file is automatically updated on xserver-xorg package upgrades *only*&lt;br /&gt;# if it has not been modified since the last upgrade of the xserver-xorg&lt;br /&gt;# package.&lt;br /&gt;#&lt;br /&gt;# Note that some configuration settings that could be done previously&lt;br /&gt;# in this file, now are automatically configured by the server and settings&lt;br /&gt;# here are ignored.&lt;br /&gt;#&lt;br /&gt;# If you have edited this file but would like it to be automatically updated&lt;br /&gt;# again, run the following command:&lt;br /&gt;#   sudo dpkg-reconfigure -phigh xserver-xorg&lt;br /&gt;&lt;br /&gt;Section "Device"&lt;br /&gt;Identifier "Configured Video Device"&lt;br /&gt;Driver "intel"&lt;br /&gt;Option "XaaNoPixmapCache"&lt;br /&gt;Option "XAANoOffscreenPixmaps" "1"&lt;br /&gt;Option "DRI" "true"&lt;br /&gt;Option "AccelMethod" "XAA"&lt;br /&gt;VideoRam 440320&lt;br /&gt;Option "XvMCSurfaces" "6"&lt;br /&gt;Option "May_Need_ForceBIOS" "1&lt;br /&gt;EndSection&lt;br /&gt;&lt;br /&gt;Section "Monitor"&lt;br /&gt;Identifier "Configured Monitor"&lt;br /&gt;EndSection&lt;br /&gt;&lt;br /&gt;Section "Screen"&lt;br /&gt;Identifier "Default Screen"&lt;br /&gt;Monitor  "Configured Monitor"&lt;br /&gt;Device  "Configured Video Device"&lt;br /&gt;EndSection&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;PS:&lt;br /&gt;&lt;span style="font-style: italic;"&gt;Oggi a colazione dicevo a Lucilla: "Vedi, figliola, non è vero che Linux è gratis! Il suo utilizzo impone che se uno trova la soluzione a un problema deve pubblicarla quanto prima su Internet. Fondamentalmente è questo il meccanismo che ha permesso all'Open Source di essere ciò che è oggi."&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4364592042964713187-1990853748920543761?l=alessiosaltarin.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/alessiosaltarin/~3/mHBUnkrpeRk/xorgconf-per-intel-x3100.html</link><author>noreply@blogger.com (Alessio Saltarin)</author><thr:total>1</thr:total><feedburner:origLink>http://alessiosaltarin.blogspot.com/2009/04/xorgconf-per-intel-x3100.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4364592042964713187.post-9079105977223241974</guid><pubDate>Wed, 25 Mar 2009 14:10:00 +0000</pubDate><atom:updated>2009-03-25T15:16:31.728+01:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">python</category><category domain="http://www.blogger.com/atom/ns#">switch</category><title>Switch in Python</title><description>Com'è noto Python non supporta la sintassi "switch".&lt;br /&gt;&lt;br /&gt;Invece che scrivere interminabili e poco leggibili catene di &lt;span style="font-style: italic;"&gt;if/elif/else&lt;/span&gt; è possibile risolvere elegantemente la cosa con un &lt;span style="font-style: italic;"&gt;dizionario&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Ecco un esempio:&lt;br /&gt;&lt;br /&gt;&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); font-size: 12px; line-height: 14px; width: 100%;"&gt;&lt;code&gt;        switch = {&lt;br /&gt;           'vigenere': Key(parameters),&lt;br /&gt;           'des': DESWrapper(password),&lt;br /&gt;           '3des': TripleDESWrapper(password)&lt;br /&gt;       }&lt;br /&gt;      &lt;br /&gt;       if crypto_type in switch:&lt;br /&gt;           self.crypto = switch[crypto_type]&lt;br /&gt;       else:&lt;br /&gt;           pass&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;In questo esempio la funzione imposta l'oggetto &lt;span style="font-style: italic;"&gt;self.crypto&lt;/span&gt; basandosi su una stringa di input &lt;span style="font-style: italic;"&gt;crypto_type&lt;/span&gt;, che può assumere i seguenti valori:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;vigenere&lt;/li&gt;&lt;li&gt;des&lt;/li&gt;&lt;li&gt;3des&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;(come potete immaginare è un programma di crittografia). Il dizionario inizializza l'oggetto che, a seconda della stringa in input, può diventare di tipo "Key", "DesWrapper" o "TripleDesWrapper", passando al costruttore gli argomenti corretti.&lt;br /&gt;&lt;br /&gt;Se la stringa &lt;span style="font-style: italic;"&gt;crypto_type&lt;/span&gt; è trovata all'interno del dizionario &lt;span style="font-style: italic;"&gt;switch&lt;/span&gt; l'oggetto viene inizializzato, altrimenti il programma passa oltre.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4364592042964713187-9079105977223241974?l=alessiosaltarin.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/alessiosaltarin/~3/XuB0ZcYav1Q/switch-in-python.html</link><author>noreply@blogger.com (Alessio Saltarin)</author><thr:total>0</thr:total><feedburner:origLink>http://alessiosaltarin.blogspot.com/2009/03/switch-in-python.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4364592042964713187.post-6637151225475139436</guid><pubDate>Wed, 21 Jan 2009 10:31:00 +0000</pubDate><atom:updated>2009-01-23T11:27:03.487+01:00</atom:updated><title>Nove regole di bellezza per il codice sorgente</title><description>&lt;div class="line"&gt;Ho sempre amato un aspetto, nella programmazione dei computer, e cioè che le cose possono essere fatte in moltissimi modi diversi, e non c'è sostanzialmente un modo giusto e uno sbagliato di scrivere un programma per computer.&lt;br /&gt;&lt;br /&gt;Tuttavia, esiste certamente un modo &lt;span style="font-style: italic;"&gt;migliore &lt;/span&gt;ed uno &lt;span style="font-style: italic;"&gt;peggiore&lt;/span&gt; per scrivere software. Ecco alcune norme basate sull'esperienza che vorrei condividere.&lt;br /&gt;&lt;br /&gt;(In ciò che segue intendo per "codice" il "codice sorgente" di un programma per computer)&lt;br /&gt;&lt;br /&gt;1. Il codice dovrebbe sempre tendere ad essere "bello"&lt;br /&gt;&lt;br /&gt;2. Quasi mai la "bellezza" coincide con la "sinteticità", benché certamente un codice ridondante sia un codice brutto.&lt;br /&gt;&lt;br /&gt;3. La "bellezza" di un codice è proporzionale alla sua "leggibilità"&lt;br /&gt;&lt;br /&gt;4. Il codice "esplicito" è più bello di quello "implicito"&lt;br /&gt;&lt;br /&gt;5. Le strutture "piatte" sono più belle delle strutture "innestate"&lt;br /&gt;&lt;br /&gt;6. "Sparso" è più bello di "denso"&lt;br /&gt;&lt;br /&gt;7. Un codice utile "in generale" (generico) è da preferire ad uno utile "in particolare" (ad hoc). La genericità è bella.&lt;br /&gt;&lt;br /&gt;8. Non esiste un problema di programmazione che non sia risolubile attraverso la scomposizione in sotto-problemi. Perciò un codice bello è un codice "composto".&lt;br /&gt;&lt;br /&gt;9. L'espressività di un linguaggio di programmazione si misura in quanti modi differenti è possibile implementare lo stesso algoritmo. Un linguaggio espressivo, solitamente è bello.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4364592042964713187-6637151225475139436?l=alessiosaltarin.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/alessiosaltarin/~3/Gtn9_k4eDMc/nove-regole-di-bellezza-per-il-codice.html</link><author>noreply@blogger.com (Alessio Saltarin)</author><thr:total>2</thr:total><feedburner:origLink>http://alessiosaltarin.blogspot.com/2009/01/nove-regole-di-bellezza-per-il-codice.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4364592042964713187.post-6051398753773714799</guid><pubDate>Mon, 29 Sep 2008 13:55:00 +0000</pubDate><atom:updated>2008-09-29T15:56:12.412+02:00</atom:updated><title>Architettura IT e Architettura Civile</title><description>Mia moglie fa l'architetto - quello vero! - e spesso mi fa vedere libri illustrati sulle opere architettoniche dei nostri tempi. Io solitamente non ci capisco molto, né riesco ad emozionarmi come fa lei. Una cosa però intuisco: che le architetture edilizie, rispetto alle architetture IT sono sostanzialmente più evolute.&lt;br /&gt;&lt;br /&gt;Si capisce molto bene, vedendo un'opera di Renzo Piano o di Fuksas, che il requisito di un'architettura civile non è (non è soltanto, diciamo) la funzionalità, ma vi sono anche requisiti di bellezza, originalità, integrazione col contesto.&lt;br /&gt;&lt;br /&gt;La differenza sostanziale tra l'architettura civile e quella informatica è che la prima di solito "funziona" (nel senso che assolve la sua funzione primaria, quella cioè di costituire una o più unità abitative) e di fatto "dura nel tempo".&lt;br /&gt;&lt;br /&gt;Le architetture informatiche, anche quelle più complesse e con costi paragonabili a quelli dell'architettura civile,  solitamente invece "non funzionano" (nel senso che non riescono a tradurre al 100% i requisiti funzionali in software) e, soprattutto, "non durano" - difficilmente un sistema informatico dura più di cinque anni, quasi mai dura più di dieci.&lt;br /&gt;&lt;br /&gt;Come mai quindi l'industria spende milioni di dollari in sistemi informatici che non durano e che non funzionano? La risposta è piuttosto semplice: in questo campo umano, molto semplicemente, non esistono alternative. Noi architetti IT progettiamo "al meglio" quanto la tecnologia e l'ingegneria informatica oggi consentono di fare. In altre parole, come dicevo prima, l'architettura dei sistemi informativi è una scienza relativamente giovane, e come tale, largamente immatura.&lt;br /&gt;&lt;br /&gt;Dobbiamo accontentarci di fare, dunque, spallucce, e realizzare quei sistemi qualitativamente pessimi a cui l'industria dei sistemi IT enterprise ci ha abituati?&lt;br /&gt;&lt;br /&gt;Io credo di no. E suggerisco, umilmente s'intende, due linee guida (noi architetti IT siamo, questo sì, veramente bravi nel produrre Guidelines!) per migliorare la qualità complessiva dei progetti.&lt;br /&gt;&lt;br /&gt;La prima è ovvia, ma sempre trascurata. Premiare la semplicità. Se andate da qualche responsabile IT di una media o grande impresa, vi accorgerete che non riuscirete facilmente a vendere cose semplici. Esistono pochi requisiti informativi enterprise che non siano in realtà soddisfacibili con uno script shell o al massimo con un programma in Python (o in Ruby, guardate per esempio alla lezione di Ruby On Rails), affiancato a un buon database e ad un buona tecnologia di front-end. Ma molto difficilmente riuscirete a vendere qualcosa che non si appoggi a J2EE (una delle tecnologie peggiori e più inutilmente complesse che siano mai state prodotte dall'Uomo) e che non richieda hardware secondo solo a quello della NASA. Credo che questa necessità di complessità sia in qualche modo correlata all'idea che si ha dei computer e del software come qualcosa di oscuro e di magico, campi esoterici in cui il Segreto e il Mistero sono connaturati alla soluzione che si va proponendo.&lt;br /&gt;&lt;br /&gt;Della seconda ho parlato nel mio blog precedente a proposito del mio macellaio. Avremo, io credo, un balzo nella qualità dei sistemi informativi quando abbandoneremo del tutto l'idea (presuntuosa e sempre disattesa) di poter stimare il loro valore economico a preventivo. So di dare un dispiacere ai venditori di (complessissime!) metodologie che vorrebbero calcolare a priori il costo o il valore di un progetto informatico: ogni anno vengono pubblicati studi che confermano che questo è un campo del sapere in cui semplicemente non siamo in grado di fare previsioni! Non siamo in grado e non abbiamo una metodologia in grado di stimare il costo di un progetto informatico a partire dai suoi requisiti e dall'analisi funzionale. Come nella meteorologia, in un progetto informatico di medie o grosse dimensioni, le variabili sono talmente tante, che non è possibile tenerle tutte in conto. Perciò ogni previsione è destinata in genere a naufragare.&lt;br /&gt;&lt;br /&gt;Per rispondere seriamente e onestamente alla domanda: "quanto costa" occorrerebbe applicare analisi statistiche da confermare con successivi ricicli ad ogni milestone del progetto, convincendo la controparte che - agli stadi iniziali - non si possono avere idee precise sui costi, e che darne una "spannometrica" equivale più o meno a mentire.&lt;br /&gt;&lt;br /&gt;Quando ero ancora un ragazzino, il mio datore di lavoro, che fu tra i primi in Italia a proporre soluzioni di Workflow, aveva un metodo infallibile per stimare il prezzo a cui vendere una soluzione software: "Vedi" mi diceva sorridendo "io cerco di capire quanti soldi il mio cliente ha nel portafoglio, e poi cerco di prenderglieli tutti".&lt;br /&gt;&lt;br /&gt;Benché tecnicamente ingiustificabile, e moralmente discutibile, questo approccio aveva se non altro il merito dell'onestà intellettuale.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4364592042964713187-6051398753773714799?l=alessiosaltarin.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/alessiosaltarin/~3/knpM4K04ETk/architettura-it-e-architettura-civile.html</link><author>noreply@blogger.com (Alessio Saltarin)</author><thr:total>1</thr:total><feedburner:origLink>http://alessiosaltarin.blogspot.com/2008/09/architettura-it-e-architettura-civile.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4364592042964713187.post-4137853099928474376</guid><pubDate>Thu, 11 Sep 2008 08:10:00 +0000</pubDate><atom:updated>2008-09-11T10:16:09.719+02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">costing</category><title>Il costo del prosciutto</title><description>In questi giorni mi sto occupando del processo di costing di un'iniziativa di upgrade tecnologico e SOA-enabling piuttosto complessa.&lt;br /&gt;&lt;br /&gt;Ci pensavo ieri sera, mentre andavo dal mio salumiere per un etto di prosciutto. Pensavo che se il processo di costing che adottiamo nell'industria del software dovesse essere applicato al prosciutto, molto probabilmente questo genere alimentare - di cui sono particolarmente appassionato - sparirebbe.&lt;br /&gt;&lt;br /&gt;Mi immaginavo già la scena mentre entravo nel piccolo salumierino del mio paese.&lt;br /&gt;Entro e saluto il ragazzo al banco. “Vorrei del prosciutto...” dico.&lt;br /&gt;“Ah, le chiamo subito il salumiere capo” - &lt;strong&gt;Project Management&lt;/strong&gt;, costo &lt;em&gt;2 euro&lt;/em&gt;.&lt;br /&gt;“Buonasera sig.Saltarin, cosa le va di mangiare stasera?” - &lt;strong&gt;Technical Proposal&lt;/strong&gt;, costo &lt;em&gt;1 euro&lt;/em&gt;.&lt;br /&gt;“Mah, pensavo a del prosciutto...”&lt;br /&gt;“Ma, mi scusi, del prosciutto cotto o del prosciutto crudo?” - &lt;strong&gt;Feasibility&lt;/strong&gt;, costo &lt;em&gt;2 euro&lt;/em&gt;.&lt;br /&gt;“Del crudo” e sorrido terrorizzato sapendo cosa mi aspetta.&lt;br /&gt;“Ah, guardi, ho del Parma dolcissimo, assaggi... assaggi!” - &lt;strong&gt;Proof Of Concept&lt;/strong&gt;, costo &lt;em&gt;2 euro&lt;/em&gt;.&lt;br /&gt;“Mmm, buono... va bene, lo prendo!”&lt;br /&gt;“Benissimo, sig. Saltarin! E lo vuole al fiocco, o all'osso?” - &lt;strong&gt;Functional Specification&lt;/strong&gt;, costo &lt;em&gt;3 euro&lt;/em&gt;.&lt;br /&gt;“Mah, non saprei... al fiocco?”&lt;br /&gt;“Chiamiamo il Mauro” - il Mauro è l'aiuto salumiere (&lt;em&gt;Development Team&lt;/em&gt;)&lt;br /&gt;“Ah, lo so io cosa vuole il Sig. Saltarin” dice il Mauro “un etto bello dolce vicino al fiocco” - &lt;strong&gt;Architectural Specification&lt;/strong&gt;, &lt;em&gt;3 euro&lt;/em&gt;.&lt;br /&gt;“Taglio?” Faccio di sì terrorizzato con la testa.&lt;br /&gt;E il Mauro taglia - &lt;strong&gt;Development&lt;/strong&gt;, &lt;em&gt;5 euro&lt;/em&gt; + &lt;strong&gt;1 etto di prosciutto crudo di Parma&lt;/strong&gt;, &lt;em&gt;2 euro&lt;/em&gt;.&lt;br /&gt;Le fette cadono sottilissime sulla carta da salumeria - &lt;strong&gt;Deployment&lt;/strong&gt;, &lt;em&gt;2 euro&lt;/em&gt;.&lt;br /&gt;“E mi faccia sapere se era buono!” - &lt;strong&gt;Testing&lt;/strong&gt;, &lt;em&gt;1 euro&lt;/em&gt;.&lt;br /&gt;“In tutto” dice il mio salumiere “fanno 23 euro, con lo sconto facciamo 20! Contento?”&lt;br /&gt;“Mah, tutto sommato forse, guardi, è meglio che vado in Pizzeria...”&lt;br /&gt;“Ma cosa fa, sig. Saltarin, si dà all'outsourcing?”&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4364592042964713187-4137853099928474376?l=alessiosaltarin.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/alessiosaltarin/~3/JQw8nV8UXbg/il-costo-del-prosciutto.html</link><author>noreply@blogger.com (Alessio Saltarin)</author><thr:total>0</thr:total><feedburner:origLink>http://alessiosaltarin.blogspot.com/2008/09/il-costo-del-prosciutto.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4364592042964713187.post-8781884926863240494</guid><pubDate>Mon, 31 Mar 2008 14:01:00 +0000</pubDate><atom:updated>2008-03-31T16:16:51.285+02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">flex</category><category domain="http://www.blogger.com/atom/ns#">XAML</category><category domain="http://www.blogger.com/atom/ns#">Silverlight</category><category domain="http://www.blogger.com/atom/ns#">air</category><category domain="http://www.blogger.com/atom/ns#">scala</category><category domain="http://www.blogger.com/atom/ns#">linguaggi</category><title>Scala e i suoi fratelli</title><description>Da qualche tempo guardo con interesse ai nuovi linguaggi che fanno la loro comparsa nel variegato orizzonte della programmazione dei computer. Tra gli altri, soprattutto &lt;a href="http://www.scala-lang.org/"&gt;Scala&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Giusto due note a proposito: che sono, lo sottolineo, del tutto soggettive.&lt;br /&gt;&lt;br /&gt;La prima: il paradigma della programmazione funzionale non soppiantera' il paradigma a oggetti. Infatti il successo della programmazione a oggetti deriva dal fatto che l'essere umano,normalmente, pensa per oggetti e relazioni tra oggetti, e non per funzioni. Tranne casi particolari (il matematico, il fisico) l'uomo non pensa a un problema in termini funzionali (e men che meno di funzione di funzione, o di funzione di funzione di funzione...)&lt;br /&gt;&lt;br /&gt;La seconda: dopo Java (e C#) il panorama dei linguaggi per computer e' abbastanza statico, e ho l'impressione che i nuovi venuti non portino significativo valore aggiunto. Ho l'impressione che oggi il focus si debba spostare dai linguaggi alle API. Il successo di Java, e poi del .NET Framework, si deve all'efficacia e all'ampiezza delle loro API piuttosto che delle specifiche tecniche del linguaggio. Francamente, al programmatore medio importa assai poco delle closures piuttosto che delle list comprehensions. Se invece riesce a creare un file e poi zipparlo in due linee di codice il discorso cambia...&lt;br /&gt;&lt;br /&gt;Inoltre, il sempre maggior peso della UI (sia lato desktop che lato Web, il che ho l'impressione che prossimamente sara' la stessa cosa...) privilegia quei linguaggi e piattaforme che permettono di realizzare facilmente le interfacce grafiche e di integrarle con la business logic dell'applicazione. &lt;br /&gt;&lt;br /&gt;In questo senso, il .NET Framework con il suo supporto a Silverlight attraverso &lt;a href="http://msdn2.microsoft.com/en-us/netframework/aa663326.aspx"&gt;XAML e il WPF&lt;/a&gt;, e dall'altra parte Adobe con &lt;a href="http://www.adobe.com/products/air/"&gt;AIR/Flex&lt;/a&gt; per Flash, siano i veri nuovi protagonisti della scena.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4364592042964713187-8781884926863240494?l=alessiosaltarin.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/alessiosaltarin/~3/jxXnveem1ts/scala-e-i-suoi-fratelli.html</link><author>noreply@blogger.com (Alessio Saltarin)</author><thr:total>0</thr:total><feedburner:origLink>http://alessiosaltarin.blogspot.com/2008/03/scala-e-i-suoi-fratelli.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4364592042964713187.post-5202243672487160574</guid><pubDate>Wed, 05 Mar 2008 09:19:00 +0000</pubDate><atom:updated>2008-03-05T11:30:38.670+01:00</atom:updated><title>Se starnazza come un'anatra...</title><description>... allora è un'anatra!&lt;br /&gt;&lt;br /&gt;No, non sono diventato un membro del club degli ammiratori di Massimo Catalano (ricordate "&lt;a href="http://www.105classics.net/supercult/QUELLIDELLANOTTE/why_view"&gt;Quelli della notte&lt;/a&gt;"?). E' solo un modo per esprimere un concetto che differenzia i linguaggi a oggetti di scripting da quelli compilati. I primi genericamente sono blandamente tipizzati, i secondi invece fortemente tipizzati. Questo impatta sul discorso delle interfacce che facevo in precedenza: nel primo caso (Ruby o Python, ad esempio) il fatto che io esprima un'interfaccia dei miei oggetti è solamente un aiuto che do a chi legge il mio programma: gli comunico esplicitamente come ho pensato il design a oggetti della mia soluzione. Nel secondo caso (Java o C#, ad esempio), senza un'interfaccia, il metodo polimorfico semplicemente non funziona.&lt;br /&gt;&lt;br /&gt;Nel secondo caso, per tornare alle anatre, bisogna dire al compilatore: guarda che ti sto passando un'anatra, comportati di conseguenza! Nel primo, all'interprete, non dico niente: se starnazza come un'anatra, allora è un'anatra. Punto e basta. &lt;br /&gt;&lt;br /&gt;Un esempio polimorfico in Java e in Ruby ci può aiutare a capire meglio. Cominciamo da un linguaggio fortemente tipizzato come Java:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;code lang="Java"&gt;&lt;br /&gt;package anatre;&lt;br /&gt;&lt;br /&gt;import java.util.ArrayList;&lt;br /&gt;import java.util.Collection;&lt;br /&gt;&lt;br /&gt;interface IGallinaceo&lt;br /&gt;{&lt;br /&gt; String starnazza();&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public class Anatra implements IGallinaceo&lt;br /&gt;{&lt;br /&gt; @Override&lt;br /&gt; public String starnazza()&lt;br /&gt; {&lt;br /&gt;  return "Sono un'anatra e starnazzo!";&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public class Oca implements IGallinaceo&lt;br /&gt;{&lt;br /&gt; @Override&lt;br /&gt; public String starnazza()&lt;br /&gt; {&lt;br /&gt;  return "Sono un'oca e starnazzo!";&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;public final class Cortile&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt; public static void main(String[] args)&lt;br /&gt; {&lt;br /&gt;  Collection&amp;lt;IGallinaceo&amp;gt; cortile = &lt;br /&gt;          new ArrayList&amp;lt;IGallinaceo&amp;gt;();&lt;br /&gt;  &lt;br /&gt;  cortile.add(new Anatra());&lt;br /&gt;  cortile.add(new Oca());&lt;br /&gt;  cortile.add(new Anatra());&lt;br /&gt;  &lt;br /&gt;  for (IGallinaceo gall : cortile)&lt;br /&gt;  {&lt;br /&gt;   System.out.println(gall.starnazza());&lt;br /&gt;  }&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Come si vede, le due classi &lt;span style="font-weight:bold;"&gt;Oca&lt;/span&gt;e &lt;span style="font-weight:bold;"&gt;Anatra&lt;/span&gt; implementano esplicitamente l'interfaccia IGallinaceo, cioè sono (IS-A) a tutti gli effetti dei Gallinacei e il compilatore lo sa a compile-time.&lt;br /&gt;&lt;br /&gt;Vediamo lo stesso esempio in Ruby.&lt;br /&gt;&lt;br /&gt;&lt;code lang="Ruby"&gt;&lt;pre&gt;&lt;br /&gt;class Oca&lt;br /&gt;    def starnazza&lt;br /&gt;        return "Sono un'oca e starnazzo";&lt;br /&gt;    end&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;class Anatra&lt;br /&gt;    def starnazza&lt;br /&gt;        return "Sono un'anatra e starnazzo"&lt;br /&gt;    end&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;cortile = Array.new&lt;br /&gt;cortile.push(Anatra.new)&lt;br /&gt;cortile.push(Oca.new)&lt;br /&gt;cortile.push(Anatra.new)&lt;br /&gt;&lt;br /&gt;for animale in cortile&lt;br /&gt;    puts(animale.starnazza)&lt;br /&gt;end&lt;br /&gt;&lt;/pre&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Qui semplicemente io passo una serie di classi al mio metodo polimorfico, e mi limito a richiamare il metodo "starnazza". Se facessi questa cosa in Java avrei un errore di compilazione! Invece, all'interprete Ruby non interessa che io "affermi" che un'Anatra è (IS-A) un Gallinaceo: se starnazza, allora lo è. Si fida! (Beato lui). E se gli passo un oggetto che non implementa "starnazza"? Be', semplicemente avrò un errore a run-time.&lt;br /&gt;&lt;br /&gt;Si tratta dunque di due filosofie diverse: nella prima, io devo dichiarare sempre la classe dell'oggetto passato a un metodo, nella seconda posso farne a meno. Non c'è chiaramente una soluzione migliore dell'altra: nel primo caso privilegio le performance, e nel secondo la flessibilità del design.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;(E se avete dei dubbi sul fatto che Oche e Anatre starnazzino, date un'occhiata &lt;a href="http://it.answers.yahoo.com/question/index?qid=20071209102045AAKk4Ko"&gt;qui&lt;/a&gt;!)&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4364592042964713187-5202243672487160574?l=alessiosaltarin.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/alessiosaltarin/~3/JN5XwX_Y4wY/se-starnazza-come-unanatra.html</link><author>noreply@blogger.com (Alessio Saltarin)</author><thr:total>1</thr:total><feedburner:origLink>http://alessiosaltarin.blogspot.com/2008/03/se-starnazza-come-unanatra.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4364592042964713187.post-4653998307348877267</guid><pubDate>Tue, 22 Jan 2008 13:12:00 +0000</pubDate><atom:updated>2008-01-22T14:25:08.835+01:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">ruby</category><category domain="http://www.blogger.com/atom/ns#">interfaccia</category><category domain="http://www.blogger.com/atom/ns#">mixin</category><title>Mixin come interfacce in Ruby</title><description>&lt;p&gt;Un utilizzo forse un po' anomalo dei &lt;a href="http://en.wikipedia.org/wiki/Mixin"&gt;mixin &lt;/a&gt;in &lt;a href="http://en.wikipedia.org/wiki/Ruby_programming_language"&gt;Ruby&lt;/a&gt; è quello di considerarli alla stregua di interfacce per implementare un comportamento polimorfico.&lt;/p&gt;Chi conosce almeno un linguaggio a oggetti puro (come Java o C#) sa che le interfacce sono dei contratti che il programmatore stipula con l'utilizzatore del suo codice sorgente per garantirgli che una classe "implementa" certi metodi, con certi parametri. Le interfacce sono alla base dell'utilizzo del polimorfismo nei linguaggi a oggetti compilati.&lt;br /&gt;&lt;p&gt;In genere nei linguaggi di scripting a oggetti, possiamo utilizzare il polimorfismo anche senza le interfacce, cioè ammettendo che, se l'oggetto passato al metodo polimorfico non implementa determinati metodi, avremo un errore a run-time.&lt;/p&gt;In realtà a volte può essere difficile se non impossibile, non avendo a disposizione ad esempio il commento di un certo codice sorgente, sapere se una certa classe è stata progettata per un utilizzo polimorfico.&lt;br /&gt;&lt;p&gt;Bene, grazie ai mixin, noi possiamo rendere esplicita la nostra intenzione di voler far implementare a una classe una determinata interfaccia, o, in altri termini, ad assicurare il programmatore che utilizzerà il nostro codice, che questo utilizza un certo modulo come interfaccia, quindi garantendo che i metodi in quel modulo saranno implementati.&lt;/p&gt;Ad esempio:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;br /&gt;module Animale&lt;br /&gt;  def mangio&lt;br /&gt;    puts "Sono un animale e mangio"&lt;br /&gt;  end&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;class Uccello&lt;br /&gt;  def volo&lt;br /&gt;    puts "Sono un uccello e volo"&lt;br /&gt;  end&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;class Gazzella &lt; Uccello&lt;br /&gt;  include Animale&lt;br /&gt;  &lt;br /&gt;  def mangio&lt;br /&gt;      puts "Sono una gazzella e mangio"&lt;br /&gt;  end&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;def metodopolimorfico(animale)&lt;br /&gt;    animale.mangio&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;metodopolimorfico(Gazzella.new)&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;In questo codice noi abbiamo una classe di &lt;i&gt;Gazzelle&lt;/i&gt; che eredita dalla classe base &lt;i&gt;Uccello&lt;/i&gt;. Qui il programmatore vuole dirci che &lt;i&gt;Gazzella&lt;/i&gt; è (IS-A) sì un &lt;i&gt;Uccello&lt;/i&gt;, ma è "anche" un &lt;i&gt;Animale&lt;/i&gt; (infatti implementa "mangio"). In questo modo il client-programmer che vuole sapere se potrà passare una "Gazzella" al suo metodo  "&lt;i&gt;metodopolimorfico&lt;/i&gt;" che prende in ingresso un "Animale" è assicurato: siccome Gazzella è un mixin di Animale, sicuramente rispetta l'interfaccia di Animale (che nel nostro caso è il metodo mangio).&lt;p&gt;Non solo: &lt;i&gt;Gazzella&lt;/i&gt; può fare l'override di un metodo incluso. Infatti lo fa, e "mangio" di Gazzella ha un'implementazione diversa da "mangio" di Animale. Chiaramente, poteva anche non farlo, mantenendo l'implementazione originale (e qui sta la differenza con le interfacce, che sono sempre astratte e vanno sempre e comunque implementate).&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4364592042964713187-4653998307348877267?l=alessiosaltarin.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/alessiosaltarin/~3/h0HSRUIC1lA/mixin-come-interfacce-in-ruby.html</link><author>noreply@blogger.com (Alessio Saltarin)</author><thr:total>1</thr:total><feedburner:origLink>http://alessiosaltarin.blogspot.com/2008/01/mixin-come-interfacce-in-ruby.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4364592042964713187.post-1996214633863360838</guid><pubDate>Sat, 19 Jan 2008 10:56:00 +0000</pubDate><atom:updated>2008-01-19T12:04:06.141+01:00</atom:updated><title>Nuovo anno, nuovo blog</title><description>Avevo cominciato con l'idea "peregrina" di tenere separato il blog diciamo così delle attività lavorative, che sarebbe questo, dal blog delle attività extra (ho scritto "letterarie" ma poi ho eliminato a furia di backspace), con il risultato che scrivo poco su quello e su questo.&lt;br /&gt;Comunque: il blog "altro" è qui: &lt;a href="http://guildenstern.splinder.com/"&gt;Fogli sparsi&lt;/a&gt;&lt;br /&gt;Ma quest'anno ho intenzione di fare un po' di casino e mescolare i due mondi (i tre mondi, dovrei dire: informatica, letteratura e poesia... aaargggh).&lt;br /&gt;Del resto, come dice Lucilla, lo scrittore e il poeta è morto da tempo, e ora possiamo dare vita a una campagna pubblicitaria ex post....&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4364592042964713187-1996214633863360838?l=alessiosaltarin.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/alessiosaltarin/~3/ZexsWdUAYrI/nuovo-anno-nuovo-blog.html</link><author>noreply@blogger.com (Alessio Saltarin)</author><thr:total>0</thr:total><feedburner:origLink>http://alessiosaltarin.blogspot.com/2008/01/nuovo-anno-nuovo-blog.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-4364592042964713187.post-7656487383730143809</guid><pubDate>Tue, 20 Mar 2007 09:32:00 +0000</pubDate><atom:updated>2007-03-20T10:34:54.651+01:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">ruby</category><category domain="http://www.blogger.com/atom/ns#">java</category><category domain="http://www.blogger.com/atom/ns#">closure</category><category domain="http://www.blogger.com/atom/ns#">python</category><category domain="http://www.blogger.com/atom/ns#">sinteticità</category><category domain="http://www.blogger.com/atom/ns#">espressività</category><category domain="http://www.blogger.com/atom/ns#">computer languages</category><category domain="http://www.blogger.com/atom/ns#">groovy</category><category domain="http://www.blogger.com/atom/ns#">scala</category><title>Espressività e sinteticità di un linguaggio</title><description>&lt;p&gt;La recente discussione su Artima che riguarda l'espressività e la sinteticità di un linguaggio (&lt;a href="http://www.artima.com/forums/flat.jsp?forum=276&amp;thread=198171"&gt;http://www.artima.com/forums/flat.jsp?forum=276&amp;amp;thread=198171&lt;/a&gt;) mi spinge a fare qualche altra riflessione, visto che sull'argomento avevo già speso in passato qualche parola.&lt;br /&gt;In questo forum si discute della sinteticità e dell'espressività di un linguaggio come sinonimi (e si sottolinea che non lo sono, o meglio, non è sempre detto che lo siano).&lt;br /&gt;Un linguaggio per computer è conciso quando permette di fare "tanto" con "poche" righe di codice. Prendete ad esempio questa classica ricetta in Python:&lt;/p&gt;&lt;p&gt;&lt;span style="font-size:78%;"&gt;&lt;span style="color:#000099;"&gt;thelist.sort()&lt;br /&gt;item_insert_point =  bisect.bisect(thelist, theitem)&lt;br /&gt;is_present = thelist[item_insert_point-1 : item_insert_point] == [theitem]&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;Questo codice permette di cercare un item all'interno di una lista ordinata usando un algoritmo di ricerca binario. Sfido chiunque a fare la stessa cosa, per esempio, in &lt;em&gt;Java&lt;/em&gt;, in 3 linee di codice. Dunque, Python è un linguaggio sintetico. (Il che significa spesso che ha delle API molto avanzate: in questo caso tutto il lavoro lo fa bisect).&lt;br /&gt;Eppure, il codice sopra è poco espressivo. Ho detto che per espressività in genere si intende la capacità di un linguaggio di essere:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;leggibile (cioé facilmente comprensibile a chi abbia una ragionevole dimestichezza con i linguaggi per computer)&lt;/li&gt;&lt;li&gt;potente (cioé possa esprimere un algoritmo in molti modi diversi)&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Sicuramente è poco leggibile - tranne che dai fan di Python! Però capiamoci, non è vero che Python (ma potrei dire &lt;a href="http://www.ruby-lang.org/en/"&gt;Ruby&lt;/a&gt; o &lt;a href="http://groovy.codehaus.org/"&gt;Groovy&lt;/a&gt; o qualsiasi altro linguaggio della scorsa generazione, cioé prima di Scala, per intenderci) sia poco espressivo. Al contrario, viene sempre indicato come un linguaggio super-espressivo (e ciascun programmatore in Python vi dirà che è contento di Python proprio perché permette di fare "tutto" con pochissimo sforzo).&lt;/p&gt;&lt;p&gt;&lt;br /&gt;Allora qual è il nocciolo della questione? E' che spesso si confonde l'espressività di un linguaggio con la sua capacità di offrire "zucchero sintattico" per fare le cose normali, senza però aggiungere veramente qualcosa di nuovo. La sinteticità, in fondo, è sempre "zucchero sintattico", a volte è solo un virtuosismo inutile. Perciò, l'espressività di un linguaggio non la misurerei in varianti sintattiche per fare la stessa cosa (esempio, contare da 1 a 1000), ma nella sua capacità di fare cose che altri linguaggi non sono in grado di fare (esempio, le closure di cui parlavamo). Con nuova espressività, un linguaggio è in grado di annoverare tra le sue API, delle API che in altri linguaggi non sono nemmeno immaginabili.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;Perché queste cose noiose sono così interessanti? Perché in realtà qui si gioca la nostra capacità di utilizzare i computer per fargli fare - senza perderci una vita - ciò che vogliamo: nuovi modi per lavorare, la possibilità di automatizzare alcuni compiti, o anche nuovi modi per divertirci, dalla comunicazione ai videogiochi. Linguaggi per computer più espressivi ci permetteranno di fare con loro - insieme all'evoluzione tecnologica dell'hardware - cose prima inimmaginabili.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4364592042964713187-7656487383730143809?l=alessiosaltarin.blogspot.com' alt='' /&gt;&lt;/div&gt;</description><link>http://feedproxy.google.com/~r/alessiosaltarin/~3/Fxwk5Ybzg_M/espressivit-e-sinteticit-di-un.html</link><author>noreply@blogger.com (Alessio Saltarin)</author><thr:total>0</thr:total><feedburner:origLink>http://alessiosaltarin.blogspot.com/2007/03/espressivit-e-sinteticit-di-un.html</feedburner:origLink></item></channel></rss>

