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

<channel>
	<title>in Web we Trust &#187; php</title>
	<atom:link href="http://blog.danilosanchi.net/tag/php/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.danilosanchi.net</link>
	<description>storie, pensieri, idee...</description>
	<lastBuildDate>Tue, 22 Apr 2025 13:55:16 +0000</lastBuildDate>
	<language>it-IT</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>https://wordpress.org/?v=4.2.39</generator>
	<item>
		<title>Giocando con Selenium</title>
		<link>http://blog.danilosanchi.net/2014/02/10/giocando-con-selenium/</link>
		<comments>http://blog.danilosanchi.net/2014/02/10/giocando-con-selenium/#comments</comments>
		<pubDate>Mon, 10 Feb 2014 16:58:00 +0000</pubDate>
		<dc:creator><![CDATA[Danilo]]></dc:creator>
				<category><![CDATA[Sviluppo]]></category>
		<category><![CDATA[behat]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[mink]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[phpunit]]></category>
		<category><![CDATA[selenium]]></category>
		<category><![CDATA[tdd]]></category>
		<category><![CDATA[ubuntu]]></category>

		<guid isPermaLink="false">http://blog.danilosanchi.net/?p=194</guid>
		<description><![CDATA[E&#8217; parecchio che conosco Selenium, credo dal 2009 quando l&#8217;ho visto usare in un workshop di Francesco Trucchia al PHPDay in quel di Verona. Francesco ci mostrava come si poteva rifattorizzare un&#8217;applicazione dopo averne ingabbiato il comportamento con test funzionali. &#8230; <a href="http://blog.danilosanchi.net/2014/02/10/giocando-con-selenium/">Continua a leggere <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p><a href="http://blog.danilosanchi.net/2014/02/10/giocando-con-selenium/selenium/" rel="attachment wp-att-206"><img class="alignright size-full wp-image-206" alt="selenium" src="http://blog.danilosanchi.net/current/wp/wp-content/uploads/2014/02/selenium.png" width="162" height="174" /></a>E&#8217; parecchio che conosco <a title="Selenium" href="http://docs.seleniumhq.org/" target="_blank">Selenium</a>, credo dal 2009 quando l&#8217;ho visto usare in un workshop di <a title="Francesco Trucchia" href="http://www.francescotrucchia.it/" target="_blank">Francesco Trucchia</a> al <a title="PHPDay" href="http://2013.phpday.it/" target="_blank">PHPDay</a> in quel di Verona. Francesco ci mostrava come si poteva rifattorizzare un&#8217;applicazione dopo averne ingabbiato il comportamento con test funzionali.</p>
<p><em>Traduzione: prima di modificare il codice di un&#8217;applicazione che non conosci, magari scritta male, generalmente da un&#8217;altro, è buona norma scrivere un programma che simuli l&#8217;intervento dell&#8217;utente e svolga tutte le operazioni più importanti sull&#8217;applicazione stessa.<span id="more-194"></span></em></p>
<p>Con Selenium è possibile pilotare il browser e quindi muoversi tra le pagine di un sito, compilare form, cliccare link, draggare elementi. Quando facciamo questo sulla nostra applicazione stiamo eseguendo un test automatico per verificare che si comporti come ci aspettiamo. Quando invece lo facciamo su un altro sito per raggiungere delle informazioni ed estrarle periodicamente, stiamo facendo web scraping.</p>
<p>La leggenda narra che con il Selenium IDE sia possibile registrare delle macro, mentre un utente reale esegue le operazioni sull&#8217;applicazione, per poi rieseguirle in un secondo momento e verificare che questa continui a comportarsi nello stesso modo, nonostante il programmatore abbia cambiato la sua struttura interna.</p>
<p>Ad oggi questo mito è stato ormai sfatato poiché è evidente che il modo più pratico per utilizzare Selenium è quello di programmare manualmente le operazioni da eseguire attraverso una delle varie librerie a disposizione per ciascuno linguaggio di programmazione.</p>
<p>Per funzionare Selenium deve poter pilotare un browser, ad esempio Firefox, ed un browser ha bisogno di un ambiente grafico per funzionare. Su un server web però non abbiamo un ambiente grafico. Sul proprio computer invece è piuttosto difficile ed irritante fare qualsiasi altra cosa mentre Firefox continua ad aprirsi e a sbilinare da solo.</p>
<p>Possiamo però simulare l&#8217;ambiente grafico e dire a Selenium di usarlo. La parolina magica, suggeritami da<a title="Giorgio Sironi" href="http://www.giorgiosironi.com/" target="_blank"> Giorgio Sironi</a> all&#8217;<a title="Agile Day" href="http://www.agileday.it/" target="_blank">AgileDay2013</a>, è <strong>xvfb</strong>.</p>
<p>Installiamo <a title="Xvfb" href="http://www.x.org/releases/current/doc/man/man1/Xvfb.1.xhtml" target="_blank">Xvfb</a> e facciamo in modo che venga lanciato all&#8217;avvio della macchina:</p>
<pre>sudo apt-get install xvfb
sudo vim /etc/init.d/xvfb</pre>
<pre><em># /etc/init.d/xvfb</em>

#!/bin/bash

if [ -z "$1" ]; then
echo "`basename $0` {start|stop}"
exit
fi

case "$1" in
start)
/usr/bin/Xvfb :99 -ac -screen 0 1024x768x8 &gt; /dev/null &amp;
;;

stop)
killall Xvfb
;;
esac</pre>
<pre>sudo chmod 755 /etc/init.d/xvfb
vim ~/.bash_aliases</pre>
<pre><em># ~/.bash_aliases</em>

