<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>Le Blog du Geek Joyeux</title>
    <description>Plus moins vite tu codes, moins plus vite &#231;a plante</description>
    <link>http://blog.happynoff.fr</link>
    <pubDate>Fri, 03 Feb 2012 18:03:09 +0100</pubDate>
    <item>
      <title>D&#233;finir une ressource Active Admin dans une gem</title>
      <link>http://blog.happynoff.fr/post/Definir-une-ressource-Active-Admin-dans-une-gem</link>
      <guid>http://blog.happynoff.fr/post/Definir-une-ressource-Active-Admin-dans-une-gem</guid>
      <description>&lt;p&gt;Si vous utilisez &lt;a href='http://activeadmin.info/'&gt;Active Admin&lt;/a&gt; pour g&#233;n&#233;rer vos interfaces d&amp;#8217;administration sous Rails, voici une technique pour d&#233;finir des ressources depuis un engine.&lt;/p&gt;

&lt;h2 id='d&#233;finir_la_ressource'&gt;D&#233;finir la ressource&lt;/h2&gt;

&lt;p&gt;Pour une question de simplicit&#233;, je place mes ressources dans un dossier &lt;code&gt;admin&lt;/code&gt; situ&#233; dans le dossier &lt;code&gt;lib/my_engine&lt;/code&gt; de mon engine.&lt;/p&gt;
&lt;div class='CodeRay'&gt;
  &lt;div class='code'&gt;&lt;pre class='ruby'&gt;&lt;span class='c'&gt;# lib/my_engine/admin/articles.rb&lt;/span&gt;&lt;br&gt;&lt;span class='r'&gt;if&lt;/span&gt; &lt;span class='r'&gt;defined?&lt;/span&gt;(&lt;span class='co'&gt;ActiveAdmin&lt;/span&gt;)&lt;br&gt;  &lt;span class='co'&gt;ActiveAdmin&lt;/span&gt;.register &lt;span class='co'&gt;Article&lt;/span&gt; &lt;span class='r'&gt;do&lt;/span&gt;&lt;br&gt;    &lt;span class='c'&gt;# personnalisez ici votre ressource&lt;/span&gt;&lt;br&gt;  &lt;span class='r'&gt;end&lt;/span&gt;&lt;br&gt;&lt;span class='r'&gt;end&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;h2 id='charger_la_ressource'&gt;Charger la ressource&lt;/h2&gt;

&lt;p&gt;Le probl&#232;me auquel j&amp;#8217;ai &#233;t&#233; confront&#233; au d&#233;but &#233;tait celui du chargement de cette ressource.&lt;/p&gt;

&lt;p&gt;Na&#239;vement, je l&amp;#8217;avais plac&#233;e dans &lt;code&gt;app/admin/articles.rb&lt;/code&gt; dans mon engine mais elle n&amp;#8217;&#233;tait pas charg&#233;e par l&amp;#8217;application. Je l&amp;#8217;ai ensuite plac&#233;e dans &lt;code&gt;lib/my_engine/admin&lt;/code&gt; et ai appel&#233; &lt;code&gt;require&lt;/code&gt; dessus. Le probl&#232;me est que le mod&#232;le &lt;code&gt;Article&lt;/code&gt; n&amp;#8217;&#233;tait pas encore d&#233;fini au moment de l&amp;#8217;appel &#224; &lt;code&gt;register&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;J&amp;#8217;ai donc fait appel &#224; &lt;code&gt;after_initialize&lt;/code&gt; dans la d&#233;finition de l&amp;#8217;engine:&lt;/p&gt;
&lt;div class='CodeRay'&gt;
  &lt;div class='code'&gt;&lt;pre class='ruby'&gt;&lt;span class='c'&gt;# lib/my_engine/engine.rb&lt;/span&gt;&lt;br&gt;&lt;span class='r'&gt;module&lt;/span&gt; &lt;span class='cl'&gt;MyEngine&lt;/span&gt;&lt;br&gt;  &lt;span class='r'&gt;class&lt;/span&gt; &lt;span class='cl'&gt;Engine&lt;/span&gt; &amp;lt; &lt;span class='co'&gt;Rails&lt;/span&gt;::&lt;span class='co'&gt;Engine&lt;/span&gt;&lt;br&gt;    config.after_initialize &lt;span class='r'&gt;do&lt;/span&gt;&lt;br&gt;      require &lt;span class='s'&gt;&lt;span class='dl'&gt;'&lt;/span&gt;&lt;span class='k'&gt;my_engine/admin/articles&lt;/span&gt;&lt;span class='dl'&gt;'&lt;/span&gt;&lt;/span&gt;&lt;br&gt;    &lt;span class='r'&gt;end&lt;/span&gt;&lt;br&gt;  &lt;span class='r'&gt;end&lt;/span&gt;&lt;br&gt;&lt;span class='r'&gt;end&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Ce n&amp;#8217;est peut &#234;tre pas la solution la plus optimale ou la plus propre. Je serais d&amp;#8217;ailleurs ravi d&amp;#8217;avoir une solution alternative plus efficace. Celle-l&#224; a le m&#233;rite de fonctionner : ).&lt;/p&gt;</description>
      <pubDate>Fri, 03 Feb 2012 18:03:09 +0100</pubDate>
    </item>
    <item>
      <title>size doesn't COUNT</title>
      <link>http://blog.happynoff.fr/post/size-doesn-t-COUNT</link>
      <guid>http://blog.happynoff.fr/post/size-doesn-t-COUNT</guid>
      <description>&lt;h2 id='requ&#234;tes_n1'&gt;Requ&#234;tes N+1&lt;/h2&gt;

&lt;p&gt;Lorsque vous d&#233;veloppez avec Rails, vous devez bien s&#251;r faire attention aux requ&#234;tes qui sont effectu&#233;es et surtout &#233;viter les requ&#234;tes &lt;em&gt;N+1&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Les requ&#234;tes &lt;em&gt;N+1&lt;/em&gt; sont celles qui sont lanc&#233;es pour chaque &#233;l&#233;ment d&amp;#8217;une liste.&lt;/p&gt;

&lt;p&gt;Prenons l&amp;#8217;exemple suivant :&lt;/p&gt;
&lt;div class='CodeRay'&gt;
  &lt;div class='code'&gt;&lt;pre class='ruby'&gt;&lt;span class='c'&gt;# Dans le contr&#244;leur&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span class='iv'&gt;@articles&lt;/span&gt; = &lt;span class='co'&gt;Article&lt;/span&gt;.all&lt;br&gt;&lt;span class='c'&gt;# SELECT articles.* FROM articles&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span class='c'&gt;# Dans la vue&lt;/span&gt;&lt;br&gt;&lt;br&gt;&amp;lt;&lt;span class='s'&gt;&lt;span class='dl'&gt;% &lt;/span&gt;&lt;span class='k'&gt;@articles.each&lt;/span&gt;&lt;span class='dl'&gt; &lt;/span&gt;&lt;/span&gt;&lt;span class='r'&gt;do&lt;/span&gt; |article| &lt;span class='s'&gt;&lt;span class='dl'&gt;%&amp;gt;&lt;/span&gt;&lt;span class='k'&gt;&lt;br&gt;  ...&lt;br&gt;  Nombre de commentaires: &amp;lt;%= articles.comments.count %&lt;/span&gt;&lt;span class='dl'&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;  &lt;span class='c'&gt;# SELECT COUNT(*) FROM comments WHERE comments.article_id = XY&lt;/span&gt;&lt;br&gt;  ...&lt;br&gt;&amp;lt;&lt;span class='s'&gt;&lt;span class='dl'&gt;% &lt;/span&gt;&lt;span class='k'&gt;end&lt;/span&gt;&lt;span class='dl'&gt; &lt;/span&gt;&lt;/span&gt;%&amp;gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Pour chaque article list&#233;, une requ&#234;te va &#234;tre lanc&#233;e pour compter ses commentaires.&lt;/p&gt;

&lt;p&gt;Heureusement pour nous, Rails fournit, dans l&amp;#8217;API d&amp;#8217;ActiveRecord un moyen d&amp;#8217;&#233;viter ces requ&#234;tes &lt;em&gt;N+1&lt;/em&gt;. Il s&amp;#8217;agit de la m&#233;thode &lt;code&gt;includes&lt;/code&gt; qui s&amp;#8217;utilise comme ceci :&lt;/p&gt;
&lt;div class='CodeRay'&gt;
  &lt;div class='code'&gt;&lt;pre class='ruby'&gt;&lt;span class='iv'&gt;@articles&lt;/span&gt; = &lt;span class='co'&gt;Article&lt;/span&gt;.includes(&lt;span class='sy'&gt;:comments&lt;/span&gt;).all&lt;br&gt;&lt;span class='c'&gt;# SELECT articles.* FROM articles&lt;/span&gt;&lt;br&gt;&lt;span class='c'&gt;# SELECT comments.* FROM comments WHERE comments.article_id IN (1, 2, ..., 42)&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;On peut donc voir ici que l&amp;#8217;ensemble des commentaires est r&#233;cup&#233;r&#233; d&amp;#8217;un seul coup. Cela nous permet d&amp;#8217;acc&#233;der aux informations des commentaires d&amp;#8217;un article sans requ&#234;te suppl&#233;mentaire.&lt;/p&gt;

&lt;h2 id='size_vs_count'&gt;Size vs. Count&lt;/h2&gt;

&lt;p&gt;Le souci c&amp;#8217;est que &#231;a ne r&#232;gle pas notre probl&#232;me de &lt;code&gt;count&lt;/code&gt;. En effet, si nous faisons de nouveau appel &#224; count, les requ&#234;tes seront tout de m&#234;me effectu&#233;es !&lt;/p&gt;

&lt;p&gt;L&amp;#8217;astuce est donc d&amp;#8217;utiliser &lt;code&gt;size&lt;/code&gt; plut&#244;t que &lt;code&gt;count&lt;/code&gt; sur l&amp;#8217;attribut &lt;code&gt;comments&lt;/code&gt; de nos articles, ce qui va simplement retourner la taille du tableau contenant les commentaires associ&#233;s. Ces derniers &#233;tant d&#233;j&#224; charg&#233;s, le compte est bon !&lt;/p&gt;
&lt;div class='CodeRay'&gt;
  &lt;div class='code'&gt;&lt;pre class='ruby'&gt;&lt;span class='c'&gt;# Dans le contr&#244;leur&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span class='iv'&gt;@articles&lt;/span&gt; = &lt;span class='co'&gt;Article&lt;/span&gt;.includes(&lt;span class='sy'&gt;:comments&lt;/span&gt;).all&lt;br&gt;&lt;span class='c'&gt;# SELECT articles.* FROM articles&lt;/span&gt;&lt;br&gt;&lt;span class='c'&gt;# SELECT comments.* FROM comments WHERE comments.article_id IN (1, 2, ..., 42)&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span class='c'&gt;# Dans la vue&lt;/span&gt;&lt;br&gt;&lt;br&gt;&amp;lt;&lt;span class='s'&gt;&lt;span class='dl'&gt;% &lt;/span&gt;&lt;span class='k'&gt;@articles.each&lt;/span&gt;&lt;span class='dl'&gt; &lt;/span&gt;&lt;/span&gt;&lt;span class='r'&gt;do&lt;/span&gt; |article| &lt;span class='s'&gt;&lt;span class='dl'&gt;%&amp;gt;&lt;/span&gt;&lt;span class='k'&gt;&lt;br&gt;  ...&lt;br&gt;  Nombre de commentaires: &amp;lt;%= articles.comments.size %&lt;/span&gt;&lt;span class='dl'&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;  ...&lt;br&gt;&amp;lt;&lt;span class='s'&gt;&lt;span class='dl'&gt;% &lt;/span&gt;&lt;span class='k'&gt;end&lt;/span&gt;&lt;span class='dl'&gt; &lt;/span&gt;&lt;/span&gt;%&amp;gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;</description>
      <pubDate>Tue, 17 Jan 2012 10:16:15 +0100</pubDate>
    </item>
    <item>
      <title>Versionner ses scripts de seeding avec versioned_seeds</title>
      <link>http://blog.happynoff.fr/post/Versionner-ses-scripts-de-seeding-avec-versioned_seeds</link>
      <guid>http://blog.happynoff.fr/post/Versionner-ses-scripts-de-seeding-avec-versioned_seeds</guid>
      <description>&lt;p&gt;Si vous vous retrouvez dans le besoin de faire des imports de donn&#233;es ou des insertions script&#233;es dans une application Rails, de nos jours vous n&amp;#8217;avez pas vraiment d&amp;#8217;autre choix que de cr&#233;er des t&#226;ches rake (ou consorts) pour le faire.&lt;/p&gt;

&lt;p&gt;Dans cette id&#233;e, j&amp;#8217;ai &#233;crit la gem &lt;a href='https://github.com/simonc/versioned_seeds'&gt;versioned_seeds&lt;/a&gt; qui permet de stocker ces scripts dans un dossier sp&#233;cifique et de les utiliser &#224; la mani&#232;re des migrations.&lt;/p&gt;

