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

<channel>
	<title>Amicalement Web - Astuces et Bons plans dans le développement web &#187; Vince</title>
	<atom:link href="http://www.amicalement-web.net/author/vince/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.amicalement-web.net</link>
	<description>Astuces et bons plans d&#039;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>
		<item>
		<title>La &#171;&#160;mode&#160;&#187; du fonctionnel : pourquoi ?</title>
		<link>http://www.amicalement-web.net/la-mode-du-fonctionnel-pourquoi/2012/01/02/</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>
]]></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>
		</item>
		<item>
		<title>De PHP à Ruby : votre premier index.php en Ruby</title>
		<link>http://www.amicalement-web.net/de-php-a-ruby-votre-premier-index-php-en-ruby/2011/05/23/</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>
]]></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>
		</item>
		<item>
		<title>Générer la documentation Symfony2</title>
		<link>http://www.amicalement-web.net/generer-la-documentation-symfony2/2011/03/21/</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>
]]></content:encoded>
			<wfw:commentRss>http://www.amicalement-web.net/generer-la-documentation-symfony2/2011/03/21/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Symfony Live : one more time</title>
		<link>http://www.amicalement-web.net/symfony-live-one-more-time/2011/02/28/</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>
]]></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>
		</item>
		<item>
		<title>Doctrine2 : au revoir ActiveRecord, bonjour DataMapper !</title>
		<link>http://www.amicalement-web.net/doctrine2-au-revoir-activerecord-bonjour-datamapper/2011/01/03/</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>
]]></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>
		</item>
		<item>
		<title>Ma boîte à outils de développeur (web)</title>
		<link>http://www.amicalement-web.net/ma-boite-a-outils-de-developpeur-web/2010/12/14/</link>
		<comments>http://www.amicalement-web.net/ma-boite-a-outils-de-developpeur-web/2010/12/14/#comments</comments>
		<pubDate>Tue, 14 Dec 2010 12:30:04 +0000</pubDate>
		<dc:creator>Vince</dc:creator>
				<category><![CDATA[Réflexion]]></category>

		<guid isPermaLink="false">http://www.amicalement-web.net/?p=1475</guid>
		<description><![CDATA[Dans notre métier, il est très important de se tenir au goût du jour, et pour ça il faut être curieux. Un vieil adage dit que c&#8217;est un vilain défaut, pas si sûr. C&#8217;est cette curiosité qui m&#8217;a fait découvrir beaucoup de choses cette année. J&#8217;avais envie de vous en faire partager quelques unes, après [...]]]></description>
			<content:encoded><![CDATA[<p><a  href="http://www.amicalement-web.net/ma-boite-a-outils-de-developpeur-web/2010/12/14/"><img src="http://www.amicalement-web.net/wp-content/uploads/marteau.jpg" alt="" title="marteau" width="614" height="100" class="aligncenter size-full wp-image-1561" /></a><br />
Dans notre métier, il est très important de se tenir au goût du jour, et pour ça il faut être <strong>curieux</strong>. Un vieil adage dit que c&#8217;est un vilain défaut, pas si sûr. C&#8217;est cette curiosité qui m&#8217;a fait découvrir beaucoup de choses cette année. J&#8217;avais envie de vous en faire partager quelques unes, après tout, c&#8217;est des autres qu&#8217;on apprend, moi le premier. Attention, geek tools inside : <strong>Vim, Git, ArchLinux et Firefox4</strong>.<br />
<span id="more-1475"></span></p>
<h3>Vim : et la lumière fut</h3>
<p>S&#8217;il y a bien un outil qui a <strong>changé la façon dont j&#8217;utilisais mon ordinateur</strong>, c&#8217;est bien Vim. Il s&#8217;inscrit tout à fait dans la façon dont je vois les choses : <strong>prendre du temps pour apprendre</strong> les choses, de manière à gagner du temps pour en réaliser. Tout argument consistant à dire que &laquo;&nbsp;du temps vous n&#8217;en n&#8217;avez pas&nbsp;&raquo; est nul et non avenu : <strong>le temps vous l&#8217;avez, il faut juste le prendre</strong>.<br />
Tout d&#8217;abord avec Vim, la souris devient inutile. Et c&#8217;est beaucoup plus confortable qu&#8217;on ne le croit : passer constamment de la souris au clavier est plus fatiguant qu&#8217;on ne le pense. Ensuite Vim est certes un éditeur de texte, mais c&#8217;est aussi un Framework à part entière: on peut le programmer pour en faire ce que l&#8217;on veut.</p>
<p>Pour finir, Vim (et ses raccourcis clavier) s&#8217;utilisent partout : vous pouvez l&#8217;utiliser pour naviguer dans vos lignes de commande shell, pour administrer votre serveur sans interface graphique, pour vous déplacer dans les applis Google (essayez de jouer avec hjkl vous verrez) ou pour naviguer dans votre Window Manager (personnellement j&#8217;utilise Awesome qui fournit par défaut des raccourcis similaires à Vim). En résumé : <strong><a  href="http://www.viemu.com/a-why-vi-vim.html">One Vim to rule them all</a></strong>.<br />
Je vous recommande chaudemment ces deux tutoriaux vidéo de chez PeepCode (en anglais) : <a  href="http://peepcode.com/products/smash-into-vim-i">Smash into Vim I</a> et <a  href="http://peepcode.com/products/smash-into-vim-ii">Smash into Vim II</a></p>
<p><a  href="http://www.amicalement-web.net/wp-content/uploads/tiraecol_en-2.png"><img src="http://www.amicalement-web.net/wp-content/uploads/tiraecol_en-2-300x105.png" alt="" title="tiraecol_en-2" width="300" height="105" class="aligncenter size-medium wp-image-1567" /></a></p>
<h3>Git : un gestionnaire de versions décentralisé</h3>
<p>La chose qui a changé la façon dont je travaillais c&#8217;est <strong>Git</strong>. Vous voyez SVN, ce truc qui essayait de faire bien ce que CVS n&#8217;aurait pas du faire ? Eh bien Git c&#8217;est tout sauf ça. Leur seul point commun, c&#8217;est que ce sont tous les deux des gestionnaires de versions de code source. Git est <strong>décentralisé</strong>, vous pouvez donc avoir un repo Git en local, sans avoir besoin d&#8217;avoir un serveur sur lequel commiter quelque part. À vous les <strong>commit dans le train</strong> ! ll permet aussi de contribuer de manière beaucoup plus facile à des projets OpenSource, notamment grâce à <a  href="http://www.github.com">Github</a> (que je décris dans <a  href="http://www.amicalement-web.net/twitter-et-facebook-sont-has-been-utilisez-github/2010/05/26/">cet article</a>).</p>
<p>Je ne vais pas vous décrire de façon exhaustive pourquoi Git est bien, si vous voulez en savoir d&#8217;avantage vous avez <a  href="http://progit.org/">le livre OpenSource Pro Git</a>  ou cette suite d&#8217;articles <a  href="http://yannesposito.com/Scratch/fr/blog/2009-11-12-Git-for-n00b/">Git pour les nuls</a>. Vous pouvez aussi vous référer à cet article très bien réalisé <a  href="http://nvie.com/posts/a-successful-git-branching-model/">A successful Git branching model</a>. Quoiqu&#8217;il en soit, si vous utilisez encore SVN, passez à un gestionnaire décentralisé (DCVS) style <strong>Git ou Mercurial</strong>, ça urge les gens. D&#8217;autant plus que <strong>migrer un repo SVN existant sur Github est un jeu d&#8217;enfant</strong>.</p>
<h3>De Mac OS X à ArchLinux</h3>
<p>Cela faisait maintenant 8 ans que j&#8217;étais exclusivement sous Mac, et j&#8217;en étais plutôt content. J&#8217;étais passé par divers BSD et autre linux avant, pour m&#8217;arrêter sur l&#8217;Unix que je trouvais le plus convivial : Mac OS X. Car en effet dans mon utilisation quotidienne je voyais plutôt <strong>Mac OS X</strong> comme un <strong>Unix</strong> avec lequel je pouvais ouvrir des <strong>fichiers Photoshop</strong> (je caricature mais l&#8217;idée est là). Étant un barbu stallmanien refoulé, mon subconscient vivait de plus en plus mal les orientations prises par Apple : c&#8217;était le moment de changer d&#8217;OS.</p>
<p>Depuis je suis passé sous <a  href="http://archlinux.fr/"><strong>ArchLinux</strong></a>, et là ça a été la révélation : toujours la dernière version des logiciels et un wiki d&#8217;installation très bien fait qui en plus de vous guider vous permet d&#8217;apprendre ce que les autres vous cachent par des interfaces graphiques. Photoshop n&#8217;est plus un problème, puisque virtualiser un autre OS sous Linux s&#8217;effectue maintenant sans souci (pour le peu de fois que je m&#8217;en sers &#8230;). Si vous voulez apprendre linux par vous même, <strong>essayez ArchLinux</strong>, ça vaut le coup. Vous pourrez en plus utiliser des logiciels comme <a  href="http://www.tenshu.net/terminator/">Terminator</a> (gestion de plusieurs terminaux), <a  href="http://www.tux-planet.fr/synapse-un-nouveau-lanceur-dapplications-pour-linux/">Synapse</a>/<a  href="http://do.davebsd.com/wiki/Main_Page">Gnome Do</a> (lanceurs d&#8217;applications), <a  href="http://www.hotot.org/">Hotot</a> (client Twitter) ou <a  href="http://awesome.naquadah.org/">Awesome Window Manager</a> (gestionnaire de fenêtres) dont il est difficile de se passer ensuite.<br />
<a  href="http://www.amicalement-web.net/wp-content/uploads/awesome.png"><img src="http://www.amicalement-web.net/wp-content/uploads/awesome-300x168.png" alt="" title="awesome" width="300" height="168" class="aligncenter size-medium wp-image-1565" /></a></p>
<h3>Firefox4</h3>
<p>J&#8217;étais sous Firefox depuis un bon nombre d&#8217;années, et en fin d&#8217;année dernière c&#8217;est le drame : je l&#8217;abandonne pour Google Chrome. À contre coeur, mais il fallait se rendre à l&#8217;évidence, sur mon mac, <strong>Firefox devenait inutilisable</strong> quand on avait goûté à Chrome. Et puis en milieu d&#8217;année, j&#8217;ai fait le switch inverse de Chromium/Google Chrome à Firefox4 par idéologie : c&#8217;est <strong>Firefox</strong> qui a permis d&#8217;améliorer mes conditions de travail journalières (j&#8217;ai assez mal vécu la guerre IE 5 /Netscape 4 ;-) ), et il est <strong>maintenant très rapide</strong> (en tout cas comparable à Chromium). Je n&#8217;irai pas jusqu&#8217;à dire qu&#8217;il bat Chromium sur tous les fronts, mais il lui tient la dragée haute. Si comme moi vous préférez les <strong>actions de la fondation Mozilla</strong> à celle de Google, vous devriez essayer une béta de Firefox4 (avec Firebug 1.7), vous pourriez être surpris.</p>
<h3>Conclusion</h3>
<p>N&#8217;hésitez pas à <strong>essayer</strong>, <strong>échouer</strong>, réessayer, échouer de nouveau pour <strong>réussir de belle manière</strong> ensuite. Vous pensez que Vim est trop compliqué pour vous ? Qu&#8217;avec Linux on a l&#8217;air de pouvoir faire des choses bien, mais que clicker sur un .exe ça vous rassure ? Que neni ! Jetez vous à l&#8217;eau, et quoiqu&#8217;il en soit, <strong>faites tout pour améliorer votre quotidien avec des outils adaptés</strong>. Si vous n&#8217;essayez pas, vous ne risquez pas d&#8217;échouer, mais si vous n&#8217;échouez pas, vous ne risquez pas d&#8217;apprendre ;)</p>
<p>Et vous, quels outils vont ont fait évoluer dans votre métier ?</p>
<p><small>Crédit photo : http://www.flickr.com/photos/kinregerp/4457001909/</small></p>
]]></content:encoded>
			<wfw:commentRss>http://www.amicalement-web.net/ma-boite-a-outils-de-developpeur-web/2010/12/14/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>symfony 1, Symfony2 et Django sont dans un bateau</title>
		<link>http://www.amicalement-web.net/symfony-1-symfony2-et-django-sont-dans-un-bateau/2010/11/15/</link>
		<comments>http://www.amicalement-web.net/symfony-1-symfony2-et-django-sont-dans-un-bateau/2010/11/15/#comments</comments>
		<pubDate>Mon, 15 Nov 2010 12:44:41 +0000</pubDate>
		<dc:creator>Vince</dc:creator>
				<category><![CDATA[Réflexion]]></category>
		<category><![CDATA[django]]></category>
		<category><![CDATA[framework]]></category>
		<category><![CDATA[Symfony]]></category>
		<category><![CDATA[symfony2]]></category>

		<guid isPermaLink="false">http://www.amicalement-web.net/?p=1481</guid>
		<description><![CDATA[Je développe sous symfony 1 depuis quelques temps et jusqu&#8217;ici j&#8217;en étais plutôt content. La dernière version majeure date de novembre 2009, nous en fêtons les 1 an ce mois-ci. Alors certes c&#8217;est un bel anniversaire un an, mais quand on sait que la prochaine version majeure sera Symfony2, prévue pour Mars 2011, ça peut [...]]]></description>
			<content:encoded><![CDATA[<p><a  href="http://www.amicalement-web.net/symfony-1-symfony2-et-django-sont-dans-un-bateau/2010/11/15/"><img src="http://www.amicalement-web.net/wp-content/uploads/bateau.jpg" alt="" title="bateau" width="614" height="100" class="aligncenter size-full wp-image-1505" /></a><br />
Je développe sous <strong>symfony 1</strong> depuis quelques temps et jusqu&#8217;ici j&#8217;en étais plutôt content. La dernière version majeure date de <strong>novembre 2009</strong>, nous en fêtons les 1 an ce mois-ci. Alors certes c&#8217;est un bel anniversaire un an, mais quand on sait que la prochaine version majeure sera <strong>Symfony2, prévue pour Mars 2011</strong>, ça peut faire peur. Petit avis <strong><em>personnel</em></strong>.<br />
<span id="more-1481"></span></p>
<h3>[s|S]ymfony : un homme</h3>
<p>[s|S]ymfony c&#8217;est un homme, une vision : <strong>Fabien Potencier</Strong>. Il y a certes une belle communauté autour, Kris qui s&#8217;occupe des release de la 1.4 notamment, Jon qui était embauché par Sensio pour Doctrine, mais c&#8217;est Fabien qui a toujours <strong>dirigé le développement</strong> du Framework. Depuis quelques temps déjà, Fabien est passé sur le développement de Symfony2, et a donc arrêté tout nouveau développement sur symfony 1. La conséquence immédiate est <strong>l&#8217;absence de quelconque nouveauté depuis plus d&#8217;un an sur symfony 1</strong>, et ce encore pour plusieurs mois.<br />
Alors oui on nous explique que symfony 1.4 marche, certes, mais il continuera donc de se trainer ses défauts jusqu&#8217;à la fin de sa vie : Admin generator qui est là pour faire bien, forms imbriqués qui sont le cauchemard de tout développeur symfony, &#8230; On va aussi vous dire : mais t&#8217;as qu&#8217;à contribuer (oui vous savez, la réponse ultime de toute discussion open source non constructive) ! Le souci c&#8217;est que généralement quand on utilise un Framework, c&#8217;est pour <strong>gagner du temps</strong>, pas pour passer son temps à le développer (je me place du point de vue utilisateur, le cas spécial du contributeur core n&#8217;est pas traité ici). On peut contribuer avec des plugins certes (je suis le premier à le faire dès que je peux), mais pour moi la gestion des forms imbriqués devrait relever du Framework, pas de plugins.</p>
<h3>Ma vision des choses</h3>
<p>Donc si on dresse le tableau après plus d&#8217;<strong>un an de stagnation de symfony 1</strong> :</p>
<ul>
<li>symfony 1 va stagner pendant toute la durée de sa future vie (officiellement novembre 2012)</li>
<li>pour avoir des nouveautés Symfony, il faudra attendre Symfony2 qui est prévu, au plus tôt, Mars 2011</li>
<li>Symfony2 en mars ne sera qu&#8217;une première version, donc loin de toutes les subtilités et fonctionnalités que peut avoir symfony 1</li>
</ul>
<p>Vous allez me dire que ce tableau n&#8217;est pas très réjouissant, j&#8217;en conviens. Ça n&#8217;empêche nullement de démarrer des projets sur symfony 1.4, je le fais encore moi même, mais je pense que ça encourage à <strong>se poser les bonnes questions</strong>. Tiens, peut être qu&#8217;il existerait quelquechose qui pourrait <strong>combler mon manque</Strong>, ma frustration en attendant Symfony2 ? Peut être que je pourrais avoir tout ce que symfony 1 m&#8217;apporte autre part, tout en utilisant quelquechose qui n&#8217;est pas voué à stagner ? Et si en plus je pouvais <strong>apprendre de nouvelles choses</strong>, ça serait top !</p>
<h3>Django, une ouverture d&#8217;esprit ?</h3>
<p>On aime tous évoluer, apprendre (enfin j&#8217;espère), se remettre en question &#8230; Mais beaucoup d&#8217;entre vous ont aussi des objectifs de rentabilité, de sureté vis-à-vis du client. C&#8217;est pourquoi utiliser votre client comme <strong>&laquo;&nbsp;même-pas-alpha-testeur&nbsp;&raquo; de Symfony2</strong>, ça reste encore très risqué et difficile à faire passer à votre direction.<br />
Il existe d&#8217;autres Frameworks, d&#8217;autres langages que le PHP, c&#8217;est peut être l&#8217;occasion, en attendant Symfony2, de les tester sur des projets à faible risque ? En voici quelques un que j&#8217;aimerais tester personnellement : <a  href="http://www.playframework.org/"><strong>Play Framework</strong></a> en Java, <a  href="http://www.djangoproject.com/"><strong>Django</strong></a> en Python et <a  href="http://rubyonrails.org/"><strong>Rails</strong></a> en Ruby. Si vous voulez vraiment avoir un avant goût de Symfony2 et que vous êtes prêts à vous attaquer à la bête, allez voir du côté de <strong><a  href="http://www.springsource.org/">Spring</a></strong> en Java. Même si vous ne les testez que sur un projet, prenez le temps de le faire. Croyez moi, ça vous permettra de prendre du recul, et ça c&#8217;est toujours bon !</p>
<p>Pour ma part, je l&#8217;ai fait pour Django, et j&#8217;en suis très content. On retrouve vite ses petits par rapport à symfony et ça permet de faire un contrastif très intéressant avec symfony. C&#8217;est là qu&#8217;on se rend compte qu&#8217;il arrive, des fois, que l&#8217;herbe soit aussi verte ailleurs (mais pour ça, il faut aller voir).</p>
<p><small>Crédit photo : http://www.flickr.com/photos/clementlivolsi/4566165441/</small></p>
]]></content:encoded>
			<wfw:commentRss>http://www.amicalement-web.net/symfony-1-symfony2-et-django-sont-dans-un-bateau/2010/11/15/feed/</wfw:commentRss>
		<slash:comments>15</slash:comments>
		</item>
		<item>
		<title>Dedibox V3 ou Kimsufi ?</title>
		<link>http://www.amicalement-web.net/dedibox-v3-ou-kimsufi/2010/08/30/</link>
		<comments>http://www.amicalement-web.net/dedibox-v3-ou-kimsufi/2010/08/30/#comments</comments>
		<pubDate>Mon, 30 Aug 2010 12:48:12 +0000</pubDate>
		<dc:creator>Vince</dc:creator>
				<category><![CDATA[Réflexion]]></category>
		<category><![CDATA[dedibox]]></category>
		<category><![CDATA[dédié]]></category>
		<category><![CDATA[hébergement]]></category>
		<category><![CDATA[kimsufi]]></category>

		<guid isPermaLink="false">http://www.amicalement-web.net/?p=1419</guid>
		<description><![CDATA[Si vous suivez un peu l&#8217;actualité de l&#8217;hébergement français, vous n&#8217;avez pas pu passer à côté de la nouvelle offre d&#8217;Online : la Dedibox V3 à 14,99 € HT (donc 17,93 € pour le commun des mortels). Peut être un peu moins connu que la Dedibox, mais une autre offre concurrente existe chez OVH : [...]]]></description>
			<content:encoded><![CDATA[<p><a  href="http://www.amicalement-web.net/dedibox-v3-ou-kimsufi/2010/08/30/"><img src="http://www.amicalement-web.net/wp-content/uploads/serveur-dell.png" alt="" title="serveur-dell" width="614" height="100" class="aligncenter size-full wp-image-1467" /></a><br />
Si vous suivez un peu l&#8217;actualité de l&#8217;hébergement français, vous n&#8217;avez pas pu passer à côté de la nouvelle offre d&#8217;<a  href="http://www.online.net/serveur-dedie/offre-dedibox-v3.xhtml">Online : la Dedibox V3 à 14,99 € HT</a> (donc 17,93 € pour le commun des mortels). Peut être un peu moins connu que la Dedibox, mais une autre offre concurrente existe chez <a  href="http://www.kimsufi.com/ks/">OVH : le Kimsufi à 14,99 € HT</a> (voir la remarque plus haut pour le commun des mortels). Outre le concours du nom le plus douteux qui est remporté haut la main par OVH, y a-t-il de réelles différences entre ces deux offres ? Possédant les deux modèles depuis quelques mois, je vous fais un rapide tour d&#8217;horizon.<br />
<span id="more-1419"></span></p>
<h3>Matériel et connectivité</h3>
<p>Au moment où j&#8217;écris ces lignes, les caractéristiques principales de la <strong>dedibox</strong> sont :</p>
<ul>
<li>Serveur : <a  href="http://en.community.dell.com/dell-blogs/direct2dell/b/direct2dell/archive/2009/05/19/dell-launches-quot-fortuna-quot-via-nano-based-server-for-hyperscale-customers.aspx">Dell XS11-VX8</a></li>
</li>
<li>CPU : Nano U2250 1,6Ghz</li>
<li>Disque dur : 160Go SATA2</li>
<li>RAM : 2 Go DDR2</li>
<li>Réseau : 1 Gbit/s</li>
</ul>
<p>En ce qui concerne le <strong>kimsufi</strong> voilà ce à quoi on a le droit :</p>
<ul>
<li>Serveur : certainement un assemblage maison, aucune info</li>
<li>CPU : Celeron D/215/220 1,2 Ghz</li>
<li>Disque dur : 250 Go (non précisé)</li>
<li>RAM : 2 Go (non précisé)</li>
<li>Réseau : 100 Mbit/s</li>
</ul>
<p>Pour le côté matériel, j&#8217;aurais un petit faible pour la Dedibox. Même si le disque dur est moins important, le processeur Nano est au dessus du Celeron. De plus, les serveurs étant fournis par Dell, on peut espérer une relative qualité du produit. Idem pour la connectivité, la Dedibox dispose d&#8217;un débit 10 fois supérieur au Kimsufi.</p>
<h3>Les services</h3>
<p>Les deux sont plutôt bien fournies en services. Elles disposent chacune d&#8217;une console d&#8217;administration riche en fonctionnalités où vous pourrez réinstaller le serveur, le monitorer, configurer vos options (reverse DNS notamment), démarrer sur un système de secours, j&#8217;en passe et des meilleurs. À vrai dire, il y a tellement de trucs dans l&#8217;une et dans l&#8217;autre qu&#8217;il est bien difficile de les départager sur ce terrain là. L&#8217;essentiel y est. </p>
<p>En revanche, Kimsufi propose un espace de sauvegarde FTP de 100 Go, contre 5 Go (extensible à 200 Go via un abonnement) pour la Dedibox. De plus Kimsufi propose une connectivité IPv6 alors que Dedibox ne le précise pas (si vous avez des infos je suis preneur).</p>
<h3>La fiabilité</h3>
<p>Ça va faire plus d&#8217;un an et demi que j&#8217;ai ma Kimsufi, je n&#8217;ai jamais eu une coupure dessus. Donc niveau fiabilité rien à redire.<br />
Pour la Dedibox, j&#8217;ai eu la V2 pendant plusieurs années aussi sans avoir à m&#8217;en plaindre. Pour la V3, j&#8217;ai du malheureusement la remplacer au bout de quelques semaines (alors qu&#8217;elle ne servait même pas) car il m&#8217;était impossible d&#8217;y accéder, et impossible de démarrer avec le système de secours. Le remplacement est d&#8217;ailleurs automatique via la console d&#8217;administration. Un défaut de jeunesse ou un coup de pas de chance ? Toujours est-il que je n&#8217;ai pas eu d&#8217;autres soucis depuis.</p>
<h3>Les frais et conditions</h3>
<p>Alors certes il faut lire entre les petites lignes, mais vous avez des frais d&#8217;installation pour les deux. Ils sont de 49,99 € HT (59.79€ TTC) pour Kimsufi et de 39.99€ HT (soit 47.83€ TTC) pour la Dedibox. À noter qu&#8217;ils sont offerts chez OVH si vous vous abonnez à l&#8217;année.<br />
Car c&#8217;est aussi une des caractéristiques de ces offres, vous pouvez résilier votre serveur quand vous le souhaitez, c&#8217;est &laquo;&nbsp;sans engagement&nbsp;&raquo;. Pour les deux, cela se fait relativement facilement via la console d&#8217;administration.</p>
<h3>Bon bah et alors ?</h3>
<p>Malgré ce que pourraient laisser penser les caractéristiques techniques de la Dedibox, je pense que si j&#8217;avais un autre serveur dédié à prendre, je prendrai le Kimsufi. Je n&#8217;ai pas besoin de grosses performances, mais plutôt d&#8217;un espace disque conséquent. J&#8217;aime aussi la sauvegarde 100 Go par défaut. Et je crois que mon problème avec la Dedibox m&#8217;a plutôt refroidi.<br />
Pour finir, avec Kimsufi vous pouvez payer par CB tous les mois (et non par virement comme avec la Dedibox), et arrêter quand vous voulez sans ne faire aucune démarche : vous avez juste à arrêter de payer, et la résiliation se fera automatiquement.</p>
<p><small>Crédit photo : http://www.flickr.com/photos/johnseb/3425464/</small></p>
]]></content:encoded>
			<wfw:commentRss>http://www.amicalement-web.net/dedibox-v3-ou-kimsufi/2010/08/30/feed/</wfw:commentRss>
		<slash:comments>15</slash:comments>
		</item>
		<item>
		<title>Twitter et Facebook sont has-been, utilisez Github !</title>
		<link>http://www.amicalement-web.net/twitter-et-facebook-sont-has-been-utilisez-github/2010/05/26/</link>
		<comments>http://www.amicalement-web.net/twitter-et-facebook-sont-has-been-utilisez-github/2010/05/26/#comments</comments>
		<pubDate>Wed, 26 May 2010 12:58:30 +0000</pubDate>
		<dc:creator>Vince</dc:creator>
				<category><![CDATA[Réflexion]]></category>
		<category><![CDATA[git]]></category>
		<category><![CDATA[github]]></category>
		<category><![CDATA[svn]]></category>
		<category><![CDATA[web]]></category>

		<guid isPermaLink="false">http://www.amicalement-web.net/?p=1381</guid>
		<description><![CDATA[Alors oui ce titre est racoleur et débile, et alors ? ;-) Pour ceux qui ne connaissent pas encore Github, c&#8217;est ce qu&#8217;on appelle une &#171;&#160;forge&#160;&#187;. La plus connue étant Sourceforge, qui permet d&#8217;héberger des projets opensource (code, wiki, bug tracker, &#8230;). Comme Sourceforge, Github propose d&#8217;héberger gratuitement des projets opensource, et met à disposition [...]]]></description>
			<content:encoded><![CDATA[<p><a  href="http://www.amicalement-web.net/twitter-et-facebook-sont-has-been-utilisez-github/2010/05/26/#more-1381"><img src="http://www.amicalement-web.net/wp-content/uploads/entete_github.png" alt="" title="entete_github" width="614" height="100" class="aligncenter size-full wp-image-1138" /></a><br />
Alors oui ce titre est racoleur et débile, et alors ? ;-) Pour ceux qui ne connaissent pas encore <a  href="http://www.github.com">Github</a>, c&#8217;est ce qu&#8217;on appelle une &laquo;&nbsp;forge&nbsp;&raquo;. La plus connue étant <a  href="http://www.sourceforge.com">Sourceforge</a>, qui permet d&#8217;héberger des projets opensource (code, wiki, bug tracker, &#8230;).<br />
Comme Sourceforge, <strong>Github propose d&#8217;héberger gratuitement des projets opensource</strong>, et met à disposition tous les outils pour gérer son projet. Mais la ressemblance s&#8217;arrête là, <strong>Github, c&#8217;est bien plus que ça</strong>.<br />
<span id="more-1381"></span></p>
<h3>SVN vs Git</h3>
<p>Tout d&#8217;abord, Sourceforge utilise un système de gestion de code source appelé SVN (j&#8217;espère ne rien vous apprendre ici) alors que Github utilise un <strong>système de gestion de code source décentralisé appelé Git</strong>. </p>
<p>Vous voyez la préhistoire ? Vous voyez les temps modernes ? Vous voyez donc la différence entre SVN et Git. Je ne vais pas vous faire un cours sur Git ici, ce n&#8217;est pas le propos (et d&#8217;autres le font très bien dans le <a  href="http://www.progit.org">Pro Git book</a>). Mais une fois que vous aurez goûté à Git, vous trouverez SVN &laquo;&nbsp;so 2 thousand&nbsp;&raquo;. </p>
<p>Si vous utilisez encore SVN, ça ne peut être que parce que vous n&#8217;avez pas encore pris le temps d&#8217;apprendre à utiliser <a  href="http://en.wikipedia.org/wiki/Distributed_Concurrent_Versions_System">un système de gestion de code source décentralisé</a> (Git ou Mercurial par exemple). Un conseil : <strong>prenez ce temps</strong>, ça vous rendra bien des services.</p>
<h3>Github : mes amis les codeurs</h3>
<p>Comme je le laissais entrevoir habilement dans le titre de cet article, Github c&#8217;est un peu le Facebook des codeurs. Vous ne pouvez pas vraiment demander aux personnes d&#8217;être vos amis, mais vous pouvez suivre leur activité (un peu à la Twitter). Vous avez donc une page récapitulative qui vous permet de <strong>suivre l&#8217;activité des personnes</strong> ou des projets que vous souhaitez.</p>
<a  href="http://www.amicalement-web.net/wp-content/uploads/timeline_github.png"><img src="http://www.amicalement-web.net/wp-content/uploads/timeline_github.png" alt="Timeline Github" title="timeline_github" width="599" height="522" class="size-full wp-image-1394" /></a>
<p>Vous aurez aussi la possibilité de voir les projets que vos &laquo;&nbsp;amis&nbsp;&raquo; se mettent à suivre. Je n&#8217;ai jamais autant découvert de projets que depuis que j&#8217;utilise Github. Si vous souhaitez être au courant des dernières évolutions, des projets en vogue, Github est fait pour vous.</p>
<h3>La collaboration c&#8217;est bon, mangez en</h3>
<p>Puisque vous êtes sages et disciplinés, vous avez été lire le livre &laquo;&nbsp;Pro Git&nbsp;&raquo; et vous savez maintenant tout sur Git. </p>
<p>Github utilise pleinement les capacités de Git et va permettre de <strong>&laquo;&nbsp;forker&nbsp;&raquo;</strong> un projet via le site. En gros ça va vous créer une branche du projet dans votre compte. Vous pourrez faire des modifications dans votre branche et ensuite demander un &laquo;&nbsp;pull request&nbsp;&raquo; au responsable du projet : il verra vos modifications et pourra en un click les intégrer au projet principal. C&#8217;est du jamais vu ma bonne dame ! </p>
<p><strong>Tout le monde peut forker tous les projets et essayer de contribuer</strong> à la hauteur de ses compétences. Vous pouvez même commenter les lignes du code source directement sur le site, de manière à échanger avec les autres codeurs.</p>
<h3>La cerise sur le gâteau</h3>
<p>Je viens de vous dire que Git c&#8217;était l&#8217;avenir, que Github vous permettait de suivre et de découvrir plein de projets intéressants et qu&#8217;en plus il facilitait la collaboration entre les codeurs. Pour finir de vous convaincre, voici en vrac quelques petits &laquo;&nbsp;plus Periglioni&nbsp;&raquo; :</p>
<ul>
<li><strong>Import automatique d&#8217;un projet sous SVN</strong> avec conservation de l&#8217;historique des commits</li>
<li>Lecture et écriture possible via un <strong>client SVN</strong> sur les repos Github (alors si même avec ça vous passez pas à Git, je peux plus rien pour vous)</li>
<li>Possibilité de créer des <strong>projets privés</strong> (moyennant une modique somme)</li>
</ul>
<p>Alors, hop hop hop, on s&#8217;y met et plus vite que ça !</p>
]]></content:encoded>
			<wfw:commentRss>http://www.amicalement-web.net/twitter-et-facebook-sont-has-been-utilisez-github/2010/05/26/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Symfony, les forms et les forms embarqués</title>
		<link>http://www.amicalement-web.net/symfony-les-forms-et-les-forms-embarques/2010/03/08/</link>
		<comments>http://www.amicalement-web.net/symfony-les-forms-et-les-forms-embarques/2010/03/08/#comments</comments>
		<pubDate>Mon, 08 Mar 2010 10:00:00 +0000</pubDate>
		<dc:creator>Vince</dc:creator>
				<category><![CDATA[Tutorials]]></category>
		<category><![CDATA[conception]]></category>
		<category><![CDATA[embed]]></category>
		<category><![CDATA[form]]></category>
		<category><![CDATA[poo]]></category>
		<category><![CDATA[Symfony]]></category>

		<guid isPermaLink="false">http://www.amicalement-web.net/?p=896</guid>
		<description><![CDATA[Tout d&#8217;abord admirez, dans le titre, cette traduction d&#8217;embedded forms , qui est digne d&#8217;un Nelson (ou d&#8217;un ubermuda) en pleine forme. Maintenant que c&#8217;est fait, nous allons parler ici d&#8217;un des aspects de symfony les plus intéressant, mais aussi d&#8217;un des moins bien documenté. Pas que les forms &#171;&#160;basiques&#160;&#187; ne soient pas documentés, mais [...]]]></description>
			<content:encoded><![CDATA[<p><a  href="http://www.amicalement-web.net/symfony-les-forms-et-les-forms-embarques/2010/03/08/"><img src="http://www.amicalement-web.net/wp-content/uploads/boats.jpg" alt="" title="boats" width="614" height="100" class="alignnone size-full wp-image-1368" /></a> Tout d&#8217;abord admirez, dans le titre, cette traduction d&#8217;<em>embedded forms</em> , qui est digne d&#8217;un Nelson (ou d&#8217;un ubermuda) en pleine forme. </p>
<p>Maintenant que c&#8217;est fait, nous allons parler ici d&#8217;un des aspects de symfony les plus intéressant, mais aussi d&#8217;un des moins bien documenté. Pas que les forms &laquo;&nbsp;basiques&nbsp;&raquo; ne soient pas documentés, mais dès que vous voulez faire autre chose qu&#8217;un form qui représente tel quel (ou presque) un objet de la base de données, ça se complique un peu. </p>
<p>Je vais essayer de vous faire un petit tour d&#8217;horizon de <strong>ce qu&#8217;on peut faire avec les embedded forms</strong>.<br />
<span id="more-896"></span></p>
<h3>Les forms, c&#8217;est de la POO</h3>
<p>Vous allez me dire que tout symfony est de la POO (Programmation Orientée Objet), et vous avez raison. Mais on peut utiliser symfony sans être un expert de la POO (voire sans vraiment savoir ce que c&#8217;est), en suivant Jobeet et en comprenant que executeIndex inclut le template indexSuccess.php en cas de succès. À partir de là, on est le roi du monde. </p>
<p>Enfin, du monde, moins les forms. Car les forms sont &#8211; à mon sens &#8211; la partie de symfony qui est à la fois utilisée par tous les utilisateurs de symfony, et à la fois<strong> très orientée objet </strong>(les factories sont par exemple beaucoup moins utilisées &#8230;). Du coup, ça mérite quelques explications.</p>
<h3>Tout le monde n&#8217;est pas doué en POO</h3>
<p>Certes tout le monde n&#8217;est pas doué en POO, professionnel ou pas d&#8217;ailleurs ;) À l&#8217;inverse de JAVA où les programmeurs n&#8217;ont pas vraiment le choix, la POO est récente dans PHP et certains l&#8217;ont découvert comme un cheveu sur la soupe. </p>
<p>L&#8217;impression que l&#8217;on a quand on essaye de changer le comportement des embed form c&#8217;est : mais <strong>où est-ce que je peux bien faire ce que j&#8217;ai envie de faire</strong>? doBind, doUpdateObject, saveEmbeddedForms, &#8230; les choix sont multiples. </p>
<p>Et pour cause, les forms utilisent énormément l&#8217;héritage, et disposent donc de moultes méthodes que l&#8217;on peut surcharger, sans que ce ne soit vraiment documenté autre part que dans l&#8217;API. Si on ne comprend pas les principes de base de la POO, les forms sont une vraie galère (déjà que quand on les comprend &#8230;). </p>
<p>Petit rappel sur la POO sur <a href="http://hdd34.developpez.com/cours/artpoo/ ">developpez.com</a> : Consultez au moins la partie sur l&#8217;héritage pour ceux qui sont largués.</p>
<h3>Principales étapes de gestion des formulaires</h3>
<p>Il faut quand même que vous ayez quelque chose à l&#8217;esprit, il y a pour moi deux principales étapes quand vous souhaitez traiter un formulaire qui vient d&#8217;être soumis :</p>
<ul>
<li><strong>1 ère étape</strong> : lier les valeurs qui sont récupérées dans la requête à l&#8217;objet Form (c&#8217;est à dire les recopier en s&#8217;assurant qu&#8217;elles sont valides et nettoyées)</li>
<li><strong>2 ème étape</strong> : Une fois les valeurs recopiés dans le $values du formulaire (qui n&#8217;est en fait qu&#8217;un tableau de valeurs nettoyées), réaliser un traitement dessus ou sur l&#8217;objet qui en découlera (nous verrons cela par la suite)</li>
</ul>
<p>
Il est toujours bon de <strong>se demander ce que l&#8217;on veut faire exactement</strong> : agir sur les valeurs qui seront recopiées et validées dans notre form, ou alors agir sur les valeurs nettoyées et recopiées, avant qu&#8217;elles ne soient sauvegardées en base.
</p>
<h4>Première étape</h4>
<p>Lors de la première étape de liaison/validation/recopie des valeurs de la requête dans votre formulaire (votre objet Form), vous pourrez agir sur les données<strong> avant qu&#8217;elles ne soient passées dans les validateurs</strong>, ou alors une fois qu&#8217;elles sont passées dans les validateurs.</p>
<p>Vous pourrez faire votre bourrin : enlever des parties de votre formulaire de la requête en vous basant sur certaines valeurs soumises.<br />
Par exemple enlever tout un formulaire embarqué, si certaines valeurs ne sont pas saisies (c&#8217;est l&#8217;exemple qu&#8217;on trouve pas mal sur le web d&#8217;ailleurs).<br />
Petit souci : les valeurs de la requête n&#8217;auront pas été validées/nettoyées par les validateurs, vous vous exposez donc à quelques soucis (dans le style le gars qui n&#8217;aura rempli que des espaces dans un champ texte, faudra penser à faire vous même le trim avant de vérifier la valeur &#8230;).<br />
<h4>Deuxième étape</h4>
<p>
Lors de la deuxième étape, c&#8217;est ici que vous devrez effectuer<strong> les traitements concernant votre logique métier</strong> à proprement parler. La première étape s&#8217;est occupée de vous donner accès aux valeurs dans votre formulaire (via le tableau $values), maintenant que c&#8217;est fait vous pouvez jouer avec.</p>
<p>
Vous voulez mettre à jour un objet qui dépend de celui que vous allez sauvegarder automatiquement, vous souhaitez insérer votre objet dans un nested set, etc etc &#8230; C&#8217;est dans cette étape que vous ferez ça.
</p>
<p>
Je sépare sciemment le processus en deux étapes, après vous pouvez le voir autrement. Les étapes étant chaînées, vous pouvez les mélanger et faire un peu de business logic à la fin de l&#8217;étape 1 par exemple, mais essayez de rester constant partout dans votre code, où vous ne saurez plus où aller voir quand il y a un souci.
</p>
<h3>Étude de cas</h3>
<p>On va prendre ici un cas tout simple, celui d&#8217;un formulaire auto-généré par doctrine à partir d&#8217;une table de votre modèle. </p>
<p>Appelons notre modèle PetitSuisse. On aura donc une classe nommée <code>PetitSuisseForm.class.php dans lib/form/doctrine/</code></p>
<p>On va vite fait faire le parcours d&#8217;héritage de cette classe :<br />
<strong>PetitSuisseForm => BasePetitSuisseForm => BaseFormDoctrine => sfFormDoctrine => sfFormObject => BaseForm => sfFormSymfony => sfForm (ouf)</strong>
</p>
<p>
Même si quelques unes de ces classes sont vides, on comprend que ça puisse devenir un peu dur de savoir où chercher. Alors oui <strong>l&#8217;abstraction c&#8217;est bon</strong> mangez en, mais ça engendre une complexité de lecture du code non négligeable.</p>
<p>Les classes qui sont &laquo;&nbsp;à vous&nbsp;&raquo; et donc dans lesquelles vous pourrez surcharger des méthodes sont <strong>PetitSuisseForm</strong> et <strong>BaseFormDoctrine</strong>.</p>
<p> La première vous permettra de surcharger une méthode relative au formulaire du modèle PetitSuisse, la deuxième vous permettra de surcharger de manière plus globale (chacun des forms auto-générés par doctrine héritant de BaseFormDoctrine). Je parle ici de symfony 1.3+, vous n&#8217;aurez pas toutes ces classes dans les versions précédentes.</p>
<p>On va maintenant parler <strong>des principales méthodes</strong> que vous aurez (peut être) à surcharger. Il en existe d&#8217;autres, si celles ci ne vous vont pas, lisez le code de symfony ;-)
</p>
<h3>1 ère étape (liaison)</h3>
<h4>doBind(array $values)</h4>
<p>
C&#8217;est la méthode qui va faire appel aux validateurs pour <strong>nettoyer les valeurs</strong> de la requête avant de les placer dans le tableau des valeurs. Ce sont ensuite sur ces valeurs nettoyées que nous travaillerons. Vous pouvez ici toucher aux données brut de pomme <strong>qui sortent directement du formulaire envoyé</strong>, sans traitement préalable.
</p>
<h3>2 ème étape (sauvegarde)</h3>
<h4>doSave($con = null)</h4>
<p>
C&#8217;est cette méthode qui sera appelée (par save() ) lorsque vous demandez la sauvegarde de votre formulaire. Elle se charge de mettre à jour votre objet avec les valeurs du form en appelant updateObject (qui appelera doUpdateObject que nous verrons par la suite).<br />
Si vous souhaitez <strong>changer le processus de sauvegarde</strong>, ajouter par exemple l&#8217;appel d&#8217;une vos méthodes à chaque sauvegarde du formulaire (pourquoi pas garder trace dans un fichier de toutes les sauvegardes de vos formulaires), c&#8217;est ici que vous devez le faire.
</p>
<h4>processValues($values)</h4>
<p>
C&#8217;est ici que vous pouvez<strong> toucher les valeurs qui ont été nettoyées </strong>par les validateurs, avant qu&#8217;elles ne soient passées à la méthode updateObject (que nous verrons par la suite). Je n&#8217;ai pas de traitement particulier en tête, mais l&#8217;idée est là : modifier des valeurs avant qu&#8217;elles ne soient utilisées pour mettre votre objet à jour.
</p>
<h4>doUpdateObject($values)</h4>
<p>
C&#8217;est cette méthode que vous devrez surcharger si vous voulez réaliser <strong>une opération spéciale sur votre objet avant qu&#8217;il ne soit enregistré</strong> dans la base.<br />
Par exemple, si vous voulez insérer cet objet à la fin d&#8217;un NestedSet, vous ferez ça ici. Le $values passé en paramètre est un tableau contenant les valeurs du formulaire, une fois qu&#8217;elles ont été nettoyées/vérifiées par les validateurs.
</p>
<h4>updateObjectEmbeddedForm($values)</h4>
<p>
Je pense qu&#8217;elle veut bien dire ce qu&#8217;elle veut dire. Elle va se charger d&#8217;appeler la fonction updateObject de chaque formulaire embarqué. Vous voulez agir sur le traitement des données par vos forms embarqués ? C&#8217;est par ici !
</p>
<h4>saveEmbeddedForms($con = null, $forms = null)</h4>
<p>
Allez la petite dernière pour la route : elle se charge de la sauvegarde de chacun des objets de vos forms embarqués. Fabien Potencier en donne un exemple de surcharge dans le livre <a  href="http://www.symfony-project.org/more-with-symfony/1_4/en/06-Advanced-Forms#chapter_06_sub_creating_a_custom_validator">&laquo;&nbsp;More with symfony&nbsp;&raquo;</a>
</p>
<h3>Exemple d&#8217;utilisation</h3>
<p>C&#8217;est bien beau de parler, mais un peu de concret ne fait pas de mal. </p>
<p>Vous trouverez un bon exemple pour comprendre le comportement des forms sur le blog de n1k0 dans son article <a  href="http://prendreuncafe.com/blog/post/2009/11/29/Embedding-Relations-in-Forms-with-Symfony-1.3-and-Doctrine">Embedding Relations in Forms with Symfony 1.3 and Doctrine</a>. Certes c&#8217;est en anglais, mais le code est universel ! Si vous avez des bons articles en français je suis preneur aussi. </p>
<p>Il existe maintenant la méthode embedRelation() et le plugin de Daniel Lohse <a  href="http://github.com/annismckenzie/ahDoctrineEasyEmbeddedRelationsPlugin">ahDoctrineEasyEmbeddedRelationsPlugin</a> qui font ça tout seul. Mais c&#8217;est toujours bien de comprendre ce que l&#8217;on fait ;-)</p>
<h3>Conclusion</h3>
<p>Je vous ai fait un petit tour d&#8217;horizon des principales méthodes que vous pouvez surcharger dans votre formulaire. Comme je l&#8217;ai dit plus haut, ce n&#8217;est pas une liste exhaustive, mais vous devriez avoir de quoi vous amuser. </p>
<p>J&#8217;ai juste essayé de voir tout cela d&#8217;une manière un peu plus globale et de ne pas proposer un n-ième exemple de code pour les formulaires embarqués. </p>
<p>Mais avec tout cet attirail, gardez à l&#8217;esprit que votre code d&#8217;action ne doit pas dépasser le classique <code>Bind &gt; Save</code>! Ce qui est au traitement de votre formulaire, reste dans votre formulaire! Enjoy!</p>
<p><small>Crédit photo: http://www.flickr.com/photos/fromeyetopixel/2470999873/</small></p>
]]></content:encoded>
			<wfw:commentRss>http://www.amicalement-web.net/symfony-les-forms-et-les-forms-embarques/2010/03/08/feed/</wfw:commentRss>
		<slash:comments>15</slash:comments>
		</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! -->
