<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0">
 
 <title>Manuel Paccagnella</title>
 
 <link href="http://manuelp.github.com/" />
 <updated>2012-02-02T13:39:53-08:00</updated>
 <id>http://manuelp.github.com/</id>
 <author>
   <name>Manuel Paccagnella</name>
   <email>manuel.paccagnella@gmail.com</email>
 </author>

 
 <atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.feedburner.com/ManuelPaccagnella" /><feedburner:info uri="manuelpaccagnella" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><entry>
   <title>Come prolungare la vita delle batterie dei laptop</title>
   <link href="http://feedproxy.google.com/~r/ManuelPaccagnella/~3/nxwghVbbB4s/cura-batterie-laptop.html" />
   <updated>2011-03-28T00:00:00-07:00</updated>
   <id>http://manuelp.github.com/hardware,/laptop/2011/03/28/cura-batterie-laptop</id>
   <content type="html">&lt;p&gt;Ho da poco acquistato un nuovo portatile e voglio trattarlo bene, facendo durare la batteria il più a lungo possibile. Informandomi in giro ho incontrato molti &amp;#8220;boh&amp;#8221; e diverse risposte poco convincenti, così mi sono deciso a fare qualche ricerca in proposito (vedi &lt;em&gt;Riferimenti&lt;/em&gt;).&lt;/p&gt;

&lt;p&gt;Innanzitutto, il famoso &lt;a href='http://it.wikipedia.org/wiki/Accumulatore_di_carica_elettrica#Effetto_memoria'&gt;effetto memoria&lt;/a&gt; (secondo il quale ricaricando ripetutamente la batteria senza arrivare alla capacità massima questa &amp;#8220;ricorda&amp;#8221; questo livello energetico abbassandone a tutti gli effetti la capacità) riguarda le batterie al nickel-metalidrato (NiMH) e nickel-cadmio (NiCd) &lt;em&gt;che non sono più utilizzate nei portatili moderni&lt;/em&gt;. Ad oggi, tutti i dispositivi elettronici dotati di batteria come portatili, videocamere, IPod, etc sono alimentati da batterie aglio ioni di litio (Li-ion) che &lt;em&gt;non soffre di questo problema&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Quando si parla di durata della batteria, due sono i fattori chiave che determinano la durata della vita di una batteria: la &lt;em&gt;temperatura&lt;/em&gt; e la &lt;em&gt;carica&lt;/em&gt;.&lt;/p&gt;

&lt;h2 id='temperatura'&gt;Temperatura&lt;/h2&gt;

&lt;p&gt;Nel caso delle batterie Li-ion una temperatura troppo altra, specialmente se prolungata nel tempo, accorcia la vita delle batterie. Perciò ecco alcuni suggerimenti da tener presenti:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Assicurati che il dispositivo sia ben areato e non ci sia nulla ad ostruire la ventilazione. In particolare evita di appoggiare il portatile su materiali isolanti come coperte, cuscini e simili che ostacolano la circolazione dell&amp;#8217;aria e portano quindi al surriscaldamento.&lt;/li&gt;

&lt;li&gt;Evita di ricaricare la batteria mentre stai lavorando: la scheda video, il processore e l&amp;#8217;hard disk scaldano e la temperatura diminuisce la vita della batteria.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id='carica'&gt;Carica&lt;/h2&gt;

&lt;p&gt;Una batteria può essere ricaricata solo un numero limitato di volte, in genere tra le 300-1000 (il numero reale dipende da come la batteria è stata tenuta). Perciò è importante &lt;em&gt;trattarla bene&lt;/em&gt; e &lt;em&gt;non ricaricarla troppo spesso&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Qualche suggerimento:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Calibra la batteria ogni 30 cariche&lt;/strong&gt;. Calibrare significa scaricarla completamente e quindi ricaricarla.&lt;/li&gt;

&lt;li&gt;&lt;strong&gt;Non scaricarla completamente&lt;/strong&gt;. Come detto poco sopra le batterie agli ioni di litio non hanno effetto memoria, anzi &lt;em&gt;scaricare completamente una batteria ne accorcia la vita&lt;/em&gt; quindi è preferibile limitarsi a farlo solo per la calibrazione. &lt;em&gt;E&amp;#8217; perfettamente sicuro ricaricare la batteria anche se non è completamente scarica, meglio se intorno al 20% della capacità totale.&lt;/em&gt;&lt;/li&gt;

&lt;li&gt;&lt;strong&gt;Evita di caricarla completamente&lt;/strong&gt;. Le batterie caricate completamente, specialmente se sottoposte ad alte temperature, si deteriorano più in fretta. &lt;em&gt;Di norma è bene non superare l&amp;#8217;80% della capacità totale.&lt;/em&gt;&lt;/li&gt;

&lt;li&gt;&lt;strong&gt;Evita lavori intensivi durante la ricarica&lt;/strong&gt;. Anche scaricare la batteria troppo velocemente ne accorcia la vita.&lt;/li&gt;

&lt;li&gt;&lt;strong&gt;Evita di ricaricare.&lt;/strong&gt; Di norma i laptop cercano di ricaricare le batterie al 100% (il che non è un bene), e continuano a ricaricarle non appena scendono al di sotto di un certo livello per mantenerle completamente cariche. Per di più di solito un portatile connesso alla rete elettrica lavora in modalità performace la quale produce più calore.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id='conservare_la_batteria'&gt;Conservare la batteria&lt;/h2&gt;

&lt;p&gt;E&amp;#8217; bene &lt;em&gt;rimuovere la batteria se si lavora prevalentemente connessi alla rete elettrica&lt;/em&gt;. Bisogna però considerare che una batteria anche se non connessa continua a perdere lentamente la carica, che invece viene persa più velocemente se viene riposta al 100%. Perciò:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Riporre la batteria ad un livello di carica compreso tra il 40-60%&lt;/strong&gt;.&lt;/li&gt;

&lt;li&gt;&lt;strong&gt;Riponila in un posto freddo e asciutto, meglio se intorno ai 0°C.&lt;/strong&gt; Per esempio in un frigorifero, avvolta in della plastica.&lt;/li&gt;

&lt;li&gt;&lt;strong&gt;Ricalibra la batteria ogni 30 giorni circa.&lt;/strong&gt; Ma &lt;em&gt;farla tornare a temperatura ambiente prima di montarla&lt;/em&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id='in_breve'&gt;In breve&lt;/h2&gt;

&lt;p&gt;In breve, ecco cosa tenere presente per allungare la vita della propria batteria:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Assicurarsi che il laptop sia ben areato.&lt;/li&gt;

&lt;li&gt;Mantenere il livello di carica della batteria tra &lt;strong&gt;20-80%&lt;/strong&gt; della sua capacità massima, assicurandosi di non effettuare lavori intensivi durante la ricarica.&lt;/li&gt;

&lt;li&gt;Calibrare la batteria (ciclo completo di scarica-carica) ogni &lt;strong&gt;30 cariche&lt;/strong&gt;.&lt;/li&gt;

&lt;li&gt;Se si utilizza il portatile prevalentemente connessi alla rete elettrica, rimuovere la batteria e riporla in un posto freddo e asciutto ad una temperatura di &lt;strong&gt;0°C&lt;/strong&gt; ed un livello di carica tra il &lt;strong&gt;40-60%&lt;/strong&gt;. Calibrare la batteria ogni &lt;strong&gt;30 giorni&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id='riferimenti'&gt;Riferimenti&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href='http://4sysops.com/archives/how-to-take-care-of-your-laptop-battery-to-prolong-its-lifespan/'&gt;How to take care of your laptop battery to prolong its lifespan&lt;/a&gt;&lt;/li&gt;

&lt;li&gt;&lt;a href='http://4sysops.com/archives/how-to-charge-and-discharge-laptop-batteries-to-extend-their-lifetime/'&gt;How to charge and discharge laptop batteries to extend their lifetime&lt;/a&gt;&lt;/li&gt;

&lt;li&gt;&lt;a href='http://4sysops.com/archives/how-to-store-a-laptop-battery-properly-to-save-it-from-an-early-death/'&gt;How to store a laptop battery properly to save it from an early death&lt;/a&gt;&lt;/li&gt;

&lt;li&gt;&lt;span&gt;&lt;a href='http://thisweekinbatteries.blogspot.com/2010/02/pull-plug-your-battery-will-thank-you.html'&gt;TWiB: Pull the plug. Your battery will thank you.&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;

&lt;li&gt;&lt;a href='http://batteryuniversity.com/learn/article/how_to_prolong_lithium_based_batteries'&gt;How to prolong lithium-based batteries&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;img src="http://feeds.feedburner.com/~r/ManuelPaccagnella/~4/nxwghVbbB4s" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://manuelp.github.com/hardware,/laptop/2011/03/28/cura-batterie-laptop.html</feedburner:origLink></entry>
 
 <entry>
   <title>Discussione - Adozione dell'Agile</title>
   <link href="http://feedproxy.google.com/~r/ManuelPaccagnella/~3/blVFGhRG5EE/discussione-adozione-agile.html" />
   <updated>2009-11-09T00:00:00-08:00</updated>
   <id>http://manuelp.github.com/agile/2009/11/09/discussione-adozione-agile</id>
   <content type="html">&lt;p&gt;Di seguito riporto qualche appunto sull&amp;#8217;&lt;a href='http://www.infoq.com/articles/failed-agile-adoption-reasons'&gt;articolo&lt;/a&gt; &lt;em&gt;Why Agile Adoption Fails in Some Organizations&lt;/em&gt; apparso su InfoQ il 4 Novembre 2009.&lt;/p&gt;

&lt;p&gt;L&amp;#8217;agile presuppone che l&amp;#8217;organizzazione finanzi il &lt;em&gt;team&lt;/em&gt; e che lo sviluppo sia un&amp;#8217;attività continuativa e considerata come un &lt;em&gt;investimento&lt;/em&gt;. In questo contesto si riconosce l&amp;#8217;inevitabile inaccuratezza delle stime iniziali e si procede in modo iterativo e incrementale, accumulando esperienza e imparando a prevedere le tempistiche mano a mano che si avanza con lo sviluppo. In un team agile le stime sulle tempistiche hanno scarsa importanza e il team procede a produrre valore in modo continuativo, ma non si sa con precisione a priori quanto tempo ci vorrà per completarlo.&lt;/p&gt;

&lt;p&gt;In uno scenario diverso in cui l&amp;#8217;organizzazione finanzia separatamente i singoli &lt;em&gt;progetti&lt;/em&gt;, che sono visti come un &lt;em&gt;costo&lt;/em&gt;, il management richiede delle stime sui tempi e non è disposto a finanziarlo oltre i tempi preventivati. In questo contesto, a differenza del caso precedente, si hanno dei problemi se la stima iniziale non si rivela corretta e il management è costretto a una scelta:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Modificare i piani e riducendo lo &lt;em&gt;scope&lt;/em&gt; del progetto.&lt;/li&gt;

&lt;li&gt;Oppure ottenere un ROI negativo (il progetto va in perdita).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Le principali cause del fallimento nell&amp;#8217;adozione di uno stile agile di sviluppo possono essere riassunte nei seguenti punti:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;L&amp;#8217;Agile assume che l&amp;#8217;organizzazione voglia uno sforzo di sviluppo continuativo, non un progetto a breve termine. &lt;strong&gt;L&amp;#8217;agile presuppone un finanziamento a team, non a progetto.&lt;/strong&gt; In altre parole questo approccio presuppone che non ci siano vincoli di budget sul singolo progetto.&lt;/li&gt;

&lt;li&gt;L&amp;#8217;Agile è una metodologia che influenza sia il management che il processo di sviluppo: ci sono ripercussioni sia nelle pratiche adottate dal team, sia nella gestione (pianificazione e costi) del progetto stesso. &lt;strong&gt;Il management e il processo di sviluppo sono interrelati e qualsiasi metodologia influenza entrambi.&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Date queste considerazioni, i progetti a costo fisso sono chiaramente un contesto inadatto nel quale collocare l&amp;#8217;Agile. Spesso le aziende che ci provano finiscono per sovrapporre un façade agile su un progetto che in realtà è condotto in stile &lt;em&gt;Waterfall&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;In ultima analisi, &lt;strong&gt;se l&amp;#8217;organizzazione è in grado di finanziare un team di sviluppo in modo continuativo, allora l&amp;#8217;agile è un approccio vincente. Se invece i fondi sono allocati per progetto, un approccio più tradizionale è la scelta obbligata.&lt;/strong&gt;&lt;/p&gt;

&lt;h2 id='discussione'&gt;Discussione&lt;/h2&gt;

&lt;p&gt;Di seguito riassumo i contributi espressi nei commenti all&amp;#8217;articolo da alcuni lettori:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Si assume che un approccio waterfall abbia successo quasi automaticamente in un progetto a costo fisso, quando in realtà è vero l&amp;#8217;opposto. Con un cliente che sappia prioritizzare i propri requisiti efficacemente l&amp;#8217;agile è un approccio utilizzabile anche in quel caso.&lt;/li&gt;

&lt;li&gt;Occorre scegliere la metodologia di sviluppo in base ai requisiti e al contesto: &lt;em&gt;se i requisiti non sono chiari fin dall&amp;#8217;inizio e c&amp;#8217;è rischio importante che cambino, allora un approccio agile è quasi obbligatorio&lt;/em&gt;. Una volta scelto l&amp;#8217;approccio più adatto si sceglie la forma contrattuale consona. Le decisioni sulla conduzione del progetto vanno prese in modo pragmatico che rifletta le reali esigenze.&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;Perhaps we need to start asking, &amp;#8220;how much can we get for $X&amp;#8221; rather than stating, &amp;#8220;I want all this for $Y. Make that happen.&amp;#8221; &amp;#8211; Robert Dempsey&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ul&gt;
&lt;li&gt;I metodi agili hanno l&amp;#8217;obiettivo di massimizzare l&amp;#8217;efficienza, la produttività e il business value realizzato indipendentemente dal budget quindi sono ugualmente applicabili in un progetto a costo fisso. Inoltre, con l&amp;#8217;avanzare del progetto e specialmente con l&amp;#8217;acquisizione di competenze da parte del team diventa possibile stimare con sempre maggior precisione i tempi richiesti. Ovviamente, in un progetto a costo fisso è ancora più importante avere un team con esperienza e un cliente in grado di prioritizzare le features.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id='commenti_personali'&gt;Commenti personali&lt;/h2&gt;

&lt;p&gt;Innanzitutto l&amp;#8217;approccio agile (iterativo e incrementale) comporta importanti vantaggi per tutte le parti coinvolte (clienti, management, sviluppatori), ed è utile educarle &lt;em&gt;tutte&lt;/em&gt; sui suoi vantaggi.&lt;/p&gt;

&lt;p&gt;Inoltre, data la natura dell&amp;#8217;agile (focus su &lt;em&gt;efficienza&lt;/em&gt; e &lt;em&gt;qualità&lt;/em&gt;) è applicabile anche in un contesto a costo fisso secondo me. Però qualsiasi progetto a costo fisso comporta un rischio sostenibile solo in questi casi:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;I requisiti sono chiari fin dall&amp;#8217;inizio, sono immutabili e il team è composto da esperti che hanno già affrontato progetti nello stesso dominio applicativo. Solo in questo caso è possibile fare una stima ragionevolmente precisa e adottare un ciclo di vita di tipo sequenziale (&lt;em&gt;Waterfall&lt;/em&gt;) con un certo successo.&lt;/li&gt;

&lt;li&gt;Lo scope è variabile. In questo caso l&amp;#8217;approccio agile continua a essere il più conveniente.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id='scelta_pragmatica'&gt;Scelta pragmatica&lt;/h3&gt;

&lt;p&gt;La scelta della metodologia di sviluppo va fatta in modo pragmatico a seconda del contesto (progetto, dominio applicativo, cliente, team, ecc), non c&amp;#8217;è un approccio universalmente migliore (&lt;em&gt;Silver Bullet&lt;/em&gt;).&lt;/p&gt;

&lt;p&gt;La scelta va fatta anche in base ai parametri che si vuole ottimizzare: &lt;em&gt;costi, tempi, scope e qualità&lt;/em&gt;. E&amp;#8217; evidente che il fissare tutti questi parametri a priori è praticamente impossibile, allora occorre trovare la combinazione più conveniente per le parti in causa. Fissando la qualità come un parametro imprescindibile e considerando che costi e tempi sono strettamente connessi, individuo i seguenti casi interessanti:&lt;/p&gt;
&lt;table&gt;
    &lt;tr&gt;

        &lt;th&gt;Tempo&lt;/th&gt;
        &lt;th&gt;Costo&lt;/th&gt;
        &lt;th&gt;Scope&lt;/th&gt;
        &lt;th&gt;Commento&lt;/th&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
        &lt;td&gt;fisso&lt;/td&gt;

        &lt;td&gt;fisso&lt;/td&gt;
        &lt;td&gt;fisso&lt;/td&gt;
        &lt;td&gt;Praticamente impossibile.&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
        &lt;td&gt;fisso&lt;/td&gt;
        &lt;td&gt;fisso&lt;/td&gt;

        &lt;td&gt;variabile&lt;/td&gt;
        &lt;td&gt;Sicurezza sui costi ma scope variabile.&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
        &lt;td&gt;variabile&lt;/td&gt;
        &lt;td&gt;fisso&lt;/td&gt;
        &lt;td&gt;fisso&lt;/td&gt;

        &lt;td&gt;Alto rischio di ROI negativo.&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
        &lt;td&gt;variabile&lt;/td&gt;
        &lt;td&gt;variabile&lt;/td&gt;
        &lt;td&gt;fisso&lt;/td&gt;
        &lt;td&gt;Scenario ideale per l'applicazione dell'Agile.&lt;/td&gt;
    &lt;/tr&gt;

    &lt;tr&gt;
        &lt;td&gt;variabile&lt;/td&gt;
        &lt;td&gt;variabile&lt;/td&gt;
        &lt;td&gt;variabile&lt;/td&gt;
        &lt;td&gt;Efficiente con l'Agile.&lt;/td&gt;
    &lt;/tr&gt;
&lt;/table&gt;
&lt;blockquote&gt;
&lt;p&gt;Forse dobbiamo cominciare a domandare &amp;#8220;quanto posso avere per X$&amp;#8221; invece che affermare &amp;#8220;voglio tutto questo per X$. Fatelo.&amp;#8221; &amp;#8211;Robert Dempsey&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Alla luce di queste considerazioni, a meno che non si tratti di un progetto a requisiti completamente specificati e immutabili, e condotto da un team esperto nel dominio applicativo, &lt;strong&gt;conviene adottare un approccio agile negoziando la forma contrattuale più adatta.&lt;/strong&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/ManuelPaccagnella/~4/blVFGhRG5EE" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://manuelp.github.com/agile/2009/11/09/discussione-adozione-agile.html</feedburner:origLink></entry>
 
 <entry>
   <title>The Agile Coach</title>
   <link href="http://feedproxy.google.com/~r/ManuelPaccagnella/~3/2g1tYC4UdfY/the-agile-coach.html" />
   <updated>2009-11-06T00:00:00-08:00</updated>
   <id>http://manuelp.github.com/agile/2009/11/06/the-agile-coach</id>
   <content type="html">&lt;p&gt;Attualmente sto lavorando come una sorta di &amp;#8220;Agile Coach&amp;#8221; all&amp;#8217;interno di un&amp;#8217;azienda nell&amp;#8217;ambito di uno stage, e mi sono ritrovato a studiare molto materiale al riguardo. In questo post ho annotato i punti più importanti dal mio punto di vista leggendo l&amp;#8217;articolo &lt;em&gt;The Agile Coach&lt;/em&gt; sul numero di Novembre di &lt;a href="http://pragprog.com/magazines/download/5.pdf"&gt;PragPub&lt;/a&gt;.&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;Il compito dell&amp;#8217; &lt;i&gt;agile coach&lt;/i&gt; è quello di aiutare il team a incrementare le proprie performance e ottenere i benefici dei principi dell&amp;#8217;agile. Il modo in cui questo viene fatto è &lt;strong&gt;guidando il team ad essere più consapevole del proprio workflow e di modi più efficienti di collaborare&lt;/strong&gt;. Un buon coach deve essere in grado di insegnare come applicare le tecniche agili e di aiutare il team ad acquisirne competenza.&lt;/li&gt;
	&lt;li&gt;Il coach può essere anche un membro del team, ma le responsabilità nel progetto possono distrarlo dal suo compito (coaching del team). Perciò &lt;em&gt;un coach preferibilmente non ha un ruolo attivo nel progetto a cui lavora il suo team&lt;/em&gt;.&lt;/li&gt;
	&lt;li&gt;Le doti e i requisiti necessari per un &lt;em&gt;agile coach&lt;/em&gt; sono:
	&lt;ul&gt;
		&lt;li&gt;Passione per l&amp;#8217;Agile.&lt;/li&gt;
		&lt;li&gt;Esperienza nell&amp;#8217;applicarne le pratiche e i principi.&lt;/li&gt;
		&lt;li&gt;Abilità interpersonali: comunicazione, lavoro di squadra, ecc.&lt;/li&gt;
		&lt;li&gt;Abilità di problem-solving.&lt;/li&gt;
		&lt;li&gt;Pragmaticità.&lt;/li&gt;
		&lt;li&gt;Umiltà.&lt;/li&gt;
	&lt;/ul&gt;&lt;/li&gt;
	&lt;li&gt;L&amp;#8217;approccio di &lt;em&gt;planning&lt;/em&gt; conviene rimanga semplice: preferibilmente una lavagna fisica sul posto di lavoro. Per team distribuiti in genere usare fogli di calcolo e wiki è sufficiente, il software di &lt;strong&gt;&lt;span class="caps"&gt;ALM&lt;/span&gt;&lt;/strong&gt; (Agile Lifecycle Management) porta facilmente a piani iper-complicati. Su questo punto non sono molto d&amp;#8217;accordo: un buon software è essenzialmente una lavagna virtuale con molte funzionalità aggiuntive che permette di semplificare molto la gestione di un progetto al punto di potersi quasi &amp;#8220;dimenticare&amp;#8221; del planning. Comunque mi manca esperienza in questo, vedrò.&lt;/li&gt;
	&lt;li&gt;Avere il cliente spesso a disposizione è di essenziale importanza per il successo del progetto e uno dei compiti del coach è quello di aiutare a costruire una relazione stretta tra il team di sviluppo e il committente &lt;em&gt;creando un senso di impegno condiviso&lt;/em&gt;.&lt;/li&gt;
	&lt;li&gt;Se l&amp;#8217;organizzazione non è convinta e non è consapevole di cosa significhi veramente essere &lt;em&gt;agile&lt;/em&gt;, conviene cominciare con l&amp;#8217;educarla da questo.&lt;/li&gt;
	&lt;li&gt;E&amp;#8217; importante, come coach, supportare la transizione all&amp;#8217; &lt;i&gt;agile&lt;/i&gt; e &lt;strong&gt;incoraggiare un atteggiamento di sperimentazione e apprendimento continuo&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;&lt;img src="http://feeds.feedburner.com/~r/ManuelPaccagnella/~4/2g1tYC4UdfY" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://manuelp.github.com/agile/2009/11/06/the-agile-coach.html</feedburner:origLink></entry>
 
 <entry>
   <title>Wiki Creole mode for Emacs</title>
   <link href="http://feedproxy.google.com/~r/ManuelPaccagnella/~3/NkcMUGYce9M/wikicreole-mode-emacs.html" />
   <updated>2009-11-03T00:00:00-08:00</updated>
   <id>http://manuelp.github.com/emacs/2009/11/03/wikicreole-mode-emacs</id>
   <content type="html">&lt;p&gt;I needed a syntax highlighting support for the wiki &lt;a href='http://www.wikicreole.org/wiki/Creole1.0'&gt;Creole&lt;/a&gt; syntax in Emacs, but I couldn&amp;#8217;t find it anywhere&amp;#8230; until I found the &lt;a href='http://www.emacswiki.org/cgi-bin/wiki/menu-bar%2B.el/Search/AlexSchroeder/AlexSchroederConfigPyrobombus'&gt;dot.emacs&lt;/a&gt; configuration file of Alex Schroeder of &lt;a href='http://www.emacswiki.org'&gt;emacswiki&lt;/a&gt; fame, which contains a little wonderful elisp snippet that I show you (a little bit modified) here:&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='scheme'&gt;&lt;span class='c1'&gt;;; WikiCreole mode (wiki-mode)&lt;/span&gt;
&lt;span class='c1'&gt;;; Thanks to Alex Schroeder of www.emacswiki.org &lt;/span&gt;
&lt;span class='c1'&gt;;; And Jason Blevins for his inspiring Markdown Mode&lt;/span&gt;
&lt;span class='c1'&gt;;; http://jblevins.org/projects/markdown-mode/&lt;/span&gt;
&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nf'&gt;define-generic-mode&lt;/span&gt; &lt;span class='ss'&gt;&amp;#39;wiki-mode&lt;/span&gt; 
  &lt;span class='nv'&gt;nil&lt;/span&gt; &lt;span class='c1'&gt;; comments &lt;/span&gt;
  &lt;span class='nv'&gt;nil&lt;/span&gt;&lt;span class='c1'&gt;; keywords &lt;/span&gt;
  &lt;span class='o'&gt;&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;((&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;^\\(= \\)\\(.*?\\)\\($\\| =$\\)&amp;quot;&lt;/span&gt; &lt;span class='o'&gt;.&lt;/span&gt; &lt;span class='ss'&gt;&amp;#39;info-title-1&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;
    &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;^\\(== \\)\\(.*?\\)\\($\\| ==$\\)&amp;quot;&lt;/span&gt; &lt;span class='o'&gt;.&lt;/span&gt; &lt;span class='ss'&gt;&amp;#39;info-title-2&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;
    &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;^\\(=== \\)\\(.*?\\)\\($\\| ===$\\)&amp;quot;&lt;/span&gt; &lt;span class='o'&gt;.&lt;/span&gt; &lt;span class='ss'&gt;&amp;#39;info-title-3&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;
    &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;^\\(====+ \\)\\(.*?\\)\\($\\| ====+$\\)&amp;quot;&lt;/span&gt; &lt;span class='o'&gt;.&lt;/span&gt; &lt;span class='ss'&gt;&amp;#39;info-title-4&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; 
    &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;\\[\\[.*?\\]\\]&amp;quot;&lt;/span&gt; &lt;span class='o'&gt;.&lt;/span&gt; &lt;span class='ss'&gt;&amp;#39;link&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;
    &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;\\[.*\\]&amp;quot;&lt;/span&gt; &lt;span class='o'&gt;.&lt;/span&gt; &lt;span class='ss'&gt;&amp;#39;link&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;
    &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;\\[b\\].*?\\[/b\\]&amp;quot;&lt;/span&gt; &lt;span class='o'&gt;.&lt;/span&gt; &lt;span class='ss'&gt;&amp;#39;bold&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;
    &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;\\[i\\].*?\\[/i\\]&amp;quot;&lt;/span&gt; &lt;span class='o'&gt;.&lt;/span&gt; &lt;span class='ss'&gt;&amp;#39;italic&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;
    &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;\\*\\*.*?\\*\\*&amp;quot;&lt;/span&gt; &lt;span class='o'&gt;.&lt;/span&gt; &lt;span class='ss'&gt;&amp;#39;bold&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;
    &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;\\*.*?\\*&amp;quot;&lt;/span&gt; &lt;span class='o'&gt;.&lt;/span&gt; &lt;span class='ss'&gt;&amp;#39;bold&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;
    &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;\\_&amp;lt;//.*?//&amp;quot;&lt;/span&gt; &lt;span class='o'&gt;.&lt;/span&gt; &lt;span class='ss'&gt;&amp;#39;italic&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;
    &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;\\_&amp;lt;/.*?/&amp;quot;&lt;/span&gt; &lt;span class='o'&gt;.&lt;/span&gt; &lt;span class='ss'&gt;&amp;#39;italic&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;
    &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;__.*?__&amp;quot;&lt;/span&gt; &lt;span class='o'&gt;.&lt;/span&gt; &lt;span class='ss'&gt;&amp;#39;italic&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;
    &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;_.*?_&amp;quot;&lt;/span&gt; &lt;span class='o'&gt;.&lt;/span&gt; &lt;span class='ss'&gt;&amp;#39;underline&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;
    &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;|+=?&amp;quot;&lt;/span&gt; &lt;span class='o'&gt;.&lt;/span&gt; &lt;span class='nv'&gt;font-lock-string-face&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;
    &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;\\\\\\\\[ \t]+&amp;quot;&lt;/span&gt; &lt;span class='o'&gt;.&lt;/span&gt; &lt;span class='nv'&gt;font-lock-warning-face&lt;/span&gt;&lt;span class='p'&gt;))&lt;/span&gt; &lt;span class='c1'&gt;; font-lock list&lt;/span&gt;
  &lt;span class='o'&gt;&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;.wiki\\&amp;#39;&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;&lt;span class='c1'&gt;; auto-mode-alist&lt;/span&gt;
  &lt;span class='o'&gt;&amp;#39;&lt;/span&gt;&lt;span class='p'&gt;((&lt;/span&gt;&lt;span class='k'&gt;lambda &lt;/span&gt;&lt;span class='p'&gt;()&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nf'&gt;require&lt;/span&gt; &lt;span class='ss'&gt;&amp;#39;info&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='nf'&gt;require&lt;/span&gt; &lt;span class='ss'&gt;&amp;#39;goto-addr&lt;/span&gt;&lt;span class='p'&gt;)))&lt;/span&gt;&lt;span class='c1'&gt;; function-list&lt;/span&gt;
  &lt;span class='s'&gt;&amp;quot;Wiki stuff including Creole Markup and BBCode.&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;Just copy this snippet in your .emacs and any file &amp;#8220;*.wiki&amp;#8221; will be highlighted correctly. You can also enable this mode from within emacs by: &lt;em&gt;M-x wiki-mode&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;I&amp;#8217;ve adapted it a little bit and stealed some regexps from Jason&amp;#8217;s &lt;a href='http://jblevins.org/projects/markdown-mode/'&gt;markdown-mode&lt;/a&gt; for highligthing titles. But there is still something missing:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Highlighting of lists&lt;/li&gt;

&lt;li&gt;Support for images&lt;/li&gt;

&lt;li&gt;Better highlithing of external links&lt;/li&gt;

&lt;li&gt;Some functions for preview maybe?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Further versions of this mode will be updated here.&lt;/p&gt;

&lt;p&gt;Enjoy :)&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/ManuelPaccagnella/~4/NkcMUGYce9M" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://manuelp.github.com/emacs/2009/11/03/wikicreole-mode-emacs.html</feedburner:origLink></entry>
 
 <entry>
   <title>Come fare una presentazione</title>
   <link href="http://feedproxy.google.com/~r/ManuelPaccagnella/~3/M-0qwhXtSWk/come-fare-una-presentazione.html" />
   <updated>2009-11-03T00:00:00-08:00</updated>
   <id>http://manuelp.github.com/comunicazione/2009/11/03/come-fare-una-presentazione</id>
   <content type="html">&lt;p&gt;Con tutta probabilità sei già stato &lt;em&gt;vittima&lt;/em&gt; di presentazioni noiose e confusionarie, esposte da esperti in materia che nonostante tutti i tuoi eroici sforzi sono riusciti a farti addormentare&amp;#8230;. E questo non è necessariamente dovuto all&amp;#8217;oggetto dell&amp;#8217;esposizione, infatti persino gli argomenti più noiosi possono essere resi avvincenti e interessanti da un buon speaker.&lt;/p&gt;

