<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	xmlns:georss="http://www.georss.org/georss" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:ymaps="http://api.maps.yahoo.com/Maps/V2/AnnotatedMaps.xsd">

<channel>
	<title>Just another blog &#187; php</title>
	<atom:link href="http://www.mcalamelli.net/category/php/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.mcalamelli.net</link>
	<description>Just another blog... si, lo tengo così</description>
	<lastBuildDate>Thu, 09 Sep 2010 13:30:27 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
	<atom:link rel='hub' href='http://www.mcalamelli.net/?pushpress=hub'/>
		<item>
		<title>Aggiornamento a WP3.0</title>
		<link>http://www.mcalamelli.net/2010/06/18/aggiornamento-a-wp3-0/</link>
		<comments>http://www.mcalamelli.net/2010/06/18/aggiornamento-a-wp3-0/#comments</comments>
		<pubDate>Fri, 18 Jun 2010 14:22:45 +0000</pubDate>
		<dc:creator>mcalamelli</dc:creator>
				<category><![CDATA[blog]]></category>
		<category><![CDATA[opensource]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[wordpress]]></category>

		<guid isPermaLink="false">http://www.mcalamelli.net/?p=2270</guid>
		<description><![CDATA[Ieri sera ho aggiornato il blog alla versione 3.0 di WordPress, ed è andata quasi liscia. Quasi perché inizialmente, dopo gli opportuni backup di files e DB, l&#8217;aggiornamento automatico che di solito utilizzo non andava a buon fine, presentandomi ad un certo punto una pagina bianca all&#8217;interno della struttura classica della dashboard. Sono così passato [...]]]></description>
			<content:encoded><![CDATA[<p>Ieri sera ho aggiornato il blog alla versione 3.0 di <a href="http://www.wordpress.org" target="_blank">WordPress</a>, ed è andata quasi liscia. Quasi perché inizialmente, dopo gli opportuni backup di files e DB, l&#8217;aggiornamento automatico che di solito utilizzo non andava a buon fine, presentandomi ad un certo punto una <a href="http://yfrog.com/83schermatamgp" target="_blank">pagina bianca</a> all&#8217;interno della struttura classica della dashboard. Sono così passato a ripulire i plugins, disattivando [ed eventualmente eliminando] quelli non usati; come suggerito su <a href="http://friendfeed.com/mcalamelli/8461e428/urca-wordpress-mi-chiede-se-voglio-fare-l-update" target="_blank">Friendfeed</a>, l&#8217;azione ha portato i risultati sperati, e l&#8217;aggiornamento automatico è così andato a buon fine. La prima cosa che mi è saltata all&#8217;occhio è la cura del tema della dashboard, chiaro ed elegante; circa le <a href="http://codex.wordpress.org/Version_3.0" target="_blank">nuove</a> features, me le devo ancora studiare.</p>
<p>Buon upgrade!</p>
<p>Alla prox</p>
<p>Technorati Tags: <a href="http://technorati.com/tag/wordpress" rel="tag">wordpress</a>, <a href="http://technorati.com/tag/wordpress+3.0" rel="tag"> wordpress 3.0</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.mcalamelli.net/2010/06/18/aggiornamento-a-wp3-0/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Lifestream</title>
		<link>http://www.mcalamelli.net/2010/02/25/lifestream/</link>
		<comments>http://www.mcalamelli.net/2010/02/25/lifestream/#comments</comments>
		<pubDate>Thu, 25 Feb 2010 08:30:18 +0000</pubDate>
		<dc:creator>mcalamelli</dc:creator>
				<category><![CDATA[blog]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[wordpress]]></category>

		<guid isPermaLink="false">http://www.mcalamelli.net/?p=1765</guid>
		<description><![CDATA[Lifestream è il nome dell&#8217;ultimo plugin che ho aggiunto alla mia installazione di Worpress. Cercavo da un pò di tempo uno strumento del genere, che mi permettesse di mostrare una linea temporale delle mie attività in rete, e che fosse integrabile nel blog. Finalmente l&#8217;ho trovato, e il test, che si è tramutato automaticamente in [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://wordpress.org/extend/plugins/lifestream/" target="_blank">Lifestream</a> è il nome dell&#8217;ultimo plugin che ho aggiunto alla mia installazione di Worpress.<br />
Cercavo da un pò di tempo uno strumento del genere, che mi permettesse di mostrare una linea temporale delle mie attività in rete, e che fosse integrabile nel blog.<br />
Finalmente l&#8217;ho trovato, e il test, che si è tramutato automaticamente in soluzione definitiva, mi ha entusiasmato molto: installazione semplicissima fatta direttamente dalla dashboard, setup a prova di utonto, velocità nella esecuzione delle operazioni.<br />
In questo screenshot, i servizi supportati:</p>
<p><a href="http://www.mcalamelli.net/wp-content/uploads/2010/02/lifestream_feeds.png"><img src="http://www.mcalamelli.net/wp-content/uploads/2010/02/lifestream_feeds-e1267041466555.png" alt="Lifestream, feed supportati" title="Lifestream, feed supportati" width="500" height="388" class="aligncenter size-full wp-image-1769" /></a></p>
<p>Direi che Lifestream copre un ventaglio piuttosto ampio di servizi, e in ogni caso se il nostro stream preferito non è tra quelli previsti di default, beh, c&#8217;è il sempre valido RSS generico a venirci in aiuto.</p>
<p>Finalmente ho ottenuto quello che volevo, e lo trovate a questa <a href="/lifestream">pagina</a>.</p>
<p>Alla prox</p>
<p>Technorati Tags: <a href="http://technorati.com/tag/lifestream" rel="tag">lifestream</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.mcalamelli.net/2010/02/25/lifestream/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>(S)Chiarimenti</title>
		<link>http://www.mcalamelli.net/2010/01/21/schiarimenti/</link>
		<comments>http://www.mcalamelli.net/2010/01/21/schiarimenti/#comments</comments>
		<pubDate>Thu, 21 Jan 2010 05:00:09 +0000</pubDate>
		<dc:creator>mcalamelli</dc:creator>
				<category><![CDATA[blog]]></category>
		<category><![CDATA[opensource]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[wordpress]]></category>

		<guid isPermaLink="false">http://www.mcalamelli.net/?p=1610</guid>
		<description><![CDATA[La decisione è stata presa in un lampo, travolgente e irrevocabile. Schiarire. Basta scuri, basta negativi, è tempo di chiarezza, semplicità, luminosità. Ed ecco, non annunciato, improvviso e (de)colorato come il freddo degli ultimi giorni, il tema nuovo di questo blog. E&#8217; basato su Precious, tema chiaro e minimale, che supporta bene sia i widget [...]]]></description>
			<content:encoded><![CDATA[<p>La decisione è stata presa in un lampo, travolgente e irrevocabile. Schiarire.<br />
Basta scuri, basta negativi, è tempo di chiarezza, semplicità, luminosità.<br />
Ed ecco, non annunciato, improvviso e (de)colorato come il freddo degli ultimi giorni, il tema nuovo di questo blog.</p>
<p>E&#8217; basato su <a href="http://wordpreciousss.org/" target="_blank">Precious</a>, tema chiaro e minimale, che supporta bene sia i widget sia il plugin <a href="http://www.backtype.com" target="_blank">BackType</a>, a differenza della carrozzeria precedente. Il tema l&#8217;ho hackato un poco per farci funzionare il mio plugin che mostra le categorie e i bookmarks come menù dropdown a scomparsa. </p>
<p>Per rispetto della licenza GPL, qui c&#8217;è il <a href="http://www.mcalamelli.net/files/precious_widget.diff" target="_blank">diff</a> con le modifiche che ho apportato al tema, e qui il mio <a href="http://www.mcalamelli.net/files/my-dropdown-divs.php.txt" target="_blank">plugin</a>.</p>
<p>Piace?</p>
<p>Alla prox</p>
<p>Technorati Tags: <a href="http://technorati.com/tag/precious" rel="tag">precious</a>, <a href="http://technorati.com/tag/wordpress" rel="tag"> wordpress</a>, <a href="http://technorati.com/tag/theme" rel="tag"> theme</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.mcalamelli.net/2010/01/21/schiarimenti/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Skype e la porta 80</title>
		<link>http://www.mcalamelli.net/2009/04/08/skype-e-la-porta-80/</link>
		<comments>http://www.mcalamelli.net/2009/04/08/skype-e-la-porta-80/#comments</comments>
		<pubDate>Wed, 08 Apr 2009 07:19:34 +0000</pubDate>
		<dc:creator>mcalamelli</dc:creator>
				<category><![CDATA[php]]></category>
		<category><![CDATA[windows]]></category>
		<category><![CDATA[skype]]></category>
		<category><![CDATA[xampp]]></category>

		<guid isPermaLink="false">http://www.mcalamelli.net/?p=524</guid>
		<description><![CDATA[Ieri ho aiutato un collega a prepararsi un ambiente completo per lo sviluppo di siti usando come linguaggio di preogrammazione il PHP, e la sua scelta è ricaduta su XAMPP per Windows, in modo da avere in unico pacchetto Apache, MySQL e PHP. Il collega in questione è una persona piuttosto precisa, e prima di [...]]]></description>
			<content:encoded><![CDATA[<p>Ieri ho aiutato un collega a prepararsi un ambiente completo per lo sviluppo di siti usando come linguaggio di preogrammazione il <a href="http://www.php.net" target="_blank">PHP</a>, e la sua scelta è ricaduta su <a href="http://en.wikipedia.org/wiki/XAMPP" target="_blank">XAMPP</a> per Windows, in modo da avere in unico pacchetto Apache, MySQL e PHP.<br />
Il collega in questione è una persona piuttosto precisa, e prima di procedere all&#8217;installazione della piattaforma XAMPP nella sua macchina di sviluppo si è guardato ben bene il manuale utente e il tutorial; alla fine, conscio della serie di step da eseguire, ha proseguito con il download e l&#8217;installazione del pacchetto.</p>
<p><span id="more-524"></span></p>
<p>L&#8217;installazione è filata via liscia, ma subito dopo ha riscontrato un problema: mentre MySQL partiva tranquillamente, Apache non aveva nessuna intenzione di andare su.<br />
Essendo un utente smaliziato (e programmatore di professione), il mio collega ha effettuato alcuni test con il <a href="http://www.mozilla-europe.org/it/firefox" target="_blank">Firefox</a> e con <a href="http://it.wikipedia.org/wiki/Telnet" target="_blank">telnet</a>, e si è accorto che esisteva un processo in <strong>listening</strong> sulla porta 80: già, ma quale?<br />
Era certo di non avere altri web server installati e avviati nella sua macchina, e quindi mi ha interpellato per risolvere il problema.<br />
La caccia al processo incriminato l&#8217;abbiamo svolta usando <a href="http://technet.microsoft.com/en-us/sysinternals/bb896653.aspx" target="_blank">ProcessExplorer</a>, un task manager avanzato in grado di fornire molte informazioni utili circa i processi in esecuzione sul sistema, e tra queste informazioni ci sono anche le porte di rete utilizzate.<br />
Un primo check sui processi in esecuzione non ha mostrato niente di significativo, e quindi abbiamo passato in rassegna un processo alla volta per trovare l&#8217;usurpatore; e alla fine, come da titolo del post, è emerso che <strong>Skype</strong> era in listening sia sulla porta 80 (http) che sulla porta 443 (https)!</p>
<p>Dopo uno sguardo sconsolato, e qualche maledizione verso i realizzatori del software per aver perso tutto quel tempo per una cavolata, abbiamo aperto le opzioni di Skype, e trovato la parte incriminata, parte che potete vedere quì sotto (l&#8217;immagine l&#8217;ho recuperata in rete):<br />
</p>
<p /><img src="http://www.mcalamelli.net/wp-content/uploads/2009/04/skype_conf_ports.jpg" alt="skype_conf_ports" title="skype_conf_ports" width="573" height="461" class="alignnone size-full wp-image-525" /></p>
<p />
E&#8217; stato quindi sufficiente deselezionare il checkbox incriminato, e finalmente abbiamo ottenuto Apache up and running.<br />
Quindi, caro lettore, se mai dovessi installare XAMPP, o qualsiasi altro web server, in un PC nel quale c&#8217;è Skype in esecuzione, verifica le impostazioni di cui sopra.</p>
<p>Alla prox</p>
<p>Technorati Tags: <a href="http://technorati.com/tag/skype" rel="tag">skype</a>, <a href="http://technorati.com/tag/php" rel="tag">php</a>, <a href="http://technorati.com/tag/xampp" rel="tag">xampp</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.mcalamelli.net/2009/04/08/skype-e-la-porta-80/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Quando Subversion incontra lo sviluppo web</title>
		<link>http://www.mcalamelli.net/2007/11/29/quando-subversion-incontra-lo-sviluppo-web/</link>
		<comments>http://www.mcalamelli.net/2007/11/29/quando-subversion-incontra-lo-sviluppo-web/#comments</comments>
		<pubDate>Thu, 29 Nov 2007 17:15:31 +0000</pubDate>
		<dc:creator>mcalamelli</dc:creator>
				<category><![CDATA[linux]]></category>
		<category><![CDATA[opensource]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[post-commit hooks]]></category>
		<category><![CDATA[subversion]]></category>
		<category><![CDATA[web development]]></category>

		<guid isPermaLink="false">http://mcalamelli.netsons.org/2007/11/29/quando-subversion-incontra-lo-sviluppo-web/</guid>
		<description><![CDATA[Dopo un lungo periodo di gestazione, finalmente e&#8217; venuto alla luce questo post, che personalmente reputo molto interessante (ma va??). Come introdotto dal titolo, espongo uno scenario di uso che mostra come poter integrare Subversion con lo sviluppo e il mantenimento della nostra web application. Nel dettaglio, con web application intendo un applicativo PHP installato [...]]]></description>
			<content:encoded><![CDATA[<p>Dopo un lungo periodo di gestazione, finalmente e&#8217; venuto alla luce questo post, che personalmente reputo molto interessante (ma va??).<br />
Come introdotto dal titolo, espongo uno scenario di uso che mostra come poter integrare Subversion con lo sviluppo e il mantenimento della nostra web application. Nel dettaglio, con web application intendo un applicativo PHP installato in diversi server di produzione: quindi, un punto di sviluppo, tanti punti di utilizzo.<br />
Bene, ipotizziamo ora il workflow per l&#8217;installazione per un nuovo cliente: connessione remota verso il server, quindi decompressione (se abbiamo una tarball o un archivio compresso) oppure copia (nel caso di singoli files), niente di trascendentale, quindi; il discorso si complica nel caso in cui ci accorgiamo che il nostro prodotto contiene un bug, oppure se abbiamo apportato modifiche interessanti allo stesso, e in questo caso dobbiamo operare a mano nelle n installazioni, con il rischio di sbagliare/dimenticarsi qualcosa.<br />
E&#8217; qui che Subversion viene in nostro aiuto per realizzare una specie di sistema di installazione/aggiornamento automatizzata di tipo &#8220;push&#8221; (spero che il termine sia giusto).</p>
<p><span id="more-120"></span></p>
<p>Prerequisiti:<br />
0) un server con il client Subversion installato ed utilizzabile dall&#8217;utente di Apache, nel mio caso www-data;<br />
1) un repository Subversion raggiungibile dal server;<br />
2) un linguaggio di scripting presente nel repository, utilizzabile per scrivere il post-commit hook, nel mio esempio Python;</p>
<p>Semplificazioni:<br />
0) il repository risiede nel mio PC, e ci accedo tramite il protocollo file://;<br />
1) i server remoti, nel dettaglio tre, sono rappresentati da tre diverse directory nella DocumentRoot di Apache;</p>
<p>Ecco una piccola descrizione di cio&#8217; che ho realizzato e di quello che vedrete negli snippets successivi.<br />
Io ho sviluppato una web application general purpose, molto flessibile e adattabile a molti clienti, ed essendo un bravo programmatore utilizzo gia&#8217; subversion per mantenere i miei sorgenti. Aggiungo quindi una specie di installer per l&#8217;applicazione, in pratica una pagina PHP che invoca il checkout del progetto dal repository principale.</p>
<p>Ecco il codice dell&#8217;installer.</p>
<ol class="codelist">
<li class="tab0 odd"><code>&lt;?php</code></li>
<li class="tab1 even"><code>exec(&quot;svn co file:///home/massi/svn/svnwebapp&quot;);</code></li>
<li class="tab0 odd"><code>?&gt;</code></li>
</ol>
<p>Che cosa succede quando invochiamo l&#8217;esecuzione dell&#8217;installer (preventivamente copiato nel server)?<br />
Il client svn sl server preleva il progetto dal repository e crea, con i giusti permessi (quelli del webserver), la copia locale dei files.</p>
<p>Cominciamo con gli snippets!</p>
<p>Ecco il contenuto della directory che ospita il progetto iniziale della web application</p>
<pre style="color:Grey;font-size:12px;">
massi@aspire:~$ cd Projects/svnwebapp/
massi@aspire:~/Projects/svnwebapp$ ls -l
totale 8
-rw-r--r-- 1 massi massi 104 2007-11-11 22:35 index.php
-rw-r--r-- 1 massi massi  30 2007-11-02 06:48 updater.php
massi@aspire:~/Projects/svnwebapp$
</pre>
<p>Creiamo ora il repository svn</p>
<pre style="color:Grey;font-size:12px;">
massi@aspire:~$ svnadmin create /home/massi/svn/svnwebapp
massi@aspire:~$
</pre>
<p>Effettuiamo ora l&#8217;import della web application nel repository appena creato</p>
<pre style="color:Grey;font-size:12px;">
massi@aspire:~$ cd Projects/
massi@aspire:~/Projects$ svn import -m "Import iniziale" svnwebapp file:///home/massi/svn/svnwebapp
Aggiungo       svnwebapp/updater.php
Aggiungo       svnwebapp/index.php

Commit della Revisione 1 eseguito.
massi@aspire:~/Projects$
</pre>
<p>Ora ci spostiamo nella root del nostro webserver locale, ed eseguiamo il checkout del progetto per continuare a svilupparlo, sotto svn.</p>
<pre style="color:Grey;font-size:12px;">
massi@aspire:~$ cd /var/www/
massi@aspire:/var/www$ sudo svn co file:///home/massi/svn/svnwebapp
A    svnwebapp/updater.php
A    svnwebapp/index.php
Estratta revisione 1.
massi@aspire:/var/www$
</pre>
<p>Guardiamo cosa e&#8217; successo in /var/www</p>
<pre style="color:Grey;font-size:12px;">
massi@aspire:~$ ls /var/www/svnwebapp/
index.php  updater.php
massi@aspire:~$
</pre>
<p>Bene, la directory e&#8217; stata creata, cosi&#8217; come i files della web application.<br />
Ora eseguiamola!</p>
<pre style="color:Grey;font-size:12px;">
massi@aspire:~$ lynx --source http://localhost/svnwebapp
&lt;html&gt;
&lt;head&gt;
&lt;/head&gt;
&lt;body&gt;
Versione PHP installata: 5.2.3-1ubuntu6
&lt;/body&gt;
&lt;/html&gt;
massi@aspire:~$
</pre>
<p>Per curiosita&#8217; diamo una occhiata a questo complicatissimo script (index.php).</p>
<ol class="codelist">
<li class="tab0 odd"><code>&lt;html&gt;</code></li>
<li class="tab0 even"><code>&lt;head&gt;</code></li>
<li class="tab0 odd"><code>&lt;/head&gt;</code></li>
<li class="tab0 even"><code>&lt;body&gt;</code></li>
<li class="tab0 odd"><code>&lt;?php</code></li>
<li class="tab1 even"><code>echo 'Versione PHP : ' . phpversion() . '&lt;br&gt;';</code></li>
<li class="tab0 odd"><code>?&gt;</code></li>
<li class="tab0 even"><code>&lt;/body&gt;</code></li>
<li class="tab0 odd"><code>&lt;/html&gt;</code></li>
</ol>
<p>Ora che abbiamo testato le funzionalita&#8217; di svn per la gestione &#8220;locale&#8221; della web application, creiamo i nostri tre server simulati (con gli opportuni permessi), copiamo in ognuno di essi l&#8217;installer e lanciamo quest&#8217;ultimo per creare le applicazioni.</p>
<pre style="color:Grey;font-size:12px;">
massi@aspire:~$ cd /var/www
massi@aspire:/var/www$ sudo mkdir fakesrv{1,2,3}
massi@aspire:/var/www$ sudo chown www-data:www-data fakesrv{1,2,3}
massi@aspire:/var/www$ ls
fakesrv1  fakesrv2  fakesrv3  index.html  svnwebapp
massi@aspire:/var/www$ cd
massi@aspire:~$ sudo cp svnwebapp_installer.php /var/www/fakesrv1/
massi@aspire:~$ sudo cp svnwebapp_installer.php /var/www/fakesrv2/
massi@aspire:~$ sudo cp svnwebapp_installer.php /var/www/fakesrv3/
massi@aspire:~$ lynx --source http://localhost/fakesrv1/svnwebapp_installer.php
massi@aspire:~$ lynx --source http://localhost/fakesrv2/svnwebapp_installer.php
massi@aspire:~$ lynx --source http://localhost/fakesrv3/svnwebapp_installer.php
</pre>
<p>Giusto per scrupolo vediamo cosa e&#8217; successo dentro a fakesrv1.</p>
<pre style="color:Grey;font-size:12px;">
massi@aspire:/var/www$ ls -lR fakesrv1
fakesrv1:
totale 4
drwxr-xr-x 3 www-data www-data 136 2007-11-26 13:34 svnwebapp
-rw-r--r-- 1 root     root      59 2007-11-26 13:34 svnwebapp_installer.php

fakesrv1/svnwebapp:
totale 8
-rw-r--r-- 1 www-data www-data 169 2007-11-26 13:34 index.php
-rw-r--r-- 1 www-data www-data  30 2007-11-26 13:34 updater.php
massi@aspire:/var/www$
</pre>
<p>Tramite lynx verifichiamo che tutto funzioni.</p>
<pre style="color:Grey;font-size:12px;">
massi@aspire:~$ lynx --source http://localhost/fakesrv1/svnwebapp
&lt;html&gt;
&lt;head&gt;
&lt;/head&gt;
&lt;body&gt;
Versione PHP installata: 5.2.3-1ubuntu6
&lt;/body&gt;
&lt;/html&gt;
massi@aspire:~$
</pre>
<p>Tralascio gli snipper delle verifiche per gli altri due &#8220;server&#8221;, tutto funziona ovviamente allo stesso modo.<br />
Riassumiamo quello che e&#8217; successo finora: tramite l&#8217;installer ho potuto replicare la mia web application nei server dei miei ipotetici tre clienti, attingendo il codice direttamente dal repository SVN, che contiene l&#8217;ultima release del progetto.<br />
Ora pero&#8217; mi sono accorto che la mia web application manca di un requisito fondamentale, e cioe&#8217; una stringa di testo con il mio indirizzo email, percio&#8217; sono costretto ad aggiornare le varie installazioni!<br />
Vediamo quindi in che modo il mio sistema di installer diventa comodissimo in caso di aggiornamenti: aggiungiamo un post-commit hook al repository.<br />
Ecco il contenuto della directory del repository.</p>
<pre style="color:Grey;font-size:12px;">
massi@aspire:~$ ls -l svn/svnwebapp
totale 8
drwxr-xr-x 2 massi massi 128 2007-11-11 23:20 conf
drwxr-xr-x 2 massi massi  48 2007-11-11 23:20 dav
drwxr-sr-x 5 massi massi 256 2007-11-12 00:12 db
-r--r--r-- 1 massi massi   2 2007-11-11 23:20 format
drwxr-xr-x 2 massi massi 392 2007-11-11 23:58 hooks
drwxr-xr-x 2 massi massi 104 2007-11-11 23:20 locks
-rw-r--r-- 1 massi massi 229 2007-11-11 23:20 README.txt
</pre>
<p>La directory che ci interessa e&#8217;, ovviamente, hooks.</p>
<pre style="color:Grey;font-size:12px;">
massi@aspire:~$ ls -l svn/svnwebapp/hooks/
totale 40
-rwxr-xr-x 1 massi massi  290 2007-11-11 23:58 post-commit
-rw-r--r-- 1 massi massi 1996 2007-11-11 23:20 post-commit.tmpl
-rw-r--r-- 1 massi massi 1673 2007-11-11 23:20 post-lock.tmpl
-rw-r--r-- 1 massi massi 2290 2007-11-11 23:20 post-revprop-change.tmpl
-rw-r--r-- 1 massi massi 1602 2007-11-11 23:20 post-unlock.tmpl
-rw-r--r-- 1 massi massi 2969 2007-11-11 23:20 pre-commit.tmpl
-rw-r--r-- 1 massi massi 2038 2007-11-11 23:20 pre-lock.tmpl
-rw-r--r-- 1 massi massi 2764 2007-11-11 23:20 pre-revprop-change.tmpl
-rw-r--r-- 1 massi massi 1979 2007-11-11 23:20 pre-unlock.tmpl
-rw-r--r-- 1 massi massi 2137 2007-11-11 23:20 start-commit.tmpl
massi@aspire:~$
</pre>
<p>Come si vede, e&#8217; presente il mio file post-commit , al quale ho dato di permessi di esecuzione.<br />
Vediamone il contenuto.</p>
<ol class="codelist">
<li class="tab0 odd"><code>#!/usr/bin/python</code></li>
<li class="even">&nbsp;</li>
<li class="tab0 odd"><code>import sys</code></li>
<li class="tab0 even"><code>import urllib2</code></li>
<li class="odd">&nbsp;</li>
<li class="tab0 even"><code>urls = [&quot;http://localhost/fakesrv1/svnwebapp/updater.php&quot;,</code></li>
<li class="tab1 odd"><code>&quot;http://localhost/fakesrv2/svnwebapp/updater.php&quot;,</code></li>
<li class="tab1 even"><code>&quot;http://localhost/fakesrv3/svnwebapp/updater.php&quot;]</code></li>
<li class="odd">&nbsp;</li>
<li class="tab0 even"><code>repos = sys.argv[1]</code></li>
<li class="tab0 odd"><code>rev = sys.argv[2]</code></li>
<li class="even">&nbsp;</li>
<li class="tab0 odd"><code>for url in urls:</code></li>
<li class="tab1 even"><code>urllib2.urlopen(url)</code></li>
<li class="odd">&nbsp;</li>
</ol>
<p>Come si puo&#8217; vedere, e&#8217; un semplicissimo script Python che viene eseguito ad ogni commit (da qui&#8217; il nome post-commit): il codice mi sembra piuttosto chiaro, data una lista di URL, quelli relativi alle varie installazioni della web application, un ciclo sulla lista effettua il collegamento alla pagina updater.php di ogni installazione.<br />
Il codice dell&#8217;updater e&#8217; molto simile a quello dell&#8217;installer, addirittura piu&#8217; semplice.</p>
<ol class="codelist">
<li class="tab0 odd"><code>&lt;?php</code></li>
<li class="tab1 even"><code>exec(&quot;svn update&quot;);</code></li>
<li class="tab0 odd"><code>?&gt;</code></li>
</ol>
<p>Ok, direi che siamo pronti a testare il tutto. Apriamo il file index.php con il nostro editor preferito, apportiamo la modifica di cui sopra e effettuiamo il commit.</p>
<pre style="color:Grey;font-size:12px;">
massi@aspire:/var/www/svnwebapp$ sudo vi index.php
massi@aspire:/var/www/svnwebapp$ sudo svn commit -m 'Aggiunto autore'
Trasmetto      index.php
Trasmissione dati .
Commit della Revisione 2 eseguito.
massi@aspire:/var/www/svnwebapp$
</pre>
<p>Ora la prova del 9, verifichiamo i tre server.</p>
<pre style="color:Grey;font-size:12px;">
massi@aspire:~$ lynx --source http://localhost/fakesrv1/svnwebapp
&lt;html&gt;
&lt;head&gt;
&lt;/head&gt;
&lt;body&gt;
Versione PHP installata: 5.2.3-1ubuntu6&lt;br&gt;
---&lt;br&gt;
Autore: Massimiliano Calamelli&lt;br&gt;
Email: mcalamelli@gmail.com&lt;/body&gt;
&lt;/html&gt;
massi@aspire:~$ lynx --source http://localhost/fakesrv2/svnwebapp
&lt;html&gt;
&lt;head&gt;
&lt;/head&gt;
&lt;body&gt;
Versione PHP installata: 5.2.3-1ubuntu6&lt;br&gt;
---&lt;br&gt;
Autore: Massimiliano Calamelli&lt;br&gt;
Email: mcalamelli@gmail.com&lt;/body&gt;
&lt;/html&gt;
massi@aspire:~$ lynx --source http://localhost/fakesrv3/svnwebapp
&lt;html&gt;
&lt;head&gt;
&lt;/head&gt;
&lt;body&gt;
Versione PHP installata: 5.2.3-1ubuntu6&lt;br&gt;
---&lt;br&gt;
Autore: Massimiliano Calamelli&lt;br&gt;
Email: mcalamelli@gmail.com&lt;/body&gt;
&lt;/html&gt;
</pre>
<p>Perfetto, tutto mi sembra ok, direi che il sistema ha funzionato!<br />
Ovviamente sono conscio del fatto che il tutto e&#8217; realizzato in un ambiente molto differente dalla realta&#8217;, ma mi sento di poter affermare che con poche modifiche il tutto possa funzionare anche nel mondo reale; alcuni perfezionamenti che mi vengono in mente sono questi:</p>
<p>post-commit hook : l&#8217;elenco degli host da aggiornare potrebbe essere letto da un file, e non hard-coded all&#8217;interno dello script, in modo da poter escludere piu&#8217; facilmente host che per svariati motivi non devono essere aggiornati. Inoltre un controllo sul risultato della connessione tramite urllib2 sarebbe auspicabile, magari con una notifica via mail dell&#8217;insuccesso dell&#8217;operazione per il/i determinati hosts;</p>
<p>updater.php : la pagina in questione andrebbe in qualche modo protetta, cosi&#8217; da impedire eventuali chiamate non autorizzate.</p>
<p>Che dire, e&#8217; stato veramente interessante realizzare un sistema del genere, anche se molto semplificato rispetto ad un uso reale, un motivo in piu&#8217; per studiarsi i sistemi di controllo versione: io ho usato SVN come RCS e Python per il post-commit hook, ma nulla vieta di realizzare un sistema simile con CVS e un qualsiasi altro file eseguiibile che si chiami post-commit.<br />
Ogni bravo programmatore dovrebbe SEMPRE usare un sistema di controllo versione.</p>
<p>Grazie a <a href="http://www.fullo.net" target="_blank">Fullo</a> e Jaures per le preziose verifiche.</p>
<p>Alla prox</p>
<p>Technorati Tags: <a href="http://technorati.com/tag/subversion" rel="tag">subversion</a>, <a href="http://technorati.com/tag/php" rel="tag"> php</a>, <a href="http://technorati.com/tag/python" rel="tag"> python</a>, <a href="http://technorati.com/tag/post-commit+hooks" rel="tag"> post-commit hooks</a>, <a href="http://technorati.com/tag/web+development" rel="tag"> web development</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.mcalamelli.net/2007/11/29/quando-subversion-incontra-lo-sviluppo-web/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>WordPress 2.1</title>
		<link>http://www.mcalamelli.net/2007/01/29/wordpress-21/</link>
		<comments>http://www.mcalamelli.net/2007/01/29/wordpress-21/#comments</comments>
		<pubDate>Mon, 29 Jan 2007 10:10:14 +0000</pubDate>
		<dc:creator>mcalamelli</dc:creator>
				<category><![CDATA[javascript]]></category>
		<category><![CDATA[opensource]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://mcalamelli.netsons.org/2007/01/29/wordpress-21/</guid>
		<description><![CDATA[E anche questo upgrade e&#8217; andato a buon fine, giusto il tempo di fare il backup dei files e dei dati di mySQL! Per la cronaca, ho seguito l&#8217;ottimo screencast di Andrea Beggi. Buon upgrade a tutti! Alla prox]]></description>
			<content:encoded><![CDATA[<p>E anche questo upgrade e&#8217; andato a buon fine, giusto il tempo di fare il backup dei files e dei dati di mySQL!<br />
Per la cronaca, ho seguito l&#8217;ottimo screencast di <a href="http://www.andreabeggi.net/wp-content/wp-upgrade.html" target="_blank">Andrea Beggi</a>.<br />
Buon upgrade a tutti!</p>
<p>Alla prox</p>
]]></content:encoded>
			<wfw:commentRss>http://www.mcalamelli.net/2007/01/29/wordpress-21/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Setup di PolyglotPolyglot&#8217;s setup</title>
		<link>http://www.mcalamelli.net/2006/03/15/setup-di-polyglot/</link>
		<comments>http://www.mcalamelli.net/2006/03/15/setup-di-polyglot/#comments</comments>
		<pubDate>Wed, 15 Mar 2006 16:01:24 +0000</pubDate>
		<dc:creator>mcalamelli</dc:creator>
				<category><![CDATA[opensource]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://mcalamelli.netsons.org/2006/03/15/setup-di-polyglot/</guid>
		<description><![CDATA[Hi all, here&#8217;s a small tutorial to setup Polyglot in WordPress. It&#8217;s very easy to do this: you have to get Polyglot from here, unpack the archive and put the files into WordPress&#8217;s plugins directory. Now you can activate this plugin from the plugin administration page, and start up to write a multilanguage post. How? [...]]]></description>
			<content:encoded><![CDATA[<p>Hi all, here&#8217;s a small tutorial to setup Polyglot in WordPress.<br />
It&#8217;s very easy to do this: you have to get Polyglot from <a href="http://fredfred.net/skriker/download/wordpress/polyglot.zip">here</a>, unpack the archive and put the files into WordPress&#8217;s plugins directory. Now you can activate this plugin from the plugin administration page, and start up to write a multilanguage post.<br />
How? Simply using the lang_xx and /lang_xx tags to enclose the text, in the title and in the body of the post.<br />
A very simple example:</p>
<p>Title: &lt;lang_it&gt; Vino &lt;/lang_it&gt;&lt;lang_en&gt; Wine &lt;/lang_en&gt;<br />
Body: &lt;ang_it&gt; Vino rosso&lt;/lang_it&gt;&lt;lang_en&gt; Red wine &lt;/lang_en&gt;</p>
<p>now it&#8217;s enough to bring some modification is to the template ones of the sidebar that to the template ones of the single one post so that in before the languages available appear (than, if selected will apply the language to the blog), and in the second appears the small flag of the languages available for the single post.</p>
<p>Here&#8217;s my settings</p>
<p>sidebar.php</p>
<div class="codecolorer-container php blackboard" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br /></div></td><td><div class="php codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">&lt;li&gt;<br />
&nbsp; &nbsp;<span style="color: #000000; font-weight: bold;">&lt;?php</span> <span style="color: #b1b100;">include</span> <span style="color: #009900;">&#40;</span>TEMPLATEPATH <span style="color: #339933;">.</span> <span style="color: #0000ff;">'/searchform.php'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #000000; font-weight: bold;">?&gt;</span><br />
&lt;/li&gt;<br />
&lt;li&gt;&lt;h2&gt; Lingue &lt;/h2&gt;&lt;ul&gt;<br />
<span style="color: #000000; font-weight: bold;">&lt;?php</span> <span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span><a href="http://www.php.net/function_exists"><span style="color: #990000;">function_exists</span></a><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'polyglot_list_langs'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp;polyglot_list_langs<span style="color: #009900;">&#40;</span><span style="color: #009900; font-weight: bold;">false</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #009900;">&#125;</span><span style="color: #000000; font-weight: bold;">?&gt;</span>&lt;/ul&gt;</div></td></tr></tbody></table></div>
<p>single.php</p>
<div class="codecolorer-container php blackboard" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br /></div></td><td><div class="php codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">&lt;h2&gt;&lt;a href=&quot;<span style="color: #000000; font-weight: bold;">&lt;?php</span> <span style="color: #b1b100;">echo</span> get_permalink<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #000000; font-weight: bold;">?&gt;</span>&quot; rel=&quot;bookmark&quot; title=&quot;Permanent Link: <span style="color: #000000; font-weight: bold;">&lt;?php</span> the_title<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #000000; font-weight: bold;">?&gt;</span>&quot;&gt;<span style="color: #000000; font-weight: bold;">&lt;?php</span> the_title<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #000000; font-weight: bold;">?&gt;</span>&lt;/a&gt;<span style="color: #000000; font-weight: bold;">&lt;?php</span> <span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span><a href="http://www.php.net/function_exists"><span style="color: #990000;">function_exists</span></a><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'lp_other_langs'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>lp_other_langs<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">' '</span><span style="color: #339933;">,</span><span style="color: #0000ff;">' '</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">' '</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">' '</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">' '</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><span style="color: #009900;">&#125;</span><span style="color: #000000; font-weight: bold;">?&gt;</span>&lt;/h2&gt;</div></td></tr></tbody></table></div>
<p>The last thing that I have made is to modify the file polyglot.php in order to personalize the plugin; here one snippet of mine:</p>
<p>polyglot.php</p>
<div class="codecolorer-container php blackboard" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br /></div></td><td><div class="php codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #666666; font-style: italic;">// Default language version - used when proper language version of the text is not present</span><br />
<span style="color: #000088;">$polyglot_settings</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'default_lang'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'it'</span><span style="color: #339933;">;</span><br />
<br />
<span style="color: #666666; font-style: italic;">//You can define your own translations of language shortcuts</span><br />
<br />
<span style="color: #666666; font-style: italic;">//$polyglot_settings['trans']['cs'] = 'česky';</span><br />
<span style="color: #666666; font-style: italic;">//$polyglot_settings['trans']['de'] = 'deutsch';</span><br />
<span style="color: #000088;">$polyglot_settings</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'trans'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'en'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'english'</span><span style="color: #339933;">;</span><br />
<br />
<span style="color: #000088;">$polyglot_settings</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'trans'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'it'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'italiano'</span><span style="color: #339933;">;</span><br />
<span style="color: #666666; font-style: italic;">//$polyglot_settings['trans']['nl'] = 'nederlands';</span><br />
<span style="color: #666666; font-style: italic;">//$polyglot_settings['trans']['sv'] = 'svenska';</span><br />
<br />
<br />
<span style="color: #666666; font-style: italic;">//Which language versions you offer for the whole web - use the proper ISO codes!</span><br />
<span style="color: #666666; font-style: italic;">//$polyglot_settings['knownlangs'] = array('cs','en','sv');</span><br />
<span style="color: #000088;">$polyglot_settings</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'knownlangs'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <a href="http://www.php.net/array"><span style="color: #990000;">array</span></a><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'it'</span><span style="color: #339933;">,</span><span style="color: #0000ff;">'en'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<br />
<span style="color: #666666; font-style: italic;">//if there should be shown flags instead of names of languages</span><br />
<span style="color: #000088;">$polyglot_settings</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'use_flags'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #009900; font-weight: bold;">true</span><span style="color: #339933;">;</span></div></td></tr></tbody></table></div>
<p>And this is all, simple and clear.</p>
<p>Alla prox</p>
]]></content:encoded>
			<wfw:commentRss>http://www.mcalamelli.net/2006/03/15/setup-di-polyglot/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Visualizzazione random di filmati FlashRandom visualization of Flash movies</title>
		<link>http://www.mcalamelli.net/2006/01/20/visualizzazione-random-di-filmati-flash/</link>
		<comments>http://www.mcalamelli.net/2006/01/20/visualizzazione-random-di-filmati-flash/#comments</comments>
		<pubDate>Fri, 20 Jan 2006 14:11:36 +0000</pubDate>
		<dc:creator>mcalamelli</dc:creator>
				<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://mcalamelli.netsons.org/2006/01/20/visualizzazione-random-di-filmati-flash/</guid>
		<description><![CDATA[Hi all, this post regards a small script PHP that allows to visualize randomly a Flash movie between those present ones in one directory. The operation mechanism is this: page PHP does not make other that to load an Array the files .swf present in the directory, do a shuffle of the Array and sendes, [...]]]></description>
			<content:encoded><![CDATA[<p>Hi all, this post regards a small script PHP that allows to visualize randomly a Flash movie between those present ones in one directory. The operation mechanism is this: page PHP does not make other that to load an Array the files .swf present in the directory, do a shuffle of the Array and sendes, using the opportune ones header, to browser the content of element 0 of the Array. From the part of page HTML, he is sufficient to modify the references to single swf file relatively to tag OBJECT and EMBED so that pointing to page PHP.</p>
<ol class="codelist">
<li class="tab0 odd"><code>&lt;?php</code></li>
<li class="tab1 even"><code>define(&quot;LOCALDIR&quot;,getcwd());</code></li>
<li class="tab1 odd"><code>$files = array();</code></li>
<li class="even">&nbsp;</li>
<li class="tab1 odd"><code>if ($dir = opendir(LOCALDIR)) {</code></li>
<li class="tab2 even"><code>while (($file = readdir($dir)) !== false) {</code></li>
<li class="tab3 odd"><code>$fileinfo = pathinfo(LOCALDIR.&quot;\\&quot;.$file);</code></li>
<li class="tab3 even"><code>if ($file != &quot;.&quot; &amp;&amp; $file != &quot;..&quot; &amp;&amp; $fileinfo[&quot;extension&quot;] == &quot;swf&quot;) {</code></li>
<li class="tab4 odd"><code>$finfo = stat(LOCALDIR.&quot;\\&quot;.$file);</code></li>
<li class="tab4 even"><code>$files[] = $file;</code></li>
<li class="tab3 odd"><code>}</code></li>
<li class="tab2 even"><code>}</code></li>
<li class="tab3 odd"><code>closedir($dir);</code></li>
<li class="tab1 even"><code>}</code></li>
<li class="odd">&nbsp;</li>
<li class="tab1 even"><code>shuffle($files);</code></li>
<li class="odd">&nbsp;</li>
<li class="tab1 even"><code>$swf = $files[0];</code></li>
<li class="odd">&nbsp;</li>
<li class="tab1 even"><code>header(&quot;Pragma: public&quot;);</code></li>
<li class="tab1 odd"><code>header(&quot;Expires: Mon, 26 Jul 1997 05:00:00 GMT&quot;);</code></li>
<li class="tab1 even"><code>header(&quot;Last-Modified: &quot; . gmdate(&quot;D, d M Y H:i:s&quot;) . &quot; GMT&quot;);</code></li>
<li class="tab1 odd"><code>header(&quot;Cache-Control: must-revalidate&quot;);</code></li>
<li class="tab1 even"><code>header(&quot;Content-type: application/x-shockwave-flash&quot;);</code></li>
<li class="tab1 odd"><code>header(&quot;Content-Length: &quot;.filesize($swf));</code></li>
<li class="tab1 even"><code>header(&quot;Content-disposition: inline; filename=$swf&quot;);</code></li>
<li class="tab1 odd"><code>header(&quot;Accept-Ranges: &quot;.filesize($swf));</code></li>
<li class="tab1 even"><code>readfile($swf);</code></li>
<li class="tab1 odd"><code>exit();</code></li>
<li class="tab0 even"><code>?&gt;</code></li>
<li class="sourcelink"><strong>Download this code:</strong> <a href="http://mcalamelli.netsons.org/files/swfproducer.txt">swfproducer.txt</a></li>
</ol>
]]></content:encoded>
			<wfw:commentRss>http://www.mcalamelli.net/2006/01/20/visualizzazione-random-di-filmati-flash/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>
