<?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>Sat, 04 Feb 2012 08:28:51 +0100</pubDate>
<ttl>60</ttl>
<item>
<title>Installare PDFLib per PHP su Ubuntu server</title>
<link>http://www.davidonzo.com/post/1270/installare-pdflib-per-php-su-ubuntu-server/</link>
<description><![CDATA[<p></p><p>La <a target="_blank" href="http://www.pdflib.com">PDFLib</a> &egrave; senza dubbio la libreria migliore per la produzione lato server di file PDF. Esistono <em>zilioni</em> di librerie scritte in nativo PHP, e fra queste ricordi le ottime <a target="_blank" href="http://www.fpdf.org/">FPDF</a> e <a target="_blank" href="http://www.ros.co.nz/pdf/">eZPDF</a>. Tuttavia per funzionalit&agrave; avanzate non sembra esistere un software gratuito. Senza dimenticare che le prestazioni di una libreria scritta in C non sono minimamente paragonabili ad una classe scritta in puro PHP.</p>
<p><strong>Prerequisiti:</strong></p>
<ul>
    <li>Accesso di root alla macchina</li>
    <li>Dimistichezza con la linea di comando</li>
</ul>
<p><strong>Download PDFLib</strong>: scegliere la versione che vi serve in funzione del vostro sistema <a target="_blank" href="http://www.pdflib.com/download/pdflib-family/pdflib-8/">dalla pagina di download di PDFLib.com</a>.</p>
<p>Scompattate l'archivio scaricato e prelevate il file in <code>./bind/php/php-$VERSION</code>. Sostituendo $VERSION con la vostra versione di PHP.</p>
<p>A questo punto, sul server andate a controllare la directory relativa alle estensioni di php disponibili. Si controlli la voce <code>extensions_dir</code>. Copiate il file della libreria in quella directory. Nel mio caso (e in questo esempio) da directory &egrave; <code>/usr/lib/php5/20090626/</code>.</p>
<pre>scp libpdf_php.so root@YOURHOST:/usr/lib/php5/20090626/</pre>
<p><br />
Accedete al server ed entrare nella directory contenente i file .ini addizionali. Nel mio caso <code>/etc/php5/apache2/conf.d/</code>. Create un nuovo file con il vostro editor di testo preferito, che servir&agrave; per il loading della libreria.</p>
<pre>cd /etc/php5/apache2/conf.d/<br />vim pdflib.ini</pre>
<p><br />
All'interno del file scriviamo.</p>
<pre>; configuration for php PDFLib module<br />extension=libpdf_php.so</pre>
<p><br />
Riavviamo il web server (potrebbe bastare un reload, ma ultimamente con Ubuntu server non ci giurerei).</p>
<pre>/etc/init.d/apache2 restart</pre>
<p><br />
Date un <code>phpinfo();</code> in un file qualsiasi, lanciatelo via browser e dovreste visualizzare la sezione dedicata a PDFLib.</p>
<p align="center"><img width="634" height="166" alt="PDFLib installed" src="http://www.davidonzo.com/public/image/debianubuntu/pdflib.png" /></p><p>Tags: <a href="http://technorati.com/tag/PDFLib/" rel="tag">PDFLib</a>, <a href="http://technorati.com/tag/PHP/" rel="tag">PHP</a>, <a href="http://technorati.com/tag/PHP5/" rel="tag">PHP5</a></p>]]></description>
<pubDate>Fri, 10 Dec 2010 11:07:02 +0100</pubDate>
<guid isPermaLink="false">http://www.davidonzo.com/post/1270/installare-pdflib-per-php-su-ubuntu-server/</guid>
</item>
<item>
<title>Usare Dropbox per MyGalleryGenerator</title>
<link>http://www.davidonzo.com/post/1252/usare-dropbox-per-mygallerygenerator/</link>
<description><![CDATA[<p></p><p>Mi arriva una richiesta in merito a <a target="_blank" href="http://www.mygallerygenerator.com/">MyGalleryGenerator</a> e la possibilit&agrave; di pubblicare le gallerie realizzate tramite <a target="_blank" href="http://www.dropbox.com">Dropbox</a>. La risposta al quesito &egrave; semplice: <strong>s&igrave;</strong>. Se non possedete uno spazio web pubblico dove inserire la galleria, potete usare la vostra directory pubblica di Dropbox per rendere disponibile a tutti la galleria.</p>
<p>Realizzare la cosa &egrave; molto semplice. Accedete a MyGalleryGenerator e generate la vostra galleria. Alla fine del processo scaricate il file zip contenente la galleria stessa. A questo punto, scompattate il file nella directory Public (o in una sua sottodirectory) del vostro account Dropbox. Non c'&egrave; bisogno di farlo in linea, potete copiare i file nella directory desktop del vostro Dropbox. Penser&agrave; poi il sistema a sincronizzare ed inviare al server i file. L'operazione di sincronizzazione potrebbe durare pochi secondi o qualche minuto in funzione della vostra connessione.</p>
<p>Ora accedete al vostro account online e navigate i file fino ad arrivare a &quot;<strong>gallery.html</strong>&quot;. Cliccate sul file e dal menu a tendita su &quot;Copy public link&quot;.</p>
<p align="center"><a target="_blank" href="http://www.davidonzo.com/public/image/gallery/dropgallery.png"><img width="300" height="134" alt="dropbox" src="http://www.davidonzo.com/public/image/gallery/dropgallery_th.png" /></a></p>
<p>Copiatelo negli appunti.</p>
<p align="center"><a target="_blank" href="http://www.davidonzo.com/public/image/gallery/dropgallerylink.png"><img width="300" height="103" alt="dropbox" src="http://www.davidonzo.com/public/image/gallery/dropgallerylink_th.png" /></a></p>
<p>Condividete il link con le persone a cui volete far vedere la galleria. Il file gallery.html pu&ograve; essere rinominato a piacimento. Potete inserire pi&ugrave; gallerie organizzandole in sottodirectory. Fate solo attenzione a non mettere troppo sotto sforzo i server di Dropbox, perch&eacute; non vanno usati come sostituto di un webserver ed in caso di uso eccessivo fuori dal seminato, lo staff di Dropbox potrebbe decidere di sospendervi l'account ;-)<a href="http://dl.dropbox.com/u/3086245/lipari/gallery.html" target="_blank"><br />
</a></p>
<p><a href="http://dl.dropbox.com/u/3086245/lipari/gallery.html" target="_blank">Un esempio di galleria lo trovate nel mio account dropbox</a>.</p><p>Tags: </p>]]></description>
<pubDate>Mon, 27 Sep 2010 09:28:07 +0200</pubDate>
<guid isPermaLink="false">http://www.davidonzo.com/post/1252/usare-dropbox-per-mygallerygenerator/</guid>
</item>
<item>
<title>[WordPress] Estrarre gli allegati immagine da un post</title>
<link>http://www.davidonzo.com/post/1248/wordpress-estrarre-gli-allegati-immagine-da-un-post/</link>
<description><![CDATA[<p></p><p>Se utilizzate wordpress e siete soliti usare l'uploader interno per embeddare immagini nei post, sappiate che il sistema crea per le immagini stesse un'apposita voce di <a target="_blank" href="http://codex.wordpress.org/Using_Image_and_File_Attachments"><strong>attachment</strong></a> collegata a quel post/pagina.</p>
<p>Purtroppo wordpress tratta gli attachment immagine come qualsiasi altro allegato. Delle api pi&ugrave; specifiche sarebbero state una soluzione plausibile e molto pi&ugrave; accessibile per gli sviluppatori. Si pu&ograve; sempre ovviare scrivendo un plugin adeguato, la cosa non dovrebbe portare via troppo tempo.</p>
<p>Invece del plugin, di cui vi lascio ogni incombenza (<a target="_blank" href="http://www.davidonzo.com/post/810/come-creare-un-plugin-per-wordpress/">qui una breve guida <strong>NON</strong> aggiornata, ma ancora in gran parte valida su come scrivere un plugin per wordpress</a>), vi propongo per mia eterna memoria un semplicissimo hack gestibile da template per esportare un array di immagini di un post.</p>
<pre>&lt;?php <br />&nbsp; function get_attached_images($postid, $size=false, $icon=false){<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; $parameters = array('post_type' =&gt; 'attachment', <br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 'numberposts' =&gt; -1, <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; 'post_status' =&gt; null, <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; 'post_parent' =&gt; $postid<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; );<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $attachements = get_posts($parameters);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if($attachements){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; $res = array();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; foreach($attachements as $attachement){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if(wp_attachment_is_image($attachement-&gt;ID)){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; $res[] = wp_get_attachment_image_src($attachement-&gt;ID, $size, $icon);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br />&nbsp;&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; return $res;<br />&nbsp; }<br />?&gt;</pre>
<p>&nbsp;</p>
<p>L'uso &egrave; abbastanza semplice:</p>
<ul>
    <li>$postid: l'id del post</li>
    <li>$size: <a href="http://codex.wordpress.org/Function_Reference/wp_get_attachment_image_src" target="_blank">fate riferimento alla documentazione ufficiale per la funzione wp_get_attachment_image_src</a>.</li>
    <li>$icon: <a href="http://codex.wordpress.org/Function_Reference/wp_get_attachment_image_src" target="_blank">fate riferimento alla documentazione ufficiale per la funzione wp_get_attachment_image_src</a>.</li>
</ul>
<p>Buona domenica a tutti.</p><p>Tags: <a href="http://technorati.com/tag/wordpress/" rel="tag">wordpress</a></p>]]></description>
<pubDate>Sun, 19 Sep 2010 14:11:15 +0200</pubDate>
<guid isPermaLink="false">http://www.davidonzo.com/post/1248/wordpress-estrarre-gli-allegati-immagine-da-un-post/</guid>
</item>
<item>
<title>Installare VBox Guest Additions su Debian Lenny</title>
<link>http://www.davidonzo.com/post/1242/installare-vbox-guest-additions-su-debian-lenny/</link>
<description><![CDATA[<p></p><p>Con molta soddisfazione ho installato un ambiente web server su una virtual box Debian. Al fine di montare nel sistema guest, alcune directory risiedenti sulla macchina fisica, &egrave; necessari installare il modulo &quot;<strong>Guest Additions</strong>&quot; di virtual box. La procedura &egrave; abbastanza semplice, si considerino le seguenti condizioni, mie personali, che potrebbero facilmente differire da chi legge:</p>
<ul>
    <li>Debian 5.0.4</li>
    <li>Nessun gestore grafico installato</li>
    <li>Due schede di rete installate:
    <ul>
        <li>eth0: in bridge sulla scheda fisica (quindi esce verso internet)</li>
        <li>eth1: in host only (quindi esce solo verso la macchina fisica)</li>
    </ul>
    </li>
</ul>
<h2>Prerequisiti</h2>
<p>Alcuni pacchetti sono necessari per l'installazione del modulo. Digitare i seguenti comandi.</p>
<pre>apt-get install bzip2<br />apt-get install build-essential module-assistant<br />apt-get install linux-headers-`uname -r`</pre>
<p>&nbsp;</p>
<h2>Installazione</h2>
<p>Nella finestra della macchina virtuale, dal menu &quot;Dispositivo&quot;, selezionare &quot;Installa Guest Additions&quot;</p>
<p align="center"><img width="284" height="202" alt="vbox" src="http://www.davidonzo.com/public/image/vbox/vbox.png" style="border: 1px solid rgb(204, 204, 204);" /></p>
<p>Montate il cdrom virtuale (presuppongo che l'hardware della virtual machine lo abbia incluso).</p>
<pre>mount /media/cdrom</pre>
<p><br />
Accedetevi ed avviate lo script adeguato alla vostra piattaforma (VBoxLinuxAdditions-*.run). Nel mio caso, come di seguito.</p>
<pre>cd /media/cdrom<br />sh ./VBoxLinuxAdditions-86x.run</pre>
<p><br />
Nel mio caso ricevo qualche errore dato dal fatto che non esiste un programma desktop, ma quello che serve lo installa senza problemi. Alla fine fate un reboot, ed il filesystem <strong><em>vboxsf</em></strong> sar&agrave; disponibile da usare per montare le shared folders dal sistema padre.</p><p>Tags: <a href="http://technorati.com/tag/vbox/" rel="tag">vbox</a>, <a href="http://technorati.com/tag/debian/" rel="tag">debian</a></p>]]></description>
<pubDate>Sun, 05 Sep 2010 17:03:47 +0200</pubDate>
<guid isPermaLink="false">http://www.davidonzo.com/post/1242/installare-vbox-guest-additions-su-debian-lenny/</guid>
</item>
<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>
</channel>
</rss>