&lt;p&gt;Fare una presentazione o insegnare in generale è molto di più che essere degli esperti nella materia. Occorrono delle competenze differenti per &lt;em&gt;presentare&lt;/em&gt; informazioni in modo corretto: &lt;strong&gt;si devono sviluppare le capacità di comunicazione.&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&amp;#8220;Presentation skills are worthy of extreme obsessive study.&amp;#8221; &amp;#8211;Tom Peters, Management guru&lt;/p&gt;
&lt;/blockquote&gt;

&lt;blockquote&gt;
&lt;p&gt;&amp;#8220;Presentation is the &amp;#8216;Killer Skill&amp;#8217; we take into the real world. It&amp;#8217;s almost an unfair advantage.&amp;#8221; &amp;#8211;The McKinsey Mind&lt;/p&gt;
&lt;/blockquote&gt;

&lt;blockquote&gt;
&lt;p&gt;Ottima presentazione = conoscenze + comunicazione&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2 id='sommario'&gt;Sommario&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Obiettivo delle presentazioni&lt;/li&gt;

&lt;li&gt;Sull&amp;#8217;uso delle slide&lt;/li&gt;

&lt;li&gt;Preparazione: Audience, Tema, Struttura, Pratica, Slide&lt;/li&gt;

&lt;li&gt;Delivery: Apertura, Talk (show), Chiusura&lt;/li&gt;

&lt;li&gt;Infrangere le regole&lt;/li&gt;

&lt;li&gt;Conclusioni&lt;/li&gt;

&lt;li&gt;Fonti&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id='obiettivo_delle_presentazioni'&gt;Obiettivo delle presentazioni&lt;/h2&gt;

&lt;p&gt;Prima di imbarcarsi in qualsiasi impresa, occorre conoscerne la &lt;em&gt;ragione&lt;/em&gt;. Lo stesso vale per una presentazione:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Qual&amp;#8217;è l&amp;#8217;obiettivo del talk?&lt;/li&gt;

&lt;li&gt;Che cosa voglio che il pubblico apprenda?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Troppo spesso invece si comincia subito a preparare l&amp;#8217;esposizione senza alcuna idea di partenza di dove si andrà a parare. &lt;strong&gt;Conoscere l&amp;#8217;obiettivo di una presentazione è indispensabile per esprimere con efficacia il messaggio principale e per preparare un discorso con un suo filo logico.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Ci sono ben poche cose più noiose di un elenco disordinato di fatti. Una vera presentazione non è un semplice elenco di dati, altrimenti sarebbe più conveniente scrivere un articolo. La ragion d&amp;#8217;essere delle presentazioni è il dialogo e l&amp;#8217;&lt;em&gt;interpretazione&lt;/em&gt; di tali dati. La gente è in grado di leggere, e il motivo per cui si scomoda ad assistere ad un talk è per conoscere il &lt;em&gt;significato&lt;/em&gt; e per vedere come questo possa &lt;em&gt;prendere vita&lt;/em&gt;. Se ci sono dei dati importanti (grafici, tabelle, fonti, ecc) può essere più conveniente scriverle in un documento apposito e renderlo disponibile agli interessati.&lt;/p&gt;

&lt;p&gt;Ma il primo e più importante valore che uno speaker &lt;em&gt;deve&lt;/em&gt; tenere sempre a mente è il &lt;strong&gt;rispetto&lt;/strong&gt;: rispetto per l&amp;#8217;audiece e per sè stessi. Troppo spesso invece gli speaker dimostrano un&amp;#8217;insensibilità totale verso il pubblico, esponendo gli argomenti in modo confuso, incomprensibile e noioso, e subissando gli ascoltatori con aridi e lunghi elenchi puntati nello sforzo di fare bella figura e dimostrare di &amp;#8220;sapere&amp;#8221;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The deepest human need is the need to be appreciated. (William James)&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;E&amp;#8217; essenziale riconoscere al pubblico il rispetto che merita il suo tempo e la sua attenzione, veicolando le informazioni in modo &lt;em&gt;conciso, chiaro e interessante&lt;/em&gt;.&lt;/strong&gt; Si deve essere disposti a sacrificare alcuni dettagli per presentare l&amp;#8217;argomento in modo corretto all&amp;#8217;audience. E&amp;#8217; questo l&amp;#8217;&lt;strong&gt;obiettivo&lt;/strong&gt; di ogni buona presentazione.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The presentation isn’t about you, it’s about your material.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Per avere un&amp;#8217;idea di come sono delle presentazione fatte &lt;em&gt;veramente&lt;/em&gt; bene:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Vedere su &lt;a href='http://www.youtube.com/'&gt;YouTube&lt;/a&gt; le presentazioni di: Seth Godin, Tom Peters, Guy Kawasaki, Steve Jobs e Dick Hardt.&lt;/li&gt;

&lt;li&gt;Guardare le presentazioni di alcuni dei &amp;#8220;maghi&amp;#8221; su &lt;a href='http://www.ted.com'&gt;TED.com&lt;/a&gt;, ad esempio: Rives, Hans Rosling, Barnett Thomas, Lawrence Lessig e Ken Robinson.&lt;/li&gt;

&lt;li&gt;Se si ha occasione, assistere a qualche talk di &lt;a href='http://damian.conway.org/'&gt;Damian Conway&lt;/a&gt;.&lt;/li&gt;

&lt;li&gt;Vai su &lt;a href='http://www.commoncraft.com/'&gt;Common Craft&lt;/a&gt; a dare un&amp;#8217;occhiata ai loro tutorial &amp;#8220;plain English&amp;#8221; sul Web 2.0&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id='sulluso_delle_slide'&gt;Sull&amp;#8217;uso delle slide&lt;/h2&gt;

&lt;p&gt;L&amp;#8217;uso di slide (lucidi) è diventato ormai sinonimo di presentazione in molti campi, tanto che la stragrande maggioranza si cimenta nel realizzare questi &lt;em&gt;ausili&lt;/em&gt; senza pensarci un istante. Il problema, soprattutto con slide contenenti molto materiale, è che ad un certo punto o la gente legge le slide e non segue più lo speaker (a quel punto converrebbe scrivere un semplice articolo), oppure ascolta lo speaker e non guarda nemmeno le slide (in questo caso non servono neppure).&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&amp;#8220;Replace Powerpoint with directness and enthusiasm.&amp;#8221;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Ripensando all&amp;#8217;obiettivo della presentazione e al contesto, occorre invece essere &lt;em&gt;pragmatici&lt;/em&gt; e riflettere sull&amp;#8217;utilità delle slide: &lt;strong&gt;il principale asset e contenuto di un talk è&amp;#8230; l&amp;#8217;esposizione di un&amp;#8217;argomento dal vivo e dalla voce dello speaker. Le slide sono sono un ausilio che può essere utile in alcuni casi.&lt;/strong&gt; L&amp;#8217;esposizione è qualcosa di dinamico, di vivo. Se il pubblico volesse leggere una lista di punti proiettati su uno schermo andrebbe semplicemente a leggersi un libro o un articolo su internet.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;PRIMA viene il discorso, DOPO (eventualmente) gli ausili visivi.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Alcuni realizzano delle slide per sentirsi più sicuri durante l&amp;#8217;esposizione, ma &lt;strong&gt;i lucidi non possono essere un sostituto per la conoscenza dell&amp;#8217;argomento che si presenta&lt;/strong&gt;. O lo si conosce o non lo si conosce. Usare le slide come &amp;#8220;stampelle&amp;#8221; è la ragione sbagliata per propinarle e una chiara indicazione del bisogno di fare più &lt;em&gt;pratica&lt;/em&gt;. &lt;strong&gt;Un argomento lo si conosce e lo si comprende veramente solo quando si è in grado di spiegarlo senza alcun ausilio&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Perciò se devi preparare una presentazione, poniti prima questa domanda: &lt;strong&gt;posso fare a meno delle slide?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Prima di tutto è necessario avere ben chiaro in mente:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;L&amp;#8217;obiettivo.&lt;/strong&gt;&lt;/li&gt;

&lt;li&gt;&lt;strong&gt;Il messaggio.&lt;/strong&gt;&lt;/li&gt;

&lt;li&gt;&lt;strong&gt;L&amp;#8217;audience.&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;L&amp;#8217;uso degli strumenti adatti viene di conseguenza.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&amp;#8220;Focus on your purpose, your message and your audience and you won’t go far wrong. Once you are clear on those, the details of tools and delivery will become apparent.&amp;#8221; &amp;#8211;Rowan Manahan&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Per un esempio di come è possibile fare una presentazione &lt;strong&gt;memorabile&lt;/strong&gt; senza usare &lt;em&gt;nessuna&lt;/em&gt; slide, vedere il talk di &lt;a href='http://www.ted.com/index.php/talks/ken_robinson_says_schools_kill_creativity.html'&gt;Sir Ken Robinson&lt;/a&gt;. Inoltre, per un uso creativo e molto visuale delle slide per sottolineare l&amp;#8217;esposizione vedere lo &lt;a href='http://presentationzen.blogs.com/presentationzen/2005/09/living_large_ta.html'&gt;stile Takahashi&lt;/a&gt; orginale e le sue variazioni che usano anche immagini, come ad esempio la presentazione di Kent Beck sul &lt;a href='http://www.infoq.com/presentations/responsive-design'&gt;Responsive Design&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Vediamo ora alcuni suggerimenti su come preparare e effettuare una buona presentazione.&lt;/p&gt;

&lt;h2 id='preparazione'&gt;Preparazione&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Il suggerimento più importante sulla preparazione di una presentazione è quello di &lt;em&gt;preparala lontano dal PC (e da PowerPoint).&lt;/em&gt; Una volta chiaro l&amp;#8217;obiettivo, esporre a voce alta in modalità &amp;#8220;freestyle&amp;#8221; provando vari approcci e annotando idee, frasi e pensieri importanti. Dopo aver steso l&amp;#8217;ossatura della presentazione, scriverla su carta (come minimo sotto forma di &lt;em&gt;outline&lt;/em&gt; o &lt;a href='http://en.wikipedia.org/wiki/Mind_map'&gt;mappa mentale&lt;/a&gt;).&lt;/strong&gt; Solo &lt;em&gt;dopo&lt;/em&gt; si può considerare se servono slide o meno.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Presentazione = discorso&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Un passo importante che molti non considerano è che un pezzo scritto prima di raggiungere la sua forma definitiva viene modificato molte volte. Lo stesso vale per i discorsi: &lt;strong&gt;per renderli concisi ma evocativi e memorabili è necessario scriverli e perfezionarli esercitandosi molto nell&amp;#8217;esposizione&lt;/strong&gt;. E&amp;#8217; così che i &lt;strong&gt;grandi&lt;/strong&gt; discorsi sono stati creati e hanno potuto esercitare un impatto enorme sulle generazioni a venire: vedi Martin Luther King, Lincoln, Ghandi&amp;#8230;&lt;/p&gt;

&lt;p&gt;Uno dei più grandi &amp;#8220;presentatori&amp;#8221; contemporanei, &lt;a href='http://damian.conway.org/'&gt;Damian Conway&lt;/a&gt;, raccomanda un &lt;em&gt;minimo di 10 ore di preparazione per ogni ora di presentazione&lt;/em&gt; (20 se l&amp;#8217;argomento è relativamente ostico). Questo ovviamente se si vuole fare un talk &lt;strong&gt;memorabile&lt;/strong&gt;&amp;#8230;&lt;/p&gt;

&lt;p&gt;E&amp;#8217; anche utile preparare almeno un piano di &lt;em&gt;backup&lt;/em&gt; per non essere colti impreparati dalle evenienze.&lt;/p&gt;

&lt;p&gt;Inoltre, tenere presente che il modo migliore di illustrare certi concetti è attraverso delle &lt;em&gt;dimostrazioni&lt;/em&gt;. Inserirne il più possibile.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Demonstrations beat descriptions.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3 id='audience'&gt;Audience&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Informarsi sull&amp;#8217;audience.&lt;/strong&gt; Quali sono i suoi interessi, lo stato d&amp;#8217;animo, &lt;em&gt;i bisogni e le aspettative&lt;/em&gt;?&lt;/li&gt;

&lt;li&gt;&lt;strong&gt;Quanto tempo si ha a disposizione?&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;E&amp;#8217; importante capire con chi si ha a che fare per veicolare il messaggio nel modo più efficace ed efficiente possibile. Vedere anche un mio precendente &lt;a href='http://manuelp.github.com/metaprogramming/2009/05/30/importanza-di-comunicare.html'&gt;post&lt;/a&gt;.&lt;/p&gt;

&lt;h3 id='tema'&gt;Tema&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Identificare la singola &lt;em&gt;idea chiave&lt;/em&gt; che si vuole comunicare con la presentazione e focalizzarsi su quella.&lt;/strong&gt; E&amp;#8217; più facile lasciare il segno quando il punto importante è uno piuttosto che una collezione di fatti blandamente correlati.&lt;/p&gt;

&lt;p&gt;L&amp;#8217;idea centrale costituisce il &lt;em&gt;tema&lt;/em&gt; della presentazione. Una volta identificato, raccogliere citazioni, aneddoti, fatti a supporto e organizzarli per costruire una storia attorno ad esso.&lt;/p&gt;

&lt;p&gt;Per talk più articolati, possono esserci più idee chiave che si vuole trasmettere, ma è bene non andare mai oltre le &lt;em&gt;3-5&lt;/em&gt;. Avere più di 5 messaggi principali rende difficile seguire il discorso e conservarne qualche memoria.&lt;/p&gt;

&lt;h3 id='struttura'&gt;Struttura&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;La presentazione deve avere una struttura &lt;em&gt;lineare&lt;/em&gt;, semplice, chiara e facile da seguire.&lt;/strong&gt; Qualunque sia la tipologia dell&amp;#8217;esposizione, la sequenza di elementi deve avere una struttura logica coerente.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&amp;#8220;Bad storytelling is beginning, muddle, end.&amp;#8221; &amp;#8211;Philip Larkin&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Gli esseri umani amano e trovano più semplice seguire ragionamenti &lt;em&gt;lineari&lt;/em&gt;, e tale deve essere la presentazione: &lt;strong&gt;una sequenza lineare, logica e concisa di dati, informazioni e aneddoti correlati.&lt;/strong&gt; Bisogna resistere alla tentazione di farcire il talk di dati per dimostrare la propria conoscenza (ma non il proprio rispetto). Quasi invariabilmente si è spinti a inserire &lt;em&gt;troppo&lt;/em&gt; materiale, conviene quindi distillare la presentazione in modo quasi &amp;#8220;brutale&amp;#8221; eliminando tutto quanto non è essenziale (il tempo è qualcosa di prezioso, non va sprecato).&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&amp;#8220;La semplicità è la sofisticazione ultima.&amp;#8221; &amp;#8211;Leonardo Da Vinci&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Aiuta avere buone doti di &lt;em&gt;storytelling&lt;/em&gt;, ma in ogni caso il talk deve avere un inizio, uno svolgimento (possibilmente che porta ad un &lt;em&gt;climax&lt;/em&gt;) e una conclusione che lasci il segno.&lt;/p&gt;

&lt;p&gt;Il workflow potrebbe essere:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Identificare i punti rilevanti per l&amp;#8217;audience.&lt;/li&gt;

&lt;li&gt;Metterli nell&amp;#8217;ordine più interessante per il pubblico.&lt;/li&gt;

&lt;li&gt;Fornire il contesto necessario.&lt;/li&gt;

&lt;li&gt;Arricchire con elementi di teatralità.&lt;/li&gt;

&lt;li&gt;&lt;strong&gt;Distillare ulteriormente&lt;/strong&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;blockquote&gt;
&lt;p&gt;La perfezione si raggiunge attraverso la quotidiana diminuzione, non aumento.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Per esempio, per una presentazione incentrata su una soluzione ad un problema:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Illustrare le cause del problema che affligge l&amp;#8217;audience.&lt;/li&gt;

&lt;li&gt;Mostrare perchè è serio.&lt;/li&gt;

&lt;li&gt;Proporre una soluzione.&lt;/li&gt;

&lt;li&gt;Sommario e &amp;#8220;chiamata alle armi&amp;#8221;, riassumendo chiaramente cosa bisogna fare.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;E&amp;#8217; molto utile illustrare questa struttura all&amp;#8217;inizio della presentazione per dare un&amp;#8217;idea di cosa tratterà il talk e come.&lt;/p&gt;

&lt;h3 id='pratica'&gt;Pratica&lt;/h3&gt;

&lt;p&gt;Una volta costruita la presentazione: &lt;strong&gt;fare pratica, pratica e ancora pratica. Preferibilmente ad alta voce&lt;/strong&gt;. Sperimentare spostando concetti, eliminando quelli superflui e modificando la presentazione in modo che &lt;em&gt;sia ben coesa e comunichi efficacemente l&amp;#8217;idea centrale&lt;/em&gt;. Possibilmente avendo qualcuno in carne ed ossa che ascolta e fornisce feedback. Inoltre &lt;em&gt;fare attenzione che si rientri nei tempi&lt;/em&gt;. E&amp;#8217; molto importante praticare la presentazione, per poi poterla esporre con sicurezza e padronanda davanti al pubblico. Non occorre memorizzare tutto il talk, basta ricordarsi i punti fondamentali, gli accessori verranno con naturalezza se si conosce bene la materia e si è fatta abbastanza pratica.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&amp;#8220;The only way to speak better is to speak.&amp;#8221; &amp;#8211;Damian Conway&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;La pratica è &lt;strong&gt;essenziale&lt;/strong&gt;, non basta preparare un discorso sulla carta. Come gli speaker esperti e gli attori ben sanno, lo scritto e il parlato sono due veicoli di espressione abbastanza diversi e ciò che è scritto spesso non ha lo stesso effetto quando viene letto ad alta voce. Lo stesso dicasi per l&amp;#8217;inverso. Il lavorare al discorso sia in forma scritta che parlata (e praticandolo) permette di chiarire il messaggio essenziale ed &amp;#8220;editarlo&amp;#8221; in modo da renderlo ad alto impatto.&lt;/p&gt;