&lt;p&gt;Son installation se fait gr&#226;ce &#224; l&amp;#8217;ajout de la ligne suivante dans votre &lt;code&gt;Gemfile&lt;/code&gt;&#160;:&lt;/p&gt;
&lt;div class='CodeRay'&gt;
  &lt;div class='code'&gt;&lt;pre class='ruby'&gt;gem &lt;span class='s'&gt;&lt;span class='dl'&gt;'&lt;/span&gt;&lt;span class='k'&gt;versioned_seeds&lt;/span&gt;&lt;span class='dl'&gt;'&lt;/span&gt;&lt;/span&gt;, &lt;span class='ke'&gt;require&lt;/span&gt;: &lt;span class='pc'&gt;false&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Le principe est simple, vous appelez un g&#233;n&#233;rateur qui va cr&#233;er au besoin le dossier et un script dans celui ci. Le nom du script commence par un timestamp, comme les migrations, ce qui va permettre &#224; versioned_seeds de l&amp;#8217;enregistrer et de ne pas l&amp;#8217;ex&#233;cuter plusieurs fois.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;rails g versioned_seeds:seed_file nom_du_script&lt;br&gt;        create db/seeds&lt;br&gt;        create db/seeds/20111207201942_nom_du_script.rb&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Vous n&amp;#8217;avez plus qu&amp;#8217;&#224; &#233;crire votre script puis, une fois termin&#233;, &#224; appeler une t&#226;che rake qui va l&amp;#8217;ex&#233;cuter:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;rake vs:next&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Cette t&#226;che va trouv&#233; le prochain script non charg&#233; jusqu&amp;#8217;&#224; pr&#233;sent et le lancer. Si vous avez g&#233;n&#233;r&#233; plusieurs scripts, vous pouvez faire appel &#224;&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;rake vs:all&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Qui va les lancer un-&#224;-un.&lt;/p&gt;

&lt;p&gt;Pour savoir o&#249; vous en &#234;tes de vos scripts, vous pouvez faire appel &#224;&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;rake vs:status&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Pour connaitre la version du dernier script charg&#233;.&lt;/p&gt;

&lt;p&gt;Pensez simplement &#224; ignorer le fichier .versioned_seeds dans Git, il sert &#224; stocker la liste des scripts d&#233;j&#224; lanc&#233;s et il ne doit pas &#234;tre versionn&#233; puisqu&amp;#8217;il est sp&#233;cifique &#224; chaque machine.&lt;/p&gt;

&lt;p&gt;Le code est disponible sur &lt;a href='https://github.com/simonc/versioned_seeds'&gt;Github&lt;/a&gt; et la gem sur &lt;a href='https://rubygems.org/gems/versioned_seeds'&gt;rubygems.org&lt;/a&gt;.&lt;/p&gt;</description>
      <pubDate>Wed, 07 Dec 2011 21:30:47 +0100</pubDate>
    </item>
    <item>
      <title>Utiliser rvm avec cron</title>
      <link>http://blog.happynoff.fr/post/Utiliser-rvm-avec-cron</link>
      <guid>http://blog.happynoff.fr/post/Utiliser-rvm-avec-cron</guid>
      <description>&lt;p&gt;Il y a quelques temps, j&amp;#8217;avais besoin de lancer un script ruby avec cron. Le souci, c&amp;#8217;est que sur mon serveur, tout est &#224; base de rvm. De fait, cron ne sait pas trouver ruby puisque rvm est charg&#233; par mon fichier &lt;em&gt;.bashrc&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;La petite astuce pour que &#231;a marche, c&amp;#8217;est de dire &#224; cron de charger mon environnement pour ce script sp&#233;cifiquement :&lt;/p&gt;
&lt;div class='CodeRay'&gt;
  &lt;div class='code'&gt;&lt;pre class='cron'&gt;0 * * * * /bin/bash -l -c 'ruby mon_script.rb'&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;En clair, l&amp;#8217;option &lt;em&gt;-l&lt;/em&gt; permet de charger l&amp;#8217;environnement bash et l&amp;#8217;option &lt;em&gt;-c&lt;/em&gt; indique la commande &#224; ex&#233;cuter.&lt;/p&gt;</description>
      <pubDate>Sat, 24 Sep 2011 05:40:12 +0200</pubDate>
    </item>
    <item>
      <title>Rendre git-diff plus pr&#233;cis</title>
      <link>http://blog.happynoff.fr/post/Rendre-git-diff-plus-precis</link>
      <guid>http://blog.happynoff.fr/post/Rendre-git-diff-plus-precis</guid>
      <description>&lt;p&gt;Git permet d&amp;#8217;afficher diff&#233;rentes informations en couleur. Cela se fait dans le fichier de configuration, &lt;em&gt;~/.gitconfig&lt;/em&gt;.&lt;/p&gt;
&lt;div class='CodeRay'&gt;
  &lt;div class='code'&gt;&lt;pre class='ini'&gt;[color]&lt;br&gt;  ui = true&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Une des commandes concern&#233;es est &lt;em&gt;git-diff&lt;/em&gt;. Cette coloration est bien pratique mais peut avoir ses limites. En effet, lorsque la diff&#233;rence sur une ligne se joue &#224; quelques caract&#232;res seulement, il peut &#234;tre difficile de d&#233;tecter les modifications.&lt;/p&gt;
&lt;div class='CodeRay'&gt;
  &lt;div class='code'&gt;&lt;pre class='diff'&gt;&lt;span class='c'&gt;  Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod&lt;/span&gt;&lt;br&gt;&lt;span class='c'&gt;  tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,&lt;/span&gt;&lt;br&gt;&lt;span class='line del'&gt;&lt;span class='del'&gt;-&lt;/span&gt; quis nostrud exercitation ullamco labaris nisi ut aliquip ex ea commodo&lt;/span&gt;&lt;br&gt;&lt;span class='line ins'&gt;&lt;span class='ins'&gt;+&lt;/span&gt; quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo&lt;/span&gt;&lt;br&gt;&lt;span class='c'&gt;  consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse&lt;/span&gt;&lt;br&gt;&lt;span class='c'&gt;  cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat&lt;/span&gt;&lt;br&gt;&lt;span class='c'&gt;  non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Une petite astuce pour les voir plus pr&#233;cis&#233;ment est l&amp;#8217;utilisation de l&amp;#8217;option &lt;em&gt;&amp;#8211;word-diff&lt;/em&gt;&lt;/p&gt;
&lt;div class='CodeRay'&gt;
  &lt;div class='code'&gt;&lt;pre class='bash'&gt;git diff --word-diff=color&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Voici le r&#233;sultat obtenu :&lt;/p&gt;
&lt;div class='CodeRay'&gt;
  &lt;pre class='diff'&gt;Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod&lt;br&gt;tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,&lt;br&gt;quis nostrud exercitation ullamco lab&lt;span class='del'&gt;o&lt;/span&gt;&lt;span class='ins'&gt;a&lt;/span&gt;ris nisi ut aliquip ex ea commodo&lt;br&gt;consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse&lt;br&gt;cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat&lt;br&gt;non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;L&amp;#8217;option prend diff&#233;rentes valeurs qui peuvent &#234;tre utiles selon les circonstances.&lt;/p&gt;</description>
      <pubDate>Mon, 19 Sep 2011 23:46:35 +0200</pubDate>
    </item>
    <item>
      <title>Gestion du PATH sous OS X</title>
      <link>http://blog.happynoff.fr/post/Gestion-du-PATH-sous-OS-X</link>
      <guid>http://blog.happynoff.fr/post/Gestion-du-PATH-sous-OS-X</guid>
      <description>&lt;p&gt;Une fonctionnalit&#233; bien pratique de &lt;em&gt;OS&lt;/em&gt;X_ est la gestion du PATH. En effet un m&#233;canisme permet de ne pas surcharger son &lt;em&gt;.bashrc&lt;/em&gt; chaque fois que l&amp;#8217;on doit rajouter une entr&#233;e dans le PATH.&lt;/p&gt;

&lt;p&gt;La magie s&amp;#8217;op&#232;re dans le fichier &lt;em&gt;/etc/paths&lt;/em&gt; et dans le dossier &lt;em&gt;/etc/paths.d&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Le premier est un listing des chemin g&#233;n&#233;raux :&lt;/p&gt;
&lt;div class='CodeRay'&gt;
  &lt;div class='code'&gt;&lt;pre&gt;/usr/bin&lt;br&gt;/bin&lt;br&gt;/usr/sbin&lt;br&gt;/sbin&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Le deuxi&#232;me est un dossier permettant d&amp;#8217;ajouter des fichiers contenant des listings en plus. Ces fichiers seront charg&#233;s &#224; la suite de &lt;em&gt;/etc/paths&lt;/em&gt;.&lt;/p&gt;

&lt;h2 id='exemple'&gt;Exemple&lt;/h2&gt;

&lt;p&gt;Si vous avez install&#233; MySQL avec le DMG fourni sur le site officiel, vous pouvez ajouter le chemin des ex&#233;cutables mysql en cr&#233;ant un fichier &lt;em&gt;/etc/paths.d/mysql&lt;/em&gt; et y &#233;crire la ligne suivante :&lt;/p&gt;
&lt;div class='CodeRay'&gt;
  &lt;div class='code'&gt;&lt;pre&gt;/usr/local/mysql/bin&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;h2 id='collision'&gt;Collision&lt;/h2&gt;

&lt;p&gt;Si vous vous trouvez dans la situation o&#249; vous avez un ex&#233;cutable dans un dossier non syst&#232;me et que vous souhaitez que ce dossier ait la priorit&#233;, mettez le en t&#234;te du fichier &lt;em&gt;/etc/paths&lt;/em&gt;, les chemins sont charg&#233;s dans l&amp;#8217;ordre.&lt;/p&gt;</description>
      <pubDate>Mon, 19 Sep 2011 23:44:06 +0200</pubDate>
    </item>
    <item>
      <title>Cr&#233;er ses propres s&#233;lecteurs avec jQuery</title>
      <link>http://blog.happynoff.fr/post/Creer-ses-propres-selecteurs-avec-jQuery</link>
      <guid>http://blog.happynoff.fr/post/Creer-ses-propres-selecteurs-avec-jQuery</guid>
      <description>&lt;p&gt;Il y a peu, au boulot, on s&amp;#8217;est demand&#233; si, avec jQuery, il &#233;tait possible de s&#233;lectionner les &#233;l&#233;ments dont une classe correspond &#224; mod&#232;le donn&#233;.&lt;/p&gt;

&lt;p&gt;Par exemple, s&#233;lectionner tous ceux donc la classe commence par &lt;em&gt;menu_item_&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;La r&#233;ponse est oui, avec jQuery, c&amp;#8217;est possible. Voici comment.&lt;/p&gt;</description>
      <pubDate>Thu, 25 Aug 2011 15:03:01 +0200</pubDate>
    </item>
    <item>
      <title>Installation de markItUp avec preview dans une application Rails3</title>
      <link>http://blog.happynoff.fr/post/Installation-de-markItUp-avec-preview-dans-une-application-Rails3</link>
      <guid>http://blog.happynoff.fr/post/Installation-de-markItUp-avec-preview-dans-une-application-Rails3</guid>
      <description>&lt;p&gt;Il est fr&#233;quent d&amp;#8217;avoir besoin d&amp;#8217;un &#233;diteur dit WYSIWYG dans un site web. Il en existe de deux types. Les &#233;diteurs pur WYSIWYG o&#249; vous &#233;ditez directement du HTML en mode rendu final et les &#233;diteurs de syntaxe qui se basent par exemple sur le format &lt;a href='http://en.wikipedia.org/wiki/Help:Wiki_markup'&gt;Wiki&lt;/a&gt;, &lt;a href='http://www.textism.com/tools/textile/'&gt;Textile&lt;/a&gt; ou &lt;a href='http://daringfireball.net/projects/markdown/'&gt;Markdown&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href='http://markitup.jaysalvat.com/home/'&gt;markItUp&lt;/a&gt; est de la deuxi&#232;me cat&#233;gorie. Dans le cas d&amp;#8217;un &#233;diteur de syntaxe, il est toujours plus confortable de disposer d&amp;#8217;une preview avant de valider ce qu&amp;#8217;on a &#233;crit.&lt;/p&gt;

&lt;p&gt;Voici un petit tutoriel sur comment installer markItUp dans une appli &lt;a href='http://rubyonrails.org/'&gt;Rails3&lt;/a&gt; en utilisant &lt;a href='http://www.sinatrarb.com/'&gt;Sinatra&lt;/a&gt; pour g&#233;n&#233;rer la preview.&lt;/p&gt;</description>
      <pubDate>Thu, 25 Aug 2011 15:03:01 +0200</pubDate>
    </item>
    <item>
      <title>La m&#233;thode inject en Ruby</title>
      <link>http://blog.happynoff.fr/post/La-methode-inject-en-Ruby</link>
      <guid>http://blog.happynoff.fr/post/La-methode-inject-en-Ruby</guid>
      <description>&lt;p&gt;En Ruby, il existe une m&#233;thode bien pratique nomm&#233;e &lt;em&gt;inject&lt;/em&gt;. Elle s&amp;#8217;utilise de la mani&#232;re suivante :&lt;/p&gt;
&lt;div class='CodeRay'&gt;
  &lt;div class='code'&gt;&lt;pre&gt;puts (&lt;span class='i'&gt;0&lt;/span&gt;..&lt;span class='i'&gt;10&lt;/span&gt;).inject(&lt;span class='i'&gt;0&lt;/span&gt;) &lt;span class='r'&gt;do&lt;/span&gt; |somme, x|&lt;br&gt;  somme += x&lt;br&gt;&lt;span class='r'&gt;end&lt;/span&gt;&lt;br&gt;&lt;span class='c'&gt;# =&amp;gt; 55&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Dans l&amp;#8217;exemple pr&#233;c&#233;dent, on part d&amp;#8217;une valeur de &lt;em&gt;0&lt;/em&gt; que l&amp;#8217;on modifie &#224; chaque tour. Le code suivant est &#233;quivalent :&lt;/p&gt;
