<?xml version="1.0" encoding="iso-8859-1"?>
<rss version="2.0">
<channel>
<title>RSS Categoria: Web - davidonzo's blog :)</title>
<link>http://www.davidonzo.com/</link>
<description>RSS Categoria: Web - davidonzo's blog :)</description>
<language>IT-it</language>
<generator>davidonzo coding</generator>
<pubDate>Fri, 03 Sep 2010 08:42:52 +0100</pubDate>
<ttl>60</ttl>
<item>
<title>[PHP OOP] Memory Leaks nell&#039;uso degli oggetti</title>
<link>http://www.davidonzo.com/post/1149/php-oop-memory-leaks-nell039uso-degli-oggetti/</link>
<description><![CDATA[<p></p><p>Potrebbe succedere, e a me &egrave; successo giusto ieri, programmando una grossa routine in PHP, di dover istanziare oggetti che fanno riferimento ad altri oggetti. In tal caso si crea un rapporto di parentela fra oggetto padre e oggetto figlio. Il rischio &egrave; quello di ottenere un fatal error per eccesso di memoria usata.</p>
<p>Per capire fino in fondo, bisogna sapere che il PHP ha una gestione <a target="_blank" href="http://en.wikipedia.org/wiki/Garbage_collection_(computer_science)">garbage collection</a> interna. Quindi <strong><em>di regola</em></strong> sembrerebbe non necessario dover tracciare ogni oggetto e gestirne la sua allocazione di memoria. Ma per processi di certe dimensioni questo potrebbe non essere vero, visto che la memoria &egrave; liberata quando scade la variabile relativa, alla fine dello script.</p>
<p>Nella maggior parte dei casi &egrave; possibile usare <a target="_blank" href="http://php.net/manual/en/function.unset.php">unset()</a> per liberare al volo la memoria allocata. Ma se vengono usati dei riferimenti circolari che creano relazione di tipo padre figlio fra oggetti, nonostante scada il figlio (perch&egrave; si &egrave; a fine ciclo e ne viene avviato uno nuovo), il padre resta istanziato e di conseguenza nemmeno la memoria del figlio viene riallocata come libera.</p>
<p>Di seguito un esempio:</p>
<p><span class="Code">&lt;?php<br />
class Foo{<br />
&nbsp; function __construct(){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $this-&gt;bar = new Bar($this); <br />
&nbsp; }<br />
}<br />
<br />
class Bar{<br />
&nbsp; function __construct($foo = null){<br />
&nbsp;&nbsp;&nbsp; $this-&gt;foo = $foo;<br />
&nbsp; }<br />
}<br />
&nbsp;<br />
echo &quot;Memoria iniziale: &quot; . number_format(memory_get_usage(), 0, &quot;.&quot;, &quot;,&quot;) . &quot; bytes\n&quot;;<br />
for($a=0; $a&lt;=5000; $a++){<br />
&nbsp; $foo = new Foo();<br />
&nbsp; unset($foo);<br />
}<br />
echo &quot;Picco di memoria: &quot; . number_format(memory_get_peak_usage(), 0, &quot;.&quot;, &quot;,&quot;) . &quot; bytes\n&quot;;<br />
echo &quot;Memoria finale: &quot; . number_format(memory_get_usage(), 0, &quot;.&quot;, &quot;,&quot;) . &quot; bytes\n&quot;;<br />
?&gt;</span></p>
<p>Se proviamo a far girare lo script, come input avremo qualcosa del genere.</p>
<pre>davide@laptop:~$ php public_html/memory.php <br />Memoria iniziale: 329,388 bytes<br />Picco di memoria: 2,661,976 bytes<br />Memoria finale: 821,744 bytes</pre>
<p>Si faccia caso non tanto alla poca memoria allocata, ma alla differenza fra quella iniziale, finale ed il picco. Soprattutto il picco risulta otto volte pi&ugrave; alto della memoria inizialmente utilizzata dallo script. Ed anche alla fine si ha un'allocazione parti a tre volte l'inizio del processo. Il comando unset($foo) non ha sortito gli effetti sperati.</p>
<p>Su processi molto pesanti, il risultato pu&ograve; essere un'interruzione inaspettata a causa di un fabbisogno di memoria non corrisposto dalle potenzialit&agrave; del sistema. Come risolvere? <strong>Utilizzando il distruttore di classe</strong>.</p>
<p>Con PHP5 sono stati introdotti <a href="http://php.net/manual/en/language.oop5.decon.php" target="_blank">i costruttori e i distruttori di classe</a>. Per raggiungere il nostro scopo dobbiamo pensare ed usare un distruttore adeguato prima di lanciare unset. In questo modo la memoria verr&agrave; liberata adeguatamente. Di fatto trasformiamo quanto scritto sopra in quello che segue.</p>
<p><span class="Code">&lt;?php<br />
class Foo{<br />
&nbsp; function __construct(){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $this-&gt;bar = new Bar($this); <br />
&nbsp; }<br />
&nbsp; <br />
&nbsp; function __destruct(){<br />
&nbsp;&nbsp;&nbsp; unset($this-&gt;bar);<br />
&nbsp; }<br />
}<br />
<br />
class Bar{<br />
&nbsp; function __construct($foo = null){<br />
&nbsp;&nbsp;&nbsp; $this-&gt;foo = $foo;<br />
&nbsp; }<br />
}<br />
&nbsp;<br />
echo &quot;Memoria iniziale: &quot; . number_format(memory_get_usage(), 0, &quot;.&quot;, &quot;,&quot;) . &quot; bytes\n&quot;;<br />
for($a=0; $a&lt;=5000; $a++){<br />
&nbsp; $foo = new Foo();<br />
&nbsp; $foo-&gt;__destruct();<br />
&nbsp; unset($foo);<br />
}<br />
echo &quot;Picco di memoria: &quot; . number_format(memory_get_peak_usage(), 0, &quot;.&quot;, &quot;,&quot;) . &quot; bytes\n&quot;;<br />
echo &quot;Memoria finale: &quot; . number_format(memory_get_usage(), 0, &quot;.&quot;, &quot;,&quot;) . &quot; bytes\n&quot;;<br />
?&gt;</span></p>
<p>Quello che ci serve in questo caso &egrave; un distruttore per l'istanza di Foo(), che a sua volta produce la distruzione dell'istanza della classe Bar() svincolando di fatto il rapporto di parentela fra le due classi. Il risultato lanciando lo script &egrave; sorprendente.</p>
<pre>davide@laptop:~$ php public_html/memory.php <br />Memoria iniziale: 330,028 bytes<br />Picco di memoria: 336,652 bytes<br />Memoria finale: 330,128 bytes</pre>
<p>Le fluttuazioni fra picco, inizio e fine sono del tutto irrisorie.</p>
<p>Risorse esterne:</p>
<ul>
    <li><a target="_blank" href="http://www.alexatnet.com/node/73">Optimize PHP memory usage: eliminate circular references</a>.</li>
    <li><a target="_blank" href="http://paul-m-jones.com/?p=262">Memory Leaks With Objects in PHP 5.</a></li>
</ul><p>Tags: <a href="http://technorati.com/tag/php/" rel="tag">php</a>, <a href="http://technorati.com/tag/tutorial/" rel="tag">tutorial</a></p>]]></description>
<pubDate>Fri, 08 Jan 2010 23:41:31 +0100</pubDate>
<guid isPermaLink="false">http://www.davidonzo.com/post/1149/php-oop-memory-leaks-nell039uso-degli-oggetti/</guid>
</item>
<item>
<title>Jeremy Rifkin: tutto è servizio</title>
<link>http://www.davidonzo.com/post/1134/jeremy-rifkin-tutto-e-servizio/</link>
<description><![CDATA[<p></p><p><a href="http://en.wikipedia.org/wiki/Jeremy_Rifkin" target="_blank">Jeremy Rifkin</a> ha scritto &quot;<strong>L'era dell'accesso</strong>&quot; nel 2000, io l'ho letto nel 2002. Mi colp&igrave; tantissimo il capitolo 5: <strong>Tutto &egrave; servizio</strong>. Il prospettato declino della propriet&agrave; materiale, la smaterializzazione stessa dei beni. La fruizione dei servizi per rispondere a esigenze sempre pi&ugrave; proiettate a vedere il bene materiale come uno strumento sostituibile e la cui propriet&agrave; &egrave; solo un fattore eventuale.</p>
<p>Poi arriva Google, parte come un servizio semplicissimo. Oggi &egrave; invece qualcosa di complesso e volenti o nolenti, &egrave; un motore per lo sviluppo. Vero, a vole cannibalizza, ha una posizione dominante pericolosa, ma gli si deve dare atto di investire, produrre, creare.</p>
<p>Ci sono interi sistemi operativi totalmente gratuiti e dalle prestazioni professionali. Ubuntu ha sdoganato l'open source e la visione, all'interno di questo ambito, del software come servizio e non prodotto da piazzare.</p>
<p>Ma arriva sempre Google che adesso pensa a smaterializzare il sistema operativo. Non lo cede come prodotto per fornire servizi, ma &egrave; esso stesso un servizio. Basta guardare questo divertente video.</p>
<p align="center">[youtube]http://www.youtube.com/watch?v=0QRO3gKj3qw[/youtube]</p>
<p>Pensare che sette anni fa io stesso consideravo auspicabili, ma forse troppo favolesche le conclusioni di Rifkin un po' mi spiace, ma del resto, non &egrave; poi tanto male sbagliare :)</p><p>Tags: <a href="http://technorati.com/tag/Jeremy+Rifkin/" rel="tag">Jeremy Rifkin</a></p>]]></description>
<pubDate>Thu, 19 Nov 2009 23:50:45 +0100</pubDate>
<guid isPermaLink="false">http://www.davidonzo.com/post/1134/jeremy-rifkin-tutto-e-servizio/</guid>
</item>
<item>
<title>[CSS] Firefox 3.5 e proprietà word-wrap</title>
<link>http://www.davidonzo.com/post/1062/css-firefox-35-e-proprieta-wordwrap/</link>
<description><![CDATA[<p></p><p><img width="128" height="128" align="left" src="http://www.davidonzo.com/public/image/browser/firefox.png" alt="firefox" />Sembra incredibile, ma quello che molti considerano il browser migliore del mondo difettava della propriet&agrave; <a href="http://www.css3.com/css-word-wrap/" target="_blank">word-wrap</a> nella definizione dei CSS. Tale direttiva permette di gestire una singola parola che risulti strabordante rispetto alla larghezza dell'elemento in cui questa &egrave; contenuta.</p>
<p>In sostanza, se scrivo su un livello largo 70px la parola supercalifragilistichespiralitoso, settando una dimensione del testo a 12px, verosimilmente il contenuto del livello andr&agrave; oltre i 70px in larghezza. La propriet&agrave; word-wrap mi permette di decidere come gestire tale eventualit&agrave;.</p>
<p>Vediamo un esempio concreto:</p>
<div style="border: 1px inset rgb(204, 204, 204); margin: 10px auto; background: rgb(241, 241, 241) none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous; word-wrap: break-word; width: 70px;">supercalifragilistichespiralitoso</div>
<pre>&lt;div style=&quot;border: 1px inset #ccc; background:#f1f1f1; margin: 10px auto; word-wrap: break-word; width: 70px;&quot;&gt;supercalifragilistichespiralitoso&lt;/div&gt;</pre>
<p><br />
Finalmente anche Firefox decide di mandare a capo le lettere di troppo rispetto alla larghezza del livello. La propriet&agrave; ha sempre funzionato a dovere in Internet Explorer e nei browser basati su WebKit (Safari, Chrome, Epiphany, etc...)</p><p>Tags: <a href="http://technorati.com/tag/CSS/" rel="tag">CSS</a>, <a href="http://technorati.com/tag/Firefox/" rel="tag">Firefox</a>, <a href="http://technorati.com/tag/word-wrap/" rel="tag">word-wrap</a></p>]]></description>
<pubDate>Mon, 27 Jul 2009 12:11:48 +0200</pubDate>
<guid isPermaLink="false">http://www.davidonzo.com/post/1062/css-firefox-35-e-proprieta-wordwrap/</guid>
</item>
<item>
<title>Si è rotto Google.it?</title>
<link>http://www.davidonzo.com/post/1051/si-e-rotto-googleit/</link>
<description><![CDATA[<p></p><p>Capita solo a me? Dopo l'alert vien fuori una pagina bianca. Invece Google.COM funziona.</p>
<p align="center"><a href="http://www.davidonzo.com/public/image/browser/googleit.png" target="_blank" title="Clicca per ingrandire"><img width="450" height="281" src="http://www.davidonzo.com/public/image/browser/googleit-th.png" alt="Google si &egrave; rotto" style="border: 1px solid rgb(204, 204, 204); padding: 2px;" /></a></p>
<p><strong>EDIT</strong>: &egrave; ripartito :D</p><p>Tags: <a href="http://technorati.com/tag/Google/" rel="tag">Google</a></p>]]></description>
<pubDate>Mon, 29 Jun 2009 15:34:22 +0200</pubDate>
<guid isPermaLink="false">http://www.davidonzo.com/post/1051/si-e-rotto-googleit/</guid>
</item>
<item>
<title>LLOOGG - Registrazioni aperte a tutti!</title>
<link>http://www.davidonzo.com/post/1050/lloogg-registrazioni-aperte-a-tutti/</link>
<description><![CDATA[<p></p><p><a href="http://lloogg.com" target="_blank"><img height="30" width="204" align="left" src="http://www.davidonzo.com/public/image/browser/lloogg.png" alt="lloogg at davidonzo.com" /></a>Da qualche giorno <a href="http://merzia.com/" target="_blank">Merzia</a> ha deciso di aprire le iscrizioni a <a href="http://lloogg.com" target="_blank">LLOOGG</a>. Quindi non &egrave; pi&ugrave; necessario l'invito di un altro utente e chiunque pu&ograve; liberamente <a href="http://lloogg.com/register.html.php" target="_blank">registrare un account</a>.</p>
<p>Per quei due o tre che ancora non conoscono LLOOGG, questo &egrave; un servizio di statistiche in real time. Accedendo al proprio account si pu&ograve; vedere in tempo reale il join alle nostre pagine degli utenti con informazioni molto dettagliate. Il sistema ci dice da dove arriva la visita e la segue all'interno del web dandoci uno storico dettagliato della navigazione.</p>
<p>Dei grafici sono disponibili per una visione istantanea dell'andamento degli ultimi 40 giorni. Ma &egrave; anche possibile visualizzare il report grafico per mesi, settimane e anni. La funzione logaritmica aiuta ad <em>appiattire</em> le anomalie giornaliere. Se il giorno X abbiamo avuto pi&ugrave; del doppio delle visite medie giornaliere, visualizzando i grafici in funzione logaritmica riusciamo ad avere una visione ad occhio meno a scatti.</p>
<p>Il servizio &egrave; totalmente gratuito. Prevede registrazione e per monitorare il vostro sito web sar&agrave; necessario includere un paio di righe di codice javascript nelle vostre pagine. Per una demo del servizio guardate <a href="http://lloogg.com/demo" target="_blank">questo video messo a disposizione dagli sviluppatori</a>.</p><p>Tags: <a href="http://technorati.com/tag/LLOOGG/" rel="tag">LLOOGG</a></p>]]></description>
<pubDate>Mon, 29 Jun 2009 11:20:40 +0200</pubDate>
<guid isPermaLink="false">http://www.davidonzo.com/post/1050/lloogg-registrazioni-aperte-a-tutti/</guid>
</item>
<item>
<title>Icona "Aggiungi a Home" per web application iPhone</title>
<link>http://www.davidonzo.com/post/1049/icona-aggiungi-a-home-per-web-application-iphone/</link>
<description><![CDATA[<p></p><p>L'iPhone permette di gestire tramite Safari i preferiti come facciamo gi&agrave; sui dispositivi normali. Ma un altro modo di bookmarkare delle pagine web &egrave; quello di creare un testo nella dashboard del telefono. Un'icona, del tutto simile a quella delle altre applicazioni, che nei fatti &egrave; uno shortcut ad una pagina web che consideriamo particolarmente importante e vogliamo aprire velocemente.</p>
<p align="center"><img width="320" height="480" src="http://www.davidonzo.com/public/image/browser/iphone-touch-icon.jpg" alt="iphone-touch-icon at davidonzo.com" /></p>
<p>Quella che vedete indicata dalla freccia rossa nell'immagine sopra &egrave; semplicemente un collegamento a FriendFeed che si aprir&agrave; via Safari sull'iPhone. Ma come fare una cosa del genere?</p>
<p>La cosa &egrave; abbastanza semplice. Basta creare un'immagine PNG di dimensioni 45X45 pixel con quello che volete mostrare nell'icona dell'iPhone. Il nome ha poca importanza, ma per semplicit&agrave; chiameremo il file iphone-icon.png Salvatela sul server dove meglio credete e aggiungete ai tag del head delle pagine visualizzate tramite iphone la seguente riga.</p>
<p><span class="Code"><br />
&lt;link rel=&quot;apple-touch-icon&quot; href=&quot;http://www.examle.com/path/to/iphone-icon.png&quot; /&gt;<br />
</span></p>
<p>Ovviamente dovete personalizzare l'attributo href inserendo l'indirizzo corretto dell'immagine sul vostro server.</p><p>Tags: <a href="http://technorati.com/tag/iPhone/" rel="tag">iPhone</a>, <a href="http://technorati.com/tag/Web/" rel="tag">Web</a>, <a href="http://technorati.com/tag/Tutorial/" rel="tag">Tutorial</a></p>]]></description>
<pubDate>Sun, 28 Jun 2009 13:16:02 +0200</pubDate>
<guid isPermaLink="false">http://www.davidonzo.com/post/1049/icona-aggiungi-a-home-per-web-application-iphone/</guid>
</item>
<item>
<title>MyGalleryGenerator: una precisazione</title>
<link>http://www.davidonzo.com/post/1048/mygallerygenerator-una-precisazione/</link>
<description><![CDATA[<p></p><p><a target="_blank" href="http://www.mygallerygenerator.com"><img align="left" alt="mygallerygenerator" src="http://www.davidonzo.com/public/image/browser/mgg.png" /></a>E' on line da marzo e devo dire con mia soddisfazione che <a target="_blank" href="http://www.mygallerygenerator.com/">MyGalleryGenerator</a> ha riscontrato un certo successo. Molti ne hanno parlato e dalle statistiche vedo che il bisogno di creare gallerie di immagini in html era un problema pi&ugrave; sentito di quanto pensassi.</p>
<p>Mi piace pensare che l'idea mi &egrave; stata data da chi di programmazione e sviluppo non ha intenzione di capirne niente. Da chi vuole un risultato. Perch&egrave; spesso mi trovo a non riuscire a vedere problemi l&agrave; dove in realt&agrave; c'&egrave; un'esigenza ed una opportunit&agrave; conseguente.</p>
<p>Ultimamente ho letto pi&ugrave; di un articolo in giro per la rete in cui si parla della possibilit&agrave; di embeddare la galleria direttamente sul server. Il malinteso &egrave; sicuramente generato dal fatto che prima del download d&ograve; la possibilit&agrave; di visualizzare in anteprima il risultato finale. Ma come chiaramente scritto nelle <a target="_blank" href="http://www.mygallerygenerator.com/faq.html#cache">FAQ</a>, <strong>dopo aver generato la galleria, l'archivio compresso contenente la stessa e la preview, si hanno 5 minuti di tempo per scaricare il tutto. Dopo di che ogni file viene distrutto permanentemente dal server</strong>.</p>
<p>I motivi sono abbastanza chiari:</p>
<ul>
    <li>Non si richiede registrazione per l'uso del servizio. Quindi vostra scelta libera usare l'applicativo, ma non di meno, nostra volont&agrave; di non trattenere documenti uploadati da anonimi sul server. Potrebbe trattarsi di materiale pornografico, di foto rubate, di qualsiasi altra cosa. Non c'&egrave; l'intenzione di metterci nei casini per dare un servizio gratuito.</li>
    <li>Il secondo motivo &egrave; tecnico. Il server non reggerebbe la quantit&agrave; di richieste provenienti dai client che visualizzano le gallerie ed il contemporaneo lavoro di produzione delle stesse. Presumo si andrebbe gi&ugrave; in certi momenti ed anche in questo caso, viste le disponibilit&agrave; finanziarie, si doveva scegliere fra l'indebitamento e la soluzione che poi si &egrave; implementata.</li>
</ul>
<p>In sostanza ricordate che se generate una galleria di immagini, dovete poi hostarla su un vostro server. Ed invito tutti quelli che scrivono due righe sul servizio di essere chiari in tal proposito, onde evitare segnalazioni di protesta sul genere del &quot;<em>perch&egrave; avete cancellato la mia galleria???</em>&quot;</p>
<p>A questa richiesta &egrave; giusto affiancare un sentito grazie a tutti quelli che parlandone sono i veri fautori del piccolo successo di MyGalleryGenerator :)</p><p>Tags: <a href="http://technorati.com/tag/MyGalleryGenerator/" rel="tag">MyGalleryGenerator</a></p>]]></description>
<pubDate>Fri, 26 Jun 2009 00:22:14 +0200</pubDate>
<guid isPermaLink="false">http://www.davidonzo.com/post/1048/mygallerygenerator-una-precisazione/</guid>
</item>
<item>
<title>Google Maps - Un marker personalizzato</title>
<link>http://www.davidonzo.com/post/1046/google-maps-un-marker-personalizzato/</link>
<description><![CDATA[<p></p><p>Pu&ograve; essere molto utile usare un marker personalizzato. I marker, abbiamo gi&agrave; visto qualche articolo fa, sono i segnalibri che compaiono sulla mappa di Google ed indicato una determinata coordinata.</p>
<p>L'uso del marker personalizzato riesce a distogliere l'utente dalla mappa stessa ed a farla personalizzare con il proprio web, prescindendo quindi da Google. Inoltre un uso dinamico dei marker permette una lettura veloce dei punti segnalati. Possiamo usare un marker a forma di ristorante per indicare i punti di ristoro, uno a forma di croce per indicare gli ospedali, e cos&igrave; via.</p>
<p>In codice tutto risulta abbastanza semplice e si esplica nell'istanziare l'oggetto <strong>GIcon</strong>. Di seguito un facile esempio:</p>
<p><span class="Code">&nbsp;&nbsp;&nbsp; var map = null;<br />
&nbsp;&nbsp;&nbsp; var geocoder = null;<br />
&nbsp;&nbsp;&nbsp; var address = '97015 Italy';<br />
<br />
&nbsp;&nbsp;&nbsp; function initialize() {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (GBrowserIsCompatible()) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var map = new GMap2(document.getElementById(&quot;gmaps&quot;));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var geocoder = new GClientGeocoder();<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(document.getElementById('addr').value != ''){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; address = document.getElementById('addr').value;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var baseIcon = new GIcon(G_DEFAULT_ICON);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; baseIcon.shadow = null;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; baseIcon.image = 'http://www.davidonzo.com/gmaps/icon/3.png';<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; markerOptions = { icon:baseIcon };<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; geocoder.getLatLng(address, function(point){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(!point){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; alert('Spiacente, indirizzo non trovato');<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }else{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var marker = new GMarker(point, markerOptions);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; markerOptions = { icon:baseIcon };<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; map.addOverlay(marker);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; GEvent.addListener(marker, &quot;click&quot;, function() {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; marker.openInfoWindowHtml('Coordinate&lt;br /&gt;'+point);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; });<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; map.setCenter(point, 8);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; });<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; map.setUIToDefault();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; }</span></p>
<p>Come sempre <strong><a href="http://www.davidonzo.com/gmaps/gmaps-self-marker.html" target="_blank">una pagina con un esempio un po' pi&ugrave; complesso, da usare al volo</a></strong>.</p><p>Tags: <a href="http://technorati.com/tag/GMaps/" rel="tag">GMaps</a>, <a href="http://technorati.com/tag/Googla+Maps/" rel="tag">Googla Maps</a>, <a href="http://technorati.com/tag/Marker/" rel="tag">Marker</a></p>]]></description>
<pubDate>Mon, 22 Jun 2009 13:01:53 +0200</pubDate>
<guid isPermaLink="false">http://www.davidonzo.com/post/1046/google-maps-un-marker-personalizzato/</guid>
</item>
<item>
<title>[PHP] Anno bisestile o no?</title>
<link>http://www.davidonzo.com/post/1045/php-anno-bisestile-o-no/</link>
<description><![CDATA[<p></p><p>Come controllare se un anno &egrave; bisestile o no? Domanda posta qualche minuto fa su un gruppo di discussione sul PHP che seguo abbastanza assiduamente. Le risposte non si sono fatte attendere (bella community da questo punto di vista), ma le soluzioni proposte andavano dalle 20 righe di codice in su, con controlli ciclici, serializzazioni degli anni bisestili in improbabili array degli anni bisestili dell'ultimo secolo. Ho trovato girovagando altre soluzioni pi&ugrave; pulite, ma sempre eccessivamente dispendiose per l'uso di memoria di sistema.</p>
<p>All'utente interessa sapere solo se quel determinato anno &egrave; bisestite o no. Un anno bisestile ha in calendario sempre il 29 Febbraio. Quindi, se quel giorno &egrave; calendarizzato l'anno sar&agrave; sicuramente bisestile, altrimenti &egrave; un anno normale.</p>
<p>Basta un semplice controllo con <a target="_blank" href="http://us2.php.net/manual/en/function.checkdate.php">checkdate()</a>.</p>
<p><span class="Code">&nbsp; function isLeapYear($year){<br />
&nbsp;&nbsp;&nbsp; if(checkdate(2,29,$year)){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return $year.' is a leap year';<br />
&nbsp;&nbsp;&nbsp; }else{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return $year.' is not a leap year';<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp; }</span></p>
<p>Un semplicissimo ciclo if che controlla l'esistenza di una data specificata. Possiamo estremizzare ulteriormente il codice in tre righe e darne un output booleano.</p>
<p><span class="Code">&nbsp; function isLeapYear($year){<br />
&nbsp;&nbsp;&nbsp; return (checkdate(2,29,$year)) ? true : false;<br />
&nbsp; }</span></p>
<p>Semplice no?! :-)</p><p>Tags: <a href="http://technorati.com/tag/PHP/" rel="tag">PHP</a></p>]]></description>
<pubDate>Thu, 18 Jun 2009 11:27:14 +0200</pubDate>
<guid isPermaLink="false">http://www.davidonzo.com/post/1045/php-anno-bisestile-o-no/</guid>
</item>
<item>
<title>Cara agenzia di marketing</title>
<link>http://www.davidonzo.com/post/1039/cara-agenzia-di-marketing/</link>
<description><![CDATA[<p></p><p>Quando ci fai sapere che hai intenzione di aprire un network di blog che parla di <strong>X</strong>, non star l&igrave; a menarmela con le solite storielle della condivisione, del sapere globale, della notizia che arriva dal basso. Io faccio lo sviluppatore web ed ho studiato tanto marketing, quindi riesco ad avere una visione di insieme e soprattutto ho una certa facilit&agrave; a tradurre le tua frasi da venditore di fumo.</p>
<p>Hai capito che con l'advertising on line si guadagna. Ma sai che per farlo fruttare devi avere accessi freschi, che preludono a contenuti nuovi pi&ugrave; che giornalmente. Hai anche notato che nei risultati dei motori di ricerca, inviando una query su un fatto di cronaca, vicino ai mega testatoni giornalistici esce spesso un <em>$mettiNomeQualunque's blog</em>.</p>
<p>Vuoi evitare di registrare una testata giornalistica. Sono costi reali e figurati in termini di organizzazione. Ma pu&ograve; darsi anche che la registrazioen sia un problema relativo. Magari vuoi solamente evitare gli aggravi istituzionali. D'altra parte non hai ancora i mezzi per pagare un giornalista (o magari non vuoi), che essendo un professionista della notizia pretender&agrave; (giustamente) un compenso equipollente.</p>
<p>Ti rivolgi ad un blogger perch&egrave; ti garantisce spam a costo zero. Promuover&agrave; la nuova collaborazione nel suo blog e cercher&agrave; di far circolare la notizia. Ma anche perch&egrave; puoi pagarlo in percentuale sugli introiti pubblicitari, assicurandoti anche un controllo redazionale che un giornalista vero difficilmente accetterebbe.</p>
<p>Hai messo tutte queste informazioni insieme, hai notato che qualcuno c'ha gi&agrave; <a target="_blank" href="http://www.blogo.it/">pensato</a> <a target="_blank" href="http://blogosfere.it/">prima</a> di te e le cose gli sono andate anche bene.</p>
<p>Quindi quello che vuoi fare &egrave;:</p>
<ul>
    <li>Implementare con un nome nuovo un'idea vecchia.</li>
    <li>Risparmiare sul personale rivolgendoti ad un blogger piuttosto che ad un professionista.</li>
    <li>Ottenere un ROI che vada oltre il 50%.</li>
    <li>Disinvestire velocemente qualora le cose non dovessero andare secondo i piani.</li>
</ul>
<p>Sappi che in tutto questo io non ci vedo niente di male, ma chiamare le cose con il proprio nome &egrave; il primo passo per rendermi interessato.</p>
<p>PS: i blog network di successo in Italia esistono e sono tutti stati attivati da altri blogger, che non solo conoscono il sistema, ma ne fanno parte e se ne sentono elemento naturale. La differenza &egrave; sostanziale.</p><p>Tags: <a href="http://technorati.com/tag/Marketing/" rel="tag">Marketing</a>, <a href="http://technorati.com/tag/Blog/" rel="tag">Blog</a></p>]]></description>
<pubDate>Wed, 10 Jun 2009 12:13:07 +0200</pubDate>
<guid isPermaLink="false">http://www.davidonzo.com/post/1039/cara-agenzia-di-marketing/</guid>
</item>
<item>
<title>Just another AJAX gallery</title>
<link>http://www.davidonzo.com/post/1038/just-another-ajax-gallery/</link>
<description><![CDATA[<p></p><p>Trovo molto fastidiose le gallerie di immagini presenti nei quotidiani on line. Per andare avanti di una immagine bisogna ricaricare completamente la pagina, che di solito &egrave; stracolma di advertising molti dei quali in embedding da altri host su quella pagina. D'altra parte la soluzione trovata da alcuni, caricare tutte le immagini in elementi nascoti via css e farli magicamente apparire, non &egrave; tanto meglio, visto che potrei non voler vedere tutte le millemila immagini.</p>
<p>Un po' per gioco, un po' perch&egrave; potrebbe essere utile a qualcuno, ho scritto un piccolo script che permette di visualizzare una galleria senza troppo sforzo e soprattutto ricaricando volta per volta la sola immagine e non l'intero html.</p>
<p>Molto basilare. Nessuna miniatura, ma solo l'immagine con le frecce per andare avanti e indietro. C'&egrave; da dire che per aggiungere/togliere un'immagine alla galleria basta inserirla/rimuoverla da una directory.</p>
<p>Ho visto che ci sono migliaia di cose del genere in giro (e non mi spiego perch&egrave; le testate giornalistiche non ne usino almeno una). Per questo ho deciso di chiamare il giochetto &quot;Just another AJAX gallery&quot;. <strong><a target="_blank" href="http://www.davidonzo.com/ajaxstudy/ajaxgallery/">Qui &egrave; possibile vederne una demo</a></strong>.</p>
<p>Visto che &egrave; una cosa fatta in cinque minuti e gli vedo grandi miglioramenti e potenziamenti possibili, metto il codice a disposizione di tutti. Nella speranza che qualcuno lo migliori e ne condivida la cosa.</p>
<p align="center"><a href="http://www.davidonzo.com/public/file/ajaxgallery.tar.gz" target="_blank"><img height="100" width="405" style="border: 1px solid rgb(204, 204, 204); padding: 2px;" alt="Download Just another ajax gallery" src="http://www.davidonzo.com/public/image/browser/downloadajaxgallery.jpg" /></a></p>
<p>La configurazione &egrave; facilissima:</p>
<ul>
    <li>Scompattate l'archivio ed inviatelo al server nella directory che ospiter&agrave; la galleria</li>
    <li>Aprile il file function.js e modificate la seconda riga in accordo con l'URL della vostra galleria</li>
    <li>Inserite le immagini che volete nella directory /images/</li>
</ul>
<p>Buon divertimento :-)</p><p>Tags: <a href="http://technorati.com/tag/AJAX/" rel="tag">AJAX</a>, <a href="http://technorati.com/tag/JavaScript/" rel="tag">JavaScript</a></p>]]></description>
<pubDate>Tue, 09 Jun 2009 20:29:43 +0200</pubDate>
<guid isPermaLink="false">http://www.davidonzo.com/post/1038/just-another-ajax-gallery/</guid>
</item>
<item>
<title>Google Maps - Oggetto GMarker e gestione openInfoWindowHtml</title>
<link>http://www.davidonzo.com/post/1036/google-maps-oggetto-gmarker-e-gestione-openinfowindowhtml/</link>
<description><![CDATA[<p></p><p>Quante volte abbiamo visto mappe di GMaps con uno o tanti marker i quali cliccati mostravano la famosa nuvoletta con delle informazioni scritte all'interno. Molto utile se oltre a voler indicare visivamente le coordinate di un punto vogliamo anche dare informazioni ulteriori sul luogo.</p>
<p>Abbiamo gi&agrave; visto come produrre ed inserire in un punto preciso della mappa un marker. Oggi vedremo come abbellirlo con del testo inserito nella famosa nuvoletta, che comparir&agrave; al click dell'utente sul marker.</p>
<p>Il tutto &egrave; abbastanza semplice e si ottiene facendo lavorare di pari passo l'oggetto GMarker, che ci restituisce il puntatore a mappa e la classe GEvent, aggiungendo un listener all'evento onClick del marker generato mostri la nuvola (openInfoWindowHtml). Sembra uno scioglilingua, ma leggendo il codice apparir&agrave; tutto pi&ugrave; chiaro.</p>
<p><span class="Code">&nbsp;&nbsp;&nbsp; var map = null;<br />
&nbsp;&nbsp;&nbsp; var geocoder = null;<br />
&nbsp;&nbsp;&nbsp; var address = '97015 Italy';<br />
<br />
&nbsp;&nbsp;&nbsp; function initialize() {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (GBrowserIsCompatible()) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var map = new GMap2(document.getElementById(&quot;gmaps&quot;));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var geocoder = new GClientGeocoder();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(document.getElementById('addr').value != ''){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; address = document.getElementById('addr').value;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; geocoder.getLatLng(address, function(point){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(!point){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; alert('Spiacente, indirizzo non trovato');<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }else{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var marker = new GMarker(point);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; map.addOverlay(marker); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; GEvent.addListener(marker, &quot;click&quot;, function() {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; marker.openInfoWindowHtml('Coordinate&lt;br /&gt;'+point);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; });<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; map.setCenter(point, 8);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; });<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; map.setUIToDefault();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; }</span></p>
<p>In questo caso, per semplicit&agrave;, ho deciso di mostrare le coordinate LatLng del punto a cui il marker fa riferimento. E' ovvio che avrei potuto scrivere la qualsiasi cosa, in semplice codice HTML.</p>
<p>Come sempre, <strong><a target="_blank" href="http://www.davidonzo.com/gmaps/gmaps-marker.html">una pagina per testare live quanto detto</a></strong>.</p><p>Tags: <a href="http://technorati.com/tag/GMaps/" rel="tag">GMaps</a>, <a href="http://technorati.com/tag/Googla+Maps/" rel="tag">Googla Maps</a></p>]]></description>
<pubDate>Tue, 02 Jun 2009 17:50:08 +0200</pubDate>
<guid isPermaLink="false">http://www.davidonzo.com/post/1036/google-maps-oggetto-gmarker-e-gestione-openinfowindowhtml/</guid>
</item>
<item>
<title>Privacy, informazione e diritto alla presunzione di innocenza</title>
<link>http://www.davidonzo.com/post/1034/privacy-informazione-e-diritto-alla-presunzione-di-innocenza/</link>
<description><![CDATA[<p></p><p><a href="http://nessunotocchitanino.blogspot.com/" target="_blank"><img align="left" src="http://3.bp.blogspot.com/_IANr7_7tkQI/SUEEfFWrgGI/AAAAAAAACGU/qMZHiSH7Aws/S240/vergogna.jpg" alt="tanino on the web" /></a>Il buon <a href="http://nessunotocchitanino.blogspot.com/" target="_blank">Tanino</a> ce lo ricorda da tempo: pubblicare le foto segnaletiche di persone in fermo giudiziale che non abbiano ancora avuto una codanna post processo &egrave; reato.</p>
<p>Il concetto &egrave; abbastanza semplice. Se Tizio viene arrestato, sicuramente in caserma verr&agrave; schedato con tanto di foto segnaletica. Chiunque venga, <em>inspiegabilmente</em>, in possesso di tali foto, non pu&ograve; pubblicarle su giornali, siti internet. Non possono essere trasmesse in telegiornali. In qualsiasi modo un giornalista pu&ograve; dare diffusione alla faccia di un accusato, che per Costituzione Italiana &egrave; innocente fino a prova contraria.</p>
<p>Non &egrave; un mio modo di vedere le cose. <a href="http://www.garanteprivacy.it/garante/doc.jsp?ID=1359917#40" target="_blank">Il Garante alla Privacy &egrave; piuttosto perentorio sul discorso</a>.</p>
<p>Quanti rispettano questo principio? Pochi, troppo pochi. E purtroppo ancora una volta devo constatare che i mezzi di informazione di Modica si dimostrano pecore nere in tal senso. Giusto in questo momento, due fra le pi&ugrave; importanti testate on line della provincia, mostrano un home page pi&ugrave; di una notizia del genere con tanto di foto segnaletica.</p>
<p>Come reagire alla cosa? Semplice. Sappiate che &egrave; possibile contattare il Garante Privacy anche con s<a href="http://www.garanteprivacy.it/garante/doc.jsp?ID=1086982" target="_blank">emplici segnalazioni</a>. Non devono seguirsi particolari formalit&agrave; e sembra si possa inviare anche una email.</p>
<p>Se a questio aggiungiamo un bel colpo di <strong><a href="http://www.hashbot.com" target="_blank">hashbot.com</a></strong> alle pagine incriminate, la nostra segnalazione avr&agrave; anche una scientificit&agrave; valida. Per chi non lo sapesse il servizio permette di <em>congelare</em> una pagina web e validarla nel tempo. Tramite il calcolo dell'impronta digitale del file interessato (che pu&ograve; essere una pagina web, un'immagine, un file di qualsiasi tipo, purch&egrave; sia un documento presente su un sito web), saremo in grado di dire nel tempo che quella pagina, nel momento in cui la validiamo, era in quello stato. Leggete le <a href="http://www.hashbot.com/faq.html" target="_blank">FAQ</a> per maggiori informazioni, ma ricordate che in questo caso &egrave; bene validare sia la pagina che il file immagine incriminato.</p>
<p>Potrebbe essere un'idea e chiss&agrave; che qualcuno non cambi linea editoriale, appaiando il diritto all'informazione a quello alla dignit&agrave; personale.</p><p>Tags: </p>]]></description>
<pubDate>Fri, 29 May 2009 19:21:00 +0200</pubDate>
<guid isPermaLink="false">http://www.davidonzo.com/post/1034/privacy-informazione-e-diritto-alla-presunzione-di-innocenza/</guid>
</item>
<item>
<title>Google Maps - Oggetto GClientGeocoder</title>
<link>http://www.davidonzo.com/post/1033/google-maps-oggetto-gclientgeocoder/</link>
<description><![CDATA[<p></p><p><img align="left" src="http://www.davidonzo.com/public/google_logo.gif" alt="Logo google" />I servizi di geolocalizzazione ormai si sprecano. Far sapere dove sei ed in che momento, se in parte mina la tua privacy, dall'altro pu&ograve; essere viatico di buone opportunit&agrave;. D'altra parte chi non vuole far sapere dove sta in un dato momento, basta che spenga il ricevitore gps :-)</p>
<p>Ma a noi oggi questo non interessa. Quello che vogliamo &egrave; trovare un luogo avendo informazioni non necessariamente precise. Per questo ci aiuta <a target="_blank" href="http://maps.google.it/">Google Maps</a> e l'oggetto <a target="_blank" href="http://code.google.com/intl/it-IT/apis/maps/documentation/reference.html#GClientGeocoder">GClinetGeocoder</a>.</p>
<p>Google Maps gestisce le varie posizioni di una mappa tramite un punto identificato da latitudine e longitudine. Quindi servirebbe avere un gigantesco database punto a punto con riferimenti incrociati per ottenere la corrispondenza di un punto ad un input di tipo testo che descrive un indirizzo.</p>
<p>Fortunatamente ci viene in aiuto GMaps mettendoci a disposizione una classe che si occupa di recuperare le coordinate di un indirizzo, anche quando questo riporta dati sommari.</p>
<p><span class="Code">var geocoder = new GClientGeocoder();<br />
geocoder.getLatLng(address, YourCallbackFunction(point));</span></p>
<p>Istanziando l'oggetto GClientGeocoder possiamo sfruttarne il metodo getLatLng per ricavare le coordinare necessario. Oltre questo, possiamo richiamare una funzione di callback che direttamente dal predetto metodo sar&agrave; in grado di gestire la risposta alle coordinate date. Possiamo ad esempio aggiungere direttamente un marker alla mappa. Di seguito un esempio:</p>
<p><span class="Code">&nbsp;&nbsp;&nbsp; var map = null;<br />
&nbsp;&nbsp;&nbsp; var geocoder = null;<br />
&nbsp;&nbsp;&nbsp; var address = '97015 Italy';<br />
<br />
&nbsp;&nbsp;&nbsp; function initialize() {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (GBrowserIsCompatible()) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var map = new GMap2(document.getElementById(&quot;gmaps&quot;));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var geocoder = new GClientGeocoder();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; geocoder.getLatLng(address, function(point){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(!point){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; alert('Spiacente, indirizzo non trovato');<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }else{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var marker = new GMarker(point);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; map.addOverlay(marker); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; map.setCenter(point, 8);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; });<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; map.setUIToDefault();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; }</span></p>
<p>Stabilendo come indirizzo di default 97015 Italy, il geocoder andr&agrave; a cercare una coordinata coerente e nel nostro caso si posizioner&agrave; su Modica, al centro della zona che ha come CAP 97015. Avremmo potuto essere pi&ugrave; precisi, specificando un indirizzo valido, finanche un numero civico.</p>
<p>Se il geocoder non trova nessuna corrispondenza avvertir&agrave; l'utente dell'errore arrestandosi subito dopo, altrimenti piazzer&agrave; un marker nel punto trovato e centrer&agrave; la mappa con riferimento a questo.</p>
<p>Tutto abbastanza semplice. <strong><a target="_blank" href="http://www.davidonzo.com/gmaps/gmaps-geocoder.html">Ma un esempio pratico pu&ograve; aiutare molto</a></strong>. Provate ad inserire nella form il vostro indirizzo di casa e vedrete che GMaps vi scover&agrave; in men che non si dica :-)</p><p>Tags: <a href="http://technorati.com/tag/Google/" rel="tag">Google</a>, <a href="http://technorati.com/tag/Gmaps/" rel="tag">Gmaps</a></p>]]></description>
<pubDate>Thu, 28 May 2009 19:27:22 +0200</pubDate>
<guid isPermaLink="false">http://www.davidonzo.com/post/1033/google-maps-oggetto-gclientgeocoder/</guid>
</item>
<item>
<title>Google Street View e quel lampione sospeso</title>
<link>http://www.davidonzo.com/post/1023/google-street-view-e-quel-lampione-sospeso/</link>
<description><![CDATA[<p></p><p>Uno strano alone. Forse la scia di una sciabola. Cosa avr&agrave; provocato cotanto effetto? E come mai c'&egrave; solo quel lampione fuori fase, mentre il resto dell'immagine &egrave; perfettamente in linea?</p>
<p>Catania &egrave; una citt&agrave; dalle mille sorprese, ma non pensavo si potesse arrivare a tanto. Il Viale Andrea Doria, una delle zone pi&ugrave; trafficate della citt&agrave; dell'elefante, con una delle pi&ugrave; alte densit&agrave; cantieristiche del pianeta. Sar&agrave; che tutti guardano le buche e non si sono accorti dell'evento.</p>
<p>Magia? Mistero? Apparizioni? Sparizioni? Photoshop, Gimp o il famigerato Paint?</p>
<p align="center"><a target="_blank" href="http://www.davidonzo.com/public/image/sciocchezze/streetviewCatania.jpg"><img height="220" width="500" title="Clicca per ingrandire" alt="Google Street View" src="http://www.davidonzo.com/public/image/sciocchezze/th-streetviewCatania.jpg" style="border: 1px solid rgb(204, 204, 204);" /></a></p>
<p>Io fra pochi minuti vado a mangiare. Ci passo di fronte e verifico. Non sia mai che eventi soprannaturali passino inosservati. Intanto Google potrebbe rinominare il suo progetto in <strong>Streeet </strong><em><strong>MyView</strong></em>.</p>
<p><strong><a href="http://maps.google.it/maps?f=q&amp;source=s_q&amp;hl=it&amp;geocode=&amp;q=Viale+Andrea+Doria,+Catania,+Catania+(Sicily),+Italy&amp;sll=41.894036,12.432661&amp;sspn=0.034182,0.090981&amp;g=Via+Gregorio+VII,+466,+00165+Roma,+Roma+(Lazio)&amp;ie=UTF8&amp;ll=37.525231,15.077641&amp;spn=0.009105,0.022745&amp;z=16&amp;iwloc=A&amp;layer=c&amp;cbll=37.524628,15.074587&amp;panoid=1JJpI3t10E2DexX5yyiQ3w&amp;cbp=12,36.88,,1,-18.48" target="_blank">Il link alla mappa.</a></strong></p><p>Tags: <a href="http://technorati.com/tag/Google/" rel="tag">Google</a>, <a href="http://technorati.com/tag/Street+View/" rel="tag">Street View</a>, <a href="http://technorati.com/tag/Catania/" rel="tag">Catania</a>, <a href="http://technorati.com/tag/Viale+Andrea+Doria/" rel="tag">Viale Andrea Doria</a></p>]]></description>
<pubDate>Thu, 14 May 2009 12:09:39 +0200</pubDate>
<guid isPermaLink="false">http://www.davidonzo.com/post/1023/google-street-view-e-quel-lampione-sospeso/</guid>
</item>
<item>
<title>Sviluppo web sostenibile: il template engine</title>
<link>http://www.davidonzo.com/post/1020/sviluppo-web-sostenibile-il-template-engine/</link>
<description><![CDATA[<p></p><p><img width="180" height="135" align="left" src="http://www.davidonzo.com/public/image/browser/puzzle.jpg" alt="puzzle at davidonzo.com" />Lo sviluppo web moderno prevede un uso solo marginale di codice HTML statico. Eppure l'output di una applicazione web &egrave; principalmente di questo tipo. Che sia pyton, perl, php, ruby o qualsiasi altro linguaggio server side, il risultato che vogliamo ottenere nella maggior parte dei casi &egrave; codice html da visualizzare via browser.</p>
<p>Quello che vediamo in ultimo &egrave; il risultato di un processo complesso di aggregazione di dati, calcolo di variabili, manipolazioni di stringhe... A monte quindi c'&egrave; qualcosa di estremamente diverso. Una serie di processi sistemici che permettono di raggiungere l'obiettivo finale.</p>
<p>Proprio perch&egrave; si parla di processi sistemici, &egrave; evidente la possibilit&agrave; di vedere la creazione di una pagina web in termini di &quot;<em>ciclo di vita</em>&quot;.</p>
<p>Si parte dalla richiesta del client remoto. Questa avr&agrave; dei parametri che l'applicazione andr&agrave; ad elaborare. Una volta ottenuti tutti i dati necessari &egrave; possibile produrre l'output desiderato. Oggi parliamo proprio dell'ultima fase e di quanto sia conveniente delegare un processo proprio alla creazione del risultato finale.</p>
<h3>Template Engine</h3>
<p>Sta in questo il <em><strong>template engine</strong></em>. Bella definizione con cui si vuole sintetizzare l'attitudine di un'applicativo web a creare output visuale in modalit&agrave; indipendente dai processi di acquisizione ed elaborazione della richiesta remota.</p>
<p>E' un po' quello che succede in questo blog, ma anche in wordpress, joomla e la quasi toalit&agrave; dei content management system open source in circolazione. La gestione del template &egrave; completamente separata ed indipendente dal resto del sistema. Il template engine viene usato dal core code dell'applicazione come uno dei tanti strumenti di elaborazione dati. Nel caso specifico un processo di finalizzazione.</p>
<h3>Come agire in concreto</h3>
<p>Le modalit&agrave; operative di implementazione di un sistema di template engine partono da un presupposto di progettazione abbastanza preciso: l'applicativo che si vuole realizzare deve essere visto come una serie di processi indipendenti e collegati fra loro in modalit&agrave; sussidiare ad un motore centrale.</p>
<p>Questo permette non solo di creare un buon concept dell'applicazione, ma anche di rendere portabile le varie fasi in altri progetti. In una logica ampia la progettualit&agrave; di un'applicazione web che vede le seguenti fasi:</p>
<ul>
    <li>Ricezione richiesta remota.</li>
    <li>Elaborazione della richiesta.</li>
    <li>Rilascio dei dati risultanti dall'elaborazione.</li>
    <li>Rappresentazione grafica tramite template.</li>
</ul>
<p>L'ultima fase &egrave; quella che si relazione con l'utente finale. Il front office dell'applicazione web si occupa di <em>consegnare il pacco al cliente</em>. Ma penseranno i processi di produzione ad elaborare la richiesta e preparare il tutto per il fiocco finale.</p>
<h3>Template strutturali e funzionali</h3>
<p>Si pu&ograve; affermare che ogni template engine sia un sistema strutturale. Avr&agrave; i suoi processi interni di gestione ed interfacciamento con il core code. In una logica di separazione delle fasi di processo, riuscir&agrave; ad adattarsi al sistema che deve servire mantenendo un'alta scalabilit&agrave; in termini di facile implementazione di interfaccia.</p>
<p>La funzionalit&agrave; del template engine &egrave; invece una scelta pi&ugrave; radicale. Si pu&ograve; decidere infatti che il templating sia atto solo a visualizzare, nel formato adatto, il risultato della richiesta cliente. In altri casi si pu&ograve; anche decidere di destinare al template parte dell'elaborazione, passando a questo dati a livello pi&ugrave; grezzo.</p>
<p>Non esiste una scelta migliore e molto dipende dalle modalit&agrave; di rilascio dell'applicativo. Un esempio di template engine strutturale e poco funzionale &egrave; <a target="_blank" href="http://www.smarty.net">Smarty</a>. Tramite l'utilizzo di file .tpl ed un interfacciamento semplice, riesce a gestire le risultanze passategli da un sistema complesso. Sconta, come ogni altro sistema del genere, la necessit&agrave; di implementazione nel core code di nuove funzionalit&agrave; anche per modifiche banali. Si presta per&ograve; molto bene ad essere incluso in software proprietari a rilascio privato. In questo caso le personalizzazioni e le modifiche successive trovano logica in una modifica diretta del motore centrale dell'applicativo. Mentre il front end pu&ograve; essere gestito facilmente da personale che abbia grandi conoscenze di styling puro, senza bisogno di competenze a livello di scripting.</p>
<p>Per i software a rilascio pubblico e diffuso invece, si consiglia l'utilizzo di un template engine funzionale. Meglio se scritto nello stesso linguaggio di programmazione usato dal motore principale.</p>
<p>L'esempio banale &egrave; wodpress. Il sistema di template &egrave; scritto in PHP. I file di template sono scritti in PHP. Lo stesso motore centrale fornisce numerose api per implementare nuove funzionalit&agrave; all'interno del visuale utente. Perch&egrave; questo? Wordpress &egrave; un software open source, a rilascio diffuso e frequente. Nuove funzionalit&agrave; che non prevedono scrittura nel database possono essere inserite direttamente nel template. In questo modo, insieme al sistema di plugin, si riesce a non toccare mai il cuore dell'applicazione, potendo procedere ad aggiornamenti di struttura in maniera indipendente e quindi sostenibile.</p>
<h3>Solo HTML?</h3>
<p>Lo stesso principio con cui strutturiamo il template engine per la produzione di output HTML pu&ograve; essere utilizzato per qualsiasi tipo di output. Ipotizziamo di dover rilasciare un'immagine jpeg con un testo arbitrario. Probabilmente avremo un processo per selezionare l'immagine di sfondo. Un altro proceso si occuper&agrave; di processare la stringa da scrivere sull'immagine stessa. Se tale funzione &egrave; ripetitiva risulta pi&ugrave; economico creare un file di template unico che si occuper&agrave; di mostrare il risultato, piuttosto che far produrre il jpeg al codice operativo. Stesso discorso per file XML, PDF, CVS e altro.</p>
<p>Tutte queste sono nozioni di base e del tutto teoriche. Nessun esempio di codice &egrave; inserito proprio perch&egrave; l'intento &egrave; quello di mostrare una logica progettuale efficace ed efficiente. Per le modalit&agrave; operative, buon lavoro :-)</p><p>Tags: <a href="http://technorati.com/tag/Template+Engine/" rel="tag">Template Engine</a></p>]]></description>
<pubDate>Sat, 09 May 2009 20:49:34 +0200</pubDate>
<guid isPermaLink="false">http://www.davidonzo.com/post/1020/sviluppo-web-sostenibile-il-template-engine/</guid>
</item>
<item>
<title>0932blog - Forse a qualcosa siam serviti</title>
<link>http://www.davidonzo.com/post/1018/0932blog-forse-a-qualcosa-siam-serviti/</link>
<description><![CDATA[<p></p><p>Come qualcuno avr&agrave; notato 0932blog.it non esiste pi&ugrave;. Ovvero &egrave; stato chiuso a tempo indeterminato da me. I motivi potrebbero apparire vari, ma di base la ragione &egrave; una ed una sola.</p>
<h3>Preambolo</h3>
<p>Quando decisi di aprire il blog mi resi subito conto che doveva essere uno spazio tenuto a pi&ugrave; mani. Sia per il tempo che l'impegno prendeva, sia perch&egrave; un blog che parla di una realt&agrave; locale &egrave; giusto che sia tenuto da pi&ugrave; teste, che magari non sono sempre in accordo. Pensai che un buon modo per stimolare la dialettica sociale in una terra che sconta il digital divide pi&ugrave; di altre, fosse far partire questa dal suo interno.</p>
<p>Ma d'altra parte pur sempre di un blog si trattava. Non un sito in informazione in senso stretto. Non siamo giornalisti, e personalmente penso non lo sar&ograve; mai. Quindi ho chiesto - quasi preteso - un tono che non sia formale. Scrivere in prima persona, dare semrpe la propria opinione. Ma soprattutto, nel momento in cui si racconta un fatto che vien visto come sbagliato, <strong>motivare questa presa di posizione e scrivere una contro-proposta accettabile</strong>.</p>
<p>Io stesso ho cassato un paio di articoli dal tono pretenzioso, senza evidente motivazione e dalla polemica facile. Non perch&egrave; mi piaccia fare il censore, ma per tutelare me in quanto titolare del dominio e non perdere mai un'impostazione di seriet&agrave; e <strong>propositivit&agrave;</strong>.</p>
<h3>I fatti</h3>
<p>Non li racconter&ograve; in dettaglio. Sono abbastanza stanco ed ho troppe cose da fare per mettermi a moderare un altro flame qui. Chi ha seguito sa che ho aspramente criticato il nuovo sito web del comune di Modica. Sa che non ho mai avuto paura di scrivere in pubblico quanto di storto succede in provincia ed in particolare a Modica, nella mia citt&agrave;.</p>
<p>Non potevo non scrivere di essere stato offeso pubblicamente per aver chiesto la rimozione di un centinaio di auto che bloccavano immotivatamente una strada provinciale. Non potevo non sfogarmi del fatto che un atteggiamento del genere &egrave; purtroppo abbastanza generalizzato. Ed il parlare nello stesso articolo del sito del comune e di altre strane avventure vissute negli enti locali era un esempio di come un certo modo di vedere le cose fosse addirittura istituzionalizzato.</p>
<p>Ci sono rimasto molto male a vedere un consigliere comunale darmi pubblicamente del malato di mente. Idealmente per me l&igrave; 0932blog &egrave; morto. Perch&egrave; quello che volevo fosse uno strumento di confronto <strong>su dati di fatto</strong>, era diventato uno dei tanti luoghi di discussione interminabile che portano al nulla pi&ugrave; assoluto. Dove l'accusato ha l'unico scopo di difendersi e l'accusatore di confutare la difesa senza soluzione di continuit&agrave;.</p>
<p>Lascio perdere tutto il resto che mi si &egrave; detto, le accuse di emulazione di Travaglio, i messaggi subliminali in ipotetici log salvati con miei tentativi di accesso (ho scritto pubblicamente quello che ho fatto, a cosa serve il log?). A me interessava solo che qualcosa si muovesse per cambiare uno status che non andava bene. Perch&egrave; se qualcosa va male in provincia di Aosta mi spiace, ma non posso agire efficacemente ed &egrave; giusto che la gente del luogo si muova. Se qualcosa va male a casa mia, <strong>io sono <em>la gente del luogo</em></strong>. E mi muover&ograve; in prima persona, mettendoci tanto di faccia per gridare a tutti che questo non va <em>per il motivo uno, due, tre e quattro</em>.</p>
<h3>Non tutto &egrave; stato da buttare</h3>
<p>E' novella di stamattina che presto il sito del comune di Modica si adeguer&agrave; alla legge Stanca. Con un <strong><a href="http://www.comune.modica.rg.it/newsreader.asp?id=212" target="_blank">comunicato ufficiale</a></strong> ne da notizia l'ufficio preposto al mantenimento e lo sviluppo della piattaforma web. Verranno seguiti (ovvero lo avranno gi&agrave; fatto, ma ancora non &egrave; on line la cosa) i criteri dettati dalla <strong><a href="http://www.pubbliaccesso.gov.it/normative/legge_20040109_n4.htm" target="_blank">L. n. 4 del 09 Gennaio 2004</a></strong> in materia di pubblico accesso dei soggetti disabili agli strumenti informatici.</p>
<p><strong>Volevamo solo questo e da cittadini potevamo pretenderlo</strong>. Oggi finalmente qualcosa si &egrave; mosso, non so se per merito di 0932blog. Sicuramente molti diranno di no :-) ma non &egrave; il merito che si va cercando. Si vuole semplicemente il giusto. Che le cose vadano fatte per come debbano essere fatte. E finalmente questo &egrave; oggi realt&agrave; per il comune di Modica.</p>
<p>Quindi bravi ai dirigenti comunali, in bocca al lupo per il lavoro e senza rancore per il futuro. Rimarr&ograve; sempre fermo nelle mia convinzioni, ma evito estenuamente di porre certe questioni sul personale. A me, come a tutto lo staff di 0932blog, interessano i risultati pi&ugrave; di ogni altra cosa.</p>
<p>0932blog.it non riaprir&agrave; pi&ugrave;. Un po' mi spiace, ma &egrave; una scelta ponderata che voglio portare avanti per motivi miei. Solo l'ultimo pensiero a <a href="http://nessunotocchitanino.blogspot.com/2009/04/sempre-piu-soli-scompare-0932blogit.html" target="_blank">Tanino per ricordargli che non &egrave; solo</a>. E' la gente che fa il web, ed &egrave; la gente che lo popola.</p><p>Tags: <a href="http://technorati.com/tag/0932blog/" rel="tag">0932blog</a>, <a href="http://technorati.com/tag/Modica/" rel="tag">Modica</a></p>]]></description>
<pubDate>Tue, 05 May 2009 12:17:50 +0200</pubDate>
<guid isPermaLink="false">http://www.davidonzo.com/post/1018/0932blog-forse-a-qualcosa-siam-serviti/</guid>
</item>
<item>
<title>WhoIsHim.com - Il web 2.0 nella responsabilità degli utenti</title>
<link>http://www.davidonzo.com/post/1014/whoishimcom-il-web-20-nella-responsabilita-degli-utenti/</link>
<description><![CDATA[<p></p><p>La mia presentazione al <a href="http://www.workingcapitalcamp.com/catania/" target="_blank">Working Capital Camp</a> di Catania.</p>
<div id="__ss_1372098" style="width: 425px; text-align: left;"><a title="WhoIsHim.com - Il web 2.0 nella responsabilit&agrave; degli utenti" href="http://www.slideshare.net/davidonzo/whoishimcom-il-web-20-nella-responsabilit-degli-utenti?type=presentation" style="margin: 12px 0pt 3px; font-family: Helvetica,Arial,Sans-serif; font-style: normal; font-variant: normal; font-weight: normal; font-size: 14px; line-height: normal; font-size-adjust: none; font-stretch: normal; -x-system-font: none; display: block; text-decoration: underline;">WhoIsHim.com - Il web 2.0 nella responsabilit&agrave; degli utenti</a><object style="margin:0px" width="425" height="355"><param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=presentazione1-090501033639-phpapp01&stripped_title=whoishimcom-il-web-20-nella-responsabilit-degli-utenti" /><param name="allowFullScreen" value="true"/><param name="allowScriptAccess" value="always"/><embed src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=presentazione1-090501033639-phpapp01&stripped_title=whoishimcom-il-web-20-nella-responsabilit-degli-utenti" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="355"></embed></object>
<div style="font-size: 11px; font-family: tahoma,arial; height: 26px; padding-top: 2px;">View more <a href="http://www.slideshare.net/" style="text-decoration: underline;">presentations</a> from <a href="http://www.slideshare.net/davidonzo" style="text-decoration: underline;">Davide Baglieri</a>.</div>
</div>
<p>Come sempre scrivo poco nelle slide, e senza commento parlato possono apparire di poco senso, ma spero di rendere comunque l'idea.</p><p>Tags: <a href="http://technorati.com/tag/workingcapital/" rel="tag">workingcapital</a>, <a href="http://technorati.com/tag/workingcapitalcamp/" rel="tag">workingcapitalcamp</a></p>]]></description>
<pubDate>Fri, 01 May 2009 11:12:15 +0200</pubDate>
<guid isPermaLink="false">http://www.davidonzo.com/post/1014/whoishimcom-il-web-20-nella-responsabilita-degli-utenti/</guid>
</item>
<item>
<title>Il ministro Brunetta fa lo spammer nelle ore di ufficio</title>
<link>http://www.davidonzo.com/post/1009/il-ministro-brunetta-fa-lo-spammer-nelle-ore-di-ufficio/</link>
<description><![CDATA[<p></p><p align="center"><a title="Brunetta spammer di davidonzo, su Flickr" href="http://www.flickr.com/photos/davidonzo/3450045467/"><img width="500" height="313" alt="Brunetta spammer" src="http://farm4.static.flickr.com/3607/3450045467_fd773b396a.jpg" /></a></p>
<p>Non erano gli stessi che volevano regolamentare internet imbavagliando tutti? Peccato, mi stava quasi simpatico.</p><p>Tags: <a href="http://technorati.com/tag/Brunetta/" rel="tag">Brunetta</a></p>]]></description>
<pubDate>Fri, 17 Apr 2009 20:19:26 +0200</pubDate>
<guid isPermaLink="false">http://www.davidonzo.com/post/1009/il-ministro-brunetta-fa-lo-spammer-nelle-ore-di-ufficio/</guid>
</item>
<item>
<title>Election day? None, altrimenti... inside</title>
<link>http://www.davidonzo.com/post/1007/election-day-none-altrimenti-inside/</link>
<description><![CDATA[<p></p><p>Niente election day, <a href="http://www.corriere.it/politica/09_aprile_16/berlusconi_fini_lega_referendum_02a87538-2a7a-11de-a92d-00144f02aabc.shtml" target="_blank">si voter&agrave; in giornate separate</a>. Poco male per me, dato che non ho alcuna intenzione di recarmi alle urne per votare qualcuno che tenter&agrave; di fregarmi a prescindere. Per&ograve; &egrave; bella la didascalia dell'immagine del corriere.</p>
<p align="center"><img height="231" width="209" src="http://www.davidonzo.com/public/image/sciocchezze/inside.jpg" alt="inside" /></p>
<p>Berlusconi a sinistra (e gi&agrave; questo fa storia) e Bossi.... inside? Poi ho letto l'articolo e mi sono reso conto che se il referendum fosse stato nello stesso giorno delle europee, la Lega era pronta a far cadere il governo, ed a nessuno piace avere Umberto Bossi inside... quindi...</p><p>Tags: <a href="http://technorati.com/tag/Berlusconi/" rel="tag">Berlusconi</a>, <a href="http://technorati.com/tag/Bossi/" rel="tag">Bossi</a>, <a href="http://technorati.com/tag/Corriere/" rel="tag">Corriere</a></p>]]></description>
<pubDate>Thu, 16 Apr 2009 14:32:17 +0200</pubDate>
<guid isPermaLink="false">http://www.davidonzo.com/post/1007/election-day-none-altrimenti-inside/</guid>
</item>
</channel>
</rss>
