<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>SlashCode &#187; Guide</title>
	<atom:link href="http://davideaversa.it/slashcode/category/guide/feed/" rel="self" type="application/rss+xml" />
	<link>http://davideaversa.it/slashcode</link>
	<description></description>
	<lastBuildDate>Thu, 03 May 2012 14:28:53 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.2</generator>
		<item>
		<title>Oltre Java: Ceylon</title>
		<link>http://davideaversa.it/slashcode/2012/04/oltre-java-ceylon/</link>
		<comments>http://davideaversa.it/slashcode/2012/04/oltre-java-ceylon/#comments</comments>
		<pubDate>Fri, 13 Apr 2012 11:50:39 +0000</pubDate>
		<dc:creator>THeK3nger</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[TheSlashCodeProject]]></category>
		<category><![CDATA[C]]></category>
		<category><![CDATA[ceylon]]></category>
		<category><![CDATA[java]]></category>

		<guid isPermaLink="false">http://davideaversa.it/slashcode/?p=811</guid>
		<description><![CDATA[<div><a href="http://davideaversa.it/slashcode/2012/04/oltre-java-ceylon/"><img title="Oltre Java: Ceylon" src="http://davideaversa.it/slashcode/wp-content/uploads/2012/04/ceylon_icon_128px.png" alt="Oltre Java: Ceylon"  width="200" height="200" /></a></div><br/>Chi mi conosce sa bene il mio rapporto di amore-odio con Java. Amore perché Java è un linguaggio performante, di alto livello e soprattutto portabile. L&#8217;ho usato spesso, lo uso tutt&#8217;ora e ci ho fatto addirittura del game development. Odio perché, proprio perché ci ho combattuto tanto, ne conosco tutti i difetti, i limiti e <a href='http://davideaversa.it/slashcode/2012/04/oltre-java-ceylon/' class='excerpt-more'>[...]</a>]]></description>
			<content:encoded><![CDATA[<div style="height:33px;" class="really_simple_share robots-nocontent snap_nopreview"><div class="really_simple_share_facebook_like" style="width:100px;"><iframe src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fdavideaversa.it%2Fslashcode%2F2012%2F04%2Foltre-java-ceylon%2F&amp;layout=button_count&amp;show_faces=false&amp;width=100&amp;action=like&amp;colorscheme=light&amp;send=false&amp;height=27" 
						scrolling="no" frameborder="0" style="border:none; overflow:hidden; width:100px; height:27px;" allowTransparency="true"></iframe></div><div class="really_simple_share_google1" style="width:90px;"><div class="g-plusone" data-size="medium" data-href="http://davideaversa.it/slashcode/2012/04/oltre-java-ceylon/" ></div></div><div class="really_simple_share_twitter" style="width:110px;"><a href="http://twitter.com/share" class="twitter-share-button" data-count="horizontal" 
						data-text="Oltre Java: Ceylon" data-url="http://davideaversa.it/slashcode/2012/04/oltre-java-ceylon/" 
						data-via=""  ></a></div></div>
		<div style="clear:both;"></div><p>Chi mi conosce sa bene il mio rapporto di amore-odio con <strong>Java</strong>. <strong>Amore perché</strong> Java è un linguaggio performante, di alto livello e soprattutto portabile. L&#8217;ho usato spesso, lo uso tutt&#8217;ora e ci ho fatto addirittura del game development. <strong>Odio perché</strong>, proprio perché ci ho combattuto tanto, ne conosco tutti i difetti, i limiti e le idiosincrasie. Java è sintatticamente prolisso e ha qualche problema di &#8220;vecchiaia&#8221; che andrebbe risolto (ed <a href="http://en.wikipedia.org/wiki/Comparison_of_C_Sharp_and_Java">il confronto con C# è impietoso</a>). <span id="more-811"></span></p>
<p>Giusto per fare un esempio in Java è abitudine leggere (o scrivere) codice raccapricciante quale</p>
<div class="codecolorer-container text dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">foo.setAttributeX(bar.getAttributeY());</div></div>
<p>che in C# si risolve con un semplice</p>
<div class="codecolorer-container text dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">foo.X = bar.Y;</div></div>
<p>Qualcuno considererà questa caratteristica (tecnicamente si parla di <em>Accessor</em> e <em>Mutators</em>) un puro vezzo sintattico, ma quando si lavora con decine e decine di classi vi posso assicurare che questo facilita di un fattore dieci la produttività e la manutenibilità del codice. Problemi come questo ed altri più &#8220;concreti&#8221; sono ciò che mi hanno spinto a passare <em>al lato oscuro della forza</em> ogni qualvolta mi è possibile.</p>
<p><img src="http://davideaversa.it/slashcode/wp-content/uploads/2012/04/ceylon_icon_128px.png" alt="" title="Ceylon Icon" width="128" height="128" class="alignleft size-full wp-image-812" /></p>
<p>In attesa che Java venga riformato (sperando nella <a href="ww.theregister.co.uk/2011/10/03/java8_revolution_not_evolution_oracle/">rivoluzionaria (?) versione 8 e 9 del linguaggio</a>) la comunità si è messa in moto in modo autonomo. Uno dei progetti a mio avviso più interessanti è senza dubbio <strong><a href="http://ceylon-lang.org/">Ceylon</a></strong>, di <strong>Red-Hat</strong>.</p>
<p>Ceylon è un linguaggio JVM-based, ovvero che viene compilato generando <em>byte-code</em> compatibile con la Java Virtual Machine. Questo garantisce due vantaggi: il linguaggio sfrutta la portabilità e le ottime performance della JVM ed è potenzialmente compatibile con le librerie Java esistenti.</p>
<p>Ceylon è un linguaggio molto interessante perché non solo alleggerisce Java da tutti gli inutili orpelli sintattici di cui è infestato ma aggiunge anche una sorta di dinamismo opzionale nella gestione delle variabili (tramite il tipo jolly <em>value</em>). Ma facciamo qualche esempio.</p>
<div class="codecolorer-container java dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="java codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">doc <span style="color: #0000ff;">&quot;The classic Hello World program&quot;</span><br />
by <span style="color: #0000ff;">&quot;Gavin&quot;</span><br />
see <span style="color: #009900;">&#40;</span>goodbye<span style="color: #009900;">&#41;</span><br />
<span style="color: #000000; font-weight: bold;">throws</span> <span style="color: #009900;">&#40;</span><a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Aioexception+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span style="color: #003399;">IOException</span></a><span style="color: #009900;">&#41;</span><br />
<span style="color: #000066; font-weight: bold;">void</span> hello<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; value message <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;Hello,<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;World!&quot;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; print<span style="color: #009900;">&#40;</span>message.<span style="color: #006633;">normalized</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #009900;">&#125;</span></div></div>
<p>Come non partire dal mitico <em>&#8220;Hello, World!&#8221;</em>? In realtà non è un &#8220;Hello, World!&#8221; semplice perché ci mostra due nuove caratteristiche del linguaggio. La prima è il modo con cui vengono documentati metodi e classi: niente commenti,  ma una sintassi specifica che può essere letta dal generatore di documentazione integrato di Ceylon. La seconda è il tipo variabile <code class="codecolorer text dawn"><span class="text">value</span></code> che può essere usato per simulare una certa dinamicità del linguaggio. Da notare però che nessuno ci obbliga ad usarlo: se siamo sicuri che la variabile <code class="codecolorer text dawn"><span class="text">message</span></code> sia una stringa possiamo direttamente dichiararla come tale tramite <code class="codecolorer text dawn"><span class="text">String message</span></code>.</p>
<p>Un&#8217;altra funzionalità molto utile è l&#8217;operatore di <em>null check</em>. Vediamolo in azione:</p>
<div class="codecolorer-container java dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="java codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Astring+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span style="color: #003399;">String</span></a> shoutedGreeting <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;HELLO, &quot;</span> <span style="color: #339933;">+</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; name<span style="color: #339933;">?</span>.<span style="color: #006633;">uppercased</span> <span style="color: #339933;">?</span> <span style="color: #0000ff;">&quot;WORLD&quot;</span><span style="color: #339933;">;</span></div></div>
<p>In questo esempio troviamo i due operatori in azione. Il primo è l&#8217;operatore <strong>&#8220;?&#8221;</strong>. Considerando il codice precedente, tale operatore restituisce <code class="codecolorer text dawn"><span class="text">name.uppercased</span></code> se e solo se quest&#8217;ultimo è diverso da <code class="codecolorer text dawn"><span class="text">null</span></code>, altrimenti restituisce il valore che lo segue (in questo caso la stringa &#8220;WORLD&#8221;). L&#8217;altro operatore nell&#8217;esempio è <strong>&#8220;?.&#8221;</strong>. Quest&#8217;ultimo fa in modo che si acceda alla funzione/attributo <code class="codecolorer text dawn"><span class="text">uppercased</span></code> se e solo se <code class="codecolorer text dawn"><span class="text">name</span></code> è diverso da <code class="codecolorer text dawn"><span class="text">null</span></code>. Questi due operatori ci risparmiano quindi tutta una serie di noiosi &#8220;if&#8221; annidati!</p>
<p>Le caratteristiche di Ceylon sono numerosissime e per maggiori informazioni vi rimando alla loro <a href="http://ceylon-lang.org/documentation/1.0/tour/basics/">pagina ufficiale</a>. Ceylon è ancora in fase di sviluppo ma è già possibile scaricare delle versioni preliminari!</p>
<p>Come se non bastasse è in progetto lo sviluppo di un backend che compili Ceylon in JavaScript rendendone possibile l&#8217;uso anche per lo sviluppo di applicazioni web.</p>
<p>Insomma, Ceylon è un progetto che vi consiglio caldamente di tenere d&#8217;occhio! </p>
 <p><a href="http://davideaversa.it/slashcode/?flattrss_redirect&amp;id=811&amp;md5=3517c61620eabb35afb16675110a175d" title="Flattr" target="_blank"><img src="http://davideaversa.it/slashcode/wp-content/plugins/flattr/img/flattr-badge-large.png" alt="flattr this!"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://davideaversa.it/slashcode/2012/04/oltre-java-ceylon/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		<atom:link rel="payment" href="https://flattr.com/submit/auto?user_id=thek3nger&amp;popout=1&amp;url=http%3A%2F%2Fdavideaversa.it%2Fslashcode%2F2012%2F04%2Foltre-java-ceylon%2F&amp;language=it_IT&amp;category=text&amp;title=Oltre+Java%3A+Ceylon&amp;description=Chi+mi+conosce+sa+bene+il+mio+rapporto+di+amore-odio+con+Java.+Amore+perch%C3%A9+Java+%C3%A8+un+linguaggio+performante%2C+di+alto+livello+e+soprattutto+portabile.+L%26%238217%3Bho+usato+spesso%2C+lo+uso...&amp;tags=C%2Cceylon%2Cjava%2Cblog" type="text/html" />
	</item>
		<item>
		<title>Tre motivi per cui preferisco i linguaggi statici</title>
		<link>http://davideaversa.it/slashcode/2012/04/tre-motivi-per-cui-preferisco-i-linguaggi-statici/</link>
		<comments>http://davideaversa.it/slashcode/2012/04/tre-motivi-per-cui-preferisco-i-linguaggi-statici/#comments</comments>
		<pubDate>Tue, 03 Apr 2012 15:07:35 +0000</pubDate>
		<dc:creator>THeK3nger</dc:creator>
				<category><![CDATA[Guide]]></category>
		<category><![CDATA[programmazione]]></category>
		<category><![CDATA[tipizzazione dinamica]]></category>
		<category><![CDATA[tipizzazione statica]]></category>

		<guid isPermaLink="false">http://davideaversa.it/slashcode/?p=808</guid>
		<description><![CDATA[<div><a href="http://davideaversa.it/slashcode/2012/04/tre-motivi-per-cui-preferisco-i-linguaggi-statici/"><img title="Tre motivi per cui preferisco i linguaggi statici" src="http://davideaversa.it/slashcode/wp-content/uploads/2012/04/ducktyping.jpeg" alt="Tre motivi per cui preferisco i linguaggi statici"  width="200" height="166" /></a></div><br/>Ogni tanto mi capita di trovarmi immischiato nella discussione che da anni tormenta programmatori e informatici di ogni nazione ed etnia: meglio usare un linguaggio tipizzato dinamicamente o staticamente? Senza pretese di scientificità o di dogma o di starvi a rivelare chissà quale verità arcana nascosta, vi dirò la mia sull&#8217;argomento. Innanzitutto sappiate che sulla <a href='http://davideaversa.it/slashcode/2012/04/tre-motivi-per-cui-preferisco-i-linguaggi-statici/' class='excerpt-more'>[...]</a>]]></description>
			<content:encoded><![CDATA[<div style="height:33px;" class="really_simple_share robots-nocontent snap_nopreview"><div class="really_simple_share_facebook_like" style="width:100px;"><iframe src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fdavideaversa.it%2Fslashcode%2F2012%2F04%2Ftre-motivi-per-cui-preferisco-i-linguaggi-statici%2F&amp;layout=button_count&amp;show_faces=false&amp;width=100&amp;action=like&amp;colorscheme=light&amp;send=false&amp;height=27" 
						scrolling="no" frameborder="0" style="border:none; overflow:hidden; width:100px; height:27px;" allowTransparency="true"></iframe></div><div class="really_simple_share_google1" style="width:90px;"><div class="g-plusone" data-size="medium" data-href="http://davideaversa.it/slashcode/2012/04/tre-motivi-per-cui-preferisco-i-linguaggi-statici/" ></div></div><div class="really_simple_share_twitter" style="width:110px;"><a href="http://twitter.com/share" class="twitter-share-button" data-count="horizontal" 
						data-text="Tre motivi per cui preferisco i linguaggi statici" data-url="http://davideaversa.it/slashcode/2012/04/tre-motivi-per-cui-preferisco-i-linguaggi-statici/" 
						data-via=""  ></a></div></div>
		<div style="clear:both;"></div><p>Ogni tanto mi capita di trovarmi immischiato nella discussione che da anni tormenta programmatori e informatici di ogni nazione ed etnia: <strong>meglio usare un linguaggio tipizzato dinamicamente o staticamente?</strong></p>
<p>Senza pretese di scientificità o di dogma o di starvi a rivelare chissà quale verità arcana nascosta, vi dirò la mia sull&#8217;argomento. <span id="more-808"></span> Innanzitutto sappiate che sulla faida statico/dinamico ci sono tonnellate di discussioni filosofiche, euristiche, epistemologiche e tecniche capaci di far impallidire chiunque provi ad avvicinarsi alla questione.</p>
<p><img src="http://davideaversa.it/slashcode/wp-content/uploads/2012/04/ducktyping.jpeg" alt="Esempio di Duck Typing " title="Duck Typing" width="477" height="396" class="aligncenter size-full wp-image-810" /></p>
<p>Celeberrimo è il <em>duck test</em> di <strong>Whitcomb Riley</strong>: <em>&#8220;Quando io vedo un uccello che cammina come un&#8217;anatra, nuota come un&#8217;anatra e starnazza come un&#8217;anatra, io chiamo quell&#8217;uccello &#8220;anatra&#8221;"</em>. Concetto che i sostenitori della tipizzazione dinamica sintetizzano in: guardate la vignetta precedente, se la scritta vi è stata di aiuto allora la tipizzazione statica fa per voi.</p>
<p>In pratica la questione è prettamente filosofica: <strong>l&#8217;identità di un <em>oggetto</em>-barra-<em>valore</em> deve derivare dalle sue caratteristiche o da una specifica esterna?</strong> Ovvero: un&#8217;anatra è un anatra perché vola, nuota, ha le piume, etc&#8230; oppure è un anatra perché dico che è un anatra?</p>
<p>Dal punto di vista della rappresentazione della conoscenza possiamo essere d&#8217;accordo che un oggetto sia identificato dalle sue proprietà, dal punto di vista informatico invece la questione è più spinosa. In informatica tutto è un numero e i numeri non hanno proprietà per natura bensì caratteristiche che nascono dall&#8217;interpretazione che io ne do (tramite l&#8217;assegnazione di un tipo).</p>
<p>Ma chiudendo la parentesi filosofica torniamo all&#8217;atto pratico: perché dovrei scegliere un linguaggio statico rispetto ad un linguaggio dinamico? Non c&#8217;è risposta, serve solo l&#8217;esperienza e il gusto personale. Tuttavia negli ultimi dieci anni ci hanno distrutto l&#8217;anima raccontandoci che i linguaggi statici (C, Java e compari) erano obsoleti e che il futuro era dinamico. Il risultato di questa campagna è che attualmente abbiamo decine di linguaggi dinamici liberi e di ottimo livello (Python, Ruby, PHP e molti altri) e solo un paio di linguaggi statici decenti. Io, da estimatore dei linguaggi statici, vengo qui per raccontarvi le mie personali considerazioni sull&#8217;argomento.</p>
<p><strong>1. Ordine nel caos</strong></p>
<p>Quando mi sono messo ad usare il Python per progetti di media complessità (vedi <a href="http://code.google.com/p/cobra-draughts/">CobraDraughts</a>) ho sempre avuto l&#8217;impressione che tutto era avvolto dal disordine. Il fatto che non bisognava dichiarare da nessuna parte gli attributi di una classe mi inquietava.</p>
<p>Oltre ai miei problemi psicologici però c&#8217;era un comportamento oggettivamente fastidioso: presa la classe A non c&#8217;era verso dalla classe B di sapere durante la digitazione del codice quali attributi avesse e, soprattutto, di che tipo fossero. Questo perché non esiste nessun tipo associato alle variabili di un linguaggio dinamico!</p>
<p>Questo comporta due grossi problemi:</p>
<ul>
<li>Il compilatore è quasi inutile come strumento di correzione degli errori. Se passo una stringa ad una variabile che nell&#8217;intero arco della sua vita <strong>deve</strong> contenere solamente interi non lo vengo a scoprire fino a quando non eseguo quella porzione di codice e il programma muore. Insomma, l&#8217;analisi statica del codice è praticamente nulla. Bisogna armarsi di pazienza e code-coverage ed  eseguire il codice.</li>
<li>L&#8217;overloading di funzioni con lo stesso numero di parametri è un parto greco. Probabilmente non si usano ma il mio cuore ne ha sofferto.</li>
</ul>
<p>A me personalmente tutta questa cosa fa sembrare che il programma si regga su un sottobosco di magia che non apprezzo. Inoltre la stretta maglia dei tipi mi costringe anche a strutturare meglio il codice e ad essere più rigoroso nello sviluppo.</p>
<p><strong>2. Prestazioni</strong></p>
<p>Qui c&#8217;è poco da fare. I linguaggi statici stracciano spesso e volentieri un linguaggio dinamico sul campo prestazionale, sia per il tempo che per la memoria. Ciò è causato semplicemente da tutto l&#8217;overhead necessario a gestire la &#8220;naturalissima&#8221; dinamicità delle variabili. Per alcune applicazioni ciò non è un problema (anche grazie all&#8217;uso di librerie che wrappano codice C) ma per molte altre invece si!</p>
<p>Molti dicono che questo non è un gran problema perché abbiamo macchine sempre più efficienti. Io credo che questo sia come dire che posso ingrassare venti chili perché tanto ho i pantaloni con l&#8217;elastico.</p>
<p><strong>3. Didattica</strong></p>
<p>Un aspetto da non trascurare. Quando mi trovo davanti la solita domanda su quale linguaggio sia meglio per cominciare a programmare, sento che molti consigliano linguaggi come il Python perché sono più semplici. Questo è sicuramente vero, la tipizzazione dinamica permette di trascurare una gran parte di aspetti della programmazione, ma mentre ciò può essere buono per chi già programma, a mio avviso, è un problema per chi comincia. Sarebbe come se un maestro di scacchi mi insegnasse a giocare senza cavalli, alfieri e 4 pedoni perché così è &#8220;più facile&#8221;.</p>
<p>Il risultato di certe politiche è l&#8217;inondazione di brutto codice e la prolificazione di programmi orrendamente progettati. Senza contare i bimbominkia del development che vanno in giro a raccontare che &#8220;il C è inutilmente complesso e fa schifo&#8221; mentre &#8220;il PHP ruleggia&#8221;.</p>
<p>È quindi importante per chi tiene corsi o si vuole avvicinare alla programmazione senza tutta la vicinanza alla macchina del C, di mantenersi almeno all&#8217;inizio sui linguaggi statici (come il Java o il C#) che aiutano a creare quella <em>forma mentis</em> necessaria anche per i linguaggi dinamici.</p>
<p>Inoltre, se ciò non bastasse, è più facile passare dallo statico al dinamico che viceversa. Quindi sul lungo periodo si risparmia anche fatica.</p>
<p><strong>In conclusione:</strong> questi sono i motivi per cui trovo molto molto più divertente lavorare con linguaggi staticamente tipizzati rispetto ai linguaggi dinamicamente tipizzati. Non sono leggi assolute e potete benissimo rispondermi che &#8220;io col Python ho programmato un AI senziente ed è stato facilissimo&#8221;. Ci credo, anche io uso il Python spesso.</p>
<p>Chiudo con una speranza. La speranza che i linguaggi statici vengano riscoperti e portati avanti in modo da avere la stessa scelta che abbiamo oggi con quelli dinamici. Lasciare questo mondo solo al C/C++, allo sgangherato Java e al controverso C# secondo me è una grandissima occasione sprecata.</p>
 <p><a href="http://davideaversa.it/slashcode/?flattrss_redirect&amp;id=808&amp;md5=777bb2d421c30e0936d5dc695bd7dc5b" title="Flattr" target="_blank"><img src="http://davideaversa.it/slashcode/wp-content/plugins/flattr/img/flattr-badge-large.png" alt="flattr this!"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://davideaversa.it/slashcode/2012/04/tre-motivi-per-cui-preferisco-i-linguaggi-statici/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		<atom:link rel="payment" href="https://flattr.com/submit/auto?user_id=thek3nger&amp;popout=1&amp;url=http%3A%2F%2Fdavideaversa.it%2Fslashcode%2F2012%2F04%2Ftre-motivi-per-cui-preferisco-i-linguaggi-statici%2F&amp;language=it_IT&amp;category=text&amp;title=Tre+motivi+per+cui+preferisco+i+linguaggi+statici&amp;description=Ogni+tanto+mi+capita+di+trovarmi+immischiato+nella+discussione+che+da+anni+tormenta+programmatori+e+informatici+di+ogni+nazione+ed+etnia%3A+meglio+usare+un+linguaggio+tipizzato+dinamicamente+o+staticamente%3F+Senza...&amp;tags=programmazione%2Ctipizzazione+dinamica%2Ctipizzazione+statica%2Cblog" type="text/html" />
	</item>
		<item>
		<title>Quick Fix: error while loading shared libraries</title>
		<link>http://davideaversa.it/slashcode/2011/09/quick-fix-error-while-loading-shared-libraries/</link>
		<comments>http://davideaversa.it/slashcode/2011/09/quick-fix-error-while-loading-shared-libraries/#comments</comments>
		<pubDate>Thu, 01 Sep 2011 17:46:17 +0000</pubDate>
		<dc:creator>THeK3nger</dc:creator>
				<category><![CDATA[C/C++]]></category>
		<category><![CDATA[Generale]]></category>
		<category><![CDATA[Guide]]></category>
		<category><![CDATA[librerie]]></category>
		<category><![CDATA[sistema operativo]]></category>

		<guid isPermaLink="false">http://davideaversa.it/slashcode/?p=790</guid>
		<description><![CDATA[Salve a tutti e ben tornati dalle vacanze!Per riprendere un po&#8217; il ritmo con il blog vi propongo dei mini-post che rispondono velocemente ai più comuni problemi di compilazione ed esecuzione di programmi. Il primo problema che risolveremo è il seguente error while loading shared libraries: libXXX.so: cannot open shared object file: No such file <a href='http://davideaversa.it/slashcode/2011/09/quick-fix-error-while-loading-shared-libraries/' class='excerpt-more'>[...]</a>]]></description>
			<content:encoded><![CDATA[<div style="height:33px;" class="really_simple_share robots-nocontent snap_nopreview"><div class="really_simple_share_facebook_like" style="width:100px;"><iframe src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fdavideaversa.it%2Fslashcode%2F2011%2F09%2Fquick-fix-error-while-loading-shared-libraries%2F&amp;layout=button_count&amp;show_faces=false&amp;width=100&amp;action=like&amp;colorscheme=light&amp;send=false&amp;height=27" 
						scrolling="no" frameborder="0" style="border:none; overflow:hidden; width:100px; height:27px;" allowTransparency="true"></iframe></div><div class="really_simple_share_google1" style="width:90px;"><div class="g-plusone" data-size="medium" data-href="http://davideaversa.it/slashcode/2011/09/quick-fix-error-while-loading-shared-libraries/" ></div></div><div class="really_simple_share_twitter" style="width:110px;"><a href="http://twitter.com/share" class="twitter-share-button" data-count="horizontal" 
						data-text="Quick Fix: error while loading shared libraries" data-url="http://davideaversa.it/slashcode/2011/09/quick-fix-error-while-loading-shared-libraries/" 
						data-via=""  ></a></div></div>
		<div style="clear:both;"></div><p>Salve a tutti e ben tornati dalle vacanze!Per riprendere un po&#8217; il ritmo con il blog vi propongo dei mini-post che rispondono velocemente ai più comuni problemi di compilazione ed esecuzione di programmi.</p>
<p>Il primo problema che risolveremo è il seguente</p>
<div class="codecolorer-container bash dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">error <span style="color: #000000; font-weight: bold;">while</span> loading shared libraries: libXXX.so: cannot open shared object file: No such <span style="color: #c20cb9; font-weight: bold;">file</span> or directory</div></div>
<p>A chi non è capitato almeno una volta nella vita?</p>
<p><span id="more-790"></span></p>
<p><strong>PREMESSA:</strong></p>
<p>Ogni applicazione sul vostro sistema usa delle <strong>librerie</strong>. Una libreria non è altro che un insieme di codice già pronto e compilato che esegue delle funzioni specifiche. Questo permette ad ogni sviluppatore di <em>non reinventare la ruota ogni volta</em> ma di utilizzare il codice già scritto da altri.</p>
<p>Una libreria può essere <strong>statica</strong> (.a) o <strong>dinamica</strong> (.so o .dll su Windows). Nel primo caso la libreria viene inglobata nell&#8217;eseguibile in fase di compilazione, nel secondo invece la libreria è un file separato che viene agganciato all&#8217;eseguibile durante il caricamento del programma da un componente del sistema operativo chiamato <strong>linker dinamico</strong>.</p>
<p>Ovviamente le librerie dinamiche ottimizzano meglio le risorse evitando che del codice uguale venga replicato inutilmente in ogni eseguibile.</p>
<p><strong>CAUSA:</strong></p>
<p>Il messaggio di errore non lascia alcun dubbio: la libreria dinamica non è presente nel sistema o il linker dinamico non riesce a trovarla.</p>
<p><strong>SOLUZIONE:</strong></p>
<p>Se la causa è semplice la soluzione è altrettanto semplice.</p>
<p>Per prima cosa accertiamoci che la libreria sia installata e presente nel nostro sistema. Possiamo verificarlo agilmente con</p>
<p><code class="codecolorer text dawn"><span class="text">locate libXXX.so</span></code></p>
<p>Che restituirà il percorso della libreria.</p>
<p>Se la libreria è stata installata durante la sessione corrente allora dobbiamo forzare l&#8217;aggiornamento del database con</p>
<p><code class="codecolorer text dawn"><span class="text">sudo updatedb</span></code></p>
<p>A questo punto probabilmente la libreria si troverà in un percorso non standard. Non ci resta che aggiungere questo percorso nella lista dei percorsi scandagliati dal linker.</p>
<p>Per fare questo apriamo il file <code class="codecolorer text dawn"><span class="text">/etc/ld.so.conf</span></code> (o creiamo un file nella cartella <code class="codecolorer text dawn"><span class="text">/etc/ld.so.conf.d/</span></code>) e inseriamoci dentro il percorso della libreria, ad esempio:</p>
<p><code class="codecolorer text dawn"><span class="text">/usr/local/lib</span></code>.</p>
<p>A questo punto chiamiamo</p>
<p><code class="codecolorer text dawn"><span class="text">sudo ldconfig</span></code></p>
<p>per aggiornare la cache del linker. </p>
<p>E il gioco è fatto.</p>
 <p><a href="http://davideaversa.it/slashcode/?flattrss_redirect&amp;id=790&amp;md5=73d45dff39a2dba303463570623e8199" title="Flattr" target="_blank"><img src="http://davideaversa.it/slashcode/wp-content/plugins/flattr/img/flattr-badge-large.png" alt="flattr this!"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://davideaversa.it/slashcode/2011/09/quick-fix-error-while-loading-shared-libraries/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		<atom:link rel="payment" href="https://flattr.com/submit/auto?user_id=thek3nger&amp;popout=1&amp;url=http%3A%2F%2Fdavideaversa.it%2Fslashcode%2F2011%2F09%2Fquick-fix-error-while-loading-shared-libraries%2F&amp;language=it_IT&amp;category=text&amp;title=Quick+Fix%3A+error+while+loading+shared+libraries&amp;description=Salve+a+tutti+e+ben+tornati+dalle+vacanze%21Per+riprendere+un+po%26%238217%3B+il+ritmo+con+il+blog+vi+propongo+dei+mini-post+che+rispondono+velocemente+ai+pi%C3%B9+comuni+problemi+di+compilazione+ed...&amp;tags=librerie%2Csistema+operativo%2Cblog" type="text/html" />
	</item>
		<item>
		<title>Python Profiling</title>
		<link>http://davideaversa.it/slashcode/2011/08/python-profiling/</link>
		<comments>http://davideaversa.it/slashcode/2011/08/python-profiling/#comments</comments>
		<pubDate>Wed, 03 Aug 2011 15:09:27 +0000</pubDate>
		<dc:creator>THeK3nger</dc:creator>
				<category><![CDATA[Guide]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[bash]]></category>
		<category><![CDATA[graph]]></category>
		<category><![CDATA[profiling]]></category>
		<category><![CDATA[python]]></category>

		<guid isPermaLink="false">http://davideaversa.it/slashcode/?p=780</guid>
		<description><![CDATA[<div><a href="http://davideaversa.it/slashcode/2011/08/python-profiling/"><img title="Python Profiling" src="http://davideaversa.it/slashcode/wp-content/uploads/2011/08/time-150x150.jpg" alt="Python Profiling"  width="200" height="200" /></a></div><br/>Dato che non c'è un unico strumento adatto ho deciso di spiegare passo passo come ottenere dei dati di profiling veloci, puliti e graficamente guardabili.]]></description>
			<content:encoded><![CDATA[<div style="height:33px;" class="really_simple_share robots-nocontent snap_nopreview"><div class="really_simple_share_facebook_like" style="width:100px;"><iframe src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fdavideaversa.it%2Fslashcode%2F2011%2F08%2Fpython-profiling%2F&amp;layout=button_count&amp;show_faces=false&amp;width=100&amp;action=like&amp;colorscheme=light&amp;send=false&amp;height=27" 
						scrolling="no" frameborder="0" style="border:none; overflow:hidden; width:100px; height:27px;" allowTransparency="true"></iframe></div><div class="really_simple_share_google1" style="width:90px;"><div class="g-plusone" data-size="medium" data-href="http://davideaversa.it/slashcode/2011/08/python-profiling/" ></div></div><div class="really_simple_share_twitter" style="width:110px;"><a href="http://twitter.com/share" class="twitter-share-button" data-count="horizontal" 
						data-text="Python Profiling" data-url="http://davideaversa.it/slashcode/2011/08/python-profiling/" 
						data-via=""  ></a></div></div>
		<div style="clear:both;"></div><p><a href="http://davideaversa.it/slashcode/wp-content/uploads/2011/08/time.jpg"><img src="http://davideaversa.it/slashcode/wp-content/uploads/2011/08/time-150x150.jpg" alt="" title="Time" width="150" height="150" class="alignleft size-thumbnail wp-image-781" /></a></p>
<p>Durante lo sviluppo di Cobra Draugths ho avuto la necessità di trovare un profiler per Python che facesse al caso mio. Dato che non c&#8217;è un unico strumento adatto ho deciso di spiegare passo passo come ottenere dei dati di profiling veloci, puliti e graficamente guardabili.</p>
<p>È una guida espressa: niente discussioni, niente commenti, solo fatti e procedure.</p>
<p><span id="more-780"></span></p>
<p><strong>1. cProfile</strong></p>
<p>Primo passo. Installare i tool di profiling per python.</p>
<div class="codecolorer-container bash dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #c20cb9; font-weight: bold;">sudo</span> <span style="color: #c20cb9; font-weight: bold;">apt-get install</span> python-profiler</div></div>
<p>Supponiamo che il vostro programma/libreria abbia un file che invoca i metodi che volete profilare. Possiamo lanciare il comando</p>
<div class="codecolorer-container bash dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">python <span style="color: #660033;">-m</span> cProfile <span style="color: #660033;">-o</span> output.prof test.py</div></div>
<p>Questo avvierà il file test.py e, una volta terminato, creerà un file output.prof contenente tutte le informazioni di profiling.</p>
<p><strong>2. Esplorare il file</strong></p>
<p>Il modo più semplice per esplorare il file creato è usare il modulo <strong>pstats</strong>.</p>
<div class="codecolorer-container bash dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">python <span style="color: #660033;">-m</span> pstats</div></div>
<p>Ci troveremo davanti una shell. Primo comando da dare è</p>
<div class="codecolorer-container bash dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #c20cb9; font-weight: bold;">read</span> output.prof</div></div>
<p>Che carica il file. Dopo di che possiamo ordinarlo per ordine di tempo (prima le funzioni più costose)</p>
<div class="codecolorer-container bash dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #c20cb9; font-weight: bold;">sort</span> <span style="color: #000000; font-weight: bold;">time</span></div></div>
<p>E poi leggere i primi 10 elementi</p>
<div class="codecolorer-container bash dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">stats <span style="color: #000000;">10</span></div></div>
<p><strong>3. Grafo dei tempi</strong></p>
<p>Il modo più elegante, chiaro e stiloso per ottenere un report leggibile è trasformare tutto in un bel grafo colorato. Per fare questo usiamo il tool <a href="http://code.google.com/p/jrfonseca/wiki/Gprof2Dot">Gprof2dot</a>.</p>
<p>Scaricate lo script Python e <em>installatelo</em> con un</p>
<div class="codecolorer-container bash dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #c20cb9; font-weight: bold;">chmod</span> +x gprof2dot.py<br />
<span style="color: #c20cb9; font-weight: bold;">sudo</span> <span style="color: #c20cb9; font-weight: bold;">cp</span> gprof2dot.py <span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>bin<span style="color: #000000; font-weight: bold;">/</span></div></div>
<p>A questo punto createvi uno script bash con questo contenuto:</p>
<div class="codecolorer-container bash dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #666666; font-style: italic;">#!/bin/bash</span><br />
gprof2dot.py <span style="color: #660033;">-f</span> pstats <span style="color: #007800;">$1</span> <span style="color: #000000; font-weight: bold;">|</span> dot <span style="color: #660033;">-Tpng</span> <span style="color: #660033;">-o</span> <span style="color: #007800;">$2</span></div></div>
<p>Chiamatelo, ad esempio, gprof2png. Installatelo alla stessa maniera.</p>
<div class="codecolorer-container bash dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #c20cb9; font-weight: bold;">chmod</span> +x gprof2png<br />
<span style="color: #c20cb9; font-weight: bold;">sudo</span> <span style="color: #c20cb9; font-weight: bold;">cp</span> gprof2png <span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>bin<span style="color: #000000; font-weight: bold;">/</span></div></div>
<p>A questo punto potete lanciarlo semplicemente con</p>
<div class="codecolorer-container bash dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">gprof2png output.prof grafo.png</div></div>
<p>Questo creerà una gradevole immagine png con tutti i dati di vostro interesse. Come esempio posto l&#8217;immagine generata per Cobra Draughts in una partita AI vs. AI.</p>
<p><a href="http://davideaversa.it/slashcode/wp-content/uploads/2011/08/out.png"><img src="http://davideaversa.it/slashcode/wp-content/uploads/2011/08/out-184x300.png" alt="" title="cobra_graph" width="184" height="300" class="aligncenter size-medium wp-image-782" /></a></p>
<p>Buon profiling. </p>
 <p><a href="http://davideaversa.it/slashcode/?flattrss_redirect&amp;id=780&amp;md5=b8ae6e889cb1ba329ccba273365619df" title="Flattr" target="_blank"><img src="http://davideaversa.it/slashcode/wp-content/plugins/flattr/img/flattr-badge-large.png" alt="flattr this!"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://davideaversa.it/slashcode/2011/08/python-profiling/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<atom:link rel="payment" href="https://flattr.com/submit/auto?user_id=thek3nger&amp;popout=1&amp;url=http%3A%2F%2Fdavideaversa.it%2Fslashcode%2F2011%2F08%2Fpython-profiling%2F&amp;language=it_IT&amp;category=text&amp;title=Python+Profiling&amp;description=Durante+lo+sviluppo+di+Cobra+Draugths+ho+avuto+la+necessit%C3%A0+di+trovare+un+profiler+per+Python+che+facesse+al+caso+mio.+Dato+che+non+c%26%238217%3B%C3%A8+un+unico+strumento+adatto+ho...&amp;tags=bash%2Cgraph%2Cprofiling%2Cpython%2Cblog" type="text/html" />
	</item>
		<item>
		<title>Cobra Draughts</title>
		<link>http://davideaversa.it/slashcode/2011/07/cobra-draughts/</link>
		<comments>http://davideaversa.it/slashcode/2011/07/cobra-draughts/#comments</comments>
		<pubDate>Sat, 30 Jul 2011 17:49:28 +0000</pubDate>
		<dc:creator>THeK3nger</dc:creator>
				<category><![CDATA[AI e Neuroscienze]]></category>
		<category><![CDATA[Algoritmica]]></category>
		<category><![CDATA[ai]]></category>
		<category><![CDATA[dama]]></category>
		<category><![CDATA[giochi]]></category>

		<guid isPermaLink="false">http://davideaversa.it/slashcode/?p=778</guid>
		<description><![CDATA[<div><a href="http://davideaversa.it/slashcode/2011/07/cobra-draughts/"><img title="Cobra Draughts" src="http://davideaversa.it/slashcode/wp-content/uploads/2011/07/cobra-150x150.png" alt="Cobra Draughts"  width="200" height="200" /></a></div><br/>Chi mi segue su Google+ o Twitter sa già tutta la storia. Per chi invece non lo fa eccola qui. Un paio di settimane fa stavo pensando a quale progetto portare per l&#8217;esame di Machine Learning. Dopo aver scartato un po&#8217; di idee perché troppo banali e altre perché troppo complesse mi si è accesa <a href='http://davideaversa.it/slashcode/2011/07/cobra-draughts/' class='excerpt-more'>[...]</a>]]></description>
			<content:encoded><![CDATA[<div style="height:33px;" class="really_simple_share robots-nocontent snap_nopreview"><div class="really_simple_share_facebook_like" style="width:100px;"><iframe src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fdavideaversa.it%2Fslashcode%2F2011%2F07%2Fcobra-draughts%2F&amp;layout=button_count&amp;show_faces=false&amp;width=100&amp;action=like&amp;colorscheme=light&amp;send=false&amp;height=27" 
						scrolling="no" frameborder="0" style="border:none; overflow:hidden; width:100px; height:27px;" allowTransparency="true"></iframe></div><div class="really_simple_share_google1" style="width:90px;"><div class="g-plusone" data-size="medium" data-href="http://davideaversa.it/slashcode/2011/07/cobra-draughts/" ></div></div><div class="really_simple_share_twitter" style="width:110px;"><a href="http://twitter.com/share" class="twitter-share-button" data-count="horizontal" 
						data-text="Cobra Draughts" data-url="http://davideaversa.it/slashcode/2011/07/cobra-draughts/" 
						data-via=""  ></a></div></div>
		<div style="clear:both;"></div><p><a href="http://davideaversa.it/slashcode/wp-content/uploads/2011/07/cobra.png"><img src="http://davideaversa.it/slashcode/wp-content/uploads/2011/07/cobra-150x150.png" alt="" title="cobra" width="150" height="150" class="alignleft size-thumbnail wp-image-779" /></a></p>
<p>Chi mi segue su <a href="https://plus.google.com/107808852439129263602/">Google+</a> o <a href="https://twitter.com/thek3nger">Twitter</a> sa già tutta la storia. Per chi invece non lo fa eccola qui.</p>
<p>Un paio di settimane fa stavo pensando a quale progetto portare per l&#8217;esame di <strong>Machine Learning</strong>. Dopo aver scartato un po&#8217; di idee perché troppo banali e altre perché troppo complesse mi si è accesa la lampadina. Ho pensato di progettare un intelligenza artificiale per il gioco della dama in grado di apprendere con l&#8217;esperienza.</p>
<p><span id="more-778"></span></p>
<p>Per l&#8217;apprendimento ho avuto subito le idee chiare: usare gli algoritmi genetici. Il fatto che la dama sia un gioco suggerisce subito un ambiente <em>competitivo</em>. Si fanno sfidare AI con parametri diversi fra loro e si selezionano i migliori, che si fanno riprodurre e di nuovo combattere fra loro. Dopo un certo numero di generazioni si ottiene un AI con i parametri migliori.</p>
<p>A questo punto mancava una grossa parte secondaria del progetto, un motore di gioco. Senza una AI che giochi a dama tutto il resto non è fattibile.</p>
<p>Dopo una ricerca infruttuosa di motori di dama adatti allo scopo ho deciso di farmelo da me. Il motore doveva avere le seguenti caratteristiche:</p>
<ul>
<li>Essere discretamente veloce.</li>
<li>Essere di facile realizzazione per non diventare il collo di bottiglia nello sviluppo dell&#8217;intero progetto.</li>
<li>Offrire la possibilità di variare i parametri di analisi della damiera.</li>
<li>Offrire la possibilità di auto-sfidarsi con due coppie di parametri differenti.</li>
</ul>
<p>Così, dopo qualche giorno di programmazione ho tirato fuori <strong>Cobra Draughts</strong>, un software damistico che soddisfa tutti i requisiti che ho elencato precedentemente. Certo, se l&#8217;avessi scritto in C (bene) sarebbe stato più veloce ma avrei aggiunto una marea di lavoro in più.</p>
<p>Il programma è discretamente performante, in un secondo riesce ad analizzare l&#8217;albero di ricerca fino al 6° livello, tuttavia credo che non lo spingerò oltre al 4° dato che una buona euristica (appresa automaticamente) può compensare i livelli mancanti (o almeno vorrei dimostrare questo).</p>
<p>Potete trovare maggiori informazioni sul progetto nell&#8217;apposita <a href="http://code.google.com/p/cobra-draughts/">pagina google code</a> dove presto metterò anche materiale più tecnico per chi vuole usare il programma a scopo didattico o semplicemente aiutarmi a migliorarlo.</p>
 <p><a href="http://davideaversa.it/slashcode/?flattrss_redirect&amp;id=778&amp;md5=0d0614adfbffed914515cf0e31c69439" title="Flattr" target="_blank"><img src="http://davideaversa.it/slashcode/wp-content/plugins/flattr/img/flattr-badge-large.png" alt="flattr this!"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://davideaversa.it/slashcode/2011/07/cobra-draughts/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		<atom:link rel="payment" href="https://flattr.com/submit/auto?user_id=thek3nger&amp;popout=1&amp;url=http%3A%2F%2Fdavideaversa.it%2Fslashcode%2F2011%2F07%2Fcobra-draughts%2F&amp;language=it_IT&amp;category=text&amp;title=Cobra+Draughts&amp;description=Chi+mi+segue+su+Google%2B+o+Twitter+sa+gi%C3%A0+tutta+la+storia.+Per+chi+invece+non+lo+fa+eccola+qui.+Un+paio+di+settimane+fa+stavo+pensando+a+quale+progetto...&amp;tags=ai%2Cdama%2Cgiochi%2Cblog" type="text/html" />
	</item>
		<item>
		<title>Integrare Git con Eclipse</title>
		<link>http://davideaversa.it/slashcode/2011/07/integrare-git-con-eclipse/</link>
		<comments>http://davideaversa.it/slashcode/2011/07/integrare-git-con-eclipse/#comments</comments>
		<pubDate>Thu, 28 Jul 2011 14:32:05 +0000</pubDate>
		<dc:creator>THeK3nger</dc:creator>
				<category><![CDATA[CVS]]></category>
		<category><![CDATA[eclipse]]></category>
		<category><![CDATA[git]]></category>

		<guid isPermaLink="false">http://davideaversa.it/slashcode/?p=776</guid>
		<description><![CDATA[<div><a href="http://davideaversa.it/slashcode/2011/07/integrare-git-con-eclipse/"><img title="Integrare Git con Eclipse" src="http://davideaversa.it/slashcode/wp-content/uploads/2011/07/egit2-150x150.png" alt="Integrare Git con Eclipse"  width="200" height="200" /></a></div><br/>L&#8217;ultima release di Eclipse (la Indigo) è favolosa. A prima vista non sembra molto diversa dalle precedenti ma la reattività e la stabilità è notevolmente aumentata. Funziona così bene che ho ricominciato ad usarla dimenticandomi dei problemi che mi aveva dato Helios. La prima cosa che ho cercato era l&#8217;integrazione con Git (si, sono innamorato). <a href='http://davideaversa.it/slashcode/2011/07/integrare-git-con-eclipse/' class='excerpt-more'>[...]</a>]]></description>
			<content:encoded><![CDATA[<div style="height:33px;" class="really_simple_share robots-nocontent snap_nopreview"><div class="really_simple_share_facebook_like" style="width:100px;"><iframe src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fdavideaversa.it%2Fslashcode%2F2011%2F07%2Fintegrare-git-con-eclipse%2F&amp;layout=button_count&amp;show_faces=false&amp;width=100&amp;action=like&amp;colorscheme=light&amp;send=false&amp;height=27" 
						scrolling="no" frameborder="0" style="border:none; overflow:hidden; width:100px; height:27px;" allowTransparency="true"></iframe></div><div class="really_simple_share_google1" style="width:90px;"><div class="g-plusone" data-size="medium" data-href="http://davideaversa.it/slashcode/2011/07/integrare-git-con-eclipse/" ></div></div><div class="really_simple_share_twitter" style="width:110px;"><a href="http://twitter.com/share" class="twitter-share-button" data-count="horizontal" 
						data-text="Integrare Git con Eclipse" data-url="http://davideaversa.it/slashcode/2011/07/integrare-git-con-eclipse/" 
						data-via=""  ></a></div></div>
		<div style="clear:both;"></div><p><a href="http://davideaversa.it/slashcode/wp-content/uploads/2011/07/egit2.png"><img src="http://davideaversa.it/slashcode/wp-content/uploads/2011/07/egit2-150x150.png" alt="" title="Egit2" width="150" height="150" class="alignleft size-thumbnail wp-image-777" /></a></p>
<p>L&#8217;ultima release di Eclipse (la Indigo) è favolosa. A prima vista non sembra molto diversa dalle precedenti ma la reattività e la stabilità è notevolmente aumentata. Funziona così bene che ho ricominciato ad usarla dimenticandomi dei problemi che mi aveva dato Helios.</p>
<p>La prima cosa che ho cercato era l&#8217;integrazione con Git (si, sono innamorato).</p>
<p>Bene, la ricerca è stata breve e il risultato è molto soddisfacente: <strong>EGit</strong>. L&#8217;ultima versione di Eclipse include questo plugin nella vasta gamma dei plugin scaricabili. </p>
<p><span id="more-776"></span></p>
<p>Quindi:</p>
<ul>
<li> Andate in <em>Help -> Install New Software..</em>.</li>
<li> Cercate egit e installatelo.</li>
<li> Riavviate Eclipse </li>
<li> A questo punto andate su un vostro progetto e cliccando con il destro andate su <em>Team -> Share&#8230;</em></li>
<li> Scegliete Git come sistema di CVS.</li>
<li> Il programma vi chiederà dove creare il repository. Per non confondervi scegliete di creare il repository in una sub-directory del progetto (.git) selezionando la relativa spunta. Questo vi eviterà problemi nell&#8217;uso di tools esterni.</li>
</ul>
<p>A questo punto tutto è pronto per il primo commit. Possiamo fare tutto da Eclipse.</p>
<ul>
<li>Andate in <em>Team -> Commit&#8230;</em> e selezionate tutti i file da aggiungere.</li>
<li>Effettuate il commit. </li>
</ul>
<p>Egit offre un ottima integrazione con Git con tanto di rappresentazione grafica della storia, dei rami, delle versioni e di tutte le altre funzioni di Git (compreso il rebase, il merge e il cherry-picking).</p>
<p>Insomma, se utilizzate Eclipse ve lo consiglio caldamente.</p>
 <p><a href="http://davideaversa.it/slashcode/?flattrss_redirect&amp;id=776&amp;md5=20145cb67705e590c255cad5522bb5f9" title="Flattr" target="_blank"><img src="http://davideaversa.it/slashcode/wp-content/plugins/flattr/img/flattr-badge-large.png" alt="flattr this!"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://davideaversa.it/slashcode/2011/07/integrare-git-con-eclipse/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<atom:link rel="payment" href="https://flattr.com/submit/auto?user_id=thek3nger&amp;popout=1&amp;url=http%3A%2F%2Fdavideaversa.it%2Fslashcode%2F2011%2F07%2Fintegrare-git-con-eclipse%2F&amp;language=it_IT&amp;category=text&amp;title=Integrare+Git+con+Eclipse&amp;description=L%26%238217%3Bultima+release+di+Eclipse+%28la+Indigo%29+%C3%A8+favolosa.+A+prima+vista+non+sembra+molto+diversa+dalle+precedenti+ma+la+reattivit%C3%A0+e+la+stabilit%C3%A0+%C3%A8+notevolmente+aumentata.+Funziona+cos%C3%AC+bene+che...&amp;tags=eclipse%2Cgit%2Cblog" type="text/html" />
	</item>
		<item>
		<title>Lua Object Oriented</title>
		<link>http://davideaversa.it/slashcode/2011/07/lua-object-oriented/</link>
		<comments>http://davideaversa.it/slashcode/2011/07/lua-object-oriented/#comments</comments>
		<pubDate>Tue, 26 Jul 2011 14:40:25 +0000</pubDate>
		<dc:creator>THeK3nger</dc:creator>
				<category><![CDATA[Lua]]></category>
		<category><![CDATA[lua]]></category>
		<category><![CDATA[oggetti]]></category>

		<guid isPermaLink="false">http://davideaversa.it/slashcode/?p=773</guid>
		<description><![CDATA[<div><a href="http://davideaversa.it/slashcode/2011/07/lua-object-oriented/"><img title="Lua Object Oriented" src="http://davideaversa.it/slashcode/wp-content/uploads/2011/07/storm-eclips-150x150.jpg" alt="Lua Object Oriented"  width="200" height="200" /></a></div><br/>Scopriremo come implementare il paradigma ad oggetti in un linguaggio non Object Oriented come Lua.]]></description>
			<content:encoded><![CDATA[<div style="height:33px;" class="really_simple_share robots-nocontent snap_nopreview"><div class="really_simple_share_facebook_like" style="width:100px;"><iframe src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fdavideaversa.it%2Fslashcode%2F2011%2F07%2Flua-object-oriented%2F&amp;layout=button_count&amp;show_faces=false&amp;width=100&amp;action=like&amp;colorscheme=light&amp;send=false&amp;height=27" 
						scrolling="no" frameborder="0" style="border:none; overflow:hidden; width:100px; height:27px;" allowTransparency="true"></iframe></div><div class="really_simple_share_google1" style="width:90px;"><div class="g-plusone" data-size="medium" data-href="http://davideaversa.it/slashcode/2011/07/lua-object-oriented/" ></div></div><div class="really_simple_share_twitter" style="width:110px;"><a href="http://twitter.com/share" class="twitter-share-button" data-count="horizontal" 
						data-text="Lua Object Oriented" data-url="http://davideaversa.it/slashcode/2011/07/lua-object-oriented/" 
						data-via=""  ></a></div></div>
		<div style="clear:both;"></div><p><a href="http://davideaversa.it/slashcode/wp-content/uploads/2011/07/storm-eclips.jpg"><img src="http://davideaversa.it/slashcode/wp-content/uploads/2011/07/storm-eclips-150x150.jpg" alt="" title="Eclipse" width="150" height="150" class="alignleft size-thumbnail wp-image-774" /></a></p>
<p>Con questo articolo tocchiamo il culmine di Lua. Scopriremo come implementare il paradigma ad oggetti in un linguaggio non Object Oriented come Lua. Scopriremo quindi come questo paradigma manuale lasci una personalizzazione enorme nel comportamento degli oggetti e nella definizione delle classi.</p>
<p><span id="more-773"></span></p>
<p>La prima cosa che ci viene in mente per simulare un oggetto è la seguente:</p>
<div class="codecolorer-container lua dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="lua codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">Contatore1 <span style="color: #66cc66;">=</span> <span style="color: #66cc66;">&#123;</span> accumulatore <span style="color: #66cc66;">=</span> <span style="color: #cc66cc;">0</span> <span style="color: #66cc66;">&#125;</span><br />
<br />
<span style="color: #aa9900; font-weight: bold;">function</span> Contatore1<span style="color: #66cc66;">.</span>incrementa<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span><br />
&nbsp; &nbsp; Contatore1<span style="color: #66cc66;">.</span>accumulatore <span style="color: #66cc66;">=</span> Contatore1<span style="color: #66cc66;">.</span>accumulatore <span style="color: #66cc66;">+</span> <span style="color: #cc66cc;">1</span><br />
<span style="color: #aa9900; font-weight: bold;">end</span></div></div>
<p>Questo modo è però sbagliato. Se ad esempio facciamo due oggetti</p>
<div class="codecolorer-container lua dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="lua codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">A <span style="color: #66cc66;">=</span> Contatore1<br />
B <span style="color: #66cc66;">=</span> Contatore1<br />
<br />
A<span style="color: #66cc66;">.</span>incrementa<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #808080; font-style: italic;">-- Incrementa anche B!</span></div></div>
<p>Le azioni e le modifiche su di un oggetto si ripercuotono anche su tutti gli altri! Questo viola il principio per cui oggetti diversi hanno storie differenti. Grosso difetto! </p>
<p>Tentiamo di rimediare scegliendo un approccio più complesso.</p>
<div class="codecolorer-container lua dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="lua codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">Contatore2 <span style="color: #66cc66;">=</span> <span style="color: #66cc66;">&#123;</span> accumulatore <span style="color: #66cc66;">=</span> <span style="color: #cc66cc;">0</span> <span style="color: #66cc66;">&#125;</span><br />
<br />
<span style="color: #aa9900; font-weight: bold;">function</span> Contatore2<span style="color: #66cc66;">.</span>incrementa<span style="color: #66cc66;">&#40;</span>self<span style="color: #66cc66;">&#41;</span><br />
&nbsp; &nbsp; self<span style="color: #66cc66;">.</span>accumulatore <span style="color: #66cc66;">=</span> self<span style="color: #66cc66;">.</span>accumulatore <span style="color: #66cc66;">+</span> <span style="color: #cc66cc;">1</span><br />
<span style="color: #aa9900; font-weight: bold;">end</span></div></div>
<p>Abbiamo aggiunto il parametro <code class="codecolorer text dawn"><span class="text">self</span></code>. Questo ci permette di applicare l&#8217;effetto di un azione direttamente all&#8217;istanza sul quale è invocato. Possiamo inoltre rimuovere la necessità di specificare ogni volta il self usando l&#8217;operatore : (due-punti) sia nella definizione di un metodo che nella sua invocazione.</p>
<div class="codecolorer-container lua dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="lua codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">Contatore3 <span style="color: #66cc66;">=</span> <span style="color: #66cc66;">&#123;</span> accumulatore <span style="color: #66cc66;">=</span> <span style="color: #cc66cc;">0</span> <span style="color: #66cc66;">&#125;</span><br />
<br />
<span style="color: #aa9900; font-weight: bold;">function</span> Contatore3<span style="color: #66cc66;">:</span>incrementa<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span><br />
&nbsp; &nbsp; self<span style="color: #66cc66;">.</span>accumulatore <span style="color: #66cc66;">=</span> self<span style="color: #66cc66;">.</span>accumulatore <span style="color: #66cc66;">+</span><span style="color: #cc66cc;">1</span><br />
<span style="color: #aa9900; font-weight: bold;">end</span></div></div>
<p>Il nostro oggetto non è ancora completo. Vogliamo introdurre il concetto di &#8220;classe&#8221;, ovvero di un template grazie al quale creare oggetti con caratteristiche e comportamenti simili.</p>
<p>Possiamo simulare questo meccanismo introducendo un metodo <strong>costruttore</strong>.</p>
<div class="codecolorer-container lua dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="lua codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #aa9900; font-weight: bold;">function</span> Contatore3<span style="color: #66cc66;">:</span>new <span style="color: #66cc66;">&#40;</span>o<span style="color: #66cc66;">&#41;</span><br />
&nbsp; o <span style="color: #66cc66;">=</span> o <span style="color: #aa9900; font-weight: bold;">or</span> <span style="color: #66cc66;">&#123;</span><span style="color: #66cc66;">&#125;</span> &nbsp; <span style="color: #808080; font-style: italic;">-- Crea un oggetto se non ne viene passato nessuno.</span><br />
&nbsp; <span style="color: #0000aa;">setmetatable</span><span style="color: #66cc66;">&#40;</span>o<span style="color: #66cc66;">,</span> self<span style="color: #66cc66;">&#41;</span> <span style="color: #808080; font-style: italic;">-- Meccanismo per trasferire le chiamate al &quot;template&quot; Contatore 3</span><br />
&nbsp; self<span style="color: #66cc66;">.</span>__index <span style="color: #66cc66;">=</span> self<br />
&nbsp; <span style="color: #aa9900; font-weight: bold;">return</span> o<br />
<span style="color: #aa9900; font-weight: bold;">end</span></div></div>
<p>Come potete vedere sfruttiamo il meccanismo delle <strong>meta-tabelle</strong> per generalizzare l&#8217;oggetto. Impostando a <code class="codecolorer text dawn"><span class="text">self</span></code> il valore della metatabella di <code class="codecolorer text dawn"><span class="text">o</span></code> (il nuovo oggetto) non facciamo altro che dire che: <strong>se il metodo (o la variabile) invocata su <code class="codecolorer text dawn"><span class="text">o</span></code> non esiste in <code class="codecolorer text dawn"><span class="text">o</span></code> allora cercala in <code class="codecolorer text dawn"><span class="text">self</span></code></strong>. Ora possiamo quindi evitare di ridefinire un metodo per ogni oggetto: ci penserà Lua ad andare a ripescare nella classe l&#8217;implementazione giusta.</p>
<p>Questa procedura permette di ottenere l&#8217;<strong>ereditarietà</strong> delle classi in modo terribilmente semplice.</p>
<div class="codecolorer-container lua dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="lua codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">ContatoreDoppio <span style="color: #66cc66;">=</span> Contatore3<span style="color: #66cc66;">:</span>new<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span><br />
<span style="color: #aa9900; font-weight: bold;">function</span> ContatoreDoppio<span style="color: #66cc66;">:</span>incrementa<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span><br />
&nbsp; &nbsp; self<span style="color: #66cc66;">.</span>accumulatore <span style="color: #66cc66;">=</span> self<span style="color: #66cc66;">.</span>accumulatore <span style="color: #66cc66;">+</span> <span style="color: #cc66cc;">2</span> <span style="color: #808080; font-style: italic;">-- Incrementa di DUE.</span><br />
<span style="color: #aa9900; font-weight: bold;">end</span><br />
<br />
c <span style="color: #66cc66;">=</span> ContatoreDoppio<span style="color: #66cc66;">:</span>new<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #808080; font-style: italic;">-- Istanza di contatore doppio.</span></div></div>
<p>Anzi, <strong>permette perfino di poter ridefinire metodi della singola istanza!</strong></p>
<div class="codecolorer-container lua dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="lua codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">c <span style="color: #66cc66;">=</span> Contatore3<span style="color: #66cc66;">:</span>new<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #808080; font-style: italic;">-- Crea una nuova istanza di contatore.</span><br />
<span style="color: #aa9900; font-weight: bold;">function</span> c<span style="color: #66cc66;">:</span>incrementa<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span><br />
&nbsp; &nbsp; self<span style="color: #66cc66;">.</span>accumulatore <span style="color: #66cc66;">=</span> self<span style="color: #66cc66;">.</span>accumulatore <span style="color: #66cc66;">+</span> <span style="color: #cc66cc;">2</span> <span style="color: #808080; font-style: italic;">-- Incrementa di DUE.</span><br />
<span style="color: #aa9900; font-weight: bold;">end</span></div></div>
<p>Il codice precedente mostra come è possibile ridefinire il metodo incrementa per la sola istanza c! Questa cosa è difficile da trovare persino per i linguaggi massivamente Object Oriented!</p>
<p>Insomma, con una manciata di righe di codice possiamo creare il nostro personale paradigma ad oggetti in Lua. Ci manca da vedere come poter creare metodi o variabili <strong>private</strong>. Ma questa è un altra storia.</p>
 <p><a href="http://davideaversa.it/slashcode/?flattrss_redirect&amp;id=773&amp;md5=1b706c1f02befd36bf1615369ce61068" title="Flattr" target="_blank"><img src="http://davideaversa.it/slashcode/wp-content/plugins/flattr/img/flattr-badge-large.png" alt="flattr this!"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://davideaversa.it/slashcode/2011/07/lua-object-oriented/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<atom:link rel="payment" href="https://flattr.com/submit/auto?user_id=thek3nger&amp;popout=1&amp;url=http%3A%2F%2Fdavideaversa.it%2Fslashcode%2F2011%2F07%2Flua-object-oriented%2F&amp;language=it_IT&amp;category=text&amp;title=Lua+Object+Oriented&amp;description=Con+questo+articolo+tocchiamo+il+culmine+di+Lua.+Scopriremo+come+implementare+il+paradigma+ad+oggetti+in+un+linguaggio+non+Object+Oriented+come+Lua.+Scopriremo+quindi+come+questo+paradigma+manuale+lasci...&amp;tags=lua%2Coggetti%2Cblog" type="text/html" />
	</item>
		<item>
		<title>Android NON è in Java</title>
		<link>http://davideaversa.it/slashcode/2011/07/android-non-e-in-java/</link>
		<comments>http://davideaversa.it/slashcode/2011/07/android-non-e-in-java/#comments</comments>
		<pubDate>Mon, 18 Jul 2011 22:14:11 +0000</pubDate>
		<dc:creator>THeK3nger</dc:creator>
				<category><![CDATA[Guide]]></category>
		<category><![CDATA[android]]></category>
		<category><![CDATA[dalvik]]></category>
		<category><![CDATA[java]]></category>

		<guid isPermaLink="false">http://davideaversa.it/slashcode/?p=771</guid>
		<description><![CDATA[<div><a href="http://davideaversa.it/slashcode/2011/07/android-non-e-in-java/"><img title="Android NON è in Java" src="http://davideaversa.it/slashcode/wp-content/uploads/2011/07/Google-Android-army-150x150.jpg" alt="Android NON è in Java"  width="200" height="200" /></a></div><br/>Intendiamoci, il titolo dell'articolo è volutamente provocatorio e non dobbiamo pensare che Java non c'entri nulla con Android, piuttosto dobbiamo capire dove si ferma Java e dove comincia il resto.]]></description>
			<content:encoded><![CDATA[<div style="height:33px;" class="really_simple_share robots-nocontent snap_nopreview"><div class="really_simple_share_facebook_like" style="width:100px;"><iframe src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fdavideaversa.it%2Fslashcode%2F2011%2F07%2Fandroid-non-e-in-java%2F&amp;layout=button_count&amp;show_faces=false&amp;width=100&amp;action=like&amp;colorscheme=light&amp;send=false&amp;height=27" 
						scrolling="no" frameborder="0" style="border:none; overflow:hidden; width:100px; height:27px;" allowTransparency="true"></iframe></div><div class="really_simple_share_google1" style="width:90px;"><div class="g-plusone" data-size="medium" data-href="http://davideaversa.it/slashcode/2011/07/android-non-e-in-java/" ></div></div><div class="really_simple_share_twitter" style="width:110px;"><a href="http://twitter.com/share" class="twitter-share-button" data-count="horizontal" 
						data-text="Android NON è in Java" data-url="http://davideaversa.it/slashcode/2011/07/android-non-e-in-java/" 
						data-via=""  ></a></div></div>
		<div style="clear:both;"></div><p><a href="http://davideaversa.it/slashcode/wp-content/uploads/2011/07/Google-Android-army.jpg"><img src="http://davideaversa.it/slashcode/wp-content/uploads/2011/07/Google-Android-army-150x150.jpg" alt="" title="Google Android" width="150" height="150" class="alignleft size-thumbnail wp-image-772" /></a></p>
<p>La notizie e le informazioni in internet vanno sempre verificate. Molte cose infatti si tramandano di bocca in bocca (o di tastiera in tastiera) fino a confondersi. Le senti ripetere talmente tante volte che alla fine te ne convinci e le accetti acriticamente.</p>
<p>Arriva poi il giorno che ti informi e scopri che le cose non sono proprio così o che, in fondo, sono molto più complesse. Fra questo ricade anche l&#8217;asserzione <strong>Android è scritto in Java</strong>.</p>
<p><span id="more-771"></span></p>
<p><strong>Android non è scritto in Java?</strong></p>
<p>Si e no. Intendiamoci, il titolo dell&#8217;articolo è volutamente provocatorio e non dobbiamo pensare che Java non c&#8217;entri nulla con Android, piuttosto dobbiamo capire dove si ferma Java e dove comincia il resto.</p>
<p>Per prima cosa Android è scritto in C. Il kernel è Linux e tutti i ricami sovrastanti sono scritti ovviamente in C. Sembra banale ma ho sentito dire che il kernel di Android è scritto in Java&#8230; quindi meglio essere puntuali.</p>
<p>Seconda cosa. La gran parte dello strato applicativo poggia su <strong>Dalvik</strong>.</p>
<p><strong>Ovvero la nota Java Virtual Machine. Giusto?</strong></p>
<p>Si e no. Anche qui dobbiamo essere precisi. Quando uno dice <em>&#8220;le applicazioni di Android sono in Java&#8221;</em> apre un mondo di se e di ma. </p>
<p>Quando pensiamo a un applicazione in Java pensiamo alle applicazioni Java che girano sul mattone delle Java VM standard. Quando facciamo questa affermazione diamo l&#8217;idea che anche le applicazioni di Android siano dello stesso tipo e girino su una VM equivalente. Ma questo è completamente falso!</p>
<p><strong>Dalvik non esegue codice Java?</strong></p>
<p><strong>NO!</strong> Questo ci tengo a specificarlo perché è la chiave di tutto il discorso. Dalvik non esegue e compila il codice Java! <strong>Dalvik compila il Java bytecode ed esegue il Dalvik Bytecode!</strong> La differenza è abissale, enorme, è come la differenza fra il codice Morse e il Dolce Stil Novo. Basti pensare che il Java Bytecode (quello dei file .class) esegue istruzioni codificate in 8-bit invece dei 16-bit delle istruzioni di Dalvik (nei file eseguibili .dex).</p>
<p><strong>In ogni caso se Dalvik compila il Java ByteCode non è la stessa cosa?</strong></p>
<p>Assolutamente No. <em>Sarebbe come dire che io so il giapponese perché so tradurre in italiano le scritte giapponesi che qualcuno mi traduce in inglese.</em> </p>
<p>Inoltre questa caratteristica permette (in teoria) di utilizzare linguaggi alternativi a Java in modo piuttosto semplice. Ad esempio possiamo scrivere applicazioni per Dalvik anche in Python a patto di compilare il codice Python in Java ByteCode (ad esempio usando Jython ). Il codice compilato in questo modo può quindi passare per Dalvik che lo convertirà in file .dex.</p>
<p>Usare Python (o altri linguaggi) per programmare in Android è tuttavia attualmente impossibile. Tutte le librerie di sistema Android (le API che scarichiamo quando configuriamo l&#8217;ambiente) sono scritte in Java, tuttavia se qualcuno avesse pazienza e voglia di convertire tali librerie in Python (compatibile con Jython) si potrebbe usare questo linguaggio in modo quasi trasparente.</p>
<p><strong>Quindi Dalvik non è una Java VM?</strong></p>
<p>Dalvik è una VM che interpreta il Java ByteCode. La differenza è molto sottile concettualmente ma importante per non fare confusione.</p>
<p>Inoltre ci sono numerosissime altre differenze con la Java VM di cui molte incentrate all&#8217;ottimizzazione del sistema su dispositivi mobili e con risorse limitate che potete scoprire cercando Dalvik su uno qualsiasi dei motori di ricerca.</p>
<p><strong>A me, sviluppatore, cosa cambia?</strong></p>
<p>Nulla. Tu sviluppatore scriverai applicazioni per Android in Java. Di chi compila ed esegue il tuo codice non ti interessa. Quindi per te le applicazioni Android sono in Java. </p>
<p>Ora però sai che la situazione è più complessa di così e la consapevolezza di come funzionano le cose in realtà le cose è l&#8217;arma più potente di ogni sviluppatore.</p>
 <p><a href="http://davideaversa.it/slashcode/?flattrss_redirect&amp;id=771&amp;md5=adee6886b2e8087db9c3810d0c9f053d" title="Flattr" target="_blank"><img src="http://davideaversa.it/slashcode/wp-content/plugins/flattr/img/flattr-badge-large.png" alt="flattr this!"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://davideaversa.it/slashcode/2011/07/android-non-e-in-java/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<atom:link rel="payment" href="https://flattr.com/submit/auto?user_id=thek3nger&amp;popout=1&amp;url=http%3A%2F%2Fdavideaversa.it%2Fslashcode%2F2011%2F07%2Fandroid-non-e-in-java%2F&amp;language=it_IT&amp;category=text&amp;title=Android+NON+%C3%A8+in+Java&amp;description=La+notizie+e+le+informazioni+in+internet+vanno+sempre+verificate.+Molte+cose+infatti+si+tramandano+di+bocca+in+bocca+%28o+di+tastiera+in+tastiera%29+fino+a+confondersi.+Le+senti+ripetere...&amp;tags=android%2Cdalvik%2Cjava%2Cblog" type="text/html" />
	</item>
		<item>
		<title>Approfondiamo Lua 5.2 Beta</title>
		<link>http://davideaversa.it/slashcode/2011/07/approfondiamo-lua-5-2-beta/</link>
		<comments>http://davideaversa.it/slashcode/2011/07/approfondiamo-lua-5-2-beta/#comments</comments>
		<pubDate>Fri, 15 Jul 2011 08:47:18 +0000</pubDate>
		<dc:creator>THeK3nger</dc:creator>
				<category><![CDATA[Lua]]></category>
		<category><![CDATA[News]]></category>
		<category><![CDATA[lua]]></category>

		<guid isPermaLink="false">http://davideaversa.it/slashcode/?p=769</guid>
		<description><![CDATA[Lo sviluppo di Lua procede lento ma costante. Ieri è stata infatti rilasciata la Beta di Lua 5.2. La nuova versione del linguaggio introduce, come è solito, grandi cambiamenti e una manciata di incompatibilità con le precedenti versioni. Vediamone alcune (la lista completa la trovate qui) No more fenv for threads or functions In Lua5.1 <a href='http://davideaversa.it/slashcode/2011/07/approfondiamo-lua-5-2-beta/' class='excerpt-more'>[...]</a>]]></description>
			<content:encoded><![CDATA[<div style="height:33px;" class="really_simple_share robots-nocontent snap_nopreview"><div class="really_simple_share_facebook_like" style="width:100px;"><iframe src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fdavideaversa.it%2Fslashcode%2F2011%2F07%2Fapprofondiamo-lua-5-2-beta%2F&amp;layout=button_count&amp;show_faces=false&amp;width=100&amp;action=like&amp;colorscheme=light&amp;send=false&amp;height=27" 
						scrolling="no" frameborder="0" style="border:none; overflow:hidden; width:100px; height:27px;" allowTransparency="true"></iframe></div><div class="really_simple_share_google1" style="width:90px;"><div class="g-plusone" data-size="medium" data-href="http://davideaversa.it/slashcode/2011/07/approfondiamo-lua-5-2-beta/" ></div></div><div class="really_simple_share_twitter" style="width:110px;"><a href="http://twitter.com/share" class="twitter-share-button" data-count="horizontal" 
						data-text="Approfondiamo Lua 5.2 Beta" data-url="http://davideaversa.it/slashcode/2011/07/approfondiamo-lua-5-2-beta/" 
						data-via=""  ></a></div></div>
		<div style="clear:both;"></div><p>Lo sviluppo di Lua procede lento ma costante. Ieri è stata infatti rilasciata la Beta di Lua 5.2. La nuova versione del linguaggio introduce, come è solito, grandi cambiamenti e una manciata di incompatibilità con le precedenti versioni. Vediamone alcune (la lista completa la trovate <a href="http://www.lua.org/work/doc/#changes">qui</a>)</p>
<p><span id="more-769"></span></p>
<p><strong>No more fenv for threads or functions</strong></p>
<p>In Lua5.1 e nelle versioni precedenti ogni funzione ha una tabella <em>ambiente</em>. Tale tabella immagazzina alcune informazioni sulla funzione e in particolare risolve le variabili globali contenute in essa (potete modificare tale tabella con i comandi <code class="codecolorer text dawn"><span class="text">getfenv/setfenv</span></code>).</p>
<p>In L5.2 invece questa tabella non esiste più. Tutto il sistema di gestione delle variabili globali è stato spostato in un oggetto <code class="codecolorer text dawn"><span class="text">_ENV</span></code>. Tale oggetto è condiviso da tutto il codice (a meno che non viene esplicitamente ridefinito come <code class="codecolorer text dawn"><span class="text">local</span></code> da qualche parte.</p>
<p>In pratica immaginate che ogni funzione &#8220;base&#8221; sia in realtà un metodo di _ENV e che quindi venga invocato come <code class="codecolorer text dawn"><span class="text">_ENV.mia_funzione()</span></code>. È un po&#8217; grezza come spiegazione ma credo renda l&#8217;idea.</p>
<p><strong>tables honor the __len metamethod</strong></p>
<p>Una meta-tabella è una tabella che contiene informazioni sulla tabella stessa e può essere collegata ad una tabella con il comando <code class="codecolorer text dawn"><span class="text">setmetatable</span></code>. Fra le informazioni presenti in questa tabella c&#8217;è ad esempio il meta-metodo <code class="codecolorer text dawn"><span class="text">__len</span></code> che fornisce informazioni sulla dimensione della tabella. Tuttavia in L5.1 tale metodo soffriva di alcuni problemi logici (specialmente se veniva ridefinito). Facciamo un esempio:</p>
<div class="codecolorer-container lua dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="lua codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">t <span style="color: #66cc66;">=</span> <span style="color: #0000aa;">setmetatable</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#123;</span><span style="color: #66cc66;">&#125;</span><span style="color: #66cc66;">,</span> <span style="color: #66cc66;">&#123;</span> __len <span style="color: #66cc66;">=</span> <span style="color: #aa9900; font-weight: bold;">function</span><span style="color: #66cc66;">&#40;</span>t<span style="color: #66cc66;">&#41;</span> <span style="color: #aa9900; font-weight: bold;">return</span> <span style="color: #cc66cc;">3</span> <span style="color: #aa9900; font-weight: bold;">end</span> <span style="color: #66cc66;">&#125;</span><span style="color: #66cc66;">&#41;</span><br />
t<span style="color: #66cc66;">&#91;</span><span style="color: #cc66cc;">1</span><span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">,</span> t<span style="color: #66cc66;">&#91;</span><span style="color: #cc66cc;">2</span><span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">,</span> t<span style="color: #66cc66;">&#91;</span><span style="color: #cc66cc;">3</span><span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">,</span> t<span style="color: #66cc66;">&#91;</span><span style="color: #cc66cc;">4</span><span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">,</span> t<span style="color: #66cc66;">&#91;</span><span style="color: #cc66cc;">5</span><span style="color: #66cc66;">&#93;</span> <span style="color: #66cc66;">=</span> <span style="color: #ff6666;">&quot;e&quot;</span><span style="color: #66cc66;">,</span> <span style="color: #ff6666;">&quot;d&quot;</span><span style="color: #66cc66;">,</span> <span style="color: #ff6666;">&quot;c&quot;</span><span style="color: #66cc66;">,</span> <span style="color: #ff6666;">&quot;b&quot;</span><span style="color: #66cc66;">,</span> <span style="color: #ff6666;">&quot;a&quot;</span><br />
<span style="color: #66cc66;">=</span> <span style="color: #66cc66;">#</span>t <span style="color: #808080; font-style: italic;">-- Restituisce correttamente 3</span></div></div>
<p>Creiamo una tabella vuota e ridefiniamo <code class="codecolorer text dawn"><span class="text">__len</span></code> in modo tale che restituisca sempre 3. L&#8217;operatore <code class="codecolorer text dawn"><span class="text">#t</span></code> restituirà quindi il valore restituito dal meta-metodo anche se in realtà t ha 5 elementi. Corretto: la ridefinizione di un meta-metodo ha priorità anche sulla realtà stessa. Tuttavia in L5.1 le tabelle non rispettano tale meta-metodo per operazioni come la concatenazione e l&#8217;ordinamento dei valori. Il L5.2 questo comportamento è stato risolto (non ho conferme dirette, se potete confermatemelo).</p>
<p><strong>hex and \* escapes in strings</strong></p>
<p>Aggiunti alcuni codici di escape nelle stringhe. Il primo (<code class="codecolorer text dawn"><span class="text">\x</span></code>) permette di inserire direttamente il codice esadecimale del carattere che segue. Il secondo (<code class="codecolorer text dawn"><span class="text">\x</span></code>) è utile solo per questioni di leggibilità del codice.</p>
<div class="codecolorer-container lua dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="lua codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #0000aa;">print</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff6666;">&quot;Hello \* &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;World&quot;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #808080; font-style: italic;">--&gt; Hello World</span></div></div>
<p>Questo codice infatti ignora tutti gli spazi successivi. Nell&#8217;esempio precedente quindi la scritta stampata sarà corretta. Se provate a togliere il carattere vedrete che &#8220;World&#8221; sarà molto lontano da &#8220;Hello&#8221;.</p>
<p><strong>new library for bitwise operations</strong></p>
<p>Nuova libreria per le operazioni binarie. La libreria è denominata <code class="codecolorer text dawn"><span class="text">bit</span></code> e contiene <code class="codecolorer text dawn"><span class="text">bit.band, bit.bnot, bit.bor, bit.rol, bit.ror, bit.lshift, bit.rshift, bit.btest, and bit.bxor</span></code>.</p>
<p><strong>goto statement</strong></p>
<p>Abominio. In L5.2 è stato introdotto il comando <code class="codecolorer text dawn"><span class="text">goto</span></code>, croce e delizia di molti programmatori hardcore. Ripeto, come mio solito, che non esiste <strong>NULLA</strong> che possa essere fatto con <code class="codecolorer text dawn"><span class="text">goto</span></code> che non possa essere fatto con <em>if</em>, <em>while</em> e <em>break</em>. Tuttavia, se usato raramente e saggiamente, il goto può semplificare il codice a scapito della chiarezza. Ogni volta che usate un goto un gatto muore. Pensateci bene.</p>
<p><strong>emergency (and generational) garbage collector</strong></p>
<p>Ci sono due grossi cambiamenti nel garbage collector. Il primo riguarda il garbage collector <strong>di emergenza</strong>: in pratica questo comportamento lancia il garbage collector massivamente non appena un allocazione fallisce (nella speranza di liberare spazio), dopo di che l&#8217;allocazione viene rilanciata e, se fallisce nuovamente, viene dato definitivamente errore.<br />
Il secondo comportamento (garbage collector <strong>generazionale</strong>) è invece ancora marcato come sperimentale ma è decisamente interessante: questa modalità sfrutta il principio per cui è più probabile che abbia bisogno di essere deallocato un oggetto creato di recente rispetto ad un oggetto che è presente in memoria da tempo. Questo si traduce in un ottimizzazione del processo di garbaging. Questi due cambiamenti sono decisamente importanti dal punto di vista prestazionale.</p>
<p><strong>Altri cambiamenti</strong></p>
<p>C&#8217;è un altro listone di cambiamenti che non ho tempo di analizzare nel dettaglio. Molte modifiche alle librerie standard e ben 11 aggiunte alle API C (che dovrò studiarmi prima o poi per migliorare e adattare LuaGrip). Tutte le novità sembrano essere interessanti sia per gli hardcore lua developer sia per gli utenti finali. Non ci resta che aspettare con trepidazione la versione finale di questa nuova generazione del linguaggio.</p>
 <p><a href="http://davideaversa.it/slashcode/?flattrss_redirect&amp;id=769&amp;md5=68186f8146a3f4055de69133cef921ce" title="Flattr" target="_blank"><img src="http://davideaversa.it/slashcode/wp-content/plugins/flattr/img/flattr-badge-large.png" alt="flattr this!"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://davideaversa.it/slashcode/2011/07/approfondiamo-lua-5-2-beta/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<atom:link rel="payment" href="https://flattr.com/submit/auto?user_id=thek3nger&amp;popout=1&amp;url=http%3A%2F%2Fdavideaversa.it%2Fslashcode%2F2011%2F07%2Fapprofondiamo-lua-5-2-beta%2F&amp;language=it_IT&amp;category=text&amp;title=Approfondiamo+Lua+5.2+Beta&amp;description=Lo+sviluppo+di+Lua+procede+lento+ma+costante.+Ieri+%C3%A8+stata+infatti+rilasciata+la+Beta+di+Lua+5.2.+La+nuova+versione+del+linguaggio+introduce%2C+come+%C3%A8+solito%2C+grandi+cambiamenti+e...&amp;tags=lua%2CNews%2Cblog" type="text/html" />
	</item>
		<item>
		<title>Difendersi dai Programmattori</title>
		<link>http://davideaversa.it/slashcode/2011/07/difendersi-dai-programmattori/</link>
		<comments>http://davideaversa.it/slashcode/2011/07/difendersi-dai-programmattori/#comments</comments>
		<pubDate>Thu, 07 Jul 2011 08:03:21 +0000</pubDate>
		<dc:creator>THeK3nger</dc:creator>
				<category><![CDATA[Generale]]></category>
		<category><![CDATA[flame]]></category>
		<category><![CDATA[programmazione]]></category>

		<guid isPermaLink="false">http://davideaversa.it/slashcode/?p=766</guid>
		<description><![CDATA[Fra le parole più abusate su internet un posto d&#8217;onore va a programmatore (o developer e varianti). Forse secondo solo a &#8220;H4ck3r&#8221;. In ogni caso, programmatore fa fico, creare programmi e dire alla gente &#8220;questo l&#8217;ho fatto io&#8221; non ha prezzo. Ma la realtà è ben diversa. Spesso molti di questi individui sono programmAttori e <a href='http://davideaversa.it/slashcode/2011/07/difendersi-dai-programmattori/' class='excerpt-more'>[...]</a>]]></description>
			<content:encoded><![CDATA[<div style="height:33px;" class="really_simple_share robots-nocontent snap_nopreview"><div class="really_simple_share_facebook_like" style="width:100px;"><iframe src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fdavideaversa.it%2Fslashcode%2F2011%2F07%2Fdifendersi-dai-programmattori%2F&amp;layout=button_count&amp;show_faces=false&amp;width=100&amp;action=like&amp;colorscheme=light&amp;send=false&amp;height=27" 
						scrolling="no" frameborder="0" style="border:none; overflow:hidden; width:100px; height:27px;" allowTransparency="true"></iframe></div><div class="really_simple_share_google1" style="width:90px;"><div class="g-plusone" data-size="medium" data-href="http://davideaversa.it/slashcode/2011/07/difendersi-dai-programmattori/" ></div></div><div class="really_simple_share_twitter" style="width:110px;"><a href="http://twitter.com/share" class="twitter-share-button" data-count="horizontal" 
						data-text="Difendersi dai Programmattori" data-url="http://davideaversa.it/slashcode/2011/07/difendersi-dai-programmattori/" 
						data-via=""  ></a></div></div>
		<div style="clear:both;"></div><p>Fra le parole più abusate su internet un posto d&#8217;onore va a <strong>programmatore</strong> (o developer e varianti). Forse secondo solo a &#8220;H4ck3r&#8221;. In ogni caso, programmatore fa fico, creare programmi e dire alla gente &#8220;questo l&#8217;ho fatto io&#8221; non ha prezzo. </p>
<p>Ma la realtà è ben diversa. Spesso molti di questi individui sono <em>programmAttori</em> e nulla più. Molti conoscono la <em>programmazione sciamanica</em>, l&#8217;arte di scrivere mantra tantrici su dei file .c o .py e passarli ad un compilatore per ottenere qualcosa in cambio. Questa non è programmazione, almeno non al suo livello più nobile. Il web è pieno di questi arroganti developer. Vediamo come disinnescarli.</p>
<p><span id="more-766"></span></p>
<p><strong>1 &#8211; Programmare non significa assemblare</strong></p>
<p>Se trovate persone che vi propinano programmi scritti da loro il primo modo per verificare la potenza della loro capacità. Verificate il numero di librerie e cosa fanno. Molto spesso troverete programmi assemblati. I programmi assemblati sono i software semplici costruiti a partire da un numero enorme di librerie (che fanno tutto il lavoro sporco) che vengono <em>assemblate</em> dal programmatore. Un esempio di questi programmi sono player musicali o programmi di pulizia del sistema. In realtà tali programmi usano librerie grafiche, librerie audio e collegano il tutto in modo piuttosto lineare.</p>
<p>Questo è essere programmatori allo stesso modo di come cucinare un piatto leggendo una ricetta da un libro di cucina usando prodotti surgelati fa di noi degli Chef.</p>
<p>È una programmazione hobbistica, che ha il suo rispetto, la sua dignità e spesso sforna programmi utilissimi. Ma i programmAttori te lo spacceranno come una meraviglia dell&#8217;informatica e pretenderanno, alla luce di ciò, di parlare alla pari con un developer del kernel.</p>
<p><strong>2 &#8211; Programmare non significa sapere un linguaggio</strong></p>
<p>Un programmatore non conosce il C, non conosce il Java, non conosce il Python: li conosce tutti. Un programmatore esperto non ha paura di imparare un linguaggio nuovo perché con venti minuti di letta al manuale del linguaggio entra già nel meccanismo. Questo perché sa che cos&#8217;è la programmazione al di là del singolo linguaggio, ha appreso i concetti informatici che stanno dietro ai linguaggi di programmazione e sa riconoscerli in tutti i linguaggi del mondo. </p>
<p>Ovviamente sto esagerando, ma un programmatore esperto può semplicemente imparare un linguaggio nuovo in due ore (se rientra nei paradigmi che conosce, altrimenti un paio di giorni).</p>
<p>Il programmatore farlocco invece no. Se gli dici &#8220;facciamo un progetto XYZ&#8221; non ti dirà di farlo nel linguaggio più adatto allo scopo bensì nel linguaggio che conosce.</p>
<p>Si può essere più programmatori scrivendo in pseudocodice su carta che scrivendo uno script di pulizia in bash.</p>
<p><strong>3 &#8211; Programmare non significa fare finestre</strong></p>
<p>Altro comportamento classico del programmatore wannabe è il classificare come più dignitose le applicazioni grafiche rispetto alle applicazioni a riga di comando. Se sentite frasi del tipo &#8220;io faccio programmi con le finestre, mica quelle schifezze a riga di comando&#8221; accendete l&#8217;allarme: è molto probabile che vi troviate di fronte ad un programmAttore montato dei più classici.</p>
<p>Le finestre sono un aspetto (minimale) dell&#8217;intera programmazione. Nonostante nell&#8217;uso desktop utilizziamo quasi tutte applicazioni a finestra queste rappresentano solo una minima parte del lavoro che <strong>milioni</strong> di programmatori fanno ogni giorno (ad esempio scrivendo librerie come quelle che loro usano per fare le amate finestre). Quindi scusate se mi innervosisco ma uno che si vanta di fare programmi a finestra invece di altro non solo non è programmatore: è un mentecatto.</p>
<p>Un programma come Gazebo, tanto per dirne uno che sto usando ora, è un programma estremamente sofisticato e complesso dato che serve a simulare insiemi di Robot in ambienti 3d. Eppure è un programma a riga di comando. Il tanto amato dpkg di Debian è a riga di comando eppure svolge tutto il lavoro pesante dell&#8217;installazione dei pacchetti.</p>
<p>Inoltre, se vogliamo dirla tutta, la programmazione una finestra grafica non è complessa (in generale), si va dalla quasi banalità del Visual Basic e del Gambas alla media complessità di Gtk e Qt. Saper fare finestre grafiche significa studiare e conoscere bene una libreria fra le infinite disponibili, non conoscere la programmazione nel suo complesso. </p>
<p><strong>4 &#8211; Programmare non significa conoscere HTML e CSS</strong></p>
<p>Fra i programmAttori web spesso giara questa balla. Io conosco HTML e CSS quindi sono un programmatore. Sbagliato. Al massimo sei un Web Designer ma non un programmatore.</p>
<p>La ragione è semplice: HTML e CSS non sono linguaggi di programmazione e, se non il presunto developer non sa questo allora è garantito che non è un developer. Essere esperti di HTML equivale ad essere esperti di CSV, LaTex e altre metodologie di formattazione dei dati. Potete fare un ciclo in HTML? No. E quindi non è chiaramente un linguaggio di programmazione.</p>
<p><strong>5 &#8211; Programmare non significa scrivere codice</strong></p>
<p>O almeno non significa solo quello. La programmazione è una cosa più vasta di cui lo scrivere codice è probabilmente la cosa più noiosa. L&#8217;atto di sviluppare un&#8217;applicazione parte da prima, da quando si analizzano gli aspetti di ciò che si vuole fare e si progetta l&#8217;applicazione, e arriva fino alla fase di test. È la progettazione soprattutto, la sensazione di analizzare un problema, smontarlo e risolverlo che fa di noi un programmatore. Non ha ancora scritto una riga di codice ma nella sua mente il programma è già scritto e questo, vi assicuro, da una bellissima sensazione.</p>
<p>Il programmAttore invece scrive codice su codice spesso in mega malloppi di file per nulla modulari e invece di lamentarsi di come sta gestendo il suo progetto probabilmente si lamenterà del linguaggio (che secondo lui non permette di fare la cosa X o la cosa Y).</p>
<p><strong>6 &#8211; Programmare significa progettare strutture dati</strong></p>
<p>Probabilmente, se non vi siete mai trovati a progettare una struttura dati o almeno a pensare a quale struttura dati sia migliore per la vostra applicazione, non siete veri programmatori. L&#8217;unica cosa che fanno i programmi è manipolare l&#8217;informazione e l&#8217;informazione è manipolata e memorizzata nelle strutture dati. Quindi programmare È fare strutture dati.</p>
<p>Molti linguaggi coprono molte funzioni base. In Python per fare una lista dinamica non ci vuole certo un tecnico esperto, ma per programmi complessi anche il Python necessita di un po&#8217; di progettazione nelle strutture dati (anche solamente organizzare gli oggetti che popoleranno la nostra applicazione).</p>
<p>Tutti i programmatori che conosco e che stimo almeno una volta hanno avuto la necessità di scrivere manualmente una lista, un array, un heap e così via. Anche io ne ho avuto bisogno. Credo che tutti ne abbiano bisogno prima o poi.</p>
<p>Se il vostro interlocutore tentenna sulla struttura firstchild-nextsibling di un albero probabilmente siete davanti ad un programmAttore.</p>
<p><strong>Per concludere.</strong> Forse ci sarebbe molto altro da dire e molte altre cose che al momento mi sfuggono ma il punto credo sia chiaro: per chi, come me, ama questa disciplina è fastidioso veder impazzare per il web tanti tromboni che vantano una conoscenza di programmazione accademica e danno la colpa dei loro fallimenti sempre a qualcos&#8217;altro. È irritante sentire cose stupide come quelle al punto 3.</p>
<p>C&#8217;è chi studia anni, legge libri su libri per apprendere una tecnica, che scrive tonnellate di righe di codice praticamente inutile solo per implementare e mettere a punto una particolare struttura dati o un particolare algoritmo che ha studiato. Poi arriva il ragazzino di turno che ti sbatte in faccia l&#8217;ennesimo programma con GUI per pulire il tuo sistema e pretende di parlarti alla pari.</p>
<p>Vorrei che tutti questi individui imparassero l&#8217;umiltà e capissero, come me, che abbiamo ancora molto da imparare. Molto.</p>
 <p><a href="http://davideaversa.it/slashcode/?flattrss_redirect&amp;id=766&amp;md5=cbfacbc7d7eed783ef8d2da93f4bb2c1" title="Flattr" target="_blank"><img src="http://davideaversa.it/slashcode/wp-content/plugins/flattr/img/flattr-badge-large.png" alt="flattr this!"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://davideaversa.it/slashcode/2011/07/difendersi-dai-programmattori/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		<atom:link rel="payment" href="https://flattr.com/submit/auto?user_id=thek3nger&amp;popout=1&amp;url=http%3A%2F%2Fdavideaversa.it%2Fslashcode%2F2011%2F07%2Fdifendersi-dai-programmattori%2F&amp;language=it_IT&amp;category=text&amp;title=Difendersi+dai+Programmattori&amp;description=Fra+le+parole+pi%C3%B9+abusate+su+internet+un+posto+d%26%238217%3Bonore+va+a+programmatore+%28o+developer+e+varianti%29.+Forse+secondo+solo+a+%26%238220%3BH4ck3r%26%238221%3B.+In+ogni+caso%2C+programmatore+fa+fico%2C+creare+programmi...&amp;tags=flame%2Cprogrammazione%2Cblog" type="text/html" />
	</item>
	</channel>
</rss>