&lt;div class='CodeRay'&gt;
  &lt;div class='code'&gt;&lt;pre&gt;somme = &lt;span class='i'&gt;0&lt;/span&gt;&lt;br&gt;(&lt;span class='i'&gt;0&lt;/span&gt;..&lt;span class='i'&gt;10&lt;/span&gt;).each &lt;span class='r'&gt;do&lt;/span&gt; |x|&lt;br&gt;  somme += x&lt;br&gt;&lt;span class='r'&gt;end&lt;/span&gt;&lt;br&gt;puts somme&lt;br&gt;&lt;span class='c'&gt;# =&amp;gt; 55&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;De mani&#232;re classique, on peut s&amp;#8217;en servire pour g&#233;n&#233;rer un tableau ou une table de hash de la mani&#232;re suivante :&lt;/p&gt;
&lt;div class='CodeRay'&gt;
  &lt;div class='code'&gt;&lt;pre&gt;&lt;span class='iv'&gt;@articles&lt;/span&gt;.inject({}) &lt;span class='r'&gt;do&lt;/span&gt; |hash, article|&lt;br&gt;  hash[article.title] = article.body&lt;br&gt;&lt;span class='r'&gt;end&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Une autre utilisation interessante, est avec les bool&#233;ens :&lt;/p&gt;
&lt;div class='CodeRay'&gt;
  &lt;div class='code'&gt;&lt;pre&gt;&lt;span class='iv'&gt;@plugins&lt;/span&gt;.inject(&lt;span class='pc'&gt;true&lt;/span&gt;) &lt;span class='r'&gt;do&lt;/span&gt; |keep_going, plugin|&lt;br&gt;  keep_going &amp;amp;= plugin.some_method&lt;br&gt;&lt;span class='r'&gt;end&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;On obtient donc en fin de parcours, &lt;em&gt;true&lt;/em&gt; si tous les appels ont retourn&#233; &lt;em&gt;true&lt;/em&gt; ou &lt;em&gt;false&lt;/em&gt; si au moins un appel a retourn&#233; &lt;em&gt;false&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Dans le cas o&#249; on veut stoper l&amp;#8217;appel &#224; &lt;em&gt;inject&lt;/em&gt; d&#233;s qu&amp;#8217;un appel retourne &lt;em&gt;false&lt;/em&gt;, on peut utiliser l&amp;#8217;instruction &lt;em&gt;break&lt;/em&gt; :&lt;/p&gt;
&lt;div class='CodeRay'&gt;
  &lt;div class='code'&gt;&lt;pre&gt;&lt;span class='iv'&gt;@plugins&lt;/span&gt;.inject(&lt;span class='pc'&gt;true&lt;/span&gt;) &lt;span class='r'&gt;do&lt;/span&gt; |keep_going, plugin|&lt;br&gt;  keep_going &amp;amp;= plugin.some_method &lt;span class='r'&gt;or&lt;/span&gt; &lt;span class='r'&gt;break&lt;/span&gt;(keep_going)&lt;br&gt;&lt;span class='r'&gt;end&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Cela permet de ne pas faire les appels suivants d&#233;s le premier retour n&#233;gatif.&lt;/p&gt;</description>
      <pubDate>Thu, 25 Aug 2011 15:03:00 +0200</pubDate>
    </item>
    <item>
      <title>&#201;viter la cr&#233;ation des fichiers ._ (point underscore) sous Mac OS X</title>
      <link>http://blog.happynoff.fr/post/eviter-point-underscore-sous-mac-os-x</link>
      <guid>http://blog.happynoff.fr/post/eviter-point-underscore-sous-mac-os-x</guid>
      <description>&lt;p&gt;Un comportement plut&#244;t g&#234;nant sous &lt;em&gt;OS X&lt;/em&gt; est la cr&#233;ation des fichiers ._ (point underscore). C&amp;#8217;est souvent un probl&#232;me quand on veut cr&#233;er une archive &lt;em&gt;.tar.gz&lt;/em&gt; ou avec certains &lt;em&gt;&lt;abbr title='Source Control Manager'&gt;SCM&lt;/abbr&gt;&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Voici une solution pour emp&#234;cher leur cr&#233;ation.&lt;/p&gt;

&lt;p&gt;Dans votre .bashrc et votre .profile, ajoutez la ligne suivante :&lt;/p&gt;
&lt;div class='CodeRay'&gt;
  &lt;div class='code'&gt;&lt;pre&gt;&lt;span class='fu'&gt;export&lt;/span&gt; &lt;span class='iv'&gt;COPYFILE_DISABLE&lt;/span&gt;=true&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;</description>
      <pubDate>Thu, 25 Aug 2011 15:03:00 +0200</pubDate>
    </item>
    <item>
      <title>Utiliser un shell non standard sous mac</title>
      <link>http://blog.happynoff.fr/post/Utiliser-un-shell-non-standard-sous-mac</link>
      <guid>http://blog.happynoff.fr/post/Utiliser-un-shell-non-standard-sous-mac</guid>
      <description>&lt;p&gt;Chaque fois que j&amp;#8217;installe un shell sous &lt;em&gt;Mac OS X&lt;/em&gt; et que je le r&#232;gle par d&#233;faut gr&#224;ce &#224; &lt;em&gt;chsh&lt;/em&gt;, l&amp;#8217;application &lt;em&gt;Terminal&lt;/em&gt; refuse de se lancer et me dit :&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Vous n&amp;#8217;&#234;tes pas autoris&#233; &#224; lancer cette application.&lt;/strong&gt;&lt;br /&gt;L&amp;#8217;administrateur a donn&#233; &#224; votre shell une valeur ill&#233;gale.&lt;/p&gt;

&lt;p&gt;Pour r&#233;gler ce petit souci, il suffit d&amp;#8217;ajouter le chemin vers votre shell dans le fichier &lt;em&gt;/etc/shells&lt;/em&gt; :&lt;/p&gt;
&lt;div class='CodeRay'&gt;
  &lt;div class='code'&gt;&lt;pre&gt;cat /etc/shells&lt;br&gt;&lt;span class='c'&gt;# List of acceptable shells for chpass(1).&lt;/span&gt;&lt;br&gt;&lt;span class='c'&gt;# Ftpd will not allow users to connect who are not using&lt;/span&gt;&lt;br&gt;&lt;span class='c'&gt;# one of these shells.&lt;/span&gt;&lt;br&gt;&lt;br&gt;/usr/&lt;span class='fu'&gt;local&lt;/span&gt;/bin/bash &lt;span class='c'&gt;# bash install&#233; avec homebrew&lt;/span&gt;&lt;br&gt;/bin/bash&lt;br&gt;/bin/csh&lt;br&gt;/bin/ksh&lt;br&gt;/bin/sh&lt;br&gt;/bin/tcsh&lt;br&gt;/bin/zsh&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;C&amp;#8217;est une erreur que l&amp;#8217;on ne rencontre pas lorsque l&amp;#8217;on utilise un terminal comme &lt;a href='http://sites.google.com/site/iterm2home/'&gt;iTerm 2&lt;/a&gt;&amp;#8230;&lt;/p&gt;</description>
      <pubDate>Thu, 25 Aug 2011 15:03:00 +0200</pubDate>
    </item>
    <item>
      <title>Utiliser la sortie d'une commande comme un fichier en shell</title>
      <link>http://blog.happynoff.fr/post/Utiliser-la-sortie-d-une-commande-comme-un-fichier-en-shell</link>
      <guid>http://blog.happynoff.fr/post/Utiliser-la-sortie-d-une-commande-comme-un-fichier-en-shell</guid>
      <description>&lt;p&gt;Il arrive qu&amp;#8217;on ait besoin d&amp;#8217;utiliser la sortie d&amp;#8217;une commande comme si c&amp;#8217;&#233;tait un fichier. Voici une petite astuce pour ne pas passer par un fichier temporaire.&lt;/p&gt;
&lt;div class='CodeRay'&gt;
  &lt;div class='code'&gt;&lt;pre&gt;diff &lt;span class='bi'&gt;&amp;lt;&lt;/span&gt;(ls /un/dossier/au/pif) &lt;span class='bi'&gt;&amp;lt;&lt;/span&gt;(ls /un/autre/dossier/au/pif)&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Et voil&#224; avec cette syntaxe on a la diff&#233;rence entre deux dossiers sans utiliser de fichiers temporaires.&lt;/p&gt;</description>
      <pubDate>Thu, 25 Aug 2011 15:03:00 +0200</pubDate>
    </item>
    <item>
      <title>Installer la gem mysql sous Snow Leopard</title>
      <link>http://blog.happynoff.fr/post/Installer-la-gem-mysql-sous-Snow-Leopard</link>
      <guid>http://blog.happynoff.fr/post/Installer-la-gem-mysql-sous-Snow-Leopard</guid>
      <description>&lt;p&gt;Sous &lt;em&gt;Snow Leopard&lt;/em&gt;, l&amp;#8217;installation de la gem mysql n&amp;#8217;est pas toujours simple. Voici ce que j&amp;#8217;utilise, sachant que mon &lt;em&gt;MySQL&lt;/em&gt; est install&#233; via le DMG fourni sur le site officiel.&lt;/p&gt;
&lt;div class='CodeRay'&gt;
  &lt;div class='code'&gt;&lt;pre&gt;&lt;span class='fu'&gt;export&lt;/span&gt; &lt;span class='iv'&gt;ARCHFLAGS&lt;/span&gt;=&lt;span class='s'&gt;&lt;span class='dl'&gt;&amp;quot;&lt;/span&gt;&lt;span class='k'&gt;-arch i386 -arch x86_64&lt;/span&gt;&lt;span class='dl'&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;span class='dl'&gt;;&lt;/span&gt;&lt;br&gt;sudo gem install mysql -v2.&lt;span class='i'&gt;7&lt;/span&gt; --no-rdoc --no-ri --         \&lt;br&gt;   --with-mysql-dir=/usr/&lt;span class='fu'&gt;local&lt;/span&gt;/mysql                      \&lt;br&gt;   --with-mysql-config=/usr/&lt;span class='fu'&gt;local&lt;/span&gt;/mysql/bin/mysql_config&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;</description>
      <pubDate>Thu, 25 Aug 2011 15:03:00 +0200</pubDate>
    </item>
    <item>
      <title>Probl&#232;me de police trop fine sous Snow Leopard</title>
      <link>http://blog.happynoff.fr/post/Probleme-de-police-trop-fine-sous-Snow-Leopard</link>
      <guid>http://blog.happynoff.fr/post/Probleme-de-police-trop-fine-sous-Snow-Leopard</guid>
      <description>&lt;p&gt;Il y a quelques jours j&amp;#8217;ai r&#233;install&#233; un Snow Leopard sur un Mac Mini.&lt;/p&gt;

&lt;p&gt;Lorsque j&amp;#8217;ai lanc&#233; iTerm et TextMate, la police Monaco que j&amp;#8217;utilise dans les deux n&amp;#8217;&#233;tait pas tout &#224; fait comme d&amp;#8217;habitude, plus fine et moins agr&#233;able.&lt;/p&gt;

&lt;p&gt;Cela vient d&amp;#8217;un bug Snow Leopard qui ne reconnait pas toujours les LCD : il les voit comme des &#233;crans CRT et d&#233;sactive l&amp;#8217;anti-aliasing sur les polices !&lt;/p&gt;

&lt;p&gt;Pour r&#233;gler ce souci, tapez simplement ceci dans une console :&lt;/p&gt;
&lt;div class='CodeRay'&gt;
  &lt;div class='code'&gt;&lt;pre&gt;defaults -currentHost write -globalDomain AppleFontSmoothing -int &lt;span class='i'&gt;2&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;La prochaine fois que vous lancerez iTerm ou TextMate, &#231;a devrait &#234;tre bon.&lt;/p&gt;</description>
      <pubDate>Thu, 25 Aug 2011 15:02:59 +0200</pubDate>
    </item>
    <item>
      <title>Pr&#233;sentation de TotalFinder</title>
      <link>http://blog.happynoff.fr/post/Presentation-de-TotalFinder</link>
      <guid>http://blog.happynoff.fr/post/Presentation-de-TotalFinder</guid>
      <description>&lt;p&gt;Je n&amp;#8217;ai pas pour habitude de faire la promotion de logiciels particuliers sur mon blog. Petite exception, je vais vous parler de &lt;a href='http://totalfinder.binaryage.com/'&gt;TotalFinder&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href='http://totalfinder.binaryage.com/'&gt;TotalFinder&lt;/a&gt; est un plug-in pour &lt;em&gt;Finder&lt;/em&gt; qui donne acc&#232;s &#224; pas mal de fonctionnalit&#233;s bien pratiques.&lt;/p&gt;</description>
      <pubDate>Thu, 25 Aug 2011 15:02:59 +0200</pubDate>
    </item>
    <item>
      <title>Travailler en case-sensitive sous Mac</title>
      <link>http://blog.happynoff.fr/post/Travailler-en-case-sensitive-sous-Mac</link>
      <guid>http://blog.happynoff.fr/post/Travailler-en-case-sensitive-sous-Mac</guid>
      <description>&lt;p&gt;&lt;em&gt;HFS+&lt;/em&gt;, le syst&#232;me de fichiers utilis&#233; par &lt;em&gt;Mac OS X&lt;/em&gt; depuis un bout de temps d&#233;j&#224; est, par d&#233;faut, case-insensitive. Il est toutefois possible, aujourd&amp;#8217;hui, de choisir d&amp;#8217;utiliser une version case-sensitive lorsque l&amp;#8217;on installe &lt;em&gt;OS X&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;La plupart du temps, &#231;a n&amp;#8217;est pas sp&#233;cialement g&#234;nant. Quand il s&amp;#8217;agit de travailler cela peut vite devenir handicapant.&lt;/p&gt;</description>
      <pubDate>Thu, 25 Aug 2011 15:02:59 +0200</pubDate>
    </item>
    <item>
      <title>D&#233;sactiver la r&#233;solution interactive des conflits dans Subversion</title>
      <link>http://blog.happynoff.fr/post/Desactiver-la-resolution-interactive-des-conflits-dans-Subversion</link>
      <guid>http://blog.happynoff.fr/post/Desactiver-la-resolution-interactive-des-conflits-dans-Subversion</guid>
      <description>&lt;p&gt;Depuis la version 1.5 de Subversion, la r&#233;solution des conflits se fait de fa&#231;on interactive lorsque l&amp;#8217;on utilise &lt;em&gt;svn update&lt;/em&gt;.&lt;/p&gt;