&lt;h3 id='slide'&gt;Slide&lt;/h3&gt;

&lt;p&gt;Come descritto le slide &lt;strong&gt;non&lt;/strong&gt; sono indispensabili per una presentazione, ma se &lt;em&gt;dopo&lt;/em&gt; ever preparato il materiale si decide di utilizzarle, tanto vale renderle memoriabili.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&amp;#8220;Great content is a necessary condition, but not a sufficient one.&amp;#8221; &amp;#8211;Garr Reynolds&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Data la facilità disarmante nel realizzarne di irritanti e inutili, il modo migliore per rendere delle slide attraenti è essere consapevole che sono un &lt;em&gt;ausilio&lt;/em&gt;, uno &lt;em&gt;strumento&lt;/em&gt; il cui compito è quello di sottolineare ed enfatizzare i punti importanti, non di distrarre il pubblico costringendolo a leggere decine e decine di parole. Inquadrare le slide come uno strumento poi, permette di utilizzarle in modo &lt;em&gt;creativo&lt;/em&gt; per sorprendere, mantenere l&amp;#8217;attenzione e fissare i concetti.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&amp;#8220;Nothing in your slide should be superfluous, ever.&amp;#8221; &amp;#8211;Garr Reynolds&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Il criterio più importante da tenere a mente nella realizzazione di slide è: &lt;strong&gt;semplicità e stile&lt;/strong&gt;. Vedere come esempio le slide di: Apple, Bang &amp;amp; Olufsen, The Perl Journal, ecc.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&amp;#8220;Your slides, if you choose to use them, should not be textual orgies. Use visual shorthand.&amp;#8221; &amp;#8211;Chris Brogan&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Un grande errore compiuto da molti è quello di pensare alle slide come ad un documento a sè stante: così facendo però realizzano un documento in un formato adatto ad essere presentato su uno schermo, non dei lucidi. Ma semplicemente questo non è l&amp;#8217;uso per cui le slide sono state inventate e di certo non è quello migliore nel contesto di una presentazione. &lt;strong&gt;Le slide non sono la &lt;em&gt;presentazione&lt;/em&gt;, sono solo le &lt;em&gt;illustrazioni&lt;/em&gt;.&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Le slide NON SONO la presentazione.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;In quest&amp;#8217;ottica, &lt;strong&gt;impiegare poche parole ed eventualmente delle immagini significative&lt;/strong&gt;. L&amp;#8217;uso delle immagini delle slide ha un grande potere: rende possibile coinvolgere il pubblico anche emotivamente e ne stimola l&amp;#8217;immaginazione aiutando a mantenere desta l&amp;#8217;attenzione e migliorare la memoria di quello che viene detto.&lt;/p&gt;

&lt;p&gt;L&amp;#8217;approccio risulta ancora più potente se si scelgono immagini significative che rappresentano una &lt;em&gt;metafora&lt;/em&gt; (meglio se divertente) dei concetti presentati.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Un&amp;#8217;immagine vale più di mille parole.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Inoltre, &lt;em&gt;sorprendere&lt;/em&gt; l&amp;#8217;audience. E&amp;#8217; un altro modo per creare un&amp;#8217;esperienza emozionante che verrà ricordata.&lt;/p&gt;

&lt;h4 id='flusso_di_informazioni'&gt;Flusso di informazioni&lt;/h4&gt;

&lt;p&gt;Se si decide di utilizzare delle slide come ausilio, bisogna &lt;em&gt;controllare il flusso di informazioni&lt;/em&gt; in modo che il talk e i lucidi restino in sincrono.&lt;/p&gt;

&lt;p&gt;Quando ad esempio si vogliono elencare una serie di punti, il mostrarli tutti contemporaneamente in un&amp;#8217;unica slide mentre si parla, significa fare in modo che l&amp;#8217;audience li legga tutti e aspetti che vengano trattati cercando di collegare ciò che è scritto a ciò che viene detto. Questo a scapito dell&amp;#8217;attenzione. E&amp;#8217; più opportuno in questo caso mostrare un punto alla volta.&lt;/p&gt;

&lt;p&gt;Allo stesso modo, se si vuole presentare un grafico, per prima cosa occorre spiegare i dati e il significato prima di mostrarlo nella slide successiva, in modo che a quel punto gli ascoltatori siano in grado di interpretarlo subito. Tra l&amp;#8217;altro, il mostrare il grafico dopo averlo spiegato può aiutare anche a creare anticipazione e innalzare l&amp;#8217;interesse.&lt;/p&gt;

&lt;h4 id='design'&gt;Design&lt;/h4&gt;

&lt;p&gt;E&amp;#8217; importante che le slide siano leggibili e rispettino delle buone linee guida tipografiche. Se c&amp;#8217;è qualcosa di peggio di slide mal realizzate, sono slide mal realizzate &lt;em&gt;e&lt;/em&gt; illeggibili. Ecco le linee guida più importanti:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Semplicità e stile!&lt;/strong&gt;&lt;/li&gt;

&lt;li&gt;&lt;strong&gt;Attenzione al contrasto&lt;/strong&gt;: colori complementari. Sfondo chiaro, testo scuro. Sfondo scuro, testo chiaro. Chiaro?&lt;/li&gt;

&lt;li&gt;&lt;strong&gt;Allineare il testo a destra o a sinistra&lt;/strong&gt;: l&amp;#8217;allineamento centrale è poco professionale, amatoriale e meno leggibile.&lt;/li&gt;

&lt;li&gt;&lt;strong&gt;Andare all&amp;#8217;essenziale&lt;/strong&gt;: Un titolo, qualche punto e al massimo un&amp;#8217;immagine. Avere troppi elementi rende difficile &amp;#8220;decodificare&amp;#8221; la pagina ed è stressante. La cosa migliore è inserire poche parole con un font di dimensione molto grande.&lt;/li&gt;

&lt;li&gt;&lt;strong&gt;Usare font della famiglia Serif per il corpo&lt;/strong&gt;: sono i font che rendono meglio su schermo.&lt;/li&gt;

&lt;li&gt;&lt;strong&gt;Limitare l&amp;#8217;uso di font decorativi ai titoli e &lt;em&gt;solo&lt;/em&gt; se sono leggibili&lt;/strong&gt;.&lt;/li&gt;

&lt;li&gt;&lt;strong&gt;Evitare di inserire il logo in ogni slide&lt;/strong&gt;. Non si vuole dare l&amp;#8217;impressione di essere dei venditori.&lt;/li&gt;

&lt;li&gt;&lt;strong&gt;Limitare l&amp;#8217;uso di effetti di transizione&lt;/strong&gt;, possibilmente non usarne nessuno: distraggono e basta. Non essere esibizionista.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id='delivery'&gt;Delivery&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Presentare qualcosa è più di una semplice recitazione di fatti. Si tratta di una vera e propria &lt;em&gt;esibizione&lt;/em&gt; comprendente elementi teatrali e di drammaticità&lt;/strong&gt;. Bisogna imparare a comunicare con efficacia usando non solo le parole ma anche il linguaggio del corpo, il giusto ritmo, le emozioni, la consapevolezza dell&amp;#8217;audience e di come questi elementi li influenzino. &lt;strong&gt;Ogni presentazione è una performace finalizzata all&amp;#8217;intrattenere il pubblico in modo che al termine ne esca arricchito&lt;/strong&gt; (possibilmente di quello che si aspettava, meglio se di più).&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Entertaining always trumps informative.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Se possibile, arrivare prima dell&amp;#8217;inizio del talk e preparare tutto prima che il pubblico giunga in sala. Non è molto professionale armeggiare con il proiettore e il portatile mentre l&amp;#8217;audience aspetta&amp;#8230; &lt;strong&gt;Prepararsi per tempo in modo da essere pronti, sicuri che tutto funziona e (relativamente) rilassati quando arriva l&amp;#8217;ora di iniziare.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Una piccola nota: vestirsi in modo consono all&amp;#8217;occasione e all&amp;#8217;audience. Ovvio, ma meglio precisarlo&amp;#8230;&lt;/p&gt;

&lt;h3 id='apertura'&gt;Apertura&lt;/h3&gt;

&lt;p&gt;E&amp;#8217; normale essere un pò nervosi prima di cominciare un&amp;#8217;esposizione. Le cose importanti sono fare molta pratica e &lt;strong&gt;iniziare la presentazione con entusiasmo e sicurezza&lt;/strong&gt;. Ad esempio, per rompere il ghiaccio si può:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Porre una domanda.&lt;/li&gt;

&lt;li&gt;Sfidare l&amp;#8217;audience.&lt;/li&gt;

&lt;li&gt;Citare una persona famosa.&lt;/li&gt;

&lt;li&gt;Raccontare una storia divertente.&lt;/li&gt;

&lt;li&gt;Raccontare un fatto interessante.&lt;/li&gt;

&lt;li&gt;Proporre una visione grandiosa (e poi proporre come farla avverare)&lt;/li&gt;

&lt;li&gt;Proporre una visione spaventosa (e poi parlare di come &lt;em&gt;non&lt;/em&gt; farla realizzare)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In altre parole basta cominciare il talk con qualcosa di interessante che catturi l&amp;#8217;attenzione.&lt;/p&gt;

&lt;h3 id='talk_show'&gt;Talk (show)&lt;/h3&gt;

&lt;p&gt;Di seguito qualche suggerimento su come condurre al meglio la &lt;em&gt;performace&lt;/em&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Muoversi e guardare le persone negli occhi.&lt;/strong&gt; Usare il linguaggio del corpo per sottolineare certi punti è utile, ma senza esagerare: non è una prestazione sportiva!&lt;/li&gt;

&lt;li&gt;&lt;strong&gt;Non recitare i punti a memoria o peggio leggere le slide.&lt;/strong&gt; Bisogna avere rispetto per il tempo degli altri e dato che catturare l&amp;#8217;attenzione non è affatto semplice, una volta che la si ha va gestita correttamente. Si deve conoscere bene ciò che si presenta, e questo significa essere in grado di illustrarlo senza che siano &lt;em&gt;necessari&lt;/em&gt; ausili esterni.&lt;/li&gt;

&lt;li&gt;&lt;strong&gt;Usare un tono di voce chiaro, parlare lentamente e variare spesso il ritmo.&lt;/strong&gt; Bisogna parlare in modo da essere sentiti, chiaramente e ancora una volta portando rispetto verso il pubblico evitando di annoiarlo a morte con un tono di voce costante e noioso (soporiferio). Spesso i novizi durante i talk parlano troppo velocemente: rallentare deliberatamente. - &lt;strong&gt;Evitare i &amp;#8220;filler&amp;#8221;&lt;/strong&gt;, ovvero cose come: &amp;#8220;cioè, uhm, eh&amp;#8221; ecc. Denotano insicurezza.&lt;/li&gt;

&lt;li&gt;&lt;strong&gt;Raccontare una storia&lt;/strong&gt;. Anche se inventata, è utile per intrattenere e mantenere viva l&amp;#8217;attenzione. Ovviamente che sia in qualche modo rilevante all&amp;#8217;argomento oggetto della presentazione. Può essere utile anche mischiarla con delle &lt;em&gt;metafore&lt;/em&gt; utili ad illustrare certi concetti e relazioni. Inutile dire che l&amp;#8217;effetto è migliore se la storia è divertente.&lt;/li&gt;

&lt;li&gt;&lt;strong&gt;Usare la &lt;a href='http://it.wikipedia.org/wiki/Retorica'&gt;retorica&lt;/a&gt;&lt;/strong&gt; per essere &lt;em&gt;incisivi e memorabili&lt;/em&gt;. Praticare ad esempio con: contrasto, lista dei tre e soprattutto la &lt;em&gt;pausa&lt;/em&gt;. Fare una pausa prima di esporre un punto importante crea anticipazione e drammaticità: un momento teatrale che mantiene l&amp;#8217;attenzione.&lt;/li&gt;

&lt;li&gt;&lt;strong&gt;Se ci si dimentica qualcosa, andare avanti con la presentazione senza scusarsi o fermarsi per cercare di ricordare.&lt;/strong&gt; Se l&amp;#8217;esposizione veicola il &lt;em&gt;messaggio principale&lt;/em&gt;, allora è ok.&lt;/li&gt;

&lt;li&gt;&lt;strong&gt;Emozionare&lt;/strong&gt;. E&amp;#8217; uno dei modi principali e più efficaci per mantenere l&amp;#8217;attenzione e far arrivare i concetti a destinazione. Con un pò di pratica diventa facile visto che qualsiasi argomento può essere trattato dal punto di vista &lt;em&gt;umano&lt;/em&gt;.&lt;/li&gt;

&lt;li&gt;E&amp;#8217; utile anche raccontare aneddoti (soprattutto se personali), umorismo e storie. &lt;strong&gt;Un tocco personale può aiutare molto a rendere una presentazione autentica e interessante&lt;/strong&gt;.&lt;/li&gt;

&lt;li&gt;&lt;strong&gt;ENTUSIASMO!&lt;/strong&gt; L&amp;#8217;entusiasmo è contagioso. La presentazione deve essere colma di &lt;em&gt;passione&lt;/em&gt;, deve prendere vita e catturare l&amp;#8217;attenzione del pubblico facendo perdere al tempo il suo significato.&lt;/li&gt;

&lt;li&gt;&lt;strong&gt;Creare una sensazione di &lt;em&gt;intimità&lt;/em&gt; con il pubblico&lt;/strong&gt;: dare l&amp;#8217;impressione di essere lì per loro e di conoscerli trattandoli come amici. L&amp;#8217;atmosfera dovrebbe essere rilassata e amichevole.&lt;/li&gt;

&lt;li&gt;Eventualmente &lt;strong&gt;coinvolgere il pubblico&lt;/strong&gt; trasformando la presentazione in una discussione interattiva. Invitare a fare commenti e portare contributi personali. Chiaramente è possibile solo per chi conosce veramente quello di cui sta parlando ed è in grado di gestire una discussione, diversamente avrà paura di essere colto in fallo. Comunque tutto dipende dal pubblico e dalla natura dell&amp;#8217;argomento: non sempre l&amp;#8217;oggetto del talk si presta ad una discussione interattiva e a volte l&amp;#8217;audience preferisce non essere chiamata in causa.&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;&amp;#8220;Humans want to connect. They are built to want to belong. A great presentation is a fire to gather around and share an experience.&amp;#8221; &amp;#8211;Chris Brogan&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Per quanto riguarda le domande, è opportuno avere una &lt;em&gt;policy&lt;/em&gt; per dove, come e quando accettare domande da condividere con il pubblico. Se non si conosce qualche risposta si può reagire in modo diverso a seconda della situazione:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&amp;#8220;Non conosco la risposta mi dispiace.&amp;#8221;&lt;/li&gt;

&lt;li&gt;Redirigere la domanda a chi può avere la risposta.&lt;/li&gt;

&lt;li&gt;&amp;#8220;Ora non so risponderti, non appena conoscerò la risposta la scriverò sul mio blog.&amp;#8221;&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;Presentazione memorabile = informazioni + intrattenimento&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3 id='chiusura'&gt;Chiusura&lt;/h3&gt;

&lt;p&gt;E&amp;#8217; importante chiudere la presentazione con un sommario che ricapitola i punti principali e &lt;strong&gt;un&amp;#8217;ultima, chiara ripetizione del messaggio chiave&lt;/strong&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&amp;#8220;In the beginning, tell the audience what you&amp;#8217;re going to tell them. Then tell them, and be sure to leave time at the end to tell them what you told them. It sounds simple, but it works and they will appreciate it.&amp;#8221; &amp;#8211;Lehr, J.H&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Il pubblico deve avere la sensazione di aver ottenuto qualcosa dalla presentazione e deve avere delle informazioni &lt;em&gt;pronte all&amp;#8217;uso&lt;/em&gt;.&lt;/p&gt;

&lt;h2 id='infrangere_le_regole'&gt;Infrangere le regole&lt;/h2&gt;

&lt;p&gt;Tutto quello che ho illustrato sono consigli e linee guida, ma &lt;em&gt;tutte le regole possono essere infrante&lt;/em&gt; e a volte devono esserlo: le interazioni umane sono qualcosa di troppo complesso e dinamico da poter essere gestito da un insieme di regole ferree seguite senza usare la testa.&lt;/p&gt;

&lt;p&gt;Sia un principiante che un esperto possono non rispettarne qualcuna, la differenza sta nella &lt;em&gt;conoscenza&lt;/em&gt;: l&amp;#8217;esperto conosce le regole che infrange e sa spiegare il perchè lo fa, un principiante semplicemente no.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Per infrangere efficacemente le regole bisogna prima conoscerle.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2 id='conclusioni'&gt;Conclusioni&lt;/h2&gt;

&lt;p&gt;Ricapitoliamo i punti importanti:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Un buon discorso è &lt;em&gt;intrattenimento&lt;/em&gt; e informazioni. Bisogna imparare a comunicare.&lt;/li&gt;

&lt;li&gt;Per fare una buona presentazione è essenziale una estensiva &lt;em&gt;preparazione&lt;/em&gt; che va fatta lontano dal PC.&lt;/li&gt;

&lt;li&gt;Ogni presentazione deve presentare 1-5 idee chiave e organizzare un discorso lineare, logico e conciso attorno ad esse.&lt;/li&gt;

&lt;li&gt;Una presentazione è essenzialmente un discorso, le slide sono un accessorio non necessario. Se vengono realizzare, che siano fatte con semplicità e stile.&lt;/li&gt;

&lt;li&gt;Ogni presentazione deve essere un&amp;#8217;esibizione colma di &lt;em&gt;entusiasmo&lt;/em&gt; e in grado di appassionare l&amp;#8217;audience. Imparare ad esibirsi e a creare un&amp;#8217;atmosfera intima sono ingredienti fondamentali delle presentazioni memoriabili.&lt;/li&gt;

&lt;li&gt;All&amp;#8217;inizio anticipare quello di cui si parlerà e alla fine dell&amp;#8217;esposizione ricapitolare i messaggi importanti.&lt;/li&gt;

&lt;li&gt;Se possibile, dare precedenza alle dimostrazioni piuttosto che alle descrizioni.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id='approfondimenti'&gt;Approfondimenti&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href='http://www.garrreynolds.com/Presentation/index.html'&gt;Presentation Tips by Garr Reynolds&lt;/a&gt;&lt;/li&gt;

&lt;li&gt;&lt;a href='http://www.presentationzen.com/'&gt;Presentation Zen&lt;/a&gt;&lt;/li&gt;

&lt;li&gt;&lt;a href='http://www.lifehack.org/articles/communication/how-to-give-a-great-speech-part-1-preparation.html'&gt;How to give a great speech, Part 1: Preparation&lt;/a&gt;&lt;/li&gt;

&lt;li&gt;&lt;a href='http://www.lifehack.org/articles/communication/how-to-give-a-great-speech-part-2-delivery.html'&gt;How to give a great speech, Part 2: Delivery&lt;/a&gt;&lt;/li&gt;

&lt;li&gt;&lt;a href='http://www.lifehack.org/articles/communication/presentation-masterclass-part-1-introduction.html'&gt;Presentation Masterclass - Part 1: Introduction&lt;/a&gt;&lt;/li&gt;

&lt;li&gt;&lt;a href='http://www.lifehack.org/articles/communication/5-key-questions-when-planning-your-presentation-presentation-masterclass-part-2.html'&gt;Presentation Masterclass - Part 2: 5 Key Questions When Planning Your Presentation&lt;/a&gt;&lt;/li&gt;

&lt;li&gt;&lt;a href='http://www.lifehack.org/articles/communication/six-ways-to-transform-your-presentation.html'&gt;Six Ways To Transform Your Presentation&lt;/a&gt;&lt;/li&gt;

&lt;li&gt;&lt;a href='http://www.lifehack.org/articles/communication/4-effective-presentation-techniques.html'&gt;4 Effective Presentation Techniques&lt;/a&gt;&lt;/li&gt;

&lt;li&gt;&lt;a href='http://howto.lifehack.org/wiki/Presentation'&gt;Presentation HowTo&lt;/a&gt;&lt;/li&gt;

&lt;li&gt;&lt;a href='http://www.lifehack.org/articles/communication/present-like-a-rockstar.html'&gt;Present Like A Rockstar&lt;/a&gt;&lt;/li&gt;

&lt;li&gt;&lt;a href='http://www.lifehack.org/articles/lifehack/my-best-presentation-tricks.html'&gt;My Best Presentation Tricks&lt;/a&gt;&lt;/li&gt;

&lt;li&gt;&lt;a href='http://www.lifehack.org/articles/communication/18-tips-for-killer-presentations.html'&gt;18 Tips for Killer Presentations&lt;/a&gt;&lt;/li&gt;

&lt;li&gt;&lt;a href='http://www.lifehack.org/articles/technology/10-tips-for-more-effective-powerpoint-presentations.html'&gt;10 Tips for More Effective PowerPoint Presentations&lt;/a&gt;&lt;/li&gt;

&lt;li&gt;&lt;a href='http://headrush.typepad.com/creating_passionate_users/2006/07/a_few_more_pres.html'&gt;A few more Presentation How To&amp;#8217;s&lt;/a&gt;&lt;/li&gt;

&lt;li&gt;Lehr, J.H., 1985, &lt;a href='http://geology.wwu.edu/rjmitch/stoning.pdf' title='Let there be stoning!'&gt;Let there be stoning!&lt;/a&gt;, Ground Water, v. 23, no. 2, p. 162-165&lt;/li&gt;

&lt;li&gt;&lt;a href='http://www.canspice.org/2005/08/01/oscon-2005-the-conway-channel-first-half/'&gt;OSCON 2005: Presentation Aikido, Damian Conway, first half&lt;/a&gt;&lt;/li&gt;

&lt;li&gt;&lt;a href='http://www.canspice.org/2005/08/01/oscon-2005-presentation-aikido-damian-conway-second-half/'&gt;OSCON 2005: Presentation Aikido, Damian Conway, second half&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;img src="http://feeds.feedburner.com/~r/ManuelPaccagnella/~4/M-0qwhXtSWk" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://manuelp.github.com/comunicazione/2009/11/03/come-fare-una-presentazione.html</feedburner:origLink></entry>
 
 <entry>
   <title>User Stories Applied, capitolo 2</title>
   <link href="http://feedproxy.google.com/~r/ManuelPaccagnella/~3/VLydoD_o1lg/user-stories-applied-2.html" />
   <updated>2009-10-30T00:00:00-07:00</updated>
   <id>http://manuelp.github.com/agile/2009/10/30/user-stories-applied-2</id>
   <content type="html">&lt;p&gt;Continua l&amp;#8217;esplorazione della tecnica delle &lt;a href='http://en.wikipedia.org/wiki/User_story'&gt;user stories&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Per capire meglio che cosa sono le user stories bisogna capire cosa &lt;em&gt;non&lt;/em&gt; sono mettendole in contrasto con le altre tecniche di raccolta dei requisiti (use cases, specifiche dei requisiti software IEEE 830 e interactive design scenarios).&lt;/p&gt;

&lt;h2 id='ieee_830'&gt;IEEE 830&lt;/h2&gt;

&lt;p&gt;Lo standard IEEE 830 documenta un modo di esprimere le specifiche di un software, principalmente attraverso una gerarchia di requisiti nella forma &amp;#8221;&lt;em&gt;Il sistema dove&amp;#8230;&lt;/em&gt;&amp;#8221;. Un esempio:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;4-6) The system shall allow a room to be reserved with a credit card. 4-6-1) The system shall accept Visa, MasterCard and American Express cards. 4-6-2) The system shall charge the credit card the indicated rate for all nights of the stay before the reservation is confirmed. 4-6-3) The system shall give the user a unique confirmation number.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ul&gt;
&lt;li&gt;Specifiche a questo livello di dettaglio sono tediose, prone a errori e &lt;em&gt;molto costose in termini di tempo&lt;/em&gt;. Per sistemi di media grandezza non sono rari documenti di specifica di 300 pagine&amp;#8230; estremamente noiose. la conseguenza è che in realtà gli sviluppatori li guardano appena, ma senza leggerli approfonditamente.&lt;/li&gt;