...
alias xvfb='etc/init.d/xvfb'</pre>
<pre>sudo /etc/init.d/update-rc.d xvfb default 10</pre>
<p>Ora è possibile avviare xvfb tramite il comando xvfb start e fermarlo tramite xvfb stop</p>
<p>Ora installiamo Selenium.<br />
scarichiamo da <a href="http://docs.seleniumhq.org/download/">http://docs.seleniumhq.org/download/</a> l’ultima versione di <strong>Selenium Server (formerly the Selenium RC Server)</strong>:<br />
Lo mettiamo tra le nostre librerie e poi facciamo la stessa cosa che abbiamo fatto per xvfb, ne semplifichiamo l&#8217;esecuzione.</p>
<pre>wget <a href="http://selenium.googlecode.com/files/selenium-server-standalone-2.39.0.jar">http://selenium.googlecode.com/files/selenium-server-standalone-2.39.0.jar</a>
sudo mkdir /var/lib/selenium
sudo mv selenium-server-standalone-2.39.0.jar /var/lib/selenium
cd /var/lib/selenium
sudo ln -s selenium-server-standalone-2.39.0.jar selenium-server.jar
sudo vim /etc/init.d/selenium</pre>
<pre><em># /etc/init.d/selenium</em>

#!/bin/bash

if [ -z "$1" ]; then
echo "`basename $0` {start|stop}"
exit
fi

export DISPLAY=":99"
case "$2" in
show)
export DISPLAY=":0"
;;
esac

case "$1" in
start)
java -jar /var/lib/selenium/selenium-server.jar -browserSessionReuse &gt; /dev/null &amp;
;;