&lt;pre class='shell'&gt;&lt;kbd&gt;svn update&lt;/kbd&gt;&lt;br&gt;&lt;samp&gt;Conflict discovered in 'some/file/located/somewhere.rb'.&lt;/samp&gt;&lt;br&gt;&lt;samp&gt;Select: (p) postpone, (df) diff-full, (e) edit,&lt;br&gt;        (h) help for more options:&lt;/samp&gt;&lt;br&gt;&lt;/pre&gt;
&lt;p&gt;Personnellement, je ne supporte pas ce nouveau mode. Je pr&#233;f&#232;re de loin faire un &lt;em&gt;update&lt;/em&gt; complet et corriger les conflits &#224; posteriori.&lt;/p&gt;

&lt;p&gt;Pour le faire de mani&#232;re ponctuelle l&amp;#8217;option &lt;em&gt;&amp;#8211;non-interactive&lt;/em&gt; permet d&amp;#8217;obtenir ce comportement.&lt;/p&gt;
&lt;div class='CodeRay'&gt;
  &lt;div class='code'&gt;&lt;pre&gt;svn update --non-interactive&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Pour le faire de mani&#232;re permanente, &#233;ditez votre &lt;em&gt;~/.subversion/config&lt;/em&gt; et ajoutez la ligne suivante dans la section &lt;em&gt;miscellany&lt;/em&gt; :&lt;/p&gt;
&lt;div class='CodeRay'&gt;
  &lt;div class='code'&gt;&lt;pre&gt;[miscellany]&lt;br&gt;...&lt;br&gt;interactive-conflicts = no&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;</description>
      <pubDate>Thu, 25 Aug 2011 15:02:59 +0200</pubDate>
    </item>
    <item>
      <title>Surcharge de m&#233;thode &#233;l&#233;gante en Javascript</title>
      <link>http://blog.happynoff.fr/post/Surcharge-de-methode-elegante-en-Javascript</link>
      <guid>http://blog.happynoff.fr/post/Surcharge-de-methode-elegante-en-Javascript</guid>
      <description>&lt;p&gt;Aujourd&amp;#8217;hui, j&amp;#8217;ai eu besoin de surcharger une m&#233;thode Javascript. Premier r&#233;flexe, r&#233;&#233;crire la fonction en y ajoutant le code voulu.&lt;/p&gt;

&lt;p&gt;Soit le code qui suit :&lt;/p&gt;
&lt;div class='CodeRay'&gt;
  &lt;div class='code'&gt;&lt;pre&gt;mon_objet.fait_le_caf&lt;span class='er'&gt;&#233;&lt;/span&gt; = &lt;span class='kw'&gt;function&lt;/span&gt;() {&lt;br&gt;  &lt;span class='kw'&gt;var&lt;/span&gt; tasse = prendre_une_tasse();&lt;br&gt;  tasse.verser_caf&lt;span class='er'&gt;&#233;&lt;/span&gt;();&lt;br&gt;  tasse.faire_chauffer();&lt;br&gt;&lt;br&gt;  &lt;span class='kw'&gt;return&lt;/span&gt; tasse;&lt;br&gt;}&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Afin d&amp;#8217;ajouter du sucre, on pourrait surcharger de la fa&#231;on suivante :&lt;/p&gt;
&lt;div class='CodeRay'&gt;
  &lt;div class='code'&gt;&lt;pre&gt;mon_objet.fait_le_caf&lt;span class='er'&gt;&#233;&lt;/span&gt; = &lt;span class='kw'&gt;function&lt;/span&gt;() {&lt;br&gt;  &lt;span class='kw'&gt;var&lt;/span&gt; tasse = prendre_une_tasse();&lt;br&gt;  tasse.verser_caf&lt;span class='er'&gt;&#233;&lt;/span&gt;();&lt;br&gt;  tasse.faire_chauffer();&lt;br&gt;&lt;br&gt;  tasse.ajouter_sucre();&lt;br&gt;&lt;br&gt;  &lt;span class='kw'&gt;return&lt;/span&gt; tasse;&lt;br&gt;}&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Jusque l&#224;, rien d&amp;#8217;inhabituel. Mais quid du code propre, simple et surtout &lt;abbr title='Don&amp;apos;t Repeat Yourself'&gt;DRY&lt;/abbr&gt; ?&lt;/p&gt;

&lt;p&gt;Voici donc une fa&#231;on plus &#233;l&#233;gante d&amp;#8217;obtenir le m&#234;me r&#233;sultat en &#233;crivant juste le code n&#233;cessaire :&lt;/p&gt;
&lt;div class='CodeRay'&gt;
  &lt;div class='code'&gt;&lt;pre&gt;mon_objet.fait_le_caf&lt;span class='er'&gt;&#233;&lt;/span&gt;_sans_sucre = mon_objet.fait_le_caf&lt;span class='er'&gt;&#233;&lt;/span&gt;;&lt;br&gt;&lt;br&gt;mon_objet.fait_le_caf&lt;span class='er'&gt;&#233;&lt;/span&gt; = &lt;span class='kw'&gt;function&lt;/span&gt;() {&lt;br&gt;  &lt;span class='kw'&gt;var&lt;/span&gt; tasse = mon_objet.fait_le_caf&lt;span class='er'&gt;&#233;&lt;/span&gt;_sans_sucre();&lt;br&gt;&lt;br&gt;  tasse.ajouter_sucre();&lt;br&gt;&lt;br&gt;  &lt;span class='kw'&gt;return&lt;/span&gt; tasse;&lt;br&gt;}&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;C&amp;#8217;est tout simple, &#231;a fonctionne et c&amp;#8217;est &lt;abbr title='Don&amp;apos;t Repeat Yourself'&gt;DRY&lt;/abbr&gt;&amp;#8230;&lt;/p&gt;

&lt;p&gt;Pour information, l&amp;#8217;id&#233;e m&amp;#8217;est venue du framework &lt;a href='http://www.rubyonrails.org'&gt;Ruby On Rails (en)&lt;/a&gt; et de sa m&#233;thode&lt;/p&gt;

&lt;p&gt;&lt;a href='http://api.rubyonrails.org/classes/ActiveSupport/CoreExtensions/Module.html#M001219'&gt;alias_method_chain (en)&lt;/a&gt;&lt;/p&gt;</description>
      <pubDate>Thu, 25 Aug 2011 15:02:52 +0200</pubDate>
    </item>
    <item>
      <title>Rails - Utiliser SASS avec theme_support</title>
      <link>http://blog.happynoff.fr/post/Rails-Utiliser-SASS-avec-theme_support</link>
      <guid>http://blog.happynoff.fr/post/Rails-Utiliser-SASS-avec-theme_support</guid>
      <description>&lt;p&gt;J&amp;#8217;ai eu l&amp;#8217;occasion de me prendre un petit moment la t&#234;te aujourd&amp;#8217;hui sur comment utiliser des feuilles de styles SASS au sein de th&#232;mes dans une application Rails.&lt;/p&gt;

&lt;p&gt;Pour la gestion des th&#232;mes, j&amp;#8217;ai utilis&#233; theme_support qui permet de cr&#233;er, pour chaque th&#232;me, un dossier ayant l&amp;#8217;arborescence suivante :&lt;/p&gt;
&lt;pre&gt;un_theme&lt;br&gt;&lt;span class='deco'&gt;&#9500;&#9472;&#9472;&lt;/span&gt; images&lt;br&gt;&lt;span class='deco'&gt;|   &#9492;&#9472;&#9472;&lt;/span&gt; preview.png&lt;br&gt;&lt;span class='deco'&gt;&#9500;&#9472;&#9472;&lt;/span&gt; javascripts&lt;br&gt;&lt;span class='deco'&gt;&#9500;&#9472;&#9472;&lt;/span&gt; stylesheets&lt;br&gt;&lt;span class='deco'&gt;&#9500;&#9472;&#9472;&lt;/span&gt; views&lt;br&gt;&lt;span class='deco'&gt;&#9492;&#9472;&#9472;&lt;/span&gt; about.markdown&lt;/pre&gt;
&lt;p&gt;Ce que je cherchais &#224; faire &#233;tait de pouvoir mettre des fichiers SASS dans le dossier stylesheets, mais que les CSS compil&#233;es soient plac&#233;es dans &lt;em&gt;&amp;lt;app_root&amp;gt;/public/stylesheets&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Le plus simple moyen que j&amp;#8217;ai trouv&#233; pour faire &#231;a, est d&amp;#8217;ajouter le script suivant dans &amp;gt;app_root&amp;gt;/config/initializers/theme_sass.rb :&lt;/p&gt;
&lt;div class='CodeRay'&gt;
  &lt;div class='code'&gt;&lt;pre&gt;&lt;span class='c'&gt;# :template_location est normalement une String, on la convertie donc en Array&lt;/span&gt;&lt;br&gt;&lt;span class='co'&gt;Sass&lt;/span&gt;::&lt;span class='co'&gt;Plugin&lt;/span&gt;.options[&lt;span class='sy'&gt;:template_location&lt;/span&gt;] = [[&lt;span class='co'&gt;Sass&lt;/span&gt;::&lt;span class='co'&gt;Plugin&lt;/span&gt;.options[&lt;span class='sy'&gt;:template_location&lt;/span&gt;], &lt;span class='co'&gt;Sass&lt;/span&gt;::&lt;span class='co'&gt;Plugin&lt;/span&gt;.options[&lt;span class='sy'&gt;:css_location&lt;/span&gt;]]]&lt;br&gt;&lt;br&gt;&lt;span class='c'&gt;# Pour chaque th&#232;me, on ajoute son dossier stylesheets &#224; la liste des sources SASS&lt;/span&gt;&lt;br&gt;&lt;span class='co'&gt;Theme&lt;/span&gt;.find_all.map(&amp;amp;&lt;span class='sy'&gt;:name&lt;/span&gt;).each &lt;span class='r'&gt;do&lt;/span&gt; |theme|&lt;br&gt;  &lt;span class='co'&gt;Sass&lt;/span&gt;::&lt;span class='co'&gt;Plugin&lt;/span&gt;.options[&lt;span class='sy'&gt;:template_location&lt;/span&gt;] &amp;lt;&amp;lt; [&lt;span class='s'&gt;&lt;span class='dl'&gt;&amp;quot;&lt;/span&gt;&lt;span class='il'&gt;&lt;span class='idl'&gt;#{&lt;/span&gt;&lt;span class='co'&gt;RAILS_ROOT&lt;/span&gt;&lt;span class='idl'&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class='k'&gt;/themes/&lt;/span&gt;&lt;span class='il'&gt;&lt;span class='idl'&gt;#{&lt;/span&gt;theme&lt;span class='idl'&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class='k'&gt;/stylesheets&lt;/span&gt;&lt;span class='dl'&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;, &lt;span class='co'&gt;Sass&lt;/span&gt;::&lt;span class='co'&gt;Plugin&lt;/span&gt;.options[&lt;span class='sy'&gt;:css_location&lt;/span&gt;]]&lt;br&gt;&lt;span class='r'&gt;end&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;</description>
      <pubDate>Thu, 25 Aug 2011 15:02:58 +0200</pubDate>
    </item>
    <item>
      <title>Continuer d'ouvrir ses onglets en fin de liste sous Firefox 3.6</title>
      <link>http://blog.happynoff.fr/post/Continuer-d-ouvrir-ses-onglets-en-fin-de-liste-sous-Firefox-3-6</link>
      <guid>http://blog.happynoff.fr/post/Continuer-d-ouvrir-ses-onglets-en-fin-de-liste-sous-Firefox-3-6</guid>
      <description>&lt;p&gt;Depuis quelques jours maintenant, Firefox 3.6 est sorti. Cette nouvelle version apporte un certain nombre de nouveaut&#233;s, dont certaines qui peuvent &#234;tre d&#233;routantes (&amp;#60;troll&amp;#62;le nouveau syst&#232;me de skins uselessfull par exemple ?&amp;#60;/troll&amp;#62;).&lt;/p&gt;

&lt;p&gt;Bref ! Une nouveaut&#233; est l&amp;#8217;ouverture des onglets relatifs (ouverture d&amp;#8217;un lien de la page courante dans un onglet) &#224; c&#244;t&#233; de l&amp;#8217;onglet courant et non plus &#224; la fin de la liste. Tout cela n&amp;#8217;aurait rien de bien g&#234;nant si cette fonctionnalit&#233; pouvait &#234;tre d&#233;sactiv&#233;e gr&#226;ce &#224; une simple case &#224; cocher&amp;#8230;&lt;/p&gt;

&lt;p&gt;Voici un moyen simple de revenir &#224; l&amp;#8217;ancien fonctionnement.&lt;/p&gt;

&lt;p&gt;Ouvrez l&amp;#8217;URL &lt;em&gt;about:config&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Dans la zone de filtre saisissez &lt;em&gt;insertRelated&lt;/em&gt; cela devrait laisser seulement une entr&#233;e :&lt;/p&gt;

