<?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>Wed, 04 Jan 2012 14:54:26 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.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>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&#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 même paradigme (certains plus que d&#8217;autres, mais passons), et c&#8217;est en partie ce qui fait leur succès : le paradigme de programmation fonctionnelle. Je vais essayer de vous expliquer ici en quoi c&#8217;est plus qu&#8217;une mode ou une lubie d&#8217;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&#8217;y intéresser. Si les puristes y voient quelques absurdités, n&#8217;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&#8217;est une honte (je fais style mais ça ne m&#8217;empêche toujours pas de dormir hein). Une des choses qui m&#8217;a le plus surpris quand j&#8217;ai appris le &laquo;&nbsp;pur&nbsp;&raquo; fonctionnel, c&#8217;est qu&#8217;on vous dit que vous ne pouvez ré-assigner une variable (qui n&#8217;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&#8217;est pas adapté ici, car on n&#8217;utilise pas de thread dans le language) facilement, et donc de faire des programmes qui passent bien à l&#8217;échelle (scalable).</p>
<p>Si vous avez déjà essayé de faire joujou avec les threads, vous savez que l&#8217;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&#8217;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&#8217;ait lue mais avant qu&#8217;il ait eu le temps de la ré-écrire ? Vos amis les sémaphores ne sont pas loin, et là c&#8217;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&#8217;effets de bord, lisez le lien wikipédia).</p>
<p>C&#8217;est rarement le cas en programmation objet. Vous avez toujours des fonctions qui dépendent de l&#8217;état de l&#8217;objet. Si vous avez une fonction isEmpty() sur un objet et que vous l&#8217;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&#8217;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&#8217;ont pas d&#8217;effets de bord, et qui ne partagent pas d&#8217;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&#8217;est notamment faisable par des <a  href="http://en.wikipedia.org/wiki/Actor_model">modèles d&#8217;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&#8217;oublier (i est modifié à chaque itération). Mais vous apprendrez d&#8217;autres manières d&#8217;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&#8217;exprimer ce que vous souhaitez faire, au lieu de le décrire ligne par ligne ce que l&#8217;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&#8217;apprendre, et la programmation fonctionnelle a été un déclic pour moi. Passer de PHP à Ruby, à Python c&#8217;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&#8217;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&#8217;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&#8217;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&#8217;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&#8217;Haskell. Son système d&#8217;acteurs et sa philosophie &laquo;&nbsp;let it crash&nbsp;&raquo; sont très intéressants. Je ne l&#8217;ai pas encore assez approfondi pour pouvoir en dire plus pour l&#8217;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&#8217;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&#8217;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&#8217;est à mon avis le plus pragmatique pour une utilisation en entreprise (compatibilité Java, possiblité de faire de l&#8217;OOP), mais le moins efficace pour apprendre le fonctionnel pour de vrai. C&#8217;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>12</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&#8217;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&#8217;utilise souvent en php l&#8217;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&#8217;ai donc cherché plus en profondeur et j&#8217;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&#8217;IP</strong>. Il fallait donc trouver une solution, et après plusieurs minutes de recherche, la seule solution vraiment valable que j&#8217;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&#8217;idéal serait d&#8217;utiliser un try &#8230; except pour faire propre mais bon, ca c&#8217;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&#8217;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&#8217;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&#8217;ip de votre serveur sur le port 8000</strong> et naviguer dans l&#8217;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&#8217;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&#8217;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&#8217;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&#8217;est tout :)</p>
<p><strong>N.B:</strong> A noter qu&#8217;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&#8217;utilisation à d&#8217;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&#8217;é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&#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 &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&#8217;avais attaqué Ruby / Rails de manière plutôt intensive et qu&#8217;un petit bilan s&#8217;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&#8217;époque sur ce choix</a>.</p>
<p>A l&#8217;époque je m&#8217;étais retrouvé un peu seul à tenter vainement de défendre symfony mais j&#8217;avais du me résoudre à me lancer dans le grand bain pour la conception d&#8217;HotelHotel à laquelle il fallait bien que je participe (bah oué on est un peu que 3 côté techos :p), c&#8217;était il y a quasi 1 an !</p>
<p>Je vous préviens, ceux qui me côtoient un peu s&#8217;y attendent surement ;), je n&#8217;ai pas vraiment changé d&#8217;avis : Ruby / Rails j&#8217;accroche pas, et de depuis quasi les premières lignes écrites. Et je vais essayer de retranscrire un peu mon ressenti et retour d&#8217;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&#8217;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&#8217;est pas simple. C&#8217;est même assez compliqué et ça frustre !</p>
<p>Côté bilan, le langage il n&#8217;y a pas grand chose à redire si ce n&#8217;est ce côté implicite avec lequel j&#8217;ai encore maintenant beaucoup de mal, question de goût j&#8217;imagine. J&#8217;ai croisé un jour un gist avec 2 &laquo;&nbsp;versions&nbsp;&raquo; d&#8217;un même code, l&#8217;un en version totalement implicite, l&#8217;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&#8217;api est clairement plus aboutie que PHP, et permet de faire tout autant de chose, et plutôt vite et bien une fois qu&#8217;on s&#8217;est habitué à sa syntaxe. Il faut être honnête Ruby n&#8217;a rien a envier à PHP en tant que langage pur. Mais la réciproque est pas loin d&#8217;ê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&#8217;est un problème pour moi) de l&#8217;implicite rend toute lecture de code un vrai cauchemar ce qui m&#8217;a certainement ralenti et un peu découragé de me plonger à 110% dans le code comme j&#8217;aime tant faire. Parcourir des lignes de code que j&#8217;ai encore du mal à déchiffrer me décourage un peu. (Et oui désolé, mais moi, j&#8217;aime voir mes fins de lignes avec des points virgules !!!)</p>
<p>Pour le framework c&#8217;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&#8217;ai toujours la vague impression que je suis bridé, certainement parce que je suis encore loin de maitriser les rouages que j&#8217;avais pris le temps de décortiquer sur symfony.<br />
Et pourtant c&#8217;est déjà sa version3 (qui va avoir un an aussi d&#8217;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&#8217;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&#8217;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&#8217;arrive à couper mon saucisson sans problème (j&#8217;étais à l&#8217;apéro au moment d&#8217;écrire ces lignes&#8230;).<br />
J&#8217;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&#8217;en prendre en grande partie à moi même, je n&#8217;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&#8217;actualité, blog, twitter qui tournent autour de symfony. Celle de Rails et même de Ruby est beaucoup plus petite en France et j&#8217;ai finalement très vite lâché l&#8217;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&#8217;est foutu de ce petit plugin qui rox, bien sûr le fameux RVM qui ne m&#8217;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&#8217;il faille redémarrer l&#8217;appli pour qu&#8217;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&#8217;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&#8217;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&#8217;est plus un mauvais feeling et le fait que je sois ravi de symfony et PHP qui font que j&#8217;accroche pas. J&#8217;ai passé et donné beaucoup de mon temps sur symfony et PHP et je n&#8217;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&#8217;ai décortiqué les bétas, testé et retesté, lu le code. Et l&#8217;excitation de m&#8217;en servir grandit chaque jour ! Définitivement, une question de feeling donc. Et aussi parce que j&#8217;ai eu l&#8217;impression de progresser dans mon métier avec symfony1, et cette même sensation m&#8217;envahit quand je vois Symfony2. Ruby / Rails ne m&#8217;ont permis que de me diversifier&#8230;</p>
<p>Attention, je reste quand même ravi d&#8217;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&#8217;aura permis aussi de me conforter, malgré toute la mauvaise presse qu&#8217;il se traine, dans l&#8217;idée que moi je l&#8217;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&#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, mais comme je voulais aussi apprendre le Ruby, ce n&#8217;était pour moi pas la bonne façon de commencer. J&#8217;ai donc voulu écrire ma première web app en Ruby, comme je l&#8217;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&#8217;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&#8217;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&#8217;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&#8217;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&#8217;est là que ça se gâte. Tout d&#8217;abord je tiens à dire que je n&#8217;ai pas beaucoup d&#8217;expérience en Ruby, il y a de ça un mois je n&#8217;en avais encore jamais fait, soyez indulgents ;-). Mais j&#8217;ai tout de suite été confronté à l&#8217;évidence : <strong>Ruby (comme Python d&#8217;ailleurs) n&#8217;est pas un langage web</strong>. Pas qu&#8217;on ne peut pas faire de web avec (ça se saurait), mais il n&#8217;a pas été initialement prévu pour cela. Qu&#8217;est-ce que cela implique ? Vous n&#8217;avez pas de raccourcis/fonctions pour accéder à l&#8217;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&#8217;accéder aux éléments d&#8217;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&#8217;abstraction entre le serveur web (peu importe lequel) et votre code. Vous devrez bien sûr adapter votre code pour qu&#8217;il soit compatible Rack et puisse être exécuté sur n&#8217;importe quel serveur web qui propose une interface Rack (à peu prêt tous maintenant). C&#8217;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&#8217;ailleurs été inspiré de la solution trouvée pour Python qui s&#8217;appelle WSGI.</p>
<h3>Une application Rack</h3>
<p>Une application Rack qu&#8217;est-ce que c&#8217;est ? C&#8217;est une application qui a comme point d&#8217;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&#8217;origine ou <a  href="http://en.wikipedia.org/wiki/Rack_%28Web_server_interface%29">l&#8217;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&#8217;exemple ci dessus, mais c&#8217;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&#8217;utiliser rackup qui vous permettra d&#8217;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&#8217;utiliser qu&#8217;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&#8217;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&#8217;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&#8217;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&#8217;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&#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.<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&#8217;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&#8217;installer ;-)</p>
<p>Si comme tout gens bien vous utilisez ArchLinux, il vous suffit d&#8217;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&#8217;avez pas easy_install (hey les gens, faut vraiment vous mettre au Python !), c&#8217;est <a  href="http://pypi.python.org/pypi/setuptools">par ici</a>.</p>
<h3>Créez un Makefile</h3>
<p>Pour l&#8217;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&#8217;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&#8217;importe quoi d&#8217;autre que index, on s&#8217;en fiche un peu, mais si vous mettez index il va pas être content le mÔssieur.</p>
<h3>Installez l&#8217;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&#8217;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&#8217;<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&#8217;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&#8217;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>2</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&#8217;é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&#8217;était l&#8217;occasion d&#8217;aborder abondamment ce nouveau framework pour ceux qui n&#8217;avaient pas eu encore l&#8217;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&#8217;est un bon orateur, la conf n&#8217;était pas technique du tout, &laquo;&nbsp;juste&nbsp;&raquo; de l&#8217;ouverture d&#8217;esprit. Même si je n&#8217;ai globalement pas appris grand chose de nouveau, cette conf Microsoft était bien mieux que celle de l&#8217;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&#8217;un framework. C&#8217;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&#8217;air bien fichu mais mon dieu que c&#8217;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&#8217;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&#8217;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&#8217;idée est bonne : axer le développement sur la résolution des problèmes des développeurs (d&#8217;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&#8217;é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&#8217;implémentation à faire dans les 2 versions de symfony pour faire du vrai bon REST. Présentation complète vu qu&#8217;ils sont allés jusqu&#8217;à 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&#8217;était encore Scott Chacon qui s&#8217;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&#8217;un cas réel, l&#8217;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&#8217;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&#8217;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&#8217;é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&#8217;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&#8217;est pas encore mergé dans le master. L&#8217;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&#8217;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&#8217;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&#8217;il allait renoncer! Mais finalement, c&#8217;é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&#8217;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&#8217;occasion de manipuler la bête.</p>
<p>Perso, j&#8217;avoue avoir quelques réticences avec tout ces systèmes d&#8217;annotations, très à la mode en ce moment. Peut-être parce que c&#8217;est pas natif, ou peut-être parce que j&#8217;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&#8217;occasion de découvrir le dernière né des bundles intégré de base dans Symfony2. J&#8217;ai suivi de loin la conf pour commencer à mettre au propre ce billet. Mais les slides parlent d&#8217;elles mêmes! Assetic, c&#8217;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&#8217;on a pas pu suivre.</p>
<h4>HTTP Cache</h4>
<p>Fabien revient pour nous parler certainement d&#8217;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&#8217;est bien, être au pied du mur, ça fait un peu peur :p</p>
<h4>Solr</h4>
<p>J&#8217;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&#8217;a donné envie d&#8217;aller plus loin! En tout cas Varnish ca a l&#8217;air cool, mais surtout si on en a l&#8217;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&#8217;un sujet qui intéressait à mon avis beaucoup de monde. La migrations des applis sf1 vers Sf2. J&#8217;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&#8217;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&#8217;event. Comme l&#8217;utilisation du preventDefault() ou encore la différence entre le bubbling et la capture. Suivi ensuite d&#8217;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&#8217;est toujours bon d&#8217;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&#8217;est finalement qu&#8217;une extension du célèbre TDD. Puis a mis en lumières les outils qu&#8217;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&#8217;on a vu pas mal en tant que sponsor de l&#8217;évènement a pu exposer un peu son domaine de prédilection. On attend les slides!</p>
<h4>Don&#8217;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&#8217;est une grande famille et qu&#8217;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&#8217;auto dérision parfaitement en commençant la keynote par l&#8217;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&#8217;installer à la wordpress. Il semble aussi simple d&#8217;utilisation!</li>
<li>Symfony2 aura un système de distributions qui embarquera une conf par défaut différente en fonction des cas d&#8217;utilisation</li>
<li>Nouvelle marque! Symfony se dote d&#8217;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&#8217;effort sur le site web, beaucoup plus clair, simple et actuel niveau graphique. Et surtout l&#8217;accent mis sur la simplification de Symfony2 auprès des débutants. Fabien a semble-t-il l&#8217;intention de &laquo;&nbsp;banaliser&nbsp;&raquo; au maximum Symfony2 pour montrer qu&#8217;on peut faire beaucoup de choses assez simplement avec. Et si c&#8217;est pour faire reculer des choses comme joomla, on ne peut qu&#8217;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&#8217;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&#8217;é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&#8217;on est déjà allé. Mais fallait bien que les gens qui n&#8217;ont pas encore touché le nouveau joujou puissent suivre j&#8217;imagine!</li>
<li>Assez bluffé par l&#8217;équipe de traduction en langage de signes. Deux dames pour 4 malentendants (je crois). J&#8217;imagine pas le bagage technique qu&#8217;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&#8217;endroit, si j&#8217;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&#8217;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&#8217;avoir pu rencontrer (ou revu) pas mal de gens, et surtout l&#8217;équipe <a  href="http://www.knplabs.com">knplabs</a> qui m&#8217;a gentiment permis de squatter avec eux :p Bon ya pas mal de tête que j&#8217;ai même pas vu voir de loin! Mais ce n&#8217;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>
		<item>
		<title>Symfony Live : one more time</title>
		<link>http://feedproxy.google.com/~r/AmicalementWeb/~3/VHA0NxkgHzE/</link>
		<comments>http://www.amicalement-web.net/symfony-live-one-more-time/2011/02/28/#comments</comments>
		<pubDate>Mon, 28 Feb 2011 08:48:43 +0000</pubDate>
		<dc:creator>Vince</dc:creator>
				<category><![CDATA[Actualité]]></category>

		<guid isPermaLink="false">http://www.amicalement-web.net/?p=1713</guid>
		<description><![CDATA[Le Symfony Live se tiendra pour la troisième année consécutive à la Cité Universitaire de Paris du 3 au 5 Mars (grosso modo à la fin de la semaine ;-) ). Une journée de formation (déjà complète) aura lieu mercredi, jeudi et vendredi seront dédiés à la conférence en elle même, et samedi sera le [...]]]></description>
			<content:encoded><![CDATA[<p><a  href="http://www.amicalement-web.net/symfony-live-one-more-time/2011/02/28/"><img src="http://www.amicalement-web.net/wp-content/uploads/sflive2011.jpg" alt="" title="sflive2011" width="614" height="100" class="alignnone size-full wp-image-1722" /></a><br />
Le <a  href="http://www.symfony-live.com">Symfony Live</a> se tiendra pour la troisième année consécutive à la <strong>Cité Universitaire de Paris du 3 au 5 Mars</strong> (grosso modo à la fin de la semaine ;-) ). Une journée de formation (déjà complète) aura lieu mercredi, jeudi et vendredi seront dédiés à la conférence en elle même, et samedi sera le jour du geek programmeur accessible et gratuit pour tous (plus joliment appelé <em>HackDay Symfony2</em>). Vos bons et loyaux serviteurs seront présents à la conférence (enfin Tim et moi même, Ben fait style il a autre chose à faire), alors n&#8217;hésitez pas à venir nous faire un petit coucou. Je vous donne un aperçu de l&#8217;évènement et des confs qu&#8217;il ne faudra pas manquer dans la suite de ce billet.<br />
<span id="more-1713"></span></p>
<h3>Une conférence bi-lingue</h3>
<p>Tout d&#8217;abord il est important de préciser que la conférence sera bi-lingue. La toute première conférence symfony en 2009 était francophone, l&#8217;an dernier elle était uniquement anglophone (<strong>everything</strong> is a Bundle) et cette année nous auront des conférences anglophones et francophones en parallèle. Le russe pour l&#8217;an prochain ?</p>
<h3>Des sessions multi-threadées</h3>
<p>Qui a dit que PHP n&#8217;était pas fait pour faire de la programmation concurrentielle ?! La conf sera forkée dès le début en deux et se déroulera en parallèle dans deux salles différentes (savamment nommées salle A et B). Il faudra donc faire des choix, on ne pourra pas tout vous raconter ! De plus tout cela mélangera allègrement du symfony 1, du Symfony2, du javascript (?), du cache HTTP, du français et de l&#8217;anglais.</p>
<h3>Les confs que je ne manquerai pas</h3>
<p><em>sauf guet-apens de dernière minute indépendant de ma volonté</em></p>
<ul>
<li>Sate of the Symfony2 CMF (par Lukas Kahwe Smith) : car même en faisant partie du projet, j&#8217;aimerais vraiment savoir où on en est ;-)</li>
<li>RESTful avec symfony et Symfony2 (par Xavier Lacot et Damien Alexandre) : parce que là où Rails l&#8217;intègre par défaut, c&#8217;est une pratique que je trouve assez peu répandue dans le monde symfony (et en plus Xavier est sympa)</li>
<li>Contributing with Git (par Scott Chacon) : parce que c&#8217;est Monsieur Github, que c&#8217;est une bête de scène et qu&#8217;on aura peut être des stickers Github comme l&#8217;an dernier :&#8217;) (oui oh ça va hein)</li>
<li>Symfony2, 30 astuces et bonnes pratiques (par Noël Guibert) : parce que la même conf pour symfony 1 avait été très sympa la première fois, gageons que cela sera de bonne qualité aussi.</li>
<li>Leveraging Symfony2 Forms (par Bernhard Schussek) : j&#8217;ai besoin d&#8217;une thérapie après trop d&#8217;embedForm symfony 1</li>
<li>Symfony2 from the trenches (par Lukas Kahwe Smith et Jonathan Wage) : le truc de barbu par excellence, chouette !</li>
<li>Quid de mes applications symfony 1 (par Marc Hugon) : bah oui, Quid ?</li>
<li>Symfony2 en pièces détachées (par Hugo Hamon) : c&#8217;est quand même un peu pour Symfony2 qu&#8217;on vient, ça peut toujours être sympa</li>
<li>Behavior Driven Development for Symfony2 (par Konstantin Kudryashov) : outre le fait que Konstantin est un type génial, le BDD est un domaine auquel vous devriez vous intéresser.</li>
</ul>
<p>Et bien sur pour finir, j&#8217;assisterai aux keynotes de Steve Jo<em>^W^W^W</em>Fabien Potencier.</p>
<h3>Le mot de la fin</h3>
<p>Si vous ne savez pas quoi faire en cette fin de semaine et que vous avez 300 euros (HT) à dépenser, venez nous faire un petit coucou à la conférence. Pour les plus fauchés (ou les plus raisonnables) d&#8217;entre vous, le HackDay de samedi est gratuit, ça devrait vous permettre de rencontrer des gens bien (TM) et de faire connaissance avec la communauté (je n&#8217;y serai pas, mais je penserai fort à vous). Quoiqu&#8217;il en soit, j’essaierai de couvrir la conf dans la mesure du possible sur mon <a  href="http://twitter.com/vjousse">compte Twitter</a>.</p>
<img src="http://feeds.feedburner.com/~r/AmicalementWeb/~4/VHA0NxkgHzE" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.amicalement-web.net/symfony-live-one-more-time/2011/02/28/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		<feedburner:origLink>http://www.amicalement-web.net/symfony-live-one-more-time/2011/02/28/</feedburner:origLink></item>
		<item>
		<title>jQuery : Rendez vos lignes cliquables!</title>
		<link>http://feedproxy.google.com/~r/AmicalementWeb/~3/XTtqse_-73I/</link>
		<comments>http://www.amicalement-web.net/jquery-rendez-vos-lignes-cliquables/2011/02/11/#comments</comments>
		<pubDate>Fri, 11 Feb 2011 10:00:28 +0000</pubDate>
		<dc:creator>Tim</dc:creator>
				<category><![CDATA[Astuces]]></category>
		<category><![CDATA[astuce]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[jquery]]></category>
		<category><![CDATA[tips]]></category>

		<guid isPermaLink="false">http://www.amicalement-web.net/?p=1692</guid>
		<description><![CDATA[Petit billet rapide pour une petite astuce jQuery, ca faisait longtemps! Le but ici est simplement de donner la possibilité de cliquer sur un élément parent d&#8217;un lien pour l&#8217;activer. Et comme j&#8217;ai un peu galéré je me suis dit que ca valait le coup de partager le code. Que se soit dans une liste [...]]]></description>
			<content:encoded><![CDATA[<p><a  href="http://www.amicalement-web.net/jquery-rendez-vos-lignes-cliquables/2011/02/11/line/" rel="attachment wp-att-1698"><img src="http://www.amicalement-web.net/wp-content/uploads/line.png" alt="" title="line" width="614" height="100" class="alignnone size-full wp-image-1698" /></a><br />
Petit billet rapide pour une petite astuce jQuery, ca faisait longtemps! Le but ici est simplement de donner la possibilité de cliquer sur un élément parent d&#8217;un lien pour l&#8217;activer. Et comme j&#8217;ai un peu galéré je me suis dit que ca valait le coup de partager le code.<br />
<span id="more-1692"></span><br />
Que se soit dans une liste ou dans un tableau, il y a parfois qu&#8217;un seul lien, et je trouve assez pratique souvent de donner la possibilité à l&#8217;utilisateur de cliquer sur toute la ligne pour l&#8217;activer sans pour autant dégrader mon code html. Et comme je suis du genre à aimer ouvrir des liens dans un nouvel onglet, je comptais bien reproduire ce comportement.</p>
<p>Voici donc le code, résultat de cette réflexion, ou un clic avec ctrl (ou cmd pour les mac) ou le bouton du milieu de la souris devrait ouvrir le lien dans un nouvel onglet, comme le ferait un lien normal :</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;">$<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'.line-click'</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">live</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'click'</span><span style="color: #339933;">,</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span>e<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
  e.<span style="color: #660066;">stopPropagation</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  href <span style="color: #339933;">=</span> $<span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">this</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">children</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'a:first'</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">attr</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'href'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>e.<span style="color: #660066;">ctrlKey</span> <span style="color: #339933;">||</span> e.<span style="color: #660066;">metaKey</span> <span style="color: #339933;">||</span> e.<span style="color: #660066;">which</span> <span style="color: #339933;">==</span> <span style="color: #CC0000;">2</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    window.<span style="color: #000066;">open</span><span style="color: #009900;">&#40;</span>href<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #009900;">&#125;</span> <span style="color: #000066; font-weight: bold;">else</span> <span style="color: #009900;">&#123;</span>
    window.<span style="color: #660066;">location</span> <span style="color: #339933;">=</span> href<span style="color: #339933;">;</span>
  <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">css</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'cursor'</span><span style="color: #339933;">,</span> <span style="color: #3366CC;">'pointer'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>A utiliser avec le code html suivant par exemple:</p>

<div class="wp_syntax"><div class="code"><pre class="xml" style="font-family:monospace;"><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;ul<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
  <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;li</span> <span style="color: #000066;">class</span>=<span style="color: #ff0000;">&quot;line-click&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span><span style="color: #000000; font-weight: bold;">&lt;img</span> <span style="color: #000066;">src</span>=<span style="color: #ff0000;">&quot;monimage.jpg&quot;</span> <span style="color: #000066;">alt</span>=<span style="color: #ff0000;">&quot;youpi&quot;</span> <span style="color: #000000; font-weight: bold;">/&gt;</span></span> 10/02/11 <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;a</span> <span style="color: #000066;">href</span>=<span style="color: #ff0000;">&quot;monlien.html&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>Titre de mon billet<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/a<span style="color: #000000; font-weight: bold;">&gt;</span></span><span style="color: #000000; font-weight: bold;">&lt;/li<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
  <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;li</span> <span style="color: #000066;">class</span>=<span style="color: #ff0000;">&quot;line-click&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span><span style="color: #000000; font-weight: bold;">&lt;img</span> <span style="color: #000066;">src</span>=<span style="color: #ff0000;">&quot;monimage2.jpg&quot;</span> <span style="color: #000066;">alt</span>=<span style="color: #ff0000;">&quot;youpi&quot;</span> <span style="color: #000000; font-weight: bold;">/&gt;</span></span> 07/02/11 <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;a</span> <span style="color: #000066;">href</span>=<span style="color: #ff0000;">&quot;monlien2.html&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>Titre de mon 2e billet<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/a<span style="color: #000000; font-weight: bold;">&gt;</span></span><span style="color: #000000; font-weight: bold;">&lt;/li<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
  <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;li</span> <span style="color: #000066;">class</span>=<span style="color: #ff0000;">&quot;line-click&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span><span style="color: #000000; font-weight: bold;">&lt;img</span> <span style="color: #000066;">src</span>=<span style="color: #ff0000;">&quot;monimage3.jpg&quot;</span> <span style="color: #000066;">alt</span>=<span style="color: #ff0000;">&quot;youpi&quot;</span> <span style="color: #000000; font-weight: bold;">/&gt;</span></span> 21/01/11 <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;a</span> <span style="color: #000066;">href</span>=<span style="color: #ff0000;">&quot;monlien3.html&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>Titre de mon 3e billet<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/a<span style="color: #000000; font-weight: bold;">&gt;</span></span><span style="color: #000000; font-weight: bold;">&lt;/li<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/ul<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></pre></div></div>

<p>A adapter selon vos envies. Ici c&#8217;est le premier lien trouvé dans l&#8217;élément avec la class <code>line-click</code> qui sera déclenché. Voilà, en attendant que j&#8217;arrive à finir un billet plus consistent!</p>
<p><small>Crédit photo : http://www.flickr.com/photos/flyingturtle/837938254</small></p>
<img src="http://feeds.feedburner.com/~r/AmicalementWeb/~4/XTtqse_-73I" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.amicalement-web.net/jquery-rendez-vos-lignes-cliquables/2011/02/11/feed/</wfw:commentRss>
		<slash:comments>13</slash:comments>
		<feedburner:origLink>http://www.amicalement-web.net/jquery-rendez-vos-lignes-cliquables/2011/02/11/</feedburner:origLink></item>
		<item>
		<title>Doctrine2 : au revoir ActiveRecord, bonjour DataMapper !</title>
		<link>http://feedproxy.google.com/~r/AmicalementWeb/~3/JTlRZSKmyEk/</link>
		<comments>http://www.amicalement-web.net/doctrine2-au-revoir-activerecord-bonjour-datamapper/2011/01/03/#comments</comments>
		<pubDate>Mon, 03 Jan 2011 08:55:29 +0000</pubDate>
		<dc:creator>Vince</dc:creator>
				<category><![CDATA[Tutorials]]></category>
		<category><![CDATA[active record]]></category>
		<category><![CDATA[datamapper]]></category>
		<category><![CDATA[doctrine]]></category>
		<category><![CDATA[orm]]></category>

		<guid isPermaLink="false">http://www.amicalement-web.net/?p=1413</guid>
		<description><![CDATA[Aujourd&#8217;hui nous allons parler d&#8217;un ORM pour PHP que vous connaissez sûrement : Doctrine (si vous ne le connaissez pas je ne peux rien pour vous, ou alors juste vous donner l&#8217;adresse du site). Cela fait maintenant quelques années que Doctrine 1 a vu le jour et a été utilisé dans nombre de projets symfony, [...]]]></description>
			<content:encoded><![CDATA[<p><a  href="http://www.amicalement-web.net/doctrine2-au-revoir-activerecord-bonjour-datamapper/2011/01/03/"><img src="http://www.amicalement-web.net/wp-content/uploads/doctrine1.png" alt="" title="doctrine" width="614" height="100" class="alignnone size-full wp-image-1655" /></a><br />
Aujourd&#8217;hui nous allons parler d&#8217;un <a  href="http://fr.wikipedia.org/wiki/Mapping_objet-relationnel">ORM</a> pour PHP que vous connaissez sûrement : Doctrine (si vous ne le connaissez pas je ne peux rien pour vous, ou alors juste vous donner <a  href="http://www.doctrine-project.org">l&#8217;adresse du site</a>). Cela fait maintenant quelques années que Doctrine 1 a vu le jour et a été utilisé dans nombre de projets symfony, mais il est temps pour lui de prendre sa retraite, et par l&#8217;occasion de dire au revoir (ou presque) au design pattern <a  href="http://www.martinfowler.com/eaaCatalog/activeRecord.html">Active Record</a> qui va avec. D&#8217;ailleurs ça tombe bien, Doctrine 2 vient de sortir sa première version stable !<br />
<span id="more-1413"></span></p>
<h3>Modèle et persistance</h3>
<p>La première chose que l&#8217;on m&#8217;a apprise lorsqu&#8217;on m&#8217;a parlé de MVC, c&#8217;était que le M (pour model) devait contenir la <strong>logique &laquo;&nbsp;métier&nbsp;&raquo;</strong> de notre application. Quand on parle de métier, c&#8217;est bien ce qui est spécifique à l&#8217;application développée. La partie Modèle d&#8217;une calculatrice doit savoir calculer (Lapalisse si tu m&#8217;entends, elle est pour toi celle là), la partie Modèle d&#8217;une gestion de facturation doit savoir gérer les relances, les impayés, les factures &#8230; Bon bah très bien tout ça.</p>
<p>Et là c&#8217;est le drame, vous vous mettez à utiliser symfony et un des deux principaux ORM du monde PHP : <strong>Propel ou Doctrine</strong>. Tout d&#8217;abord vous trouvez ça chouette, vous pouvez faire un <strong>->save() ou un ->delete()</strong> directement sur votre objet, la classe. Mais qu&#8217;est-ce que ça veut dire ça ? Ca veut dire que votre objet connait la façon dont il doit persister. Il est fortement couplé à la façon dont vous voulez l&#8217;enregistrer, dans notre cas dans une base de données.</p>
<p>C&#8217;est assez facile à voir, regardez le graphe d&#8217;héritage de votre objet, pour Doctrine tous les objets de votre modèle héritent de la classe <code>Doctrine_Record</code>. Et si, par le plus grand des hasards, vous voulez réutiliser votre logique métier dans une autre application PHP qui n&#8217;a rien à voir avec celle que vous développez avec symfony/Doctrine ? Vous êtes bons pour de jolis copier/coller.</p>
<h3>DataMapper à la rescousse</h3>
<p>L&#8217;idéal pour réaliser des M qui ne font que du M, c&#8217;est de n&#8217;avoir que des <strong>PPO (Plain PHP Object)</strong>, c&#8217;est à dire des objets PHP standards (qui n&#8217;héritent pas d&#8217;une classe comme <code>Doctrine_Record</code> par exemple). Ces PPO doivent réaliser la logique métier de notre application (le M), et une autre partie de l&#8217;application doit pouvoir prendre ce PPO et le faire persister quelque part (système de fichier, base de données, &#8230;). C&#8217;est là qu&#8217;intervient le design pattern <a  href="http://martinfowler.com/eaaCatalog/dataMapper.html"><strong>DataMapper</strong></a>. Il va permettre de faire le lien entre l&#8217;objet (l&#8217;Entity dans le jargon Doctrine2) et la façon dont il devra persister. Dans Doctrine2, c&#8217;est l&#8217;<a  href="http://www.doctrine-project.org/api/orm/2.0/doctrine/orm/entitymanager.html">Entity Manager</a> qui va réaliser le rôle de DataMapper avec sa méthode flush() qui sauvegarde les changements dans la base de données.</p>
<h3>Unit of Work, le copain du DataMapper</h3>
<p>La méthode ->flush() de l&#8217;EntityManager va permettre d&#8217;enregistrer les changements effectués sur les PPO dans la base de données. Ces changements auront été notifiés au préalable à l&#8217;Entity Manager par la méthode persist(). Cette méthode permet de dire à l&#8217;Entity Manager que l&#8217;on veut faire persister notre PPO passé en paramètre de la méthode. Ça se résume comme ç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: #000088;">$user</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> User<span style="color: #339933;">;</span>
<span style="color: #000088;">$user</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">setName</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'Mr.Right'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$em</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">persist</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$user</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$em</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">flush</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Ici on informe l&#8217;Entity Manager (em), que l&#8217;on voudra faire persister les changements apportés à l&#8217;objet user via la méthode <code>$em->persist($user)</code>. Les changements ne seront effectués dans la base de données qu&#8217;une fois la méthode ->flush() invoquée. Si nous avions fait plusieurs ->persist() différents avant de faire notre ->flush(), rien n&#8217;aurait encore été écrit dans la base. Mais alors, comment Doctrine fait pour garder trace de ces changements jusqu&#8217;au flush ? Il utilise le design pattern <a  href="http://martinfowler.com/eaaCatalog/unitOfWork.html"><strong>Unit of Work</strong></a>. Ce design pattern permet de garder trace de toutes les modifications apportées entre 2 flush(). Il met en place une sorte de <strong>transaction, mais au niveau des objets</strong>. C&#8217;est en partie son utilisation qui permet d&#8217;avoir un beau Data Mapper comme l&#8217;EM.</p>
<h3>Conclusion</h3>
<p>L&#8217;utilisation d&#8217;un DataMapper n&#8217;est pas vraiment nouveau dans le monde de la programmation : <a  href="http://www.hibernate.org/">Hibernate</a> l&#8217;implémente déjà pour Java et <a  href="http://www.sqlalchemy.org/">SQLAlchemy</a> pour Python. En revanche, c&#8217;est une <strong>petite révolution dans le monde PHP</strong>. Si des fois vous préférez garder votre bon vieux <strong>Active Record</strong>, il existe aussi des solution en PHP : vous pouvez utiliser l&#8217;<a  href="http://www.propelorm.org/">ORM Propel</a> qui est toujours activement maintenu par François Zaninotto ou utiliser des implémentations du pattern Active Record réalisées avec Doctrine2 comme <a  href="https://github.com/pablodip/doctrator">Doctractor</a> ou <a  href="http://www.doctrine-project.org/blog/your-own-orm-doctrine2">ActiveEntity</a> codé par l&#8217;équipe de Doctrine2. C&#8217;est deux derniers exemples montrent bien toute la flexibilité et la puissance de cette nouvelle version de Doctrine !</p>
<img src="http://feeds.feedburner.com/~r/AmicalementWeb/~4/JTlRZSKmyEk" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.amicalement-web.net/doctrine2-au-revoir-activerecord-bonjour-datamapper/2011/01/03/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		<feedburner:origLink>http://www.amicalement-web.net/doctrine2-au-revoir-activerecord-bonjour-datamapper/2011/01/03/</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! -->