stop)
curl http://localhost:4444/selenium-server/driver/?cmd=shutDownSeleniumServer
;;
esac</pre>
<pre>sudo 755 selenium
vim ~/.bash_aliases</pre>
<pre><em># ~/.bash_aliases</em>
...
alias selenium='etc/init.d/selenium'</pre>
<p>Ora è possibile avviare selenium nell&#8217;ambiente grafico generato da xvfb con il comando selenium start oppure in quello reale (se c&#8217;è) con selenium start show, e fermarlo con selenium stop</p>
<p>In alcuni casi potrebbe essere interessante lanciarlo all&#8217;avvio del server: lo si può fare con</p>
<pre>sudo /etc/init.d/update-rc.d selenium default 20</pre>
<p>Se non l&#8217;avete fatto non rimane che installare Firefox</p>
<pre>sudo apt-get install firefox</pre>
<p>Ora possiamo creare test funzionali con <a href="http://phpunit.de/manual/3.7/en/selenium.html">Selenium2 PHPUnit Extension</a> oppure far web scraping con <a href="http://mink.behat.org/">Mink<br />
</a></p>
<p>Questo articolo non è altro che un&#8217;assemblaggio ed una personalizzazione delle pratiche lette nei seguenti:</p>
<p><a href="http://www.installationpage.com/selenium/how-to-run-selenium-headless-firefox-in-ubuntu/" target="_blank">http://www.installationpage.com/selenium/how-to-run-selenium-headless-firefox-in-ubuntu/<br />
</a><a href="http://www.labelmedia.co.uk/blog/setting-up-selenium-server-on-a-headless-jenkins-ci-build-machine.html" target="_blank">http://www.labelmedia.co.uk/blog/setting-up-selenium-server-on-a-headless-jenkins-ci-build-machine.html<br />
</a><a href="http://testerinyou.blogspot.it/2011/05/run-selenium-rc-using-command-prompt.html">http://testerinyou.blogspot.it/2011/05/run-selenium-rc-using-command-prompt.html</a></p>
<p>Direi che è tutto. Ciao!</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.danilosanchi.net/2014/02/10/giocando-con-selenium/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Pioritree e Silex</title>
		<link>http://blog.danilosanchi.net/2013/01/27/pioritree-e-silex/</link>
		<comments>http://blog.danilosanchi.net/2013/01/27/pioritree-e-silex/#comments</comments>
		<pubDate>Sun, 27 Jan 2013 19:17:21 +0000</pubDate>
		<dc:creator><![CDATA[Danilo]]></dc:creator>
				<category><![CDATA[Idee]]></category>
		<category><![CDATA[Sviluppo]]></category>
		<category><![CDATA[design patterns]]></category>
		<category><![CDATA[git]]></category>
		<category><![CDATA[idea]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[phpunit]]></category>
		<category><![CDATA[refactoring]]></category>
		<category><![CDATA[silex]]></category>
		<category><![CDATA[tdd]]></category>
		<category><![CDATA[test]]></category>
		<category><![CDATA[time]]></category>
		<category><![CDATA[todo]]></category>

		<guid isPermaLink="false">http://blog.danilosanchi.net/?p=123</guid>
		<description><![CDATA[Circa due anni fa stavo (finalmente) studiando i design pattern su Head First Design Patterns, un libro semplice, pieno di figure, sicuramente più accessibile (ai programmatori un po&#8217; meno svegli) del ben più noto Design Patterns: Elementi per il riuso di &#8230; <a href="http://blog.danilosanchi.net/2013/01/27/pioritree-e-silex/">Continua a leggere <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p><a href="http://blog.danilosanchi.net/2013/01/27/vino-vecchio-nella-botte-nuova/post_it_tree/" rel="attachment wp-att-134"><img class="alignright  wp-image-134" alt="post_it_tree" src="http://blog.danilosanchi.net/current/wp/wp-content/uploads/2013/01/post_it_tree-267x300.jpg" width="214" height="240" /></a>Circa due anni fa stavo (finalmente) studiando i <strong>design pattern</strong> su <em><a title="Head First Design Patterns" href="http://www.headfirstlabs.com/books/hfdp/" target="_blank">Head First Design Patterns</a></em>, un libro semplice, pieno di figure, sicuramente più accessibile (ai programmatori un po&#8217; meno svegli) del ben più noto<em> <a title="Design Patterns" href="http://en.wikipedia.org/wiki/Design_Patterns" target="_blank">Design Patterns: Elementi per il riuso di software ad oggetti</a></em>, il quale è più un <strong>catalogo</strong> da consultare che un testo di <strong>apprendimento</strong>.</p>
<p>Beh, avevo letto del <strong><a title="Composite Pattern" href="http://en.wikipedia.org/wiki/Composite_pattern" target="_blank">Composite Pattern</a></strong> e mi era venuta in mente un&#8217;<strong>idea</strong> per metter in pratica quanto appreso.<br />
Cercavo un modo per <strong>dedicare il giusto tempo</strong> alle mille attività che dovevo/volevo svolgere senza trascurare nulla, ma soprattutto senza trascurare le cose più importanti:</p>
<p><em>Quanto tempo devo dedicare alla pulizia della casa? Quanto ne posso dedicare alle attività della mia associazione? Ma della pulizia della casa, quanto tempo dedico alla cucina e quanto alla camera da letto?</em></p>
<p><em><span id="more-123"></span></em></p>
<p>Insomma volevo costruire una <strong>gerarchia</strong> (un albero) di <strong>attività</strong> da svolgere, in cui ogni attività potesse essere suddivisa in sottoattività e così via. Ad ogni attività avrei quindi assegnato un <strong>livello di priorità</strong> (da 1 a 10 per esempio). Avrei infine scelto un <strong>monte ore</strong> di riferimento (ad esempio 100 ore) da <strong>distribuire automaticamente</strong> a ciascuna attività in base alle loro priorità. Il <strong>Composite Pattern</strong> era perfetto per gestire <strong>gerarchie di elementi</strong> e avrei potuto sperimentare un approccio <strong><a title="Test First" href="http://en.wikipedia.org/wiki/Test-driven_development" target="_blank">TDD</a></strong>. Il nome che gli avrei dato sarebbe stato <strong>Prioritree</strong>.</p>
<p>Non mi ci volle molto per realizzare un <strong>prototipo. </strong>Sarebbe stato impossibile implementare le classi che gestiscono una gerarchia senza l&#8217;ausilio di <strong>test unitari</strong>.<br />
Praticamente si doveva definire la propria gerarchia di attività con le loro priorità ed il monte ore assegnato su un file <strong>Yaml</strong>:</p>
<pre><span style="color: #0000ff;">// mytasks.yml</span>
<span style="color: #008000;">Root</span>:
  data: timeBox=100
  children:
     <span style="color: #008000;">Casa</span>:
        data: priority=10
        children:
           <span style="color: #008000;">Camera da letto</span>:
              data: priority=6
           <span style="color: #008000;">Bagno</span>:
              data: priority=10
           <span style="color: #008000;">Cucina</span>:
              data: priority=8
     <span style="color: #008000;">Associazione</span>:
        data: priority=6
        children:
           <span style="color: #008000;">Sito</span>:
              data: priority=2
           <span style="color: #008000;">Facebook</span>:
              data: priority=4
           <span style="color: #008000;">Eventi</span>:
              data: priority=10</pre>
<p>eseguendo un semplice <em>php index.php </em>il file veniva arricchito con le ore assegnate a ciascuna attività.</p>
<pre><span style="color: #0000ff;">// mytasks.yml</span>
<span style="color: #008000;">Root</span>:
   data: usedTime=0; timeBox=100; progress=0%; time=0/100
   children:
      <span style="color: #008000;">Casa</span>:
         data: usedTime=0; priority=10; progress=0%; time=0/62.5
         children:
            <span style="color: #008000;">Camera da letto</span>:
               data: usedTime=0; priority=6; progress=0%; time=0/15.63
            <span style="color: #008000;">Bagno</span>:
               data: usedTime=0; priority=10; progress=0%; time=0/26.04
            <span style="color: #008000;">Cucina</span>:
               data: usedTime=0; priority=8; progress=0%; time=0/20.83
      <span style="color: #008000;">Associazione</span>:
         data: usedTime=0; priority=6; progress=0%; time=0/37.5
         children:
            <span style="color: #008000;">Sito</span>:
               data: usedTime=0; priority=2; progress=0%; time=0/4.69
            <span style="color: #008000;">Facebook</span>:
               data: usedTime=0; priority=4; progress=0%; time=0/9.38
            <span style="color: #008000;">Eventi</span>:
               data: usedTime=0; priority=10; progress=0%; time=0/23.44</pre>
<p>Successivamente era possibile specificare il <strong>tempo utilizzato</strong> per ciascuna attività  a qualsiasi livello di dettaglio impostando <em>usedTime;</em> rilanciando <em>php index.php</em> veniva aggiornato il progresso percentuale e le ore assegnate su tutte le attività discendenti ed ascendenti.</p>
<pre><span style="color: #0000ff;">// mytasks.yml</span>
<span style="color: #008000;">Root</span>:
   data: usedTime=0; timeBox=100; progress=<span style="color: #0000ff;"><strong>11%</strong></span>; time=<span style="color: #0000ff;"><strong>11</strong></span>/100
   children:
      <span style="color: #008000;">Casa</span>:
         data: usedTime=<strong><span style="color: #ff0000;">2</span></strong>; priority=10; progress=<span style="color: #0000ff;"><strong>17.6%</strong></span>; time=<span style="color: #0000ff;"><strong>11</strong></span>/62.5
         children:
            <span style="color: #008000;">Camera da letto</span>:
               data: usedTime=<span style="color: #ff0000;"><strong>4</strong></span>; priority=6; progress=<span style="color: #0000ff;"><strong>29.87%</strong></span>; time=<span style="color: #0000ff;"><strong>4.67</strong></span>/15.63
            <span style="color: #008000;">Bagno</span>:
               data: usedTime=<span style="color: #ff0000;"><strong>5</strong></span>; priority=10; progress=<span style="color: #0000ff;"><strong>21.76%</strong></span>; time=<span style="color: #0000ff;"><strong>5.67</strong></span>/26.04
            <span style="color: #008000;">Cucina</span>:
               data: usedTime=0; priority=8; progress=<span style="color: #0000ff;"><strong>3.2%</strong></span>; time=<span style="color: #0000ff;"><strong>0.67</strong></span>/20.83
      <span style="color: #008000;">Associazione</span>:
         data: usedTime=0; priority=6; progress=0%; time=0/37.5
         children:
            <span style="color: #008000;">Sito</span>:
               data: usedTime=0; priority=2; progress=0%; time=0/4.69
            <span style="color: #008000;">Facebook</span>:
               data: usedTime=0; priority=4; progress=0%; time=0/9.38
            <span style="color: #008000;">Eventi</span>:
               data: usedTime=0; priority=10; progress=0%; time=0/23.44</pre>
<p>Era possibile cambiare le priorità delle attività oppure cambiare la struttura dell&#8217;albero in qualsiasi momento: le ore assegnate cambiavano, nessun problema.</p>
<p>Faceva altre cose ovviamente, come resettare il monte ore portandosi dietro i <em>debiti</em> e i <em>crediti</em> del monte ore precedente, ma l&#8217;idea in soldoni era questa.</p>
<p>Utilizzai come contenitore un <strong>microframework</strong> che stavo realizzando per i miei progetti personali ispirato a quanto avevo letto di <a title="Symfony 1.x" href="http://symfony.com/legacy" target="_blank"><strong>Symfony</strong></a> e dell&#8217;archiettura <a title="MVC" href="http://it.wikipedia.org/wiki/Model-View-Controller" target="_blank"><strong>MVC</strong></a>. Solo l&#8217;anno scorso imparai ad utilizzare <a title="Git" href="http://git-scm.com/" target="_blank"><strong>Git</strong></a> e <a title="Github" href="https://github.com" target="_blank"><strong>Github</strong></a> e vi pubblicai il mio Prioritree.</p>
<p>Quest&#8217;estate, però, ho imparato ad utilizzare <a title="Silex" href="http://silex.sensiolabs.org/" target="_blank"><strong>Silex</strong></a>, il fratellino minore di <a title="Symfony 2" href="http://symfony.com" target="_blank"><strong>Symfony 2</strong></a>, grazie ad un lavoretto con <a title="Ideato" href="http://www.ideato.it" target="_blank"><strong>Ideato</strong></a>. Quindi ho pensato di riprendere il Prioritree e sostituire il mio incompleto e rozzo microframework con Silex, al fine di costruire in un secondo momento una&#8217;interfaccia web decente per quello che ora è solo un set di classi.</p>
<p>Grazie ai vecchi test il <strong>porting</strong> è stato rapido e indolore e questo è il <a title="Prioritree" href="https://github.com/danielsan80/Prioritree" target="_blank"><strong>risultato</strong></a>.</p>
<p>Ho cercato di fare <em>commit</em> piccole e significative in modo da mettere in evidenza tutti i passaggi fatti per cambiare contenitore. I tag <a title="v1.0" href="https://github.com/danielsan80/Prioritree/tree/v1.0" target="_blank"><strong>v1.0</strong></a> e <a title="v2.0" href="https://github.com/danielsan80/Prioritree/tree/v2.0" target="_blank"><strong>v2.0</strong></a>  corrispondono rispettivamente al Prioritree prima e dopo il <em>travaso</em> in Silex.</p>
<p>Ora manca il <em>Readme</em> in <em>markdown</em> e buttar su un&#8217;interfaccia web semplice semplice per poterlo pubblicare e rendere disponibile a tutti. E&#8217; la prima volta che a distanza di anni riesco a riprendere del vecchio codice e a riutilizzarlo senza che mi faccia schifo. <img src="http://blog.danilosanchi.net/current/wp/wp-includes/images/smilies/simple-smile.png" alt=":)" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.danilosanchi.net/2013/01/27/pioritree-e-silex/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>La mia macchina</title>
		<link>http://blog.danilosanchi.net/2012/12/05/la-mia-macchina/</link>
		<comments>http://blog.danilosanchi.net/2012/12/05/la-mia-macchina/#comments</comments>
		<pubDate>Wed, 05 Dec 2012 20:00:11 +0000</pubDate>
		<dc:creator><![CDATA[Danilo]]></dc:creator>
				<category><![CDATA[Sviluppo]]></category>
		<category><![CDATA[apache]]></category>
		<category><![CDATA[capifony]]></category>
		<category><![CDATA[capistrano]]></category>
		<category><![CDATA[dev]]></category>
		<category><![CDATA[git]]></category>
		<category><![CDATA[lamp]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[mysql]]></category>
		<category><![CDATA[phing]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[phpunit]]></category>
		<category><![CDATA[symfony]]></category>

		<guid isPermaLink="false">http://blog.danilosanchi.net/?p=28</guid>
		<description><![CDATA[Tempo fa mi sono fatto un reference con tutto ciò che devo fare per configurare la una macchina di sviluppo e ho pensato che, riadattandolo un po&#8217;, sarebbe stato bello condividerlo. Questo reference è per coloro che sviluppano in PHP &#8230; <a href="http://blog.danilosanchi.net/2012/12/05/la-mia-macchina/">Continua a leggere <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p><a href="http://blog.danilosanchi.net/current/wp/wp-content/uploads/2012/11/Bianchina_bda-vi.jpg"><img class="alignright size-medium wp-image-87" title="Bianchina" alt="" src="http://blog.danilosanchi.net/current/wp/wp-content/uploads/2012/11/Bianchina_bda-vi-300x194.jpg" width="300" height="194" /></a>Tempo fa mi sono fatto un <em>reference</em> con tutto ciò che devo fare per configurare la una <strong><em>macchina di sviluppo</em></strong> e ho pensato che, riadattandolo un po&#8217;, sarebbe stato bello condividerlo. Questo reference è per coloro che sviluppano in <strong><em>PHP</em></strong> e vogliono dedicarsi all&#8217;aspetto creativo di questa attività, lasciando le cose ripetitive alle macchine come è giusto che sia.<br />
Sicuramente non è completo, e qualcuno salterà alcuni passi che riterrà poco utili.<br />
Potrà subire aggiornamenti. Osservazioni ed obiezioni saranno ben gradite.</p>
<p><span id="more-28"></span></p>
<p><em>Nota: quando un comando apre un editor di testo segue il testo da inserirvi indentato.</em></p>
<h2>Hardware</h2>
<p>Un portatile Asus X54C con <strong> disco a stato solido </strong> e 6Gb di RAM.</p>
<p>Il DSS è un buon investimento dato che fa risparmiare da subito tanto tempo e stress/frustrazione, quindi lo consiglio vivamente.</p>
<h2>Sistema Operativo</h2>
<p>Ubuntu 12.x</p>
<h2>LAMP</h2>
<p>L&#8217;installazione di un sistema LAMP si trova ovunque come per esempio <a href="http://www.howtoforge.com/ubuntu_lamp_for_newbies"> qui </a> . Ecco i comandi in rapida sequenza senza ulteriori spiegazioni:</p>
<pre class="font:courier-new toolbar:2 striped:false lang:sh highlight:0 decode:true crayon-selected">sudo apt-get install apache2</pre>
<p><em> verifica: Apache funziona?<br />
</em> <span style="font-family: 'courier new', courier;"> Browser -&gt; http://localhost </span></p>
<pre class="nums:false decode-attributes:false lang:sh decode:true">$ sudo apt-get install php5 libapache2-mod-php5
$ sudo service apache2 restart
$ sudo gedit /var/www/testphp.php
    &lt;?php phpinfo(); ?&gt;</pre>
<p><em> verifica: PHP funziona?<br />
</em><span style="font-family: 'courier new', courier;">Browser -&gt; http://localhost/test.php</span></p>
<pre>$ sudo apt-get install mysql-server
$ sudo apt-get install libapache2-mod-auth-mysql php5-mysql
$ sudo apt-get install phpmyadmin
$ sudo service apache2 restart</pre>
<h2>PhpMyAdmin</h2>
<p>Abbiamo già installato PHPMyAdmin. Rendiamolo accessibile da<br />
<span style="font-family: 'courier new', courier;">http://phpmyadmin</span></p>
<pre>$ sudo gedit /etc/apache2/sites-available/phpmyadmin
    &lt;VirtualHost *:80&gt;
        ServerAdmin myemail@email.com
        ServerName phpmyadmin
        ServerAlias phpmyadmin.local.com
        DocumentRoot /usr/share/phpmyadmin
        DirectoryIndex app.php index.php index.html
        &lt;Directory /usr/share/phpmyadmin&gt;
            AllowOverride all
        &lt;/Directory&gt;
        ErrorLog ${APACHE_LOG_DIR}/phpmyadmin.error.log
        # Possible values include: debug, info, notice, warn, error, crit,
        # alert, emerg
        LogLevel notice
        CustomLog ${APACHE_LOG_DIR}/phpmyadmin.access.log combined
    &lt;/VirtualHost&gt;
$ sudo a2ensite phpmyadmin
$ sudo gedit /etc/hosts
    127.0.0.1 phpmyadmin
$ sudo a2enmod rewrite
$ sudo service apache2 restart</pre>
<p><em> verifica: PhpMyAdmin funziona?<br />
</em><span style="font-family: 'courier new', courier;">Browser -&gt; http://phpmyadmin</span></p>
<h2>NetBeans</h2>
<p>Per lo sviluppo PHP, l&#8217;IDE che ho scelto, dopo anni di Eclipse, è NetBeans.</p>
<p>Download Netbeans:<br />
<span style="font-family: 'courier new', courier;">Browser -&gt; <a href="http://netbeans.org/downloads/start.html?platform=linux&amp;lang=en&amp;option=php">http://netbeans.org/downloads/start.html?platform=linux&amp;lang=en&amp;option=php</a></span></p>
<pre>$ cd ~/Scaricati
$ sudo chmod 777 netbeans-7.1-ml-php-linux.sh
$ ./netbeans-7.1-ml-php-linux.sh</pre>
<h2>Permissions</h2>
<p>Il vostro utente dovrebbe essere proprietario della cartella www</p>
<pre>$ sudo chown -R myuser /var/www</pre>
<p><em> Nota: recentemente l&#8217;ho spostata in ~/www e quindi è già di proprietà del l&#8217;utente. </em></p>
<h2>Symfony2</h2>
<p>Installando Symfony potrò usarne il tool di configurazione e ottimizzare il sistema per ospitarlo. Per un&#8217;applicazione complessa <a href="http://symfony.com/"> Symfony 2 </a> è il framwork ideale. Per qualcosa di un po&#8217; più semplice c&#8217;è <a href="http://silex.sensiolabs.org/"> Silex </a></p>
<h3>donwload</h3>
<p><span style="font-family: 'courier new', courier;">Browser -&gt; </span><a href="http://symfony.com/download"><span style="font-family: 'courier new', courier;">http://symfony.com/download</span></a></p>
<pre>$ cd ~/Scaricati
$ cp Symfony_Standard_Vendors_2.0.x.tgz /var/www/
$ cd /var/www/
$ tar -xf Symfony_Standard_Vendors_2.0.x.tgz</pre>
<p><span style="font-family: 'courier new', courier;">Browser -&gt; http://localhost/Symfony/web/config.php</span></p>
<pre>$ cd /var/www/Symfony</pre>
<h3>permissions</h3>
<pre>$ chmod -R 777 app/cache
$ chmod -R 777 app/logs</pre>
<p>Lanciando Symfony (ma anche qualsiasi altro script PHP) da client (per i test ad esempio) l&#8217;utente è quello di sistema, mentre da browser è www-data; i file scritti in cache nel primo non sono accessibili nel secondo e viceversa creando non pochi problemi. Quindi:</p>
<pre>$ setfacl -R -m u:www-data:rwx -m u:`whoami`:rwx app/cache app/logs
$ setfacl -dR -m u:www-data:rwx -m u:`whoami`:rwx app/cache app/logs</pre>
<h3>configuration</h3>
<pre>$ sudo apt-get install php5-sqlite
$ cd /etc/php5/conf.d/
$ sudo mv sqlite.ini sqlite.ini~
$ sudo service apache2 restart</pre>
<pre>$ sudo apt-get install php-apc
$ sudo service apache2 restart</pre>
<pre>$ sudo apt-get install php5-intl
$ sudo service apache2 restart</pre>
<pre>$ sudo gedit /etc/php5/apache2/php.ini
   short_open_tag = Off
   date.timezone = Europe/Paris
$ sudo service apache2 restart</pre>
<h2>Git</h2>
<p>Dopo anni di SVN mi hanno fatto scoprire Git e l&#8217;ho scelto per la velocità e perché&#8230; c&#8217;è <a href="https://github.com/"> GitHub </a> . Insomma se non hai un account GitHub <em> sei fuori. <img src="http://blog.danilosanchi.net/current/wp/wp-includes/images/smilies/simple-smile.png" alt=":)" class="wp-smiley" style="height: 1em; max-height: 1em;" /> </em></p>
<pre>$ sudo apt-get install git-core git-gui git-doc
$ sudo apt-get install gitg
$ git config --global color.ui true</pre>
<p><span style="font-family: 'courier new', courier;">Browser -&gt; </span><a href="http://help.github.com/linux-set-up-git/"><span style="font-family: 'courier new', courier;">http://help.github.com/linux-set-up-git/</span></a></p>
<h2>Pear</h2>
<p>Pear serve per reperire i pacchetti PHP presenti su Pear, fondamentalmente PHPUnit.</p>
<pre>$ sudo apt-get install php-pear
$ pear config-set auto_discover 1</pre>
<h2>PHPUnit</h2>
<p>Per testare il codice PHP lo standard de facto è PHPUnit. Per testare il proprio codice ci vuole disciplina, ma ancora prima è necessario che non ci siano ostacoli alla gestione di una suite di test. In questo Symfony  2 ci aiuta molto.</p>
<pre>$ sudo pear channel-discover pear.phpunit.de
$ pear install --alldeps phpunit/PHPUnit</pre>
<h2>Tools</h2>
<p>I seguenti tools sono utilità molto avanzate di controllo del codice non particolarmente utili se non si utilizza <a href="http://jenkins-ci.org/"> Jenkins </a>  e attualmente non lo uso.</p>
<pre>$ pdepend --help
$ sudo pear channel-discover pear.pdepend.org
$ sudo pear install pdepend/PHP_Depend</pre>
<pre>$ phpmd --help
$ sudo pear channel-discover pear.phpmd.org
$ sudo pear install --alldeps phpmd/PHP_PMD</pre>
<pre>$ phpcs --help
$ sudo pear install PHP_CodeSniffer
$ phpcs
$ pear config-show | grep php_dir
$ cd /usr/share/php/PHP/CodeSniffer/Standards/
$ sudo git clone git://github.com/opensky/Symfony2-coding-standard.git Symfony2
$ sudo phpcs --config-set default_standard Symfony2</pre>
<pre>$ phpcpd --help
$ pear install pear.phpunit.de/phpcpd</pre>
<pre>$ phpdoc --help
$ sudo pear install PhpDocumentor</pre>
<pre>$ phpcb --help
$ sudo pear install phpunit/PHP_CodeBrowser</pre>
<h2>Phing</h2>
<p>Phing permette di definire comandi che eseguono task ripetitivi, utili per la continous integration ma anche per facilitare la distribuzione del progetto su macchine di sviluppo differenti</p>
<pre>$ sudo pear channel-discover pear.phing.info
$ pear install phing/phing</pre>
<h2>Ruby on Rails, Capifony e Less</h2>
<p>Ruby serve principalmente per poter utilizzare Capistrano/Capifony per il deploy e Less, il CSS dinamico.</p>
<p>Seguire il tutorial per installare l’rvm e quindi ruby 1.9.2:</p>
<p><span style="font-family: 'courier new', courier;"> Browser -&gt; <a href="http://www.the-tech-tutorial.com/?p=1868">http://www.the-tech-</a></span><a href="http://www.the-tech-tutorial.com/?p=1868"><span style="font-family: 'courier new', courier;">tutorial.com/?p=1868</span></a></p>
<p>Fermarsi prima dell’installazione di Rails. Non eseguire  <em> $ gem install rails </em><br />
Eseguire invece</p>
<pre>$ gem install capifony</pre>
<pre>Aggiungere a ~/.bashrc
    if [ -f /etc/profile.d/rvm.sh ]; then
        source /etc/profile.d/rvm.sh
    fi $ sudo apt-get install libnode-less
$ sudo apt-get install npm nodejs
$ sudo npm install -g less</pre>
<h2>Virtual Host</h2>
<pre>$ sudo gedit /etc/apache2/sites-available/myproject
    &lt;VirtualHost *:80&gt;
        ServerAdmin myemail@email.com
        ServerName myproject
        ServerAlias myproject.local.com
        DocumentRoot /var/www/myproject/web
        DirectoryIndex app.php index.php index.html
        &lt;Directory /var/www/myproject/web&gt;
            AllowOverride all
        &lt;/Directory&gt;
        ErrorLog ${APACHE_LOG_DIR}/myproject.error.log
        # Possible values include: debug, info, notice, warn, error, crit,
        # alert, emerg
        LogLevel notice
        CustomLog ${APACHE_LOG_DIR}/myproject.access.log combined
    &lt;/VirtualHost&gt;
$ sudo a2ensite myproject
$ sudo gedit /etc/hosts
    127.0.0.1 myproject myproject.local.com
$ sudo a2enmod rewrite
$ sudo service apache2 restart</pre>
<h2>XDebug</h2>
<pre>$ sudo pecl install xdebug
$ find / -name 'xdebug.so' 2&gt; /dev/null /usr/lib/php5/20090626+lfs/xdebug.so
$ sudo gedit /etc/php5/conf.d/xdebug.ini
    zend_extension="/usr/lib/php5/20090626+lfs/xdebug.so"
    xdebub.max_nesting_level=200
$ sudo service apache2 restart</pre>
<h2>Capifony</h2>
<p>Ho trovato molto comodo Capifony per il deploy su Servergrove. Precedentemente lo abbiamo installato, qui si parla di come utilizzarlo per il deploy di un progetto Symfony 2 su ServerGrove:<br />
<a href="http://blog.servergrove.com/2011/09/07/deploying-symfony2-projects-on-shared-hosting-with-capifony/">http://blog.servergrove.com/2011/09/07/deploying-symfony2-projects-on-shared-hosting-with-capifony/ </a></p>
<p>Inoltre:</p>
<pre>$ gem install capifony capistrano-ext
$ gem install inifile</pre>
<p>Controllare con</p>
<pre>$ cap -vT</pre>
<p>e verificare che ci sia la lista dei task disponibili.</p>
<p>Ora copiamo parameters.ini in parameters.yml (e lo convertiamo in uno yml file) e lanciamo<br />
cap production database:move:to_local<br />
Questo task copia in locale il db remoto.</p>
<h2>CURL</h2>
<pre>$ sudo apt-get install php5-curl
$ sudo service apache2 restart</pre>
<h2>Nesting level</h2>
<p>Ricontrollare phpinfo() -&gt; xdebug.max_nesting_level=200<br />
eventualmente riscriverlo in</p>
<pre>$sudo gedit /etc/php5/conf.d/xdebug.ini</pre>
<p>e</p>
<pre>$ sudo service apache2 restart</pre>
]]></content:encoded>
			<wfw:commentRss>http://blog.danilosanchi.net/2012/12/05/la-mia-macchina/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