&lt;p&gt;&lt;img src='/images/ff3.6_aboutconfig_tabs.png' alt='Firefox 3.6 about:config - insertRelatedTabsAfterCurrent' /&gt;&lt;/p&gt;

&lt;p&gt;Double-cliquez dessus pour passer sa valeur &#224; &lt;em&gt;false&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;C&amp;#8217;est tout. Les nouveaux onglets devraient s&amp;#8217;ouvrir maintenant en fin de liste.&lt;/p&gt;

&lt;p&gt;EDIT: Je viens de trouver &lt;a href='http://mozillalinks.org/wp/2010/01/firefox-3-6-tips-and-tweaks/'&gt;un lien avec quelques astuces suppl&#233;mentaires&lt;/a&gt;&lt;/p&gt;</description>
      <pubDate>Thu, 25 Aug 2011 15:02:56 +0200</pubDate>
    </item>
    <item>
      <title>Utiliser GetText c&#244;t&#233; Javascript avec Rails</title>
      <link>http://blog.happynoff.fr/post/Utiliser-GetText-cote-Javascript-avec-Rails</link>
      <guid>http://blog.happynoff.fr/post/Utiliser-GetText-cote-Javascript-avec-Rails</guid>
      <description>&lt;p&gt;En travaillant sur une petite application Rails, j&amp;#8217;ai utilis&#233; GetText pour l&amp;#8217;internationalisation. Jusque l&#224;, pas de probl&#232;me&amp;#8230; Sauf au moment o&#249; j&amp;#8217;ai voulu traduire un message c&#244;t&#233; client (autrement dit Javascript).&lt;/p&gt;

&lt;p&gt;Je ne voulais pas faire d&amp;#8217;appel AJAX pour chaque chaine &#224; traduire.&lt;/p&gt;

&lt;p&gt;Tout naturellement, j&amp;#8217;ai cherch&#233; un plugin simple qui fasse le travail mais n&amp;#8217;ai rien trouv&#233; qui me convienne.&lt;/p&gt;

&lt;p&gt;J&amp;#8217;ai donc cr&#233;&#233; mon propre plugin, &lt;a href='http://github.com/simonc/gettext_json'&gt;gettext_json&lt;/a&gt;. Voici comment l&amp;#8217;utiliser.&lt;/p&gt;</description>
      <pubDate>Thu, 25 Aug 2011 15:02:56 +0200</pubDate>
    </item>
    <item>
      <title>Mettre en place un groupe de sites de d&#233;monstration</title>
      <link>http://blog.happynoff.fr/post/Mettre-en-place-un-groupe-de-sites-de-demonstration</link>
      <guid>http://blog.happynoff.fr/post/Mettre-en-place-un-groupe-de-sites-de-demonstration</guid>
      <description>&lt;p&gt;Quand on d&#233;veloppe de nombreux sites, on n&amp;#8217;a pas forcement envie de toucher &#224; ses VirtualHosts pour chaque nouveau site.&lt;/p&gt;

&lt;p&gt;Voici ce que j&amp;#8217;ai mis en place sur mon serveur pour l&amp;#8217;espace de d&#233;mo de ce genre de sites.&lt;/p&gt;

&lt;p&gt;Le but &#233;tait d&amp;#8217;avoir un dossier contenant un nombre non limit&#233; de dossiers nomm&#233;s demo1, demo2, demo3, etc&amp;#8230;&lt;/p&gt;

&lt;p&gt;Pour cela, j&amp;#8217;ai cr&#233;&#233; un dossier &lt;em&gt;demos&lt;/em&gt; &#224; la racine de mon serveur Apache. C&amp;#8217;est ce dossier qui va contenir tous les dossiers &lt;em&gt;demoXYZ&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;J&amp;#8217;ai ensuite ajout&#233; un VirtualHost comme ceci :&lt;/p&gt;
&lt;div class='CodeRay'&gt;
  &lt;div class='code'&gt;&lt;pre&gt;&amp;lt;VirtualHost *:80&amp;gt;&lt;br&gt;  ServerName demos.exemple.com&lt;br&gt;  ServerAlias demo*.exemple.com&lt;br&gt;  DocumentRoot /var/www/demos&lt;br&gt;&lt;br&gt;  &amp;lt;Directory /&amp;gt;&lt;br&gt;    AllowOverride all&lt;br&gt;  &amp;lt;/Directory&amp;gt;&lt;br&gt;&amp;lt;/VirtualHost&amp;gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Le travail de dispatch entre les diff&#233;rents dossiers de d&#233;mo est fait par un fichier .htaccess dans le dossier demos :&lt;/p&gt;
&lt;div class='CodeRay'&gt;
  &lt;div class='code'&gt;&lt;pre&gt;RewriteEngine On&lt;br&gt;RewriteCond %{HTTP_HOST} ^demo(\d+).exemple.com&lt;br&gt;RewriteCond %{REQUEST_URI} !^/demo&lt;br&gt;RewriteRule (.\*) demo%1/$1 [L]&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Et voil&#224; ! Apr&#232;s red&#233;marrage du serveur, tout devrait fonctionner.&lt;/p&gt;</description>
      <pubDate>Thu, 25 Aug 2011 15:02:55 +0200</pubDate>
    </item>
    <item>
      <title>Deverouiller un groupe de fichiers sous Mac</title>
      <link>http://blog.happynoff.fr/post/Deverouiller-un-groupe-de-fichiers-sous-Mac</link>
      <guid>http://blog.happynoff.fr/post/Deverouiller-un-groupe-de-fichiers-sous-Mac</guid>
      <description>&lt;p&gt;Derni&#232;rement, lors de la copie de fichiers depuis le disque dur d&amp;#8217;une amie, je me suis retrouv&#233; avec de nombreux fichiers verrouill&#233;s. Verrouill&#233;s au sens OS X du terme.&lt;/p&gt;

&lt;p&gt;Il est possible pour chaque fichier d&amp;#8217;afficher ses infos et de d&#233;cocher la case de verrouillage.&lt;/p&gt;

&lt;p&gt;Mais lorsque cela concerne une centaine, ou un millier de fichiers, d&amp;#8217;un coup, cocher une simple case peut devenir quelque peu fastidieux.&lt;/p&gt;

&lt;p&gt;Pour effectuer cette action en ligne de commande, il suffit d&amp;#8217;utiliser la ligne suivante :&lt;/p&gt;
&lt;div class='CodeRay'&gt;
  &lt;div class='code'&gt;&lt;pre&gt;chflags nouchg &lt;span class='bi'&gt;&amp;lt;&lt;/span&gt;fichiers&lt;span class='bi'&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;</description>
      <pubDate>Thu, 25 Aug 2011 15:02:58 +0200</pubDate>
    </item>
    <item>
      <title>Utiliser Paperclip avec Rails sous Mac</title>
      <link>http://blog.happynoff.fr/post/Utiliser-Paperclip-avec-Rails-sous-Mac</link>
      <guid>http://blog.happynoff.fr/post/Utiliser-Paperclip-avec-Rails-sous-Mac</guid>
      <description>&lt;p&gt;Pour g&#233;rer l&amp;#8217;upload de fichiers dans les applications Rails, un plugin fr&#233;quemment utilis&#233; est Paperclip. R&#233;cemment, lors du d&#233;veloppement d&amp;#8217;un projet, je me suis retrouv&#233; confront&#233; &#224; un probl&#232;me lors de l&amp;#8217;envoie des fichiers. En effet, &#231;a ne fonctionnait pas et je recevais un message d&amp;#8217;erreur &#224; chaque fois.&lt;/p&gt;

&lt;p&gt;&lt;img src='/images/erreur_paperclip.jpg' alt='Erreur Paperclip' /&gt;&lt;/p&gt;

&lt;p&gt;Apr&#232;s quelques recherches, j&amp;#8217;ai fini par trouver que cette erreur venait du fait que mon application ne trouvait pas son chemin vers les outils d&amp;#8217;ImageMagick dont Paperclip d&#233;pend au travers de Rmagick.&lt;/p&gt;

&lt;p&gt;Pour r&#233;soudre ce probl&#232;me, il suffit d&amp;#8217;ajouter un initialiseur &#224; l&amp;#8217;application.&lt;/p&gt;

&lt;p&gt;J&amp;#8217;ai donc ajout&#233; le fichier RAILS_ROOT/config/initializers/paperclip.rb contenant ceci :&lt;/p&gt;
&lt;div class='CodeRay'&gt;
  &lt;div class='code'&gt;&lt;pre&gt;&lt;span class='co'&gt;Paperclip&lt;/span&gt;.options[&lt;span class='sy'&gt;:command_path&lt;/span&gt;] = &lt;span class='s'&gt;&lt;span class='dl'&gt;'&lt;/span&gt;&lt;span class='k'&gt;/opt/local/bin&lt;/span&gt;&lt;span class='dl'&gt;'&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;J&amp;#8217;ai utilis&#233; ce chemin car j&amp;#8217;ai install&#233; ImageMagick en utilisant MacPorts.&lt;/p&gt;</description>
      <pubDate>Thu, 25 Aug 2011 15:02:58 +0200</pubDate>
    </item>
    <item>
      <title>SSH automatique sur une machine au travers d'une autre</title>
      <link>http://blog.happynoff.fr/post/SSH-automatique-sur-une-machine-au-travers-d-une-autre</link>
      <guid>http://blog.happynoff.fr/post/SSH-automatique-sur-une-machine-au-travers-d-une-autre</guid>
      <description>&lt;p&gt;Parfois, pour se connecter en SSH sur une machine, il est n&#233;cessaire de passer au pr&#233;alable par une passerelle.&lt;/p&gt;

&lt;p&gt;&lt;img src='/images/ssh_connection_through.png' alt='Connexion au travers dune autre machine' /&gt;&lt;/p&gt;

&lt;p&gt;Cela implique, en g&#233;n&#233;ral, le processus suivant :&lt;/p&gt;

&lt;p&gt;&lt;pre class='shell'&gt;&lt;samp class='prompt'&gt;$ &lt;/samp&gt;&lt;kbd&gt;ssh user1@machine1&lt;/kbd&gt;&lt;br&gt;&lt;samp&gt;Welcome to machine1 &lt;/samp&gt;&lt;br&gt;&lt;samp class='prompt'&gt;machine1&amp;gt; &lt;/samp&gt;&lt;kbd&gt;ssh user2@machine2&lt;/kbd&gt;&lt;br&gt;&lt;samp&gt;Welcome to machine2&lt;/samp&gt;&lt;br&gt;&lt;samp class='prompt'&gt;machine2&amp;gt; &lt;/samp&gt;&lt;/pre&gt;&lt;/p&gt;

&lt;p&gt;Cela peut &#234;tre simplifi&#233; de plusieurs mani&#232;res.&lt;/p&gt;</description>
      <pubDate>Thu, 25 Aug 2011 15:02:54 +0200</pubDate>
    </item>
    <item>
      <title>Ignorer les changements d'espaces dans un diff SVN</title>
      <link>http://blog.happynoff.fr/post/Ignorer-les-changements-d-espaces-dans-un-diff-SVN</link>
      <guid>http://blog.happynoff.fr/post/Ignorer-les-changements-d-espaces-dans-un-diff-SVN</guid>
      <description>&lt;p&gt;Lorsque l&amp;#8217;on &#233;dite un fichier, il peut arriver qu&amp;#8217;en plus de simples modifications, certaines portions, voire le fichier entier, soient re-indent&#233;es. Malheureusement, Subversion &#233;tant b&#234;te et disciplin&#233;, un &lt;em&gt;svn diff&lt;/em&gt; montrera les lignes modifi&#233;es mais &#233;galement les lignes simplement indent&#233;es.&lt;/p&gt;

&lt;p&gt;Cela peut devenir g&#234;nant lorsque, par exemple, tout le fichier s&amp;#8217;en retrouve chang&#233;.&lt;/p&gt;

&lt;p&gt;Pour ignorer ces diff&#233;rences d&amp;#8217;espaces lors d&amp;#8217;un &lt;em&gt;diff&lt;/em&gt;, la commande &#224; utiliser est la suivante :&lt;/p&gt;
&lt;div class='CodeRay'&gt;
  &lt;div class='code'&gt;&lt;pre&gt;svn diff --extensions -bu&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;</description>
      <pubDate>Thu, 25 Aug 2011 15:02:54 +0200</pubDate>
    </item>
    <item>
      <title>Probl&#232;me des noms de fichiers avec accents dans Subversion sous OS X</title>
      <link>http://blog.happynoff.fr/post/Probleme-des-noms-de-fichiers-avec-accents-dans-Subversion-sous-OS-X</link>
      <guid>http://blog.happynoff.fr/post/Probleme-des-noms-de-fichiers-avec-accents-dans-Subversion-sous-OS-X</guid>
      <description>&lt;p&gt;Si vous utilisez des fichiers dont le nom contient des accents sur un d&#233;p&#244;t &lt;abbr title='Subversion'&gt;SVN&lt;/abbr&gt;, vous avez de grandes chances de rencontrer quelques soucis sous Mac, si vous avez install&#233; Subversion avec &lt;em&gt;MacPorts&lt;/em&gt;. Le probl&#232;me vient de la diff&#233;rence de stockage des caract&#232;res unicode entre les plateformes &lt;em&gt;Unix&lt;/em&gt; et &lt;em&gt;OS X&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Voici comment r&#233;soudre ce probl&#232;me. C&amp;#8217;est tr&#232;s simple, il suffit d&amp;#8217;installer une variante du &lt;em&gt;port&lt;/em&gt; subversion.&lt;/p&gt;
&lt;div class='CodeRay'&gt;
  &lt;div class='code'&gt;&lt;pre&gt;port install subversion +unicode_path&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Si tout s&amp;#8217;est bien pass&#233;, vous ne devriez plus avoir de probl&#232;mes.&lt;/p&gt;

