<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss 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:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">

<channel>
	<title>Amicalement Web - Astuces et Bons plans dans le développement web</title>
	
	<link>http://www.amicalement-web.net</link>
	<description>Astuces et bons plans d'un web developpeur</description>
	<lastBuildDate>Thu, 25 Apr 2013 12:20:06 +0000</lastBuildDate>
	<language>fr-FR</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.4.1</generator>
		<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/AmicalementWeb" /><feedburner:info uri="amicalementweb" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><feedburner:emailServiceId>AmicalementWeb</feedburner:emailServiceId><feedburner:feedburnerHostname>http://feedburner.google.com</feedburner:feedburnerHostname><item>
		<title>atoum tire la couverture</title>
		<link>http://feedproxy.google.com/~r/AmicalementWeb/~3/98OpRv7h9FY/</link>
		<comments>http://www.amicalement-web.net/atoum-tire-la-couverture/2013/04/24/#comments</comments>
		<pubDate>Wed, 24 Apr 2013 12:54:42 +0000</pubDate>
		<dc:creator>Tim</dc:creator>
				<category><![CDATA[Astuces]]></category>
		<category><![CDATA[atoum]]></category>
		<category><![CDATA[code coverage]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[symfony2]]></category>
		<category><![CDATA[test unitaire]]></category>

		<guid isPermaLink="false">http://www.amicalement-web.net/?p=1940</guid>
		<description><![CDATA[Ceux qui me suivent sur twitter sont au courant : j&#8217;ai depuis peu basculé enfin sur atoum comme framework de tests unitaires. Je n&#8217;ai jamais eu d&#8217;affinité particulière avec PHPUnit et j&#8217;avais la &#171;&#160;chance&#160;&#187; d&#8217;avoir entre les mains un projets avec très peu de tests&#8230; encore. Quand il a fallu s&#8217;y mettre pour rattraper le [...]]]></description>
			<content:encoded><![CDATA[<p><a  href="http://www.amicalement-web.net/atoum-tire-la-couverture/2013/04/24/"><img src="http://www.amicalement-web.net/wp-content/uploads/Sans-titre-2.jpg" alt="" title="Sans-titre-2" width="614" height="200" class="size-full wp-image-1945" /></a></p>
<p>
Ceux qui me suivent sur twitter sont au courant : j&rsquo;ai depuis peu basculé enfin sur atoum comme framework de tests unitaires. Je n&rsquo;ai jamais eu d&rsquo;affinité particulière avec PHPUnit et j&rsquo;avais la &laquo;&nbsp;chance&nbsp;&raquo; d&rsquo;avoir entre les mains un projets avec très peu de tests&#8230; encore.
</p>
<p>
Quand il a fallu s&rsquo;y mettre pour rattraper le retard, je devais au moins tester ne serait-ce que pour voir ce que <a  href="http://twitter.com/steph_py">steph</a> lui trouvait de si magique.
</p>
<p><span id="more-1940"></span></p>
<h3>Atoum, la découverte</h3>
<p>
Quand j&rsquo;ai écrit mon premier test j&rsquo;ai eu 2 réactions. &laquo;&nbsp;Plus logique tiens.&nbsp;&raquo; et surtout &laquo;&nbsp;AH MAIS CA VA VIIIIITE&nbsp;&raquo;. Le premier retient maintenant toute mon attention, mais c&rsquo;est bien le 2e qui aura fait que je n&rsquo;ai pas passé que 10min dessus.
</p>
<p>
Me voilà lancé dans la réécritures de mes quelques tests sous PHPUnit, histoire de me faire la main. Le verdict tombe, j&rsquo;adopte !
</p>
<p>
Depuis donc quelques temps, j&rsquo;ère de nouveau sur irc histoire d&rsquo;avoir réponse à mes questions. (Même si j&rsquo;ai la chance maintenant de bosser avec <a  href="https://twitter.com/marmotz">marmotz</a> &laquo;&nbsp;Mr Documentation d&rsquo;atoum&nbsp;&raquo;). Et je dois dire que si bug il y a, correctif il y a encore plus vite.
</p>
<p>
Voici donc un préambule un peu long, mais je pense que ça valait le coup de vanter un peu un projet sympa, qui vient s&rsquo;attaquer au dinosaure PHPUnit et qui aura su me convaincre très rapidement.
</p>
<h3>Suivre l&rsquo;avancement : la couverture de code</h3>
<p>
Nous voilà donc parti fièrement dans la quête du Test Unitaire. Et la question de savoir comment on allait pouvoir juger de l&rsquo;avancement de nos tests s&rsquo;est posée.
</p>
<p>
Après avoir eu tour à tour des idées à la con, on s&rsquo;est tourné vers la &laquo;&nbsp;couverture de code&nbsp;&raquo; tout simplement.
</p>
<p>Le principe est simple et pour ceux qui sont dans la même problématique, clairement utile : Le but du jeu est tout simplement d&rsquo;avoir un listing le plus exhaustif possible de notre code métier confronté à ce qui est réellement testé et de suivre le rapprochement entre les deux.
</p>
<p>
Évidemment, atoum (tout comme PHPUnit) permet de faire ça (grâce à xdebug d&rsquo;ailleurs). Mais ce ne fut pas si simple, d&rsquo;où le billet !
</p>
<p>
Première chose, j&rsquo;ai créé un deuxième fichier de conf (.atoum.cc.php pour ma part) comme conseillé dans la doc qui me permettra de ne pas générer la couverture de code (en html) à chaque lancement d&rsquo;atoum. Ce nouveau fichier de conf contient alors:
</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
<span style="color: #000088;">$coverageField</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> atoum\report\fields\runner\coverage\html<span style="color: #009900;">&#40;</span>
    <span style="color: #0000ff;">'Couverture de code'</span><span style="color: #339933;">,</span>
    TEST_ROOT<span style="color: #339933;">.</span><span style="color: #0000ff;">'/code-coverage'</span>
<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000088;">$coverageField</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">addSrcDirectory</span><span style="color: #009900;">&#40;</span>__DIR__<span style="color: #339933;">.</span><span style="color: #0000ff;">'/src/Atipik/'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000088;">$script</span>
    <span style="color: #339933;">-&gt;</span><span style="color: #004000;">addDefaultReport</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
    <span style="color: #339933;">-&gt;</span><span style="color: #004000;">addField</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$coverageField</span><span style="color: #009900;">&#41;</span>
<span style="color: #339933;">;</span></pre></div></div>

<p>
Si on lance alors atoum avec l&rsquo;option <code>bin/atoum -c .atoum.cc.php</code> on obtient donc dans notre dossier tests, un nouveau dossier code-coverage qui contient alors un index.html avec le listing de toutes nos classes : <a  href="http://www.amicalement-web.net/wp-content/uploads/atoum-couverture.png"><img src="http://www.amicalement-web.net/wp-content/uploads/atoum-couverture-300x100.png" alt="" title="Capture d’écran 2013-04-22 à 21.24.54" width="300" height="100" class="aligncenter size-medium wp-image-1941" /></a>
</p>
<p>
Et pour chaque classe, une page plus détaillée qui indique clairement les parties du code testées et celles qui ne le sont pas.
</p>
<h3>Application à un projet Symfony2</h3>
<p>
Le problème (forcément il y en un :p) c&rsquo;est que atoum, il cherche pas à comprendre et balance toutes nos classes php dans ce code-coverage. Or, on on utilise Symfony2 et il y a donc forcément des classes qui n&rsquo;auront pas de tests unitaires dans le lot.
</p>
<p>
Le cas a été pensé car la méthode <code>addSrcDirectory</code> utilisée plus haut accepte un 2e argument : Une closure qui permet de filtrer les dossiers/fichiers ajoutés. Parfait !
</p>
<p>
On rajoute donc une petite condition rapide et le tour est joué :
</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
<span style="color: #000088;">$coverageField</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> atoum\report\fields\runner\coverage\html<span style="color: #009900;">&#40;</span>
    <span style="color: #0000ff;">'Couverture de code de CzbV2'</span><span style="color: #339933;">,</span>
    TEST_ROOT<span style="color: #339933;">.</span><span style="color: #0000ff;">'/code-coverage'</span>
<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000088;">$coverageField</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">addSrcDirectory</span><span style="color: #009900;">&#40;</span>__DIR__<span style="color: #339933;">.</span><span style="color: #0000ff;">'/src/Atipik/'</span><span style="color: #339933;">,</span> <span style="color: #000000; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$file</span><span style="color: #339933;">,</span> <span style="color: #000088;">$key</span><span style="color: #339933;">,</span> <span style="color: #000088;">$iterator</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #666666; font-style: italic;">// Pour continuer à descendre dans l'arborescence</span>
    <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$file</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">isDir</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #b1b100;">return</span> <span style="color: #009900; font-weight: bold;">true</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$file</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getExtension</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">===</span> <span style="color: #0000ff;">'php'</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #b1b100;">return</span> <span style="color: #990000;">preg_match</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;/(Extension|Bundle|CompilerPass|Configuration|Controller|Command|FeatureContext|Admin|Exception|ControllerTest)\.php/&quot;</span><span style="color: #339933;">,</span> <span style="color: #000088;">$file</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getFilename</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">&lt;</span> <span style="color: #cc66cc;">1</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #b1b100;">return</span> <span style="color: #009900; font-weight: bold;">false</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000088;">$script</span>
    <span style="color: #339933;">-&gt;</span><span style="color: #004000;">addDefaultReport</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
    <span style="color: #339933;">-&gt;</span><span style="color: #004000;">addField</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$coverageField</span><span style="color: #009900;">&#41;</span>
<span style="color: #339933;">;</span></pre></div></div>

<p>
Pas besoin de détails, on exclut :
</p>
<ul>
<li>les fichiers de conf d&rsquo;un bundle</li>
<li>les controllers</li>
<li>les contexte de Behat</li>
<li>les admin de Sonata</li>
<li>les command CLI</li>
</ul>
<p>
On a un maintenant un chiffre de couverture &laquo;&nbsp;globale&nbsp;&raquo; assez proche de la réalité. L&rsquo;objectif étant de suivre l&rsquo;avancement de ce chiffre pour se donner une idée du chemin parcouru.
</p>
<p>Attention quand même, le chiffre est à prendre avec des pincettes bien-sûr. Il vérifie juste que les tests passent dans toutes les parties de votre code, mais la &laquo;&nbsp;qualité&nbsp;&raquo; du test est bien à votre charge, évident mais bon à rappeler ;)</p>
<img src="http://feeds.feedburner.com/~r/AmicalementWeb/~4/98OpRv7h9FY" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.amicalement-web.net/atoum-tire-la-couverture/2013/04/24/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<feedburner:origLink>http://www.amicalement-web.net/atoum-tire-la-couverture/2013/04/24/</feedburner:origLink></item>
		<item>
		<title>Dopez vos anciens sites au fur et à mesure</title>
		<link>http://feedproxy.google.com/~r/AmicalementWeb/~3/h90-wTD_0x4/</link>
		<comments>http://www.amicalement-web.net/dopez-vos-anciens-sites-au-fur-et-a-mesure/2013/02/14/#comments</comments>
		<pubDate>Thu, 14 Feb 2013 13:58:41 +0000</pubDate>
		<dc:creator>Tim</dc:creator>
				<category><![CDATA[Tutorials]]></category>
		<category><![CDATA[Component]]></category>
		<category><![CDATA[migration]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Symfony]]></category>

		<guid isPermaLink="false">http://www.amicalement-web.net/?p=1926</guid>
		<description><![CDATA[Aujourd&#8217;hui, je ne vous apprends rien, le développement web s&#8217;est considérablement professionnalisé et on ne fait plus de sites web comme on les faisait il y a 10 ans. Mais pourtant il y a bien des sites web qui ont encore 10 ans et n&#8217;ont jamais été refondu. Pourquoi refondre quelque chose qui fonctionne me [...]]]></description>
			<content:encoded><![CDATA[<p><a  href="http://www.amicalement-web.net/dopez-vos-anciens-sites-au-fur-et-a-mesure/2013/02/14/" rel="attachment wp-att-1930"><img src="http://www.amicalement-web.net/wp-content/uploads/vitamin.jpg" alt="" title="vitamin" width="614" height="200" /></a></p>
<p>
Aujourd&rsquo;hui, je ne vous apprends rien, le développement web s&rsquo;est considérablement professionnalisé et on ne fait plus de sites web comme on les faisait il y a 10 ans. Mais pourtant il y a bien des sites web qui ont encore 10 ans et n&rsquo;ont jamais été refondu.
</p>
<p>
Pourquoi refondre quelque chose qui fonctionne me direz-vous ? Oui bonne question ! La principale me semble la maintenance et l&rsquo;évolution du site qui devient au fil des années, compliquée voir quasi impossible.
</p>
<p>
Mais refondre un site from scratch n&rsquo;est pas de tout repos et finalement peut-être pas la meilleur idée. Du coup, nous allons voir un cas pratique de migration en douceur d&rsquo;un site &laquo;&nbsp;old scool&nbsp;&raquo;.<br />
<span id="more-1926"></span>
</p>
<h3>Le contexte</h3>
<p>
Nous parlons d&rsquo;un site ici où chaque page web est représentée par une page php. Pas de rewrite. Chacune faisant un nombre incalculable de require, include, echo. Où beaucoup de développeurs sont passés par là, chacun sur le temps perso, pour la plupart le développement étant un loisir.<br />
Pas la peine de vous faire un dessin, vous voyez le tableau.
</p>
<h3>L&rsquo;objectif</h3>
<p>
Mettre en place une pseudo v2 progressive : <br />
Recréer chacune des pages sur un nouveau socle applicatif plus actuel puis optimiser l&rsquo;ensemble une fois toutes les pages crées. Les anciennes pages, doivent fonctionner avec les nouvelles sans changement dans les premières. En gros, tout le monde ne doit y voir que du feu.
</p>
<h3>Fonctionnement</h3>
<p>
Pour réaliser ça, je me suis pas foulé, je me suis tout simplement inspiré de ce que Fabien avait pris le temps de mettre par écrit dans sa série : <a  href="http://fabien.potencier.org/article/50/create-your-own-framework-on-top-of-the-symfony2-components-part-1">&laquo;&nbsp;Create your own Framework&nbsp;&raquo;</a>.
</p>
<p>
Du coup c&rsquo;est plus la mise en pratique que je vais détailler. Nous allons donc migrer une page qui s&rsquo;appelle : <code>rechercheJoueur.php</code>
</p>
<p>
Première étape, configurer notre nouvelle app en créant un fichier <code>v2.php</code> à la racine de notre serveur (vu que le vhost pointe ici) et contenant <a  href="http://fabien.potencier.org/article/54/create-your-own-framework-on-top-of-the-symfony2-components-part-5">le code de l&rsquo;étape 5 de fabien</a>. <br />
A partir de là, on a déjà quelque chose de sympa et quasi prêt à emploi. Faisons le test.
</p>
<p>
Dans notre <code>app.php</code> on va donc déclarer en route la première page qu&rsquo;on va migrer. Genre ça:
</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
<span style="color: #000000; font-weight: bold;">use</span> Symfony\Component\Routing<span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000088;">$routes</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> Routing\RouteCollection<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000088;">$routes</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">add</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'search'</span><span style="color: #339933;">,</span> <span style="color: #000000; font-weight: bold;">new</span> Routing\Route<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'rechercheJoueur.php'</span><span style="color: #339933;">,</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span>
    <span style="color: #0000ff;">'_controller'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'render_template'</span><span style="color: #339933;">,</span>
<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #b1b100;">return</span> <span style="color: #000088;">$routes</span><span style="color: #339933;">;</span></pre></div></div>

<p>
On va c/c le contenu de notre ancienne page dans le dossier <code>src/pages</code> définies dans la fonction <code>render_template</code> en prenant soin de la renommer par <code>search.php</code> (nom de la route).
</p>
<p>
A ce niveau bien sûr, si vous accédez à l&rsquo;ancienne url, vous tombez toujours sur l&rsquo;ancienne page.<br />
Nous allons donc créer un .htaccess à la racine avec tout simplement :
</p>
<pre>
<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteBase /

    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^(.*)$ v2.php [QSA,L]
</IfModule>
</pre>
<p>
Pas besoin de grand discours, en gros, tout les urls qui ne pointent pas sur une ressource existante, iront maintenant sur notre nouvelle application.
</p>
<p>
Renommons maintenant notre ancienne page. Et tentons d&rsquo;y accéder (par son ancien nom) et magie, on pointe désormais sur la nouvelle page qui doit se comporter exactement comme l&rsquo;ancienne vu que finalement, on a pas changé grand chose pour l&rsquo;instant.
</p>
<p>
Mais le principal avantage c&rsquo;est que toutes nos pages <strong>passent par le même endroit</strong> désormais.
</p>
<p>
Du coup la prochaine étape, est celle décrite dans <a  href="http://fabien.potencier.org/article/55/create-your-own-framework-on-top-of-the-symfony2-components-part-6">la partie 6</a>, utiliser <code>HttpKernel</code> et son <code>ControllerResolver</code> pour utiliser des controller en lieu et place de notre function <code>render_template</code>.
</p>
<p>
On pourra alors sortir tout le code php de notre page à migrer, et le mettre dans le controller en 1ere étape de séparation du code php / html.
</p>
<p>
Je me suis ensuite arrêté là niveau applicatif. J&rsquo;ai trouvé que j&rsquo;avais tous les éléments à ma disposition. Mais n&rsquo;hésitez pas à continuer la suite de la série de Fabien.
</p>
<p>
Du coup, au lieu du DIC de Symfony2 dont <a  href="http://fabien.potencier.org/article/62/create-your-own-framework-on-top-of-the-symfony2-components-part-12">Fabien parle dans l&rsquo;étape 12</a>, j&rsquo;ai personnellement opté pour <a  href="http://pimple.sensiolabs.org/">Pimple</a> vu que le site n&rsquo;est vraiment pas compliqué niveau technique et que je n&rsquo;avais pas besoin de l&rsquo;artillerie lourde de ce côté.
</p>
<p>
Du coup, j&rsquo;ai injecté dans Pimple, une connexion DBAL de doctrine et twig comme moteur de template et j&rsquo;ai décidé d&rsquo;injecter directement tout ce container dans tous mes controllers (même si on est d&rsquo;accord que c&rsquo;est le mal) mais en l&rsquo;état c&rsquo;est pas vraiment problématique j&rsquo;ai juste 2 services.
</p>
<p>
Du coup j&rsquo;ai un peu modifié la partie concernant l&rsquo;appel au controller dans mon <code>v2.php</code> pour reproduire le <code>setContainer</code> propre au <code>ContainerAwareInterface</code> mais qui attend un <code>ContainerInterface</code> du DIC. Pour utiliser Pimple dans nos containier, il faut donc reproduire ce setContainer.
</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;">try <span style="color: #009900;">&#123;</span>
    <span style="color: #000088;">$request</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">attributes</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">add</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$matcher</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">match</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$request</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getPathInfo</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #000088;">$controllers</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$resolver</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getController</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$request</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #666666; font-style: italic;">// on instancie notre controller </span>
    <span style="color: #000088;">$controller</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #000088;">$controllers</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">0</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
    <span style="color: #666666; font-style: italic;">// on récupère l'action</span>
    <span style="color: #000088;">$action</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$controllers</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">1</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
    <span style="color: #666666; font-style: italic;">// On injecte Pimple</span>
    <span style="color: #000088;">$controller</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">setContainer</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$container</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #666666; font-style: italic;">// On récupère les arguments</span>
    <span style="color: #000088;">$arguments</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$resolver</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getArguments</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$request</span><span style="color: #339933;">,</span> <span style="color: #000088;">$controllers</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #000088;">$response</span> <span style="color: #339933;">=</span> <span style="color: #990000;">call_user_func</span><span style="color: #009900;">&#40;</span><span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$controller</span><span style="color: #339933;">,</span> <span style="color: #000088;">$action</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> <span style="color: #000088;">$arguments</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span> catch <span style="color: #009900;">&#40;</span>Routing\Exception\ResourceNotFoundException <span style="color: #000088;">$e</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #000088;">$response</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> Response<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'Not Found'</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">404</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span> catch <span style="color: #009900;">&#40;</span>Exception <span style="color: #000088;">$e</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #000088;">$response</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> Response<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'An error occurred'</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">500</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>
Voilà, un peu brut, mais ca fait son job rapidement. Il suffira de créer un controller qui contiendra cette méthode <code>setContainer</code> et dont tous nos controllers hériteront. Et nous pourrons alors utiliser notre dbal et notre twig dans nos actions !
</p>
<p>
La suite n&rsquo;est que du refactoring du code existant. Faites déjà fonctionner une page, essayant de découper les traitements dans des classes adéquates. Chaque nouvelle page, apportera son lot de cas particulier, mais plus ça ira et plus ce sera simple de migrer les pages.
</p>
<h3>Et ensuite ?</h3>
<p>
Je n&rsquo;y suis pas encore, mais j&rsquo;imagine qu&rsquo;une fois qu&rsquo;on s&rsquo;est affranchi des contraintes de l&rsquo;ancien système, on peut commencer à optimiser un peu, créer une couche modèle, peut-être envisager un ORM ? Ou tout simplement se dire, que c&rsquo;est bien suffisant et que maintenant, n&rsquo;importe quel dev avec une connaissance du MVC devrait pouvoir utiliser et maintenir le code ! Et c&rsquo;était quand même l&rsquo;objectif ;)</p>
<img src="http://feeds.feedburner.com/~r/AmicalementWeb/~4/h90-wTD_0x4" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.amicalement-web.net/dopez-vos-anciens-sites-au-fur-et-a-mesure/2013/02/14/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.amicalement-web.net/dopez-vos-anciens-sites-au-fur-et-a-mesure/2013/02/14/</feedburner:origLink></item>
		<item>
		<title>Wrapper une application Zend 1 dans Symfony2</title>
		<link>http://feedproxy.google.com/~r/AmicalementWeb/~3/QeP61uQoGjk/</link>
		<comments>http://www.amicalement-web.net/wrapper-une-application-zend-1-dans-symfony2/2012/06/14/#comments</comments>
		<pubDate>Thu, 14 Jun 2012 08:25:30 +0000</pubDate>
		<dc:creator>Tim</dc:creator>
				<category><![CDATA[Astuces]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[symfony2]]></category>
		<category><![CDATA[wrapper]]></category>
		<category><![CDATA[zend]]></category>

		<guid isPermaLink="false">http://www.amicalement-web.net/?p=1912</guid>
		<description><![CDATA[Et non le blog n&#8217;est pas mort ;) Pour ceux qui auraient loupé un épisode, j&#8217;ai changé en début d&#8217;année de boulot pour retrouver le monde du PHP à 100%. Nouvelles têtes, nouveaux locaux, nouveau projet et forcément nouvelle plateforme&#8230; en Zend. Il y a 5 ans, c&#8217;était un choix qui se discutait, mais aujourd&#8217;hui [...]]]></description>
			<content:encoded><![CDATA[<p><a  href="http://www.amicalement-web.net/wrapper-une-application-zend-1-dans-symfony2/2012/06/14/" rel="attachment wp-att-1920"><img src="http://www.amicalement-web.net/wp-content/uploads/Sans-titre-11.png" alt="" title="Sans-titre-1" width="614" height="100" class="alignnone size-full wp-image-1920" /></a><br />
Et non le blog n&rsquo;est pas mort ;)</p>
<p>Pour ceux qui auraient loupé un épisode, j&rsquo;ai changé en début d&rsquo;année de boulot pour retrouver le monde du PHP à 100%. Nouvelles têtes, nouveaux locaux, nouveau projet et forcément nouvelle plateforme&#8230; en Zend.<br />
<span id="more-1912"></span></p>
<p>Il y a 5 ans, c&rsquo;était un choix qui se discutait, mais aujourd&rsquo;hui la plateforme a force d&rsquo;évolution mérite sincèrement une grosse remise à plat, dans tous les sens du terme. C&rsquo;est donc l&rsquo;occasion pour repartir sur &#8230; du Symfony2 of course : )</p>
<p>Même si on me fait confiance sur cette décision, forcément on va pas arrêter de mettre à jour la plateforme actuelle sous prétexte qu&rsquo;il faut passer sur Symfony.</p>
<p>Me voici en piste pour trouver la meilleur solution pour faire ça en douceur. L&rsquo;idée des component Symfony arrive forcément très vite dans mon esprit. Je test avec le composant &laquo;&nbsp;Command&nbsp;&raquo;, une formalité effectivement. Mais, autant, je vois bien le principe de migrer une appli PHP classique vers les components Symfony, autant, partir de Zend me semble pas si trivial.</p>
<p>Je me suis alors rappelé une présentation lors du symfony live 2011 de Marc Weistroff (aka futurecat) qui avait utiliser Symfony2 pour intégrer la <a  href="https://github.com/marcw/sflive-2011">possibilité d&rsquo;utiliser des ESI dans une app symfony</a>.</p>
<p>Me voici parti avec l&rsquo;idée d&rsquo;embarquer mon application Zend actuelle, dans une nouvelle appli Symfony2. L&rsquo;appli Symfony2 serait donc l&rsquo;application &laquo;&nbsp;master&nbsp;&raquo; qui lancerait l&rsquo;appli Zend quand elle ne saurait pas répondre à une requête. Dans un premier temps d&rsquo;ailleurs, l&rsquo;appli Zend sera lancé dans tous les cas et l&rsquo;appli Symfony2 ne prendra le relai que sur les pages ne répondant pas un code http 200.</p>
<p>Voici le principe grosso modo que j&rsquo;ai utilisé:<br />
On place un listener sur <code>kernel.request</code> avec une priorité suffisante pour prendre le dessus sur le routing Symfony.</p>

<div class="wp_syntax"><div class="code"><pre class="yaml" style="font-family:monospace;">parameters:
    atipik_zend_wrapper.class: Atipik\ZendWrapperBundle\HttpKernel\ZendListener
&nbsp;
services:
    atipik_zend_wrapper.listener.request:
        class: %atipik_zend_wrapper.class%
        arguments: [%kernel.root_dir%]
        tags:
            - { name: kernel.event_listener, event: kernel.request, method: onKernelRequest, priority: 254 }</pre></div></div>

<p>Le listener en question qui finalement ne fait qu&rsquo;instancier mon wrapper, lance la requête et retourne une <code>Response</code> si on a un code HTTP 200.</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">namespace</span> Atipik\ZendWrapperBundle\HttpKernel<span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">use</span> Symfony\Component\HttpKernel\HttpKernelInterface<span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">use</span> Symfony\Component\HttpKernel\Event\GetResponseEvent<span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">use</span> Symfony\Component\HttpFoundation\Response<span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">class</span> ZendListener
<span style="color: #009900;">&#123;</span>
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000088;">$root_dir</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> __construct<span style="color: #009900;">&#40;</span><span style="color: #000088;">$root_dir</span><span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
        <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">root_dir</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$root_dir</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> onKernelRequest<span style="color: #009900;">&#40;</span>GetResponseEvent <span style="color: #000088;">$event</span><span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>        
        <span style="color: #000088;">$applicationZend</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> ZendWrapper<span style="color: #009900;">&#40;</span><span style="color: #990000;">realpath</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">root_dir</span><span style="color: #339933;">.</span><span style="color: #0000ff;">'/../vendor/cityzen/www/application'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #000088;">$response</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$applicationZend</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">dispatch</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
        <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$response</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getHttpResponseCode</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">==</span> <span style="color: #cc66cc;">200</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
            <span style="color: #000088;">$event</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">setResponse</span><span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">new</span> Response<span style="color: #009900;">&#40;</span><span style="color: #000088;">$response</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
    <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Et le wrapper, qui reprend en fait le <code>index.php</code> de mon appli zend (pas écrit par moi, me demander à quoi ça sert :D). Au préalable j&rsquo;ai bien sur mis dans vendor le code de mon app Zend, et autoloadé le prefixe Zend:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">namespace</span> Atipik\ZendWrapperBundle\HttpKernel<span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">class</span> ZendWrapper
<span style="color: #009900;">&#123;</span>
    <span style="color: #000000; font-weight: bold;">public</span> 
        <span style="color: #000088;">$application</span><span style="color: #339933;">,</span>
        <span style="color: #000088;">$bootstrap</span><span style="color: #339933;">,</span>
        <span style="color: #000088;">$response</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> __construct<span style="color: #009900;">&#40;</span><span style="color: #000088;">$application_path</span><span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
        <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span><span style="color: #990000;">defined</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'APPLICATION_PATH'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
            <span style="color: #990000;">define</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'APPLICATION_PATH'</span><span style="color: #339933;">,</span> <span style="color: #000088;">$application_path</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
&nbsp;
        <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span><span style="color: #990000;">defined</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'APPLICATION_ENV'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
            <span style="color: #990000;">define</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'APPLICATION_ENV'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'development'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
&nbsp;
        <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span><span style="color: #990000;">defined</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'APPLICATION_PARTNER'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
            <span style="color: #990000;">define</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'APPLICATION_PARTNER'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'cityzenbox'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
&nbsp;
        <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span><span style="color: #990000;">defined</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'DISPLAY_ERRORS'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
            <span style="color: #990000;">define</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'DISPLAY_ERRORS'</span><span style="color: #339933;">,</span> <span style="color: #009900; font-weight: bold;">false</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
&nbsp;
        <span style="color: #990000;">set_include_path</span><span style="color: #009900;">&#40;</span><span style="color: #990000;">implode</span><span style="color: #009900;">&#40;</span>PATH_SEPARATOR<span style="color: #339933;">,</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span>
            <span style="color: #990000;">dirname</span><span style="color: #009900;">&#40;</span>APPLICATION_PATH<span style="color: #009900;">&#41;</span> <span style="color: #339933;">.</span> <span style="color: #0000ff;">'/library'</span><span style="color: #339933;">,</span>
            <span style="color: #990000;">get_include_path</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
        <span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
        <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">init</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> init<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
        <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">application</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> \Zend_Application<span style="color: #009900;">&#40;</span>
            APPLICATION_ENV<span style="color: #339933;">,</span>
            APPLICATION_PATH <span style="color: #339933;">.</span> <span style="color: #0000ff;">'/config/config.php'</span>
        <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
        <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">bootstrap</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">application</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">bootstrap</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getBootstrap</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">front</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">bootstrap</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getResource</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'FrontController'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #000088;">$default</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">front</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getDefaultModule</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
        <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #009900; font-weight: bold;">null</span> <span style="color: #339933;">===</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">front</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getControllerDirectory</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$default</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
            <span style="color: #b1b100;">throw</span> <span style="color: #000000; font-weight: bold;">new</span> Zend_Application_Bootstrap_Exception<span style="color: #009900;">&#40;</span>
                <span style="color: #0000ff;">'No default controller directory registered with front controller'</span>
            <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
&nbsp;
        <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">front</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">setParam</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'bootstrap'</span><span style="color: #339933;">,</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">bootstrap</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> dispatch<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
        <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">front</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">returnResponse</span><span style="color: #009900;">&#40;</span><span style="color: #009900; font-weight: bold;">true</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
        <span style="color: #b1b100;">return</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">front</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">dispatch</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Et là, on peut désormais voir notre site, avec la débug bar Symfony !<br />
<a  href="http://www.amicalement-web.net/wp-content/uploads/Capture-d’écran-2012-06-14-à-10.07.33.png"><img src="http://www.amicalement-web.net/wp-content/uploads/Capture-d’écran-2012-06-14-à-10.07.33-300x162.png" alt="" title="Capture d’écran 2012-06-14 à 10.07.33" width="300" height="162" class="alignnone size-medium wp-image-1917" /></a></p>
<p>Au final, cela un reste un Proof of Concept, et ce n&rsquo;est pas la solution retenue. Du coup, on peut envisager de pousser plus loin, en alimentant la débug bar avec les infos de Zend.</p>
<p>Mais c&rsquo;est toujours intéressant (de mon point de vue) de voir avec quelle facilité Symfony2 peut-être utilisé avec n&rsquo;importe quelle type d&rsquo;application désormais. La souplesse c&rsquo;est sans doute ça qui fait aujourd&rsquo;hui le succès de Symfony, nan ?</p>
<p>Note : Le code date de Avril et donc de Symfony 2.0.12</p>
<img src="http://feeds.feedburner.com/~r/AmicalementWeb/~4/QeP61uQoGjk" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.amicalement-web.net/wrapper-une-application-zend-1-dans-symfony2/2012/06/14/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<feedburner:origLink>http://www.amicalement-web.net/wrapper-une-application-zend-1-dans-symfony2/2012/06/14/</feedburner:origLink></item>
		<item>
		<title>La « mode » du fonctionnel : pourquoi ?</title>
		<link>http://feedproxy.google.com/~r/AmicalementWeb/~3/3Mboix5SN7o/</link>
		<comments>http://www.amicalement-web.net/la-mode-du-fonctionnel-pourquoi/2012/01/02/#comments</comments>
		<pubDate>Mon, 02 Jan 2012 14:24:37 +0000</pubDate>
		<dc:creator>Vince</dc:creator>
				<category><![CDATA[Réflexion]]></category>
		<category><![CDATA[erlang]]></category>
		<category><![CDATA[fonctionnel]]></category>
		<category><![CDATA[haskell]]></category>
		<category><![CDATA[scala]]></category>

		<guid isPermaLink="false">http://www.amicalement-web.net/?p=1867</guid>
		<description><![CDATA[Vous avez déjà dû entendre parler de langages comme Haskell, Erlang, Clojure ou encore Scala (si ce n&#8217;est pas le cas, vous devez lire l&#8217;article encore plus que les autres). Twitter a refait son moteur de recherche en Scala et Facebook utilise Erlang pour son système de chat par exemple. Tous ces langages partagent un [...]]]></description>
			<content:encoded><![CDATA[<p><a  href="http://www.amicalement-web.net/la-mode-du-fonctionnel-pourquoi/2012/01/02/#more-1867"><img src="http://www.amicalement-web.net/wp-content/uploads/y-combinator.jpg" alt="" title="y-combinator" width="614" height="100" class="aligncenter size-full wp-image-1892" /></a></p>
<p>Vous avez déjà dû entendre parler de langages comme Haskell, Erlang, Clojure ou encore Scala (si ce n&rsquo;est pas le cas, vous devez lire l&rsquo;article encore plus que les autres). Twitter a refait son moteur de recherche en Scala et Facebook utilise Erlang pour son système de chat par exemple. Tous ces langages partagent un même paradigme (certains plus que d&rsquo;autres, mais passons), et c&rsquo;est en partie ce qui fait leur succès : le paradigme de programmation fonctionnelle. Je vais essayer de vous expliquer ici en quoi c&rsquo;est plus qu&rsquo;une mode ou une lubie d&rsquo;universitaire barbu (ou non), et pourquoi donc vous devriez vous y intéresser.<br />
<span id="more-1867"></span></p>
<p><strong>Disclaimer :</strong> Je ne suis pas un expert en programmation fonctionnelle, je vous donne juste ici quelques raisons de s&rsquo;y intéresser. Si les puristes y voient quelques absurdités, n&rsquo;hésitez pas à me taper dessus.</p>
<h3>Le bannissement des variables</h3>
<p>Ça fait 10 ans que vous codez en impératif (vous avez bien fait un peu de prolog ou de OCaml à la fac mais ça ne compte pas vraiment), vous avez toujours fait des trucs dans le style <code>i++</code> ou <code>x = x + 1</code> et ça ne vous empêche pas de dormir, bien. C&rsquo;est une honte (je fais style mais ça ne m&rsquo;empêche toujours pas de dormir hein). Une des choses qui m&rsquo;a le plus surpris quand j&rsquo;ai appris le &laquo;&nbsp;pur&nbsp;&raquo; fonctionnel, c&rsquo;est qu&rsquo;on vous dit que vous ne pouvez ré-assigner une variable (qui n&rsquo;est plus vraiment variable dans le coup).</p>
<p>Vous faites <code>x = 1</code> et si vous essayez ensuite de faire <code>x = 2</code> vous aurez une erreur, diantre. Et là vous vous dites : &laquo;&nbsp;Pourrrrrrrrquuuuuuuuuoooooooooooiiiiiiiiii est-il si méchant ?&nbsp;&raquo;. &laquo;&nbsp;Et mon for, je vais le faire comment moi ?&nbsp;&raquo;. Pas de panique, ça fait toujours ça la première fois.</p>
<p>Avant de vous dire pourquoi, juste une petite apartée vocabularistique. Vous entendrez parler de cette chose sous le terme de &laquo;&nbsp;données immutables&nbsp;&raquo;.</p>
<h3>Pourquoi ?</h3>
<p>Pourquoi est-ce que cette &laquo;&nbsp;restriction&nbsp;&raquo; est en fait une des clés du succès des langages fonctionnels ? Elle va permettre de faire des programmes concurrents (vous connaissez ça sous le terme multi-thread, mais il n&rsquo;est pas adapté ici, car on n&rsquo;utilise pas de thread dans le language) facilement, et donc de faire des programmes qui passent bien à l&rsquo;échelle (scalable).</p>
<p>Si vous avez déjà essayé de faire joujou avec les threads, vous savez que l&rsquo;accès aux données est problématique. Quand plusieurs threads veulent lire la même donnée en mémoire pas de soucis. Mais c&rsquo;est quand plusieurs threads veulent modifier que ça pose problème. Qui doit avoir la priorité ? Comment fait-on quand une valeur a été modifiée par le thread 2 après que le thread 1 l&rsquo;ait lue mais avant qu&rsquo;il ait eu le temps de la ré-écrire ? Vos amis les sémaphores ne sont pas loin, et là c&rsquo;est le drame de la complexité et des &laquo;&nbsp;dead locks&nbsp;&raquo;.</p>
<p>Et si on interdisait aux programmes de modifier une variable déjà affectée ? Nous y voilà. Avec cette restriction, les langages fonctionnels facilitent énormément le travail des développeurs.</p>
<h3>Le gros mot du jour : transparence référentielle</h3>
<p>Un des autres aspects qui différencie la programmation impérative de la programmation fonctionnelle est la <a  href="http://fr.wikipedia.org/wiki/Transparence_r%C3%A9f%C3%A9rentielle">transparence référentielle</a>. En gros ça veut dire que si vous appelez 2 fois la même fonction avec les mêmes paramètres, elle doit toujours retourner la même valeur (et elle ne doit pas produire d&rsquo;effets de bord, lisez le lien wikipédia).</p>
<p>C&rsquo;est rarement le cas en programmation objet. Vous avez toujours des fonctions qui dépendent de l&rsquo;état de l&rsquo;objet. Si vous avez une fonction isEmpty() sur un objet et que vous l&rsquo;appelez à plusieurs reprises sur un objet qui peut être plein ou vide, elle retournera un résultat différent en fonction de son état, à 2 moments différents du même programme. Elle n&rsquo;est pas référentiellement transparente. Le fait de ne pas pouvoir modifier les variables aide clairement à avoir des fonctions transparentes référentiellement.</p>
<p>Pourquoi je vous parle de ça ? Imaginez vous avez des fonctions qui sont indépendantes les unes des autres, qui n&rsquo;ont pas d&rsquo;effets de bord, et qui ne partagent pas d&rsquo;endroits en mémoire. Ça serait pas top de répartir tout ce petit monde sur des cœurs différents de votre processeur avec des systèmes tous prêts ? C&rsquo;est notamment faisable par des <a  href="http://en.wikipedia.org/wiki/Actor_model">modèles d&rsquo;acteurs</a> (en anglais dans le texte, la page française est un peu vide), disponibles directement en Scala ou Erlang.</p>
<h3>Et mon for(i=0, &#8230;) alors ?</h3>
<p>Certes vous allez devoir l&rsquo;oublier (i est modifié à chaque itération). Mais vous apprendrez d&rsquo;autres manières d&rsquo;itérer sur vos collections (map et autres joyeusetés) qui vous semblerons finalement tout aussi naturelles. Ne prenez pas peur à la vue ces fonctions, elles vont vous permettre d&rsquo;exprimer ce que vous souhaitez faire, au lieu de le décrire ligne par ligne ce que l&rsquo;ordinateur doit faire en style impératif.</p>
<p>Voilà par exemple comment afficher les paroles de la chanson &laquo;&nbsp;Happy Birthday to You&nbsp;&raquo; en Scala sans boucle for.</p>

<div class="wp_syntax"><div class="code"><pre class="scala" style="font-family:monospace;"><span style="color: #F78811;">&#40;</span><span style="color: #F78811;">1</span> to <span style="color: #F78811;">4</span><span style="color: #F78811;">&#41;</span>.<span style="color: #000000;">map</span> <span style="color: #F78811;">&#123;</span> i <span style="color: #000080;">=&gt;</span> « Happy Birthday  » + <span style="color: #F78811;">&#40;</span><span style="color: #0000ff; font-weight: bold;">if</span> <span style="color: #F78811;">&#40;</span>i <span style="color: #000080;">==</span> <span style="color: #F78811;">3</span><span style="color: #F78811;">&#41;</span> « dear Vince » <span style="color: #0000ff; font-weight: bold;">else</span> « to You »<span style="color: #F78811;">&#41;</span> <span style="color: #F78811;">&#125;</span>.<span style="color: #000000;">foreach</span> <span style="color: #F78811;">&#123;</span> println <span style="color: #F78811;">&#125;</span></pre></div></div>

<h3>Conclusion</h3>
<p>Je cherchais depuis un bout de temps ce qui pourrait me redonner le goût d&rsquo;apprendre, et la programmation fonctionnelle a été un déclic pour moi. Passer de PHP à Ruby, à Python c&rsquo;est sympa, mais ça reste le même paradigme de programmation, ça ne me faisait plus rêver. Avec la programmation fonctionnelle vous trouverez au mieux un nouvel eldorado, au pire vous verrez votre façon de coder en impératif différemment. Aller hop, au boulot !</p>
<h3>Pour aller plus loin</h3>
<p>Je vous ai mis l&rsquo;eau à la bouche et vous avez vous aussi envie de découvir ce fabuleux monde. Voilà ce que je vous conseille (en anglais par contre, je vais pas pouvoir faire autrement) :</p>
<h4>Haskell</h4>
<p>C&rsquo;est LE language purement fonctionnel. Si vous voulez vous y mettre pour de vrai (et souffrir pour de vrai), allez y pour celui-là. Pas sûr que vous ferez de vrais projets avec, mais c&rsquo;est le langage vers lequel vous devriez tendre.<br />
Il existe en plus un très bon livre, consultable sur internet (que je vous conseille d&rsquo;acheter) : <a  href="http://learnyouahaskell.com/">Learn You a Haskell For Great Good</a>.</p>
<h4>Erlang</h4>
<p>Erlang est un langage fonctionel aussi, mais moins extrémiste qu&rsquo;Haskell. Son système d&rsquo;acteurs et sa philosophie &laquo;&nbsp;let it crash&nbsp;&raquo; sont très intéressants. Je ne l&rsquo;ai pas encore assez approfondi pour pouvoir en dire plus pour l&rsquo;instant.<br />
Un petit livre accessible en ligne : <a  href="http://learnyousomeerlang.com/">Learn You Some Erlang For Great Good</a></p>
<h4>Scala</h4>
<p>C&rsquo;est le moins fonctionnel de ma séléction. Et pour cause, vous pouvez utiliser des variables mutables (même si vous pouvez utiliser des immutables aussi) et de la programmation objet. C&rsquo;est une sorte de langage hybride qui vous permet de faire du fonctionnel, tout en restant dans ce que vous connaissez (la POO). Il tourne en plus sur une JVM et est compatible avec les librairies Java déjà existantes &#8230; C&rsquo;est à mon avis le plus pragmatique pour une utilisation en entreprise (compatibilité Java, possiblité de faire de l&rsquo;OOP), mais le moins efficace pour apprendre le fonctionnel pour de vrai. C&rsquo;est ce que nous utilisons dans ma boîte actuelle.<br />
Des ressources sont disponibles <a  href="http://www.scala-lang.org/node/1305">sur le site</a>, la référence restant le livre du fondateur du langage M. Odersky <a  href="http://www.amazon.fr/Programming-Scala-Martin-Odersky/dp/0981531644/">Programming in Scala, Second Edition&nbsp;&raquo;</a>.</p>
<img src="http://feeds.feedburner.com/~r/AmicalementWeb/~4/3Mboix5SN7o" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.amicalement-web.net/la-mode-du-fonctionnel-pourquoi/2012/01/02/feed/</wfw:commentRss>
		<slash:comments>15</slash:comments>
		<feedburner:origLink>http://www.amicalement-web.net/la-mode-du-fonctionnel-pourquoi/2012/01/02/</feedburner:origLink></item>
		<item>
		<title>Python tips &amp; tricks</title>
		<link>http://feedproxy.google.com/~r/AmicalementWeb/~3/jCrEspfR1Zs/</link>
		<comments>http://www.amicalement-web.net/python-tips-tricks/2011/09/27/#comments</comments>
		<pubDate>Tue, 27 Sep 2011 07:31:18 +0000</pubDate>
		<dc:creator>Benoit</dc:creator>
				<category><![CDATA[Astuces]]></category>
		<category><![CDATA[paramiko]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[serveur web]]></category>
		<category><![CDATA[sftp]]></category>
		<category><![CDATA[ternaire]]></category>

		<guid isPermaLink="false">http://www.amicalement-web.net/?p=1836</guid>
		<description><![CDATA[Depuis quelques temps, je développe pas mal en python et durant mes différents projets, j&#8217;ai rencontré tout un tas de petits problèmes ou besoins. Je me suis donc dis que cela pourrait être intéressant de regrouper en vrac dans un article quelques unes des solutions trouvées. Non seulement cela vous servira peut être un jour, [...]]]></description>
			<content:encoded><![CDATA[<p><a  href="http://www.amicalement-web.net/wp-content/uploads/python_tips_and_tricks1.png"><img src="http://www.amicalement-web.net/wp-content/uploads/python_tips_and_tricks1.png" alt="" title="python_tips_and_tricks" width="614" height="100" class="aligncenter size-full wp-image-1861" /></a></p>
<p>Depuis quelques temps, je développe pas mal en python et durant mes différents projets, <strong>j&rsquo;ai rencontré tout un tas de petits problèmes ou besoins</strong>.</p>
<p>Je me suis donc dis que cela pourrait être intéressant de <strong>regrouper en vrac dans un article quelques unes des solutions trouvées</strong>. Non seulement cela vous servira peut être un jour, mais en plus, <strong>vous aurez peut être des solutions plus simples/adaptées à me proposer</strong> ;)</p>
<p><span id="more-1836"></span></p>
<h3>Opérateur ternaire</h3>
<p>J&rsquo;utilise souvent en php l&rsquo;opérateur ternaire (x ? a : b) et je voulais trouver une équivalence en python.<br />
Ma première réaction a été de faire simplement un :</p>
<p>&nbsp;</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #008000;">bool</span><span style="color: black;">&#40;</span>x<span style="color: black;">&#41;</span> <span style="color: #ff7700;font-weight:bold;">and</span> a <span style="color: #ff7700;font-weight:bold;">or</span> b</pre></div></div>

<p><strong>Mais si &laquo;&nbsp;a&nbsp;&raquo; est un booléen à false</strong>, cela ne fonctionne pas comme le montre le petit test ci-dessous :</p>
<p><a  href="http://www.amicalement-web.net/wp-content/uploads/tips.python.01.png"><img class="aligncenter size-full wp-image-1842" title="tips.python.01" src="http://www.amicalement-web.net/wp-content/uploads/tips.python.01.png" alt="" width="211" height="264" /></a></p>
<p>J&rsquo;ai donc cherché plus en profondeur et j&rsquo;ai trouvé <strong>une solution des plus simple en utilisant une liste avec 2 valeurs</strong> :</p>

<div class="wp_syntax"><div class="code"><pre class="pyhton" style="font-family:monospace;">[a, b][bool(x)]</pre></div></div>

<p>Suivant la valeur de <strong>&laquo;&nbsp;x&nbsp;&raquo;</strong>, la valeur retournée sera <strong>la 0 ou la 1</strong>.</p>
<p>&nbsp;</p>
<h3>Récupérer son adresse IP publique</h3>
<p>En python, <strong>pas possible de faire comme en PHP en utilisant $_SERVER['REMOTE_ADDR'] pour afficher l&rsquo;IP</strong>. Il fallait donc trouver une solution, et après plusieurs minutes de recherche, la seule solution vraiment valable que j&rsquo;ai trouvé, est toute simple.</p>
<p>&nbsp;</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">from</span> <span style="color: #dc143c;">urllib2</span> <span style="color: #ff7700;font-weight:bold;">import</span> urlopen
public_ip = urlopen<span style="color: black;">&#40;</span><span style="color: #483d8b;">'http://whatismyip.org'</span><span style="color: black;">&#41;</span>.<span style="color: black;">read</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span></pre></div></div>

<p><strong>N.B:</strong> l&rsquo;idéal serait d&rsquo;utiliser un try &#8230; except pour faire propre mais bon, ca c&rsquo;est à vous de le faire</p>
<p>Si vous connaissez une autre solution, je suis preneur ;)</p>
<p>&nbsp;</p>
<h3>Un serveur web instantané</h3>
<p>Envie de partager un ou plusieurs fichiers avec quelqu&rsquo;un sans devoir le mettre sur une url publique (ex: www.mondomaine.com/fichier_pour_toi.png) ou créer un compte FTP ? Envie d&rsquo;analyser vos requêtes http ? Autre envie ?</p>
<p>Python vous permet <strong>en une ligne de commande de réaliser un serveur web</strong> :</p>
<p>&nbsp;</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;">python -c <span style="color: #483d8b;">&quot;import SimpleHTTPServer;SimpleHTTPServer.test()&quot;</span></pre></div></div>

<p>Il vous suffit ensuite de vous connecter sur <strong>l&rsquo;ip de votre serveur sur le port 8000</strong> et naviguer dans l&rsquo;arborescence du répertoire ou la commande à été lancée :</p>
<p><a  href="http://www.amicalement-web.net/wp-content/uploads/tips.python.02.png"><img class="aligncenter size-full wp-image-1848" title="tips.python.02" src="http://www.amicalement-web.net/wp-content/uploads/tips.python.02.png" alt="" width="550" height="81" /></a></p>
<p>Pour arrêter le serveur, un petit <strong>&laquo;&nbsp;CTRL+C&nbsp;&raquo; dans votre shell</strong> et c&rsquo;est fini ;)</p>
<p><strong>N.B:</strong> il est tout a fait possible en une dizaine de lignes de faire un serveur un peu plus abouti avec notamment une gestion du port.</p>
<p>&nbsp;</p>
<h3>Envoyer un fichier par sftp</h3>
<p>Envoyer un fichier (backup, sources &#8230;) d&rsquo;un serveur à un autre est possible de différente façon (FTP, webdav &#8230;) mais une des manière les plus sécurisées et sans installation supplémentaire (quand le serveur autorise les accès ssh) reste pour moi le sftp.</p>
<p>Et j&rsquo;ai trouvé &laquo;&nbsp;paramiko&nbsp;&raquo; qui existe en paquet debian, donc un simple &laquo;&nbsp;apt-get install python-paramiko&nbsp;&raquo; et hop.</p>
<p>Le code :</p>
<p>&nbsp;</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">import</span> paramiko
&nbsp;
host = <span style="color: #483d8b;">'127.0.0.1'</span>
port = <span style="color: #ff4500;">22</span>
transport = paramiko.<span style="color: black;">Transport</span><span style="color: black;">&#40;</span><span style="color: black;">&#40;</span>host, port<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
&nbsp;
<span style="color: #dc143c;">user</span> = <span style="color: #483d8b;">'mon_user'</span>
<span style="color: #ff7700;font-weight:bold;">pass</span> = <span style="color: #483d8b;">'mon_pass'</span>
transport.<span style="color: black;">connect</span><span style="color: black;">&#40;</span>username = <span style="color: #dc143c;">user</span>, password = <span style="color: #ff7700;font-weight:bold;">pass</span><span style="color: black;">&#41;</span>
&nbsp;
sftp = paramiko.<span style="color: black;">SFTPClient</span>.<span style="color: black;">from_transport</span><span style="color: black;">&#40;</span>transport<span style="color: black;">&#41;</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">sys</span>
path = <span style="color: #dc143c;">sys</span>.<span style="color: black;">argv</span><span style="color: black;">&#91;</span><span style="color: #ff4500;">2</span><span style="color: black;">&#93;</span>
localpath = <span style="color: #dc143c;">sys</span>.<span style="color: black;">argv</span><span style="color: black;">&#91;</span><span style="color: #ff4500;">1</span><span style="color: black;">&#93;</span>
sftp.<span style="color: black;">put</span><span style="color: black;">&#40;</span>localpath, path<span style="color: black;">&#41;</span>
&nbsp;
sftp.<span style="color: black;">close</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
transport.<span style="color: black;">close</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
<span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">'Upload done.'</span></pre></div></div>

<p>Ensuite il suffit de lancer le script :</p>
<p>&nbsp;</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">python send_over_sftp.py <span style="color: #000000; font-weight: bold;">/</span>chemin<span style="color: #000000; font-weight: bold;">/</span>local<span style="color: #000000; font-weight: bold;">/</span>fichier.txt <span style="color: #000000; font-weight: bold;">/</span>chemin<span style="color: #000000; font-weight: bold;">/</span>distant<span style="color: #000000; font-weight: bold;">/</span>fichier.txt</pre></div></div>

<p>Et c&rsquo;est tout :)</p>
<p><strong>N.B:</strong> A noter qu&rsquo;il est préférable de configurer ses serveurs pour fonctionner avec des clefs plutot que de mettre le password en clair dans le script python et de sécuriser les paramètres envoyés au script si vous donnez l&rsquo;utilisation à d&rsquo;autres utilisateurs.</p>
<p>&nbsp;</p>
<h3>PHP to PYTHON</h3>
<p>Pour finir, un petit lien très pratique qui vous permet de voir l&rsquo;équivalence python des fonctions php (quand elle existe) : <a  title="php2python" href="http://www.php2python.com/">http://www.php2python.com/</a></p>
<p><a  href="http://www.amicalement-web.net/wp-content/uploads/tips.python.03.png"><img class="aligncenter size-full wp-image-1852" title="tips.python.03" src="http://www.amicalement-web.net/wp-content/uploads/tips.python.03.png" alt="" width="609" height="325" /></a></p>
<img src="http://feeds.feedburner.com/~r/AmicalementWeb/~4/jCrEspfR1Zs" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.amicalement-web.net/python-tips-tricks/2011/09/27/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<feedburner:origLink>http://www.amicalement-web.net/python-tips-tricks/2011/09/27/</feedburner:origLink></item>
		<item>
		<title>de PHP / symfony à Ruby / Rails : un an après</title>
		<link>http://feedproxy.google.com/~r/AmicalementWeb/~3/2AzBlln4MGM/</link>
		<comments>http://www.amicalement-web.net/php-symfony-ruby-rails-un-an-apres/2011/06/28/#comments</comments>
		<pubDate>Tue, 28 Jun 2011 09:00:43 +0000</pubDate>
		<dc:creator>Tim</dc:creator>
				<category><![CDATA[Réflexion]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[rails]]></category>
		<category><![CDATA[ruby]]></category>
		<category><![CDATA[switch]]></category>
		<category><![CDATA[Symfony]]></category>

		<guid isPermaLink="false">http://www.amicalement-web.net/?p=1815</guid>
		<description><![CDATA[J&#8217;ai toujours très peu de temps dispo, d&#8217;où la fréquence de publication proche du néant depuis pas mal de mois. La faute à un bureau toujours trop sommaire à la maison, les travaux s&#8217;éternisant, et le peu de temps libre qui me reste est consacré à quelques projets pour l&#8217;instant un peu &#171;&#160;top secret&#160;&#187; ;) [...]]]></description>
			<content:encoded><![CDATA[<p><a  href="http://www.amicalement-web.net/?attachment_id=1819"><img src="http://www.amicalement-web.net/wp-content/uploads/switch.png" alt="" title="switch" width="614" height="100" class="alignnone size-full wp-image-1819" /></a><br />
J&rsquo;ai toujours très peu de temps dispo, d&rsquo;où la fréquence de publication proche du néant depuis pas mal de mois. La faute à un bureau toujours trop sommaire à la maison, les travaux s&rsquo;éternisant, et le peu de temps libre qui me reste est consacré à quelques projets pour l&rsquo;instant un peu &laquo;&nbsp;top secret&nbsp;&raquo; ;)</p>
<p>On pourra remercier Vince au passage qui lui trouve du temps à consacrer à ce modeste blog !</p>
<p>Mais je viens de réaliser que cela allait faire quasi un an que j&rsquo;avais attaqué Ruby / Rails de manière plutôt intensive et qu&rsquo;un petit bilan s&rsquo;imposait donc ! Alors je me lance !<br />
<span id="more-1815"></span></p>
<h3>Contexte</h3>
<p>Un petit coup de contexte, notre startup <a  href="http://autrementleblog.fr" rel="external">Autrement</a> édite 2 sites web, <a  href="http://www.chambresapart.fr">Chambres à part</a> et <a  href="http://hotelhotel.com">HotelHotel</a>. Le premier est en symfony1.4 et le 2e est en Rails3 suite à une décision prise fin 2009. Pour ceux que ça intéresse, Jérémy <a  href="http://jeremy.wordpress.com/2009/11/03/ruby-et-rails-ou-bien-php-et-symfony/">avait écrit un billet à l&rsquo;époque sur ce choix</a>.</p>
<p>A l&rsquo;époque je m&rsquo;étais retrouvé un peu seul à tenter vainement de défendre symfony mais j&rsquo;avais du me résoudre à me lancer dans le grand bain pour la conception d&rsquo;HotelHotel à laquelle il fallait bien que je participe (bah oué on est un peu que 3 côté techos :p), c&rsquo;était il y a quasi 1 an !</p>
<p>Je vous préviens, ceux qui me côtoient un peu s&rsquo;y attendent surement ;), je n&rsquo;ai pas vraiment changé d&rsquo;avis : Ruby / Rails j&rsquo;accroche pas, et de depuis quasi les premières lignes écrites. Et je vais essayer de retranscrire un peu mon ressenti et retour d&rsquo;expérience.</p>
<h3>No révolution</h3>
<p>Déjà, aucune révolution, il faut le savoir. Les différences fondamentales sont assez &laquo;&nbsp;mineures&nbsp;&raquo; dans le sens où ca n&rsquo;a pas changé grand chose dans ma manière de bosser. En fait, si vous avez fait du PHP et du symfony, vous saurez faire du Ruby et du Rails, mais vous (re)passerez par la case documentation les 6 premiers mois pour trouver les équivalents à vos connaissances PHP/symfony. </p>
<p>Et ça commence du coup mal. Apprendre un langage et un outil en essayant de tenir des &laquo;&nbsp;cadences&nbsp;&raquo; de production honorables pour son égo, c&rsquo;est pas simple. C&rsquo;est même assez compliqué et ça frustre !</p>
<p>Côté bilan, le langage il n&rsquo;y a pas grand chose à redire si ce n&rsquo;est ce côté implicite avec lequel j&rsquo;ai encore maintenant beaucoup de mal, question de goût j&rsquo;imagine. J&rsquo;ai croisé un jour un gist avec 2 &laquo;&nbsp;versions&nbsp;&raquo; d&rsquo;un même code, l&rsquo;un en version totalement implicite, l&rsquo;autre en version totalement explicite (je remets pas la main sur le lien) : pas photo pour moi, le 2e était clairement plus compréhensible sans même connaître Ruby !<br />
Mais les Rubyistes ont choisi le premier&#8230; ;)</p>
<p>Après, il est plutôt bien construit, l&rsquo;api est clairement plus aboutie que PHP, et permet de faire tout autant de chose, et plutôt vite et bien une fois qu&rsquo;on s&rsquo;est habitué à sa syntaxe. Il faut être honnête Ruby n&rsquo;a rien a envier à PHP en tant que langage pur. Mais la réciproque est pas loin d&rsquo;être vrai. PHP se traine beaucoup de boulet, mais personne nous oblige à les utiliser.</p>
<h3>Pas de switch en vue</h3>
<p>Du coup pas vraiment de changement suffisant pour me dire que cela vaut le coup de &laquo;&nbsp;switcher&nbsp;&raquo;. Au contraire même, le problème (oui c&rsquo;est un problème pour moi) de l&rsquo;implicite rend toute lecture de code un vrai cauchemar ce qui m&rsquo;a certainement ralenti et un peu découragé de me plonger à 110% dans le code comme j&rsquo;aime tant faire. Parcourir des lignes de code que j&rsquo;ai encore du mal à déchiffrer me décourage un peu. (Et oui désolé, mais moi, j&rsquo;aime voir mes fins de lignes avec des points virgules !!!)</p>
<p>Pour le framework c&rsquo;est une autre histoire. A vrai dire, je ne lui trouve pas grand chose pour lui. Attention, il vaut bien symfony 1 qui était ma référence lors de mon lancement dans Rails. Il permet de faire (quasi) tout autant de chose.<br />
Je précise quasi, parce que moi j&rsquo;ai toujours la vague impression que je suis bridé, certainement parce que je suis encore loin de maitriser les rouages que j&rsquo;avais pris le temps de décortiquer sur symfony.<br />
Et pourtant c&rsquo;est déjà sa version3 (qui va avoir un an aussi d&rsquo;ailleurs). Quand on voit le gap franchi avec symfony1 et Symfony2, la comparaison avec le second ne serait certainement pas à son avantage :p (:troll:)</p>
<p>Et c&rsquo;est sans doute là que le bas blesse, je me suis retrouvé à repartir de zéro, en me disant que ça je saurais le faire de suite sur symfony, que Rails doit le faire aussi, mais qu&rsquo;il fallait repasser par la case google. Et au final il le fait mais il ne fait guère plus. Donc peu de vrai &laquo;&nbsp;découvertes&nbsp;&raquo; et forcément, une petite déception&#8230;<br />
Je me retrouve avec 2 couteaux, pas la même forme/couleur, mais le rendu est bien le même, j&rsquo;arrive à couper mon saucisson sans problème (j&rsquo;étais à l&rsquo;apéro au moment d&rsquo;écrire ces lignes&#8230;).<br />
J&rsquo;aurais préféré me retrouver avec un nouvel outil un peu différent, genre des ciseaux.</p>
<p>Bien sûr, je peux sans doute m&rsquo;en prendre en grande partie à moi même, je n&rsquo;ai jamais remis la même énergie que pendant mes 3 années passées sur symfony. Peut-être que je passe à côté de quelque chose ! Jémémy me dirait (et me dira ;)) certainement que oui&#8230; </p>
<p>Et puis la communauté me manque ! Je suivais (suit encore en fait ;)) l&rsquo;actualité, blog, twitter qui tournent autour de symfony. Celle de Rails et même de Ruby est beaucoup plus petite en France et j&rsquo;ai finalement très vite lâché l&rsquo;affaire une fois de plus, un peu découragé.</p>
<p>Rajouter à cela, les gems, qui sont très sexy sur le papier mais qui compliquent un peu le côté, je vais mater dans le code comment c&rsquo;est foutu de ce petit plugin qui rox, bien sûr le fameux RVM qui ne m&rsquo;aime définitivement pas. On ne parlera pas de Passenger qui a lui aussi ses petits caprices de temps en temps, ou bien le fait qu&rsquo;il faille redémarrer l&rsquo;appli pour qu&rsquo;un changement dans une lib soit pris en compte (mais apparemment que sur ma machine :( )</p>
<p>Des détails me direz vous ! Oui c&rsquo;est clair, des broutilles auquel on est confronté tous les jours dans notre métier de développeur. Et le changement forcé de mes petites habitudes de bidouilleur PHP n&rsquo;a pas du arranger les choses.</p>
<p>Je ne rentre volontairement pas dans le côté technique à comparer deux outils qui font leur job. Parce que pour le coup, la différence ne se fait pas là pour moi à mon avis.</p>
<h3>Bilan</h3>
<p>Au final on peut dire que c&rsquo;est plus un mauvais feeling et le fait que je sois ravi de symfony et PHP qui font que j&rsquo;accroche pas. J&rsquo;ai passé et donné beaucoup de mon temps sur symfony et PHP et je n&rsquo;ai pas été déçu, finalement je me dis que quelque part, je les trompe un peu &#8230; ;)</p>
<p>Et puis Symfony2 est arrivé&#8230; J&rsquo;ai décortiqué les bétas, testé et retesté, lu le code. Et l&rsquo;excitation de m&rsquo;en servir grandit chaque jour ! Définitivement, une question de feeling donc. Et aussi parce que j&rsquo;ai eu l&rsquo;impression de progresser dans mon métier avec symfony1, et cette même sensation m&rsquo;envahit quand je vois Symfony2. Ruby / Rails ne m&rsquo;ont permis que de me diversifier&#8230;</p>
<p>Attention, je reste quand même ravi d&rsquo;avoir pu goûter à ce changement. Ça aura au moins eu le mérite me confronter à autre chose justement, un environnement quasi entier qui diffère ! Je rajoute aussi une corde à mon arc, sait-on jamais hein&#8230;</p>
<p>Et ça m&rsquo;aura permis aussi de me conforter, malgré toute la mauvaise presse qu&rsquo;il se traine, dans l&rsquo;idée que moi je l&rsquo;aime bien mon PHP :p</p>
<img src="http://feeds.feedburner.com/~r/AmicalementWeb/~4/2AzBlln4MGM" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.amicalement-web.net/php-symfony-ruby-rails-un-an-apres/2011/06/28/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		<feedburner:origLink>http://www.amicalement-web.net/php-symfony-ruby-rails-un-an-apres/2011/06/28/</feedburner:origLink></item>
		<item>
		<title>De PHP à Ruby : votre premier index.php en Ruby</title>
		<link>http://feedproxy.google.com/~r/AmicalementWeb/~3/Op_UwenFC9k/</link>
		<comments>http://www.amicalement-web.net/de-php-a-ruby-votre-premier-index-php-en-ruby/2011/05/23/#comments</comments>
		<pubDate>Mon, 23 May 2011 13:39:53 +0000</pubDate>
		<dc:creator>Vince</dc:creator>
				<category><![CDATA[Tutorials]]></category>
		<category><![CDATA[http]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[rack]]></category>
		<category><![CDATA[ruby]]></category>

		<guid isPermaLink="false">http://www.amicalement-web.net/?p=1795</guid>
		<description><![CDATA[Je suis un développeur PHP depuis environ 10 ans maintenant, et j&#8217;en suis plutôt content à vrai dire. J&#8217;aime écrire des web apps, et ça tombe bien, PHP a été initialement créé pour ça. Bien. Et après ? Je suis curieux. Diantre. Il m&#8217;a donc fallu aller satisfaire ma curiosité. J&#8217;ai essayé Ruby on Rails, [...]]]></description>
			<content:encoded><![CDATA[<p><a  href="http://www.amicalement-web.net/wp-content/uploads/rubys.jpg"><img src="http://www.amicalement-web.net/wp-content/uploads/rubys.jpg" alt="" title="rubys" width="600" height="100" class="alignnone size-full wp-image-1808" /></a><br />
Je suis un développeur PHP depuis environ 10 ans maintenant, et j&rsquo;en suis plutôt content à vrai dire. J&rsquo;aime écrire des web apps, et ça tombe bien, PHP a été initialement créé pour ça. Bien. Et après ? Je suis curieux. Diantre. Il m&rsquo;a donc fallu aller satisfaire ma curiosité. J&rsquo;ai essayé Ruby on Rails, mais comme je voulais aussi apprendre le Ruby, ce n&rsquo;était pour moi pas la bonne façon de commencer. J&rsquo;ai donc voulu écrire ma première web app en Ruby, comme je l&rsquo;ai fait il y a 10 ans de cela avec mon premier <em><?php echo 'hello world'; ?></em> dans un <em>index.php</em>. Nous y voici.<br />
<span id="more-1795"></span></p>
<h3>PHP : un langage web</h3>
<p>Comme je l&rsquo;ai dit, <strong>PHP est un langage web</strong>. Il propose donc de base un ensemble de choses utiles pour interagir avec un environnement HTTP (entre autres). Vous n&rsquo;avez pas pu passer à côté de nos chers amis <em>$_GET</em> et <em>$_POST</em> par exemple (sauf si vous avez appris PHP avec symfony mais bon, pas sur que ce soit le meilleur moyen). Ensuite PHP est un langage de template à lui tout seul. Vous mélangez du PHP au sein d&rsquo;un fichier HTML et vous obtenez ce que vous souhaitez, sans effort particulier. Prenons le fichier <em>index.php</em> suivant :</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;">&lt;h1&gt;Hello world&lt;/h1&gt;
&lt;p&gt;
  Hello <span style="color: #000000; font-weight: bold;">&lt;?php</span> <span style="color: #b1b100;">echo</span> <span style="color: #000088;">$_GET</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'name'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span> <span style="color: #000000; font-weight: bold;">?&gt;</span>
&lt;/p&gt;</pre></div></div>

<p>Vous utilisez ensuite Apache et mod_php pour l&rsquo;afficher (avec MAMP, WAMP, ou ce que vous voulez) en appelant <em>index.php?name=Karamazof</em> et vous êtes les rois du monde. Admettons. Attaquons les choses sérieuses.</p>
<h3>Ruby : un langage tout court</h3>
<p>C&rsquo;est là que ça se gâte. Tout d&rsquo;abord je tiens à dire que je n&rsquo;ai pas beaucoup d&rsquo;expérience en Ruby, il y a de ça un mois je n&rsquo;en avais encore jamais fait, soyez indulgents ;-). Mais j&rsquo;ai tout de suite été confronté à l&rsquo;évidence : <strong>Ruby (comme Python d&rsquo;ailleurs) n&rsquo;est pas un langage web</strong>. Pas qu&rsquo;on ne peut pas faire de web avec (ça se saurait), mais il n&rsquo;a pas été initialement prévu pour cela. Qu&rsquo;est-ce que cela implique ? Vous n&rsquo;avez pas de raccourcis/fonctions pour accéder à l&rsquo;environnement HTTP comme vous pouvez avoir avec PHP et ses <em>$_GET</em> et <em>$_POST</em>.</p>
<p>Il faut donc en Ruby utiliser une <strong>couche standardisée</strong> (ou presque) entre votre code et le serveur web, couche qui vous donnera la possibilité d&rsquo;accéder aux éléments d&rsquo;une requête HTTP et de renvoyer une réponse à afficher. En Ruby le &laquo;&nbsp;standard de facto&nbsp;&raquo; est maintenant Rack (rien à voir avec Rake). Rack est une couche d&rsquo;abstraction entre le serveur web (peu importe lequel) et votre code. Vous devrez bien sûr adapter votre code pour qu&rsquo;il soit compatible Rack et puisse être exécuté sur n&rsquo;importe quel serveur web qui propose une interface Rack (à peu prêt tous maintenant). C&rsquo;est ce que je vous montre ci-dessous.</p>
<p>À noter que le problème est le même pour Pyhon et que Rack a d&rsquo;ailleurs été inspiré de la solution trouvée pour Python qui s&rsquo;appelle WSGI.</p>
<h3>Une application Rack</h3>
<p>Une application Rack qu&rsquo;est-ce que c&rsquo;est ? C&rsquo;est une application qui a comme point d&rsquo;entrée une méthode <em>call</em> qui prend un tableau en paramètre (souvent nommé <em>env</em>) et qui renvoie un tableau contenant le statut HTTP, les headers HTTP, et le contenu. Vous pouvez aller consulter le <a  href="http://chneukirchen.org/blog/archive/2007/02/introducing-rack.html">post de blog</a> d&rsquo;origine ou <a  href="http://en.wikipedia.org/wiki/Rack_%28Web_server_interface%29">l&rsquo;article Wikipedia</a>.</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#9966CC; font-weight:bold;">class</span> HelloWorld
  <span style="color:#9966CC; font-weight:bold;">def</span> call<span style="color:#006600; font-weight:bold;">&#40;</span>env<span style="color:#006600; font-weight:bold;">&#41;</span>
    <span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#006666;">200</span>, <span style="color:#006600; font-weight:bold;">&#123;</span><span style="color:#996600;">&quot;Content-Type&quot;</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#996600;">&quot;text/plain&quot;</span><span style="color:#006600; font-weight:bold;">&#125;</span>, <span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#996600;">&quot;Hello world!&quot;</span><span style="color:#006600; font-weight:bold;">&#93;</span><span style="color:#006600; font-weight:bold;">&#93;</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
<span style="color:#9966CC; font-weight:bold;">end</span></pre></div></div>

<p>Heureusement vous pouvez inclure des modules rack pour vous faciliter la vie, et notamment pour construire un object Request à partir de cet environnement et un objet Response pour faciliter la création de la réponse à envoyer au navigateur. À noter que vous pouvez très bien utiliser <em>env</em> et retourner un tableau de contenu vous même comme l&rsquo;exemple ci dessus, mais c&rsquo;est je trouve pas le plus pratique. Voici un exemple de code ci-dessous :</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#008000; font-style:italic;">#hello_world.rb</span>
&nbsp;
<span style="color:#CC0066; font-weight:bold;">require</span> <span style="color:#996600;">'rack/request'</span>
<span style="color:#CC0066; font-weight:bold;">require</span> <span style="color:#996600;">'rack/response'</span>
&nbsp;
<span style="color:#9966CC; font-weight:bold;">class</span> HelloWorld
  <span style="color:#9966CC; font-weight:bold;">def</span> call<span style="color:#006600; font-weight:bold;">&#40;</span>env<span style="color:#006600; font-weight:bold;">&#41;</span>
      request = <span style="color:#6666ff; font-weight:bold;">Rack::Request</span>.<span style="color:#9900CC;">new</span><span style="color:#006600; font-weight:bold;">&#40;</span>env<span style="color:#006600; font-weight:bold;">&#41;</span>
&nbsp;
      response = <span style="color:#6666ff; font-weight:bold;">Rack::Response</span>.<span style="color:#9900CC;">new</span>
&nbsp;
      response.<span style="color:#9900CC;">write</span> <span style="color:#996600;">&quot;&lt;h1&gt;Hello world&lt;/h1&gt;&quot;</span>
      response.<span style="color:#9900CC;">write</span> <span style="color:#996600;">&quot;&lt;p&gt;&quot;</span>
      response.<span style="color:#9900CC;">write</span> <span style="color:#996600;">&quot;  Hello &quot;</span> <span style="color:#006600; font-weight:bold;">+</span> request.<span style="color:#9900CC;">GET</span><span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#996600;">'name'</span><span style="color:#006600; font-weight:bold;">&#93;</span>
      response.<span style="color:#9900CC;">write</span> <span style="color:#996600;">&quot;&lt;/p&gt;&quot;</span>
      response.<span style="color:#9900CC;">finish</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
<span style="color:#9966CC; font-weight:bold;">end</span></pre></div></div>

<p>Pour tester votre application vous avez plusieurs choix (dont Apache si vous le souhaitez) mais je vous conseille pour commencer d&rsquo;utiliser rackup qui vous permettra d&rsquo;avoir un serveur de test assez facilement. Pour ce faire créez un fichier <em>config.ru</em> avec le contenu suivant dedans :</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#008000; font-style:italic;">#config.ru</span>
&nbsp;
<span style="color:#CC0066; font-weight:bold;">require</span> <span style="color:#996600;">'hello_world'</span>
&nbsp;
run HelloWorld.<span style="color:#9900CC;">new</span></pre></div></div>

<p>Rien de bien compliqué ici, on inclut le fichier <em>hello_word.rb</em> précédemment créé et on dit à rackup de lancer notre application. </p>
<p>Installez ensuite les gem nécessaires :</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">sudo</span> gem <span style="color: #c20cb9; font-weight: bold;">install</span> webrick rackup</pre></div></div>

<p>Puis pour lancez le serveur web (webrick par défaut) avec rackup, placez vous dans le répertoire contenant vos fichiers puis exécutez la commande suivante :</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">rackup -I.</pre></div></div>

<p>Vous devriez pouvoir vous rendre sur http://127.0.0.1:9292/?name=Vincent et voir votre première page web en Ruby !</p>
<p>Petite précision, si vous souhaitez modifier votre code et voir les modifications sans relancer le serveur web, utilisez shotgun à la place de rackup (à n&rsquo;utiliser qu&rsquo;en développement) :</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">sudo</span> gem <span style="color: #c20cb9; font-weight: bold;">install</span> shotgun
shotgun -I.</pre></div></div>

<h3>Conclusion</h3>
<p>Ruby est un langage fort sympathique avec beaucoup de possibilités que PHP ne permet même pas d&rsquo;entrevoir. En revanche en ce qui concerne le web on comprend un peu mieux pourquoi PHP est beaucoup plus populaire que Ruby pour faire du web : PHP a été prévu pour, pas Ruby. Mais je ne saurais vous conseiller d&rsquo;essayer le Ruby, on y prend vite goût.</p>
<p><small>Crédit photo : http://www.flickr.com/photos/pswansen/41832591/</small></p>
<img src="http://feeds.feedburner.com/~r/AmicalementWeb/~4/Op_UwenFC9k" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.amicalement-web.net/de-php-a-ruby-votre-premier-index-php-en-ruby/2011/05/23/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.amicalement-web.net/de-php-a-ruby-votre-premier-index-php-en-ruby/2011/05/23/</feedburner:origLink></item>
		<item>
		<title>AW soutien Akibag !</title>
		<link>http://feedproxy.google.com/~r/AmicalementWeb/~3/PH-nPUhtjUw/</link>
		<comments>http://www.amicalement-web.net/aw-soutien-akibag/2011/04/04/#comments</comments>
		<pubDate>Mon, 04 Apr 2011 15:13:07 +0000</pubDate>
		<dc:creator>Benoit</dc:creator>
				<category><![CDATA[Actualité]]></category>
		<category><![CDATA[akibag]]></category>
		<category><![CDATA[soutien]]></category>

		<guid isPermaLink="false">http://www.amicalement-web.net/?p=1786</guid>
		<description><![CDATA[Avant de lire ce petit article, pour ceux qui ne connaissent pas @akibag, je vous propose de faire un petit tour sur le site mais aussi le blog et particulièrement ici et là ! Suite à un problème lors de l&#8217;impression des séries limitées Bugdroid, Akibag connait quelques difficultés et fait appel à la communauté [...]]]></description>
			<content:encoded><![CDATA[<p><a  href="http://www.amicalement-web.net/aw-soutien-akibag/2011/04/04"><img src="http://www.amicalement-web.net/wp-content/uploads/Sans-titre-1.png" alt="" title="Sans-titre-1" width="600" height="100" class="alignnone size-full wp-image-1789" /></a> Avant de lire ce petit article, pour ceux qui ne connaissent pas <a  href="http://www.twitter.com/akibag" targ="_blank">@akibag</a>, je vous propose de faire un petit tour sur <a  href="http://akibag.com/" target="_blank">le site</a> mais aussi <a  href="http://akibag.com/blog/" target="_blank">le blog</a> et particulièrement <a  href="http://akibag.com/blog/on-continue-alors/" target="_blank">ici</a> et <a  href="http://akibag.com/soutenez-akibag/" target="_blank">là</a> !</p>
<p>Suite à un problème lors de l&rsquo;impression des séries limitées Bugdroid, Akibag connait quelques difficultés et fait appel à la communauté pour redresser la barre.</p>
<p>Chez AW, puisque nous sommes clients et qu&rsquo;on aime, nous allons essayer de contribuer un peu avec ce petit message ! Alors si comme nous vous aimez les produits de qualité, made in france et fait par un petit entrepreneur, faites un petit (ou même un gros) geste !</p>
<img src="http://feeds.feedburner.com/~r/AmicalementWeb/~4/PH-nPUhtjUw" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.amicalement-web.net/aw-soutien-akibag/2011/04/04/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.amicalement-web.net/aw-soutien-akibag/2011/04/04/</feedburner:origLink></item>
		<item>
		<title>Générer la documentation Symfony2</title>
		<link>http://feedproxy.google.com/~r/AmicalementWeb/~3/ecFjHE1DlkQ/</link>
		<comments>http://www.amicalement-web.net/generer-la-documentation-symfony2/2011/03/21/#comments</comments>
		<pubDate>Mon, 21 Mar 2011 09:00:22 +0000</pubDate>
		<dc:creator>Vince</dc:creator>
				<category><![CDATA[Astuces]]></category>
		<category><![CDATA[documentation]]></category>
		<category><![CDATA[symfony2]]></category>

		<guid isPermaLink="false">http://www.amicalement-web.net/?p=1752</guid>
		<description><![CDATA[Symfony2 bouge encore relativement beaucoup, et c&#8217;est donc aussi le cas de sa documentation. Si comme moi vous aimez toujours utiliser la dernière version de Symfony encore en développement, et que vous aimeriez disposer de la documentation en local et toujours à jour, voici comment procéder. Récupérer la documentation sur git La documentation officielle de [...]]]></description>
			<content:encoded><![CDATA[<p><a  href="http://www.amicalement-web.net/generer-la-documentation-symfony2/2011/03/21/"><img src="http://www.amicalement-web.net/wp-content/uploads/symfony-book.png" alt="" title="symfony-book" width="614" height="100" class="alignnone size-full wp-image-1772" /></a><br />
Symfony2 bouge encore relativement beaucoup, et c&rsquo;est donc aussi le cas de sa documentation. Si comme moi vous aimez toujours utiliser la dernière version de Symfony encore en développement, et que vous aimeriez disposer de la documentation en local et toujours à jour, voici comment procéder.<br />
<span id="more-1752"></span></p>
<h3>Récupérer la documentation sur git</h3>
<p>La documentation officielle de Symfony2 est bien sur hébergée sur Git. Rendez-vous sur le <a  href="https://github.com/symfony/symfony-docs">dépôt Git officiel</a> et clonez la documentation en local.</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">git</span> clone <span style="color: #c20cb9; font-weight: bold;">git</span>:<span style="color: #000000; font-weight: bold;">//</span>github.com<span style="color: #000000; font-weight: bold;">/</span>symfony<span style="color: #000000; font-weight: bold;">/</span>symfony-docs.git</pre></div></div>

<h3>Installer Sphinx</h3>
<p>Tout d&rsquo;abord la documentation Symfony2 est générée grâce à <a  href="http://sphinx.pocoo.org/">Sphinx</a>, un projet écrit en Python. Il serait donc de bon aloi de l&rsquo;installer ;-)</p>
<p>Si comme tout gens bien vous utilisez ArchLinux, il vous suffit d&rsquo;un petit</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">sudo</span> pacman <span style="color: #660033;">-S</span> python-sphinx</pre></div></div>

<p>Pour les autres utilisez easy_install directement :</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">easy_install <span style="color: #660033;">-U</span> Sphinx</pre></div></div>

<p>SI vous n&rsquo;avez pas easy_install (hey les gens, faut vraiment vous mettre au Python !), c&rsquo;est <a  href="http://pypi.python.org/pypi/setuptools">par ici</a>.</p>
<h3>Créez un Makefile</h3>
<p>Pour l&rsquo;instant, le repo Git officiel ne fournit pas de Makefile pour générer la documentation. Il va donc falloir en créer un. Pour ce faire utilisez la commande suivante dans votre répertoire <code>symfony-docs</code> :</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">sphinx-quickstart</pre></div></div>

<p>Cette commande va vous poser tout plein de questions, acceptez toujours les choix par défaut (appuyez sur entrée pour ce faire). Vous aurez juste trois choses à saisir, le nom du projet (mettez Symfony2), le nom de l&rsquo;auteur (Fabien Potencier serait fair play ;-) ) et la version (est-ce un piège ?).<br />
Lorsque cette question va arriver <code>> Name of your master document (without suffix)</code> mettez n&rsquo;importe quoi d&rsquo;autre que index, on s&rsquo;en fiche un peu, mais si vous mettez index il va pas être content le mÔssieur.</p>
<h3>Installez l&rsquo;extension configuration</h3>
<p>Fabien a du créer une extension pour gérer plusieurs formats (YAML/XML/PHP dans notre cas) pour les fichiers de configuration. Pour l&rsquo;installer, créez un répertoire _exts dans votre répertoire symfony-docs et placez-y le fichier se trouvant sur le <a  href="https://github.com/fabpot/sphinx-php/blob/master/configurationblock.py">repo Git sphinx-php de Fabien</a>.</p>
<p>Éditez le fichier <code>conf.py</code> qui se trouve dans symfony-docs, et ajoutez-y cette ligne en haut après la ligne d&rsquo;<code>import</code> :</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #dc143c;">sys</span>.<span style="color: black;">path</span>.<span style="color: black;">append</span><span style="color: black;">&#40;</span><span style="color: #dc143c;">os</span>.<span style="color: black;">path</span>.<span style="color: black;">abspath</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'_exts'</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span></pre></div></div>

<p>Trouvez ensuite la ligne des extensions et rajoutez-y celle que l&rsquo;on a téléchargée plus haut :</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;">extensions = <span style="color: black;">&#91;</span><span style="color: #483d8b;">'configurationblock'</span><span style="color: black;">&#93;</span></pre></div></div>

<p>Vous être prêt à générer votre première documentation Symfony2.</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">make</span> html</pre></div></div>

<p>Et voilà ! Le fichier index.html généré se trouve dans _build/html/index.html</p>
<p>Amusez-vous bien, et n&rsquo;hésitez pas à contribuer dès que vous le pouvez.</p>
<img src="http://feeds.feedburner.com/~r/AmicalementWeb/~4/ecFjHE1DlkQ" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.amicalement-web.net/generer-la-documentation-symfony2/2011/03/21/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		<feedburner:origLink>http://www.amicalement-web.net/generer-la-documentation-symfony2/2011/03/21/</feedburner:origLink></item>
		<item>
		<title>Symfony Live 2011 : Compte rendu des 2 jours</title>
		<link>http://feedproxy.google.com/~r/AmicalementWeb/~3/T4eZFtDKTkY/</link>
		<comments>http://www.amicalement-web.net/symfony-live-2011-compte-rendu-des-2-jours/2011/03/09/#comments</comments>
		<pubDate>Wed, 09 Mar 2011 10:00:49 +0000</pubDate>
		<dc:creator>Tim</dc:creator>
				<category><![CDATA[Actualité]]></category>
		<category><![CDATA[doctrine]]></category>
		<category><![CDATA[js]]></category>
		<category><![CDATA[Symfony]]></category>
		<category><![CDATA[symfony2]]></category>
		<category><![CDATA[twig]]></category>

		<guid isPermaLink="false">http://www.amicalement-web.net/?p=1725</guid>
		<description><![CDATA[Nous voilà donc rentrés du 3e Symfony Live, toujours à la Cité Universitaire de Paris, et cette année les 2 jours sous le soleil! Bon le froid était quand même là hein, ça reste Paris :D Voici donc un petit compte rendu des 2 jours pour ceux qui n&#8217;étaient pas présents. A noter que cette [...]]]></description>
			<content:encoded><![CDATA[<p><a  href="http://www.amicalement-web.net/symfony-live-2011-compte-rendu-des-2-jours/2011/03/09/"><img src="http://www.amicalement-web.net/wp-content/uploads/sflive20111.jpg" alt="" title="sflive2011" width="614" height="100" class="alignnone size-full wp-image-1739" /></a><br />
Nous voilà donc rentrés du 3e Symfony Live, toujours à la Cité Universitaire de Paris, et cette année les 2 jours sous le soleil! Bon le froid était quand même là hein, ça reste Paris :D Voici donc un petit compte rendu des 2 jours pour ceux qui n&rsquo;étaient pas présents. A noter que cette année, on avait le droit à 2 salles, donc 2 interventions en même temps, il a fallut faire des choix!<br />
<span id="more-1725"></span></p>
<p>La conf tombait bien vu que la première Release Candidate de Symfony2 approche à très grand pas, c&rsquo;était l&rsquo;occasion d&rsquo;aborder abondamment ce nouveau framework pour ceux qui n&rsquo;avaient pas eu encore l&rsquo;occasion (ou le courage ^^) de se jeter dedans. Les différentes interventions étaient donc principalement orientées autour de 2 axes, Symfony2 en tant que tel, et le passage de symfony 1 à Symfony2 forcément.</p>
<h3>Première journée</h3>
<h4>The lost art of Simplicity</h4>
<p>Josh Holmes, un employé de Microsoft, est venu nous parler de la simplicité dans le développement. C&rsquo;est un bon orateur, la conf n&rsquo;était pas technique du tout, &laquo;&nbsp;juste&nbsp;&raquo; de l&rsquo;ouverture d&rsquo;esprit. Même si je n&rsquo;ai globalement pas appris grand chose de nouveau, cette conf Microsoft était bien mieux que celle de l&rsquo;an dernier, et pas cruciale pour ceux qui sont arrivés en retard (suivez mon regard :D). Un bon début donc.<br />
<a  href="http://www.slideshare.net/joshholmes/the-lost-art-of-simplicity" rel="extern">Voir les slides</a></p>
<h4>Application Security</h4>
<p>Un gros morceau du code Symfony2 et une partie toujours très critique d&rsquo;un framework. C&rsquo;est Johannes Schmitt qui a reprit le flambeau après la première version du composant par Fabien. On a vu voir un très gros refactoring depuis les premières versions, ca a l&rsquo;air bien fichu mais mon dieu que c&rsquo;est devenu énorme comme brique!</p>
<p>Malheureusement on ne peut pas vraiment dire que Johannes est un grand showman comme on a pu en croiser, et il s&rsquo;est &laquo;&nbsp;contenté&nbsp;&raquo; consciencieusement de faire une revue des différents mécanismes du composant. Un peu de regrets donc, sur ce gros morceau, peu d&rsquo;exclu pour ceux qui ont déjà parcouru la doc et le code source.</p>
<h4>State of the CMF Project</h4>
<p>Lukas, le &laquo;&nbsp;lead&nbsp;&raquo; du projet est venu nous présenter quels étaient les buts du projet, quelles entreprises étaient impliqués et ce qui avait déjà été fait. L&rsquo;idée est bonne : axer le développement sur la résolution des problèmes des développeurs (d&rsquo;où le CMF : Content Management Framework) et réaliser ensuite un CMS complet avec les briques du CMF. Un petit hic : le moteur de stockage des données est basé sur une spec et un soft Java (Jackrabbit), et un backend PHP ne verra probablement pas le jour. Voir <a  href="http://www.devorigin.fr/articles/to-jcr-or-not-choosing-the-right-persistence-solution-for-the-symfony-cmf">mon post</a> sur ce sujet.</p>
<p>Il y aura à mon avis une place pour une alternative plus &laquo;&nbsp;conventionnelle&nbsp;&raquo;, ie. que les gens normaux et les petites entreprises pourront utiliser.<br />
Vous trouverez <a  href="https://github.com/symfony-cmf/symfony-cmf/blob/master/docs/slides.html">les slides sur GitHub</a>.</p>
<h4>Apostrophe: a Symfony Powered CMS</h4>
<p>Aucun de nous n&rsquo;était présent, je vous laisse jeter un œil <a  href="http://www.slideshare.net/tompunk/apostrophe-improved-paris-edition" rel="extern">aux slides</a> du coup.</p>
<h4>RESTful avec symfony et Symfony</h4>
<p>Xavier Lacot et Damien Alexandre de chez Cleverage ont débarqué avec leur Poney pour nous présenter l&rsquo;implémentation à faire dans les 2 versions de symfony pour faire du vrai bon REST. Présentation complète vu qu&rsquo;ils sont allés jusqu&rsquo;à faire quelques benchmarks et nous ont gratinés de quelques slides bien fun ;)<br />
Toute leur présentation sur : <a  href="http://symfpony-project.org/" rel="etern">http://symfpony-project.org/</a></p>
<h4>Contributing with GIT</h4>
<p>GIT était encore là, et c&rsquo;était encore Scott Chacon qui s&rsquo;est collé à la lourde tâche de le présenter. Et encore une fois, ce fut avec classe! Scott est vraiment un très bon conférencier (ca se dit? :x) et il est, cette fois, allé plus loin que la simple présentation du SCM, la présentation a également englobé les modes de contributions à GIT. Très complet là dessus et introduisant également le workflow de contribution de github!</p>
<h4>Speedy App</h4>
<p>Encore un choix à faire, on y était pas. <a  href="http://www.slideshare.net/caillou/speedy-app-frontend-performance-considerations">Les slides</a></p>
<h4>Embed sf1 in SF2</h4>
<p>Explication d&rsquo;un cas réel, l&rsquo;express.fr. Présentation du pourquoi ce choix technique. Le code source reste le plus parlant pour voir l’intérêt. Au final peu de lignes de code à rajouter dans l&rsquo;appli sf1 pour transformer les réponses en object Response pour sf2 et ainsi bénéficier de la couche Cache de Symfony2.</p>
<p>Un moindre mal pour les applis encore en symfony mais qui voudrait tirer parti de quelques avantages de Sf2.<br />
<a  href="http://www.slideshare.net/futurecat/nice-performance-using-sf2-cache-wrapping-sf1-application-paris">Voir les slides</a></p>
<h4>Symfony2 : 30 astuces</h4>
<p>Noël s&rsquo;est attaqué à passer en revue, les bonnes pratiques et astuces à garder en mémoire pour les futurs dev Symfony2.<br />
<a  href="http://www.slideshare.net/noelguilbert/symfony2-30-astuces-et-bonnes-pratiques">Voir les slides</a></p>
<h4>phpBB4</h4>
<p>Sympathique présentation par le lead développeur de phpbb, il y a 10ans déjà. Rétrospective de l&rsquo;évolution du système de plugins pour aboutir finalement au choix de baser la prochaine version sur Symfony2:<br />
<a  href="http://prezi.com/3qkzfgmhrajd/symfony-live-2011-paris-phpbb4-building-end-user-applications-with-symfony2/">Voir les slides</a></p>
<h4>Forms in sf2</h4>
<p>Bernhard qui est à l&rsquo;origine du composent Form, a pris un peu tout le monde a contre pied en présentant la dernière mouture du composant, qui n&rsquo;est pas encore mergé dans le master. L&rsquo;optique ici est de passer les configurations de formulaire via le DIC pour pouvoir tester les contrôleurs sans les forms.<br />
Autre avantage, la partie render est maintenant séparée également. Pour avoir plus de détails sur le pourquoi du comment, hésitez pas à jeter un oeil sur la discussion qu&rsquo;il a lancé sur <a  href="http://groups.google.com/group/symfony-devs/browse_thread/thread/58789255fae7a3be/ea756826ba286f6c?hl=fr#ea756826ba286f6c" rel="extern">la mailing list</a>.</p>
<p>Bon il assure que tout le process d&rsquo;embed form est plus au point que dans symfony 1, comme beaucoup, tellement traumatisé, je vais attendre de le voir pour le croire :D</p>
<p><a  href="http://www.slideshare.net/bschussek/leveraging-symfony2-forms">Voir les slides</a></p>
<h4>Keynote</h4>
<p>Voilà Fabien sur la scène, sans slides prêt à présenter en live Symfony2. Quelques modifications de son installation un peu tardives ont provoquées 15min de debug en live! Quelques sueurs froides, on a même cru qu&rsquo;il allait renoncer! Mais finalement, c&rsquo;était tout simplement un vhost mal configuré :)<br />
Sur le contenu, il a voulu montrer que Symfony2 était vraiment simple à appréhender et que le système d&rsquo;annotation présent via le FrameworkExtraBundle était vraiment &laquo;&nbsp;cool&nbsp;&raquo;. Donc rien de nouveau en soit, pour tout ceux qui ont déjà eu l&rsquo;occasion de manipuler la bête.</p>
<p>Perso, j&rsquo;avoue avoir quelques réticences avec tout ces systèmes d&rsquo;annotations, très à la mode en ce moment. Peut-être parce que c&rsquo;est pas natif, ou peut-être parce que j&rsquo;aime bien avoir les choses à leur place, et pas tout au même endroit. Différente vision certainement!</p>
<h3>Deuxième jour</h3>
<h4>Adopt devops philosophy</h4>
<p>Les croissants ont été les plus forts, on y était donc pas:<br />
<a  href="http://www.slideshare.net/fabrice.bernhard/adopt-devops-philosophy-on-your-symfony-projects">Voir les slides</a></p>
<h4>Symfony2 from the trenches</h4>
<p>Du coup celle là non plus:<br />
<a  href="https://docs.google.com/present/view?id=dfzg6stg_8fp9jksfw">Voir les slides</a></p>
<h4>Assetic</h4>
<p>L&rsquo;occasion de découvrir le dernière né des bundles intégré de base dans Symfony2. J&rsquo;ai suivi de loin la conf pour commencer à mettre au propre ce billet. Mais les slides parlent d&rsquo;elles mêmes! Assetic, c&rsquo;est vraiment orienté pour faciliter la vie des developpeurs.<br />
<a  href="http://www.slideshare.net/kriswallsmith/assetic-symfony-live-paris">Voir les slides</a></p>
<h4>Application Gruyere</h4>
<p>Une nouvelle conf qu&rsquo;on a pas pu suivre.</p>
<h4>HTTP Cache</h4>
<p>Fabien revient pour nous parler certainement d&rsquo;une des features vraiment &laquo;&nbsp;militante&nbsp;&raquo; (entendre par là, que peu de framework l’utilisent actuellement). Pour lui, le meilleur système de cache est donc de passer par la spécification HTTP qui définit tout un tas de convention pour faire du cache.</p>
<p>Il a donc passé en revue les différents mécanismes de cache via HTTP mais trop de choses à dire donc pas assez de temps pour rentrer dans le code plus en profondeur. Ça promet en tout cas pas mal de prise de tête car du coup la méthode de cache à utiliser revient au développeur! Et même si je reste convaincu déjà depuis pas mal de temps que le cache HTTP c&rsquo;est bien, être au pied du mur, ça fait un peu peur :p</p>
<h4>Solr</h4>
<p>J&rsquo;aurais bien aimé voir la conf, mais finalement faut faire des choix encore et toujours! Une présentation que vous pouvez <a  href="http://www.slideshare.net/th0masr/integrating-the-solr-search-engine" rel="extern">retrouver ici</a></p>
<h4>Varnish</h4>
<p>Un bon tour du propriétaire, fait par un orateur très fun, très blagueur qui m&rsquo;a donné envie d&rsquo;aller plus loin! En tout cas Varnish ca a l&rsquo;air cool, mais surtout si on en a l&rsquo;utilité en fait&#8230;</p>
<h4>Quid de mes applications sf1</h4>
<p>Marc Hugon a du se contenter de la petite salle pour parler pourtant d&rsquo;un sujet qui intéressait à mon avis beaucoup de monde. La migrations des applis sf1 vers Sf2. J&rsquo;ai pas pu rentrer donc faut matter <a  href="http://www.slideshare.net/marchugon/quid-de-vos-applications-symfony-1">les slides</a>.</p>
<h4>Twig</h4>
<p><a  href="http://www.slideshare.net/weaverryan/being-dangerous-with-twig-symfony-live-paris">Voir les slides</a></p>
<h4>Symfony2 en pièces détachés</h4>
<p>Une grande revue des différents composants présent dans le core de Symfony2 et qui sont utilisables de façon indépendante. Rien de neuf en soit, mais un bon rappel qu&rsquo;avant de faire son propre composant, ça vaut le coup de jeter un œil à ces composants là!<br />
<a  href="http://www.slideshare.net/hhamon/symfony2-en-pices-dtaches">Voir les slides</a></p>
<h4>Doctrine</h4>
<p><a  href="http://www.slideshare.net/mobile/jwage/doctrine-intherealworldsf-live2011sanfran#1">Voir les slides</a></p>
<h4>Javascript, Event and Scopes</h4>
<p>Une présentation très sympa qui met en lumière les bonnes pratiques à utiliser pour développer à base d&rsquo;event. Comme l&rsquo;utilisation du preventDefault() ou encore la différence entre le bubbling et la capture. Suivi ensuite d&rsquo;un gros rappel sur la portée des variables et les pièges à éviter dans leur nommage. </p>
<p>Sachant que pour de développeurs web, le javascript a toujours été de la &laquo;&nbsp;bidouille&nbsp;&raquo; c&rsquo;est toujours bon d&rsquo;avoir des rappels de bonne pratique, même si encore une fois, rien de neuf sous le soleil.<br />
<a  href="http://slides.seld.be/?file=2011-03-04+JavaScript+Events+and+Scopes.html#1">Voir les slides</a></p>
<h4>BDD : Behavior Driven Development</h4>
<p>Voilà une des confs qui a vraiment abordé un sujet trop souvent mis de côté et de très belle façon. Konstantin (plus connu sous le pseudo everzet) a expliquer très simplement en quoi consistait la méthodologie BDD qui n&rsquo;est finalement qu&rsquo;une extension du célèbre TDD. Puis a mis en lumières les outils qu&rsquo;il a développé pour faciliter le travail de chacun.<br />
Clairement une très bonne surprise et une nouvelle étape pour faciliter cette partie du métier de développeur.<br />
<a  href="http://www.slideshare.net/everzet/bdd-in-symfony2">Voir les slides</a></p>
<h4>Jeux sociaux et Cloud</h4>
<p>Weka qu&rsquo;on a vu pas mal en tant que sponsor de l&rsquo;évènement a pu exposer un peu son domaine de prédilection. On attend les slides!</p>
<h4>Don&rsquo;t use a screw when you need a nail</h4>
<p>Derrière ce titre, se cachait en fait, Stefan (Skoop) qui a parfaitement résumé ce que tout développeur devrait faire : Chercher les solutions les plus pertinentes en fonction de vos besoins. En faisant un rapide tour des technos non PHP qui répondent à des besoins communs, comme le search, un bug tracker, etc &#8230; il a montré que le développement c&rsquo;est une grande famille et qu&rsquo;il y a parfois la solution à votre problème pas si loin que ça ;)<br />
<a  href="http://www.slideshare.net/skoop/dont-use-a-screw-when-you-need-a-nail-symfony-live-paris-2011">Voir les slides</a></p>
<h4>Iscool Story</h4>
<p>On attend les slides!</p>
<h4>Keynote : one more thing</h4>
<p>Musique, effet de lumière, vidéo, Fabien a le mérite de jouer l&rsquo;auto dérision parfaitement en commençant la keynote par l&rsquo;annonce de la &#8230; Symfony Tablet! Finalement, pour ceux qui ont pas vu la conf retransmise en live apparemment, 3 grandes annonces:</p>
<ul>
<li>Symfony2 aura un système d&rsquo;installer à la wordpress. Il semble aussi simple d&rsquo;utilisation!</li>
<li>Symfony2 aura un système de distributions qui embarquera une conf par défaut différente en fonction des cas d&rsquo;utilisation</li>
<li>Nouvelle marque! Symfony se dote d&rsquo;un nouveau ndd, un nouveau site et un nouveau logo : <a  href="http://symfony.com">Voir le nouveau site</a></li>
</ul>
<p>Rien de révolutionnaire, mais on peut noter l&rsquo;effort sur le site web, beaucoup plus clair, simple et actuel niveau graphique. Et surtout l&rsquo;accent mis sur la simplification de Symfony2 auprès des débutants. Fabien a semble-t-il l&rsquo;intention de &laquo;&nbsp;banaliser&nbsp;&raquo; au maximum Symfony2 pour montrer qu&rsquo;on peut faire beaucoup de choses assez simplement avec. Et si c&rsquo;est pour faire reculer des choses comme joomla, on ne peut qu&rsquo;espérer que ca fonctionne un peu ;)</p>
<h3>Unconférence</h3>
<p>Vendredi, Skoop a également mis en place un partie &laquo;&nbsp;unconférence&nbsp;&raquo;, entendre par là, une conférence un peu informelle. L&rsquo;idée est super, mais encore une fois, ce ne faisait que compliquer les choix :p </p>
<p>Vous pouvez retrouver le détails des présentations sur le <a  href="https://docs.google.com/document/pub?id=1rXrCNX25JArMq5TEHJOFiJjnmsKjRX4JpUoFxTXqob0&#038;pli=1">récap de Jonathan</a></p>
<h3>Bilan</h3>
<p>Bah c&rsquo;était cool! Forcément ;)</p>
<ul>
<li>Toujours un peu déçu quand on tombe sur une conf qui finalement ne pas plus loin de ce qu&rsquo;on est déjà allé. Mais fallait bien que les gens qui n&rsquo;ont pas encore touché le nouveau joujou puissent suivre j&rsquo;imagine!</li>
<li>Assez bluffé par l&rsquo;équipe de traduction en langage de signes. Deux dames pour 4 malentendants (je crois). J&rsquo;imagine pas le bagage technique qu&rsquo;il faut pour réussir à traduire ce genre de conférence, chapeau!</li>
<li>Un peu déçu de pas avoir eu un badge avec un joli tour de cou :x Réduction de coût pour les invités?</li>
<li>Toujours aussi charmé par l&rsquo;endroit, si j&rsquo;avais pu faire mes études dans le coin!</li>
<li>Merci pour le soleil!</li>
<li>Le gros point noir, reste finalement le wifi. Une vrai galère pour arriver à la page de login. D&rsquo;où la publication tardive de ce billet et un niveau de tweet en dessous de ce qui était prévu!</li>
</ul>
<p>Ravi d&rsquo;avoir pu rencontrer (ou revu) pas mal de gens, et surtout l&rsquo;équipe <a  href="http://www.knplabs.com">knplabs</a> qui m&rsquo;a gentiment permis de squatter avec eux :p Bon ya pas mal de tête que j&rsquo;ai même pas vu voir de loin! Mais ce n&rsquo;est que partie remise!</p>
<p><small>Crédit photo : http://www.flickr.com/photos/xavierbriand/5494245376</small></p>
<img src="http://feeds.feedburner.com/~r/AmicalementWeb/~4/T4eZFtDKTkY" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.amicalement-web.net/symfony-live-2011-compte-rendu-des-2-jours/2011/03/09/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<feedburner:origLink>http://www.amicalement-web.net/symfony-live-2011-compte-rendu-des-2-jours/2011/03/09/</feedburner:origLink></item>
	</channel>
</rss><!-- WP Super Cache is installed but broken. The path to wp-cache-phase1.php in wp-content/advanced-cache.php must be fixed! -->