&lt;li&gt;Documenti di questo tipo spingono a pensare ai dettagli implementativi ma &lt;strong&gt;rendono molto difficile avere una visione d&amp;#8217;insieme&lt;/strong&gt;.&lt;/li&gt;

&lt;li&gt;Non importa quanto impegno si mette nel documentare fin nei minimi particolari le caratteristiche del sistema. &lt;strong&gt;Non appena l&amp;#8217;utente ha di fronte il software, quasi invariabilmente avrà idee diverse (e migliori)&lt;/strong&gt;.&lt;/li&gt;

&lt;li&gt;Le specifiche in questa forma si concentrano sugli &lt;em&gt;attributi del sistema&lt;/em&gt; invece che sulle &lt;em&gt;esigenze dell&amp;#8217;utente&lt;/em&gt;. Si viene spinti a considerare il documento di specifica come una &amp;#8220;checklist&amp;#8221; delle cose da realizzare, e quindi a dichiarare terminato un progetto quando tutti questi requisiti sono soddisfatti. E quando l&amp;#8217;utente modifica le sue richieste, la cosa viene classificata come un cambiamento di &lt;em&gt;scope&lt;/em&gt;. In realtà &lt;strong&gt;un softwarè veramente terminato quando l&amp;#8217;utente è pienamente soddisfatto&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id='use_cases'&gt;Use cases&lt;/h2&gt;

&lt;p&gt;In generale uno use case è una descrizione generalizzata dell&amp;#8217;interazione tra il sistema e degli attori (che possono essere utenti o altri sistemi).&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Uno use case in forma estesa contiene dettagli su un&amp;#8217;interazione con in più dei &amp;#8220;percorsi alternativi&amp;#8221; che costituiscono degli &lt;em&gt;scenari&lt;/em&gt; alternativi, in genere per gestire errori. In realtà &lt;strong&gt;uno use case esteso è praticamente equivalente ad una storia con i relativi test di accettazione (che prevedono anche i casi alternativi)&lt;/strong&gt;. Ma&amp;#8230;&lt;/li&gt;

&lt;li&gt;Le principali differenze sono la &lt;em&gt;longevità&lt;/em&gt;, la &lt;em&gt;completezza&lt;/em&gt; e lo &lt;em&gt;scopo&lt;/em&gt;: mentre uno use case rappresenta un accordo tra l&amp;#8217;utente e il team di sviluppo fatto per essere valido e normativo (a volte gli use case vengono considerati obblighi contrattuali) per tutta la durata del progetto, una &lt;strong&gt;storia rappresenta una conversazione da intrattenere con il cliente e usualmente è utilizzato principalmente ai fini di planning (release, iterazioni)&lt;/strong&gt;.&lt;/li&gt;

&lt;li&gt;Gli use case, nella loro forma estesa, sono più soggetti ad essere utilizzati per contenere dettagli sull&amp;#8217;interfaccia utente. Il che è chiaramente un male vista la volatilità del design di quest&amp;#8217;ultima. Questo è un problema per cui Constantine e Lockwood hanno proposto una soluzione: &lt;em&gt;essential use cases&lt;/em&gt;, ovvero una forma di use case ridotta contenente solo: &lt;strong&gt;intenzioni dell&amp;#8217;utente&lt;/strong&gt; e &lt;strong&gt;responsabilità del sistema&lt;/strong&gt;, avvicinandoli molto alle storie.&lt;/li&gt;

&lt;li&gt;Vista la volatilità dei requisiti software, organizzare un contratto attorno a requisiti a questo livello di dettaglio non fa altro che creare difficoltà: &lt;strong&gt;spinge a realizzare il software che l&amp;#8217;utente ha chiesto, non quello di cui ha bisogno&lt;/strong&gt;, infatti l&amp;#8217;utente raramente ha le idee chiare fin dall&amp;#8217;inizio su quello che vuole.&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;No matter how much thinking, thinking and thinking we do we can never fully specify a non-trivial system upfront.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2 id='scenari_di_interazione'&gt;Scenari di interazione&lt;/h2&gt;

&lt;p&gt;Uno scenario è in pratica una &amp;#8220;storia&amp;#8221; (non nel senso di user story) contenente contesto, attori, obiettivi, azioni ed eventi. Si tratta di una descrizione in forma discorsiva di un&amp;#8217;interazione di attori umani in un particolare contesto che hanno determinati obiettivi.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Essendo una descrizione discorsiva e in forma di racconto, molti dettagli sono lasciati fuori percui è comunque necessaria una conversazione con il cliente per chiarirli.&lt;/li&gt;

&lt;li&gt;Un singolo scenario ha uno &lt;em&gt;scope&lt;/em&gt; decisamente maggiore di una storia, infatti da uno scenario tipico si possono ricavare diverse storie di solito.&lt;/li&gt;
&lt;/ul&gt;&lt;img src="http://feeds.feedburner.com/~r/ManuelPaccagnella/~4/VLydoD_o1lg" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://manuelp.github.com/agile/2009/10/30/user-stories-applied-2.html</feedburner:origLink></entry>
 
 <entry>
   <title>User Stories Applied, cap. 1</title>
   <link href="http://feedproxy.google.com/~r/ManuelPaccagnella/~3/1A9QTStT4N0/user-stories-applied-1.html" />
   <updated>2009-10-30T00:00:00-07:00</updated>
   <id>http://manuelp.github.com/agile/2009/10/30/user-stories-applied-1</id>
   <content type="html">&lt;p&gt;Inizio con questo post una tradizione alla &lt;a href='http://www.markhneedham.com/blog/tag/book-club/'&gt;Mark Needham&lt;/a&gt; nella quale i annoterò i punti salienti di libri, paper e presentazioni che mi ritroverò a visionare. Questo principalmente per il fatto che il modo migliore per imparare qualcosa (e sapere se lo si è capito realmente) è &lt;a href='http://www.markhneedham.com/blog/2009/04/21/learning-through-teaching/'&gt;insegnarlo&lt;/a&gt; a qualcun altro.&lt;/p&gt;

&lt;p&gt;Per esigenze di lavoro ho cominciato a documentarmi sul project management e alla raccolta di requisiti, principalmente in ambito Agile, e mi sono trovato in contatto con l&amp;#8217;idea delle &lt;em&gt;user stories&lt;/em&gt;. Il libro che mi sono procurato al riguardo e che sto leggendo attualmente è: &lt;em&gt;&amp;#8220;User Stories Applied&amp;#8221;&lt;/em&gt; di Mike Cohn.&lt;/p&gt;

&lt;p&gt;Cominciamo con il primo capitolo, intitolato &amp;#8220;Groundwork&amp;#8221;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Ciò che è espresso a parole può essere ambiguo e impreciso. Qualsiasi espressione scritta di requisiti lascerà &lt;em&gt;qualcosa&lt;/em&gt; di ambiguo o imprecisato. Basti pensare a frasi come: &lt;em&gt;&amp;#8220;Deve essere possibile inserire password di 127 caratteri.&amp;#8221;&lt;/em&gt; Che cosa vuol dire &lt;em&gt;possono&lt;/em&gt;? Significa che in certi casi non è necessario? E devono essere di 127 caratteri? Di più? E di meno? Scendendo sempre più nei particolari non migliora di molto la situazione, ci saranno sempre dei &amp;#8220;punti ciechi&amp;#8221; e dei particolari mancanti di cui ci si accorge solo durante lo svilupo. &lt;em&gt;L&amp;#8217;unica specifica veramente completa in ogni sua parte è il codice sorgente&lt;/em&gt;. Ma &lt;strong&gt;tutta questa confusione semplicemente scompare se si sposta il focus dallo scrivere i requisiti al parlarne&lt;/strong&gt;.&lt;/li&gt;

&lt;li&gt;Spesso i clienti che richiedono un certo software non hanno le idee chiare e &lt;em&gt;non possono&lt;/em&gt; fornire requisiti chiari, stabili e completi fin dall&amp;#8217;inizio. Di conseguenza anche se l&amp;#8217;analista funzionale è estremamente preciso e diligente nello stilare use case estremamente completi, tutto questo lavoro potrebbe rivelarsi comunque incompleto o semplicemente inesatto rispetto le &lt;em&gt;reali&lt;/em&gt; esigenze del committente. Una volta che il cliente ha qualcosa di funzionante sotto gli occhi sarà in posizione migliore di dire ciò di cui ha bisogno. &lt;strong&gt;Occorre evitare di fare il classico errore di realizzare ciò che il cliente chiede piuttosto che quello di cui ha bisogno.&lt;/strong&gt;&lt;/li&gt;

&lt;li&gt;Una &lt;strong&gt;user story&lt;/strong&gt; (storia utente) non è altro che una piccola funzionalità che ha valore per l&amp;#8217;utente finale. Tradizionalmente scritta su un cartoncino è una semplice frase che indica una funzionalità richiesta &lt;em&gt;dal punto di vista dell&amp;#8217;utente&lt;/em&gt; (quindi storie come &amp;#8220;Deve essere realizzato in Java&amp;#8221; &lt;em&gt;non è&lt;/em&gt; una storia), dovrebbero essere abbastanza piccole da poter essere implementate nel giro di mezza giornata o pochi giorni da uno o due sviluppatori.&lt;/li&gt;