&lt;p&gt;NOTE: j&amp;#8217;ai ajout&#233; cette option dans la Formula subversion de Homebrew mais c&amp;#8217;est toujours en attente de merge de leur part&amp;#8230;&lt;/p&gt;</description>
      <pubDate>Thu, 25 Aug 2011 15:02:54 +0200</pubDate>
    </item>
    <item>
      <title>Utiliser TextMate pour les messages de commit SVN ou Git</title>
      <link>http://blog.happynoff.fr/post/Utiliser-TextMate-pour-les-messages-de-commit-SVN-ou-Git</link>
      <guid>http://blog.happynoff.fr/post/Utiliser-TextMate-pour-les-messages-de-commit-SVN-ou-Git</guid>
      <description>&lt;p&gt;Lorsque l&amp;#8217;on utilise un &#233;diteur de texte particulier, on appr&#233;cie de pouvoir l&amp;#8217;utiliser comme &#233;diteur par d&#233;faut pour peu tout. Cela comprend &#233;galement les messages de commit des outils tels que SVN ou Git.&lt;/p&gt;

&lt;p&gt;Malheureusement, utiliser un &#233;diteur graphique pour cela n&amp;#8217;est pas toujours trivial.&lt;/p&gt;

&lt;p&gt;La commande &lt;em&gt;mate&lt;/em&gt; propose l&amp;#8217;option &lt;em&gt;-w&lt;/em&gt; qui permet de signifier que l&amp;#8217;on veut attendre que TextMate en ait fini avec le fichier pour reprendre la main.&lt;/p&gt;
&lt;p class='note'&gt;Il est vrai que TextMate int&#232;gre les fonctionnalit&#233;s SVN et Git.
  Personnellement j'ai toujours pr&#233;f&#233;r&#233; m'occuper de ces choses l&#224; en ligne de
  commande... chacun son truc...&lt;/p&gt;
&lt;h2 id='pour_svn'&gt;Pour SVN&lt;/h2&gt;

&lt;p&gt;Il y a plusieurs fa&#231;ons de dire &#224; subversion d&amp;#8217;utiliser tel ou tel &#233;diteur, le plus simple est de donner une valeur &#224; la variable &lt;em&gt;SVN_EDITOR&lt;/em&gt; :&lt;/p&gt;
&lt;div class='CodeRay'&gt;
  &lt;div class='code'&gt;&lt;pre&gt;&lt;span class='fu'&gt;export&lt;/span&gt; &lt;span class='iv'&gt;SVN_EDITOR&lt;/span&gt;=&lt;span class='s'&gt;&lt;span class='dl'&gt;&amp;quot;&lt;/span&gt;&lt;span class='k'&gt;mate -w&lt;/span&gt;&lt;span class='dl'&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;h2 id='pour_git'&gt;Pour Git&lt;/h2&gt;

&lt;p&gt;Pour rester dans l&amp;#8217;utilisation habituelle de Git, on utilisera la commande suivante :&lt;/p&gt;
&lt;div class='CodeRay'&gt;
  &lt;div class='code'&gt;&lt;pre&gt;git config --global core.editor &lt;span class='s'&gt;&lt;span class='dl'&gt;&amp;quot;&lt;/span&gt;&lt;span class='k'&gt;mate -w&lt;/span&gt;&lt;span class='dl'&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;</description>
      <pubDate>Thu, 25 Aug 2011 15:02:58 +0200</pubDate>
    </item>
    <item>
      <title>Relever automatiquement les mails des sous dossiers dans Thunderbird</title>
      <link>http://blog.happynoff.fr/post/Relever-automatiquement-les-mails-des-sous-dossiers-dans-Thunderbird</link>
      <guid>http://blog.happynoff.fr/post/Relever-automatiquement-les-mails-des-sous-dossiers-dans-Thunderbird</guid>
      <description>&lt;p&gt;Depuis plusieurs ann&#233;es maintenant, j&amp;#8217;utilise pour lire mes mails le logiciel Thunderbird. Pratique et efficace, il n&amp;#8217;en est pas moins dot&#233; de certains d&#233;fauts plus que g&#234;nants&amp;#8230;&lt;/p&gt;

&lt;p&gt;L&amp;#8217;un d&amp;#8217;eux est que Thunderbird ne rel&#232;ve pas automatiquement les mails dans les sous dossiers. Cela devient tr&#232;s g&#234;nant lorsque l&amp;#8217;on utilise un filtrage des messages &#224; la source, autrement dit, c&#244;t&#233; serveur.&lt;/p&gt;

&lt;p&gt;Il existe toutefois une solution. Il est possible de pr&#233;ciser, pour chaque dossier, que l&amp;#8217;on souhaite que Thunderbird v&#233;rifie les nouveaux messages.&lt;/p&gt;

&lt;p&gt;Pour ce faire, il suffit de faire un clic droit sur un dossier puis sur &lt;em&gt;Propri&#233;t&#233;s&amp;#8230;&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Dans la fen&#234;tre qui s&amp;#8217;ouvre, cochez la case &lt;em&gt;Surveillez les nouveaux messages dans ce dossier&lt;/em&gt; :&lt;/p&gt;

&lt;p&gt;&lt;img src='/images/thunderbird.png' alt='Thunderbird properties' /&gt;&lt;/p&gt;

&lt;p&gt;Voil&#224;, &#224; ce jour, le mieux que l&amp;#8217;on puisse faire, mais c&amp;#8217;est mieux que rien.&lt;/p&gt;</description>
      <pubDate>Thu, 25 Aug 2011 15:02:59 +0200</pubDate>
    </item>
    <item>
      <title>Comment se passer de &amp;lt;div class=&amp;quot;clear&amp;quot;&amp;gt;&amp;lt;/div&amp;gt; ?</title>
      <link>http://blog.happynoff.fr/post/Comment-se-passer-de-div-clear</link>
      <guid>http://blog.happynoff.fr/post/Comment-se-passer-de-div-clear</guid>
      <description>&lt;p&gt;Dans mon travail de tous les jours, en tant que d&#233;veloppeur web, je me retrouve confront&#233; au probl&#232;me dit de la guillotine lorsque j&amp;#8217;utilise des &#233;l&#233;ments en &lt;em&gt;float&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Pour illustrer mes propos voici un petit exemple de code et son r&#233;sultat :&lt;/p&gt;

&lt;p&gt;Code xHTML :&lt;/p&gt;
&lt;div class='CodeRay'&gt;
  &lt;div class='code'&gt;&lt;pre&gt;&lt;span class='ta'&gt;&amp;lt;div&lt;/span&gt; &lt;span class='an'&gt;id&lt;/span&gt;=&lt;span class='s'&gt;&lt;span class='dl'&gt;&amp;quot;&lt;/span&gt;&lt;span class='k'&gt;container&lt;/span&gt;&lt;span class='dl'&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;span class='ta'&gt;&amp;gt;&lt;/span&gt;&lt;br&gt;  &lt;span class='ta'&gt;&amp;lt;div&lt;/span&gt; &lt;span class='an'&gt;class&lt;/span&gt;=&lt;span class='s'&gt;&lt;span class='dl'&gt;&amp;quot;&lt;/span&gt;&lt;span class='k'&gt;content&lt;/span&gt;&lt;span class='dl'&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;span class='ta'&gt;&amp;gt;&lt;/span&gt;&lt;span class='ta'&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;&lt;br&gt;  &lt;span class='ta'&gt;&amp;lt;div&lt;/span&gt; &lt;span class='an'&gt;class&lt;/span&gt;=&lt;span class='s'&gt;&lt;span class='dl'&gt;&amp;quot;&lt;/span&gt;&lt;span class='k'&gt;content&lt;/span&gt;&lt;span class='dl'&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;span class='ta'&gt;&amp;gt;&lt;/span&gt;&lt;span class='ta'&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;span class='ta'&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Code CSS :&lt;/p&gt;
&lt;div class='CodeRay'&gt;
  &lt;div class='code'&gt;&lt;pre&gt;&lt;span class='co'&gt;#container&lt;/span&gt; {&lt;br&gt;  &lt;span class='ke'&gt;border&lt;/span&gt;:       &lt;span class='fl'&gt;1px&lt;/span&gt; &lt;span class='vl'&gt;solid&lt;/span&gt; &lt;span class='cr'&gt;#000000&lt;/span&gt;;&lt;br&gt;  &lt;span class='ke'&gt;padding&lt;/span&gt;:      &lt;span class='fl'&gt;10px&lt;/span&gt;;&lt;br&gt;}&lt;br&gt;      &lt;br&gt;&lt;span class='cl'&gt;.content&lt;/span&gt; {&lt;br&gt;  &lt;span class='ke'&gt;background&lt;/span&gt;:   &lt;span class='cr'&gt;#999&lt;/span&gt;;&lt;br&gt;  &lt;span class='ke'&gt;float&lt;/span&gt;:        &lt;span class='vl'&gt;left&lt;/span&gt;;&lt;br&gt;  &lt;span class='ke'&gt;height&lt;/span&gt;:       &lt;span class='fl'&gt;100px&lt;/span&gt;;&lt;br&gt;  &lt;span class='ke'&gt;width&lt;/span&gt;:        &lt;span class='fl'&gt;100px&lt;/span&gt;;&lt;br&gt;  &lt;span class='ke'&gt;margin-right&lt;/span&gt;: &lt;span class='fl'&gt;10px&lt;/span&gt;;&lt;br&gt;}&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Voici le r&#233;sultat obtenu :&lt;/p&gt;

&lt;p&gt;&lt;img src='/images/float_with_problem.png' alt='Float with problem' /&gt;&lt;/p&gt;

&lt;p&gt;En effet, dans 99% des cas, ce n&amp;#8217;&#233;tait pas le but recherch&#233;.&lt;/p&gt;</description>
      <pubDate>Thu, 25 Aug 2011 15:02:53 +0200</pubDate>
    </item>
    <item>
      <title>ssh: compl&#233;tion et alias</title>
      <link>http://blog.happynoff.fr/post/ssh-completion-et-alias</link>
      <guid>http://blog.happynoff.fr/post/ssh-completion-et-alias</guid>
      <description>&lt;p&gt;Voici deux petites astuces pour am&#233;liorer l&amp;#8217;utilisation de ssh.&lt;/p&gt;

&lt;h2 id='compl&#233;tion_des_noms_dh&#244;tes'&gt;Compl&#233;tion des noms d&amp;#8217;h&#244;tes&lt;/h2&gt;

&lt;p&gt;Pour obtenir la compl&#233;tion des noms d&amp;#8217;h&#244;tes pour ssh et scp, il vous suffit d&amp;#8217;installer le paquet bash-completion.&lt;/p&gt;
&lt;div class='CodeRay'&gt;
  &lt;div class='code'&gt;&lt;pre&gt;&lt;span class='c'&gt;# Sous Debian et consorts&lt;/span&gt;&lt;br&gt;aptitude install bash-completion&lt;br&gt;&lt;br&gt;&lt;span class='c'&gt;# Sous Mac, avec macport&lt;/span&gt;&lt;br&gt;port install bash-completion&lt;br&gt;&lt;br&gt;&lt;span class='c'&gt;# Sous Mac, avec homebrew&lt;/span&gt;&lt;br&gt;brew install bash-completion&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;h2 id='alias'&gt;Alias&lt;/h2&gt;

&lt;p&gt;Il est possible de cr&#233;er des alias pour les h&#244;tes sur lesquels on se ssh. Cela se fait en &#233;ditant le fichier &lt;em&gt;~/.ssh/config&lt;/em&gt; :&lt;/p&gt;
&lt;div class='CodeRay'&gt;
  &lt;div class='code'&gt;&lt;pre&gt;Host somehost&lt;br&gt;  HostName     some.host.with.long.name&lt;br&gt;  User         someuser&lt;br&gt;  IdentityFile ~/.ssh/other_id_rsa&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Ceci permet de se connecter &#224; l&amp;#8217;h&#244;te &lt;em&gt;some.host.with.long.name&lt;/em&gt; avec l&amp;#8217;utilisateur &lt;em&gt;someuser&lt;/em&gt; en utilisant la cl&#233; &lt;em&gt;~/.ssh/other_id_rsa&lt;/em&gt; :&lt;/p&gt;
&lt;div class='CodeRay'&gt;
  &lt;div class='code'&gt;&lt;pre&gt;ssh somehost&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;</description>
      <pubDate>Thu, 25 Aug 2011 15:02:57 +0200</pubDate>
    </item>
    <item>
      <title>Changer facilement la configuration proxy de SVN</title>
      <link>http://blog.happynoff.fr/post/Changer-facilement-la-configuration-proxy-de-SVN</link>
      <guid>http://blog.happynoff.fr/post/Changer-facilement-la-configuration-proxy-de-SVN</guid>
      <description>&lt;p&gt;Comme de nombreux d&#233;veloppeurs, je suis tr&#232;s souvent amen&#233; &#224; utiliser SVN (Subversion). Comme de nombreux d&#233;veloppeurs toujours, je suis amen&#233; &#224; partir en mission chez diff&#233;rents clients qui ont chacun leur proxy. Pour peu qu&amp;#8217;on en ait d&#233;j&#224; un au boulot ou chez soi, &#231;a devient vite fatiguant de jongler entre ces diff&#233;rentes configurations.&lt;/p&gt;

&lt;p&gt;Voici donc une petite astuce toute b&#234;te pour se rendre la vie facile.&lt;/p&gt;

&lt;h2 id='configurer_un_proxy_dans_subversion'&gt;Configurer un proxy dans subversion&lt;/h2&gt;

