<?xml version="1.0" encoding="iso-8859-1"?>
<rss version="2.0">
<channel>
<title>RSS Categoria: Tutorial - davidonzo's blog :)</title>
<link>http://www.davidonzo.com/</link>
<description>RSS Categoria: Tutorial - davidonzo's blog :)</description>
<language>IT-it</language>
<generator>davidonzo coding</generator>
<pubDate>Fri, 03 Sep 2010 08:18:33 +0100</pubDate>
<ttl>60</ttl>
<item>
<title>Internet Key K3765 Vodafone funzionante su Ubuntu 9.10</title>
<link>http://www.davidonzo.com/post/1196/internet-key-k3765-vodafone-funzionante-su-ubuntu-910/</link>
<description><![CDATA[<p></p><p><img align="left" width="200" height="160" src="http://www.davidonzo.com/public/image/tumb/vodafonevfe180-300x240.jpg" alt="Internet Key Vodafone" />Se possedete la Internet Key K3765, gentilmente fornita da Vodafone con la Vodafone Station, dovreste avere 30 ore mensili di navigazioni fuori casa. Pochine, ma perhc&eacute; non sfruttarle? Tutto sommato &egrave; comodo potersi collegare in mobilit&agrave; quando c'&egrave; necessit&agrave; di controllare al volo la posta e si vogliono evitare le ristrettezze del cellulare.</p>
<p>Fare funzionare la chiavetta su Ubuntu 9.10 (ma presumo anche sulla recente 10.4) &egrave; davvero facile.</p>
<p>Come prima cosa, da <a href="https://forge.betavine.net/frs/?group_id=12" target="_blank">Betavine Forge</a> scarichiamo i seguenti pacchetti debian:</p>
<ul>
    <li><a href="https://forge.betavine.net/frs/download.php/538/ozerocdoff_0.4-2_i386.deb">ozerocdoff_0.4-2_i386.deb</a></li>
    <li><a href="https://forge.betavine.net/frs/download.php/626/vodafone-mobile-connect_2.25.01-1_all.deb">vodafone-mobile-connect_2.25.01-1_all.deb</a></li>
</ul>
<p>Installiamoli con un bel double click ed alla fine via terminale installiamo il pacchetto <strong>usb_modemswitch</strong>.</p>
<p><span class="Code">sudo apt-get install usb-modemswitch</span></p>
<p>Apriamo il file /etc/usb_modemswitch.conf (usiamo sudo per garantirci i permessi di scrittura sul file) e verso la riga 347 troveremo le direttive per la vodafone key. Baster&agrave; decommentarle come di seguito.</p>
<pre>######################################################## <br /># Vodafone K3760 (made by Option, HSO driver) <br />#&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br /># Contributor: The Solutor&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br /><br />DefaultVendor=&nbsp; 0x0af0 <br />DefaultProduct= 0x7501 <br /><br />TargetClass=&nbsp;&nbsp;&nbsp; 0xff <br /><br /># only for reference<br /># MessageEndpoint=0x01<br /><br />MessageContent=&quot;55534243785634120100000080000601000000000000000000000000000000&quot;</pre>
<p><br />
Inseriamo la chiavetta, apriamo &quot;Vodafone Mobile Connect&quot; dal menu Applications &gt;&gt; Internet, seguiamo i tre passi, lasiando tutto in default e se le cose sono andate bene, baster&agrave; cliccare su connetti nella finestra riportata sotto.</p>
<p align="center"><img width="470" height="408" src="http://www.davidonzo.com/public/image/debianubuntu/vodafonemconnect.png" alt="Vodafone Mobile Connect" /></p>
<p>Come sempre un grazie a tutti coloro che si premurano di sviluppare tool per Linux, che rendano l'uso di questo splendido sistema operativo un'esperienza piacevole.</p><p>Tags: <a href="http://technorati.com/tag/Vodafone/" rel="tag">Vodafone</a>, <a href="http://technorati.com/tag/Internet+Key/" rel="tag">Internet Key</a></p>]]></description>
<pubDate>Sat, 08 May 2010 12:16:07 +0200</pubDate>
<guid isPermaLink="false">http://www.davidonzo.com/post/1196/internet-key-k3765-vodafone-funzionante-su-ubuntu-910/</guid>
</item>
<item>
<title>Internet Explorer: errore file PDF over SSL</title>
<link>http://www.davidonzo.com/post/1179/internet-explorer-errore-file-pdf-over-ssl/</link>
<description><![CDATA[<p></p><p>Mi &egrave; successo, giusto qualche minuto fa, di riscontrare degli errori nel download di alcuni file PDF che faccio generare da alcuni script. La risposta del server era una pagina bianca o proprio niente. Ma solo la conclusione del caricamento senza nessun esito.</p>
<p>Cliccando con il tasto destro del mouse sul collegamento al pdf e selezionando &quot;Save Target As...&quot; l'errore era abbastanza chiaro: per internet explorer risultava impossibile scrivere nella cache il file, quindi non lo si poteva scaricare.</p>
<p>Non era abilitata la cache per permettere al browser di scrivere il file pdf. Quindi &egrave; stato necessario aggiungere le informazioni alla generazione del file. Basta un header di tipo &quot;<strong>pragma: cache</strong>&quot; oppure &quot;<strong>Control-Cache: cache</strong>&quot;.</p>
<p>Problema risolto. <strong><a target="_blank" href="http://www.somacon.com/p106.php">Credits</a></strong>.</p>
<p>PS: fino alla versione 8 di IE ho riscontrato il problema.</p><p>Tags: </p>]]></description>
<pubDate>Wed, 31 Mar 2010 15:25:21 +0200</pubDate>
<guid isPermaLink="false">http://www.davidonzo.com/post/1179/internet-explorer-errore-file-pdf-over-ssl/</guid>
</item>
<item>
<title>MacBook e triple boot - Snow Leopard, Ubuntu 9.10, Windows XP PRO sp3</title>
<link>http://www.davidonzo.com/post/1161/macbook-e-triple-boot-snow-leopard-ubuntu-910-windows-xp-pro-sp3/</link>
<description><![CDATA[<p></p><p>Stan tutti sempre a dire che i MacBook non si rompono mai. E pure io lo dicevo fino a qualche giorno fa, quando improvvisamente il disco rigido ha deciso di piantarsi. Con ogni probabilit&agrave; un problema meccanico, visto anche il continuo tintinnio della testina.</p>
<p>Poco male. Il Macbook &egrave; il pc di rappresentanza e ci tengo nessun dato rilevante. Quei pochi li avevo comunque backuppati qualche tempo prima e di fatto ho perso solo qualche foto (un po' mi spiace per&ograve;) e alcuni documenti non fondamentali.</p>
<p>Ho approfittato della cosa per fare l'ormai rimandato da mesi, passo a Snow Leopard. Ed alla fine ho pure deciso di fare del mac il mio futuro centro di gravit&agrave;, installandogli nello stesso HDD 3 sistemi operativi: Snow Leopard of course, Ubuntu 9.10 (l'ultima disponibile) e Windows XP Pro sp3. In questo modo dovrei essere abbastanza in grado di testare ogni view prodotta in tutti i browser dei tre principali sistemi operativi.</p>
<h3>Sostituire il disco rigido</h3>
<p>Il procedimento &egrave; molto semplice, ma partiamo con la sostituzione del disco rigido. Fortunatamente, nonostante sia un notebook, l'accesso alla RAM ed al disco sul 13'' di casa Cupertino &egrave; abbastanza agevole. Le specifiche hardware consistono in un semplicissimo HDD da 2.5'' SATA. Costo IVA compresa sui 40 Euro, ma ce n'&egrave; di tutti i prezzi. Basta poi seguire le facili istruzioni <strong><a href="http://manuals.info.apple.com/en/MacBook_13inch_HardDrive_DIY.pdf" target="_blank">riportate in questo documento rilasciato da casa Apple</a></strong> ed il gioco &egrave; fatto. Nuovo HDD vergine per il sistema :)</p>
<p>Sembra che nei nuovi MacBook da 13'' il vano RAM - HDD sia inaccessibile. Io ho fatto l'operazione in un macbook versione 3.1</p>
<h3>Installazione Snow Leopard</h3>
<p>Avviate il MacBook tenendo premuto il tasto ALT, con il cd di Snow all'interno del lettore. Si avvier&agrave; la schermata riportante la lista dei sistemi operativi disponibili. Ovviamente uscir&agrave; fuori solo l'unit&agrave; CD-Rom. Prima di poter avviare la partizione, aprite l'utility disco e create una partizione per Snow Leopard (io gli ho dato 100GB su un disco da 250GB) e lasciate il resto come spazio non partizionato.</p>
<p>Seguite l'installazione &quot;dritto per dritto&quot; ed alla fine avviate il sistema, scaricate <strong><a href="http://refit.sourceforge.net/" target="_blank">rEFIt</a></strong>, installatelo seguendo la procedura guidata, togliete il DVD di Snow Leopard, inserite quello della distro che volete installare e riavviate il sistema.</p>
<h3>Installazione Linux</h3>
<p>Al riavvio del sistema, rEFIt vi mostrer&agrave; i sistemi operativi disponibili per il boot. Fin qui sar&agrave; listato Snow Leopard e la distro bootabile da CD-Rom. Avviate questa (nel mio caso ho usato il cd di Ubuntu 9.10).</p>
<p>Scegliete l'installazione guidata. Specificate manualmente la partizione in cui decidete di installare il sistema creandone una nuova nello spazio non partizionato lasciato precedentemente. Nel mio caso ho scelto di dare altre 100GB a Ubuntu, creando una partizione di root /. Non create la partizione di swap, visto il limite massimo di 4 partizioni.</p>
<p>Seguite l'installazione guidata <em>as usual</em> ed alla fine riavviate li sistema avendo avuto cura preliminarmente di sostituire il CD della distro con uno di installazione per Windows.</p>
<h3>Installazione Windows</h3>
<p>Ancora una volta usiamo rEFIt per scegliere il sistema da avviare. In questo caso ci verr&agrave; mostrata fra le disponibilit&agrave; l'icona di windows facente riferimento al CD-Rom.</p>
<p>Facciamo partire la procedura guidata di installazione, anche in questo caso specificando la partizione da utilizzare. Nel mio caso gli ho dato i 50GB rimanenti.</p>
<p>Dopo aver creato la partizione e copiato i file per l'installo, il sistema si riavvier&agrave; e far&agrave; partire l'installo vero e proprio. Conclusa questa procedura, riavviate nuovamente il sistema, via rEFIt scegliere ora di fare il boot della partizione windows ed alla fine dell'avvio inserite nel CD-Rom il cd di Snow Leopard. Automaticamente dovrebbe avviarsi l'assistente Bootcamp, che si occuper&agrave; di installare tutte le periferiche.</p>
<h3>Infine...</h3>
<p>Se avviando la partizione di Ubuntu avete perso il Grub, non scoraggiatevi e date un rapido occhio alla <a href="http://wiki.ubuntu-it.org/AmministrazioneSistema/Grub/Ripristino?action=show&amp;redirect=RipristinoGrub#head-907ef154a6937f4864c2de55b1626c9a40a1c4d1" target="_blank">guida per il ripristino del boot loader di default per la distro umana</a>.</p>
<p>Devo ancora testare il funzionamento di iSight su Ubuntu, mentre su windows sembra funzionare tutto a dovere. Anche il telecomando su Ubuntu sembra non andare. Tutto il resto (touchpad e tasto destro compreso) va senza troppi sbattimenti.</p><p>Tags: <a href="http://technorati.com/tag/Snow+Leopard/" rel="tag">Snow Leopard</a>, <a href="http://technorati.com/tag/MacBook/" rel="tag">MacBook</a>, <a href="http://technorati.com/tag/Ubuntu/" rel="tag">Ubuntu</a>, <a href="http://technorati.com/tag/Windows/" rel="tag">Windows</a></p>]]></description>
<pubDate>Sun, 14 Feb 2010 20:32:18 +0100</pubDate>
<guid isPermaLink="false">http://www.davidonzo.com/post/1161/macbook-e-triple-boot-snow-leopard-ubuntu-910-windows-xp-pro-sp3/</guid>
</item>
<item>
<title>[PHP] Un calendario perpetuo</title>
<link>http://www.davidonzo.com/post/1159/php-un-calendario-perpetuo/</link>
<description><![CDATA[<p></p><p>Giusto se a qualcuno dovesse servire, una funzione per generare un calendario mensile perpetuo. Cambiando anno e mese di riferimento, vi si restituisce il mese completo come un array multilivello facilmente manipolabile.</p>
<pre>&lt;?php<br />&nbsp; function calendario($month, $year){<br />&nbsp;&nbsp;&nbsp; $month = intval($month);<br />&nbsp;&nbsp;&nbsp; $year = intval($year);<br />&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; $days = cal_days_in_month(CAL_GREGORIAN, $month, $year);<br />&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; $list = array();<br />&nbsp;&nbsp;&nbsp; for($a=1; $a&lt;=$days; $a++){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $list[$a]['week'] = jddayofweek(cal_to_jd(CAL_GREGORIAN, date($month),date($a), date($year)), 1);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $list[$a]['day'] = $a;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $list[$a]['month'] = $month;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $list[$a]['year'] = $year;<br />&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; return $list;<br />&nbsp; }<br />&nbsp; <br />&nbsp; //Esempio di utilizzo<br />&nbsp; $cal = calendario(2,2010);<br />&nbsp; print_r($cal);<br />&nbsp; foreach($cal as $c =&gt; $value){<br />&nbsp;&nbsp;&nbsp; echo $cal[$c]['week'] . ' - ' . date('d/m/Y', mktime(0, 0, 0, $cal[$c]['month'], $cal[$c]['day'], $cal[$c]['year'])) . '&lt;br/&gt;';<br />&nbsp; }<br />?&gt;</pre>
<p>Spero sia utile a qualcuno</p><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, 12 Feb 2010 23:48:44 +0100</pubDate>
<guid isPermaLink="false">http://www.davidonzo.com/post/1159/php-un-calendario-perpetuo/</guid>
</item>
<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>[JavaScript] jQuery e scroller animato senza bisogno di plugin</title>
<link>http://www.davidonzo.com/post/1088/javascript-jquery-e-scroller-animato-senza-bisogno-di-plugin/</link>
<description><![CDATA[<p></p><p>Giusto ieri mi serviva un buon scroller in JavaScript. Unica precondizione, che fosse sviluppato con <a href="http://jquery.com/" target="_blank">jQuery</a>. Di solito mi scrivo io le librerie che mi servono. Il proprio codice non dipende da nient'altro ed una volta raggiunto il risultato si &egrave; completamente padroni della cosa. In questo caso per&ograve; la necessit&agrave; era imposta dall'alto, quindi mi son messo a cercare nella directory plugin qualcosa che potesse fare al caso mio.</p>
<p>Ho trovato pi&ugrave; di un plugin utilizzabile, ma tutti avevano almeno un difetto. Uno con troppe opzioni risultava eccessivamente pesante e ripulirlo mi avrebbe preso troppo tempo. Un altro invece era troppo poco performante gestendo solo casistiche standard (nessuna delle quali risultava andar bene a me).</p>
<p>Allora mi son letto direttamente la documentazione di jQuery, convinto che qualche metodo proprio dovesse averlo per far spostare live dei livelli di html. Ed ovviamente c'&egrave;: <a href="http://docs.jquery.com/Effects/animate" target="_blank">animate</a> permette di gestire eventi in divenire. Nel caso dello scroller, visto che il bello &egrave; la visualizzazione dello spostamento, animate permette di far eseguire una semplice direttiva come un evento che parte dallo status attuale fino ad arrivare al risultato stabilito.</p>
<p>Per fare un esempio pratico. Se voglio scrollare spostando un layer verso destra di 100px, potrei semplicemente imporre al click di un tasto una funzione che imposti un margin-left a -100px rispetto all'attuale situazione. Facile, ma non *<em>vivo</em>*. Perch&egrave; in questo caso vedrei il risultato subito, mentre a me interessa che l'utente abbia la sensazione che le cose si spostano, quindi voglio che nell'andare indietro di 100px lo faccia gradualmente in un determinato arco di tempo.</p>
<p>E' esattamente quello che fa animate in jQuery. Scrivendo la funzione:</p>
<p><span class="Code">&nbsp; function scrollRight(){<br />
&nbsp;&nbsp;&nbsp;&nbsp; $('#IDTarget').animate({'marginLeft': -100px',},500);<br />
&nbsp; } </span></p>
<p>Far&ograve; scrollare il contenuto del target verso sinistra (dando l'idea di muovermi a destra) di 100px in mezzo secondo.</p>
<p>Usando le propriet&agrave; di jQuery, un po' di fantasia e appena 88 righe di codice, <strong><a href="http://www.davidonzo.com/jquery/scroller/" target="_blank">si pu&ograve; ottenere una galleria di immagini come questa</a></strong>. Senza bisogno di aggiungere niente all'ottimo, ma ben pesante jQuery.</p>
<p>&nbsp;</p><p>Tags: <a href="http://technorati.com/tag/jQuery/" rel="tag">jQuery</a>, <a href="http://technorati.com/tag/JavaScript/" rel="tag">JavaScript</a>, <a href="http://technorati.com/tag/Tutorial/" rel="tag">Tutorial</a></p>]]></description>
<pubDate>Thu, 03 Sep 2009 18:53:51 +0200</pubDate>
<guid isPermaLink="false">http://www.davidonzo.com/post/1088/javascript-jquery-e-scroller-animato-senza-bisogno-di-plugin/</guid>
</item>
<item>
<title>Google Maps - Marker con nuvola al loading della mappa</title>
<link>http://www.davidonzo.com/post/1085/google-maps-marker-con-nuvola-al-loading-della-mappa/</link>
<description><![CDATA[<p></p><p><a target="_blank" href="http://www.davidonzo.com/post/1036/google-maps-oggetto-gmarker-e-gestione-openinfowindowhtml/#comm29296">Paka mi chiede in un commento</a>:</p>
<p class="classquote">Sto impazzendo per cercare di capire il codice da usare x far uscire la &quot;nuvoletta&quot; sul marker subito, senza bisogno del click... mi date una mano?</p>
<p>La cosa &egrave; abbastanza semplice, e la riprendiamo proprio dall'articolo in cui l'utente ha commentato. Diamo un occhio a questa porzione di codice.</p>
<p><span class="Code">GEvent.addListener(marker, &quot;click&quot;, function() {<br />
&nbsp;&nbsp;&nbsp; marker.openInfoWindowHtml('Coordinate&lt;br /&gt;'+point);<br />
});</span></p>
<p>E' abbastanza chiaro che stabiliamo un evento ben preciso per far comparire il marker, tramite l'oggetto GEvent. L'evento in questione &egrave; il click sul marker. Se vogliamo che questo compaia senza alcun evento predefinito, basta toglierlo dalla condizione di cui sopra. In questo caso l'evento che andr&agrave; a far apparire la <em>nuvoletta</em> sar&agrave; quello di default, ovvero il load della mappa.</p>
<p>Di seguito il codice completo della funzione.</p>
<p>&nbsp;&nbsp;&nbsp; var map = null;<br />
&nbsp;&nbsp;&nbsp; var geocoder = null;<br />
&nbsp;&nbsp;&nbsp; var address = '97015 Italy';<br />
<br />
<span class="Code">&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; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <strong>//Qui faccio apparire la nuvola!</strong><br />
&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;&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>E come mio solito, <strong><a href="http://www.davidonzo.com/gmaps/gmaps-marker-onload.html" target="_blank">una pagina di esempio da cui estrapolare facilmente il codice sorgente</a></strong>.</p><p>Tags: <a href="http://technorati.com/tag/Gmaps/" rel="tag">Gmaps</a>, <a href="http://technorati.com/tag/Google+Maps/" rel="tag">Google Maps</a>, <a href="http://technorati.com/tag/Tutorial/" rel="tag">Tutorial</a></p>]]></description>
<pubDate>Wed, 26 Aug 2009 10:10:40 +0200</pubDate>
<guid isPermaLink="false">http://www.davidonzo.com/post/1085/google-maps-marker-con-nuvola-al-loading-della-mappa/</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>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>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>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>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>Remunerazione del lavoro. Non esiste imprenditore senza stipendio.</title>
<link>http://www.davidonzo.com/post/1016/remunerazione-del-lavoro-non-esiste-imprenditore-senza-stipendio/</link>
<description><![CDATA[<p></p><p>Penso oggi sia la giornata migliore per scrivere un post del genere. L'altro ieri ho partecipato al Working Capital Camp, dove si &egrave; ampiamente parlato di imprenditoria legata alle nuove tecnologie. Oggi primo maggio &egrave; la festa del lavoro, cosa sempre pi&ugrave; vicina alla festa del lavoratore dipendente.</p>
<h3>Premessa</h3>
<p>A cura di <a href="http://www.whoishim.com/Alessandro+Santo" target="_blank">Alessandro Santo</a> di <a target="_blank" href="http://www.dpixel.it">dpixel</a> &egrave; stata tenuta una delle migliori spiegazioni sul business plan a cui abbia mai assistito. Negli ultimi anni mi sono occupato pi&ugrave; di programmazione web in senso stretto che di altro, ma la mia anima aziendalista &egrave; ancora ben viva. Ho avuto ottimo maestri all'universit&agrave;, ma per la prima volta ho visto concetti espressi in modo da scremare tutta la poco utile autoreferenzialit&agrave; che si porta dietro il marketing. Non sono riuscito a trovare le slide dell'intervento (Edit: <strong><a href="http://www.slideshare.net/workingcapitalteam/working-capital-camp-catania-entrepreneur-pitchbook-1363321" target="_blank">le slide sono qui</a></strong>. Grazie per la segnalazione!). Se sono state condivise e qualcuno me lo segnala far&agrave; cosa graditissima.</p>
<p>L'unica cosa che non si &egrave; detta chiaramente &egrave; che il business plan deve essere prima di tutto strumento di valutazione di chi lo redige. Invece, all'epoca del web 2.0 e delle startup, sembra che le analisi di marketing siano diventate loro stesse mezzo di promozione.</p>
<p>Una pessima idea non avr&agrave; mai un buon business plan. Se pensate di avere una buona idea usate degli strumenti di analisi per capire se questa &egrave; veramente tale ricordando che la bont&agrave; non &egrave; intrinsecamente presente nel pensiero. Se riusciamo a raggiungere l'obiettivo allora l'idea sar&agrave; buona, altrimenti i migliori propositi servono a niente.</p>
<p>Durante l'intervento qualcuno ha opposto un'eccezione abbastanza seria. &quot;<em>Relativamente al fatto che qualsiasi idea vincente produrr&agrave; redditi a partire dal secondo anno di vita (il primo anno in rosso &egrave; quasi fisiologico), io giovane imprenditore nel frattempo come mangio?</em>&quot;</p>
<p>Il discorso in teoria non farebbe una grinza. Strascica la convinzione (nemmeno tanto sbagliata) che pu&ograve; fare l'imprenditore solo chi c'ha soldi. Qualcuno che in sostanza &egrave; in grado di vivere per mesi senza entrate fisse. Da noi in siculandia si dice &quot;<em>i soddi ca fanu soddi</em>&quot;.</p>
<h3>Imprenditore e investitore</h3>
<p>E' importante fare una differenza fondamentale fra le due cose. E' imprenditore colui che impiega il suo tempo a portare avanti una attivit&agrave; privata propria al fine di ricavarne un utile. L'investitore invece &egrave; colui che finanzia attivit&agrave; private o pubbliche portate poi avanti da altri.</p>
<p>Si capisce che l'imprenditore &egrave; anche un investitore, dato che nel 99.99% dei casi oltre a lavorare nell'attivit&agrave;, ne sar&agrave; anche uno dei titolari. Mentre non per forza si deve essere imprenditori per fare l'investitore.</p>
<p>Se faccio sei al superenalotto e compro una partecipazione nell'impresa di Tizio che ci lavora notte e giorno solo perch&egrave; ci credo, ma non avendo io le conoscenze tecniche e commerciali per portarla avanti mi affido unicamente al mio socio, io sar&ograve; un <strong>socio di capitale</strong>. Mentre Tizio sar&agrave; un socio sia di capitale che di lavoro, inteso come entit&agrave; dirigenziale. Colui che decide l'indirizzo aziendale in funzione dei fini specifici. Il livello di remunerazione dei due soggetti non pu&ograve; essere lo stesso, perch&egrave; deve basarsi su le risorse immesse in azienda.</p>
<h3>Valutazione economica e finanziaria</h3>
<p>C'&egrave; una differenza abbastanza netta fra valutazioni economiche e finanziare. Quando ho sentito qualcuno citare un articolo di non so quale esperto che affermava che una startup nel web 2.0 costa otto dollari al giorno un po' mi &egrave; venuto da ridere. Capisco che il web ha prodotto enormi economie di scala, capisco pure che formalmente <em>cnn.com</em> e <em>cosabrutta.it</em> sono solo due nomi a dominio, ma l'eccessiva generalizzazione non porta mai a niente di serio.</p>
<p>I costi secchi dell'attivit&agrave;, sono quelli che portano variazioni finanziare uguali a variazioni economiche. Quando stipulate un contratto di fornitura per il server che ospiter&agrave; la vostra applicazione sapete che per X mesi pagate tanto. Potete preventivare con una certa precisione la cosa e valutare quindi in funzione dei rientri. Lo stesso vale per costi amministrativi, ma anche per la promozione seppur con meno precisione.</p>
<p>Ci sono poi alcuni costi non visibili, ma da tenere in grande considerazione. <strong>Il lavoro degli imprenditori che prestano la loro attivit&agrave; per 15 ore al giorno all'azienda, quanto costa?</strong></p>
<p>Ovvio che molti risponderanno alla domanda dicendo che non &egrave; un costo valutabile e che il tutto dipende dal profitto ottenuto dall'attivit&agrave;. Ed il discorso non lo considero sbagliato, ma facciamo una valutazione diversa. Se chi lavora in azienda, scegliendone l'indirizzo produttivo, non &egrave; un socio, non &egrave; uno dei titolari, allora sicuramente dovrei prevedere un compenso. E dal punto di vista puramente economico, il fatto che sia uno dei proprietari ad apportare la propria attivit&agrave; come bene aziendale a costo zero, non rende l'attivit&agrave; economicamente pi&ugrave; conveniente di quanto non farebbe uno stipendiato con le stesse capacit&agrave; manageriali.</p>
<p>Quello che voglio dire &egrave; che la valutazione economica a priori di una qualsiasi attivit&agrave; imprenditoriale deve prevedere fra i costi la remunerazione del capitale investito e quella del lavoro profuso anche dalla propriet&agrave; attiva in azienda. Solo in questo modo possiamo renderci conto se l'idea che abbiamo in mente &egrave; vincente e ci permetter&agrave; di vivere!</p>
<p>Certo, che poi si decida - come avviene praticamente sempre - di non remunerarsi il lavoro, per rendere meno gravata da costi per i primi tempi l'attivit&agrave; &egrave; discorso diverso, giusto, ma che compete la semplice valutazione dei flussi finanziari, che in questo modo accorciano (o dovrebbero) i tempi di rientro in utile.</p>
<p>Si consideri sempre il vostro lavoro come un costo per l'attivit&agrave;. Spersonalizzate sempre l'azienda da voi stessi e consideratevi una risorsa per essa. Le risorse producono costi, questi vanno sempre inseriti in qualsiasi business plan al fine di valutarne la reale efficienza.</p>
<h3>Concludendo...</h3>
<p>Chi legge il vostro business plan far&agrave; queste valutazioni. Se un piano di rientro finanziario prevede tre lavoratori mai remunerati per due anni in quanto soci, l'utile che riuscirete a calcolare sar&agrave; un gonfio e falso indicatore di una idea che molto probabilmente nasce in perdita.</p>
<p>Per tornare al discorso di &quot;<em>come faccio a campare fin quando non faccio utili</em>&quot; ricordate che un essere economico che vive senza remunerare le risorse che lo fanno stare in piedi (quindi voi) &egrave; solo un parassite che poco di buono porter&agrave; nella vostra vita.</p>
<p>Se credete veramente alla bont&agrave; della vostra bestiolina, regalatele qualche mese di sanguisughismo, ma non cominciate mai con la speranza del domani avendo fatto conti sulla vostra totale sottomissione al business.</p>
<p>In parole povere, si lavora per campare, non viceversa :)</p><p>Tags: </p>]]></description>
<pubDate>Fri, 01 May 2009 20:43:15 +0200</pubDate>
<guid isPermaLink="false">http://www.davidonzo.com/post/1016/remunerazione-del-lavoro-non-esiste-imprenditore-senza-stipendio/</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>Installare Symfony su server HostMonster</title>
<link>http://www.davidonzo.com/post/1008/installare-symfony-su-server-hostmonster/</link>
<description><![CDATA[<p></p><p><a href="http://www.symfony-project.org" target="_blank"><img height="37" width="176" align="left" src="http://www.davidonzo.com/public/image/loghi/symfony_logo.gif" alt="symfony at davidonzo.com" /></a>Uno dei migliori framework per PHP. Permette di sviluppare velocemente applicativi web complessi. Chiaro che una volta completato il lavoro in locale dovete mettere su un server pubblico il risultato che necessiter&agrave; proprio del framework per funzionare.</p>
<p>Leggendo <a href="http://www.symfony-project.org/jobeet/1_2/Doctrine/it/" target="_blank">l'ottimo tutorial</a> (disponibile in italiano!) per Jobeet capirete quanto sia importante installare il framework non a casaccio. Ma avrete anche gi&agrave; letto le <a href="http://www.symfony-project.org/installation/1_2" target="_blank">guida all'installazione</a> notando che &egrave; disponibile l'installazione tramite <a href="http://pear.php.net/" target="_blank">pacchetto PEAR</a>.</p>
<p><a href="http://hostmonster.com" target="_blank">HostMonster</a> mette a disposizione l'installazione tramite pear packages gi&agrave; dal pannello di controllo cPanel. Ma symfony non &egrave; tra le applicazioni disponibili. Poco male, perch&egrave; via ssh possiamo aggiungere il repository e quindi installare il tutto in semplicit&agrave;. Procederemo con due semplici linee di comando:</p>
<p><span class="Code">[~]# pear channel-discover pear.symfony-project.com<br />
Adding Channel &quot;pear.symfony-project.com&quot; succeeded<br />
Discovery of channel &quot;pear.symfony-project.com&quot; succeeded<br />
[~]# pear install symfony/symfony-1.2.5<br />
downloading symfony-1.2.5.tgz ...<br />
Starting to download symfony-1.2.5.tgz (2,716,774 bytes)<br />
.....................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................done: 2,716,774 bytes<br />
install ok: channel://pear.symfony-project.com/symfony-1.2.5</span></p>
<p>Ed il framework verr&agrave; installato in <code>/home/NOSTROUTENTE/php/symfony/</code>. Directory inibita all'accesso pubblico, quindi al sicuro da sguardi indiscreti.</p>
<p>Ricordate che hostmonster abilita l'accesso ssh al vostro account solo dopo averne fatto esplicita richiesta tramite form apposito in cui dovrete inviare anche una scanzione di un documento di riconoscimento valido (la carda di identit&agrave; italiana va benissimo). In ultimo non dimenticate che potete installare solo pacchetti stabili. Quindi se vi dovessero trovare beta version fra i pacchetti, rischiate la sospensione dell'account.</p><p>Tags: <a href="http://technorati.com/tag/PHP/" rel="tag">PHP</a>, <a href="http://technorati.com/tag/Symfony/" rel="tag">Symfony</a>, <a href="http://technorati.com/tag/PEAR/" rel="tag">PEAR</a>, <a href="http://technorati.com/tag/HostMonster/" rel="tag">HostMonster</a></p>]]></description>
<pubDate>Fri, 17 Apr 2009 10:41:47 +0200</pubDate>
<guid isPermaLink="false">http://www.davidonzo.com/post/1008/installare-symfony-su-server-hostmonster/</guid>
</item>
<item>
<title>Recupero password in Ubuntu Linux</title>
<link>http://www.davidonzo.com/post/1006/recupero-password-in-ubuntu-linux/</link>
<description><![CDATA[<p></p><p>Mi si chiede: &quot;<em>Ho ubuntu sul pc, ho impostato il login automatico all'avvio, quindi non digito quasi mai la password. Dovrei installare gli aggiornamenti, ma ora s&igrave; che mi viene richiesta la password e non la ricordo. Come faccio?!</em>&quot;</p>
<p>La questione &egrave; abbastanza semplice. In ubuntu di default l'utente root &egrave; disabilitato e l'utente che ha installato il sistema &egrave; abilitato, previa richiesta password, a compiere atti con potere di amministratore.</p>
<p>Se hai installato il GRUB loader (al 99,99% s&igrave;), allora avvia il sistema selezionando l'ultima versione del kernel disponibile, ma in recovery mode. Di solito la seconda riga dall'alto del grub. Una volta avviato il sistema, ti si presenter&agrave; una finestra con quattro opzioni disponibili. Scegliere la terza o comunque quella relativa alla possibilit&agrave; di aprire la shell di root. Non ti verr&agrave; richiesta nessuna password.</p>
<p>Nella shell digita:</p>
<pre>passwd NOMEUTENTE</pre>
<p>Sostituendo NOMEUTENTE con lo username dell'utente di cui hai dimenticato la password. A questo punto sar&agrave; richiesto l'inserimento della password, un secondo inserimento a conferma e tramite un reboot si potr&agrave; riprendere pieno possesso delle funzionalit&agrave;.</p>
<h3>Nota Bene</h3>
<p>S&igrave;, hai letto benissimo. Avviando in recovery mode si pu&ograve; accedere come root al sistema senza bisogno di nessuna password. Perch&egrave;? Facile ripondere: si tratta di un sistema desktop, che in questo modo pu&ograve; essere ripristinato facilmente.</p>
<p>La consideri una grave falla di sicurezza? Ricorda che un sistema &egrave; sempre insicuro che qualcuno pu&ograve; mettergli mano fisicamente.</p>
<p>Sei di quelli iper-attenti che mettono la password al bios? Ricorda che basta togliere per 30 secondi la batteria del CMOS e pure quella viene resettata.</p>
<p>Come puoi fare ad essere sicuro al 100%? Attaccati il case alle chiappe ;-)</p><p>Tags: </p>]]></description>
<pubDate>Wed, 15 Apr 2009 16:50:00 +0200</pubDate>
<guid isPermaLink="false">http://www.davidonzo.com/post/1006/recupero-password-in-ubuntu-linux/</guid>
</item>
</channel>
</rss>