&lt;li&gt;Quando una storia si rivela troppo grande (ad esempio &lt;em&gt;&amp;#8221;L&amp;#8217;utente deve poter effettuare una prenotazione&amp;#8221;&lt;/em&gt;), si definisce &lt;em&gt;Epic&lt;/em&gt; e viene suddivisa in due o più storie più piccole.&lt;/li&gt;

&lt;li&gt;&lt;strong&gt;Una storia, più che definire una funzionalità la rappresenta&lt;/strong&gt;. Il modo corretto di pensare alle user stories: è come dei &amp;#8220;promemoria&amp;#8221; di una conversazione da fare con l&amp;#8217;utente.&lt;/li&gt;

&lt;li&gt;E&amp;#8217; importante capire le &lt;em&gt;aspettative&lt;/em&gt; dell&amp;#8217;utente per ogni storia: annotare queste aspettative sotto forma di &lt;strong&gt;test di accettazione&lt;/strong&gt;. L&amp;#8217;obiettivo è stabilire dei criteri secondo i quali si potrà dichiarare una storia &amp;#8220;completa&amp;#8221;. Anche qui non si tratta di essere subito precisi e completi, la precisione verrà raggiunta quando sarà il momento.&lt;/li&gt;

&lt;li&gt;Secondo la definizione di Ron Jeffries, una storia è costituita da tre aspetti: &lt;strong&gt;Card, Conversation e Confirmation&lt;/strong&gt;. Ovvero, la forma fisica della storia (index card), la conversazione che rappresenta e i test di accettazione per sapere quando è completa.&lt;/li&gt;
&lt;/ul&gt;&lt;img src="http://feeds.feedburner.com/~r/ManuelPaccagnella/~4/1A9QTStT4N0" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://manuelp.github.com/agile/2009/10/30/user-stories-applied-1.html</feedburner:origLink></entry>
 
 <entry>
   <title>Behavioural-Driven Development</title>
   <link href="http://feedproxy.google.com/~r/ManuelPaccagnella/~3/cK8b-WPMfZc/behavioural-driven-development.html" />
   <updated>2009-08-30T00:00:00-07:00</updated>
   <id>http://manuelp.github.com/blog/2009/08/30/behavioural-driven-development</id>
   <content type="html">&lt;p&gt;Il &lt;em&gt;Behavioural Driven Development&lt;/em&gt; (&lt;a href='http://en.wikipedia.org/wiki/Behavior_Driven_Development' title='Behaviour Driven Development'&gt;BDD&lt;/a&gt;) è essenzialmente il &lt;a href='http://en.wikipedia.org/wiki/Test_Driven_Development' title='Test Driven Development'&gt;TDD&lt;/a&gt; fatto correttamente. Il problema è che troppo spesso il TDD è portato avanti in maniera scorretta, principalmente a causa dell&amp;#8217;eccessivo &lt;em&gt;focus&lt;/em&gt; sull&amp;#8217;aspetto di testing.&lt;/p&gt;

&lt;h2 id='perch_behaviourdriven'&gt;Perchè Behaviour-Driven?&lt;/h2&gt;

&lt;p&gt;Come &lt;a href='http://dannorth.net/introducing-bdd' title='Introducing BDD'&gt;illustrato&lt;/a&gt; da Dan North, il TDD è un&amp;#8217;ottimo stile di sviluppo ma è molto facile fraintenderlo focalizzandosi troppo sui test di unità creando un falso senso di sicurezza:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;That’s not to say that testing isn’t intrinsic to TDD – the resulting set of methods is an effective way of ensuring your code works. However, if the methods do not comprehensively describe the behaviour of your system, then they are lulling you into a false sense of security.&lt;br /&gt;&amp;#8211;Dan North&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Molte delle domande che possono sorgere nella mente di un principiante, ad esempio:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Che cosa devo testare?&lt;/li&gt;

&lt;li&gt;Come chiamo questo test?&lt;/li&gt;

&lt;li&gt;In che modo posso testare questa caratteristica?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Tutte queste domande, trovano &amp;#8220;magicamente&amp;#8221; una risposta quando si smette di pensare al &lt;em&gt;testing&lt;/em&gt; e ci si focalizza sul &lt;em&gt;comportamento&lt;/em&gt; che un sistema deve avere.&lt;/p&gt;

&lt;p&gt;Ecco quindi che il BDD si configura prima di tutto come un &amp;#8220;re-branding&amp;#8221; del TDD (portato avanti tra gli altri da &lt;a href='http://blog.daveastels.com/files/BDD_Intro.pdf' title='BDD Intro'&gt;Dave Astels&lt;/a&gt;) e un mutamento di prospettiva per far &amp;#8220;afferrare&amp;#8221; più facilmente il modo corretto di operare con questa metodologia.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;I found the shift from thinking in tests to thinking in behaviour so profound that I started to refer to TDD as BDD, or behaviour- driven development.&lt;br /&gt;&amp;#8211;Dan North&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Una conseguenza di questo approccio, è che non è più necessario nè raccomandato avere una classe di test per ogni classe di codice di produzione (ad esempio: &lt;em&gt;Queue&lt;/em&gt; e &lt;em&gt;QueueTest&lt;/em&gt;). Piuttosto di organizzare i &amp;#8220;test&amp;#8221; per classe interessata, si raggruppano le &amp;#8220;specifiche di comportamento&amp;#8221; in base alle &lt;em&gt;fixture&lt;/em&gt; (o contesti) nei quali si trovano ad operare.&lt;/p&gt;

&lt;h2 id='i_vantaggi'&gt;I Vantaggi&lt;/h2&gt;

&lt;p&gt;Enfatizzare il comportamento sul testing provoca un mutamento nel modo di pensare e produce alcuni vantaggi:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Si parte dai &lt;em&gt;requisiti&lt;/em&gt;, dalle features da implementare invece che dalle singole classi. Si adotta quindi un approccio top-down che guida la progettazione in base alle caratteristiche richieste. Come conseguenza si aderisce naturalmente al principio &lt;a href='http://en.wikipedia.org/wiki/You_Ain%27t_Gonna_Need_It' title='You Aren'&gt;YAGNI&lt;/a&gt;.&lt;/li&gt;

&lt;li&gt;Si sottolinea l&amp;#8217;aspetto di &lt;em&gt;design&lt;/em&gt;&lt;/li&gt;

&lt;li&gt;Si ottengono delle &lt;strong&gt;specifiche&lt;/strong&gt; che hanno il vantaggio di essere &lt;em&gt;eseguibili&lt;/em&gt;, e che quindi possono essere fatte girare contro la base di codice per verificarne l&amp;#8217;aderenza ai requisiti fissati (ecco il testing)&lt;/li&gt;

&lt;li&gt;Permettono lo sviluppo di un &lt;a href='http://www.c2.com/cgi/wiki?UbiquitousLanguage' title='Ubiquitous Language'&gt;ubiquitous language&lt;/a&gt; (ovvero di un linguaggio comune tra gli sviluppatori, la parte business e il cliente), integrandosi con il &lt;a href='http://en.wikipedia.org/wiki/Domain-driven_design' title='Domain Driven Design'&gt;DDD&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Inoltre, seguendo la metodologia BDD si ottengono sia delle specifiche eseguibili (test funzionali e di sistema) sia dei test di unità (applicando la verifica del &lt;em&gt;comportamento&lt;/em&gt; alle singole classi).&lt;/p&gt;

&lt;h2 id='strumenti'&gt;Strumenti&lt;/h2&gt;

&lt;p&gt;Trattandosi di TDD &amp;#8220;fatto come si deve&amp;#8221;, è possibile utilizzare qualsiasi libreria che supporti il testing come l&amp;#8217;onnipresente xUnit.&lt;/p&gt;

&lt;p&gt;Tuttavia, sono stati sviluppati dei framework che incorporano in concetti del BDD sostituendo ad esempio le parole &amp;#8220;test&amp;#8221; con &amp;#8220;behaviour&amp;#8221; o &amp;#8220;specification&amp;#8221; ad esempio, e fornendo molte altre caratteristiche interessanti come &lt;a href='http://en.wikipedia.org/wiki/Domain-specific_language'&gt;DSL&lt;/a&gt; appositamente sviluppati (ad esempio usando groovy in &lt;a href='http://www.easyb.org/'&gt;easyb&lt;/a&gt;) o &lt;a href='http://martinfowler.com/bliki/FluentInterface.html'&gt;interfacce fluide&lt;/a&gt; (popolarizzate dal pioniere &lt;a href='http://rspec.info/'&gt;RSpec&lt;/a&gt;), e integrazione di librerie per il &lt;a href='http://en.wikipedia.org/wiki/Mock_object'&gt;mocking&lt;/a&gt; come &lt;a href='http://www.jmock.org/'&gt;JMock&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Per Java, ho trovato questi framework più o meno utilizzabili:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href='http://jbehave.org/'&gt;JBehave2&lt;/a&gt;: dal &amp;#8220;fondatore&amp;#8221; stesso del BDD&lt;/li&gt;

&lt;li&gt;&lt;a href='http://code.google.com/p/instinct/'&gt;Instinct&lt;/a&gt;&lt;/li&gt;

&lt;li&gt;&lt;a href='http://www.jdave.org/'&gt;JDave&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Sono tutti costruiti al di sopra di JUnit 4, possono quindi di essere fatti girare in un qualunque IDE (oltre che da CLI o Ant ovviamente).&lt;/p&gt;

&lt;h2 id='esperienza_personale'&gt;Esperienza personale&lt;/h2&gt;

&lt;p&gt;Nel progetto di ingegneria del software a cui ho lavorato abbiamo utilizzato estensivamente l&amp;#8217;approccio TDD, rispettando molto il rapporto 1-1 tra classi di test e di codice di produzione.&lt;/p&gt;

&lt;p&gt;Non c&amp;#8217;è stato molto focus sul comportamento del sistema nel suo insieme, e nemmeno nei test di integrazione e di sistema. Fortunatamente abbiamo fatto uno studio approfondito e un&amp;#8217;attenta progettazione durante tutto il processo di sviluppo, facendo attenzione a modularizzare il più possibile (il TDD ha aiutato in questo senso) quindi l&amp;#8217;integrazione non è stato un problema molto grave.&lt;/p&gt;

&lt;p&gt;Probabilmente però, se fossimo partiti dal principio creando delle &lt;em&gt;specifiche&lt;/em&gt;, e usandole per guidare lo sviluppo distribuendo la progettazione lungo il processo e realizzando il prodotto &lt;em&gt;feature-per-feature&lt;/em&gt; creando una versione/demo rilasciabile dopo ogni iterazione, sarebbe stato molto meglio.&lt;/p&gt;

&lt;h2 id='update_26102009'&gt;Update (26/10/2009)&lt;/h2&gt;

&lt;p&gt;Un paio di articolo di Naresh Jain chiariscono molto bene gli effetti e il significato del BDD:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href='http://blogs.agilefaqs.com/2009/10/26/goodbye-simplicity-im-object-obsessed/'&gt;Goodbye Simplicity: I&amp;#8217;m Object Obsessed&lt;/a&gt;&lt;/li&gt;

&lt;li&gt;&lt;a href='http://blogs.agilefaqs.com/2009/06/15/there-is-no-spoon-objects/'&gt;There is No Spoon&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;img src="http://feeds.feedburner.com/~r/ManuelPaccagnella/~4/cK8b-WPMfZc" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://manuelp.github.com/blog/2009/08/30/behavioural-driven-development.html</feedburner:origLink></entry>
 
 <entry>
   <title>Automazione!</title>
   <link href="http://feedproxy.google.com/~r/ManuelPaccagnella/~3/43TGbh1wuNo/automazione.html" />
   <updated>2009-08-06T00:00:00-07:00</updated>
   <id>http://manuelp.github.com/metaprogramming/2009/08/06/automazione</id>
   <content type="html">&lt;p&gt;Una cosa risaputa è che un buon programmatore deve essere &lt;em&gt;pigro&lt;/em&gt;. Ma di una pigrizia particolare: &lt;em&gt;perchè svolgere a mano ogni compito ripetitivo che può essere svolto altrettanto bene e molto più velocemente da una macchina?&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Nella mia situazione, complice anche il fatto che sto imparando &lt;a href='http://ruby-lang.org/it/'&gt;Ruby&lt;/a&gt;, ho automatizzato diverse cose. In particolare, scrivo su un altro &lt;a href='http://viasenzanome.wordpress.com/'&gt;blog&lt;/a&gt; di sviluppo personale e per un certo periodo ho avuto un dominio apposito con un blog servito dal software &lt;a href='http://www.s9y.org/' title='Serendipity Weblog System'&gt;Serendipity&lt;/a&gt; che dopo un anno di attività ho chiuso per ritornare a wordpress.&lt;/p&gt;

&lt;p&gt;Purtroppo (mea culpa) non avevo effettuato il backup del vecchio blog se non tramite uno &amp;#8220;snapshot&amp;#8221; del sito, quindi mi sono ritrovato con circa un&amp;#8217;ottantina di post sotto forma di file html che volevo importare su wordpress. Inutile dire che farlo a mano sarebbe stata un&amp;#8217;impresa non da poco&amp;#8230;&lt;/p&gt;

&lt;p&gt;Così in un paio di giorni (e un paio di tentativi) ho implementato un programmino di tipo &lt;em&gt;scraper&lt;/em&gt; che per ogni post salvato sotto forma di file html, ne estrae: post, titolo, data di pubblicazione e commenti con relative date, nomi ed eventuali link. Il tutto ripulendo il risultato da blocchi non necessari.&lt;/p&gt;

&lt;p&gt;Con il primo tentativo ho usato estensivamente le espressioni regolari per identificare ed estrarre le aree desiderate, ma si è rivelato un compito abbastanza lungo e anche se alla fine funzionava per alcuni post c&amp;#8217;erano dei problemi. Mi serviva una libreria che fosse a conoscenza dell&amp;#8217;html e mi consentisse di farne il parsing.&lt;/p&gt;

&lt;p&gt;Con il secondo tentativo, ho utilizzato una stupenda libreria che mi ha permesso di selezionare esattamente i contenuti desiderati e anche di effettuare modifiche: &lt;a href='http://wiki.github.com/why/hpricot' title='hpricot'&gt;hpricot&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Risultato: una quindicina di minuti circa per postare sul blog originale circa 80 post con la data corretta e tutti i commenti!&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/ManuelPaccagnella/~4/43TGbh1wuNo" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://manuelp.github.com/metaprogramming/2009/08/06/automazione.html</feedburner:origLink></entry>
 
 <entry>
   <title>Overloading in Ruby</title>
   <link href="http://feedproxy.google.com/~r/ManuelPaccagnella/~3/MQX2NPzkXJ4/overloading-in-ruby.html" />
   <updated>2009-08-01T00:00:00-07:00</updated>
   <id>http://manuelp.github.com/ruby/2009/08/01/overloading-in-ruby</id>
   <content type="html">&lt;p&gt;A differenza di linguaggi come Java e C++, Ruby &lt;em&gt;non supporta direttamente l&amp;#8217;overloading di metodi e costruttori&lt;/em&gt;. Il che è abbastanza grave quando si dimostra necessario disporre di più costruttori con un numero diverso di argomenti.&lt;/p&gt;

&lt;p&gt;Una soluzione in certi casi potrebbe essere quella di usare un design-pattern come il &lt;em&gt;factory method&lt;/em&gt;. In tutti gli altri, fortunatamente, è abbastanza semplice emulare l&amp;#8217;overloading grazie al supporto di ruby alle liste di argomenti di lunghezza variabile.&lt;/p&gt;

&lt;p&gt;Un esempio, tratto da &lt;a href='http://rubylearning.com/satishtalim/ruby_overloading_methods.html'&gt;rubylearning&lt;/a&gt; per chiarire il concetto:&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='ruby'&gt;&lt;span class='c1'&gt;# The Rectangle constructor accepts arguments in either  &lt;/span&gt;
&lt;span class='c1'&gt;# of the following forms:  &lt;/span&gt;
&lt;span class='c1'&gt;#   Rectangle.new([x_top, y_left], length, width)  &lt;/span&gt;
&lt;span class='c1'&gt;#   Rectangle.new([x_top, y_left], [x_bottom, y_right])  &lt;/span&gt;
&lt;span class='k'&gt;class&lt;/span&gt; &lt;span class='nc'&gt;Rectangle&lt;/span&gt;
  &lt;span class='k'&gt;def&lt;/span&gt; &lt;span class='nf'&gt;initialize&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='o'&gt;*&lt;/span&gt;&lt;span class='n'&gt;args&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;
    &lt;span class='k'&gt;if&lt;/span&gt; &lt;span class='n'&gt;args&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='n'&gt;size&lt;/span&gt; &lt;span class='o'&gt;&amp;lt;&lt;/span&gt; &lt;span class='mi'&gt;2&lt;/span&gt;  &lt;span class='o'&gt;||&lt;/span&gt; &lt;span class='n'&gt;args&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='n'&gt;size&lt;/span&gt; &lt;span class='o'&gt;&amp;gt;&lt;/span&gt; &lt;span class='mi'&gt;3&lt;/span&gt;  
      &lt;span class='c1'&gt;# modify this to raise exception, later  &lt;/span&gt;
      &lt;span class='nb'&gt;puts&lt;/span&gt; &lt;span class='s1'&gt;&amp;#39;This method takes either 2 or 3 arguments&amp;#39;&lt;/span&gt;  
    &lt;span class='k'&gt;else&lt;/span&gt;  
      &lt;span class='k'&gt;if&lt;/span&gt; &lt;span class='n'&gt;args&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='n'&gt;size&lt;/span&gt; &lt;span class='o'&gt;==&lt;/span&gt; &lt;span class='mi'&gt;2&lt;/span&gt;  
        &lt;span class='nb'&gt;puts&lt;/span&gt; &lt;span class='s1'&gt;&amp;#39;Two arguments&amp;#39;&lt;/span&gt;  
      &lt;span class='k'&gt;else&lt;/span&gt;  
        &lt;span class='nb'&gt;puts&lt;/span&gt; &lt;span class='s1'&gt;&amp;#39;Three arguments&amp;#39;&lt;/span&gt;  
      &lt;span class='k'&gt;end&lt;/span&gt;  
    &lt;span class='k'&gt;end&lt;/span&gt;  
  &lt;span class='k'&gt;end&lt;/span&gt;
&lt;span class='k'&gt;end&lt;/span&gt;

&lt;span class='no'&gt;Rectangle&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='n'&gt;new&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='o'&gt;[&lt;/span&gt;&lt;span class='mi'&gt;10&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='mi'&gt;23&lt;/span&gt;&lt;span class='o'&gt;]&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='mi'&gt;4&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='mi'&gt;10&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;
&lt;span class='no'&gt;Rectangle&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='n'&gt;new&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='o'&gt;[&lt;/span&gt;&lt;span class='mi'&gt;10&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='mi'&gt;23&lt;/span&gt;&lt;span class='o'&gt;]&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='o'&gt;[&lt;/span&gt;&lt;span class='mi'&gt;14&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='mi'&gt;13&lt;/span&gt;&lt;span class='o'&gt;]&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ManuelPaccagnella/~4/MQX2NPzkXJ4" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://manuelp.github.com/ruby/2009/08/01/overloading-in-ruby.html</feedburner:origLink></entry>
 
 <entry>
   <title>Integrazione Continua</title>
   <link href="http://feedproxy.google.com/~r/ManuelPaccagnella/~3/jIFZb6MY7U4/integrazione-continua.html" />
   <updated>2009-07-27T00:00:00-07:00</updated>
   <id>http://manuelp.github.com/development/2009/07/27/integrazione-continua</id>
   <content type="html">&lt;p&gt;Terminato oggi un progetto di dimensioni importanti (con ottimi risultati), è tempo di fare una retrospettiva.&lt;/p&gt;

&lt;p&gt;Nel nostro team abbiamo implementato uno stile di sviluppo &lt;a href='http://en.wikipedia.org/wiki/Test-driven_development' title='Test-Driven Development'&gt;test-driven&lt;/a&gt;, ma non abbiamo predisposto alcun server di build automatizzato. In principio, anche se interessante, sembrava ridondante&amp;#8230; Abbiamo ugualmente portato a termine il progetto, ma se avessimo utilizzato una soluzione di questo tipo, avremmo avuto una serie di vantaggi:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Enforcing dell&amp;#8217;approccio test-driven&lt;/strong&gt;: nonostante fosse stato stabilito di scrivere i test prima e per ogni funzionalità, in qualche caso non si è rispettata questa decisione. Probabilmente un sistema che compilasse i sorgenti a ogni &lt;em&gt;commit&lt;/em&gt;, che facesse girare tutti i test &lt;strong&gt;automaticamente&lt;/strong&gt; e inviasse un&amp;#8217;email a tutti in caso di errori sarebbe stato un aiuto in questo senso.&lt;/li&gt;

&lt;li&gt;&lt;strong&gt;Pacchettizzazione&lt;/strong&gt;: come ambiente di sviluppo abbiamo utilizzato &lt;a href='http://www.eclipse.org/' title='Eclipse SDK'&gt;Eclipse&lt;/a&gt;, che assolve egregiamente i suoi compiti compilando automaticamente i sorgenti ad ogni modifica (segnalando eventuali errori di compilazione) e fornendo un&amp;#8217;interfaccia a &lt;a href='http://www.junit.org/' title='JUnit'&gt;JUnit&lt;/a&gt; per i test. Ma non abbiamo tenuto conto della pacchettizzazione del prodotto finito (&amp;#8220;lo faremo alla fine quando sarà ora&amp;#8221;). Chiaramente alla fine è stato fatto, ma se avessimo avuto un ciclo di vita &lt;em&gt;evolutivo&lt;/em&gt; con un buon numero di piccole iterazioni e un server di build che si sarebbe occupato di creare una versione pacchettizzata pronta per essere distribuita &lt;em&gt;ad ogni commit&lt;/em&gt;, la vita sarebbe stata molto più semplice. &lt;em&gt;Se il deployment è continuo, è facile attuarlo. Se non lo è, allora probabilmente ci sono brutte sorprese all&amp;#8217;orizzonte&amp;#8230;&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;La lezione è stata imparata.&lt;/p&gt;

&lt;h2 id='update_09082009'&gt;Update: 09/08/2009&lt;/h2&gt;

&lt;p&gt;Per approfondire il discorso sull&amp;#8217;integrazione continua, è &lt;em&gt;illuminante&lt;/em&gt; l&amp;#8217;&lt;a href='http://www.martinfowler.com/articles/continuousIntegration.html'&gt;articolo&lt;/a&gt; di Martin Fowler.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/ManuelPaccagnella/~4/jIFZb6MY7U4" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://manuelp.github.com/development/2009/07/27/integrazione-continua.html</feedburner:origLink></entry>
 
 <entry>
   <title>Ruby - code blocks, coroutines e closures</title>
   <link href="http://feedproxy.google.com/~r/ManuelPaccagnella/~3/7QYlDrH5d_I/ruby-codeblocks-coruotines-closures.html" />
   <updated>2009-07-11T00:00:00-07:00</updated>
   <id>http://manuelp.github.com/development/2009/07/11/ruby-codeblocks-coruotines-closures</id>
   <content type="html">&lt;p&gt;Ruby si ispira abbastanza al Perl (purtroppo, l&amp;#8217;ho usato un po&amp;#8217; ma non mi è mai piaciuto come linguaggio), ma nonostante questo mi sono sforzato di andare avanti a studiarlo. Uno è in grado di giudicare le potenzialità di un linguaggio solo conoscendolo e avendolo utilizzato, questo vale specialmente per quei linguaggi che forniscono &lt;em&gt;features&lt;/em&gt; che non si conoscono e che richiedono un modo di pensare diverso.&lt;/p&gt;

&lt;p&gt;Bisogna respingere la sensazione di &amp;#8220;scomodità&amp;#8221; che si prova all&amp;#8217;inizio ed entrare nell&amp;#8217;ottica giusta prima di poterne apprezzare le potenzialità ed esprimere un giudizio informato e non basato unicamente su simpatie/antipatie.&lt;/p&gt;

&lt;h1 id='un_linguaggio_molto_dolce'&gt;Un linguaggio molto dolce&lt;/h1&gt;

&lt;p&gt;Ruby, a differenza di Python e similmente al Perl, fornisce una gran quantità di &lt;em&gt;zucchero sintattico&lt;/em&gt; che porta ad avere più modi diversi per fare una stessa cosa. Infatti molti &amp;#8220;entusiasti&amp;#8221; del linguaggio parlano spesso di come imparino sempre nuovi modi più eleganti, concisi ed espressivi per esprimere certi concetti (e questo, almeno nel caso del Perl, spesso a discapito della leggibilità).&lt;/p&gt;

&lt;p&gt;Non so ancora se sia una cosa positiva o meno, su questo sospendo il giudizio in attesa di acquisire una conoscenza più approfondita.&lt;/p&gt;

&lt;h1 id='coroutines_e_codeblocks'&gt;Coroutines e code-blocks&lt;/h1&gt;

&lt;p&gt;Un paio di features interessanti che fornisce Ruby sono le &lt;em&gt;coroutines&lt;/em&gt; e i &lt;em&gt;code-blocks&lt;/em&gt;, che permettono (tra le altre cose) di implementare in maniera molto concisa ed espressiva degli iteratori e dei &amp;#8220;blocchi di codice&amp;#8221; da eseguire sotto un controllo transazionale.&lt;/p&gt;

&lt;p&gt;In un linguaggio &amp;#8220;tradizionale&amp;#8221; come Java, per iterare sugli elementi di una classe collezione si può procede ad esempio così:&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='java'&gt;&lt;span class='n'&gt;ArrayList&lt;/span&gt;&lt;span class='o'&gt;&amp;lt;&lt;/span&gt;&lt;span class='kt'&gt;int&lt;/span&gt;&lt;span class='o'&gt;&amp;gt;&lt;/span&gt; &lt;span class='n'&gt;lista&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='k'&gt;new&lt;/span&gt; &lt;span class='n'&gt;ArrayList&lt;/span&gt;&lt;span class='o'&gt;&amp;lt;&lt;/span&gt;&lt;span class='kt'&gt;int&lt;/span&gt;&lt;span class='o'&gt;&amp;gt;();&lt;/span&gt;
&lt;span class='c1'&gt;// ...&lt;/span&gt;
&lt;span class='k'&gt;for&lt;/span&gt; &lt;span class='o'&gt;(&lt;/span&gt;&lt;span class='kt'&gt;int&lt;/span&gt; &lt;span class='n'&gt;i&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='mi'&gt;0&lt;/span&gt;&lt;span class='o'&gt;;&lt;/span&gt; &lt;span class='n'&gt;i&lt;/span&gt; &lt;span class='o'&gt;&amp;lt;&lt;/span&gt; &lt;span class='n'&gt;lista&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='na'&gt;size&lt;/span&gt;&lt;span class='o'&gt;();&lt;/span&gt; &lt;span class='n'&gt;i&lt;/span&gt;&lt;span class='o'&gt;++)&lt;/span&gt; &lt;span class='o'&gt;{&lt;/span&gt;
	&lt;span class='n'&gt;System&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='na'&gt;out&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='na'&gt;println&lt;/span&gt;&lt;span class='o'&gt;(&lt;/span&gt;&lt;span class='n'&gt;lista&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='na'&gt;get&lt;/span&gt;&lt;span class='o'&gt;(&lt;/span&gt;&lt;span class='n'&gt;i&lt;/span&gt;&lt;span class='o'&gt;)&lt;/span&gt; &lt;span class='o'&gt;+&lt;/span&gt; &lt;span class='s'&gt;&amp;quot; &amp;quot;&lt;/span&gt;&lt;span class='o'&gt;);&lt;/span&gt;
&lt;span class='o'&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;Questo modo di iterare su una collezione è familiare a chi è abituato ad usare linguaggi come C++, Java o anche Python.&lt;/p&gt;

&lt;p&gt;Ruby, attraverso l&amp;#8217;uso dei &lt;em&gt;code-blocks&lt;/em&gt;, permette di iterare in modo diverso:&lt;/p&gt;

&lt;p&gt;&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='ruby'&gt;&lt;span class='vi'&gt;@lista&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='o'&gt;[&lt;/span&gt;&lt;span class='mi'&gt;1&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='mi'&gt;2&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='mi'&gt;3&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='mi'&gt;4&lt;/span&gt;&lt;span class='o'&gt;]&lt;/span&gt;
&lt;span class='vi'&gt;@lista&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='n'&gt;each&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt;&lt;span class='o'&gt;|&lt;/span&gt;&lt;span class='n'&gt;elemento&lt;/span&gt;&lt;span class='o'&gt;|&lt;/span&gt; &lt;span class='nb'&gt;puts&lt;/span&gt; &lt;span class='n'&gt;elemento&lt;/span&gt;&lt;span class='p'&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;/p&gt;

&lt;p&gt;Il che è anche abbastanza leggibile una volta fatta l&amp;#8217;abitudine:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;	lista: per ogni elemento, scrivilo sulla console&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;.&lt;/p&gt;

&lt;h2 id='cosa_sono_i_code_block_e_le_coroutines'&gt;Cosa sono i &lt;em&gt;code block&lt;/em&gt; e le &lt;em&gt;coroutines&lt;/em&gt;?&lt;/h2&gt;

&lt;p&gt;Un &lt;em&gt;code-block&lt;/em&gt; non è altro che un blocco di codice (incredibilmente), delimitato da parentesi graffe o da &lt;em&gt;do-end&lt;/em&gt; che non viene eseguito immediatamente, ma viene messo da parte per essere eseguito in un secondo momento.&lt;/p&gt;

&lt;p&gt;Questo code-block deve essere adiacente ad una chiamata a un metodo, la quale può cedere il controllo al code-block ogni volta che lo desidera tramite il costrutto &lt;code&gt;yield&lt;/code&gt; tutte le volte che lo desidera, eventualmente passandogli parametri e ricevendone.&lt;/p&gt;

&lt;p&gt;A tutti gli effetti il metodo e il code-block sono &lt;em&gt;coroutines&lt;/em&gt;, ovvero funzioni che lavorano &amp;#8220;insieme&amp;#8221; passandosi la palla l&amp;#8217;una con l&amp;#8217;altra. La cosa interessante è che a un metodo che utilizza un code-block esterno, può essere passato un blocco qualunque di istruzioni. E&amp;#8217; un concetto simile ma più potente e versatile dei puntatori a funzione del C.&lt;/p&gt;

&lt;h3 id='esempio_iteratori'&gt;Esempio: iteratori&lt;/h3&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='ruby'&gt;&lt;span class='mi'&gt;3&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='n'&gt;times&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt;&lt;span class='nb'&gt;puts&lt;/span&gt; &lt;span class='s2'&gt;&amp;quot;Hello, world!&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;Questo codice si legge:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;	Per 3 volte: stampa la stringa &amp;quot;Hello, world!&amp;quot;&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;code&gt;times&lt;/code&gt; è la chiamata all&amp;#8217;omonimo metodo fornito dal numero 3 (essendo Ruby un linguaggio completamente ad oggetti, è un oggetto di tipo intero) a cui viene associato un code-block che effettua la stampa. Il metodo &lt;code&gt;times&lt;/code&gt; non fa altro che richiamare tante volte &lt;code&gt;yield&lt;/code&gt; quanto è il valore che rappresenta l&amp;#8217;oggetto su cui viene richiamato il metodo.&lt;/p&gt;

&lt;p&gt;Si può ottenere lo stesso effetto di prima con una funzione &lt;em&gt;ad-hoc&lt;/em&gt;:&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='ruby'&gt;&lt;span class='k'&gt;def&lt;/span&gt; &lt;span class='nf'&gt;call_block&lt;/span&gt;
	&lt;span class='k'&gt;for&lt;/span&gt; &lt;span class='n'&gt;i&lt;/span&gt; &lt;span class='k'&gt;in&lt;/span&gt; &lt;span class='mi'&gt;1&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='n'&gt;.&lt;/span&gt;&lt;span class='mi'&gt;3&lt;/span&gt;
		&lt;span class='k'&gt;yield&lt;/span&gt;
	&lt;span class='k'&gt;end&lt;/span&gt;
&lt;span class='k'&gt;end&lt;/span&gt;

&lt;span class='n'&gt;call_block&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt;&lt;span class='nb'&gt;puts&lt;/span&gt; &lt;span class='s2'&gt;&amp;quot;Hello, world!&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;Un code-block può ricevere parametri dalla routine da cui viene invocata tramite &lt;code&gt;yield&lt;/code&gt;, e similmente riceverne al ritorno, trasformando &lt;code&gt;yield&lt;/code&gt; in una vera e propria chiamata al code-block.&lt;/p&gt;

&lt;p&gt;Inoltre, passando un parametro al code-block, possiamo implementare un iteratore per una classe collezione (analogo al metodo &lt;code&gt;each&lt;/code&gt; del primo esempio) nel modo seguente:&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='ruby'&gt;&lt;span class='k'&gt;class&lt;/span&gt; &lt;span class='nc'&gt;Collezione&lt;/span&gt;
	&lt;span class='k'&gt;def&lt;/span&gt; &lt;span class='nf'&gt;initialize&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;lista&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;
		&lt;span class='vi'&gt;@collezione&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='n'&gt;lista&lt;/span&gt;
	&lt;span class='k'&gt;end&lt;/span&gt;

	&lt;span class='k'&gt;def&lt;/span&gt; &lt;span class='nf'&gt;each&lt;/span&gt; 
		&lt;span class='k'&gt;for&lt;/span&gt; &lt;span class='n'&gt;i&lt;/span&gt; &lt;span class='k'&gt;in&lt;/span&gt; &lt;span class='mi'&gt;0&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='n'&gt;.&lt;/span&gt;&lt;span class='vi'&gt;@collezione&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='n'&gt;size&lt;/span&gt;
			&lt;span class='k'&gt;yield&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='vi'&gt;@collezione&lt;/span&gt;&lt;span class='o'&gt;[&lt;/span&gt;&lt;span class='n'&gt;i&lt;/span&gt;&lt;span class='o'&gt;]&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;
		&lt;span class='k'&gt;end&lt;/span&gt;
	&lt;span class='k'&gt;end&lt;/span&gt;
&lt;span class='k'&gt;end&lt;/span&gt;

&lt;span class='n'&gt;lista&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='no'&gt;Collezione&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='n'&gt;new&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='o'&gt;[&lt;/span&gt;&lt;span class='mi'&gt;1&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='mi'&gt;2&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='mi'&gt;3&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='mi'&gt;4&lt;/span&gt;&lt;span class='o'&gt;]&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;
&lt;span class='n'&gt;lista&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='n'&gt;each&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt;&lt;span class='o'&gt;|&lt;/span&gt;&lt;span class='n'&gt;elemento&lt;/span&gt;&lt;span class='o'&gt;|&lt;/span&gt; &lt;span class='nb'&gt;puts&lt;/span&gt; &lt;span class='n'&gt;elemento&lt;/span&gt;&lt;span class='p'&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;Questo è più o meno il modo in cui sono implementati gli iteratori nella libreria standard di Ruby.&lt;/p&gt;

&lt;p&gt;Diversamente da come illustrato nel design pattern &lt;em&gt;Iterator&lt;/em&gt; della GOF, nel quale l&amp;#8217;iteratore è una classe esterna all&amp;#8217;oggetto su cui itera e di cui mantiene un riferimento, in Ruby un iteratore viene implementato come un semplice metodo all&amp;#8217;interno della classe collezione. Questo a quanto pare rende il mantenere questo tipo di codice più semplice.&lt;/p&gt;

&lt;h3 id='esempio_controllo_transazionale_su_file'&gt;Esempio: controllo transazionale su file&lt;/h3&gt;

&lt;p&gt;Quando ci si trova a lavorare con dei file (o comunque con delle risorse esterne), è importante anche &lt;em&gt;rilasciare&lt;/em&gt; la risorsa una volta che si è acquisita e si sono effettuate tutte le operazioni necessarie.&lt;/p&gt;

&lt;p&gt;Ad esempio, in Ruby è molto facile leggere il contenuto di un file e stamparlo a video:&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='ruby'&gt;&lt;span class='n'&gt;f&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='no'&gt;File&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='n'&gt;open&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s2'&gt;&amp;quot;test_file.txt&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;
&lt;span class='n'&gt;f&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='n'&gt;each&lt;/span&gt; &lt;span class='k'&gt;do&lt;/span&gt; &lt;span class='o'&gt;|&lt;/span&gt;&lt;span class='n'&gt;line&lt;/span&gt;&lt;span class='o'&gt;|&lt;/span&gt;
	&lt;span class='nb'&gt;puts&lt;/span&gt; &lt;span class='n'&gt;line&lt;/span&gt;
&lt;span class='k'&gt;end&lt;/span&gt;
&lt;span class='n'&gt;f&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='n'&gt;close&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;Anche qui abbiamo usato un code-block (questa volta delimitato da do-end) per iterare sulle linee (delimitate dal carattere &lt;em&gt;newline&lt;/em&gt;) contenute nel file.&lt;/p&gt;

&lt;p&gt;Il difetto di questo approccio è che se ci si dimendica di invocare il metodo &lt;code&gt;close&lt;/code&gt; sul file, questo rimane aperto. Un modo più corretto sarebbe quello di implementare un metodo che apra e chiuda il file, passando il controllo al code-block esterno per processarlo. In questo modo, il metodo che si occupa di aprire il file si occupa anche di chiuderlo:&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='ruby'&gt;&lt;span class='k'&gt;class&lt;/span&gt; &lt;span class='nc'&gt;File&lt;/span&gt;
	&lt;span class='k'&gt;def&lt;/span&gt; &lt;span class='nc'&gt;File&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='nf'&gt;open_and_process&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='o'&gt;*&lt;/span&gt;&lt;span class='n'&gt;args&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;
		&lt;span class='n'&gt;file&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='no'&gt;File&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='n'&gt;open&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='o'&gt;*&lt;/span&gt;&lt;span class='n'&gt;args&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;
		&lt;span class='k'&gt;while&lt;/span&gt; &lt;span class='n'&gt;line&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='n'&gt;file&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='n'&gt;gets&lt;/span&gt;
			&lt;span class='k'&gt;yield&lt;/span&gt; &lt;span class='n'&gt;line&lt;/span&gt;
		&lt;span class='k'&gt;end&lt;/span&gt;
		&lt;span class='n'&gt;file&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='n'&gt;close&lt;/span&gt;
	&lt;span class='k'&gt;end&lt;/span&gt;
&lt;span class='k'&gt;end&lt;/span&gt;

&lt;span class='no'&gt;File&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='n'&gt;open_and_process&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s2'&gt;&amp;quot;test_file.txt&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;,&lt;/span&gt; &lt;span class='s2'&gt;&amp;quot;r&amp;quot;&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt;&lt;span class='o'&gt;|&lt;/span&gt;&lt;span class='n'&gt;line&lt;/span&gt;&lt;span class='o'&gt;|&lt;/span&gt; &lt;span class='nb'&gt;puts&lt;/span&gt; &lt;span class='n'&gt;line&lt;/span&gt;&lt;span class='p'&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;Naturalmente non ho considerato le eccezioni in questo esempio.&lt;/p&gt;

&lt;p&gt;Il risultato è lo stesso, ma ora abbiamo un controllo sulle transazioni su file. Infatti, questo è il comportamento implementato nel metodo &lt;code&gt;File.open&lt;/code&gt;. Se viene fornito un code-block alla chiamata, &lt;code&gt;open&lt;/code&gt; restituisce l&amp;#8217;&lt;em&gt;handler&lt;/em&gt; del file al code-block per farlo processare, e al ritorno chiude il file aperto.&lt;/p&gt;

&lt;h1 id='closures'&gt;Closures&lt;/h1&gt;

&lt;p&gt;Un code-block associato ad un metodo può essere memorizzato insieme al &lt;em&gt;contesto&lt;/em&gt; dal quale viene passato per essere invocato in un secondo momento. Per fare questo deve essere convertito in un oggetto &lt;code&gt;Proc&lt;/code&gt; (abbreviazione di &lt;em&gt;procedure&lt;/em&gt;) al cui interno contiene tutte le informazioni sul contesto in cui viene &lt;em&gt;definito&lt;/em&gt; (variabili, metodi, costanti, &lt;em&gt;self&lt;/em&gt;).&lt;/p&gt;

&lt;p&gt;In questo modo, il code-block può essere utilizzato anche quando il contesto in cui è stato definito non è più presente. Un linguaggio che supporta questa funzionalità si dice che fornisce le &lt;strong&gt;closures&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Un esempio per illustrare il tutto (tratto dal &lt;a href='http://rubycentral.com/pickaxe/tut_containers.html'&gt;PickAxe&lt;/a&gt;):&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='ruby'&gt;&lt;span class='k'&gt;def&lt;/span&gt; &lt;span class='nf'&gt;n_times&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='n'&gt;thing&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;
  &lt;span class='k'&gt;return&lt;/span&gt; &lt;span class='nb'&gt;lambda&lt;/span&gt; &lt;span class='p'&gt;{&lt;/span&gt;&lt;span class='o'&gt;|&lt;/span&gt;&lt;span class='n'&gt;n&lt;/span&gt;&lt;span class='o'&gt;|&lt;/span&gt; &lt;span class='n'&gt;thing&lt;/span&gt; &lt;span class='o'&gt;*&lt;/span&gt; &lt;span class='n'&gt;n&lt;/span&gt; &lt;span class='p'&gt;}&lt;/span&gt;
&lt;span class='k'&gt;end&lt;/span&gt;

&lt;span class='n'&gt;p1&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='n'&gt;n_times&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='mi'&gt;23&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;
&lt;span class='nb'&gt;puts&lt;/span&gt; &lt;span class='n'&gt;p1&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='n'&gt;call&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='mi'&gt;3&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;
&lt;span class='nb'&gt;puts&lt;/span&gt; &lt;span class='n'&gt;p1&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='n'&gt;call&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='mi'&gt;4&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;
&lt;span class='n'&gt;p2&lt;/span&gt; &lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='n'&gt;n_times&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='s2'&gt;&amp;quot;Hello &amp;quot;&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;
&lt;span class='nb'&gt;puts&lt;/span&gt; &lt;span class='n'&gt;p2&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='n'&gt;call&lt;/span&gt;&lt;span class='p'&gt;(&lt;/span&gt;&lt;span class='mi'&gt;3&lt;/span&gt;&lt;span class='p'&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;La stampa:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;	69
	92
	Hello Hello Hello &lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;La funzione &lt;code&gt;lambda&lt;/code&gt; converte il code-block in un oggetto di tipo &lt;code&gt;Proc&lt;/code&gt; che ritorna al chiamante, con la variabile &lt;code&gt;thing&lt;/code&gt; pari al parametro passato alla funzione contenente il code-block stesso. L&amp;#8217;oggetto &lt;code&gt;Proc&lt;/code&gt; poi, dispone del metodo &lt;code&gt;call&lt;/code&gt; per eseguire il code-block memorizzato.&lt;/p&gt;

&lt;p&gt;Vediamo qui che, nonostante il parametro &lt;code&gt;thing&lt;/code&gt; passato alla lambda sia ormai fuori dallo &lt;em&gt;scope&lt;/em&gt; della &lt;code&gt;call&lt;/code&gt;, questo è presente perchè memorizzato nell&amp;#8217;oggetto &lt;code&gt;Proc&lt;/code&gt;.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/ManuelPaccagnella/~4/7QYlDrH5d_I" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://manuelp.github.com/development/2009/07/11/ruby-codeblocks-coruotines-closures.html</feedburner:origLink></entry>
 
 <entry>
   <title>Ruby - linguaggio interessante</title>
   <link href="http://feedproxy.google.com/~r/ManuelPaccagnella/~3/15cnt3QBrZ4/ruby-linguaggio-interessante.html" />
   <updated>2009-07-10T00:00:00-07:00</updated>
   <id>http://manuelp.github.com/development/2009/07/10/ruby-linguaggio-interessante</id>
   <content type="html">&lt;p&gt;Ho una certa conoscenza del linguaggio &lt;a href='http://www.python.org/'&gt;python&lt;/a&gt;, avendolo già utilizzato per dei progetti personali, ma ho deciso di imparare ad utilizzare in modo soddisfacente un buon linguaggio ad alto livello (o di &lt;em&gt;scripting&lt;/em&gt;, anche se non mi piace molto il termine).&lt;/p&gt;

&lt;p&gt;Data la maggior produttività che linguaggi di questo tipo consentono, possono essere utilizzati per un paio di scopi già da subito:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;prototipazione&lt;/li&gt;

&lt;li&gt;automazione&lt;/li&gt;
&lt;/ul&gt;

&lt;h1 id='quale_linguaggio'&gt;Quale linguaggio?&lt;/h1&gt;

&lt;p&gt;La risposta sembrerebbe triviale: conosco già un pò di Python, quindi sarebbe naturale scegliere di approfondirne la conoscenza, complice anche il rilascio del nuovo Python 3.&lt;/p&gt;

&lt;p&gt;Ma sono curioso, e ho sentito molto parlare di questo nuovo linguaggio che arriva dal Sol Levante: &lt;a href='http://www.ruby-lang.org/'&gt;Ruby&lt;/a&gt;. La &lt;em&gt;killer-application&lt;/em&gt; che ne traina la popolarità è senza dubbio &lt;a href='http://rubyonrails.org/'&gt;Rails&lt;/a&gt; e ci sono troppe persone che rispetto e che hanno una grande esperienza che ne &lt;a href='http://martinfowler.com/articles/rubyAtThoughtWorks.html'&gt;parlano&lt;/a&gt; molto bene (&lt;a href='http://www.pragmaticprogrammer.com/'&gt;I Pragmatici&lt;/a&gt;, &lt;a href='http://www.objectmentor.com'&gt;Robert Martin&lt;/a&gt; a.k.a &amp;#8220;Uncle Bob&amp;#8221; e &lt;a href='http://martinfowler.com/'&gt;Martin Fowler&lt;/a&gt; tra gli altri) per far finta di nulla.&lt;/p&gt;

&lt;p&gt;Questo nonostante il &lt;a href='http://www.artima.com/weblogs/viewpost.jsp?thread=141312'&gt;parere&lt;/a&gt; di Bruce Eckel (di fama &amp;#8220;Thinking in [C++|Java]&amp;#8221;) che invece ha scelto Python come suo nuovo &amp;#8220;linguaggio preferito&amp;#8221;. Al di là di &lt;a href='http://blog.ianbicking.org/ruby-python-power.html'&gt;confronti&lt;/a&gt; feature-a-feature e &lt;a href='http://www.cafeaulait.org/oldnews/news2005December8.html'&gt;opinioni&lt;/a&gt; sullo stile di design, sono entrambi linguaggi in evoluzione (come dimostrano Python 3 e Ruby 1.9) e che possono essere appetibili a palati diversi, quindi l&amp;#8217;unico modo valido per scegliere il &amp;#8220;proprio&amp;#8221; è sporcarsi le mani.&lt;/p&gt;

&lt;h1 id='conclusione'&gt;Conclusione&lt;/h1&gt;

&lt;p&gt;Credo che darò un&amp;#8217;occhiata a questo linguaggio e che nel frattempo lo userò per implementare un pò di automazione in quello che faccio ogni giorno, in ogni caso avrò imparato qualcosa e fatto esperienza.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/ManuelPaccagnella/~4/15cnt3QBrZ4" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://manuelp.github.com/development/2009/07/10/ruby-linguaggio-interessante.html</feedburner:origLink></entry>
 
 <entry>
   <title>Assert first!</title>
   <link href="http://feedproxy.google.com/~r/ManuelPaccagnella/~3/NbVpb5UP6P0/assert-first.html" />
   <updated>2009-06-27T00:00:00-07:00</updated>
   <id>http://manuelp.github.com/development/2009/06/27/assert-first</id>
   <content type="html">&lt;p&gt;Attualmente sto terminando la lettura del libro &lt;em&gt;&amp;#8220;Test-Driven Development By Example&amp;#8221;&lt;/em&gt; di Kent Beck, ed è in mia modesta opinione una lettura molto istruttiva e utile per chi cerca di imparare questo stile di sviluppo. E&amp;#8217; di grande beneficio vedere la tecnica all&amp;#8217;opera e seguirne l&amp;#8217;utilizzo passo-passo (forse l&amp;#8217;unico modo per sviluppare un &lt;em&gt;feel&lt;/em&gt; e assimilarne la mentalità), per poi rifinire la propria comprensione con dei &lt;em&gt;pattern&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Ho già utilizzato questa tecnica per un progetto complesso sviluppato in un team (oltre che altri side-project personali) e quindi ho una seppur minima esperienza in proposito, ma ci sono ancora diverse finezze, tecniche e pattern che posso applicare per migliorare la mia capacità di sviluppare sistemi guidato dai test.&lt;/p&gt;

&lt;p&gt;Un&amp;#8217;idea nuova che non ho mai utilizzato è quella di &lt;strong&gt;scrivere &lt;em&gt;prima&lt;/em&gt; gli assert in un test&lt;/strong&gt;. La motivazione di questo accorgimento deriva dal vedere i test come un modo per guidare lo sviluppo delle funzionalità che un sistema deve avere.&lt;/p&gt;

&lt;p&gt;In pratica, un &lt;em&gt;sistema&lt;/em&gt; è composto da diverse &lt;em&gt;funzionalità&lt;/em&gt;, ognuna delle quali deve essere soggetta a diversi &lt;em&gt;test&lt;/em&gt;, ognuno dei quali a sua volta contiene delle &lt;em&gt;asserzioni&lt;/em&gt;. La funzione delle asserzioni è molteplice, ma quelle che ci interessano in questa sede sono essenzialmente:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Qual&amp;#8217;è la risposta corretta?&lt;/li&gt;

&lt;li&gt;Come posso controllarla?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Cominciare a scrivere un test partendo dalle asserzioni (che normalmente in un test completo si collocano alla fine del test-case: test pattern &lt;em&gt;arrange-do-check&lt;/em&gt;) fissiamo subito quali sono le funzionalità sotto test, qual&amp;#8217;è la loro forma e sintassi e come devono rispondere. A partire da questa conoscenza possiamo costruire il test-case scrivendo tutte le operazioni necessarie per ottenere quel risultato.&lt;/p&gt;

&lt;h1 id='un_esempio'&gt;Un esempio&lt;/h1&gt;

&lt;p&gt;(Tratto da: &lt;em&gt;&amp;#8220;Test-Driven Development By Example&amp;#8221;&lt;/em&gt;, Kent Beck)&lt;/p&gt;

&lt;p&gt;Supponiamo di voler comunicare con un altro sistema attraverso un socket. Quando abbiamo terminato la comunicazione il socket deve essere chiuso e deve essere stata trasmessa e ricevuta con successo la stringa &amp;#8220;abc&amp;#8221;.&lt;/p&gt;

&lt;p&gt;Cominciamo con le asserzioni:&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='java'&gt;&lt;span class='kd'&gt;public&lt;/span&gt; &lt;span class='kt'&gt;void&lt;/span&gt; &lt;span class='nf'&gt;testCompleteTransaction&lt;/span&gt;&lt;span class='o'&gt;()&lt;/span&gt; &lt;span class='o'&gt;{&lt;/span&gt;
   &lt;span class='c1'&gt;// ...&lt;/span&gt;
   &lt;span class='n'&gt;assertTrue&lt;/span&gt;&lt;span class='o'&gt;(&lt;/span&gt;&lt;span class='n'&gt;reader&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='na'&gt;isClosed&lt;/span&gt;&lt;span class='o'&gt;());&lt;/span&gt;
   &lt;span class='n'&gt;assertEquals&lt;/span&gt;&lt;span class='o'&gt;(&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;abc&amp;quot;&lt;/span&gt;&lt;span class='o'&gt;,&lt;/span&gt; &lt;span class='n'&gt;reply&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='na'&gt;contents&lt;/span&gt;&lt;span class='o'&gt;());&lt;/span&gt;
&lt;span class='o'&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;Il &lt;em&gt;reply&lt;/em&gt; viene da un socket:&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='java'&gt;&lt;span class='kd'&gt;public&lt;/span&gt; &lt;span class='kt'&gt;void&lt;/span&gt; &lt;span class='nf'&gt;testCompleteTransaction&lt;/span&gt;&lt;span class='o'&gt;()&lt;/span&gt; &lt;span class='o'&gt;{&lt;/span&gt;
   &lt;span class='c1'&gt;// ...&lt;/span&gt;
   &lt;span class='n'&gt;Buffer&lt;/span&gt; &lt;span class='n'&gt;reply&lt;/span&gt;&lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='n'&gt;reader&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='na'&gt;contents&lt;/span&gt;&lt;span class='o'&gt;();&lt;/span&gt;
   &lt;span class='n'&gt;assertTrue&lt;/span&gt;&lt;span class='o'&gt;(&lt;/span&gt;&lt;span class='n'&gt;reader&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='na'&gt;isClosed&lt;/span&gt;&lt;span class='o'&gt;());&lt;/span&gt;
   &lt;span class='n'&gt;assertEquals&lt;/span&gt;&lt;span class='o'&gt;(&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;abc&amp;quot;&lt;/span&gt;&lt;span class='o'&gt;,&lt;/span&gt; &lt;span class='n'&gt;reply&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='na'&gt;contents&lt;/span&gt;&lt;span class='o'&gt;());&lt;/span&gt;
&lt;span class='o'&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;Il socket lo creiamo connettendoci al server:&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='java'&gt;&lt;span class='kd'&gt;public&lt;/span&gt; &lt;span class='kt'&gt;void&lt;/span&gt; &lt;span class='nf'&gt;testCompleteTransaction&lt;/span&gt;&lt;span class='o'&gt;()&lt;/span&gt; &lt;span class='o'&gt;{&lt;/span&gt;
   &lt;span class='c1'&gt;// ...&lt;/span&gt;
   &lt;span class='n'&gt;Socket&lt;/span&gt; &lt;span class='n'&gt;reader&lt;/span&gt;&lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='n'&gt;Socket&lt;/span&gt;&lt;span class='o'&gt;(&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;localhost&amp;quot;&lt;/span&gt;&lt;span class='o'&gt;,&lt;/span&gt; &lt;span class='n'&gt;defaultPort&lt;/span&gt;&lt;span class='o'&gt;());&lt;/span&gt;
   &lt;span class='n'&gt;Buffer&lt;/span&gt; &lt;span class='n'&gt;reply&lt;/span&gt;&lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='n'&gt;reader&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='na'&gt;contents&lt;/span&gt;&lt;span class='o'&gt;();&lt;/span&gt;
   &lt;span class='n'&gt;assertTrue&lt;/span&gt;&lt;span class='o'&gt;(&lt;/span&gt;&lt;span class='n'&gt;reader&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='na'&gt;isClosed&lt;/span&gt;&lt;span class='o'&gt;());&lt;/span&gt;
   &lt;span class='n'&gt;assertEquals&lt;/span&gt;&lt;span class='o'&gt;(&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;abc&amp;quot;&lt;/span&gt;&lt;span class='o'&gt;,&lt;/span&gt; &lt;span class='n'&gt;reply&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='na'&gt;contents&lt;/span&gt;&lt;span class='o'&gt;());&lt;/span&gt;
&lt;span class='o'&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;E infine (o in principio) dobbiamo connetterci al server:&lt;/p&gt;
&lt;div class='highlight'&gt;&lt;pre&gt;&lt;code class='java'&gt;&lt;span class='kd'&gt;public&lt;/span&gt; &lt;span class='kt'&gt;void&lt;/span&gt; &lt;span class='nf'&gt;testCompleteTransaction&lt;/span&gt;&lt;span class='o'&gt;()&lt;/span&gt; &lt;span class='o'&gt;{&lt;/span&gt;
   &lt;span class='n'&gt;Server&lt;/span&gt; &lt;span class='n'&gt;writer&lt;/span&gt;&lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='n'&gt;Server&lt;/span&gt;&lt;span class='o'&gt;(&lt;/span&gt;&lt;span class='n'&gt;defaultPort&lt;/span&gt;&lt;span class='o'&gt;(),&lt;/span&gt; &lt;span class='s'&gt;&amp;quot;abc&amp;quot;&lt;/span&gt;&lt;span class='o'&gt;);&lt;/span&gt;
   &lt;span class='n'&gt;Socket&lt;/span&gt; &lt;span class='n'&gt;reader&lt;/span&gt;&lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='n'&gt;Socket&lt;/span&gt;&lt;span class='o'&gt;(&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;localhost&amp;quot;&lt;/span&gt;&lt;span class='o'&gt;,&lt;/span&gt; &lt;span class='n'&gt;defaultPort&lt;/span&gt;&lt;span class='o'&gt;());&lt;/span&gt;
   &lt;span class='n'&gt;Buffer&lt;/span&gt; &lt;span class='n'&gt;reply&lt;/span&gt;&lt;span class='o'&gt;=&lt;/span&gt; &lt;span class='n'&gt;reader&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='na'&gt;contents&lt;/span&gt;&lt;span class='o'&gt;();&lt;/span&gt;
   &lt;span class='n'&gt;assertTrue&lt;/span&gt;&lt;span class='o'&gt;(&lt;/span&gt;&lt;span class='n'&gt;reader&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='na'&gt;isClosed&lt;/span&gt;&lt;span class='o'&gt;());&lt;/span&gt;
   &lt;span class='n'&gt;assertEquals&lt;/span&gt;&lt;span class='o'&gt;(&lt;/span&gt;&lt;span class='s'&gt;&amp;quot;abc&amp;quot;&lt;/span&gt;&lt;span class='o'&gt;,&lt;/span&gt; &lt;span class='n'&gt;reply&lt;/span&gt;&lt;span class='o'&gt;.&lt;/span&gt;&lt;span class='na'&gt;contents&lt;/span&gt;&lt;span class='o'&gt;());&lt;/span&gt;
&lt;span class='o'&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ManuelPaccagnella/~4/NbVpb5UP6P0" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://manuelp.github.com/development/2009/06/27/assert-first.html</feedburner:origLink></entry>
 
 <entry>
   <title>Campagna per il pensionamento di IE6</title>
   <link href="http://feedproxy.google.com/~r/ManuelPaccagnella/~3/A_hEWUMqudM/campagna-pensionamento-ie6.html" />
   <updated>2009-06-11T00:00:00-07:00</updated>
   <id>http://manuelp.github.com/web/2009/06/11/campagna-pensionamento-ie6</id>
   <content type="html">&lt;a href='http://www.bringdownie6.com/'&gt;
   &lt;img src='/images/bdie6.png' alt='logo della campagna bring down IE6' style='float:right' /&gt;
&lt;/a&gt;
&lt;p&gt;In questo periodo sto studianto le tecnologie web per un progetto a cui partecipo, e non c&amp;#8217;è libro sul CSS in cui mi imbatta che non contenga quasi ad ogni capitolo un riferimento a come qualche versione di &lt;em&gt;Internet Explorer&lt;/em&gt; (almeno la versione 6 e precedenti) interpreti erroneamente, o addirittura manchi totalmente del supporto a, molte delle funzionalità richieste per il moderno web.&lt;/p&gt;

&lt;p&gt;Si parla di proprietà CSS e anche di bug veri e propri che costringono gli sviluppatori e i designer di siti web a spendere un&amp;#8217;incredibile quantità di tempo a sviluppare &lt;em&gt;hacks&lt;/em&gt; per costringere IE a renderizzare la pagina correttamente come tutti gli altri browser (moderni o meno).&lt;/p&gt;

&lt;p&gt;IE6 è un browser vecchio di otto anni ormai, ma purtroppo una fetta ancora non trascurabile del mercato (i dati parlano di una percentuale di circa il 20% delle connessioni totali), probabilmente perlopiù costituita da utenti business su macchine (ad esempio equipaggiate con windows 2000) che non possono fare un upgrade. E questo è &lt;strong&gt;un vero e proprio ostacolo&lt;/strong&gt; allo sviluppo del web, essenzialmente per due ragioni:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Gli sviluppatori&lt;/strong&gt; di siti devono spendere molto tempo (circa un terzo del tempo totale) a cercare di aggirare i bug e le mancanze di IE6 quando il sito viene renderizzato già perfettamente da tutti gli altri browser (perchè più rispettosi degli standard). &lt;em&gt;In altre parole sono un bel pò di soldi spesi ad aggirare le mancanze di un browser obsoleto&lt;/em&gt;&lt;/li&gt;

&lt;li&gt;&lt;strong&gt;Gli utenti&lt;/strong&gt; non possono godere appieno delle nuove potenzialità del web. Provate ad andare su Facebook, o ad usare GMail o 37Signals con IE6&amp;#8230;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ecco perchè è nata una &lt;a href='http://www.bringdownie6.com/' title='campagna: Bring Down IE6'&gt;campagna&lt;/a&gt; per spingere l&amp;#8217;upgrade a browser più moderni (anche ad un&amp;#8217;altra versione di IE, solo più recente). Dalla dichiarazione d&amp;#8217;intenti della campagna (la traduzione è mia, ora sapete chi incolpare per gli errori):&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;La premessa è semplice: Internet Explorer 6 è antiquato, non supporta standard web chiave, e dovrebbe essere pensionato. Questo non riguarda l&amp;#8217;essere anti-Microsoft, piuttosto riguarda la mancanza di sviluppo del mercato dei browser da parte di Microsoft. Con IE7/8 non disponibili per Windows 2000, IE6 conta circa per un 20% dell&amp;#8217;uso del web, principalmente da parte di utenti business. I clienti fanno pressioni sui designer per &amp;#8220;contringere&amp;#8221; i siti a funzionare con IE6, e i designer, non volendo perdere affari, obbediscono, usando trucchetti e aggirando i problemi. Questa è una perdita di tempo e denaro. Microsoft deve sistemare questa situazione, i designer devono unirsi, e noi dobbiamo passare oltre.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Il dover avere a che fare con sistemi &lt;em&gt;legacy&lt;/em&gt; non è una cosa nuova, accade continuamente ed è una conseguenza dell&amp;#8217;avere un mercato con una grande inerzia ai cambiamenti. Ma quando questo significa solo uno spreco di soldi e di tempo come in questo caso, evitabile in modo &lt;a href='http://www.getfirefox.com/' title='Scarica Mozilla Firefox'&gt;piuttosto&lt;/a&gt; &lt;a href='http://www.google.com/chrome' title='Scarica Google Chrome'&gt;semplice&lt;/a&gt;, allora occorre spingere per andare avanti e disfarsi di una tecnologia obsoleta.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&amp;#8220;IE6 is the new Netscape 4. The hacks needed to support IE6 are increasingly viewed as excess freight. Like Netscape 4 in 2000, IE6 is perceived to be holding back the web.&amp;#8221; &lt;br /&gt; &amp;#8211;&lt;a href='http://www.zeldman.com/' title='Il sito personale di Jeffrey Zeldman'&gt;Jeff Zeldman&lt;/a&gt;, standards guru&lt;/p&gt;
&lt;/blockquote&gt;&lt;img src="http://feeds.feedburner.com/~r/ManuelPaccagnella/~4/A_hEWUMqudM" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://manuelp.github.com/web/2009/06/11/campagna-pensionamento-ie6.html</feedburner:origLink></entry>
 
 <entry>
   <title>Web Software Engineering?</title>
   <link href="http://feedproxy.google.com/~r/ManuelPaccagnella/~3/KhNzlUotGaA/web-software-engineering.html" />
   <updated>2009-06-07T00:00:00-07:00</updated>
   <id>http://manuelp.github.com/web/2009/06/07/web-software-engineering</id>
   <content type="html">&lt;p&gt;Ultimamente sto facendo pratica con la programmazione orientata al web (come noterai dall&amp;#8217;argomento dei post precedenti).&lt;/p&gt;

&lt;p&gt;La mia impressione è che mentre per il software tradizionale abbiamo ormai una certa esperienza e conosciamo molti &lt;em&gt;pattern&lt;/em&gt; e &lt;em&gt;best-practices&lt;/em&gt; da applicare, nel caso della programmazione web &lt;a href='http://www.e-gineer.com/articles/design-patterns-in-web-programming.phtml' title='Articolo di Nathan Wallace'&gt;non è proprio così&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Ci sono alcune soluzioni e metodologie di sviluppo mutuate dalla controparte stand-alone che possiamo &lt;a href='http://www.clientcide.com/best-practices/jquery-and-the-ajax-experience-programming-to-the-pattern-and-what-really-makes-one-framework-different-from-another/'&gt;applicare&lt;/a&gt;, alcuni principi che rimangono utili (riuso, interoperabilità, estendibilità, ecc.) ma ci sono anche nuove sfide da affrontare e molte cose da scoprire che sono peculiari di questo &amp;#8220;ambiente di sviluppo&amp;#8221;.&lt;/p&gt;

&lt;p&gt;Se l&amp;#8217;ingegneria del software è una disciplina giovane, l&amp;#8217;applicazione di questa disciplina al web lo è ancora di più. Il web è una piattaforma che consente possibilità non facilmente disponibili per il software desktop: probabilmente siamo solo all&amp;#8217;inizio e, secondo la mia attuale ingenua visione, il futuro si rivelerà decisamente interessante :)&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/ManuelPaccagnella/~4/KhNzlUotGaA" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://manuelp.github.com/web/2009/06/07/web-software-engineering.html</feedburner:origLink></entry>
 
 <entry>
   <title>Google Wave!</title>
   <link href="http://feedproxy.google.com/~r/ManuelPaccagnella/~3/Kax8b3uhNhY/google-wave-un-anteprima.html" />
   <updated>2009-06-07T00:00:00-07:00</updated>
   <id>http://manuelp.github.com/web/2009/06/07/google-wave-un-anteprima</id>
   <content type="html">&lt;p&gt;C&amp;#8217;è &lt;em&gt;molto&lt;/em&gt; &lt;a href='http://www.google.it/search?q=google+wave' title='Pagine su Google Wave'&gt;fermento&lt;/a&gt; dietro il fenomeno &lt;a href='http://wave.google.com/' title='Google Wave'&gt;Google Wave&lt;/a&gt; che potrebbe &lt;strong&gt;&lt;a href='http://wave.google.com/help/wave/about.html' title='About Google Wave'&gt;rivoluzionare&lt;/a&gt; il modo di comunicare e collaborare online&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Bando alle ciance ed ecco la presentazione ufficiale:&lt;/p&gt;
&lt;object height='340' width='560'&gt;&lt;param name='movie' value='http://www.youtube.com/v/v_UyVmITiYQ&amp;hl=it&amp;fs=1&amp;' /&gt;&lt;param name='allowFullScreen' value='true' /&gt;&lt;param name='allowscriptaccess' value='always' /&gt;&lt;embed src='http://www.youtube.com/v/v_UyVmITiYQ&amp;hl=it&amp;fs=1&amp;' allowfullscreen='true' type='application/x-shockwave-flash' allowscriptaccess='always' height='340' width='560' /&gt;&lt;/object&gt;
&lt;p&gt;Sarà rilasciato al pubblico nel corso di quest&amp;#8217;anno, ma sono già disponibili le &lt;a href='http://code.google.com/apis/wave/' title='Google Wave API'&gt;API&lt;/a&gt; per integrare Wave con le proprie applicazioni e siti web e il sito dedicato al &lt;a href='http://waveprotocol.org/' title='Wave Federation Protocol'&gt;protocollo&lt;/a&gt; sottostante.&lt;/p&gt;

&lt;p&gt;Si prospettano tempi eccitanti :)&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/ManuelPaccagnella/~4/Kax8b3uhNhY" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://manuelp.github.com/web/2009/06/07/google-wave-un-anteprima.html</feedburner:origLink></entry>
 
 <entry>
   <title>Cos'è AJAX?</title>
   <link href="http://feedproxy.google.com/~r/ManuelPaccagnella/~3/mQHc63gYIjI/cose-ajax.html" />
   <updated>2009-06-06T00:00:00-07:00</updated>
   <id>http://manuelp.github.com/web/2009/06/06/cose-ajax</id>
   <content type="html">&lt;p&gt;AJAX è l&amp;#8217;acronimo di &lt;em&gt;Asynchronous Javascript And XML&lt;/em&gt; e indica una tecnica per permettere di costruire applicazioni web paragonabili a quelle stand-alone che utilizziamo normalmente.&lt;/p&gt;

&lt;h1 id='lutilit_di_ajax'&gt;L&amp;#8217;utilità di AJAX&lt;/h1&gt;

&lt;p&gt;Un&amp;#8217;applicazione web tradizionale solitamente costruisce una pagina web che invia al client. Questo compie delle azioni (riempie form, clicca dei link, ecc.) che vengono inviate al server come richieste http, il quale le elabora e costruisce una nuova pagina web che ritrasmette al client.&lt;/p&gt;

&lt;p&gt;Questo modello funziona, ma ha l&amp;#8217;inconveniente di essere &lt;em&gt;sincrono&lt;/em&gt;: da quando l&amp;#8217;utente invia una richiesta a quando il server risponde con una nuova pagina, l&amp;#8217;utente non può far altro che aspettare.&lt;/p&gt;

&lt;p&gt;Il meccanismo funziona per un web che è stato pensato per gli ipertesti ma non è più sufficiente per le esigenze moderne di applicativi costruiti sul web stesso. Applicativi che necessitano di essere &lt;em&gt;responsivi&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Alcuni esempi di applicazioni web molto usate costruite con questa tecnica sono: &lt;a href='http:///www.gmail.com/' title='GMail'&gt;GMail&lt;/a&gt;, &lt;a href='http://maps.google.com/' title='Google Maps'&gt;Google Maps&lt;/a&gt; e &lt;a href='http://docs.google.com/' title='Google Docs'&gt;Google Docs&lt;/a&gt;.&lt;/p&gt;

&lt;h1 id='da_cosa__costituito'&gt;Da cosa è costituito&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;XHTML e CSS: per la &lt;a href='http://adaptivepath.com/publications/essays/archives/000266.php'&gt;presentazione&lt;/a&gt;&lt;/li&gt;

&lt;li&gt;&lt;a href='http://www.scottandrew.com/weblog/articles/dom_1'&gt;DOM&lt;/a&gt;: per il layout dinamico e l&amp;#8217;interazione con la pagina&lt;/li&gt;

&lt;li&gt;&lt;a href='http://www-106.ibm.com/developerworks/xml/library/x-xslt/?article=xr'&gt;XML e XSLT&lt;/a&gt;: scambio e manipolazione dati&lt;/li&gt;

&lt;li&gt;&lt;a href='http://www.xml.com/pub/a/2005/02/09/xml-http-request.html'&gt;XMLHttpRequest&lt;/a&gt;: recupero asincrono dei dati&lt;/li&gt;

&lt;li&gt;&lt;a href='http://www.crockford.com/javascript/javascript.html'&gt;Javascript&lt;/a&gt;: collante per tutte le tecnologie precedenti&lt;/li&gt;
&lt;/ul&gt;

&lt;h1 id='come_funziona'&gt;Come funziona&lt;/h1&gt;

&lt;p&gt;AJAX è stato creato per consentire alle applicazioni web un dialogo &lt;em&gt;asincrono&lt;/em&gt; tra client e server minimizzando così il tempo di risposta percepito dall&amp;#8217;utente.&lt;/p&gt;

&lt;p&gt;In pratica si tratta di interporre tra il browser del client e la rete nella quale si trova il server un &lt;em&gt;motore AJAX&lt;/em&gt;, che consente all&amp;#8217;utente di interagire con l&amp;#8217;applicazione web direttamente senza aspettare la risposta del server.&lt;/p&gt;

&lt;h2 id='dialogo_clientserver_asincrono'&gt;Dialogo client/server asincrono&lt;/h2&gt;

&lt;p&gt;Per certi compiti come la validazione dell&amp;#8217;input e l&amp;#8217;elaborazione di alcune informazioni, il motore AJAX può cavarsela da solo. In tutti gli altri casi in cui è richiesta una risposta dal server, è il motore stesso che si occupa del dialogo consentendo all&amp;#8217;utente di continuare ad interagire con l&amp;#8217;applicazione mentre si è in attesa della risposta.&lt;/p&gt;

&lt;p&gt;Il dialogo poi si svolge solitamente attraverso frammenti XML, senza il bisogno di ricaricare (e ritrasmettere attraverso la rete) l&amp;#8217;intera pagina.&lt;/p&gt;

&lt;p&gt;E&amp;#8217; questo in sostanza che consente al sistema di fornire all&amp;#8217;utente un tempo di risposta inferiore, simile a quello di un&amp;#8217;applicazione desktop. Qui però &lt;strong&gt;la velocità di un applicativo non è più determinata principalmente dalla velocità del sistema, ma dalla velocità della rete.&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;La maggiore sfida che Ajax pone davanti ai nostri occhi non riguarda la risoluzione dei problemi tecnici da esso derivati, ma il dimenticare tutte le limitazioni che riguardavano il Web, per lanciarsi verso la creazione di applicazioni robuste, veloci e sempre più simili alle applicazioni Desktop. &lt;br /&gt; &amp;#8211;Jesse James Garrett, &lt;a href='http://adaptivepath.com/publications/essays/archives/000385.php'&gt;Ajax: a new approach to web applications&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h1 id='credits'&gt;Credits&lt;/h1&gt;

&lt;p&gt;Grazie a Daniele Simonin per la sua &lt;a href='http://read.melodycode.com/tutorials/158/ajax_un_nuovo_approccio_per_le_applicazioni_web.html'&gt;traduzione&lt;/a&gt; dell&amp;#8217;&lt;a href='http://adaptivepath.com/publications/essays/archives/000385.php'&gt;articolo&lt;/a&gt; di Jesse James Garrett.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/ManuelPaccagnella/~4/mQHc63gYIjI" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://manuelp.github.com/web/2009/06/06/cose-ajax.html</feedburner:origLink></entry>
 
 <entry>
   <title>Riflessioni sul cloud computing</title>
   <link href="http://feedproxy.google.com/~r/ManuelPaccagnella/~3/RimZoBDe6zA/riflessioni-sul-cloud-computing.html" />
   <updated>2009-06-05T00:00:00-07:00</updated>
   <id>http://manuelp.github.com/web/2009/06/05/riflessioni-sul-cloud-computing</id>
   <content type="html">&lt;p&gt;Ultimamente si fa un gran parlare di &lt;a href='http://it.wikipedia.org/wiki/Cloud_computing' title='Cloud Computing secondo wp'&gt;Cloud Computing&lt;/a&gt;, e di come questo &amp;#8220;nuovo&amp;#8221; modo di intendere il software come un servizio (&lt;a href='http://en.wikipedia.org/wiki/Software_as_a_Service' title='Software As A Service'&gt;SaaS&lt;/a&gt;) possa essere conveniente o meno.&lt;/p&gt;

&lt;h1 id='i_pro'&gt;I pro&lt;/h1&gt;

&lt;p&gt;I vantaggi di un modello del genere sono presto detti:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;non c&amp;#8217;è alcun bisogno di predisporre datacenter&lt;/li&gt;

&lt;li&gt;non occorre occuparsi del &lt;em&gt;deployment&lt;/em&gt; e della messa in sicurezza&lt;/li&gt;

&lt;li&gt;non occorre pagare personale interno che li amministri&lt;/li&gt;

&lt;li&gt;tutto il software è direttamente accessibile mediante il browser&lt;/li&gt;

&lt;li&gt;i dati sono nella &lt;em&gt;cloud&lt;/em&gt; e accessibili (previa autenticazione) da qualunque parte del mondo e da qualunque pc&lt;/li&gt;

&lt;li&gt;basta un pc depotenziato come un netbook per accedere a questi servizi (anche computazionalmente intensi)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Quindi i software sono forniti come un servizio, unitamente alla loro gestione per cui un utente non occorre che si preoccupi di altre problematiche aldilà del loro utilizzo. Si tratta di un ulteriore passo verso l&amp;#8217;&lt;em&gt;outsourcing&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Esempi di questi servizi sono &lt;a href='http://www.gmail.com' title='GMail'&gt;GMail&lt;/a&gt; e &lt;a href='http://www.facebook.com' title='Facebook'&gt;Facebook&lt;/a&gt;, che sono diventati molto popolari e che hanno aumentato di molto l&amp;#8217;efficienza e la produttività (almeno per quanto riguarda GMail).&lt;/p&gt;

&lt;h1 id='i_contro'&gt;I contro&lt;/h1&gt;

&lt;p&gt;Ma se da una parte il cloud computing è molto comodo perchè solleva dalla necessità di installazioni e configurazioni varie, dall&amp;#8217;altra fa sorgere un problema di fiducia e di sicurezza in generale, come fa notare &lt;a href='http://www.schneier.com/blog/archives/2009/06/cloud_computing.html' title='Articolo di Bruce Schneier sul Cloud Computing'&gt;Bruce Schneier&lt;/a&gt;.&lt;/p&gt;

&lt;h2 id='sicurezza'&gt;Sicurezza&lt;/h2&gt;

&lt;p&gt;Mentre posso gestire autonomamente il software installato in locale predisponendo misure di sicurezza come firewall e ambienti di esecuzione controllata, nel caso di SaaS sono completamente in balia del provider di quel software.&lt;/p&gt;

&lt;p&gt;Senza contare che se uso un software a codice chiuso e che viene eseguito per di più su macchine remote, non posso essere sicuro che il servizio in questione non faccia di più di quello che dichiara. Di conseguenza sarei portato a fidarmi di più di un servizio basato su software &lt;em&gt;open-source&lt;/em&gt; e di &lt;em&gt;standard condivisi&lt;/em&gt;.&lt;/p&gt;

&lt;h2 id='privacy'&gt;Privacy&lt;/h2&gt;

&lt;p&gt;Se utilizzo il cloud computing, utilizzo un software in cui immetto i miei dati che vengono memorizzati in maniera distribuita su server del gestore del servizio. In pratica sto a tutti gli effetti fornendo miei dati a una compagnia esterna che può essere o meno affidabile. Non ho nessun controllo sulle misure di sicurezza di quella compagnia che potrebbe anche avere accesso ai miei dati, o che potrebbe essere compromessa con relativo furto di informazioni.&lt;/p&gt;

&lt;p&gt;E se quella compagnia ad esempio va in &lt;a href='http://www.eweekeurope.co.uk/news/cloud-computing-forerunner-facing-bankruptcy-772' title='Articolo di eweekeurope'&gt;bancarotta&lt;/a&gt; o subisce dei guasti, posso &lt;a href='http://www.techcrunch.com/2009/01/03/journalspace-drama-all-data-lost-without-backup-company-deadpooled/' title='Articolo su TechCrunch'&gt;perdere completamente i miei dati&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Inoltre, se i servizi sono accentrati in un&amp;#8217;unica piattaforma, &lt;strong&gt;un&amp;#8217;eventuale compromissione e furto d&amp;#8217;identità potrebbero causare danni molto ingenti&lt;/strong&gt;. Prova a immaginare a un ipotetico servizio che fornisse al tempo stesso email, piattaforma per lo sviluppo di documenti, blog, gruppi di discussione e conversazioni in tempo reale (suona familiare?). Immagina che venga compromesso e che qualche persona senza scrupoli si impadronisca del tuo account. A quel punto avrebbe accesso alle tue email, documenti e contatti e le sue azioni avrebbero una portata enorme sia sulla tua vita lavorativa che personale&amp;#8230;&lt;/p&gt;

&lt;p&gt;Certo, possono essere adottate misure di sicurezza come crittografia (sia a livello di connessione con https che di storage con AES ad esempio), autenticazione e backup. Ma il punto rimane che il controllo ultimo sulla configurazione e controllo del sistema rimane al fornitore. &lt;strong&gt;E i tuoi dati sono in quel sistema&lt;/strong&gt;.&lt;/p&gt;

&lt;h2 id='lockin'&gt;Lock-in&lt;/h2&gt;

&lt;p&gt;Quando i dati risiedono su server di terze parti, oltre alle problematiche della sicurezza e della privacy occorre preoccuparsi della &lt;strong&gt;portabilità&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Non basta che il fornitore abbia una buona infrastruttura di sicurezza, usi la crittografia, e abbia dei sistemi di backup. Occorre che i dati che io immetto nel sistema li possa recuperare in ogni momento e integralmente, e devo essere sicuro che quando li cancello vengano eliminati realmente (non come nel caso di &lt;a href='http://punto-informatico.it/2602790/PI/Commenti/niente-privacy-benvenuti-facebook.aspx' title='La finta cancellazione di Facebook'&gt;Facebook&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;Si tratta in altre parole di avere il controllo completo sui propri dati, in caso contrario subiamo l&amp;#8217;odioso &lt;em&gt;vendor lock-in&lt;/em&gt; che stiamo solo ora cominciando a superare nel campo delle suite office e delle pubbliche amministrazioni.&lt;/p&gt;

&lt;h1 id='payperuse'&gt;Pay-per-use&lt;/h1&gt;

&lt;p&gt;Non potendolo classificare come pro o contro, c&amp;#8217;è comunque da considerare questo aspetto.&lt;/p&gt;

&lt;p&gt;Il cloud computing permette nuovi modelli di business, tra i quali c&amp;#8217;è il richiedere un corrispettivo per la fornitura di risorse e software in una cloud. Questo può essere un aspetto positivo per il fornitore e per l&amp;#8217;utente (migliore servizio), ma può anche non esserlo, dipende dai punti di vista.&lt;/p&gt;

&lt;h1 id='riflessione'&gt;Riflessione&lt;/h1&gt;

&lt;p&gt;Il cloud computing per come è nato ha proprio gli obiettivi di tagliare i costi di gestione, incrementare la facilità di accesso e la produttività. Però ci sono anche delle problematiche di sicurezza e di &lt;em&gt;fiducia&lt;/em&gt; che emergono da questa architettura.&lt;/p&gt;

&lt;p&gt;E&amp;#8217; anche vero che si possono avere i vantaggi del Cloud Computing in una &lt;em&gt;intranet&lt;/em&gt;, mantenendo il controllo sui propri dati e conservando la comodità della centralizzazione di accesso e utilizzando storage e risorse di calcolo distribuite. Ma al costo di sacrificare l&amp;#8217;accesso globale (a meno di non predisporre VPN) e di re-introdurre i costi di gestione di un datacenter.&lt;/p&gt;

&lt;p&gt;Bisogna stare attenti di chi fidarsi e per cosa. I meccanismi del mercato dovrebbero spingere i fornitori a erogare un servizio di qualità, ma &lt;strong&gt;quello che si guadagna in comodità e risparmio, lo si può perdere in privacy, sicurezza e flessibilità&lt;/strong&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Trust is a concept as old as humanity, and the solutions are the same as they have always been. Be careful who you trust, be careful what you trust them with, and be careful how much you trust them. Outsourcing is the future of computing. Eventually we&amp;#8217;ll get this right, but you don&amp;#8217;t want to be a casualty along the way.&lt;br /&gt; &amp;#8211;Bruce Schneier&lt;/p&gt;
&lt;/blockquote&gt;&lt;img src="http://feeds.feedburner.com/~r/ManuelPaccagnella/~4/RimZoBDe6zA" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://manuelp.github.com/web/2009/06/05/riflessioni-sul-cloud-computing.html</feedburner:origLink></entry>
 
 <entry>
   <title>JDK7 - piattaforma modulare multi-linguaggio</title>
   <link href="http://feedproxy.google.com/~r/ManuelPaccagnella/~3/ZW_-60gNZ38/jdk7-piattaforma-modulare-multilinguaggio.html" />
   <updated>2009-06-04T00:00:00-07:00</updated>
   <id>http://manuelp.github.com/java/2009/06/04/jdk7-piattaforma-modulare-multilinguaggio</id>
   <content type="html">&lt;p&gt;Secondo un articolo di &lt;a href='http://infoworld.com/print/77919'&gt;InfoWorld&lt;/a&gt;, la nuova nuova versione del JDK Sun adotterà un design più modulare che supporterà la versione 7 del linguaggio Java. E questo porterà, secondo Mark Reinhold (ingegnere principale dietro Java SE e &lt;a href='http://openjdk.java.net/' title='OpenJDK'&gt;OpenJDK&lt;/a&gt;) a una serie di vantaggi.&lt;/p&gt;

&lt;h2 id='classpath_will_be_dead'&gt;Classpath will be dead&lt;/h2&gt;

&lt;p&gt;La modularità verrà raggiunta attraverso il progetto &lt;a href='http://www.w3.org/Jigsaw/' title='Progetto Jigsaw'&gt;Jigsaw&lt;/a&gt;, che permetterà agli sviluppatori di sviluppare i propri moduli e di eliminare la necessità del &lt;em&gt;classpath&lt;/em&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&amp;#8220;Class path is dead,&amp;#8221; Reinhold said.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2 id='un_jdk_per_domarli_tutti'&gt;Un JDK per domarli tutti&lt;/h2&gt;

&lt;p&gt;La modularizzazione potrebbe portare anche ad una singola versione di Java, dato la capacità di un sistema del genere di adattarsi all&amp;#8217;ambiente in cui si trova ad essere eseguito.&lt;/p&gt;

&lt;h2 id='piattaforma_multilinguaggio'&gt;Piattaforma multi-linguaggio&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;&amp;#8220;We&amp;#8217;re working to define a modular form of the Java platform and its implementation; we&amp;#8217;re working to evolve the Java Virtual Machine into a true, multilingual universal runtime for high-level languages; and finally, we&amp;#8217;re doing things to make developers more productive,&amp;#8221; said Mark Reinhold, principal engineer for Java SE and OpenJDK.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Aspetto per me decisamente più importante. Per come la vedo io, l&amp;#8217;uso di un ambiente di esecuzione per &lt;em&gt;codice managed&lt;/em&gt; che permetta a programmi scritti in linguaggi diversi di comunicare e cooperare tra loro, in un&amp;#8217;ambiente comune e con un set standard di librerie, è una carta vincente.&lt;/p&gt;

&lt;p&gt;Già ora esistono soluzioni simili, le più famose delle quali sono il &lt;a href='http://en.wikipedia.org/wiki/Common_Language_Runtime'&gt;CLR&lt;/a&gt; della piattaforma .Net e appunto il JRE che già ora supporta un gran numero di linguaggi anche molto diversi tra loro come &lt;a href='http://www.scala-lang.org/' title='Scala'&gt;Scala&lt;/a&gt;, &lt;a href='http://groovy.codehaus.org/' title='Groovy'&gt;Groovy&lt;/a&gt;, &lt;a href='http://clojure.org/' title='Clojure'&gt;Clojure&lt;/a&gt;, &lt;a href='http://www.jython.org/' title='Jython'&gt;Jython&lt;/a&gt; e &lt;a href='http://jruby.codehaus.org/'&gt;JRuby&lt;/a&gt; per citarne alcuni.&lt;/p&gt;

&lt;h2 id='crescente_uso_delle_annotazioni'&gt;Crescente uso delle annotazioni&lt;/h2&gt;

&lt;p&gt;Per facilitare il compito dei &lt;em&gt;checker statici&lt;/em&gt;.&lt;/p&gt;

&lt;h2 id='conclusioni'&gt;Conclusioni&lt;/h2&gt;

&lt;p&gt;Con queste nuove modifiche la piattaforma Java potrebbe diventare a tutti gli effetti un ambiente di esecuzione in grado di supportare una gran varietà di necessità, linguaggi e stili di sviluppo, il tutto garantendone l&amp;#8217;interoperabilità e l&amp;#8217;esecuzione controllata.&lt;/p&gt;

&lt;p&gt;Tutte caratteristiche che secondo me potrebbero diventare irrinunciabili in molti settori.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/ManuelPaccagnella/~4/ZW_-60gNZ38" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://manuelp.github.com/java/2009/06/04/jdk7-piattaforma-modulare-multilinguaggio.html</feedburner:origLink></entry>
 
 <entry>
   <title>L'importanza della pianificazione</title>
   <link href="http://feedproxy.google.com/~r/ManuelPaccagnella/~3/fecys8PAh6w/l-importanza-della-pianificazione.html" />
   <updated>2009-06-02T00:00:00-07:00</updated>
   <id>http://manuelp.github.com/management/2009/06/02/l-importanza-della-pianificazione</id>
   <content type="html">&lt;blockquote&gt;
&lt;p&gt;Proceed from a plan, whether that plan is in your head, on the back of a cocktail napkin, or on a wall-sized printout from a CASE tool.&lt;br /&gt; &amp;#8211;&amp;#8220;The Pragmatic Programmer&amp;#8221;, Andrew Hunt, David Thomas&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Iniziare un progetto senza uno straccio di piano è una ricetta per il fallimento, o quantomeno per un&amp;#8217;efficientissima fonte di mal di testa.&lt;/p&gt;

&lt;p&gt;Non si tratta di pianificare ogni minimo dettaglio fin dal principio. Questo è controproducente (al di là di casi particolari come i programmi che equipaggiano lo space shuttle). Ma non si tratta nemmeno dell&amp;#8217;estremo opposto: procedere, praticamente, &lt;em&gt;a caso&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Alcuni proponenti dell&amp;#8217;approccio &lt;a href='http://it.wikipedia.org/wiki/Metodologia_agile'&gt;agile&lt;/a&gt; erroneamente portano all&amp;#8217;estremo il concetto di &lt;a href='http://en.wikipedia.org/wiki/Self-organization'&gt;self-organization&lt;/a&gt;, sostenendo in maniera più o meno implicita una generale antipatia per la pianificazione.&lt;/p&gt;

&lt;h1 id='tecnologia'&gt;Tecnologia&lt;/h1&gt;

&lt;p&gt;Nell&amp;#8217;ambito tecnologico possiamo vedere questa &amp;#8220;lotta&amp;#8221; ad esempio a livello di progettazione.&lt;/p&gt;

&lt;p&gt;Da una parte abbiamo i proponenti del &lt;a href='http://en.wikipedia.org/wiki/Big_Design_Up_Front' title='Big Design Up-Front'&gt;BDUF&lt;/a&gt;, che sostengono una specifica completa e dettagliata &lt;em&gt;prima di cominciare a codificare&lt;/em&gt;. Il che nella stragrande maggioranza dei casi significa perdere tempo in dettagli minuziosi basati su assunzioni non verificate, per poi scoprire che la soluzione non funziona o che ce ne sono di migliori e più eleganti, a cui non si arriva se non avendo sott&amp;#8217;occhio il codice.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Life is what happens to you while you are busy making other plans.&lt;br /&gt; &amp;#8211;John Lennon&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Dall&amp;#8217;altra abbiamo certi &amp;#8220;agilisti&amp;#8221; (partigiani) che aborriscono qualsiasi forma di pianificazione e preferiscono lanciarsi nella codifica &amp;#8220;lasciando che il design si riveli ed evolva da sè grazie ai test&amp;#8221;. Uhm&amp;#8230;&lt;/p&gt;

&lt;p&gt;Come fa notare &lt;a href='http://blog.objectmentor.com/articles/2009/04/25/the-scatology-of-agile-architecture' title='The Scatology of Agile Architecture'&gt;Uncle Bob&lt;/a&gt;, in questa situazione come in tantissime altre, &lt;strong&gt;la verità sta nel mezzo&lt;/strong&gt;. Un pò di pianificazione all&amp;#8217;inizio (senza arrivare agli estremi del BDUF), permette di capire meglio il problema e impostare una soluzione decente, senza rischiare di ficcarsi in un vicolo cieco da cui è molto difficile uscire.&lt;/p&gt;

&lt;p&gt;Inoltre ci sono determinate cose che &lt;strong&gt;devono&lt;/strong&gt; essere fissate up-front. Ad esempio, io mi sono ritrovato a lavorare ad un progetto di un sistema &lt;em&gt;distribuito&lt;/em&gt; di simulazione, composto da diversi moduli che comunicavano in modo concorrente e tramite rete, ognuno progettato e realizzato da una parte del nostro team. E&amp;#8217; stato necessario definire:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;architettura generale&lt;/li&gt;

&lt;li&gt;interfacce di comunicazione&lt;/li&gt;

&lt;li&gt;tipi di dato condivisi&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Senza definire queste cose a priori non saremmo riusciti a lavorare in parallelo e ci saremmo pestati i piedi a vicenda rallentando l&amp;#8217;intero progetto.&lt;/p&gt;

&lt;h1 id='management'&gt;Management&lt;/h1&gt;

&lt;p&gt;Lo stesso concetto vale a livello di management, come ho verificato sulla mia pelle.&lt;/p&gt;

&lt;p&gt;Anche qui si presenta il concetto di &lt;em&gt;self-organizing team&lt;/em&gt;, ma è comunque necessario stabilire delle linee guida e delle regole (meglio se condivise e adottate su base consensuale), che andranno sì modificate e integrate &amp;#8220;in corsa&amp;#8221;, ma che sono comunque necessarie per una &lt;a href='/metaprogramming/2009/05/30/importanza-di-comunicare.html'&gt;comunicazione efficace&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Avere un piano a livello di management significa poter &lt;strong&gt;identificare le priorità&lt;/strong&gt; (&lt;em&gt;infrastruttura&lt;/em&gt;, &lt;em&gt;interfacce&lt;/em&gt;, user stories, ecc.), poter allocare risorse, pianificare costi e tempi di massima (ad esempio: &lt;em&gt;project velocity&lt;/em&gt; di &lt;a href='http://www.extremeprogramming.org/'&gt;XP&lt;/a&gt;) e &lt;strong&gt;coordinare il team&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;C&amp;#8217;è un modo per affrontare con successo anche il progetto più gigantesco e complesso: &lt;strong&gt;fare un passo alla volta&lt;/strong&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;A&lt;/strong&gt;: &amp;#8220;voglio un di sistema di elaborazione di dati scientifici che si appoggia su CUDA pronto tra quattro mesi&amp;#8221;&lt;/li&gt;

&lt;li&gt;&lt;strong&gt;B&lt;/strong&gt;: &amp;#8220;comincia a studiare CUDA per una settimana e fai qualche prototipo, poi faremo un meeting per buttare giù qualche bozza di architettura e stimare i costi&amp;#8221;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Quale delle due alternative ti motiva di più ed è più utile?&lt;/p&gt;

&lt;h1 id='conclusione'&gt;Conclusione&lt;/h1&gt;

&lt;p&gt;Sia in ambito tecnologico che in ambito gestionale occorre trovare un equilibrio tra &lt;em&gt;pianificazione&lt;/em&gt; e &lt;em&gt;auto-organizzazione&lt;/em&gt;, perchè ognuno dei due elementi è necessario alla buona riuscita di un progetto e di un team di sviluppo.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/ManuelPaccagnella/~4/fecys8PAh6w" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://manuelp.github.com/management/2009/06/02/l-importanza-della-pianificazione.html</feedburner:origLink></entry>
 
 <entry>
   <title>L'importanza di comunicare</title>
   <link href="http://feedproxy.google.com/~r/ManuelPaccagnella/~3/5n-BRLmtJyk/importanza-di-comunicare.html" />
   <updated>2009-05-30T00:00:00-07:00</updated>
   <id>http://manuelp.github.com/metaprogramming/2009/05/30/importanza-di-comunicare</id>
   <content type="html">&lt;p&gt;Non basta avere una buona idea, bisogna anche saperla &amp;#8220;vendere&amp;#8221;. C&amp;#8217;è una concezione comune secondo cui &amp;#8220;una buona idea si vende da sola&amp;#8221; ma purtroppo non è sempre vero: basta guardarsi attorno per vedere delle &lt;em&gt;ottime&lt;/em&gt; idee che non hanno riscosso un grande successo a causa di una &amp;#8220;cattiva campagna di marketing&amp;#8221;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Una buona idea è un&amp;#8217;orfana senza una comunicazione efficace.&lt;br /&gt; &amp;#8211; &amp;#8220;The Pragmatic Programmer&amp;#8221;, Andrew Hunt, David Thomas&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Inoltre spendiamo buona parte delle nostre giornate comunicando (memo, email, discussioni con colleghi e management, interviste col committente, proposte di miglioramento, ecc.) per cui vale la pena farlo bene.&lt;/p&gt;

&lt;p&gt;Personalmente mi sono trovato in molte situazioni in cui ho dovuto fare attenzione al modo in cui comunicavo per sostenere la validità del mio punto di vista. Ad esempio quando ho proposto il VCS Mercurial al team con il quale ho sviluppato un progetto all&amp;#8217;università per ingegneria del software, o tutte le volte che abbiamo fatto delle presentazioni ai docenti del medesimo corso.&lt;/p&gt;

&lt;h1 id='come_comunicare_efficacemente'&gt;Come comunicare efficacemente&lt;/h1&gt;

&lt;p&gt;In &amp;#8220;The Pragmatic Programmer&amp;#8221; gli autori dedicano un capitolo a come comunicare efficacemente, in cui danno alcuni consigli che applicherò ai post di questo stesso blog e che riassumo qui.&lt;/p&gt;

&lt;h2 id='sapere_cosa_dire'&gt;Sapere cosa dire&lt;/h2&gt;

&lt;p&gt;Punto fondamentale e ovvio, ma troppo spesso ci si ritrova a digitare &amp;#8220;Introduzione&amp;#8221; e a cominciare a scrivere senza avere un&amp;#8217;idea precisa di quello che si vuole comunicare.&lt;/p&gt;

&lt;p&gt;E&amp;#8217; utile quindi &lt;strong&gt;pianificare&lt;/strong&gt; quello che si vuole dire, ad esempio scrivendo un&amp;#8217;&lt;em&gt;outline&lt;/em&gt; e modificandola finché la risposta alla domanda &amp;#8220;questo comunica quello che sto cercando di dire?&amp;#8221; è sì.&lt;/p&gt;

&lt;h2 id='adattare_il_messaggio_allaudience'&gt;Adattare il messaggio all&amp;#8217;audience&lt;/h2&gt;

&lt;p&gt;Ogni idea può essere presentata in modi diversi a seconda dell&amp;#8217;audience: ve ne sono di diverse con bisogni, interessi e capacità differenti. E&amp;#8217; quindi importante personalizzare il messaggio affinché sia recepito correttamente da chi sta ascoltando.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;We&amp;#8217;ve all sat in meetings where a development geek glazes over the eyes of the vice president of marketing with a long monologue on the merits of some arcane technology. This isn&amp;#8217;t communicating: it&amp;#8217;s just talking, and it&amp;#8217;s annoying.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Occorre avere una chiara idea di chi ascolterà il nostro messaggio e delle sue caratteristiche. Le seguenti domande possono aiutare:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Che cosa vuoi che imparino?&lt;/li&gt;

&lt;li&gt;Qual&amp;#8217;è il loro interesse in quello che hai da dire?&lt;/li&gt;

&lt;li&gt;Quanto sono sofisticati?&lt;/li&gt;

&lt;li&gt;Quanti dettagli vogliono?&lt;/li&gt;

&lt;li&gt;Chi vuoi che faccia propria l&amp;#8217;informazione?&lt;/li&gt;

&lt;li&gt;Come puoi motivarli ad ascoltarti?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Inoltre occorre adottare uno &lt;strong&gt;stile di comunicazione&lt;/strong&gt; adatto. L&amp;#8217;interlocutore preferisce andare dritto ai fatti oppure conversare? Preferisce uno stile formale o uno più sciolto?&lt;/p&gt;

&lt;p&gt;Capire queste cose è importante per far recepire al meglio il messaggio.&lt;/p&gt;

&lt;h2 id='scegliere_il_momento_giusto'&gt;Scegliere il momento giusto&lt;/h2&gt;

&lt;p&gt;Non ogni momento è il momento giusto. L&amp;#8217;interlocutore può avere fretta, altro da fare o semplicemente può non essere dell&amp;#8217;umore giusto. Una parte del capire le esigente dell&amp;#8217;audience consiste nel capire le loro priorità, nel dubbio è sempre meglio chiedere: &lt;em&gt;&amp;#8220;è un buon momento per parlarti di &amp;#8230;?&amp;#8221;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Questo, almeno in un blog, non è un problema visto la natura intrinsecamente on-demand del mezzo di comunicazione :)&lt;/p&gt;

&lt;h2 id='cura_lapparenza'&gt;Cura l&amp;#8217;apparenza&lt;/h2&gt;

&lt;p&gt;E&amp;#8217; uno sbaglio fare affidamento solo sul contenuto di un documento senza badare alla presentazione. L&amp;#8217;aspetto è una caratteristica importante che concorre a veicolare efficacemente un&amp;#8217;idea. &lt;strong&gt;Contenuto e aspetto devono essere curati in sinergia.&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;TIP 10:&lt;/strong&gt; &amp;#8220;It&amp;#8217;s Both What You Say and the Way You Say It&amp;#8221;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Alcuni suggerimenti per documenti:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;usa un sistema di impaginazione che produca risultati gradevoli: ad esempio &lt;a href='http://www.latex-project.org/' title='Homepage del LaTeX Project'&gt;LaTeX&lt;/a&gt;, XHTML+CSS con eventualmente qualche exporter in PDF come &lt;a href='http://xmlgraphics.apache.org/fop/' title='Apache FOP'&gt;FOP&lt;/a&gt;, &lt;a href='http://www.docbook.org/' title='DocBook: The Definitive Guide'&gt;DocBook&lt;/a&gt;, o anche qualche word-processor che supporti gli stylesheets.&lt;/li&gt;

&lt;li&gt;usa lo &lt;em&gt;spell-checking&lt;/em&gt;, prima automatico e poi manualmente (verifica &lt;em&gt;walkthrough&lt;/em&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;
&lt;h2 id='coinvolgi_laudience'&gt;Coinvolgi l&amp;#8217;audience&lt;/h2&gt;

&lt;p&gt;Un altro suggerimento (che non ho mai impiegato, mea culpa) è quello di coinvolgere gli interlocutori nel processo di produzione del documento per raccogliere feedback e instaurare una proficua relazione di lavoro.&lt;/p&gt;

&lt;p&gt;Cosa che sembra abbia funzionato tra l&amp;#8217;altro per la produzione di libri interi come &lt;a href='http://book.realworldhaskell.org/' title='Real World Haskell'&gt;Real World Haskell&lt;/a&gt; e &lt;a href='http://programming-scala.labs.oreilly.com/'&gt;Programming Scala&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Ragione per cui ho adottato questo approccio per il presente blog: nonostante il suo aspetto/layout sia ancora un work-in-progress è online e il &lt;a href='http://github.com/manuelp/manuelp.github.com/tree/master'&gt;repository&lt;/a&gt; dei suoi sorgenti è liberamente accessibile (in lettura) e pubblicato con licenza &lt;a href='http://creativecommons.org/licenses/by-sa/2.5/it/' title='CC 2.5 Attribution-Share Alike'&gt;CreativeCommons&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Inoltre, nel caso di comunicazioni verbali è utile trasformare l&amp;#8217;esposizione in una sessione interattiva, ad esempio facendo domande e chiedendo di riassumere quello che si è appena detto.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/ManuelPaccagnella/~4/5n-BRLmtJyk" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://manuelp.github.com/metaprogramming/2009/05/30/importanza-di-comunicare.html</feedburner:origLink></entry>
 
 <entry>
   <title>Desktop-search in KDE 4.2</title>
   <link href="http://feedproxy.google.com/~r/ManuelPaccagnella/~3/78vBqt8mgms/desktop-search-kde4.html" />
   <updated>2009-05-27T00:00:00-07:00</updated>
   <id>http://manuelp.github.com/amministrazione/2009/05/27/desktop-search-kde4</id>
   <content type="html">&lt;p&gt;Da parte mia, una volta provata la funzionalità di &lt;em&gt;desktop search&lt;/em&gt; è diventata irrinunciabile. E&amp;#8217; un utilissimo strumento per utilizzare il proprio computer con &lt;em&gt;efficienza&lt;/em&gt; e significa avere tutti i propri dati e applicazioni letteralmente a portata di dita.&lt;/p&gt;

&lt;p&gt;Niente più gerarchie di cartelle annidate e menu incastrati uno dentro l&amp;#8217;altro come una matrioska. I dati memorizzati nel computer vengono indicizzati da un motore di ricerca e ogni file è raggiungibile non solo ricercando il suo nome, ma anche il suo contenuto. Possiamo aprire documenti, filmati, musica, applicazioni e chi più ne ha più ne metta in pochi secondi e dovunque si trovino su disco.&lt;/p&gt;

&lt;p&gt;I vantaggi sono innegabili: io per esempio mi sono sempre trovato a dover gestire molti file (la maggior parte dei quali inutili) e a concepire sempre nuovi sistemi di archiviazione. Con il desktop search posso mettere tutto dentro una sola cartella (ad esempio &amp;#8220;Archivio&amp;#8221;) e raggiungere qualsiasi file al suo interno non appena ne ho bisogno, senza dover navigare alcuna gerarchia.&lt;/p&gt;

&lt;h1 id='piattaforme'&gt;Piattaforme&lt;/h1&gt;

&lt;p&gt;Per MacOS abbiamo il migliore (mi dicono): &lt;a href='http://quicksilver.en.softonic.com/mac'&gt;Quicksilver&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Per Windows ci sono &lt;a href='http://desktop.google.com/it/'&gt;Google Desktop&lt;/a&gt; e &lt;a href='http://www.launchy.net/'&gt;Launchy&lt;/a&gt; (meno sofisticato di Google Deskop).&lt;/p&gt;

&lt;p&gt;Su piattaforma Linux, per Gnome c&amp;#8217;è &lt;a href='http://do.davebsd.com/'&gt;GNOME Do&lt;/a&gt; e, per KDE, &lt;a href='http://nepomuk.semanticdesktop.org/'&gt;Nepomuk&lt;/a&gt; con il suo Strigi.&lt;/p&gt;

&lt;h1 id='usare_nepomuk_con_ubuntu_904'&gt;Usare Nepomuk con Ubuntu 9.04&lt;/h1&gt;

&lt;p&gt;Sfortunatamente Nepomuk non è ancora pronto per un&amp;#8217;utilizzo di produzione e attualmente è abilitabile con facilità solo il &lt;em&gt;rating&lt;/em&gt; e le annotazioni per i file.&lt;/p&gt;

&lt;p&gt;Nonostante questo, con qualche passaggio manuale possiamo abilitare anche il motore di indicizzazione (Strigi), che poi potremo utilizzare con &lt;em&gt;Dolphin&lt;/em&gt; o &lt;em&gt;krunner&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Ecco i passaggi necessari:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Installare il backend di Strigi &lt;em&gt;sesame&lt;/em&gt;:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;sudo aptitude install soprano-backend-sesame&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;Attenzione&lt;/strong&gt;: sarà necessario installare anche la la JRE!&lt;/p&gt;
&lt;/li&gt;

&lt;li&gt;
&lt;p&gt;Aprire il pannello:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;System Settings &amp;gt; Advanced &amp;gt; Desktop Search&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;attivare &lt;em&gt;&amp;#8220;Enable Nepomuk Semantic Desktop&amp;#8221;&lt;/em&gt; e &lt;strong&gt;disabilitare&lt;/strong&gt; &lt;em&gt;&amp;#8220;Enable Strigi Desktop File Indexer&amp;#8221;&lt;/em&gt;.&lt;/p&gt;
&lt;/li&gt;

&lt;li&gt;
&lt;p&gt;Eliminare i dati correnti di Nepomuk:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;rm -Rf ~/.kde/share/apps/nepomuk&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;

&lt;li&gt;
&lt;p&gt;Configurare Strigi per usare il backend sesame nel file:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;~/.kde/share/config/nepomukserverrc&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;e modificando la linea del backend nella sezione &lt;em&gt;[main Settings]&lt;/em&gt; come segue:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;Used Soprano Backend=sesame2&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;

&lt;li&gt;
&lt;p&gt;Sfortunatamente, in Ubuntu Jaunty Jackalope sesame è linkato al file &lt;em&gt;libjvm.so&lt;/em&gt;, che però viene cercato nella posizione standard &lt;em&gt;/usr/lib&lt;/em&gt; quando invece in Ubuntu si trova in un&amp;#8217;altra posizione:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;locate libjvm.so&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;nel mio caso:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;/usr/lib/gcj-4.2-81/libjvm.so
/usr/lib/gcj-4.3-90/libjvm.so
/usr/lib/jvm/java-1.5.0-gcj-4.3-1.5.0.0/jre/lib/i386/client/libjvm.so
/usr/lib/jvm/java-1.5.0-gcj-4.3-1.5.0.0/jre/lib/i386/server/libjvm.so
/usr/lib/jvm/java-6-openjdk/jre/lib/i386/cacao/libjvm.so
/usr/lib/jvm/java-6-openjdk/jre/lib/i386/client/libjvm.so
/usr/lib/jvm/java-6-openjdk/jre/lib/i386/server/libjvm.so
/usr/lib/jvm/java-6-sun-1.6.0.13/jre/lib/i386/client/libjvm.so
/usr/lib/jvm/java-6-sun-1.6.0.13/jre/lib/i386/server/libjvm.so&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;basta fare un link alla libreria &lt;em&gt;server&lt;/em&gt; in /usr/lib, ad esempio:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;ln -s  /usr/lib/jvm/java-6-openjdk/jre/lib/i386/server/libjvm.so \
/usr/lib/libjvm.so&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;

&lt;li&gt;
&lt;p&gt;Tornare nel pannello &amp;#8220;System Settings&amp;#8221; nella sezione &amp;#8220;Desktop Search&amp;#8221; (vedi punto 2), e nella tab &amp;#8220;Advanced Settings&amp;#8221; selezionare quali directory far indicizzare da Strigi.&lt;/p&gt;
&lt;/li&gt;

&lt;li&gt;
&lt;p&gt;Abilitare Nepomuk e Strigi.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;A questo punto dovrebbe comparire l&amp;#8217;icona di Nepomuk nella task-list: ciò vuol dire che è partita l&amp;#8217;indicizzazione.&lt;/p&gt;

&lt;h1 id='uso_di_nepomuk'&gt;Uso di Nepomuk&lt;/h1&gt;

&lt;p&gt;Il modo più semplice e diretto per usare Nepomuk è con &lt;em&gt;krunner&lt;/em&gt;: &lt;strong&gt;Alt+F2&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Nell&amp;#8217;area di inserimento che compare al centro dello schermo si possono:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;lanciare applicazioni&lt;/li&gt;

&lt;li&gt;cercare in contatti, bookmarks, file, documenti recenti, cronologia di navigazione&lt;/li&gt;

&lt;li&gt;eseguire calcoli&lt;/li&gt;

&lt;li&gt;esplorare certe cartelle con dolphin&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;E altro ancora, il tutto scrivendone il nome o anche una parte (krunner effettua il pattern matching).&lt;/p&gt;

&lt;p&gt;krunner funziona anche senza Nepomuk e Strigi, ma con questi ultimi possiamo anche cercare &lt;em&gt;all&amp;#8217;interno&lt;/em&gt; dei propri file, con tutti i vantaggi che questo comporta.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/ManuelPaccagnella/~4/78vBqt8mgms" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://manuelp.github.com/amministrazione/2009/05/27/desktop-search-kde4.html</feedburner:origLink></entry>
 
 <entry>
   <title>Hello world!</title>
   <link href="http://feedproxy.google.com/~r/ManuelPaccagnella/~3/NkLHRSsvPIM/hello-world.html" />
   <updated>2009-05-19T00:00:00-07:00</updated>
   <id>http://manuelp.github.com/blog/2009/05/19/hello-world</id>
   <content type="html">&lt;p&gt;Ecco il primo post di questo mio nuovo blog! Finalmente mi sono deciso ad aprirlo, utilizzando il servizio &lt;a href='http://pages.github.com/'&gt;GitHub Pages&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Si parte con un design molto minimale, creato a partire da quello di &lt;a href='http://github.com/mojombo/'&gt;Tom Preston-Werner&lt;/a&gt;, il creatore di &lt;a href='http://github.com/mojombo/jekyll'&gt;Jekyll&lt;/a&gt; e co-fondatore di &lt;a href='http://github.com'&gt;GitHub&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Gli scopi di questo blog sono molteplici:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Per imparare qualcosa non basta leggere: metterlo in pratica e cercare di &lt;a href='http://www.markhneedham.com/blog/2009/04/21/learning-through-teaching/'&gt;insegnarlo&lt;/a&gt; è uno dei metodi migliori per apprendere. Quindi questo è un posto in cui insegno prima di tutto a me stesso, e poi rendo anche disponibili questi lavori per aiutare che volesse intraprendere la stessa strada&lt;/li&gt;

&lt;li&gt;Per condividere esperienze e instaurare dialoghi con persone che lavorano nel mio stesso campo&lt;/li&gt;

&lt;li&gt;Last but not least, fare un pò di pratica con il web-design e pubblicare un sito in una maniera molto comoda e interessante :)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Enjoy!&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/ManuelPaccagnella/~4/NkLHRSsvPIM" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://manuelp.github.com/blog/2009/05/19/hello-world.html</feedburner:origLink></entry>
 
 
</feed>