&lt;p&gt;Premi&#232;re &#233;tape, savoir o&#249; se configure les proxies dans subversion. Tout cela se passe dans le fichier ~/.subversion/servers o&#249; l&amp;#8217;on peut trouver les lignes suivantes :&lt;/p&gt;
&lt;div class='CodeRay'&gt;
  &lt;div class='code'&gt;&lt;pre&gt;&lt;span class='c'&gt;# http-proxy-host = &lt;/span&gt;&lt;br&gt;&lt;span class='c'&gt;# http-proxy-port = 3128&lt;/span&gt;&lt;br&gt;&lt;span class='c'&gt;# http-proxy-username = &lt;/span&gt;&lt;br&gt;&lt;span class='c'&gt;# http-proxy-password =&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Comme on peut le voir, il est facile de configurer un proxy selon le serveur svn que l&amp;#8217;on veut atteindre. C&amp;#8217;est tr&#232;s bien, seulement &#231;a ne nous aide pas. Nous ce n&amp;#8217;est pas le serveur qui change mais l&amp;#8217;environnement de travail !&lt;/p&gt;

&lt;h2 id='comment_se_sauver_la_vie'&gt;Comment se sauver la vie&lt;/h2&gt;

&lt;p&gt;Tout d&amp;#8217;abord il faut cr&#233;er un fichier servers par environnement. Id&#233;alement on les place dans le dossier ~/.subversion avec un nom comme env1_servers, env2_servers (en ce qui me concerne je prends 3 lettres repr&#233;sentatives de l&amp;#8217;environnement).&lt;/p&gt;

&lt;p&gt;Pensez &#224; renommer le fichier servers existant, en def_servers par exemple car servers va devenir un lien symbolique vers le fichier qui nous int&#233;resse.&lt;/p&gt;

&lt;p&gt;On pourrait se contenter ce &#231;a et s&amp;#8217;amuser &#224; appeler ln -s &#224; tout bout de champ, voir m&#234;me cr&#233;er un alias comme &amp;#8220;ln -s ~/.subversion/env1_servers ~/.subversion/servers&amp;#8221; mais honn&#234;tement, une solution p&#233;renne (quel horrible mot) serait bien plus agr&#233;able.&lt;/p&gt;

&lt;p&gt;Voici donc une petite fonction shell qui va nous faciliter grandement la vie !&lt;/p&gt;
&lt;div class='CodeRay'&gt;
  &lt;div class='code'&gt;&lt;pre&gt;&lt;span class='c'&gt;# switch de profile svn&lt;/span&gt;&lt;br&gt;svnpro() &lt;span class='r'&gt;{&lt;/span&gt;&lt;br&gt;  &lt;span class='r'&gt;if&lt;/span&gt; &lt;span class='r'&gt;[&lt;/span&gt; -f ~/.subversion/&lt;span class='pc'&gt;$1&lt;/span&gt;_servers &lt;span class='r'&gt;]&lt;/span&gt;&lt;span class='dl'&gt;;&lt;/span&gt; &lt;span class='r'&gt;then&lt;/span&gt;&lt;br&gt;    ln -nfs &lt;span class='pc'&gt;$1&lt;/span&gt;_servers ~/.subversion/servers&lt;br&gt;  &lt;span class='r'&gt;else&lt;/span&gt;&lt;br&gt;    &lt;span class='fu'&gt;echo&lt;/span&gt; &lt;span class='s'&gt;&lt;span class='dl'&gt;&amp;quot;&lt;/span&gt;&lt;span class='pc'&gt;$1&lt;/span&gt;&lt;span class='k'&gt;\_&lt;/span&gt;&lt;span class='k'&gt;servers n'existe pas.&lt;/span&gt;&lt;span class='dl'&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;  &lt;span class='r'&gt;fi&lt;/span&gt;&lt;br&gt;&lt;span class='r'&gt;}&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Et voila, il nous suffit maintenant de l&amp;#8217;appeler de la mani&#232;re suivante et notre configuration de proxy changera.&lt;/p&gt;
&lt;div class='CodeRay'&gt;
  &lt;div class='code'&gt;&lt;pre&gt;svnpro env1&lt;br&gt;svnpro env2&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;</description>
      <pubDate>Thu, 25 Aug 2011 15:02:58 +0200</pubDate>
    </item>
    <item>
      <title>Un peu de couleur dans les diffs SVN</title>
      <link>http://blog.happynoff.fr/post/Un-peu-de-couleur-dans-les-diffs-SVN</link>
      <guid>http://blog.happynoff.fr/post/Un-peu-de-couleur-dans-les-diffs-SVN</guid>
      <description>&lt;p&gt;Les diffs SVN peuvent parfois &#234;tre longs et souvent p&#233;nibles &#224; lire. Oui il y a des + et des - mais &#231;a ne fait pas tout. Un bon moyen de simplifier cette lecture est l&amp;#8217;utilisation de couleurs.&lt;/p&gt;

&lt;p&gt;Un utilitaire bien sympathique, colordiff, permet justement de coloriser l&amp;#8217;affichage des diffs. Packag&#233; sous Debian ou disponible via MacPort.&lt;/p&gt;

&lt;p&gt;Voici comment l&amp;#8217;utiliser pour les diffs SVN.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pour une utilisation occasionnelle&lt;/strong&gt; :&lt;/p&gt;
&lt;div class='CodeRay'&gt;
  &lt;div class='code'&gt;&lt;pre&gt;svn diff --diff-cmd colordiff&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;ou&lt;/p&gt;
&lt;div class='CodeRay'&gt;
  &lt;div class='code'&gt;&lt;pre&gt;svn diff | colordiff&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Pour l&amp;#8217;&#233;tablir de mani&#232;re globale&lt;/strong&gt;, il suffit d&amp;#8217;&#233;diter le fichier &lt;em&gt;~/.subversion/config&lt;/em&gt; et d&amp;#8217;ajouter dans la section &lt;em&gt;&lt;span&gt;helpers&lt;/span&gt;&lt;/em&gt; :&lt;/p&gt;
&lt;div class='CodeRay'&gt;
  &lt;div class='code'&gt;&lt;pre&gt;diff-cmd = colordiff&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;EDIT: Pour afficher la sortie de colordiff dans less, il faut utiliser l&amp;#8217;option &lt;em&gt;-R&lt;/em&gt; de ce dernier :&lt;/p&gt;
&lt;div class='CodeRay'&gt;
  &lt;div class='code'&gt;&lt;pre&gt;svn diff | less -R&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Pour aller plus loin, un autre utilitaire permet de coloriser bien plus de choses, il s&amp;#8217;agit de &lt;a href='http://colorsvn.tigris.org/' title='page du projet colorsvn'&gt;colorsvn&lt;/a&gt;.&lt;/p&gt;</description>
      <pubDate>Thu, 25 Aug 2011 15:02:54 +0200</pubDate>
    </item>
    <item>
      <title>Ignorer les fichiers de votre IDE dans Subversion</title>
      <link>http://blog.happynoff.fr/post/Ignorer-les-fichiers-de-votre-IDE-dans-Subversion</link>
      <guid>http://blog.happynoff.fr/post/Ignorer-les-fichiers-de-votre-IDE-dans-Subversion</guid>
      <description>&lt;p&gt;Il peut arriver que, sur un projet, chacun utilise son propre IDE. Le petit probl&#232;me c&amp;#8217;est que chaque IDE cr&#233;e des fichiers qui lui sont sp&#233;cifiques. Lorsque l&amp;#8217;on utilise Subversion, g&#233;rer les &lt;em&gt;svn:ignore&lt;/em&gt; devient vite lourd. Mais une solution existe ! Ignorer localement certains fichiers.&lt;/p&gt;

&lt;p&gt;Je prendrai NetBeans comme exemple pour cet article.&lt;/p&gt;

&lt;p&gt;Voici ce que l&amp;#8217;on peut voir lors d&amp;#8217;un &lt;em&gt;svn status&lt;/em&gt; apr&#232;s la cr&#233;ation d&amp;#8217;un projet sous NetBeans depuis des sources existantes:&lt;/p&gt;
&lt;pre class='shell'&gt;&lt;kbd&gt;svn status&lt;/kbd&gt;&lt;br&gt;&lt;samp&gt;?      nbproject&lt;/samp&gt;&lt;br&gt;&lt;samp class='svn_modified'&gt;M      some\_file&lt;/samp&gt;&lt;/pre&gt;
&lt;p&gt;Dans le dossier &lt;em&gt;~/.subversion&lt;/em&gt;, il existe un fichier &lt;em&gt;config&lt;/em&gt;. Dans ce fichier, sous le groupe &lt;em&gt;&lt;span&gt;miscellany&lt;/span&gt;&lt;/em&gt;, vous trouverez les lignes suivantes :&lt;/p&gt;
&lt;div class='CodeRay'&gt;
  &lt;div class='code'&gt;&lt;pre&gt;&lt;span class='c'&gt;## Debian&lt;/span&gt;&lt;br&gt;&lt;span class='c'&gt;# global-ignores = \*.o \*.lo \*.la \*.al .libs \*.so&lt;/span&gt;&lt;br&gt;&lt;span class='c'&gt;#   \*.so.[0-9]\* \*.a \*.pyc \*.pyo \*.rej \*~ #\*# .#\* .\*.swp .DS\_Store&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span class='c'&gt;## Mac&lt;/span&gt;&lt;br&gt;&lt;span class='c'&gt;# global-ignores = \*.o \*.lo \*.la #\*# .\*.rej \*.rej&lt;/span&gt;&lt;br&gt;&lt;span class='c'&gt;#  .\*~ \*~ .#\* .DS\_Store&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Il vous suffit de d&#233;commenter ces lignes et de rajouter les fichiers que vous souhaitez ignorer :&lt;/p&gt;
&lt;div class='CodeRay'&gt;
  &lt;div class='code'&gt;&lt;pre&gt;global-ignores = *.o *.lo *.la #*# .*.rej *.rej .*~ *~ .#* .DS\_Store nbproject&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Voil&#224; le r&#233;sultat :&lt;/p&gt;
&lt;pre class='shell'&gt;&lt;kbd&gt;svn status&lt;/kbd&gt;&lt;br&gt;&lt;samp class='svn_modified'&gt;M      some\_file&lt;/samp&gt;&lt;/pre&gt;</description>
      <pubDate>Thu, 25 Aug 2011 15:02:53 +0200</pubDate>
    </item>
    <item>
      <title>Remettre GRUB apres une reinstallation de Windows</title>
      <link>http://blog.happynoff.fr/post/Remettre-GRUB-apres-une-reinstallation-de-Windows</link>
      <guid>http://blog.happynoff.fr/post/Remettre-GRUB-apres-une-reinstallation-de-Windows</guid>
      <description>&lt;p&gt;En g&#233;n&#233;ral, quand on me parle de remettre GRUB apr&#232;s une installation de Windows, la premi&#232;re chose &#224; laquelle je pense est &amp;#8220;bah tu mets un live-cd, tu montes ta partition /, tu te chroot et grub-install&amp;#8221;.&lt;/p&gt;

&lt;p&gt;En somme, &#231;a se r&#233;sume effectivement &#224; &#231;a. Mais, parfois, tout ne se passe pas comme pr&#233;vu. En effet, lors de ma derni&#232;re exp&#233;rience, lorsque je montais la partition / de ma Debian, aucune trace de hda ou sda. Rien du tout ! La raison, je ne la connais pas et, pour &#234;tre honn&#234;te, je n&amp;#8217;ai pas cherch&#233; (cr&#233;ation dynamique, quelque chose comme &#231;a ?).&lt;/p&gt;

&lt;p&gt;Bref, rien &#224; faire, ils sont introuvables. Voici donc la solution dans ce cas :&lt;/p&gt;

&lt;p&gt;Lancer le CD d&amp;#8217;installation de Debian (marche probablement avec d&amp;#8217;autre mais c&amp;#8217;est ce que j&amp;#8217;ai fait donc&amp;#8230;). Apr&#232;s le lancement, continuer jusqu&amp;#8217;au moment de la s&#233;lection du r&#233;seau, passer cette &#233;tape puis, un petit ALT+F2 (ou CTRL+ALT+F2), pour passer dans une console. Ensuite, voici la marche &#224; suivre (mon / se trouve dans /dev/sda6) :&lt;/p&gt;
&lt;pre class='shell'&gt;&lt;samp class='prompt'&gt;$ &lt;/samp&gt;&lt;kbd&gt;mount /dev/sda6 /mnt&lt;/kbd&gt;&lt;br&gt;&lt;samp class='prompt'&gt;$ &lt;/samp&gt;&lt;kbd&gt;mount -o bind /dev /mnt/dev&lt;/kbd&gt;&lt;br&gt;&lt;samp class='prompt'&gt;$ &lt;/samp&gt;&lt;kbd&gt;mount -o bind /proc /mnt/proc&lt;/kbd&gt;&lt;br&gt;&lt;samp class='prompt'&gt;$ &lt;/samp&gt;&lt;kbd&gt;chroot /mnt&lt;/kbd&gt;&lt;br&gt;&lt;samp class='prompt'&gt;$ &lt;/samp&gt;&lt;kbd&gt;grub&lt;/kbd&gt;&lt;br&gt;&lt;samp&gt;Probing devices to guess BIOS drives. This may take a long time.&lt;/samp&gt;&lt;br&gt;&lt;samp class='prompt'&gt;grub&gt; &lt;/samp&gt;&lt;kbd&gt;root (hd0,5)&lt;/kbd&gt; # trouv&#233; dans /boot/grub/menu.lst&lt;br&gt;&lt;samp class='prompt'&gt;grub&gt; &lt;/samp&gt;&lt;kbd&gt;setup (hd0)&lt;/kbd&gt;&lt;br&gt;&lt;samp&gt;sortie de grub qui dit que tout s'est bien pass&#233;&lt;/samp&gt;&lt;br&gt;&lt;samp class='prompt'&gt;grub&gt; &lt;/samp&gt;&lt;span class='comment'&gt;# CTRL+C pour sortir&lt;/span&gt;&lt;br&gt;&lt;samp class='prompt'&gt;$ &lt;/samp&gt;&lt;kbd&gt;update-grub&lt;/kbd&gt;&lt;br&gt;&lt;samp class='prompt'&gt;$ &lt;/samp&gt;&lt;kbd&gt;reboot&lt;/kbd&gt;&lt;/pre&gt;
&lt;p&gt;En ce qui me concerne, &#231;a a fonctionn&#233;. Seul un dernier souci que j&amp;#8217;ai eu, mes partitions /home et de swap ont &#233;t&#233; &#233;chang&#233;es. Donc, au red&#233;marrage, si un probl&#232;me se pose, pensez avant de tout envoyer valser &#224; passer en console de maintenance, &#224; tester le montage de vos partitions pour voir ce qu&amp;#8217;il y a dedans et modifier votre &lt;em&gt;/etc/fstab&lt;/em&gt; en cons&#233;quence&amp;#8230;&lt;/p&gt;</description>
      <pubDate>Thu, 25 Aug 2011 15:02:54 +0200</pubDate>
    </item>
    <item>
      <title>Contr&#244;ler Amarok en ligne de commande grace a DCOP</title>
      <link>http://blog.happynoff.fr/post/Controler-Amarok-en-ligne-de-commande-grace-a-DCOP</link>
      <guid>http://blog.happynoff.fr/post/Controler-Amarok-en-ligne-de-commande-grace-a-DCOP</guid>
      <description>&lt;p&gt;Pendant longtemps, je me suis demand&#233; comment on pouvait r&#233;gler le son d&amp;#8217;Amarok depuis la ligne de commande.&lt;/p&gt;

&lt;p&gt;Quel int&#233;r&#234;t, me direz-vous, alors qu&amp;#8217;il suffit de cliquer pour s&amp;#8217;en occuper ?&lt;/p&gt;

&lt;p&gt;La r&#233;ponse est simple. D&amp;#8217;un naturel fain&#233;ant, il m&amp;#8217;arrive de coder au lit et de mettre Amarok en lecture sur mon PC de bureau. Il est possible de contr&#244;ler Amarok en ligne de commande pour ce qui concerne la lecture (play, pause, stop, etc&amp;#8230;). Le contr&#244;le du son ne fait malheureusement pas partie des options. C&amp;#8217;est l&#224; que DCOP sauve des vies&amp;#8230;&lt;/p&gt;</description>
      <pubDate>Thu, 25 Aug 2011 15:02:53 +0200</pubDate>
    </item>
    <item>
      <title>Automatiser les tags ID3 de vos mp3</title>
      <link>http://blog.happynoff.fr/post/Automatiser-les-tags-ID3-de-vos-mp3</link>
      <guid>http://blog.happynoff.fr/post/Automatiser-les-tags-ID3-de-vos-mp3</guid>
      <description>&lt;p&gt;Cet article pr&#233;sente trois petits scripts ayant pour but d&amp;#8217;appliquer automatiquement les tags ID3 sur vos mp3.&lt;/p&gt;</description>
      <pubDate>Thu, 25 Aug 2011 15:02:56 +0200</pubDate>
    </item>
    <item>
      <title>Connaitre les classes heritant d'une autre classe en Ruby</title>
      <link>http://blog.happynoff.fr/post/Connaitre-les-classes-heritant-d-une-autre-classe-en-Ruby</link>
      <guid>http://blog.happynoff.fr/post/Connaitre-les-classes-heritant-d-une-autre-classe-en-Ruby</guid>
      <description>&lt;p&gt;En Ruby, pour conna&#238;tre la classe parente d&amp;#8217;une classe, un appel de m&#233;thode suffit. Malheureusement, il n&amp;#8217;existe pas de telle m&#233;thode afin d&amp;#8217;obtenir les classes h&#233;ritant d&amp;#8217;une classe donn&#233;e. Voici donc comment cr&#233;er ce comportement.&lt;/p&gt;

&lt;p&gt;Pr&#233;requis: une connaissance basique du langage Ruby est n&#233;cessaire pour comprendre certains listings de code.&lt;/p&gt;</description>
      <pubDate>Thu, 25 Aug 2011 15:02:57 +0200</pubDate>
    </item>
    <item>
      <title>VirtualBox - BSoD au demarrage de Windows</title>
      <link>http://blog.happynoff.fr/post/VirtualBox-BSoD-au-demarrage-de-Windows</link>
      <guid>http://blog.happynoff.fr/post/VirtualBox-BSoD-au-demarrage-de-Windows</guid>
      <description>&lt;p&gt;Si, comme moi, vous &#234;tes passe &#224; la nouvelle version de VirtualBox, celle de Sun, vous avez peut-&#234;tre de petits probl&#232;mes avec vos anciennes VM Windows.&lt;br /&gt;Voici comment r&#233;soudre le probl&#232;me du BSoD juste apr&#232;s l&amp;#8217;affichage du logo Windows.&lt;/p&gt;

&lt;p&gt;La manipulation est relativement simple. Il vous suffit d&amp;#8217;aller des les r&#233;glages de votre VM. Puis dans la partie &lt;em&gt;General&amp;#160;&amp;#187; Advanced&amp;#160;&amp;#187; IDE Controller Type&lt;/em&gt; de choisir &lt;em&gt;PIIX3&lt;/em&gt; a la place de &lt;em&gt;PIIX4&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;&lt;img src='/images/vbox_bsod.png' alt='r&#233;glages &#224; effectuer dans VirtualBox' /&gt;&lt;/p&gt;

&lt;p&gt;Et voil&#224; le tour est jou&#233; !&lt;/p&gt;</description>
      <pubDate>Thu, 25 Aug 2011 15:02:56 +0200</pubDate>
    </item>
    <item>
      <title>Mettre en place un serveur SVN disponible via HTTP</title>
      <link>http://blog.happynoff.fr/post/Mettre-en-place-un-serveur-SVN-disponible-via-HTTP</link>
      <guid>http://blog.happynoff.fr/post/Mettre-en-place-un-serveur-SVN-disponible-via-HTTP</guid>
      <description>&lt;p&gt;Cet article explique comment installer SVN, creer un depot et le rendre accessible par internet via HTTP grace au serveur Apache.&lt;/p&gt;</description>
      <pubDate>Thu, 25 Aug 2011 15:02:52 +0200</pubDate>
    </item>
    <item>
      <title>Ouvrir les liens de Thunderbird dans Firefox</title>
      <link>http://blog.happynoff.fr/post/Ouvrir-les-liens-de-Thunderbird-dans-Firefox</link>
      <guid>http://blog.happynoff.fr/post/Ouvrir-les-liens-de-Thunderbird-dans-Firefox</guid>
      <description>&lt;p&gt;Si comme moi, le fait que Konqueror (par exemple) s&amp;#8217;ouvre quand vous cliquez sur un lien dans Thunderbird vous insupporte, voici comment rem&#233;dier &#224; ce probl&#232;me.&lt;/p&gt;

&lt;p&gt;A ma connaissance il y a deux m&#233;thodes.&lt;/p&gt;</description>
      <pubDate>Thu, 25 Aug 2011 15:02:57 +0200</pubDate>
    </item>
    <item>
      <title>Utiliser plusieurs fois le meme VDI sous VirtualBox</title>
      <link>http://blog.happynoff.fr/post/Utiliser-plusieurs-fois-le-meme-VDI-sous-VirtualBox</link>
      <guid>http://blog.happynoff.fr/post/Utiliser-plusieurs-fois-le-meme-VDI-sous-VirtualBox</guid>
      <description>&lt;p&gt;Pendant un instant, j&amp;#8217;ai crus qu&amp;#8217;il n&amp;#8217;&#233;tait pas possible d&amp;#8217;utiliser plusieurs fois un m&#234;me fichier VDI avec VirtualBox.&lt;/p&gt;

&lt;p&gt;En effet lorsque je copiais simplement une machine virtuelle, VirtualBox me disait que cette machine &#233;tait d&#233;j&#224; enregistr&#233;e.&lt;/p&gt;

&lt;p&gt;Cette id&#233;e allant &#224; l&amp;#8217;encontre du principe m&#234;me de la virtualisation, je me suis pench&#233; sur le probl&#232;me.&lt;/p&gt;

&lt;p&gt;Il se trouve que VirtualBox est livr&#233; avec un utilitaire : VBoxManage&lt;/p&gt;

&lt;p&gt;VBoxManage permet diff&#233;rentes actions sur les fichiers VDI dont le &amp;#8216;clonevdi&amp;#8217; qui justement r&#233;pond au besoin de copie des machines virtuelles.&lt;/p&gt;

&lt;p&gt;La commande suivante permet de cr&#233;er un clone de MachineEnEntree :&lt;/p&gt;
&lt;div class='CodeRay'&gt;
  &lt;div class='code'&gt;&lt;pre&gt;VBoxManage clonevdi MachineEnEntree.vdi MachineEnSortie.vdi&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;</description>
      <pubDate>Thu, 25 Aug 2011 15:02:53 +0200</pubDate>
    </item>
    <item>
      <title>La Text User Interface de GDB</title>
      <link>http://blog.happynoff.fr/post/Text-User-Interface-de-gdb</link>
      <guid>http://blog.happynoff.fr/post/Text-User-Interface-de-gdb</guid>
      <description>&lt;p&gt;Petite chose que j&amp;#8217;ai d&#233;couverte il y &#224; quelques jours. Si vous programmez en C/C++, vous utilisez peut &#234;tre gdb pour debugger vos programmes. Une fonctionnalit&#233; agr&#233;able de gdb est son interface en mode text &amp;#8216;tui&amp;#8217;.&lt;/p&gt;</description>
      <pubDate>Thu, 25 Aug 2011 15:02:54 +0200</pubDate>
    </item>
    <item>
      <title>Un man kikoolol</title>
      <link>http://blog.happynoff.fr/post/Un-man-kikoolol</link>
      <guid>http://blog.happynoff.fr/post/Un-man-kikoolol</guid>
      <description>&lt;p&gt;Si vous &#234;tes int&#233;ress&#233; par un man en couleurs, voici un moyen de l&amp;#8217;obtenir.&lt;/p&gt;

&lt;p&gt;Commencez par installer most. Most est un pager assez sympa dans le style de more et less.&lt;/p&gt;
&lt;div class='CodeRay'&gt;
  &lt;div class='code'&gt;&lt;pre&gt;sudo aptitude install most&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Pour faire un simple test.&lt;/p&gt;
&lt;div class='CodeRay'&gt;
  &lt;div class='code'&gt;&lt;pre&gt;man -P most commande&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Si &#231;a vous pla&#238;t et que vous comptez le garder voici la marche &#224; suivre.&lt;/p&gt;
&lt;div class='CodeRay'&gt;
  &lt;div class='code'&gt;&lt;pre&gt;sudo update-alternatives --config pager&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Choisissez most&lt;/p&gt;

&lt;p&gt;Si most vous pla&#238;t mais que les couleurs vous insupportent vous pouvez les d&#233;sactiver en r&#233;glant la variable d&amp;#8217;environnement MOST_SWITCHES&amp;lt;br&amp;gt; (dans votre .&lt;em&gt;shrc par exemple)&lt;/em&gt;&lt;/p&gt;
&lt;div class='CodeRay'&gt;
  &lt;div class='code'&gt;&lt;pre&gt;&lt;span class='fu'&gt;export&lt;/span&gt; &lt;span class='iv'&gt;MOST_SWITCHES&lt;/span&gt;=&lt;span class='s'&gt;&lt;span class='dl'&gt;&amp;quot;&lt;/span&gt;&lt;span class='k'&gt;-C&lt;/span&gt;&lt;span class='dl'&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;</description>
      <pubDate>Thu, 25 Aug 2011 15:02:58 +0200</pubDate>
    </item>
    <item>
      <title>Une signature dans le style de Tron</title>
      <link>http://blog.happynoff.fr/post/Une-signature-dans-le-style-de-Tron</link>
      <guid>http://blog.happynoff.fr/post/Une-signature-dans-le-style-de-Tron</guid>
      <description>&lt;p&gt;Petit tuto pour expliquer comment faire ceci :&lt;br /&gt; (repris d&amp;#8217;un tuto que j&amp;#8217;avais &#233;crit sur Crystal XP)&lt;/p&gt;

&lt;p&gt;&lt;img src='/images/tuto_tron/tuto_tron_11.png' alt='Signature Tron' /&gt;&lt;/p&gt;</description>
      <pubDate>Thu, 25 Aug 2011 15:02:55 +0200</pubDate>
    </item>
    <item>
      <title>Installer et configurer Apache2 sous Debian</title>
      <link>http://blog.happynoff.fr/post/Installer-et-configurer-Apache2-sous-Debian</link>
      <guid>http://blog.happynoff.fr/post/Installer-et-configurer-Apache2-sous-Debian</guid>
      <description>&lt;ul&gt;
&lt;li&gt;Installer apache2&lt;/li&gt;

&lt;li&gt;Configuration basique du serveur&lt;/li&gt;

&lt;li&gt;Gestion des VirtualHosts&lt;/li&gt;
&lt;/ul&gt;</description>
      <pubDate>Thu, 25 Aug 2011 15:02:57 +0200</pubDate>
    </item>
  </channel>
</rss>

