<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0">
  <title>Le Blog du Geek Joyeux</title>
  <subtitle>Plus moins vite tu codes, moins plus vite ça plante</subtitle>
  
  <link href="http://blog.happynoff.fr" rel="alternate" />
  <id>http://blog.happynoff.fr</id>
  <updated>2012-02-03T18:03:09Z</updated>
  <author>
    <name>Simon COURTOIS</name>
  </author>
  <atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.feedburner.com/LeBlogduGeekJoyeux-atom" /><feedburner:info uri="leblogdugeekjoyeux-atom" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><entry>
    <title>Définir une ressource Active Admin dans une gem</title>
    <link href="http://feedproxy.google.com/~r/LeBlogduGeekJoyeux-atom/~3/YGsJqrV5EWo/Definir-une-ressource-Active-Admin-dans-une-gem" rel="alternate" />
    <id>http://blog.happynoff.fr/post/Definir-une-ressource-Active-Admin-dans-une-gem</id>
    <updated>2012-02-03T18:03:09Z</updated>
    <author>
      <name>Simon COURTOIS</name>
    </author>
    <content type="html">
&lt;p&gt;Si vous utilisez &lt;a href='http://activeadmin.info/'&gt;Active Admin&lt;/a&gt; pour générer vos interfaces d&amp;#8217;administration sous Rails, voici une technique pour définir des ressources depuis un engine.&lt;/p&gt;

&lt;h2 id='définir_la_ressource'&gt;Définir la ressource&lt;/h2&gt;

&lt;p&gt;Pour une question de simplicité, je place mes ressources dans un dossier &lt;code&gt;admin&lt;/code&gt; situé 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ème auquel j&amp;#8217;ai été confronté au début était celui du chargement de cette ressource.&lt;/p&gt;

&lt;p&gt;Naïvement, je l&amp;#8217;avais placée dans &lt;code&gt;app/admin/articles.rb&lt;/code&gt; dans mon engine mais elle n&amp;#8217;était pas chargée par l&amp;#8217;application. Je l&amp;#8217;ai ensuite placée dans &lt;code&gt;lib/my_engine/admin&lt;/code&gt; et ai appelé &lt;code&gt;require&lt;/code&gt; dessus. Le problème est que le modèle &lt;code&gt;Article&lt;/code&gt; n&amp;#8217;était pas encore défini au moment de l&amp;#8217;appel à &lt;code&gt;register&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;J&amp;#8217;ai donc fait appel à &lt;code&gt;after_initialize&lt;/code&gt; dans la dé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 ê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à a le mérite de fonctionner : ).&lt;/p&gt;    &lt;img src="http://feeds.feedburner.com/~r/LeBlogduGeekJoyeux-atom/~4/YGsJqrV5EWo" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://blog.happynoff.fr/post/Definir-une-ressource-Active-Admin-dans-une-gem</feedburner:origLink></entry>
  <entry>
    <title>size doesn't COUNT</title>
    <link href="http://feedproxy.google.com/~r/LeBlogduGeekJoyeux-atom/~3/Q_IHC-TrGdg/size-doesn-t-COUNT" rel="alternate" />
    <id>http://blog.happynoff.fr/post/size-doesn-t-COUNT</id>
    <updated>2012-01-17T10:16:15Z</updated>
    <author>
      <name>Simon COURTOIS</name>
    </author>
    <content type="html">
&lt;h2 id='requêtes_n1'&gt;Requêtes N+1&lt;/h2&gt;

&lt;p&gt;Lorsque vous développez avec Rails, vous devez bien sûr faire attention aux requêtes qui sont effectuées et surtout éviter les requêtes &lt;em&gt;N+1&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Les requêtes &lt;em&gt;N+1&lt;/em&gt; sont celles qui sont lancées pour chaque élé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ô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é, une requête va être lancé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;éviter ces requêtes &lt;em&gt;N+1&lt;/em&gt;. Il s&amp;#8217;agit de la mé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écupéré d&amp;#8217;un seul coup. Cela nous permet d&amp;#8217;accéder aux informations des commentaires d&amp;#8217;un article sans requête supplé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 ça ne règle pas notre problème de &lt;code&gt;count&lt;/code&gt;. En effet, si nous faisons de nouveau appel à count, les requêtes seront tout de même effectué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ô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és. Ces derniers étant déjà chargé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ô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;    &lt;img src="http://feeds.feedburner.com/~r/LeBlogduGeekJoyeux-atom/~4/Q_IHC-TrGdg" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://blog.happynoff.fr/post/size-doesn-t-COUNT</feedburner:origLink></entry>
  <entry>
    <title>Versionner ses scripts de seeding avec versioned_seeds</title>
    <link href="http://feedproxy.google.com/~r/LeBlogduGeekJoyeux-atom/~3/tP-ib_kfmqo/Versionner-ses-scripts-de-seeding-avec-versioned_seeds" rel="alternate" />
    <id>http://blog.happynoff.fr/post/Versionner-ses-scripts-de-seeding-avec-versioned_seeds</id>
    <updated>2011-12-07T21:30:47Z</updated>
    <author>
      <name>Simon COURTOIS</name>
    </author>
    <content type="html">
&lt;p&gt;Si vous vous retrouvez dans le besoin de faire des imports de données ou des insertions scriptées dans une application Rails, de nos jours vous n&amp;#8217;avez pas vraiment d&amp;#8217;autre choix que de créer des tâches rake (ou consorts) pour le faire.&lt;/p&gt;

&lt;p&gt;Dans cette idée, j&amp;#8217;ai é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écifique et de les utiliser à la manière des migrations.&lt;/p&gt;

&lt;p&gt;Son installation se fait grâce à l&amp;#8217;ajout de la ligne suivante dans votre &lt;code&gt;Gemfile&lt;/code&gt; :&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énérateur qui va cré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 à versioned_seeds de l&amp;#8217;enregistrer et de ne pas l&amp;#8217;exé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;à écrire votre script puis, une fois terminé, à appeler une tâche rake qui va l&amp;#8217;exécuter:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;rake vs:next&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Cette tâche va trouvé le prochain script non chargé jusqu&amp;#8217;à présent et le lancer. Si vous avez généré plusieurs scripts, vous pouvez faire appel à&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-à-un.&lt;/p&gt;

&lt;p&gt;Pour savoir où vous en êtes de vos scripts, vous pouvez faire appel à&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é.&lt;/p&gt;

&lt;p&gt;Pensez simplement à ignorer le fichier .versioned_seeds dans Git, il sert à stocker la liste des scripts déjà lancés et il ne doit pas être versionné puisqu&amp;#8217;il est spécifique à 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;    &lt;img src="http://feeds.feedburner.com/~r/LeBlogduGeekJoyeux-atom/~4/tP-ib_kfmqo" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://blog.happynoff.fr/post/Versionner-ses-scripts-de-seeding-avec-versioned_seeds</feedburner:origLink></entry>
  <entry>
    <title>Utiliser rvm avec cron</title>
    <link href="http://feedproxy.google.com/~r/LeBlogduGeekJoyeux-atom/~3/Dy1A7JmZ5xY/Utiliser-rvm-avec-cron" rel="alternate" />
    <id>http://blog.happynoff.fr/post/Utiliser-rvm-avec-cron</id>
    <updated>2011-09-24T05:40:12Z</updated>
    <author>
      <name>Simon COURTOIS</name>
    </author>
    <content type="html">
&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 à base de rvm. De fait, cron ne sait pas trouver ruby puisque rvm est chargé par mon fichier &lt;em&gt;.bashrc&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;La petite astuce pour que ça marche, c&amp;#8217;est de dire à cron de charger mon environnement pour ce script spé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 à exécuter.&lt;/p&gt;    &lt;img src="http://feeds.feedburner.com/~r/LeBlogduGeekJoyeux-atom/~4/Dy1A7JmZ5xY" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://blog.happynoff.fr/post/Utiliser-rvm-avec-cron</feedburner:origLink></entry>
  <entry>
    <title>Rendre git-diff plus précis</title>
    <link href="http://feedproxy.google.com/~r/LeBlogduGeekJoyeux-atom/~3/jiQiDfJ9B8o/Rendre-git-diff-plus-precis" rel="alternate" />
    <id>http://blog.happynoff.fr/post/Rendre-git-diff-plus-precis</id>
    <updated>2011-09-19T23:46:35Z</updated>
    <author>
      <name>Simon COURTOIS</name>
    </author>
    <content type="html">
&lt;p&gt;Git permet d&amp;#8217;afficher diffé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é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érence sur une ligne se joue à quelques caractères seulement, il peut être difficile de dé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écisé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é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érentes valeurs qui peuvent être utiles selon les circonstances.&lt;/p&gt;    &lt;img src="http://feeds.feedburner.com/~r/LeBlogduGeekJoyeux-atom/~4/jiQiDfJ9B8o" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://blog.happynoff.fr/post/Rendre-git-diff-plus-precis</feedburner:origLink></entry>
  <entry>
    <title>Gestion du PATH sous OS X</title>
    <link href="http://feedproxy.google.com/~r/LeBlogduGeekJoyeux-atom/~3/3jxzCXn39rw/Gestion-du-PATH-sous-OS-X" rel="alternate" />
    <id>http://blog.happynoff.fr/post/Gestion-du-PATH-sous-OS-X</id>
    <updated>2011-09-19T23:44:06Z</updated>
    <author>
      <name>Simon COURTOIS</name>
    </author>
    <content type="html">
&lt;p&gt;Une fonctionnalité bien pratique de &lt;em&gt;OS&lt;/em&gt;X_ est la gestion du PATH. En effet un mé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ée dans le PATH.&lt;/p&gt;

&lt;p&gt;La magie s&amp;#8217;opè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éné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ème est un dossier permettant d&amp;#8217;ajouter des fichiers contenant des listings en plus. Ces fichiers seront chargés à 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é MySQL avec le DMG fourni sur le site officiel, vous pouvez ajouter le chemin des exécutables mysql en créant un fichier &lt;em&gt;/etc/paths.d/mysql&lt;/em&gt; et y é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ù vous avez un exécutable dans un dossier non système et que vous souhaitez que ce dossier ait la priorité, mettez le en tête du fichier &lt;em&gt;/etc/paths&lt;/em&gt;, les chemins sont chargés dans l&amp;#8217;ordre.&lt;/p&gt;    &lt;img src="http://feeds.feedburner.com/~r/LeBlogduGeekJoyeux-atom/~4/3jxzCXn39rw" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://blog.happynoff.fr/post/Gestion-du-PATH-sous-OS-X</feedburner:origLink></entry>
  <entry>
    <title>Créer ses propres sélecteurs avec jQuery</title>
    <link href="http://feedproxy.google.com/~r/LeBlogduGeekJoyeux-atom/~3/8NWCw5WpU7U/Creer-ses-propres-selecteurs-avec-jQuery" rel="alternate" />
    <id>http://blog.happynoff.fr/post/Creer-ses-propres-selecteurs-avec-jQuery</id>
    <updated>2011-08-25T15:03:01Z</updated>
    <author>
      <name>Simon COURTOIS</name>
    </author>
    <summary type="html">
&lt;p&gt;Il y a peu, au boulot, on s&amp;#8217;est demandé si, avec jQuery, il était possible de sélectionner les éléments dont une classe correspond à modèle donné.&lt;/p&gt;

&lt;p&gt;Par exemple, sélectionner tous ceux donc la classe commence par &lt;em&gt;menu_item_&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;La réponse est oui, avec jQuery, c&amp;#8217;est possible. Voici comment.&lt;/p&gt;    </summary>
    <content type="html">
&lt;p&gt;Ce que nous cherchons à obtenir, c&amp;#8217;est quelque chose dans ce goût là&amp;#160;:&lt;/p&gt;
&lt;div class='CodeRay'&gt;
  &lt;div class='code'&gt;&lt;pre&gt;&lt;span class='pd'&gt;$&lt;/span&gt;(&lt;span class='s'&gt;&lt;span class='dl'&gt;'&lt;/span&gt;&lt;span class='k'&gt;li:classMatch(^menu_item_)&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;Il faut en fait créer un sélecteur personnalisé. Cela se fait en définissant une fonction afin d&amp;#8217;étendre les sélecteurs standards de jQuery&amp;#160;:&lt;/p&gt;
&lt;div class='CodeRay'&gt;
  &lt;div class='code'&gt;&lt;pre&gt;&lt;span class='pd'&gt;$&lt;/span&gt;.expr[&lt;span class='s'&gt;&lt;span class='dl'&gt;'&lt;/span&gt;&lt;span class='k'&gt;:&lt;/span&gt;&lt;span class='dl'&gt;'&lt;/span&gt;&lt;/span&gt;].&lt;span class='fu'&gt;nomDuFiltre&lt;/span&gt; = &lt;span class='kw'&gt;function&lt;/span&gt;(obj, index, meta, stack) {&lt;br&gt;  &lt;span class='c'&gt;// ...&lt;/span&gt;&lt;br&gt;};&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Si votre fonction retourne &lt;em&gt;vrai&lt;/em&gt; l&amp;#8217;élément est sélectionné, sinon il est rejeté. La fonction reçoit quatre arguments&amp;#160;:&lt;/p&gt;

&lt;dl&gt;
&lt;dt&gt;obj&lt;/dt&gt;

&lt;dd&gt;l&amp;#8217;élément DOM à tester&lt;/dd&gt;

&lt;dt&gt;index&lt;/dt&gt;

&lt;dd&gt;le numéro d&amp;#8217;itération dans la boucle&lt;/dd&gt;

&lt;dt&gt;meta&lt;/dt&gt;

&lt;dd&gt;les meta-données de votre sélecteur (dont les arguments)&lt;/dd&gt;

&lt;dt&gt;stack&lt;/dt&gt;

&lt;dd&gt;la pile de tous les éléments à tester&lt;/dd&gt;
&lt;/dl&gt;

&lt;p&gt;Les deux arguments qui vont nous intéresser sont &lt;em&gt;obj&lt;/em&gt; et &lt;em&gt;meta&lt;/em&gt;. Si on regarde le contenu de l&amp;#8217;argument &lt;em&gt;meta&lt;/em&gt;, on trouve ceci&amp;#160;:&lt;/p&gt;
&lt;div class='CodeRay'&gt;
  &lt;div class='code'&gt;&lt;pre&gt;[ &lt;span class='s'&gt;&lt;span class='dl'&gt;&amp;quot;&lt;/span&gt;&lt;span class='k'&gt;:classMatch(^menu_item_)&lt;/span&gt;&lt;span class='dl'&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;, &lt;span class='c'&gt;// 0&lt;/span&gt;&lt;br&gt;  &lt;span class='s'&gt;&lt;span class='dl'&gt;&amp;quot;&lt;/span&gt;&lt;span class='k'&gt;:&lt;/span&gt;&lt;span class='dl'&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;,                        &lt;span class='c'&gt;// 1&lt;/span&gt;&lt;br&gt;  &lt;span class='s'&gt;&lt;span class='dl'&gt;&amp;quot;&lt;/span&gt;&lt;span class='k'&gt;classMatch&lt;/span&gt;&lt;span class='dl'&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;,               &lt;span class='c'&gt;// 2&lt;/span&gt;&lt;br&gt;  &lt;span class='s'&gt;&lt;span class='dl'&gt;&amp;quot;&lt;/span&gt;&lt;span class='k'&gt;^menu_item_&lt;/span&gt;&lt;span class='dl'&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;,              &lt;span class='c'&gt;// 3&lt;/span&gt;&lt;br&gt;  &lt;span class='pc'&gt;undefined&lt;/span&gt; ]                 &lt;span class='c'&gt;// 4&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;L&amp;#8217;entrée qui nous intéresse est donc stockée dans &lt;em&gt;meta&lt;span&gt;3&lt;/span&gt;&lt;/em&gt;. Il ne nous reste donc plus qu&amp;#8217;à tester si une des classes de notre élément correspond à la valeur passée et à retourner vrai si tel est le cas&amp;#160;:&lt;/p&gt;
&lt;div class='CodeRay'&gt;
  &lt;div class='code'&gt;&lt;pre&gt;&lt;span class='pd'&gt;$&lt;/span&gt;.expr[&lt;span class='s'&gt;&lt;span class='dl'&gt;'&lt;/span&gt;&lt;span class='k'&gt;:&lt;/span&gt;&lt;span class='dl'&gt;'&lt;/span&gt;&lt;/span&gt;].&lt;span class='fu'&gt;classMatch&lt;/span&gt; = &lt;span class='kw'&gt;function&lt;/span&gt;(obj, index, meta, stack) {&lt;br&gt;  &lt;span class='kw'&gt;var&lt;/span&gt; pattern = &lt;span class='kw'&gt;new&lt;/span&gt; RegExp(meta[&lt;span class='i'&gt;3&lt;/span&gt;]);&lt;br&gt;  &lt;span class='kw'&gt;var&lt;/span&gt; classes = obj.className.split(&lt;span class='rx'&gt;&lt;span class='dl'&gt;/&lt;/span&gt;&lt;span class='ch'&gt;\s&lt;/span&gt;&lt;span class='k'&gt;+&lt;/span&gt;&lt;span class='dl'&gt;/&lt;/span&gt;&lt;/span&gt;);&lt;br&gt;  &lt;span class='kw'&gt;var&lt;/span&gt; found   = &lt;span class='pc'&gt;false&lt;/span&gt;;&lt;br&gt;&lt;br&gt;  &lt;span class='pd'&gt;$&lt;/span&gt;.each(classes, &lt;span class='kw'&gt;function&lt;/span&gt;() {&lt;br&gt;    found = &lt;span class='lv'&gt;this&lt;/span&gt;.match(pattern);&lt;br&gt;    &lt;span class='kw'&gt;return&lt;/span&gt; !found;&lt;br&gt;  });&lt;br&gt;&lt;br&gt;  &lt;span class='kw'&gt;return&lt;/span&gt; found;&lt;br&gt;};&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Nous pouvons maintenant utiliser notre nouveau sélecteur pour trouver les éléments qui nous intéressent.&lt;/p&gt;    &lt;img src="http://feeds.feedburner.com/~r/LeBlogduGeekJoyeux-atom/~4/8NWCw5WpU7U" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://blog.happynoff.fr/post/Creer-ses-propres-selecteurs-avec-jQuery</feedburner:origLink></entry>
  <entry>
    <title>Installation de markItUp avec preview dans une application Rails3</title>
    <link href="http://feedproxy.google.com/~r/LeBlogduGeekJoyeux-atom/~3/T6BVOAq-s9M/Installation-de-markItUp-avec-preview-dans-une-application-Rails3" rel="alternate" />
    <id>http://blog.happynoff.fr/post/Installation-de-markItUp-avec-preview-dans-une-application-Rails3</id>
    <updated>2011-08-25T15:03:01Z</updated>
    <author>
      <name>Simon COURTOIS</name>
    </author>
    <summary type="html">
&lt;p&gt;Il est fréquent d&amp;#8217;avoir besoin d&amp;#8217;un éditeur dit WYSIWYG dans un site web. Il en existe de deux types. Les éditeurs pur WYSIWYG où vous éditez directement du HTML en mode rendu final et les é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ème catégorie. Dans le cas d&amp;#8217;un éditeur de syntaxe, il est toujours plus confortable de disposer d&amp;#8217;une preview avant de valider ce qu&amp;#8217;on a é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énérer la preview.&lt;/p&gt;    </summary>
    <content type="html">
&lt;p&gt;Pour ce tutoriel, je choisirai la syntaxe markdown et mon moteur de transformation de markdown vers HTML sera &lt;a href='https://github.com/rtomayko/rdiscount/'&gt;RDiscount&lt;/a&gt;.&lt;/p&gt;

&lt;h2 id='prérequis'&gt;Prérequis&lt;/h2&gt;

&lt;p&gt;&lt;a href='http://markitup.jaysalvat.com/home/'&gt;markItUp&lt;/a&gt; se base sur &lt;a href='http://jquery.com/'&gt;jQuery&lt;/a&gt;, vous aurez donc besoin d&amp;#8217;une application Rails utilisant &lt;a href='https://github.com/rails/jquery-rails'&gt;jquery-rails&lt;/a&gt;. Je ne détaillerai pas ici la procédure d&amp;#8217;installation qui est relativement simple et très bien expliquée sur &lt;a href='https://github.com/rails/jquery-rails'&gt;la page github de jquery-rails&lt;/a&gt;.&lt;/p&gt;

&lt;h2 id='installation_de_markitup'&gt;Installation de markItUp&lt;/h2&gt;

&lt;p&gt;Commencez par télécharger la dernière version de markItUp depuis le &lt;a href='http://markitup.jaysalvat.com/home/'&gt;site officiel&lt;/a&gt;. Sauvez l&amp;#8217;archive dans &lt;em&gt;RAILS&lt;/em&gt;ROOT/public/javascripts/_. Décompressez la et déplacez le dossier &lt;em&gt;RAILS&lt;/em&gt;ROOT/public/javascripts/latest/markitup_ dans &lt;em&gt;RAILS&lt;/em&gt;ROOT/public/javascripts/markitup_. Vous pouvez ensuite supprimer &lt;em&gt;latest&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Pour récupérer les &lt;abbr title='Cascading StyleSheet'&gt;CSS&lt;/abbr&gt; et images contenues dans &lt;em&gt;markitup&lt;/em&gt;, le plus simple est de créer un lien symbolique vers &lt;em&gt;markitup&lt;/em&gt; dans &lt;em&gt;public/images&lt;/em&gt; et &lt;em&gt;public/stylesheets&lt;/em&gt;.&lt;/p&gt;
&lt;div class='CodeRay'&gt;
  &lt;div class='code'&gt;&lt;pre&gt;&lt;span class='fu'&gt;cd&lt;/span&gt; RAILS_ROOT/public/images&lt;br&gt;ln -s ../javascripts/markitup ./&lt;br&gt;&lt;br&gt;&lt;span class='fu'&gt;cd&lt;/span&gt; RAILS_ROOT/public/stylesheets&lt;br&gt;ln -s ../javascripts/markitup ./&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Vous aurez ensuite besoin d&amp;#8217;un set pour gérer Markdown. Il en existe plusieurs. Mon choix se portera ici sur &lt;a href='http://markitup.jaysalvat.com/downloads/demo.php?id=markupsets/markmin'&gt;Markmin&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Téléchargez son archive et décompressez la dans &lt;em&gt;markitup/sets/&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Une fois cela fait, il faut ajouter les balises qui vont bien dans le layout de l&amp;#8217;application.&lt;/p&gt;
&lt;div class='CodeRay'&gt;
  &lt;div class='code'&gt;&lt;pre&gt;&lt;span class='ta'&gt;&amp;lt;head&amp;gt;&lt;/span&gt;&lt;br&gt;  &lt;span class='ta'&gt;&amp;lt;title&amp;gt;&lt;/span&gt;Ma super appli Rails 3&lt;span class='ta'&gt;&amp;lt;/title&amp;gt;&lt;/span&gt;&lt;br&gt;  &lt;span class='ta'&gt;&amp;lt;meta&lt;/span&gt; &lt;span class='an'&gt;http-equiv&lt;/span&gt;=&lt;span class='s'&gt;&lt;span class='dl'&gt;&amp;quot;&lt;/span&gt;&lt;span class='k'&gt;Content-Type&lt;/span&gt;&lt;span class='dl'&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt; &lt;span class='an'&gt;content&lt;/span&gt;=&lt;span class='s'&gt;&lt;span class='dl'&gt;&amp;quot;&lt;/span&gt;&lt;span class='k'&gt;text/html; charset=utf-8&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='il'&gt;&lt;span class='idl'&gt;&amp;lt;%=&lt;/span&gt; stylesheet_link_tag &lt;span class='sy'&gt;:all&lt;/span&gt; &lt;span class='idl'&gt;%&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;br&gt;  &lt;span class='il'&gt;&lt;span class='idl'&gt;&amp;lt;%=&lt;/span&gt; stylesheet_link_tag &lt;span class='s'&gt;&lt;span class='dl'&gt;'&lt;/span&gt;&lt;span class='k'&gt;markitup/skins/simple/style.css&lt;/span&gt;&lt;span class='dl'&gt;'&lt;/span&gt;&lt;/span&gt; &lt;span class='idl'&gt;%&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;  &lt;span class='il'&gt;&lt;span class='idl'&gt;&amp;lt;%=&lt;/span&gt; stylesheet_link_tag &lt;span class='s'&gt;&lt;span class='dl'&gt;'&lt;/span&gt;&lt;span class='k'&gt;markitup/sets/markmin/style.css&lt;/span&gt;&lt;span class='dl'&gt;'&lt;/span&gt;&lt;/span&gt; &lt;span class='idl'&gt;%&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;br&gt;  &lt;span class='il'&gt;&lt;span class='idl'&gt;&amp;lt;%=&lt;/span&gt; javascript_include_tag &lt;span class='sy'&gt;:defaults&lt;/span&gt; &lt;span class='idl'&gt;%&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;  &lt;span class='il'&gt;&lt;span class='idl'&gt;&amp;lt;%=&lt;/span&gt; javascript_include_tag &lt;span class='s'&gt;&lt;span class='dl'&gt;'&lt;/span&gt;&lt;span class='k'&gt;markitup/jquery.markitup.js&lt;/span&gt;&lt;span class='dl'&gt;'&lt;/span&gt;&lt;/span&gt; &lt;span class='idl'&gt;%&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;  &lt;span class='il'&gt;&lt;span class='idl'&gt;&amp;lt;%=&lt;/span&gt; javascript_include_tag &lt;span class='s'&gt;&lt;span class='dl'&gt;'&lt;/span&gt;&lt;span class='k'&gt;markitup/sets/markmin/set.js&lt;/span&gt;&lt;span class='dl'&gt;'&lt;/span&gt;&lt;/span&gt; &lt;span class='idl'&gt;%&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;br&gt;  &lt;span class='il'&gt;&lt;span class='idl'&gt;&amp;lt;%=&lt;/span&gt; csrf_meta_tag &lt;span class='idl'&gt;%&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class='ta'&gt;&amp;lt;/head&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;On récupère donc la &lt;abbr title='Cascading StyleSheet'&gt;CSS&lt;/abbr&gt; du style Simple de &lt;a href='http://markitup.jaysalvat.com/home/'&gt;markItUp&lt;/a&gt; ainsi que celle spécifique à Markmin. De la même manière, on récupère le script de &lt;a href='http://markitup.jaysalvat.com/home/'&gt;markItUp&lt;/a&gt; et le set spécifique à Markdown.&lt;/p&gt;

&lt;h2 id='mise_en_place_de_markitup_sur_une_textarea'&gt;Mise en place de markItUp sur une textarea&lt;/h2&gt;

&lt;p&gt;Pour activer markItUp sur une textarea, cela se fait de manière très simple. Le set activé fournit de base une variable mySettings que vous pouvez utiliser telle quelle ou modifier à votre convenance.&lt;/p&gt;

&lt;p&gt;Dans public/javascripts/application.js, ajoutez le code suivant :&lt;/p&gt;
&lt;div class='CodeRay'&gt;
  &lt;div class='code'&gt;&lt;pre&gt;&lt;span class='pd'&gt;$&lt;/span&gt;(&lt;span class='s'&gt;&lt;span class='dl'&gt;'&lt;/span&gt;&lt;span class='k'&gt;textarea.markItUp&lt;/span&gt;&lt;span class='dl'&gt;'&lt;/span&gt;&lt;/span&gt;).markItUp(mySettings);&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Lorsque vous voulez activer &lt;a href='http://markitup.jaysalvat.com/home/'&gt;markItUp&lt;/a&gt;, ajoutez la classe &lt;em&gt;markItUp&lt;/em&gt; sur la textarea de votre choix :&lt;/p&gt;
&lt;div class='CodeRay'&gt;
  &lt;div class='code'&gt;&lt;pre&gt;&lt;span class='il'&gt;&lt;span class='idl'&gt;&amp;lt;%=&lt;/span&gt; f.text_area &lt;span class='sy'&gt;:content&lt;/span&gt;, &lt;span class='sy'&gt;:class&lt;/span&gt; =&amp;gt; &lt;span class='s'&gt;&lt;span class='dl'&gt;'&lt;/span&gt;&lt;span class='k'&gt;markItUp&lt;/span&gt;&lt;span class='dl'&gt;'&lt;/span&gt;&lt;/span&gt; &lt;span class='idl'&gt;%&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;h2 id='mise_en_place_du_système_de_preview_avec_sinatra'&gt;Mise en place du système de preview avec Sinatra&lt;/h2&gt;

&lt;p&gt;Pour commencer, nous allons ajouter &lt;a href='http://www.sinatrarb.com/'&gt;Sinatra&lt;/a&gt; et &lt;a href='https://github.com/rtomayko/rdiscount/'&gt;RDiscount&lt;/a&gt; dans notre &lt;em&gt;Gemfile&lt;/em&gt; :&lt;/p&gt;
&lt;div class='CodeRay'&gt;
  &lt;div class='code'&gt;&lt;pre&gt;gem &lt;span class='s'&gt;&lt;span class='dl'&gt;'&lt;/span&gt;&lt;span class='k'&gt;sinatra&lt;/span&gt;&lt;span class='dl'&gt;'&lt;/span&gt;&lt;/span&gt;&lt;br&gt;gem &lt;span class='s'&gt;&lt;span class='dl'&gt;'&lt;/span&gt;&lt;span class='k'&gt;rdiscount&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;Installons nos nouvelles gems grâce à l&amp;#8217;ami &lt;a href='http://gembundler.com/'&gt;Bundler&lt;/a&gt; :&lt;/p&gt;
&lt;div class='CodeRay'&gt;
  &lt;div class='code'&gt;&lt;pre&gt;bundle&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Écrivons ensuite notre application &lt;a href='http://www.sinatrarb.com/'&gt;Sinatra&lt;/a&gt; qui va nous demander un long travail. Vous êtes prêt ? C&amp;#8217;est parti !&lt;/p&gt;
&lt;div class='CodeRay'&gt;
  &lt;div class='code'&gt;&lt;pre&gt;&lt;span class='c'&gt;# RAILS_ROOT/lib/markitup_preview.rb&lt;/span&gt;&lt;br&gt;&lt;span class='r'&gt;class&lt;/span&gt; &lt;span class='cl'&gt;MarkitupPreview&lt;/span&gt; &amp;lt; &lt;span class='co'&gt;Sinatra&lt;/span&gt;::&lt;span class='co'&gt;Base&lt;/span&gt;&lt;br&gt;  post &lt;span class='s'&gt;&lt;span class='dl'&gt;'&lt;/span&gt;&lt;span class='k'&gt;/markitup-preview&lt;/span&gt;&lt;span class='dl'&gt;'&lt;/span&gt;&lt;/span&gt; &lt;span class='r'&gt;do&lt;/span&gt;&lt;br&gt;    &lt;span class='co'&gt;RDiscount&lt;/span&gt;.new(params[&lt;span class='sy'&gt;:code&lt;/span&gt;]).to_html&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;Hop, terminé ! C&amp;#8217;est tout&amp;#8230; Bon maintenant, il faut faire en sorte que notre application soit atteignable au travers de Rails. Commençons par inclure le fichier &lt;em&gt;markitup&lt;/em&gt;preview.rb_ dans &lt;em&gt;config/application.rb&lt;/em&gt; :&lt;/p&gt;
&lt;div class='CodeRay'&gt;
  &lt;div class='code'&gt;&lt;pre&gt;&lt;span class='co'&gt;Bundler&lt;/span&gt;.require(&lt;span class='sy'&gt;:default&lt;/span&gt;, &lt;span class='co'&gt;Rails&lt;/span&gt;.env) &lt;span class='r'&gt;if&lt;/span&gt; &lt;span class='r'&gt;defined?&lt;/span&gt;(&lt;span class='co'&gt;Bundler&lt;/span&gt;)&lt;br&gt;&lt;br&gt;require &lt;span class='s'&gt;&lt;span class='dl'&gt;'&lt;/span&gt;&lt;span class='k'&gt;lib/markitup_preview&lt;/span&gt;&lt;span class='dl'&gt;'&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span class='r'&gt;module&lt;/span&gt; &lt;span class='cl'&gt;MyRailsApp&lt;/span&gt;&lt;br&gt;  &lt;span class='r'&gt;class&lt;/span&gt; &lt;span class='cl'&gt;Application&lt;/span&gt; &amp;lt; &lt;span class='co'&gt;Rails&lt;/span&gt;::&lt;span class='co'&gt;Application&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Il nous faut également ajouter la route Rails menant à notre application :&lt;/p&gt;
&lt;div class='CodeRay'&gt;
  &lt;div class='code'&gt;&lt;pre&gt;&lt;span class='c'&gt;# RAILS_ROOT/config/routes.rb&lt;/span&gt;&lt;br&gt;post &lt;span class='s'&gt;&lt;span class='dl'&gt;'&lt;/span&gt;&lt;span class='k'&gt;markitup-preview&lt;/span&gt;&lt;span class='dl'&gt;'&lt;/span&gt;&lt;/span&gt; =&amp;gt; &lt;span class='co'&gt;MarkitupPreview&lt;/span&gt;, &lt;span class='sy'&gt;:format&lt;/span&gt; =&amp;gt; &lt;span class='pc'&gt;false&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;h2 id='contacter_le_système_de_preview_depuis_le_javascript'&gt;Contacter le système de preview depuis le JavaScript&lt;/h2&gt;

&lt;p&gt;Il nous faut retourner dans &lt;em&gt;application.js&lt;/em&gt; et personnaliser notre &lt;em&gt;mySettings&lt;/em&gt;.&lt;/p&gt;
&lt;div class='CodeRay'&gt;
  &lt;div class='code'&gt;&lt;pre&gt;mySettings[&lt;span class='s'&gt;&lt;span class='dl'&gt;'&lt;/span&gt;&lt;span class='k'&gt;previewParserPath&lt;/span&gt;&lt;span class='dl'&gt;'&lt;/span&gt;&lt;/span&gt;] = &lt;span class='s'&gt;&lt;span class='dl'&gt;'&lt;/span&gt;&lt;span class='k'&gt;/markitup-preview&lt;/span&gt;&lt;span class='dl'&gt;'&lt;/span&gt;&lt;/span&gt;;&lt;br&gt;mySettings[&lt;span class='s'&gt;&lt;span class='dl'&gt;'&lt;/span&gt;&lt;span class='k'&gt;previewParserVar&lt;/span&gt;&lt;span class='dl'&gt;'&lt;/span&gt;&lt;/span&gt;]  = &lt;span class='s'&gt;&lt;span class='dl'&gt;'&lt;/span&gt;&lt;span class='k'&gt;code&lt;/span&gt;&lt;span class='dl'&gt;'&lt;/span&gt;&lt;/span&gt;;&lt;br&gt;&lt;br&gt;mySettings[&lt;span class='s'&gt;&lt;span class='dl'&gt;'&lt;/span&gt;&lt;span class='k'&gt;markupSet&lt;/span&gt;&lt;span class='dl'&gt;'&lt;/span&gt;&lt;/span&gt;].push({&lt;br&gt;  &lt;span class='ke'&gt;name&lt;/span&gt;:       &lt;span class='s'&gt;&lt;span class='dl'&gt;'&lt;/span&gt;&lt;span class='k'&gt;Preview&lt;/span&gt;&lt;span class='dl'&gt;'&lt;/span&gt;&lt;/span&gt;,&lt;br&gt;  &lt;span class='ke'&gt;className&lt;/span&gt;:  &lt;span class='s'&gt;&lt;span class='dl'&gt;'&lt;/span&gt;&lt;span class='k'&gt;preview&lt;/span&gt;&lt;span class='dl'&gt;'&lt;/span&gt;&lt;/span&gt;,&lt;br&gt;  &lt;span class='ke'&gt;call&lt;/span&gt;:       &lt;span class='s'&gt;&lt;span class='dl'&gt;'&lt;/span&gt;&lt;span class='k'&gt;preview&lt;/span&gt;&lt;span class='dl'&gt;'&lt;/span&gt;&lt;/span&gt;&lt;br&gt;)};&lt;br&gt;&lt;br&gt;&lt;span class='pd'&gt;$&lt;/span&gt;(&lt;span class='s'&gt;&lt;span class='dl'&gt;'&lt;/span&gt;&lt;span class='k'&gt;textarea.markItUp&lt;/span&gt;&lt;span class='dl'&gt;'&lt;/span&gt;&lt;/span&gt;).markItUp(mySettings);&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;h2 id='conclusion'&gt;Conclusion&lt;/h2&gt;

&lt;p&gt;On a un système fonctionnel de preview. Par dessus tout, on a évité de créer un contrôleur qui aurait eu pour seule utilité de faire cette preview. Cool !&lt;/p&gt;    &lt;img src="http://feeds.feedburner.com/~r/LeBlogduGeekJoyeux-atom/~4/T6BVOAq-s9M" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://blog.happynoff.fr/post/Installation-de-markItUp-avec-preview-dans-une-application-Rails3</feedburner:origLink></entry>
  <entry>
    <title>La méthode inject en Ruby</title>
    <link href="http://feedproxy.google.com/~r/LeBlogduGeekJoyeux-atom/~3/6hQIy3RmaFM/La-methode-inject-en-Ruby" rel="alternate" />
    <id>http://blog.happynoff.fr/post/La-methode-inject-en-Ruby</id>
    <updated>2011-08-25T15:03:00Z</updated>
    <author>
      <name>Simon COURTOIS</name>
    </author>
    <content type="html">
&lt;p&gt;En Ruby, il existe une méthode bien pratique nommée &lt;em&gt;inject&lt;/em&gt;. Elle s&amp;#8217;utilise de la maniè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écédent, on part d&amp;#8217;une valeur de &lt;em&gt;0&lt;/em&gt; que l&amp;#8217;on modifie à chaque tour. Le code suivant est é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ère classique, on peut s&amp;#8217;en servire pour générer un tableau ou une table de hash de la maniè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é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é &lt;em&gt;true&lt;/em&gt; ou &lt;em&gt;false&lt;/em&gt; si au moins un appel a retourné &lt;em&gt;false&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Dans le cas où on veut stoper l&amp;#8217;appel à &lt;em&gt;inject&lt;/em&gt; dé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és le premier retour négatif.&lt;/p&gt;    &lt;img src="http://feeds.feedburner.com/~r/LeBlogduGeekJoyeux-atom/~4/6hQIy3RmaFM" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://blog.happynoff.fr/post/La-methode-inject-en-Ruby</feedburner:origLink></entry>
  <entry>
    <title>Éviter la création des fichiers ._ (point underscore) sous Mac OS X</title>
    <link href="http://feedproxy.google.com/~r/LeBlogduGeekJoyeux-atom/~3/Tq8KMVwhszA/eviter-point-underscore-sous-mac-os-x" rel="alternate" />
    <id>http://blog.happynoff.fr/post/eviter-point-underscore-sous-mac-os-x</id>
    <updated>2011-08-25T15:03:00Z</updated>
    <author>
      <name>Simon COURTOIS</name>
    </author>
    <content type="html">
&lt;p&gt;Un comportement plutôt gênant sous &lt;em&gt;OS X&lt;/em&gt; est la création des fichiers ._ (point underscore). C&amp;#8217;est souvent un problème quand on veut cré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êcher leur cré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;    &lt;img src="http://feeds.feedburner.com/~r/LeBlogduGeekJoyeux-atom/~4/Tq8KMVwhszA" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://blog.happynoff.fr/post/eviter-point-underscore-sous-mac-os-x</feedburner:origLink></entry>
  <entry>
    <title>Utiliser un shell non standard sous mac</title>
    <link href="http://feedproxy.google.com/~r/LeBlogduGeekJoyeux-atom/~3/J0KZkl5xBog/Utiliser-un-shell-non-standard-sous-mac" rel="alternate" />
    <id>http://blog.happynoff.fr/post/Utiliser-un-shell-non-standard-sous-mac</id>
    <updated>2011-08-25T15:03:00Z</updated>
    <author>
      <name>Simon COURTOIS</name>
    </author>
    <content type="html">
&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ègle par défaut gràce à &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;êtes pas autorisé à lancer cette application.&lt;/strong&gt;&lt;br /&gt;L&amp;#8217;administrateur a donné à votre shell une valeur illégale.&lt;/p&gt;

&lt;p&gt;Pour ré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é 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;    &lt;img src="http://feeds.feedburner.com/~r/LeBlogduGeekJoyeux-atom/~4/J0KZkl5xBog" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://blog.happynoff.fr/post/Utiliser-un-shell-non-standard-sous-mac</feedburner:origLink></entry>
  <entry>
    <title>Utiliser la sortie d'une commande comme un fichier en shell</title>
    <link href="http://feedproxy.google.com/~r/LeBlogduGeekJoyeux-atom/~3/TgIeXJ2kbpw/Utiliser-la-sortie-d-une-commande-comme-un-fichier-en-shell" rel="alternate" />
    <id>http://blog.happynoff.fr/post/Utiliser-la-sortie-d-une-commande-comme-un-fichier-en-shell</id>
    <updated>2011-08-25T15:03:00Z</updated>
    <author>
      <name>Simon COURTOIS</name>
    </author>
    <content type="html">
&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;é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à avec cette syntaxe on a la différence entre deux dossiers sans utiliser de fichiers temporaires.&lt;/p&gt;    &lt;img src="http://feeds.feedburner.com/~r/LeBlogduGeekJoyeux-atom/~4/TgIeXJ2kbpw" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://blog.happynoff.fr/post/Utiliser-la-sortie-d-une-commande-comme-un-fichier-en-shell</feedburner:origLink></entry>
  <entry>
    <title>Installer la gem mysql sous Snow Leopard</title>
    <link href="http://feedproxy.google.com/~r/LeBlogduGeekJoyeux-atom/~3/6unkTj8DqyA/Installer-la-gem-mysql-sous-Snow-Leopard" rel="alternate" />
    <id>http://blog.happynoff.fr/post/Installer-la-gem-mysql-sous-Snow-Leopard</id>
    <updated>2011-08-25T15:03:00Z</updated>
    <author>
      <name>Simon COURTOIS</name>
    </author>
    <content type="html">
&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é 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;    &lt;img src="http://feeds.feedburner.com/~r/LeBlogduGeekJoyeux-atom/~4/6unkTj8DqyA" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://blog.happynoff.fr/post/Installer-la-gem-mysql-sous-Snow-Leopard</feedburner:origLink></entry>
  <entry>
    <title>Problème de police trop fine sous Snow Leopard</title>
    <link href="http://feedproxy.google.com/~r/LeBlogduGeekJoyeux-atom/~3/dDoZOXPKT1g/Probleme-de-police-trop-fine-sous-Snow-Leopard" rel="alternate" />
    <id>http://blog.happynoff.fr/post/Probleme-de-police-trop-fine-sous-Snow-Leopard</id>
    <updated>2011-08-25T15:02:59Z</updated>
    <author>
      <name>Simon COURTOIS</name>
    </author>
    <content type="html">
&lt;p&gt;Il y a quelques jours j&amp;#8217;ai réinstallé un Snow Leopard sur un Mac Mini.&lt;/p&gt;

&lt;p&gt;Lorsque j&amp;#8217;ai lancé iTerm et TextMate, la police Monaco que j&amp;#8217;utilise dans les deux n&amp;#8217;était pas tout à fait comme d&amp;#8217;habitude, plus fine et moins agré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 écrans CRT et désactive l&amp;#8217;anti-aliasing sur les polices !&lt;/p&gt;

&lt;p&gt;Pour ré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, ça devrait être bon.&lt;/p&gt;    &lt;img src="http://feeds.feedburner.com/~r/LeBlogduGeekJoyeux-atom/~4/dDoZOXPKT1g" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://blog.happynoff.fr/post/Probleme-de-police-trop-fine-sous-Snow-Leopard</feedburner:origLink></entry>
  <entry>
    <title>Présentation de TotalFinder</title>
    <link href="http://feedproxy.google.com/~r/LeBlogduGeekJoyeux-atom/~3/nAR7P3vqmP8/Presentation-de-TotalFinder" rel="alternate" />
    <id>http://blog.happynoff.fr/post/Presentation-de-TotalFinder</id>
    <updated>2011-08-25T15:02:59Z</updated>
    <author>
      <name>Simon COURTOIS</name>
    </author>
    <summary type="html">
&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ès à pas mal de fonctionnalités bien pratiques.&lt;/p&gt;    </summary>
    <content type="html">
&lt;h2 id='réglages'&gt;Réglages&lt;/h2&gt;

&lt;p&gt;Le paramétrage de &lt;a href='http://totalfinder.binaryage.com/'&gt;TotalFinder&lt;/a&gt; se fait grâce à une entrée spécifique dans les préférences de &lt;em&gt;Finder&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;&lt;img src='/images/TotalFinder/pref-none.png' alt='Preferences TotalFinder' /&gt;&lt;/p&gt;

&lt;p&gt;Le panneau de configuration se divise en plusieurs sections regroupant les différentes fonctionnalités que je vais décrire.&lt;/p&gt;

&lt;h2 id='les_onglets'&gt;Les onglets&lt;/h2&gt;

&lt;p&gt;Un des principaux apports de &lt;a href='http://totalfinder.binaryage.com/'&gt;TotalFinder&lt;/a&gt; est la présence d&amp;#8217;onglets dans les fenêtres &lt;em&gt;Finder&lt;/em&gt;. Ils ressemblent comme deux gouttes d&amp;#8217;eau à ceux du navigateur &lt;em&gt;Chrome&lt;/em&gt; de &lt;em&gt;Google&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;&lt;img src='/images/TotalFinder/tabs.png' alt='Onglets de TotalFinder' /&gt;&lt;/p&gt;

&lt;p&gt;Il est également possible de grouper deux onglets pour obtenir une fenêtre scindée en deux.&lt;/p&gt;

&lt;p&gt;&lt;img src='/images/TotalFinder/dual-mode.png' alt='Vue scindee' /&gt;&lt;/p&gt;

&lt;h2 id='visor'&gt;Visor&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;Visor&lt;/em&gt; est une fenêtre &lt;em&gt;Finder&lt;/em&gt; qui a pour particularité d&amp;#8217;être toujours accessible grâce à un simple raccourci clavier.&lt;/p&gt;

&lt;p&gt;&lt;img src='/images/TotalFinder/visor-fade.png' alt='Fenetre Visor' /&gt;&lt;/p&gt;

&lt;p&gt;Le raccourci est, par défaut, option-`. Pour ceux qui, comme moi, utilisent un clavier &lt;em&gt;QWERTY&lt;/em&gt; mais écrivent tout de même avec les accents, ce raccourci n&amp;#8217;est pas des plus pratiques. Heureusement, cela se change facilement.&lt;/p&gt;

&lt;p&gt;&lt;img src='/images/TotalFinder/pref-visor.png' alt='Reglages Visor' /&gt;&lt;/p&gt;

&lt;p&gt;On peut voir que quelques options sont également paramétrables.&lt;/p&gt;

&lt;h2 id='asepsis'&gt;Asepsis&lt;/h2&gt;

&lt;p&gt;Le but d&amp;#8217;_Asepsis_ est d&amp;#8217;éviter la création des .DS_Store dans les dossiers locaux.&lt;/p&gt;

&lt;p&gt;Ces fichiers servent à stocker les options d&amp;#8217;affichage des dossiers mais peuvent devenir encombrants lorsque l&amp;#8217;on copie ces derniers sur un serveur ou une clé USB.&lt;/p&gt;

&lt;p&gt;Plutôt que de prendre le parti d&amp;#8217;empêcher leur création, &lt;a href='http://totalfinder.binaryage.com/'&gt;TotalFinder&lt;/a&gt; les centralise simplement dans un autre dossier (/usr/local/.dscache).&lt;/p&gt;

&lt;p&gt;De plus, une option permet d&amp;#8217;éviter la création de ces fichiers sur les machines distantes que l&amp;#8217;on visite.&lt;/p&gt;

&lt;p&gt;&lt;img src='/images/TotalFinder/pref-asepsis.png' alt='Reglages Asepsis' /&gt;&lt;/p&gt;

&lt;h2 id='tweaks'&gt;Tweaks&lt;/h2&gt;

&lt;p&gt;L&amp;#8217;onglet &lt;em&gt;Tweaks&lt;/em&gt; contient bon nombre d&amp;#8217;options bien utiles. Ces options sont d&amp;#8217;ailleurs ce qui m&amp;#8217;a amené à utiliser &lt;a href='http://totalfinder.binaryage.com/'&gt;TotalFinder&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Quand on vient de &lt;em&gt;Linux&lt;/em&gt; ou même, soyons fous, de &lt;em&gt;Windows&lt;/em&gt;, on est habitué à quelques petites choses qui peuvent cruellement manquer lorsque l&amp;#8217;on passe sous &lt;em&gt;OS X&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Il faut être honnête, &lt;em&gt;Finder&lt;/em&gt; n&amp;#8217;est pas le logiciel magique qui sauve des vies tous les jours&amp;#8230; Parmi les options qui manquent on trouvera :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;la possibilité d&amp;#8217;afficher les fichiers système ;&lt;/li&gt;

&lt;li&gt;le tri des dossiers au dessus des fichiers ;&lt;/li&gt;

&lt;li&gt;la maximisation de la fenêtre.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;TotalFinder est là pour nous offrir ce qui aurait dû être présent depuis toujours.&lt;/p&gt;

&lt;p&gt;&lt;img src='/images/TotalFinder/pref-tweaks.png' alt='Tweaks dans TotalFinder' /&gt;&lt;/p&gt;

&lt;h2 id='téléchargement'&gt;Téléchargement&lt;/h2&gt;

&lt;p&gt;Une version d&amp;#8217;essai de 30 jours est disponible.&lt;/p&gt;

&lt;p&gt;Tout se passe sur &lt;a href='http://totalfinder.binaryage.com/'&gt;http://totalfinder.binaryage.com/&lt;/a&gt;.&lt;/p&gt;

&lt;h2 id='le_prix'&gt;Le prix&lt;/h2&gt;

&lt;p&gt;On l&amp;#8217;oublie parfois mais tous les logiciels ne sont pas gratuits. &lt;a href='http://totalfinder.binaryage.com/'&gt;TotalFinder&lt;/a&gt; est effectivement payant mais le prix est tout à fait raisonnable. 15$ soit environ 10€ ce qui est assez peu par rapport à ce que l&amp;#8217;on peut dépenser pour tant de choses bien moins utiles.&lt;/p&gt;

&lt;p&gt;Il existe toutefois des moyens d&amp;#8217;obtenir une licence gratuite. En participant au projet, en aidant à dénicher des bugs ou en faisant la promotion de ce produit.&lt;/p&gt;    &lt;img src="http://feeds.feedburner.com/~r/LeBlogduGeekJoyeux-atom/~4/nAR7P3vqmP8" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://blog.happynoff.fr/post/Presentation-de-TotalFinder</feedburner:origLink></entry>
  <entry>
    <title>Travailler en case-sensitive sous Mac</title>
    <link href="http://feedproxy.google.com/~r/LeBlogduGeekJoyeux-atom/~3/b6hfZ9pVHL8/Travailler-en-case-sensitive-sous-Mac" rel="alternate" />
    <id>http://blog.happynoff.fr/post/Travailler-en-case-sensitive-sous-Mac</id>
    <updated>2011-08-25T15:02:59Z</updated>
    <author>
      <name>Simon COURTOIS</name>
    </author>
    <summary type="html">
&lt;p&gt;&lt;em&gt;HFS+&lt;/em&gt;, le système de fichiers utilisé par &lt;em&gt;Mac OS X&lt;/em&gt; depuis un bout de temps déjà est, par dé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, ça n&amp;#8217;est pas spécialement gênant. Quand il s&amp;#8217;agit de travailler cela peut vite devenir handicapant.&lt;/p&gt;    </summary>
    <content type="html">
&lt;p&gt;Exemple simple, travailler avec un &lt;abbr title='Source Control Manager'&gt;SCM&lt;/abbr&gt; comme &lt;em&gt;Git&lt;/em&gt; ou &lt;em&gt;Subversion&lt;/em&gt;. Un utilisateur utilisant un système case-sensitive ajoutera sans problème deux fichiers nommés &lt;em&gt;Hello.txt&lt;/em&gt; et &lt;em&gt;hello.txt&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Si on met à jour notre copie de travail, on se retrouve avec un seul fichier mais l&amp;#8217;outil de versionning qui en suit deux en vois toujours un modifié.&lt;/p&gt;
&lt;pre class='shell'&gt;&lt;kbd&gt;svn st&lt;/kbd&gt;&lt;br&gt;&lt;samp&gt;M hello.txt&lt;/samp&gt;&lt;br&gt;&lt;br&gt;&lt;kbd&gt;svn revert hello.txt&lt;/kbd&gt;&lt;br&gt;&lt;kbd&gt;svn st&lt;/kbd&gt;&lt;br&gt;&lt;samp&gt;M Hello.txt&lt;/samp&gt;&lt;br&gt;&lt;/pre&gt;
&lt;h2 id='solutions'&gt;Solutions&lt;/h2&gt;

&lt;p&gt;À ce stade, peu de solutions s&amp;#8217;offrent à nous, la première étant de réinstaller &lt;em&gt;OS X&lt;/em&gt; et de choisir d&amp;#8217;utiliser &lt;em&gt;HFS+&lt;/em&gt; en case-sensitive.&lt;/p&gt;

&lt;p&gt;Étant donné que ce n&amp;#8217;est pas la plus pratique des options, une alternative serait la bienvenue.&lt;/p&gt;

&lt;p&gt;En voici une.&lt;/p&gt;

&lt;h3 id='créer_un_volume_dmg'&gt;Créer un volume &lt;abbr title='Apple Disk Image'&gt;DMG&lt;/abbr&gt;&lt;/h3&gt;

&lt;p&gt;Cela revient à créer un volume amovible qui peut être utilisé comme une clé USB ou un disque dur externe. Un &lt;abbr title='Apple Disk Image'&gt;DMG&lt;/abbr&gt; peut donc être partitionné. Il est alors possible de formater une partition en &lt;em&gt;HFS+&lt;/em&gt; case-sensitive à l&amp;#8217;intérieur de ce dernier.&lt;/p&gt;

&lt;p&gt;L&amp;#8217;outil Disk Utility (présent de base sur &lt;em&gt;OS X&lt;/em&gt;) permet de créer des &lt;abbr title='Apple Disk Image'&gt;DMG&lt;/abbr&gt;. Il suffit de le lancer, de cliquer sur Nouvelle Image.&lt;/p&gt;

&lt;p&gt;&lt;img src='/images/disk_util_new_image.png' alt='disk utility new image' /&gt;&lt;/p&gt;

&lt;p&gt;Réglons ensuite les paramètres en fonction de nos besoins :&lt;/p&gt;

&lt;p&gt;&lt;img src='/images/disk_util_settings.png' alt='disk utility' /&gt;&lt;/p&gt;

&lt;p&gt;Une fois le &lt;abbr title='Apple Disk Image'&gt;DMG&lt;/abbr&gt; créé, il ne reste plus qu&amp;#8217;à le monter comme n&amp;#8217;importe quel &lt;abbr title='Apple Disk Image'&gt;DMG&lt;/abbr&gt; et de copier le contenu de la copie de travail dedans.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;ATTENTION !&lt;/strong&gt; N&amp;#8217;oubliez pas les &lt;em&gt;.git&lt;/em&gt; ou &lt;em&gt;.svn&lt;/em&gt; sinon ça ne fonctionnera pas !&lt;/p&gt;    &lt;img src="http://feeds.feedburner.com/~r/LeBlogduGeekJoyeux-atom/~4/b6hfZ9pVHL8" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://blog.happynoff.fr/post/Travailler-en-case-sensitive-sous-Mac</feedburner:origLink></entry>
  <entry>
    <title>Désactiver la résolution interactive des conflits dans Subversion</title>
    <link href="http://feedproxy.google.com/~r/LeBlogduGeekJoyeux-atom/~3/TPTeMo8JuaY/Desactiver-la-resolution-interactive-des-conflits-dans-Subversion" rel="alternate" />
    <id>http://blog.happynoff.fr/post/Desactiver-la-resolution-interactive-des-conflits-dans-Subversion</id>
    <updated>2011-08-25T15:02:59Z</updated>
    <author>
      <name>Simon COURTOIS</name>
    </author>
    <content type="html">
&lt;p&gt;Depuis la version 1.5 de Subversion, la résolution des conflits se fait de faç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éfère de loin faire un &lt;em&gt;update&lt;/em&gt; complet et corriger les conflits à posteriori.&lt;/p&gt;

&lt;p&gt;Pour le faire de maniè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ère permanente, é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;    &lt;img src="http://feeds.feedburner.com/~r/LeBlogduGeekJoyeux-atom/~4/TPTeMo8JuaY" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://blog.happynoff.fr/post/Desactiver-la-resolution-interactive-des-conflits-dans-Subversion</feedburner:origLink></entry>
  <entry>
    <title>Surcharge de méthode élégante en Javascript</title>
    <link href="http://feedproxy.google.com/~r/LeBlogduGeekJoyeux-atom/~3/wOKOiVdcMAQ/Surcharge-de-methode-elegante-en-Javascript" rel="alternate" />
    <id>http://blog.happynoff.fr/post/Surcharge-de-methode-elegante-en-Javascript</id>
    <updated>2011-08-25T15:02:52Z</updated>
    <author>
      <name>Simon COURTOIS</name>
    </author>
    <content type="html">
&lt;p&gt;Aujourd&amp;#8217;hui, j&amp;#8217;ai eu besoin de surcharger une méthode Javascript. Premier réflexe, réé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;é&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;é&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ç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;é&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;é&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à, 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çon plus élégante d&amp;#8217;obtenir le même résultat en écrivant juste le code né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;é&lt;/span&gt;_sans_sucre = mon_objet.fait_le_caf&lt;span class='er'&gt;é&lt;/span&gt;;&lt;br&gt;&lt;br&gt;mon_objet.fait_le_caf&lt;span class='er'&gt;é&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;é&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, ç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é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é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;    &lt;img src="http://feeds.feedburner.com/~r/LeBlogduGeekJoyeux-atom/~4/wOKOiVdcMAQ" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://blog.happynoff.fr/post/Surcharge-de-methode-elegante-en-Javascript</feedburner:origLink></entry>
  <entry>
    <title>Rails - Utiliser SASS avec theme_support</title>
    <link href="http://feedproxy.google.com/~r/LeBlogduGeekJoyeux-atom/~3/WJtyK53MiC4/Rails-Utiliser-SASS-avec-theme_support" rel="alternate" />
    <id>http://blog.happynoff.fr/post/Rails-Utiliser-SASS-avec-theme_support</id>
    <updated>2011-08-25T15:02:58Z</updated>
    <author>
      <name>Simon COURTOIS</name>
    </author>
    <content type="html">
&lt;p&gt;J&amp;#8217;ai eu l&amp;#8217;occasion de me prendre un petit moment la tête aujourd&amp;#8217;hui sur comment utiliser des feuilles de styles SASS au sein de thèmes dans une application Rails.&lt;/p&gt;

&lt;p&gt;Pour la gestion des thèmes, j&amp;#8217;ai utilisé theme_support qui permet de créer, pour chaque thè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;├──&lt;/span&gt; images&lt;br&gt;&lt;span class='deco'&gt;|   └──&lt;/span&gt; preview.png&lt;br&gt;&lt;span class='deco'&gt;├──&lt;/span&gt; javascripts&lt;br&gt;&lt;span class='deco'&gt;├──&lt;/span&gt; stylesheets&lt;br&gt;&lt;span class='deco'&gt;├──&lt;/span&gt; views&lt;br&gt;&lt;span class='deco'&gt;└──&lt;/span&gt; about.markdown&lt;/pre&gt;
&lt;p&gt;Ce que je cherchais à faire était de pouvoir mettre des fichiers SASS dans le dossier stylesheets, mais que les CSS compilées soient placé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é pour faire ç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ème, on ajoute son dossier stylesheets à 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;    &lt;img src="http://feeds.feedburner.com/~r/LeBlogduGeekJoyeux-atom/~4/WJtyK53MiC4" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://blog.happynoff.fr/post/Rails-Utiliser-SASS-avec-theme_support</feedburner:origLink></entry>
  <entry>
    <title>Continuer d'ouvrir ses onglets en fin de liste sous Firefox 3.6</title>
    <link href="http://feedproxy.google.com/~r/LeBlogduGeekJoyeux-atom/~3/iZvKM2QTPX4/Continuer-d-ouvrir-ses-onglets-en-fin-de-liste-sous-Firefox-3-6" rel="alternate" />
    <id>http://blog.happynoff.fr/post/Continuer-d-ouvrir-ses-onglets-en-fin-de-liste-sous-Firefox-3-6</id>
    <updated>2011-08-25T15:02:56Z</updated>
    <author>
      <name>Simon COURTOIS</name>
    </author>
    <content type="html">
&lt;p&gt;Depuis quelques jours maintenant, Firefox 3.6 est sorti. Cette nouvelle version apporte un certain nombre de nouveautés, dont certaines qui peuvent être déroutantes (&amp;#60;troll&amp;#62;le nouveau système de skins uselessfull par exemple ?&amp;#60;/troll&amp;#62;).&lt;/p&gt;

&lt;p&gt;Bref ! Une nouveauté est l&amp;#8217;ouverture des onglets relatifs (ouverture d&amp;#8217;un lien de la page courante dans un onglet) à côté de l&amp;#8217;onglet courant et non plus à la fin de la liste. Tout cela n&amp;#8217;aurait rien de bien gênant si cette fonctionnalité pouvait être désactivée grâce à une simple case à cocher&amp;#8230;&lt;/p&gt;

&lt;p&gt;Voici un moyen simple de revenir à 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é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 à &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émentaires&lt;/a&gt;&lt;/p&gt;    &lt;img src="http://feeds.feedburner.com/~r/LeBlogduGeekJoyeux-atom/~4/iZvKM2QTPX4" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://blog.happynoff.fr/post/Continuer-d-ouvrir-ses-onglets-en-fin-de-liste-sous-Firefox-3-6</feedburner:origLink></entry>
  <entry>
    <title>Utiliser GetText côté Javascript avec Rails</title>
    <link href="http://feedproxy.google.com/~r/LeBlogduGeekJoyeux-atom/~3/jZuC_6hNKxE/Utiliser-GetText-cote-Javascript-avec-Rails" rel="alternate" />
    <id>http://blog.happynoff.fr/post/Utiliser-GetText-cote-Javascript-avec-Rails</id>
    <updated>2011-08-25T15:02:56Z</updated>
    <author>
      <name>Simon COURTOIS</name>
    </author>
    <summary type="html">
&lt;p&gt;En travaillant sur une petite application Rails, j&amp;#8217;ai utilisé GetText pour l&amp;#8217;internationalisation. Jusque là, pas de problème&amp;#8230; Sauf au moment où j&amp;#8217;ai voulu traduire un message côté client (autrement dit Javascript).&lt;/p&gt;

&lt;p&gt;Je ne voulais pas faire d&amp;#8217;appel AJAX pour chaque chaine à traduire.&lt;/p&gt;

&lt;p&gt;Tout naturellement, j&amp;#8217;ai cherché un plugin simple qui fasse le travail mais n&amp;#8217;ai rien trouvé qui me convienne.&lt;/p&gt;

&lt;p&gt;J&amp;#8217;ai donc créé 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;    </summary>
    <content type="html">
&lt;h2 id='installation'&gt;Installation&lt;/h2&gt;

&lt;p&gt;gettext_json s&amp;#8217;installe comme n&amp;#8217;importe quel plugin Rails. Donc, au choix :&lt;/p&gt;

&lt;p&gt;La méthode par gem :&lt;/p&gt;
&lt;div class='CodeRay'&gt;
  &lt;div class='code'&gt;&lt;pre&gt;gem install gettext_json&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Dans &lt;em&gt;config/environment.rb&lt;/em&gt; :&lt;/p&gt;
&lt;div class='CodeRay'&gt;
  &lt;div class='code'&gt;&lt;pre&gt;config.gem &lt;span class='s'&gt;&lt;span class='dl'&gt;&amp;quot;&lt;/span&gt;&lt;span class='k'&gt;gettext_json&lt;/span&gt;&lt;span class='dl'&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;, &lt;span class='sy'&gt;:version&lt;/span&gt; =&amp;gt; &lt;span class='s'&gt;&lt;span class='dl'&gt;&amp;quot;&lt;/span&gt;&lt;span class='k'&gt;&amp;gt;= 0.0.2&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;p&gt;Puis, à la racine de votre application :&lt;/p&gt;
&lt;div class='CodeRay'&gt;
  &lt;div class='code'&gt;&lt;pre&gt;rake gems&lt;span class='r'&gt;:&lt;/span&gt;install&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Le méthode &lt;em&gt;vendor/plugins&lt;/em&gt; :&lt;/p&gt;
&lt;div class='CodeRay'&gt;
  &lt;div class='code'&gt;&lt;pre&gt;./script/plugin install git&lt;span class='r'&gt;:&lt;/span&gt;//github.com/simonc/gettext_json.git&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;h2 id='utilisation'&gt;Utilisation&lt;/h2&gt;

&lt;h3 id='initialisation'&gt;Initialisation&lt;/h3&gt;

&lt;p&gt;La première étape est de faire appel au générateur gettext_json :&lt;/p&gt;
&lt;div class='CodeRay'&gt;
  &lt;div class='code'&gt;&lt;pre&gt;./script/generate gettext_json&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Ceci va créer trois fichiers :&lt;/p&gt;

&lt;dl&gt;
&lt;dt&gt;gettext_json.js&lt;/dt&gt;

&lt;dd&gt;La micro librairie Javascript.&lt;/dd&gt;

&lt;dt&gt;lib/js_parser.rb&lt;/dt&gt;

&lt;dd&gt;Le parser de fichiers javascript pour GetText.&lt;/dd&gt;

&lt;dt&gt;lib/tasks/gettext_json.rake&lt;/dt&gt;

&lt;dd&gt;Contient la tâche rake makemo:json&lt;/dd&gt;
&lt;/dl&gt;

&lt;h3 id='génération_des_traductions'&gt;Génération des traductions&lt;/h3&gt;

&lt;p&gt;Lorsque l&amp;#8217;on utilise GetText avec Rails, on se sert en général de deux tâches rake : &lt;em&gt;updatepo&lt;/em&gt; et &lt;em&gt;makemo&lt;/em&gt;. Pour plus d&amp;#8217;informations : &lt;a href='http://www.yotabanana.com/hiki/ruby-gettext-howto-rails.html#Rakefile'&gt;Ruby-gettext-howto-rails&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Pour que les chaines à traduire dans les fichiers Javascript soient prises en compte, votre tâche updatepo doit ressembler à ceci :&lt;/p&gt;
&lt;div class='CodeRay'&gt;
  &lt;div class='code'&gt;&lt;pre&gt;desc &lt;span class='s'&gt;&lt;span class='dl'&gt;&amp;quot;&lt;/span&gt;&lt;span class='k'&gt;Update pot/po files.&lt;/span&gt;&lt;span class='dl'&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;task &lt;span class='sy'&gt;:updatepo&lt;/span&gt; &lt;span class='r'&gt;do&lt;/span&gt;&lt;br&gt;  require &lt;span class='s'&gt;&lt;span class='dl'&gt;&amp;quot;&lt;/span&gt;&lt;span class='k'&gt;gettext_rails/tools&lt;/span&gt;&lt;span class='dl'&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;  require &lt;span class='s'&gt;&lt;span class='dl'&gt;&amp;quot;&lt;/span&gt;&lt;span class='k'&gt;js_parser&lt;/span&gt;&lt;span class='dl'&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;  &lt;span class='co'&gt;GetText&lt;/span&gt;.update_pofiles(&lt;br&gt;    &lt;span class='s'&gt;&lt;span class='dl'&gt;&amp;quot;&lt;/span&gt;&lt;span class='k'&gt;your_app&lt;/span&gt;&lt;span class='dl'&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;,&lt;br&gt;    &lt;span class='co'&gt;Dir&lt;/span&gt;.glob(&lt;span class='s'&gt;&lt;span class='dl'&gt;&amp;quot;&lt;/span&gt;&lt;span class='k'&gt;{app,lib,bin,public}/**/*.{rb,erb,rjs,js}&lt;/span&gt;&lt;span class='dl'&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;),&lt;br&gt;    &lt;span class='s'&gt;&lt;span class='dl'&gt;&amp;quot;&lt;/span&gt;&lt;span class='k'&gt;your_app 1.0.0&lt;/span&gt;&lt;span class='dl'&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;br&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;Il ne reste plus qu&amp;#8217;à faire appel à la tâche rake pour obtenir les nouvelles chaines :&lt;/p&gt;
&lt;div class='CodeRay'&gt;
  &lt;div class='code'&gt;&lt;pre&gt;rake updatepo&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;h3 id='génération_du_fichier_json'&gt;Génération du fichier JSON&lt;/h3&gt;

&lt;p&gt;Pour générer le fichier de traductions utilisables par Javascript, utilisez la tâche rake suivante :&lt;/p&gt;
&lt;div class='CodeRay'&gt;
  &lt;div class='code'&gt;&lt;pre&gt;rake makemo&lt;span class='r'&gt;:&lt;/span&gt;json&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Un fichier &lt;em&gt;public/javascripts/gettext_json_translations.js&lt;/em&gt; va être créé.&lt;/p&gt;

&lt;h3 id='traduction_des_chaines'&gt;Traduction des chaines&lt;/h3&gt;

&lt;p&gt;Pour utiliser GetText côté Javascript, il faut inclure deux fichiers dans le layout de l&amp;#8217;application :&lt;/p&gt;
&lt;div class='CodeRay'&gt;
  &lt;div class='code'&gt;&lt;pre&gt;&lt;span class='il'&gt;&lt;span class='idl'&gt;&amp;lt;%=&lt;/span&gt; javascript_include_tag &lt;span class='s'&gt;&lt;span class='dl'&gt;'&lt;/span&gt;&lt;span class='k'&gt;gettext_json.js&lt;/span&gt;&lt;span class='dl'&gt;'&lt;/span&gt;&lt;/span&gt; &lt;span class='idl'&gt;%&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class='il'&gt;&lt;span class='idl'&gt;&amp;lt;%=&lt;/span&gt; javascript_include_tag &lt;span class='s'&gt;&lt;span class='dl'&gt;'&lt;/span&gt;&lt;span class='k'&gt;gettext_json_translations.js&lt;/span&gt;&lt;span class='dl'&gt;'&lt;/span&gt;&lt;/span&gt; &lt;span class='idl'&gt;%&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Il vous suffit ensuite dans vos scripts d&amp;#8217;utiliser la micro librairie :&lt;/p&gt;
&lt;div class='CodeRay'&gt;
  &lt;div class='code'&gt;&lt;pre&gt;&lt;span class='c'&gt;// Définir la locale courante (la valeur par défaut est 'en')&lt;/span&gt;&lt;br&gt;GetText.locale = &lt;span class='s'&gt;&lt;span class='dl'&gt;&amp;quot;&lt;/span&gt;&lt;span class='k'&gt;fr&lt;/span&gt;&lt;span class='dl'&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;;&lt;br&gt;&lt;span class='kw'&gt;var&lt;/span&gt; str = GetText.t(&lt;span class='s'&gt;&lt;span class='dl'&gt;&amp;quot;&lt;/span&gt;&lt;span class='k'&gt;Hello World&lt;/span&gt;&lt;span class='dl'&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;);&lt;br&gt;&lt;span class='c'&gt;//=&amp;gt; &amp;quot;Bonjour le Monde&amp;quot;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;h2 id='en_savoir_plus'&gt;En savoir plus&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href='http://github.com/simonc/gettext_json'&gt;gettext_json sur Github&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;    &lt;img src="http://feeds.feedburner.com/~r/LeBlogduGeekJoyeux-atom/~4/jZuC_6hNKxE" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://blog.happynoff.fr/post/Utiliser-GetText-cote-Javascript-avec-Rails</feedburner:origLink></entry>
  <entry>
    <title>Mettre en place un groupe de sites de démonstration</title>
    <link href="http://feedproxy.google.com/~r/LeBlogduGeekJoyeux-atom/~3/c4FsGFdQwvY/Mettre-en-place-un-groupe-de-sites-de-demonstration" rel="alternate" />
    <id>http://blog.happynoff.fr/post/Mettre-en-place-un-groupe-de-sites-de-demonstration</id>
    <updated>2011-08-25T15:02:55Z</updated>
    <author>
      <name>Simon COURTOIS</name>
    </author>
    <content type="html">
&lt;p&gt;Quand on développe de nombreux sites, on n&amp;#8217;a pas forcement envie de toucher à 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émo de ce genre de sites.&lt;/p&gt;

&lt;p&gt;Le but était d&amp;#8217;avoir un dossier contenant un nombre non limité de dossiers nommés demo1, demo2, demo3, etc&amp;#8230;&lt;/p&gt;

&lt;p&gt;Pour cela, j&amp;#8217;ai créé un dossier &lt;em&gt;demos&lt;/em&gt; à 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é 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érents dossiers de dé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à ! Après redémarrage du serveur, tout devrait fonctionner.&lt;/p&gt;    &lt;img src="http://feeds.feedburner.com/~r/LeBlogduGeekJoyeux-atom/~4/c4FsGFdQwvY" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://blog.happynoff.fr/post/Mettre-en-place-un-groupe-de-sites-de-demonstration</feedburner:origLink></entry>
  <entry>
    <title>Deverouiller un groupe de fichiers sous Mac</title>
    <link href="http://feedproxy.google.com/~r/LeBlogduGeekJoyeux-atom/~3/EZKTxBxblsg/Deverouiller-un-groupe-de-fichiers-sous-Mac" rel="alternate" />
    <id>http://blog.happynoff.fr/post/Deverouiller-un-groupe-de-fichiers-sous-Mac</id>
    <updated>2011-08-25T15:02:58Z</updated>
    <author>
      <name>Simon COURTOIS</name>
    </author>
    <content type="html">
&lt;p&gt;Dernièrement, lors de la copie de fichiers depuis le disque dur d&amp;#8217;une amie, je me suis retrouvé avec de nombreux fichiers verrouillés. Verrouillé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é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;    &lt;img src="http://feeds.feedburner.com/~r/LeBlogduGeekJoyeux-atom/~4/EZKTxBxblsg" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://blog.happynoff.fr/post/Deverouiller-un-groupe-de-fichiers-sous-Mac</feedburner:origLink></entry>
  <entry>
    <title>Utiliser Paperclip avec Rails sous Mac</title>
    <link href="http://feedproxy.google.com/~r/LeBlogduGeekJoyeux-atom/~3/c05Q2A9VVKE/Utiliser-Paperclip-avec-Rails-sous-Mac" rel="alternate" />
    <id>http://blog.happynoff.fr/post/Utiliser-Paperclip-avec-Rails-sous-Mac</id>
    <updated>2011-08-25T15:02:58Z</updated>
    <author>
      <name>Simon COURTOIS</name>
    </author>
    <content type="html">
&lt;p&gt;Pour gérer l&amp;#8217;upload de fichiers dans les applications Rails, un plugin fréquemment utilisé est Paperclip. Récemment, lors du développement d&amp;#8217;un projet, je me suis retrouvé confronté à un problème lors de l&amp;#8217;envoie des fichiers. En effet, ça ne fonctionnait pas et je recevais un message d&amp;#8217;erreur à 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è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épend au travers de Rmagick.&lt;/p&gt;

&lt;p&gt;Pour résoudre ce problème, il suffit d&amp;#8217;ajouter un initialiseur à l&amp;#8217;application.&lt;/p&gt;

&lt;p&gt;J&amp;#8217;ai donc ajouté 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é ce chemin car j&amp;#8217;ai installé ImageMagick en utilisant MacPorts.&lt;/p&gt;    &lt;img src="http://feeds.feedburner.com/~r/LeBlogduGeekJoyeux-atom/~4/c05Q2A9VVKE" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://blog.happynoff.fr/post/Utiliser-Paperclip-avec-Rails-sous-Mac</feedburner:origLink></entry>
  <entry>
    <title>SSH automatique sur une machine au travers d'une autre</title>
    <link href="http://feedproxy.google.com/~r/LeBlogduGeekJoyeux-atom/~3/RWrI4PI1smY/SSH-automatique-sur-une-machine-au-travers-d-une-autre" rel="alternate" />
    <id>http://blog.happynoff.fr/post/SSH-automatique-sur-une-machine-au-travers-d-une-autre</id>
    <updated>2011-08-25T15:02:54Z</updated>
    <author>
      <name>Simon COURTOIS</name>
    </author>
    <summary type="html">
&lt;p&gt;Parfois, pour se connecter en SSH sur une machine, il est nécessaire de passer au pré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éné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 être simplifié de plusieurs manières.&lt;/p&gt;    </summary>
    <content type="html">
&lt;p&gt;Pour une connexion ponctuelle, l&amp;#8217;utilisation de l&amp;#8217;option &lt;em&gt;-t&lt;/em&gt; permet de gagner du temps :&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 -t user2@machine2&lt;/kbd&gt;&lt;br&gt;&lt;samp&gt;Welcome to machine1&lt;/samp&gt;&lt;br&gt;&lt;samp&gt;Welcome to machine2&lt;/samp&gt;&lt;br&gt;&lt;samp class='prompt'&gt;machine&amp;gt; &lt;/samp&gt;&lt;/pre&gt;&lt;/p&gt;

&lt;p&gt;Quand il s&amp;#8217;agit d&amp;#8217;utiliser ce genre de connexion de façon plus fréquente, déclarer ce mécanisme en configuration est beaucoup plus simple. Pour ce faire, il suffit d&amp;#8217;éditer le fichier &lt;em&gt;~/.ssh/config&lt;/em&gt; et d&amp;#8217;y insérer les lignes suivantes :&lt;/p&gt;
&lt;div class='CodeRay'&gt;
  &lt;div class='code'&gt;&lt;pre&gt;Host machine1&lt;br&gt;  User user1&lt;br&gt;&lt;br&gt;Host machine2&lt;br&gt;  User user2&lt;br&gt;  ProxyCommand ssh machine1 nc %h %p 2&amp;gt; /dev/null&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Cela permet de définir la manière dont on se connecte à &lt;em&gt;machine2&lt;/em&gt; :&lt;/p&gt;
&lt;pre class='shell'&gt;&lt;samp class='prompt'&gt;$ &lt;/samp&gt;&lt;kbd&gt;ssh machine2&lt;/kbd&gt;&lt;br&gt;&lt;samp class='prompt'&gt;machine2&amp;gt; &lt;/samp&gt;&lt;/pre&gt;    &lt;img src="http://feeds.feedburner.com/~r/LeBlogduGeekJoyeux-atom/~4/RWrI4PI1smY" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://blog.happynoff.fr/post/SSH-automatique-sur-une-machine-au-travers-d-une-autre</feedburner:origLink></entry>
  <entry>
    <title>Ignorer les changements d'espaces dans un diff SVN</title>
    <link href="http://feedproxy.google.com/~r/LeBlogduGeekJoyeux-atom/~3/57fjqvo7bW4/Ignorer-les-changements-d-espaces-dans-un-diff-SVN" rel="alternate" />
    <id>http://blog.happynoff.fr/post/Ignorer-les-changements-d-espaces-dans-un-diff-SVN</id>
    <updated>2011-08-25T15:02:54Z</updated>
    <author>
      <name>Simon COURTOIS</name>
    </author>
    <content type="html">
&lt;p&gt;Lorsque l&amp;#8217;on édite un fichier, il peut arriver qu&amp;#8217;en plus de simples modifications, certaines portions, voire le fichier entier, soient re-indentées. Malheureusement, Subversion étant bête et discipliné, un &lt;em&gt;svn diff&lt;/em&gt; montrera les lignes modifiées mais également les lignes simplement indentées.&lt;/p&gt;

&lt;p&gt;Cela peut devenir gênant lorsque, par exemple, tout le fichier s&amp;#8217;en retrouve changé.&lt;/p&gt;

&lt;p&gt;Pour ignorer ces différences d&amp;#8217;espaces lors d&amp;#8217;un &lt;em&gt;diff&lt;/em&gt;, la commande à 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;    &lt;img src="http://feeds.feedburner.com/~r/LeBlogduGeekJoyeux-atom/~4/57fjqvo7bW4" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://blog.happynoff.fr/post/Ignorer-les-changements-d-espaces-dans-un-diff-SVN</feedburner:origLink></entry>
  <entry>
    <title>Problème des noms de fichiers avec accents dans Subversion sous OS X</title>
    <link href="http://feedproxy.google.com/~r/LeBlogduGeekJoyeux-atom/~3/P3HGuzLNlww/Probleme-des-noms-de-fichiers-avec-accents-dans-Subversion-sous-OS-X" rel="alternate" />
    <id>http://blog.happynoff.fr/post/Probleme-des-noms-de-fichiers-avec-accents-dans-Subversion-sous-OS-X</id>
    <updated>2011-08-25T15:02:54Z</updated>
    <author>
      <name>Simon COURTOIS</name>
    </author>
    <content type="html">
&lt;p&gt;Si vous utilisez des fichiers dont le nom contient des accents sur un dépô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é Subversion avec &lt;em&gt;MacPorts&lt;/em&gt;. Le problème vient de la différence de stockage des caractè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ésoudre ce problème. C&amp;#8217;est trè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é, vous ne devriez plus avoir de problèmes.&lt;/p&gt;

&lt;p&gt;NOTE: j&amp;#8217;ai ajouté 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;    &lt;img src="http://feeds.feedburner.com/~r/LeBlogduGeekJoyeux-atom/~4/P3HGuzLNlww" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://blog.happynoff.fr/post/Probleme-des-noms-de-fichiers-avec-accents-dans-Subversion-sous-OS-X</feedburner:origLink></entry>
  <entry>
    <title>Utiliser TextMate pour les messages de commit SVN ou Git</title>
    <link href="http://feedproxy.google.com/~r/LeBlogduGeekJoyeux-atom/~3/yLmbNMhJvEs/Utiliser-TextMate-pour-les-messages-de-commit-SVN-ou-Git" rel="alternate" />
    <id>http://blog.happynoff.fr/post/Utiliser-TextMate-pour-les-messages-de-commit-SVN-ou-Git</id>
    <updated>2011-08-25T15:02:58Z</updated>
    <author>
      <name>Simon COURTOIS</name>
    </author>
    <content type="html">
&lt;p&gt;Lorsque l&amp;#8217;on utilise un éditeur de texte particulier, on apprécie de pouvoir l&amp;#8217;utiliser comme éditeur par défaut pour peu tout. Cela comprend également les messages de commit des outils tels que SVN ou Git.&lt;/p&gt;

&lt;p&gt;Malheureusement, utiliser un é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ègre les fonctionnalités SVN et Git.
  Personnellement j'ai toujours préféré m'occuper de ces choses là 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çons de dire à subversion d&amp;#8217;utiliser tel ou tel éditeur, le plus simple est de donner une valeur à 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;    &lt;img src="http://feeds.feedburner.com/~r/LeBlogduGeekJoyeux-atom/~4/yLmbNMhJvEs" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://blog.happynoff.fr/post/Utiliser-TextMate-pour-les-messages-de-commit-SVN-ou-Git</feedburner:origLink></entry>
  <entry>
    <title>Relever automatiquement les mails des sous dossiers dans Thunderbird</title>
    <link href="http://feedproxy.google.com/~r/LeBlogduGeekJoyeux-atom/~3/VTiPmB88MVE/Relever-automatiquement-les-mails-des-sous-dossiers-dans-Thunderbird" rel="alternate" />
    <id>http://blog.happynoff.fr/post/Relever-automatiquement-les-mails-des-sous-dossiers-dans-Thunderbird</id>
    <updated>2011-08-25T15:02:59Z</updated>
    <author>
      <name>Simon COURTOIS</name>
    </author>
    <content type="html">
&lt;p&gt;Depuis plusieurs anné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é de certains défauts plus que gênants&amp;#8230;&lt;/p&gt;

&lt;p&gt;L&amp;#8217;un d&amp;#8217;eux est que Thunderbird ne relève pas automatiquement les mails dans les sous dossiers. Cela devient très gênant lorsque l&amp;#8217;on utilise un filtrage des messages à la source, autrement dit, côté serveur.&lt;/p&gt;

&lt;p&gt;Il existe toutefois une solution. Il est possible de préciser, pour chaque dossier, que l&amp;#8217;on souhaite que Thunderbird vé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étés&amp;#8230;&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Dans la fenê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à, à ce jour, le mieux que l&amp;#8217;on puisse faire, mais c&amp;#8217;est mieux que rien.&lt;/p&gt;    &lt;img src="http://feeds.feedburner.com/~r/LeBlogduGeekJoyeux-atom/~4/VTiPmB88MVE" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://blog.happynoff.fr/post/Relever-automatiquement-les-mails-des-sous-dossiers-dans-Thunderbird</feedburner:origLink></entry>
  <entry>
    <title>Comment se passer de &amp;lt;div class=&amp;quot;clear&amp;quot;&amp;gt;&amp;lt;/div&amp;gt; ?</title>
    <link href="http://feedproxy.google.com/~r/LeBlogduGeekJoyeux-atom/~3/wtnQoqXfAoM/Comment-se-passer-de-div-clear" rel="alternate" />
    <id>http://blog.happynoff.fr/post/Comment-se-passer-de-div-clear</id>
    <updated>2011-08-25T15:02:53Z</updated>
    <author>
      <name>Simon COURTOIS</name>
    </author>
    <summary type="html">
&lt;p&gt;Dans mon travail de tous les jours, en tant que développeur web, je me retrouve confronté au problème dit de la guillotine lorsque j&amp;#8217;utilise des élé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é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é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;était pas le but recherché.&lt;/p&gt;    </summary>
    <content type="html">
&lt;p&gt;Pour corriger ce comportement il existe plusieurs solutions. La seule que je connaissais jusqu&amp;#8217;à maintenant était la technique de la &lt;em&gt;div clear&lt;/em&gt;.&lt;/p&gt;

&lt;h2 id='technique_de_la_div_clear'&gt;Technique de la div clear&lt;/h2&gt;

&lt;p&gt;Cette technique consiste à ajouter une &lt;em&gt;div&lt;/em&gt; ayant pour particularité d&amp;#8217;avoir la propriété CSS &lt;em&gt;clear: both;&lt;/em&gt;&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&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;clear&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;br&gt;&lt;br&gt;&lt;span class='cl'&gt;.clear&lt;/span&gt; {&lt;br&gt;  &lt;span class='ke'&gt;clear&lt;/span&gt;: &lt;span class='vl'&gt;both&lt;/span&gt;;&lt;br&gt;}&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Voici le résultat :&lt;/p&gt;

&lt;p&gt;&lt;img src='/images/float_with_no_problem.png' alt='Float with no problem' /&gt;&lt;/p&gt;

&lt;p&gt;Cette solution permet d&amp;#8217;obtenir le résultat voulu mais un souci subsiste, l&amp;#8217;utilisation d&amp;#8217;une balise présente uniquement pour le style.&amp;lt;br&amp;gt; C&amp;#8217;est mal !&lt;/p&gt;

&lt;p&gt;Voici donc une solution purement CSS se basant sur l&amp;#8217;utilisation de la propriété &lt;em&gt;overflow&lt;/em&gt;.&lt;/p&gt;

&lt;h2 id='la_technique_overflow'&gt;La technique Overflow&lt;/h2&gt;

&lt;p&gt;Pour cette technique il suffit simplement d&amp;#8217;ajouter la propriété &lt;em&gt;overflow: hidden&lt;/em&gt; sur le conteneur.&lt;/p&gt;

&lt;p&gt;Edit: Attention ! Pensez à préciser une &lt;em&gt;width&lt;/em&gt;, sinon la technique risque de ne pas marcher sous certains navigateurs !&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;span class='ke'&gt;overflow&lt;/span&gt;:     &lt;span class='vl'&gt;hidden&lt;/span&gt;;&lt;br&gt;  &lt;span class='ke'&gt;width&lt;/span&gt;:        &lt;span class='fl'&gt;100%&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;Le résultat est le même mais le code HTML reste cantoné au strict minimum ;).&lt;/p&gt;

&lt;p&gt;&lt;img src='/images/float_with_no_problem.png' alt='Float with no problem' /&gt;&lt;/p&gt;

&lt;p&gt;Enjoy !&lt;/p&gt;    &lt;img src="http://feeds.feedburner.com/~r/LeBlogduGeekJoyeux-atom/~4/wtnQoqXfAoM" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://blog.happynoff.fr/post/Comment-se-passer-de-div-clear</feedburner:origLink></entry>
  <entry>
    <title>ssh: complétion et alias</title>
    <link href="http://feedproxy.google.com/~r/LeBlogduGeekJoyeux-atom/~3/q3oOCUqPajY/ssh-completion-et-alias" rel="alternate" />
    <id>http://blog.happynoff.fr/post/ssh-completion-et-alias</id>
    <updated>2011-08-25T15:02:57Z</updated>
    <author>
      <name>Simon COURTOIS</name>
    </author>
    <content type="html">
&lt;p&gt;Voici deux petites astuces pour améliorer l&amp;#8217;utilisation de ssh.&lt;/p&gt;

&lt;h2 id='complétion_des_noms_dhôtes'&gt;Complétion des noms d&amp;#8217;hôtes&lt;/h2&gt;

&lt;p&gt;Pour obtenir la complétion des noms d&amp;#8217;hô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éer des alias pour les hôtes sur lesquels on se ssh. Cela se fait en é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 à l&amp;#8217;hô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é &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;    &lt;img src="http://feeds.feedburner.com/~r/LeBlogduGeekJoyeux-atom/~4/q3oOCUqPajY" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://blog.happynoff.fr/post/ssh-completion-et-alias</feedburner:origLink></entry>
  <entry>
    <title>Changer facilement la configuration proxy de SVN</title>
    <link href="http://feedproxy.google.com/~r/LeBlogduGeekJoyeux-atom/~3/_9HUh71s_1Y/Changer-facilement-la-configuration-proxy-de-SVN" rel="alternate" />
    <id>http://blog.happynoff.fr/post/Changer-facilement-la-configuration-proxy-de-SVN</id>
    <updated>2011-08-25T15:02:58Z</updated>
    <author>
      <name>Simon COURTOIS</name>
    </author>
    <content type="html">
&lt;p&gt;Comme de nombreux développeurs, je suis très souvent amené à utiliser SVN (Subversion). Comme de nombreux développeurs toujours, je suis amené à partir en mission chez différents clients qui ont chacun leur proxy. Pour peu qu&amp;#8217;on en ait déjà un au boulot ou chez soi, ça devient vite fatiguant de jongler entre ces différentes configurations.&lt;/p&gt;

&lt;p&gt;Voici donc une petite astuce toute bê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ère étape, savoir où se configure les proxies dans subversion. Tout cela se passe dans le fichier ~/.subversion/servers où 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ès bien, seulement ç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éer un fichier servers par environnement. Idé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ésentatives de l&amp;#8217;environnement).&lt;/p&gt;

&lt;p&gt;Pensez à renommer le fichier servers existant, en def_servers par exemple car servers va devenir un lien symbolique vers le fichier qui nous intéresse.&lt;/p&gt;

&lt;p&gt;On pourrait se contenter ce ça et s&amp;#8217;amuser à appeler ln -s à tout bout de champ, voir même créer un alias comme &amp;#8220;ln -s ~/.subversion/env1_servers ~/.subversion/servers&amp;#8221; mais honnêtement, une solution pérenne (quel horrible mot) serait bien plus agré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è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;    &lt;img src="http://feeds.feedburner.com/~r/LeBlogduGeekJoyeux-atom/~4/_9HUh71s_1Y" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://blog.happynoff.fr/post/Changer-facilement-la-configuration-proxy-de-SVN</feedburner:origLink></entry>
  <entry>
    <title>Un peu de couleur dans les diffs SVN</title>
    <link href="http://feedproxy.google.com/~r/LeBlogduGeekJoyeux-atom/~3/_ER1stXfIs8/Un-peu-de-couleur-dans-les-diffs-SVN" rel="alternate" />
    <id>http://blog.happynoff.fr/post/Un-peu-de-couleur-dans-les-diffs-SVN</id>
    <updated>2011-08-25T15:02:54Z</updated>
    <author>
      <name>Simon COURTOIS</name>
    </author>
    <content type="html">
&lt;p&gt;Les diffs SVN peuvent parfois être longs et souvent pénibles à lire. Oui il y a des + et des - mais ç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é 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;établir de manière globale&lt;/strong&gt;, il suffit d&amp;#8217;é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;    &lt;img src="http://feeds.feedburner.com/~r/LeBlogduGeekJoyeux-atom/~4/_ER1stXfIs8" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://blog.happynoff.fr/post/Un-peu-de-couleur-dans-les-diffs-SVN</feedburner:origLink></entry>
  <entry>
    <title>Ignorer les fichiers de votre IDE dans Subversion</title>
    <link href="http://feedproxy.google.com/~r/LeBlogduGeekJoyeux-atom/~3/mw2-sVa_hKk/Ignorer-les-fichiers-de-votre-IDE-dans-Subversion" rel="alternate" />
    <id>http://blog.happynoff.fr/post/Ignorer-les-fichiers-de-votre-IDE-dans-Subversion</id>
    <updated>2011-08-25T15:02:53Z</updated>
    <author>
      <name>Simon COURTOIS</name>
    </author>
    <content type="html">
&lt;p&gt;Il peut arriver que, sur un projet, chacun utilise son propre IDE. Le petit problème c&amp;#8217;est que chaque IDE crée des fichiers qui lui sont spécifiques. Lorsque l&amp;#8217;on utilise Subversion, gé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ès la cré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é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à le ré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;    &lt;img src="http://feeds.feedburner.com/~r/LeBlogduGeekJoyeux-atom/~4/mw2-sVa_hKk" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://blog.happynoff.fr/post/Ignorer-les-fichiers-de-votre-IDE-dans-Subversion</feedburner:origLink></entry>
  <entry>
    <title>Remettre GRUB apres une reinstallation de Windows</title>
    <link href="http://feedproxy.google.com/~r/LeBlogduGeekJoyeux-atom/~3/dlc7B2PUuNw/Remettre-GRUB-apres-une-reinstallation-de-Windows" rel="alternate" />
    <id>http://blog.happynoff.fr/post/Remettre-GRUB-apres-une-reinstallation-de-Windows</id>
    <updated>2011-08-25T15:02:54Z</updated>
    <author>
      <name>Simon COURTOIS</name>
    </author>
    <content type="html">
&lt;p&gt;En général, quand on me parle de remettre GRUB après une installation de Windows, la première chose à 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, ça se résume effectivement à ça. Mais, parfois, tout ne se passe pas comme prévu. En effet, lors de ma dernière expé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 être honnête, je n&amp;#8217;ai pas cherché (création dynamique, quelque chose comme ça ?).&lt;/p&gt;

&lt;p&gt;Bref, rien à 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ès le lancement, continuer jusqu&amp;#8217;au moment de la sélection du réseau, passer cette étape puis, un petit ALT+F2 (ou CTRL+ALT+F2), pour passer dans une console. Ensuite, voici la marche à 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é 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é&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, ça a fonctionné. Seul un dernier souci que j&amp;#8217;ai eu, mes partitions /home et de swap ont été échangées. Donc, au redémarrage, si un problème se pose, pensez avant de tout envoyer valser à passer en console de maintenance, à 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équence&amp;#8230;&lt;/p&gt;    &lt;img src="http://feeds.feedburner.com/~r/LeBlogduGeekJoyeux-atom/~4/dlc7B2PUuNw" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://blog.happynoff.fr/post/Remettre-GRUB-apres-une-reinstallation-de-Windows</feedburner:origLink></entry>
  <entry>
    <title>Contrôler Amarok en ligne de commande grace a DCOP</title>
    <link href="http://feedproxy.google.com/~r/LeBlogduGeekJoyeux-atom/~3/HU9SRvWCulw/Controler-Amarok-en-ligne-de-commande-grace-a-DCOP" rel="alternate" />
    <id>http://blog.happynoff.fr/post/Controler-Amarok-en-ligne-de-commande-grace-a-DCOP</id>
    <updated>2011-08-25T15:02:53Z</updated>
    <author>
      <name>Simon COURTOIS</name>
    </author>
    <summary type="html">
&lt;p&gt;Pendant longtemps, je me suis demandé comment on pouvait régler le son d&amp;#8217;Amarok depuis la ligne de commande.&lt;/p&gt;

&lt;p&gt;Quel intérê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éponse est simple. D&amp;#8217;un naturel fainé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ôler Amarok en ligne de commande pour ce qui concerne la lecture (play, pause, stop, etc&amp;#8230;). Le contrôle du son ne fait malheureusement pas partie des options. C&amp;#8217;est là que DCOP sauve des vies&amp;#8230;&lt;/p&gt;    </summary>
    <content type="html">
&lt;h2 id='dcop'&gt;DCOP&lt;/h2&gt;
&lt;blockquote cite='http://fr.wikipedia.org/wiki/DCOP'&gt;
  &lt;p&gt;DCOP ( Desktop COmmunication Protocol), est un système de communication léger entre les processus et les composants logiciels d'un système.
     Sa principale utilisation est de permettre aux différentes applications d'interagir et de partager des tâches complexes.
     DCOP est essentiellement un système de « contrôle à distance », qui peut faire profiter une application ou un script de l'aide des autres applications.
     Il est construit au dessus du protocole d'échanges interclients de X.&lt;/p&gt;
  &lt;p class='quotefrom'&gt;Wikipedia&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id='utilisation_damarok_via_dcop'&gt;Utilisation d&amp;#8217;Amarok via DCOP&lt;/h2&gt;

&lt;p&gt;Comme la plupart (voir toutes) des applications KDE, Amarok fournit une interface DCOP. Celle-ci est très complète, soit dit en passant.&lt;/p&gt;

&lt;p&gt;Lorsque l&amp;#8217;on est en ssh, il faut tout d&amp;#8217;abord récupérer le DISPLAY. Ceci se fait en général de cette manière :&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;DISPLAY&lt;/span&gt;=&lt;span class='r'&gt;:&lt;/span&gt;&lt;span class='fl'&gt;0.0&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;h3 id='contrôle_du_son'&gt;Contrôle du son&lt;/h3&gt;

&lt;p&gt;La première raison de mon investigation était le contrôle du son, il est donc normal que je commence par là&amp;#8230;&lt;/p&gt;
&lt;div class='CodeRay'&gt;
  &lt;div class='code'&gt;&lt;pre&gt;dcop amarok player setVolume X&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Cette commande permet de régler le son a X, X étant compris entre 0 et 100&lt;/p&gt;

&lt;h3 id='récupération_dinformations'&gt;Récupération d&amp;#8217;informations&lt;/h3&gt;

&lt;p&gt;Toujours grâce à DCOP, il est possible de récupérer des informations sur la playlist ou la piste actuellement en lecture. Voici un petit exemple :&lt;/p&gt;
&lt;pre class='shell'&gt;&lt;kbd&gt;dcop amarok player title&lt;/kbd&gt;&lt;br&gt;&lt;samp&gt;The Bonny Swans&lt;/samp&gt;&lt;br&gt;&lt;br&gt;&lt;kbd&gt;dcop amarok player artist&lt;/kbd&gt;&lt;br&gt;&lt;samp&gt;Loreena McKennitt&lt;/samp&gt;&lt;br&gt;&lt;br&gt;&lt;kbd&gt;dcop amarok player album&lt;/kbd&gt;&lt;br&gt;&lt;samp&gt;The Mask And The Mirror&lt;/samp&gt;&lt;/pre&gt;
&lt;h2 id='conclusion'&gt;Conclusion&lt;/h2&gt;

&lt;p&gt;Vous connaissez maintenant le principe de la manipulation d&amp;#8217;Amarok via DCOP. Je vous invite donc à fouiller un peu plus pour découvrir toutes les possibilités offertes par l&amp;#8217;interface DCOP d&amp;#8217;Amarok mais également celles d&amp;#8217;autres applications comme Kmix. Le moyen le plus simple est d&amp;#8217;utiliser la complétion de Bash&amp;#8230;&lt;/p&gt;

&lt;h2 id='références'&gt;Références&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href='http://fr.wikipedia.org/wiki/DCOP'&gt;http://fr.wikipedia.org/wiki/DCOP (fr)&lt;/a&gt;&lt;/li&gt;

&lt;li&gt;&lt;a href='http://amarok.kde.org/wiki/DCOP_Functions'&gt;http://amarok.kde.org/wiki/DCOP_Functions (en)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;    &lt;img src="http://feeds.feedburner.com/~r/LeBlogduGeekJoyeux-atom/~4/HU9SRvWCulw" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://blog.happynoff.fr/post/Controler-Amarok-en-ligne-de-commande-grace-a-DCOP</feedburner:origLink></entry>
  <entry>
    <title>Automatiser les tags ID3 de vos mp3</title>
    <link href="http://feedproxy.google.com/~r/LeBlogduGeekJoyeux-atom/~3/FNDIure3bKw/Automatiser-les-tags-ID3-de-vos-mp3" rel="alternate" />
    <id>http://blog.happynoff.fr/post/Automatiser-les-tags-ID3-de-vos-mp3</id>
    <updated>2011-08-25T15:02:56Z</updated>
    <author>
      <name>Simon COURTOIS</name>
    </author>
    <summary type="html">
&lt;p&gt;Cet article présente trois petits scripts ayant pour but d&amp;#8217;appliquer automatiquement les tags ID3 sur vos mp3.&lt;/p&gt;    </summary>
    <content type="html">
&lt;h2 id='prerequis'&gt;Prerequis&lt;/h2&gt;

&lt;p&gt;Ces scripts se servent des programmes suivants :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;eyeD3 : permet l&amp;#8217;édition des tags ID3&lt;/li&gt;

&lt;li&gt;jpegoptim : optimisation des images&lt;br /&gt;(suppression des infos inutiles, pratique aussi pour les images web)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Sous Debian, il existe un package pour eyeD3 ainsi que pour jpegoptim.&lt;/p&gt;

&lt;h2 id='conventions_de_nommage_des_fichiers'&gt;Conventions de nommage des fichiers&lt;/h2&gt;

&lt;p&gt;Ces scripts se basent sur des conventions de nommage que j&amp;#8217;ai établi pour mes mp3.&lt;br /&gt;Mais elles peuvent ne pas être du gout de tout le monde.&lt;/p&gt;

&lt;p&gt;Il suffit donc d&amp;#8217;adapter les expressions régulières a vos conventions de nommage. Si vous n&amp;#8217;en avez pas, ces scripts n&amp;#8217;auront aucune utilité pour vous ;)&lt;/p&gt;
&lt;pre&gt;~/Music&lt;br&gt;&lt;span class='deco'&gt;└── &lt;/span&gt;Nom_Artist&lt;br&gt;&lt;span class='deco'&gt;    ├── &lt;/span&gt;Titre_Album&lt;br&gt;&lt;span class='deco'&gt;    │   └── &lt;/span&gt;01___Titre_Du_Morceau&lt;br&gt;&lt;span class='deco'&gt;    └── &lt;/span&gt;Autre_Album&lt;br&gt;&lt;span class='deco'&gt;        ├── &lt;/span&gt;CD_1&lt;br&gt;&lt;span class='deco'&gt;        │   └── &lt;/span&gt;01___Titre_Du_Morceau&lt;br&gt;&lt;span class='deco'&gt;        └── &lt;/span&gt;CD_2&lt;br&gt;&lt;span class='deco'&gt;            └── &lt;/span&gt;01___Titre_Du_Morceau&lt;/pre&gt;
&lt;h2 id='le_script_tag_tracks'&gt;Le script tag_tracks&lt;/h2&gt;

&lt;p&gt;Ce script se charge d&amp;#8217;appliquer les tags ID3 sur chaque mp3 du dossier.&lt;/p&gt;
&lt;div class='CodeRay'&gt;
  &lt;div class='code'&gt;&lt;pre&gt;&lt;span class='di'&gt;#!/usr/bin/env bash&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span class='c'&gt;#&lt;/span&gt;&lt;br&gt;&lt;span class='c'&gt;# expressions regulieres utilisees pour obtenir les informations&lt;/span&gt;&lt;br&gt;&lt;span class='c'&gt;#&lt;/span&gt;&lt;br&gt;&lt;span class='iv'&gt;reg_name&lt;/span&gt;=&lt;span class='s'&gt;&lt;span class='dl'&gt;&amp;quot;&lt;/span&gt;&lt;span class='k'&gt;s/^&lt;/span&gt;&lt;span class='k'&gt;\(&lt;/span&gt;&lt;span class='k'&gt;[0-9]&lt;/span&gt;&lt;span class='k'&gt;\{&lt;/span&gt;&lt;span class='k'&gt;2&lt;/span&gt;&lt;span class='k'&gt;\}&lt;/span&gt;&lt;span class='k'&gt;\)&lt;/span&gt;&lt;span class='k'&gt;\_&lt;/span&gt;&lt;span class='k'&gt;\_&lt;/span&gt;&lt;span class='k'&gt;\_&lt;/span&gt;&lt;span class='k'&gt;\(&lt;/span&gt;&lt;span class='k'&gt;.&lt;/span&gt;&lt;span class='k'&gt;\*&lt;/span&gt;&lt;span class='k'&gt;\)&lt;/span&gt;&lt;span class='k'&gt;\.&lt;/span&gt;&lt;span class='k'&gt;\(&lt;/span&gt;&lt;span class='k'&gt;mp3&lt;/span&gt;&lt;span class='k'&gt;\|&lt;/span&gt;&lt;span class='k'&gt;ogg&lt;/span&gt;&lt;span class='k'&gt;\)&lt;/span&gt;&lt;span class='k'&gt;/&lt;/span&gt;&lt;span class='k'&gt;&lt;/span&gt;&lt;span class='k'&gt;/&lt;/span&gt;&lt;span class='dl'&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class='iv'&gt;reg_artist&lt;/span&gt;=&lt;span class='s'&gt;&lt;span class='dl'&gt;&amp;quot;&lt;/span&gt;&lt;span class='k'&gt;([^/]+)/[^/]+(/CD&lt;/span&gt;&lt;span class='k'&gt;\_&lt;/span&gt;&lt;span class='k'&gt;[0-9]+)?&lt;/span&gt;$&amp;quot;&lt;br&gt;&lt;span class='k'&gt;reg_album=&lt;/span&gt;&lt;span class='dl'&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;span class='r'&gt;[&lt;/span&gt;^/&lt;span class='r'&gt;]&lt;/span&gt;+(/CD\_&lt;span class='r'&gt;[&lt;/span&gt;&lt;span class='fl'&gt;0-9&lt;/span&gt;&lt;span class='r'&gt;]&lt;/span&gt;+)?$&amp;quot;&lt;br&gt;&lt;br&gt;&lt;span class='c'&gt;#&lt;/span&gt;&lt;br&gt;&lt;span class='c'&gt;# Si on est en dans un album compose d'un seul CD,&lt;/span&gt;&lt;br&gt;&lt;span class='c'&gt;# on recupere l'image Folder.jpg du dossier courant.&lt;/span&gt;&lt;br&gt;&lt;span class='c'&gt;# Dans le cas contraire, c'est celle du dossier parent.&lt;/span&gt;&lt;br&gt;&lt;span class='c'&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 ./Folder.jpg &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;  &lt;span class='iv'&gt;img&lt;/span&gt;=&lt;span class='s'&gt;'./Folder.jpg'&lt;/span&gt;&lt;br&gt;&lt;span class='r'&gt;else&lt;/span&gt;&lt;br&gt;  &lt;span class='r'&gt;if&lt;/span&gt; &lt;span class='r'&gt;[&lt;/span&gt; -f ../Folder.jpg &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;    &lt;span class='iv'&gt;img&lt;/span&gt;=&lt;span class='s'&gt;'../Folder.jpg'&lt;/span&gt;&lt;br&gt;  &lt;span class='r'&gt;fi&lt;/span&gt;&lt;br&gt;&lt;span class='r'&gt;fi&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span class='c'&gt;#&lt;/span&gt;&lt;br&gt;&lt;span class='c'&gt;# Optimisation de l'image pour qu'elle prenne moins de place&lt;/span&gt;&lt;br&gt;&lt;span class='c'&gt;#&lt;/span&gt;&lt;br&gt;jpegoptim --strip-all &lt;span class='iv'&gt;$img&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span class='c'&gt;#&lt;/span&gt;&lt;br&gt;&lt;span class='c'&gt;# On effectue le traitement pour chaque fichier mp3 du dossier&lt;/span&gt;&lt;br&gt;&lt;span class='c'&gt;#&lt;/span&gt;&lt;br&gt;&lt;span class='r'&gt;for&lt;/span&gt; fic &lt;span class='r'&gt;in&lt;/span&gt; *.mp3&lt;br&gt;&lt;span class='r'&gt;do&lt;/span&gt;&lt;br&gt;  &lt;span class='r'&gt;if&lt;/span&gt; &lt;span class='r'&gt;[&lt;/span&gt; -f &lt;span class='iv'&gt;$fic&lt;/span&gt; &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;    &lt;span class='c'&gt;#&lt;/span&gt;&lt;br&gt;    &lt;span class='c'&gt;# Recuperation des informations du fichier&lt;/span&gt;&lt;br&gt;    &lt;span class='c'&gt;#&lt;/span&gt;&lt;br&gt;    &lt;span class='iv'&gt;num&lt;/span&gt;=&lt;span class='sh'&gt;&lt;span class='dl'&gt;`&lt;/span&gt;&lt;span class='k'&gt;echo &lt;/span&gt;&lt;span class='iv'&gt;$fic&lt;/span&gt;&lt;span class='k'&gt; | sed &amp;quot;s/&lt;/span&gt;&lt;span class='k'&gt;\(&lt;/span&gt;&lt;span class='k'&gt;[0-9]&lt;/span&gt;&lt;span class='k'&gt;\{&lt;/span&gt;&lt;span class='k'&gt;1,3&lt;/span&gt;&lt;span class='k'&gt;\}&lt;/span&gt;&lt;span class='k'&gt;\)&lt;/span&gt;&lt;span class='k'&gt;.&lt;/span&gt;&lt;span class='k'&gt;\*&lt;/span&gt;&lt;span class='k'&gt;/&lt;/span&gt;&lt;span class='k'&gt;&lt;/span&gt;&lt;span class='k'&gt;/&amp;quot;&lt;/span&gt;&lt;span class='dl'&gt;`&lt;/span&gt;&lt;/span&gt;&lt;br&gt;    &lt;span class='iv'&gt;name&lt;/span&gt;=&lt;span class='sh'&gt;&lt;span class='dl'&gt;`&lt;/span&gt;&lt;span class='k'&gt;echo &lt;/span&gt;&lt;span class='iv'&gt;$fic&lt;/span&gt;&lt;span class='k'&gt; | sed &lt;/span&gt;&lt;span class='iv'&gt;$reg&lt;/span&gt;&lt;span class='k'&gt;\_&lt;/span&gt;&lt;span class='k'&gt;name | tr -s &amp;quot;&lt;/span&gt;&lt;span class='k'&gt;\_&lt;/span&gt;&lt;span class='k'&gt;&amp;quot;&amp;quot;&amp;quot;&lt;/span&gt;&lt;span class='dl'&gt;`&lt;/span&gt;&lt;/span&gt;&lt;br&gt;    &lt;span class='iv'&gt;artist&lt;/span&gt;=&lt;span class='sh'&gt;&lt;span class='dl'&gt;`&lt;/span&gt;&lt;span class='k'&gt;pwd | grep -o &lt;/span&gt;&lt;span class='iv'&gt;$reg&lt;/span&gt;&lt;span class='k'&gt;\_&lt;/span&gt;&lt;span class='k'&gt;artist | cut -d'/' -f1 | tr -s '&lt;/span&gt;&lt;span class='k'&gt;\_&lt;/span&gt;&lt;span class='k'&gt;'&lt;/span&gt;&lt;span class='dl'&gt;`&lt;/span&gt;&lt;/span&gt;&lt;br&gt;    &lt;span class='iv'&gt;album&lt;/span&gt;=&lt;span class='sh'&gt;&lt;span class='dl'&gt;`&lt;/span&gt;&lt;span class='k'&gt;pwd | grep -o &lt;/span&gt;&lt;span class='iv'&gt;$reg&lt;/span&gt;&lt;span class='k'&gt;\_&lt;/span&gt;&lt;span class='k'&gt;album | cut -d'/' -f1 | tr -s '&lt;/span&gt;&lt;span class='k'&gt;\_&lt;/span&gt;&lt;span class='k'&gt;'&lt;/span&gt;&lt;span class='dl'&gt;`&lt;/span&gt;&lt;/span&gt;&lt;br&gt;    &lt;span class='iv'&gt;album_num&lt;/span&gt;=&lt;span class='sh'&gt;&lt;span class='dl'&gt;`&lt;/span&gt;&lt;span class='k'&gt;pwd | grep -o &amp;quot;CD&lt;/span&gt;&lt;span class='k'&gt;\_&lt;/span&gt;&lt;span class='k'&gt;[0-9]+&lt;/span&gt;&lt;span class='k'&gt;$&amp;quot;&lt;/span&gt;&lt;span class='k'&gt; | cut -d'&lt;/span&gt;&lt;span class='k'&gt;\_&lt;/span&gt;&lt;span class='k'&gt;' -f2&lt;/span&gt;&lt;span class='dl'&gt;`&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;br&gt;    &lt;span class='c'&gt;#&lt;/span&gt;&lt;br&gt;    &lt;span class='c'&gt;# Si l'album ne contient qu'un seul CD&lt;/span&gt;&lt;br&gt;    &lt;span class='c'&gt;#&lt;/span&gt;&lt;br&gt;    &lt;span class='r'&gt;if&lt;/span&gt; &lt;span class='r'&gt;[&lt;/span&gt; -z &lt;span class='iv'&gt;$album&lt;/span&gt;\_num &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;      &lt;span class='iv'&gt;album_num&lt;/span&gt;=&lt;span class='s'&gt;'1'&lt;/span&gt;&lt;br&gt;    &lt;span class='r'&gt;fi&lt;/span&gt;&lt;br&gt;&lt;br&gt;    &lt;span class='c'&gt;#&lt;/span&gt;&lt;br&gt;    &lt;span class='c'&gt;# Application du tag ID3.&lt;/span&gt;&lt;br&gt;    &lt;span class='c'&gt;# Si un tag existait avant, il est supprime.&lt;/span&gt;&lt;br&gt;    &lt;span class='c'&gt;# Cela permet d'eviter l'accumulation de la meme image&lt;/span&gt;&lt;br&gt;    &lt;span class='c'&gt;# dans le tag.&lt;/span&gt;&lt;br&gt;    &lt;span class='c'&gt;#&lt;/span&gt;&lt;br&gt;    eyeD3 --remove-all --to-v2.&lt;span class='i'&gt;4&lt;/span&gt; \&lt;br&gt;          -t&lt;span class='s'&gt;&lt;span class='dl'&gt;&amp;quot;&lt;/span&gt;&lt;span class='iv'&gt;$name&lt;/span&gt;&lt;span class='dl'&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt; \&lt;br&gt;          -a&lt;span class='s'&gt;&lt;span class='dl'&gt;&amp;quot;&lt;/span&gt;&lt;span class='iv'&gt;$artist&lt;/span&gt;&lt;span class='dl'&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt; \&lt;br&gt;          -A&lt;span class='s'&gt;&lt;span class='dl'&gt;&amp;quot;&lt;/span&gt;&lt;span class='iv'&gt;$album&lt;/span&gt;&lt;span class='dl'&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt; \&lt;br&gt;          -n&lt;span class='iv'&gt;$num&lt;/span&gt; \&lt;br&gt;          --add-image=&lt;span class='iv'&gt;$img&lt;/span&gt;&lt;span class='r'&gt;:&lt;/span&gt;FRONT_COVER \&lt;br&gt;          --set-text-frame=TPOS&lt;span class='r'&gt;:&lt;/span&gt;&lt;span class='iv'&gt;$album&lt;/span&gt;\_num \&lt;br&gt;          &lt;span class='iv'&gt;$fic&lt;/span&gt; &lt;span class='i'&gt;1&lt;/span&gt;&lt;span class='bi'&gt;&amp;gt;&lt;/span&gt; /dev/null&lt;br&gt;  &lt;span class='r'&gt;fi&lt;/span&gt;&lt;br&gt;&lt;span class='r'&gt;done&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;h2 id='le_script_tag_album'&gt;Le script tag_album&lt;/h2&gt;

&lt;p&gt;Ce script se charge te d&amp;#8217;appeler le script tag_tracks sur chaque album d&amp;#8217;un artiste.&lt;/p&gt;
&lt;div class='CodeRay'&gt;
  &lt;div class='code'&gt;&lt;pre&gt;&lt;span class='di'&gt;#!/usr/bin/env bash&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span class='c'&gt;#&lt;/span&gt;&lt;br&gt;&lt;span class='c'&gt;# Pour chaque album&lt;/span&gt;&lt;br&gt;&lt;span class='c'&gt;#&lt;/span&gt;&lt;br&gt;&lt;span class='r'&gt;for&lt;/span&gt; d &lt;span class='r'&gt;in&lt;/span&gt; &lt;span class='sh'&gt;&lt;span class='dl'&gt;`&lt;/span&gt;&lt;span class='k'&gt;ls -x&lt;/span&gt;&lt;span class='dl'&gt;`&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class='r'&gt;do&lt;/span&gt;&lt;br&gt;  &lt;span class='r'&gt;if&lt;/span&gt; &lt;span class='r'&gt;[&lt;/span&gt; -d &lt;span class='iv'&gt;$d&lt;/span&gt; &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;    &lt;span class='fu'&gt;cd&lt;/span&gt; &lt;span class='iv'&gt;$d&lt;/span&gt;&lt;br&gt;    &lt;span class='iv'&gt;line&lt;/span&gt;=&lt;span class='s'&gt;&lt;span class='dl'&gt;&amp;quot;&lt;/span&gt;&lt;span class='iv'&gt;$d&lt;/span&gt;&lt;span class='dl'&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;br&gt;    &lt;span class='c'&gt;#&lt;/span&gt;&lt;br&gt;    &lt;span class='c'&gt;# Si c'est un album compose de plusieurs CDs,&lt;/span&gt;&lt;br&gt;    &lt;span class='c'&gt;# pour chaque CD on appel le script tag\_tracks&lt;/span&gt;&lt;br&gt;    &lt;span class='c'&gt;#&lt;/span&gt;&lt;br&gt;    &lt;span class='r'&gt;if&lt;/span&gt; &lt;span class='r'&gt;[&lt;/span&gt; -d ./CD_* &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;      &lt;span class='r'&gt;for&lt;/span&gt; &lt;span class='fu'&gt;cd&lt;/span&gt; &lt;span class='r'&gt;in&lt;/span&gt; ./CD_*&lt;br&gt;      &lt;span class='r'&gt;do&lt;/span&gt;&lt;br&gt;        &lt;span class='fu'&gt;cd&lt;/span&gt; &lt;span class='fu'&gt;$cd&lt;/span&gt; &lt;span class='bi'&gt;&amp;amp;&lt;/span&gt;&lt;span class='bi'&gt;&amp;amp;&lt;/span&gt; /chemin/vers/tag_tracks &lt;span class='i'&gt;2&lt;/span&gt;&lt;span class='bi'&gt;&amp;gt;&lt;/span&gt;&lt;span class='bi'&gt;&amp;amp;&lt;/span&gt;&lt;span class='i'&gt;1&lt;/span&gt; &lt;span class='bi'&gt;&amp;amp;&lt;/span&gt;&lt;span class='bi'&gt;&amp;amp;&lt;/span&gt; &lt;span class='iv'&gt;line&lt;/span&gt;=&lt;span class='s'&gt;&lt;span class='dl'&gt;&amp;quot;&lt;/span&gt;&lt;span class='iv'&gt;$line&lt;/span&gt;&lt;span class='k'&gt; [OK]&lt;/span&gt;&lt;span class='dl'&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;        &lt;span class='fu'&gt;cd&lt;/span&gt; ..&lt;br&gt;      &lt;span class='r'&gt;done&lt;/span&gt;&lt;br&gt;      &lt;span class='fu'&gt;cd&lt;/span&gt; ..&lt;br&gt;&lt;br&gt;    &lt;span class='c'&gt;#&lt;/span&gt;&lt;br&gt;    &lt;span class='c'&gt;# Si l'album ne contient qu'un seul CD,&lt;/span&gt;&lt;br&gt;    &lt;span class='c'&gt;# on appele directement le script tag\_tracks&lt;/span&gt;&lt;br&gt;    &lt;span class='c'&gt;#&lt;/span&gt;&lt;br&gt;    &lt;span class='r'&gt;else&lt;/span&gt;&lt;br&gt;      /chemin/vers/tag_tracks &lt;span class='i'&gt;2&lt;/span&gt;&lt;span class='bi'&gt;&amp;gt;&lt;/span&gt;&lt;span class='bi'&gt;&amp;amp;&lt;/span&gt;&lt;span class='i'&gt;1&lt;/span&gt; &lt;span class='bi'&gt;&amp;amp;&lt;/span&gt;&lt;span class='bi'&gt;&amp;amp;&lt;/span&gt; &lt;span class='iv'&gt;line&lt;/span&gt;=&lt;span class='s'&gt;&lt;span class='dl'&gt;&amp;quot;&lt;/span&gt;&lt;span class='iv'&gt;$line&lt;/span&gt;&lt;span class='k'&gt; [OK]&lt;/span&gt;&lt;span class='dl'&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;      &lt;span class='fu'&gt;cd&lt;/span&gt; ..&lt;br&gt;    &lt;span class='r'&gt;fi&lt;/span&gt;&lt;br&gt;    &lt;span class='fu'&gt;echo&lt;/span&gt; &lt;span class='iv'&gt;$line&lt;/span&gt;&lt;br&gt;  &lt;span class='r'&gt;fi&lt;/span&gt;&lt;br&gt;&lt;span class='r'&gt;done&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;h2 id='le_script_tag_artists'&gt;Le script tag_artists&lt;/h2&gt;

&lt;p&gt;Ce dernier script appel tag_albums pour chaque artiste de votre dossier de musique.&lt;/p&gt;
&lt;div class='CodeRay'&gt;
  &lt;div class='code'&gt;&lt;pre&gt;&lt;span class='di'&gt;#!/usr/bin/env bash&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span class='c'&gt;#&lt;/span&gt;&lt;br&gt;&lt;span class='c'&gt;# Pour chaque artiste (1 artiste = 1 dossier)&lt;/span&gt;&lt;br&gt;&lt;span class='c'&gt;#&lt;/span&gt;&lt;br&gt;&lt;span class='r'&gt;for&lt;/span&gt; d &lt;span class='r'&gt;in&lt;/span&gt; &lt;span class='sh'&gt;&lt;span class='dl'&gt;`&lt;/span&gt;&lt;span class='k'&gt;ls -x&lt;/span&gt;&lt;span class='dl'&gt;`&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class='r'&gt;do&lt;/span&gt;&lt;br&gt;  &lt;span class='c'&gt;#&lt;/span&gt;&lt;br&gt;  &lt;span class='c'&gt;# On entre dans le dossier&lt;/span&gt;&lt;br&gt;  &lt;span class='c'&gt;# et on fait appel au script tag\_albums&lt;/span&gt;&lt;br&gt;  &lt;span class='c'&gt;#&lt;/span&gt;&lt;br&gt;  &lt;span class='r'&gt;if&lt;/span&gt; &lt;span class='r'&gt;[&lt;/span&gt; -d &lt;span class='iv'&gt;$d&lt;/span&gt; &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;    &lt;span class='fu'&gt;cd&lt;/span&gt; &lt;span class='iv'&gt;$d&lt;/span&gt;&lt;br&gt;    &lt;span class='iv'&gt;line&lt;/span&gt;=&lt;span class='s'&gt;&lt;span class='dl'&gt;&amp;quot;&lt;/span&gt;&lt;span class='k'&gt;------------------- &lt;/span&gt;&lt;span class='iv'&gt;$d&lt;/span&gt;&lt;span class='dl'&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;    /chemin/vers/tag_albums &lt;span class='bi'&gt;&amp;amp;&lt;/span&gt;&lt;span class='bi'&gt;&amp;amp;&lt;/span&gt; &lt;span class='iv'&gt;line&lt;/span&gt;=&lt;span class='s'&gt;&lt;span class='dl'&gt;&amp;quot;&lt;/span&gt;&lt;span class='iv'&gt;$line&lt;/span&gt;&lt;span class='k'&gt; [OK]&lt;/span&gt;&lt;span class='dl'&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;    &lt;span class='fu'&gt;echo&lt;/span&gt; &lt;span class='iv'&gt;$line&lt;/span&gt;&lt;br&gt;    &lt;span class='fu'&gt;cd&lt;/span&gt; ..&lt;br&gt;  &lt;span class='r'&gt;fi&lt;/span&gt;&lt;br&gt;&lt;span class='r'&gt;done&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;h2 id='en_résumé'&gt;En résumé&lt;/h2&gt;

&lt;p&gt;Vous avez donc maintenant trois scripts qui vous permettent d&amp;#8217;intervenir à différents niveaux de votre arborescence ;)&lt;/p&gt;    &lt;img src="http://feeds.feedburner.com/~r/LeBlogduGeekJoyeux-atom/~4/FNDIure3bKw" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://blog.happynoff.fr/post/Automatiser-les-tags-ID3-de-vos-mp3</feedburner:origLink></entry>
  <entry>
    <title>Connaitre les classes heritant d'une autre classe en Ruby</title>
    <link href="http://feedproxy.google.com/~r/LeBlogduGeekJoyeux-atom/~3/6EUtX1zB52Y/Connaitre-les-classes-heritant-d-une-autre-classe-en-Ruby" rel="alternate" />
    <id>http://blog.happynoff.fr/post/Connaitre-les-classes-heritant-d-une-autre-classe-en-Ruby</id>
    <updated>2011-08-25T15:02:57Z</updated>
    <author>
      <name>Simon COURTOIS</name>
    </author>
    <summary type="html">
&lt;p&gt;En Ruby, pour connaître la classe parente d&amp;#8217;une classe, un appel de méthode suffit. Malheureusement, il n&amp;#8217;existe pas de telle méthode afin d&amp;#8217;obtenir les classes héritant d&amp;#8217;une classe donnée. Voici donc comment créer ce comportement.&lt;/p&gt;

&lt;p&gt;Prérequis: une connaissance basique du langage Ruby est nécessaire pour comprendre certains listings de code.&lt;/p&gt;    </summary>
    <content type="html">
&lt;h2 id='petit_rappel'&gt;Petit rappel&lt;/h2&gt;

&lt;p&gt;Pour connaître la classe parente d&amp;#8217;une classe en Ruby il suffit de faire :&lt;/p&gt;
&lt;div class='CodeRay'&gt;
  &lt;div class='code'&gt;&lt;pre&gt;&lt;span class='r'&gt;class&lt;/span&gt; &lt;span class='cl'&gt;MaClasse&lt;/span&gt;&lt;br&gt;&lt;span class='r'&gt;end&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span class='co'&gt;MaClasse&lt;/span&gt;.superclass&lt;br&gt;&lt;span class='c'&gt;# =&amp;gt; Object&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Pour connaître les ancêtres d&amp;#8217;une classe il suffit de faire :&lt;/p&gt;
&lt;div class='CodeRay'&gt;
  &lt;div class='code'&gt;&lt;pre&gt;&lt;span class='co'&gt;MaClasse&lt;/span&gt;.ancestors&lt;br&gt;&lt;span class='c'&gt;# =&amp;gt; [MaClasse, Object, Kernel]&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;h2 id='définition_dune_méthode_de_classe'&gt;Définition d&amp;#8217;une méthode de classe&lt;/h2&gt;

&lt;p&gt;Ce que nous cherchons à obtenir est une méthode de classe, le but étant de faire ceci :&lt;/p&gt;
&lt;div class='CodeRay'&gt;
  &lt;div class='code'&gt;&lt;pre&gt;&lt;span class='r'&gt;class&lt;/span&gt; &lt;span class='cl'&gt;ClasseA&lt;/span&gt;&lt;br&gt;&lt;span class='r'&gt;end&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span class='co'&gt;ClasseA&lt;/span&gt;.children&lt;br&gt;&lt;span class='c'&gt;# =&amp;gt; []&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span class='r'&gt;class&lt;/span&gt; &lt;span class='cl'&gt;ClasseB&lt;/span&gt; &amp;lt; &lt;span class='co'&gt;ClasseA&lt;/span&gt;&lt;br&gt;&lt;span class='r'&gt;end&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span class='co'&gt;ClasseA&lt;/span&gt;.children&lt;br&gt;&lt;span class='c'&gt;# =&amp;gt; [ClasseB]&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Pour définir une méthode de classe il y à deux façons (équivalentes) :&lt;/p&gt;
&lt;div class='CodeRay'&gt;
  &lt;div class='code'&gt;&lt;pre&gt;&lt;span class='r'&gt;class&lt;/span&gt; &lt;span class='cl'&gt;MaClasse&lt;/span&gt;&lt;br&gt;  &lt;span class='r'&gt;def&lt;/span&gt; &lt;span class='pc'&gt;self&lt;/span&gt;.&lt;span class='fu'&gt;meth1&lt;/span&gt;&lt;br&gt;  &lt;span class='r'&gt;end&lt;/span&gt;&lt;br&gt;&lt;br&gt;  &lt;span class='r'&gt;class&lt;/span&gt; &amp;lt;&amp;lt; &lt;span class='cl'&gt;self&lt;/span&gt;&lt;br&gt;    &lt;span class='r'&gt;def&lt;/span&gt; &lt;span class='fu'&gt;meth2&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;La deuxième façon peut sembler un peu obscure même pour quelqu&amp;#8217;un ayant de bonnes bases de Ruby&amp;#8230; Je vais donc l&amp;#8217;expliquer en détail.&lt;/p&gt;

&lt;p&gt;En Ruby, TOUT est objet. Cela implique qu&amp;#8217;une classe elle-même est un objet et donc&amp;#8230; une instance de classe : la classe Class (oui c&amp;#8217;est recherché&amp;#8230; mais ça a le mérite d&amp;#8217;être explicite).&lt;/p&gt;

&lt;p&gt;Cette &amp;#8220;instance&amp;#8221; n&amp;#8217;aurait aucun sens en plusieurs exemplaires, c&amp;#8217;est pourquoi c&amp;#8217;est un singletonur Wikipedia&amp;#8221;).&lt;/p&gt;

&lt;p&gt;De par l&amp;#8217;architecture même de Ruby, il est possible d&amp;#8217;éditer la définition de ce singleton. C&amp;#8217;est ce que l&amp;#8217;on fait lorsque l&amp;#8217;on rajoute une méthode de classe.&lt;/p&gt;

&lt;p&gt;Écrire &lt;em&gt;class &amp;#171;&amp;#160;self&lt;/em&gt; revient donc à entrer en mode d&amp;#8217;édition de ce singleton.&lt;/p&gt;

&lt;h2 id='la_méthode_inheritedby'&gt;La méthode inherited(by)&lt;/h2&gt;

&lt;p&gt;Comme dit précédemment, une classe est une instance singleton de la classe Class. Lorsque l&amp;#8217;on regarde &lt;a href='http://www.ruby-doc.org/core/classes/Class.html'&gt;la documentation de la classe Class&lt;/a&gt;, on constate l&amp;#8217;existence d&amp;#8217;une méthode &amp;#8220;inherited&amp;#8221;. La lecture de sa documentation nous informe que c&amp;#8217;est une méthode de Callback appelée à chaque fois qu&amp;#8217;une classe enfant de la classe courante est créée.&lt;/p&gt;

&lt;p&gt;Voila qui est intéressant !!&lt;/p&gt;

&lt;h2 id='Écriture_de_notre_méthode_de_classe'&gt;Écriture de notre méthode de classe&lt;/h2&gt;

&lt;p&gt;Grâce à la méthode inherited, nous allons pouvoir écrire notre méthode de classe ; de la manière la plus simple qui soit puisque nous allons redéfinir cette méthode.&lt;/p&gt;
&lt;div class='CodeRay'&gt;
  &lt;div class='code'&gt;&lt;pre&gt;&lt;span class='r'&gt;class&lt;/span&gt; &lt;span class='cl'&gt;MaClasse&lt;/span&gt;&lt;br&gt;  &lt;span class='r'&gt;class&lt;/span&gt; &amp;lt;&amp;lt; &lt;span class='cl'&gt;self&lt;/span&gt;&lt;br&gt;    &lt;span class='r'&gt;def&lt;/span&gt; &lt;span class='fu'&gt;inherited&lt;/span&gt;(by)&lt;br&gt;      puts &lt;span class='s'&gt;&lt;span class='dl'&gt;&amp;quot;&lt;/span&gt;&lt;span class='k'&gt;La classe &lt;/span&gt;&lt;span class='il'&gt;&lt;span class='idl'&gt;#{&lt;/span&gt;by&lt;span class='idl'&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class='k'&gt; hérite de &lt;/span&gt;&lt;span class='il'&gt;&lt;span class='idl'&gt;#{&lt;/span&gt;&lt;span class='pc'&gt;self&lt;/span&gt;.name&lt;span class='idl'&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class='dl'&gt;&amp;quot;&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;br&gt;&lt;br&gt;&lt;br&gt;&lt;span class='r'&gt;class&lt;/span&gt; &lt;span class='cl'&gt;Enfant&lt;/span&gt; &amp;lt; &lt;span class='co'&gt;MaClasse&lt;/span&gt;&lt;br&gt;&lt;span class='r'&gt;end&lt;/span&gt;&lt;br&gt;&lt;span class='c'&gt;# =&amp;gt; La classe Enfant hérite de MaClasse&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Effet de bord sympathique, la méthode inherited&amp;#8230; est héritée par la classe Enfant :&lt;/p&gt;
&lt;div class='CodeRay'&gt;
  &lt;div class='code'&gt;&lt;pre&gt;&lt;span class='r'&gt;class&lt;/span&gt; &lt;span class='cl'&gt;PetitEnfant&lt;/span&gt; &amp;lt; &lt;span class='co'&gt;Enfant&lt;/span&gt;&lt;br&gt;&lt;span class='r'&gt;end&lt;/span&gt;&lt;br&gt;&lt;span class='c'&gt;# =&amp;gt; La classe PetitEnfant hérite de Enfant&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Bon c&amp;#8217;est bien beau tout ça&amp;#8230; mais en attendant, on n&amp;#8217;a toujours pas la liste des enfants de notre classe ! J&amp;#8217;y viens&amp;#8230;&lt;/p&gt;

&lt;p&gt;Maintenant que l&amp;#8217;on sait utiliser inherited, le reste du travail est assez trivial. En voici le code :&lt;/p&gt;
&lt;div class='CodeRay'&gt;
  &lt;div class='code'&gt;&lt;pre&gt;&lt;span class='r'&gt;class&lt;/span&gt; &lt;span class='cl'&gt;MaClasse&lt;/span&gt;&lt;br&gt;  &lt;span class='iv'&gt;@children&lt;/span&gt; = []&lt;br&gt;&lt;br&gt;  &lt;span class='r'&gt;class&lt;/span&gt; &amp;lt;&amp;lt; &lt;span class='cl'&gt;self&lt;/span&gt;&lt;br&gt;    attr_reader &lt;span class='sy'&gt;:children&lt;/span&gt;&lt;br&gt;&lt;br&gt;    &lt;span class='r'&gt;def&lt;/span&gt; &lt;span class='fu'&gt;inherited&lt;/span&gt;(by)&lt;br&gt;      &lt;span class='iv'&gt;@children&lt;/span&gt; &amp;lt;&amp;lt; by&lt;br&gt;      by.instance_variable_set(&lt;span class='sy'&gt;:@children&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;Bon, ça, ça marche. Mais pourquoi ça marche ?&lt;br /&gt;Explication :&lt;/p&gt;
&lt;div class='CodeRay'&gt;
  &lt;div class='code'&gt;&lt;pre&gt;&lt;span class='iv'&gt;@children&lt;/span&gt; = []&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Ici, on crée une variable d&amp;#8217;instance, un tableau vide qui contiendra par la suite les classes enfants. Cette variable d&amp;#8217;instance appartient à la classe elle-même (l&amp;#8217;instance de Class).&lt;br /&gt;Placer cette variable dans &lt;em&gt;class &amp;#171;&amp;#160;self&lt;/em&gt; n&amp;#8217;aurait aucun sens&amp;#8230;&lt;/p&gt;
&lt;div class='CodeRay'&gt;
  &lt;div class='code'&gt;&lt;pre&gt;attr_reader &lt;span class='sy'&gt;:children&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;De la même manière que pour une classe normale, on donne accès en lecture à la variable d&amp;#8217;instance @children.&lt;/p&gt;
&lt;div class='CodeRay'&gt;
  &lt;div class='code'&gt;&lt;pre&gt;&lt;span class='iv'&gt;@children&lt;/span&gt; &amp;lt;&amp;lt; by&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;La classe passée en paramètre à inherited, la classe héritant de notre classe donc, est insérée dans le tableau @children.&lt;/p&gt;
&lt;div class='CodeRay'&gt;
  &lt;div class='code'&gt;&lt;pre&gt;by.instance_variable_set(&lt;span class='sy'&gt;:@children&lt;/span&gt;, [])&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Cette ligne fait en sorte que la classe enfant contienne une variable @children déjà initialisée à &lt;span /&gt;. Ceci évite de devoir réécrire la ligne &lt;em&gt;@children = &lt;span /&gt;&lt;/em&gt; à chaque fois.&lt;/p&gt;

&lt;h2 id='aller_plus_loin'&gt;Aller plus loin&amp;#8230;&lt;/h2&gt;

&lt;h3 id='généraliser_ce_fonctionnement'&gt;Généraliser ce fonctionnement&lt;/h3&gt;

&lt;p&gt;Étant donné qu&amp;#8217;il est possible d&amp;#8217;éditer n&amp;#8217;importe quelle classe en Ruby, pourquoi ne pas généraliser notre fonctionnement à toutes les classes ?&lt;/p&gt;

&lt;p&gt;Ceci se fait très simplement en éditant la classe la plus haut placée, j&amp;#8217;ai nommé Object :&lt;/p&gt;
&lt;div class='CodeRay'&gt;
  &lt;div class='code'&gt;&lt;pre&gt;&lt;span class='r'&gt;class&lt;/span&gt; &lt;span class='cl'&gt;Object&lt;/span&gt;&lt;br&gt;  &lt;span class='iv'&gt;@children&lt;/span&gt; = []&lt;br&gt;&lt;br&gt;  &lt;span class='r'&gt;class&lt;/span&gt; &amp;lt;&amp;lt; &lt;span class='cl'&gt;self&lt;/span&gt;&lt;br&gt;    attr_reader &lt;span class='sy'&gt;:children&lt;/span&gt;&lt;br&gt;&lt;br&gt;    &lt;span class='r'&gt;def&lt;/span&gt; &lt;span class='fu'&gt;inherited&lt;/span&gt;(by)&lt;br&gt;      &lt;span class='iv'&gt;@children&lt;/span&gt; &amp;lt;&amp;lt; by&lt;br&gt;      by.instance_variable_set(&lt;span class='sy'&gt;:@children&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;br&gt;&lt;br&gt;&lt;span class='r'&gt;class&lt;/span&gt; &lt;span class='cl'&gt;MaClasse&lt;/span&gt;&lt;br&gt;&lt;span class='r'&gt;end&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span class='co'&gt;Object&lt;/span&gt;.children&lt;br&gt;&lt;span class='c'&gt;# =&amp;gt; [MaClasse]&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span class='r'&gt;class&lt;/span&gt; &lt;span class='cl'&gt;Enfant&lt;/span&gt; &amp;lt; &lt;span class='co'&gt;MaClasse&lt;/span&gt;&lt;br&gt;&lt;span class='r'&gt;end&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span class='co'&gt;MaClasse&lt;/span&gt;.children&lt;br&gt;&lt;span class='c'&gt;# =&amp;gt; [Enfant]&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;h3 id='découvrir_toute_la_hiérarchie'&gt;Découvrir toute la hiérarchie&lt;/h3&gt;

&lt;p&gt;Pourquoi ne pas &lt;a href='http://www.youtube.com/watch?v=WtvUJURQDlU'&gt;pousser le bouchon encore plus loin Maurice&lt;/a&gt; ? Et si on faisait en sorte de récupérer toute la descendance d&amp;#8217;une classe ?&lt;br /&gt;C&amp;#8217;est parti !&lt;/p&gt;
&lt;div class='CodeRay'&gt;
  &lt;div class='code'&gt;&lt;pre&gt;&lt;span class='r'&gt;class&lt;/span&gt; &lt;span class='cl'&gt;MaClasse&lt;/span&gt;&lt;br&gt;    &lt;span class='iv'&gt;@children&lt;/span&gt; = []&lt;br&gt;&lt;br&gt;    &lt;span class='r'&gt;class&lt;/span&gt; &amp;lt;&amp;lt; &lt;span class='cl'&gt;self&lt;/span&gt;&lt;br&gt;        attr_reader &lt;span class='sy'&gt;:children&lt;/span&gt;&lt;br&gt;&lt;br&gt;        &lt;span class='r'&gt;def&lt;/span&gt; &lt;span class='fu'&gt;inherited&lt;/span&gt;(by)&lt;br&gt;            &lt;span class='iv'&gt;@children&lt;/span&gt; &amp;lt;&amp;lt; by&lt;br&gt;            by.instance_variable_set(&lt;span class='sy'&gt;:@children&lt;/span&gt;, [])&lt;br&gt;        &lt;span class='r'&gt;end&lt;/span&gt;&lt;br&gt;&lt;br&gt;        &lt;span class='r'&gt;def&lt;/span&gt; &lt;span class='fu'&gt;all_children&lt;/span&gt;&lt;br&gt;            result = {}&lt;br&gt;            &lt;span class='iv'&gt;@children&lt;/span&gt;.each &lt;span class='r'&gt;do&lt;/span&gt; |child|&lt;br&gt;                result[child] = child.all_children&lt;br&gt;            &lt;span class='r'&gt;end&lt;/span&gt;&lt;br&gt;            result.empty? ? &lt;span class='pc'&gt;nil&lt;/span&gt; : result&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;br&gt;&lt;br&gt;&lt;span class='r'&gt;class&lt;/span&gt; &lt;span class='cl'&gt;Enfant&lt;/span&gt; &amp;lt; &lt;span class='co'&gt;MaClasse&lt;/span&gt;&lt;br&gt;&lt;span class='r'&gt;end&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span class='r'&gt;class&lt;/span&gt; &lt;span class='cl'&gt;PetitEnfant&lt;/span&gt; &amp;lt; &lt;span class='co'&gt;Enfant&lt;/span&gt;&lt;br&gt;&lt;span class='r'&gt;end&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span class='r'&gt;class&lt;/span&gt; &lt;span class='cl'&gt;AutreClasse&lt;/span&gt; &amp;lt; &lt;span class='co'&gt;MaClasse&lt;/span&gt;&lt;br&gt;&lt;span class='r'&gt;end&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span class='co'&gt;MaClasse&lt;/span&gt;.all_children&lt;br&gt;&lt;span class='c'&gt;# =&amp;gt; {Enfant=&amp;gt;{PetitEnfant=&amp;gt;nil}, AutreClasse=&amp;gt;nil}&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Déjà !? Et oui&amp;#8230; c&amp;#8217;est aussi simple que ça&amp;#8230; :)&lt;/p&gt;    &lt;img src="http://feeds.feedburner.com/~r/LeBlogduGeekJoyeux-atom/~4/6EUtX1zB52Y" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://blog.happynoff.fr/post/Connaitre-les-classes-heritant-d-une-autre-classe-en-Ruby</feedburner:origLink></entry>
  <entry>
    <title>VirtualBox - BSoD au demarrage de Windows</title>
    <link href="http://feedproxy.google.com/~r/LeBlogduGeekJoyeux-atom/~3/M7W-IfoLNeU/VirtualBox-BSoD-au-demarrage-de-Windows" rel="alternate" />
    <id>http://blog.happynoff.fr/post/VirtualBox-BSoD-au-demarrage-de-Windows</id>
    <updated>2011-08-25T15:02:56Z</updated>
    <author>
      <name>Simon COURTOIS</name>
    </author>
    <content type="html">
&lt;p&gt;Si, comme moi, vous êtes passe à la nouvelle version de VirtualBox, celle de Sun, vous avez peut-être de petits problèmes avec vos anciennes VM Windows.&lt;br /&gt;Voici comment résoudre le problème du BSoD juste aprè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é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églages à effectuer dans VirtualBox' /&gt;&lt;/p&gt;

&lt;p&gt;Et voilà le tour est joué !&lt;/p&gt;    &lt;img src="http://feeds.feedburner.com/~r/LeBlogduGeekJoyeux-atom/~4/M7W-IfoLNeU" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://blog.happynoff.fr/post/VirtualBox-BSoD-au-demarrage-de-Windows</feedburner:origLink></entry>
  <entry>
    <title>Mettre en place un serveur SVN disponible via HTTP</title>
    <link href="http://feedproxy.google.com/~r/LeBlogduGeekJoyeux-atom/~3/0rD9T_IcZAE/Mettre-en-place-un-serveur-SVN-disponible-via-HTTP" rel="alternate" />
    <id>http://blog.happynoff.fr/post/Mettre-en-place-un-serveur-SVN-disponible-via-HTTP</id>
    <updated>2011-08-25T15:02:52Z</updated>
    <author>
      <name>Simon COURTOIS</name>
    </author>
    <summary type="html">
&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;    </summary>
    <content type="html">
&lt;h2 id='installation_de_subversion_svn'&gt;Installation de Subversion (SVN)&lt;/h2&gt;

&lt;p&gt;L&amp;#8217;installation de Subversion est assez simple :&lt;/p&gt;
&lt;div class='CodeRay'&gt;
  &lt;div class='code'&gt;&lt;pre&gt;sudo aptitude install subversion&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;h2 id='création_dun_dépot_svn'&gt;Création d&amp;#8217;un dépot SVN&lt;/h2&gt;

&lt;p&gt;Pour initialiser un dépôt SVN, il faut utiliser la commande suivante :&lt;/p&gt;
&lt;div class='CodeRay'&gt;
  &lt;div class='code'&gt;&lt;pre&gt;svnadmin create mon_depot&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Suite à cette commande, un dossier mon_depot est créé et contient l&amp;#8217;arborescence nécessaire au fonctionnement du dépôt.&lt;/p&gt;

&lt;h2 id='mise_a_disposition_via_http'&gt;Mise a disposition via HTTP&lt;/h2&gt;

&lt;p&gt;Cette étape nécessite qu&amp;#8217;un serveur Apache soit installé et configuré sur le serveur SVN. Afin de permettre une authentification des utilisateurs un module apache est nécessaire. Il s&amp;#8217;agit de libapache2-svn.&lt;/p&gt;
&lt;div class='CodeRay'&gt;
  &lt;div class='code'&gt;&lt;pre&gt;sudo aptitude install libapache2-svn&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Configurons maintenant Apache pour lui indiquer le comportement à suivre concernant notre dépôt. Dans la configuration des VirtualHosts d&amp;#8217;Apache (/etc/apache2/sites-available), imaginons que vous avez un hôte dédié aux dépôts svn.&lt;/p&gt;
&lt;div class='CodeRay'&gt;
  &lt;div class='code'&gt;&lt;pre&gt;&amp;lt;VirtualHost *&amp;gt;&lt;br&gt;  ServerName svn.mon_serveur.com&lt;br&gt;  &amp;lt;Location /mon_depot&amp;gt;&lt;br&gt;      DAV svn&lt;br&gt;      SVNPath /chemin/vers/mon_depot&lt;br&gt;      AuthType Basic&lt;br&gt;      AuthName &amp;quot;Mon Super Depot SVN&amp;quot;&lt;br&gt;      AuthUserFile /chemin/vers/mon_depot.htpasswd&lt;br&gt;      Require valid-user&lt;br&gt;      AuthzSVNAccessFile /chemin/vers/mon_depot.perm&lt;br&gt;  &amp;lt;/Location&amp;gt;&lt;br&gt;&amp;lt;/VirtualHost&amp;gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Voyons une à une les lignes précédentes :&lt;/p&gt;
&lt;div class='CodeRay'&gt;
  &lt;div class='code'&gt;&lt;pre&gt;&amp;lt;Location /mon_depot&amp;gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Nous déclarons l&amp;#8217;accès au dépôt par l&amp;#8217;url http://svn.mon_serveur.com/mon_depot&lt;/p&gt;
&lt;div class='CodeRay'&gt;
  &lt;div class='code'&gt;&lt;pre&gt;DAV svn&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;On signal l&amp;#8217;utilisation du module Dav pour l&amp;#8217;accès aux fichiers via Apache&lt;/p&gt;
&lt;div class='CodeRay'&gt;
  &lt;div class='code'&gt;&lt;pre&gt;SVNPath /chemin/vers/mon_depot&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Donne le chemin vers le dépôt&lt;/p&gt;
&lt;div class='CodeRay'&gt;
  &lt;div class='code'&gt;&lt;pre&gt;AuthType Basic&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;On demande une authentification basique&lt;/p&gt;
&lt;div class='CodeRay'&gt;
  &lt;div class='code'&gt;&lt;pre&gt;AuthName&amp;quot;Mon Super Depot SVN&amp;quot;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Permet de donner un nom au serveur SVN.&lt;/p&gt;
&lt;div class='CodeRay'&gt;
  &lt;div class='code'&gt;&lt;pre&gt;AuthUserFile /chemin/vers/mon_depot.htpasswd&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Si vous souhaitez utiliser un système de login/password pour l&amp;#8217;accès au sources, vous pouvez utiliser un fichier de type htpasswd.&lt;/p&gt;

&lt;p&gt;Pour le créer, il suffit de taper ceci&lt;/p&gt;
&lt;pre class='shell'&gt;&lt;kbd&gt;htpasswd -mc mon_depot.htpasswd mon_user&lt;/kbd&gt;&lt;br&gt;&lt;samp&gt;New password:&lt;/samp&gt;&lt;br&gt;&lt;samp&gt;Re-type new password:&lt;/samp&gt;&lt;br&gt;&lt;samp&gt;Adding password for user mon_user&lt;/samp&gt;&lt;/pre&gt;
&lt;p&gt;L&amp;#8217;option -m permet de forcer l&amp;#8217;encryptage &lt;em&gt;md5&lt;/em&gt; des mots de passes. Pour d&amp;#8217;autres options, un petit &lt;em&gt;man htpasswd&lt;/em&gt; ne fait jamais de mal&amp;#8230;&lt;/p&gt;
&lt;div class='CodeRay'&gt;
  &lt;div class='code'&gt;&lt;pre&gt;Require valid-user&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Force les utilisateurs à être authentifiés pour effectuer des actions sur le dépôt&lt;/p&gt;
&lt;div class='CodeRay'&gt;
  &lt;div class='code'&gt;&lt;pre&gt;AuthzSVNAccessFile /chemin/vers/mon_depot.perm&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Permet de spécifier un fichier chargé d&amp;#8217;attribuer des permissions aux utilisateurs. Son contenu est du type :&lt;/p&gt;
&lt;div class='CodeRay'&gt;
  &lt;div class='code'&gt;&lt;pre&gt;[groups]&lt;br&gt;dev = mon_user, autre_user # crée le groupe dev&lt;br&gt;&lt;br&gt;[/]                        # permissions pour de dossier racine du dépôt&lt;br&gt;@dev = rw                  # lecture/écriture pour le groupe dev&lt;br&gt;une_personne = rw          # lecture pour une_personne&lt;br&gt;anonymous =                # aucun droits pour les personnes anonymes&lt;br&gt;[/sous_dossier]            # permissions pour le dossier /sous_dossier&lt;br&gt;@dev = r                   # droit de lecture pour le groupe dev&amp;lt;/pre&amp;gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;h2 id='dernières_notes'&gt;Dernières notes&lt;/h2&gt;

&lt;p&gt;Pensez à donner les droits d&amp;#8217;accès à l&amp;#8217;utilisateur d&amp;#8217;Apache sur votre dépôt&lt;/p&gt;
&lt;div class='CodeRay'&gt;
  &lt;div class='code'&gt;&lt;pre&gt;sudo chown -R www-data&lt;span class='r'&gt;:&lt;/span&gt;www-data /chemin/vers/mon_depot&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Pensez à bien mettre un liens vers votre &lt;em&gt;VirtualHost&lt;/em&gt; dans &lt;em&gt;/etc/apache2/sites-enabled&lt;/em&gt;&lt;/p&gt;
&lt;div class='CodeRay'&gt;
  &lt;div class='code'&gt;&lt;pre&gt;ln -s /etc/apache2/sites-available/mon_vhost.conf \&lt;br&gt;  /etc/apache2/sites-enabled/&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Ou plus simplement&lt;/p&gt;
&lt;div class='CodeRay'&gt;
  &lt;div class='code'&gt;&lt;pre&gt;a2ensite mon_vhost.conf&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Pensez à redémarrer le serveur Apache pour que les modifications soient prises en compte.&lt;/p&gt;

&lt;h2 id='importer_les_fichiers_sur_le_serveur'&gt;Importer les fichiers sur le serveur&lt;/h2&gt;

&lt;p&gt;Prenons un exemple simple, on dispose d&amp;#8217;un dossier de travail&lt;/p&gt;
&lt;pre&gt;mon_dossier/&lt;br&gt;   -- main.c&lt;br&gt;   -- fichier.h&lt;/pre&gt;
&lt;p&gt;Pour importer les fichiers sur le serveur :&lt;/p&gt;
&lt;div class='CodeRay'&gt;
  &lt;div class='code'&gt;&lt;pre&gt;&lt;span class='fu'&gt;cd&lt;/span&gt; ~/mon_dossier&lt;br&gt;svn import &lt;span class='r'&gt;. http://svn.mon_serveur.com/mon_depot&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;On trouve maintenant nos deux fichiers à la racine du dépôt.&lt;/p&gt;

&lt;p&gt;Pour créer une copie de travail versionnée (mon_dossier n&amp;#8217;est pas versionné) :&lt;/p&gt;
&lt;div class='CodeRay'&gt;
  &lt;div class='code'&gt;&lt;pre&gt;svn checkout http&lt;span class='r'&gt;:&lt;/span&gt;//svn.mon_serveur.com/mon_depot&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Ceci a pour effet de créer un dossier mon_depot dans le dossier courant. Ce dossier est une copie de travail qui pourra être synchronisée avec le serveur lors des commits.&lt;/p&gt;

&lt;p&gt;Et voilà, c&amp;#8217;est terminé&lt;/p&gt;    &lt;img src="http://feeds.feedburner.com/~r/LeBlogduGeekJoyeux-atom/~4/0rD9T_IcZAE" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://blog.happynoff.fr/post/Mettre-en-place-un-serveur-SVN-disponible-via-HTTP</feedburner:origLink></entry>
  <entry>
    <title>Ouvrir les liens de Thunderbird dans Firefox</title>
    <link href="http://feedproxy.google.com/~r/LeBlogduGeekJoyeux-atom/~3/QbdBFn9OXQw/Ouvrir-les-liens-de-Thunderbird-dans-Firefox" rel="alternate" />
    <id>http://blog.happynoff.fr/post/Ouvrir-les-liens-de-Thunderbird-dans-Firefox</id>
    <updated>2011-08-25T15:02:57Z</updated>
    <author>
      <name>Simon COURTOIS</name>
    </author>
    <summary type="html">
&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édier à ce problème.&lt;/p&gt;

&lt;p&gt;A ma connaissance il y a deux méthodes.&lt;/p&gt;    </summary>
    <content type="html">
&lt;h2 id='la_méthode_brutale'&gt;La méthode brutale&lt;/h2&gt;

&lt;p&gt;La méthode brutale consiste à aller dans la configuration de Thunderbird et modifier la valeur d&amp;#8217;un paramètre en dur.&amp;lt;br&amp;gt; Pour ce faire, allez dans édition &amp;gt; préférences &amp;gt; Avancé et cliquez sur le bouton &amp;#8216;Config Editor&amp;#8230;&amp;#8217;&lt;/p&gt;

&lt;p&gt;Une nouvelle fenêtre s&amp;#8217;ouvre avec pour titre about:config. Dans celle-ci cherchez la clé &amp;#8216;network.protocol-handler.app.http&amp;#8217;&amp;lt;br&amp;gt; Si tout se passe bien, vous devriez avoir deux réponses :&lt;/p&gt;
&lt;pre&gt;&lt;var&gt;network.protocol-handler.app.http&lt;/var&gt;&lt;br&gt;&lt;var&gt;network.protocol-handler.app.https&lt;/var&gt;&lt;/pre&gt;
&lt;p&gt;Il suffit de changer les valeurs de ces deux clés avec le chemin vers firefox, /usr/bin/firefox (ou /usr/bin/iceweasel pour Debian).&lt;/p&gt;

&lt;h2 id='la_bonne_méthode'&gt;La bonne méthode&lt;/h2&gt;

&lt;p&gt;Ouvrez une console et tapez ceci :&lt;/p&gt;
&lt;pre class='shell'&gt;&lt;kbd&gt;sudo update-alternatives --config x-www-browser&lt;/kbd&gt;&lt;br&gt;&lt;samp&gt;Il y a 3 alternatives fournissant « x-www-browser ».&lt;br&gt;Sélection    Alternative&lt;br&gt;-----------------------------------------------&lt;br&gt;*+        1    &lt;var&gt;/usr/bin/konqueror&lt;/var&gt;&lt;br&gt;          2    &lt;var&gt;/usr/bin/iceweasel (ou /usr/bin/firefox...)&lt;/var&gt;&lt;br&gt;          3    &lt;var&gt;/usr/bin/opera&lt;/var&gt;&lt;br&gt;Appuyez sur Entrée pour conserver la valeur par défaut[*]&lt;br&gt;ou choisissez le numéro sélectionné : &lt;/samp&gt;&lt;kbd&gt;2&lt;/kbd&gt;&lt;/pre&gt;
&lt;p&gt;Et voilà, le tour est joué&amp;#8230;&lt;/p&gt;    &lt;img src="http://feeds.feedburner.com/~r/LeBlogduGeekJoyeux-atom/~4/QbdBFn9OXQw" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://blog.happynoff.fr/post/Ouvrir-les-liens-de-Thunderbird-dans-Firefox</feedburner:origLink></entry>
  <entry>
    <title>Utiliser plusieurs fois le meme VDI sous VirtualBox</title>
    <link href="http://feedproxy.google.com/~r/LeBlogduGeekJoyeux-atom/~3/uW3wW1Tx1JQ/Utiliser-plusieurs-fois-le-meme-VDI-sous-VirtualBox" rel="alternate" />
    <id>http://blog.happynoff.fr/post/Utiliser-plusieurs-fois-le-meme-VDI-sous-VirtualBox</id>
    <updated>2011-08-25T15:02:53Z</updated>
    <author>
      <name>Simon COURTOIS</name>
    </author>
    <content type="html">
&lt;p&gt;Pendant un instant, j&amp;#8217;ai crus qu&amp;#8217;il n&amp;#8217;était pas possible d&amp;#8217;utiliser plusieurs fois un mê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 était déjà enregistrée.&lt;/p&gt;

&lt;p&gt;Cette idée allant à l&amp;#8217;encontre du principe même de la virtualisation, je me suis penché sur le problème.&lt;/p&gt;

&lt;p&gt;Il se trouve que VirtualBox est livré avec un utilitaire : VBoxManage&lt;/p&gt;

&lt;p&gt;VBoxManage permet différentes actions sur les fichiers VDI dont le &amp;#8216;clonevdi&amp;#8217; qui justement répond au besoin de copie des machines virtuelles.&lt;/p&gt;

&lt;p&gt;La commande suivante permet de cré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;    &lt;img src="http://feeds.feedburner.com/~r/LeBlogduGeekJoyeux-atom/~4/uW3wW1Tx1JQ" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://blog.happynoff.fr/post/Utiliser-plusieurs-fois-le-meme-VDI-sous-VirtualBox</feedburner:origLink></entry>
  <entry>
    <title>La Text User Interface de GDB</title>
    <link href="http://feedproxy.google.com/~r/LeBlogduGeekJoyeux-atom/~3/RFE7-FfIcYQ/Text-User-Interface-de-gdb" rel="alternate" />
    <id>http://blog.happynoff.fr/post/Text-User-Interface-de-gdb</id>
    <updated>2011-08-25T15:02:54Z</updated>
    <author>
      <name>Simon COURTOIS</name>
    </author>
    <summary type="html">
&lt;p&gt;Petite chose que j&amp;#8217;ai découverte il y à quelques jours. Si vous programmez en C/C++, vous utilisez peut être gdb pour debugger vos programmes. Une fonctionnalité agréable de gdb est son interface en mode text &amp;#8216;tui&amp;#8217;.&lt;/p&gt;    </summary>
    <content type="html">
&lt;p&gt;Pour la lancer en même temps que gdb&lt;/p&gt;
&lt;div class='CodeRay'&gt;
  &lt;div class='code'&gt;&lt;pre&gt;gdb -tui mon_programme&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Pour l&amp;#8217;activer alors que gdb est lancé le raccourcis clavier est Ctrl-x Ctrl-a.&lt;/p&gt;

&lt;p&gt;Pour tirer pleinement partie de cette fonctionnalité, ajoutez les flags de debug à la compilation (-g suffit).&lt;/p&gt;

&lt;p&gt;&lt;img src='/images/gdbtui.jpg' alt='gdb avec tui' /&gt;&lt;br /&gt; GDB en mode TUI (cliquez pour agrandir)&lt;/p&gt;    &lt;img src="http://feeds.feedburner.com/~r/LeBlogduGeekJoyeux-atom/~4/RFE7-FfIcYQ" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://blog.happynoff.fr/post/Text-User-Interface-de-gdb</feedburner:origLink></entry>
  <entry>
    <title>Un man kikoolol</title>
    <link href="http://feedproxy.google.com/~r/LeBlogduGeekJoyeux-atom/~3/9hhNim-iRys/Un-man-kikoolol" rel="alternate" />
    <id>http://blog.happynoff.fr/post/Un-man-kikoolol</id>
    <updated>2011-08-25T15:02:58Z</updated>
    <author>
      <name>Simon COURTOIS</name>
    </author>
    <content type="html">
&lt;p&gt;Si vous êtes intéressé 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 ça vous plaît et que vous comptez le garder voici la marche à 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ît mais que les couleurs vous insupportent vous pouvez les désactiver en ré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;    &lt;img src="http://feeds.feedburner.com/~r/LeBlogduGeekJoyeux-atom/~4/9hhNim-iRys" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://blog.happynoff.fr/post/Un-man-kikoolol</feedburner:origLink></entry>
  <entry>
    <title>Une signature dans le style de Tron</title>
    <link href="http://feedproxy.google.com/~r/LeBlogduGeekJoyeux-atom/~3/wKnUEtz3B2g/Une-signature-dans-le-style-de-Tron" rel="alternate" />
    <id>http://blog.happynoff.fr/post/Une-signature-dans-le-style-de-Tron</id>
    <updated>2011-08-25T15:02:55Z</updated>
    <author>
      <name>Simon COURTOIS</name>
    </author>
    <summary type="html">
&lt;p&gt;Petit tuto pour expliquer comment faire ceci :&lt;br /&gt; (repris d&amp;#8217;un tuto que j&amp;#8217;avais é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;    </summary>
    <content type="html">
&lt;p&gt;Pour ceux qui ne connaissent pas, un petit tour sur &lt;a href='http://www.internationalhero.co.uk/t/tron.jpg'&gt;http://www.internationalhero.co.uk/t/tron.jpg&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Et oui&amp;#8230; le mec est ridicule, le film n&amp;#8217;en reste pas moins culte pour tout geek qui se respecte :)&lt;/p&gt;

&lt;p&gt;Voici donc la marche à suivre :&lt;/p&gt;

&lt;p&gt;Avant de commencer, je vous conseille de récupérer la police Tron sur dafont.com. &lt;a href='http://www.dafont.com/fr/tron.font'&gt;http://www.dafont.com/fr/tron.font&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Pour le tuto j&amp;#8217;ai pris une image transparente de 280x70&lt;/p&gt;

&lt;h2 id='créer_le_fond'&gt;Créer le fond&lt;/h2&gt;

&lt;p&gt;Renommez le premier calque en &lt;strong&gt;bleu clair&lt;/strong&gt;. Pour ce faire, allez sur la liste des calques et double cliquez sur son nom.&lt;/p&gt;

&lt;p&gt;On commence par une sélection de tout, Sélection &amp;gt; Tout (ou ctrl-A).&lt;/p&gt;

&lt;p&gt;Ensuite on réduit la sélection de 5px, Sélection &amp;gt; Réduire.&lt;/p&gt;

&lt;p&gt;Puis on arrondi les bords, Sélection &amp;gt; Rectangle arrondi.&lt;/p&gt;

&lt;p&gt;Sélectionnez un rayon entre 20% et 50%.&lt;/p&gt;

&lt;p&gt;Remplissez ensuite la sélection d&amp;#8217;un bleu clair (#CDFBFF), Édition &amp;gt; Remplir avec la couleur de PP (ctrl-,).&lt;/p&gt;

&lt;p&gt;&lt;img src='/images/tuto_tron/tuto_tron_01.png' alt='Tutoriel Tron, Image 01' /&gt;&lt;/p&gt;

&lt;p&gt;Faites Calque &amp;gt; Transparence &amp;gt; Alpha vers sélection.&lt;/p&gt;

&lt;p&gt;Créez un nouveau calque transparent et nommez le &lt;strong&gt;bleu foncé&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Remplissez ensuite la sélection d&amp;#8217;un bleu très fonce (#2F3839).&lt;/p&gt;

&lt;p&gt;&lt;img src='/images/tuto_tron/tuto_tron_02.png' alt='Tutoriel Tron, Image 02' /&gt;&lt;/p&gt;

&lt;p&gt;Créez un nouveau calque transparent, au dessus des deux autres et nommez le &lt;strong&gt;dégradé&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Reprenez le noir comme couleur de Premier Plan.&lt;/p&gt;

&lt;p&gt;Une nouvelle fois Alpha vers sélection sur un des deux autres calques, peu importe lequel.&lt;/p&gt;

&lt;p&gt;Revenez sur le calque &lt;strong&gt;dégradé&lt;/strong&gt; et appliquez un dégradé PP vers AP comme ceci (de bas en haut) :&lt;/p&gt;

&lt;p&gt;&lt;img src='/images/tuto_tron/tuto_tron_03.png' alt='Tutoriel Tron, Image 03' /&gt;&lt;/p&gt;

&lt;p&gt;Passez le calque en mode Superposer.&lt;/p&gt;

&lt;p&gt;Puis fusionnez &lt;strong&gt;dégradé&lt;/strong&gt; avec &lt;strong&gt;bleu foncé&lt;/strong&gt;. Cela se fait en faisant un clic droit sur le calque &lt;strong&gt;dégradé&lt;/strong&gt; et en choisissant &lt;strong&gt;fusionnez vers le bas&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Vous devriez obtenir ceci :&lt;/p&gt;

&lt;p&gt;&lt;img src='/images/tuto_tron/tuto_tron_04.png' alt='Tutoriel Tron, Image 04' /&gt;&lt;/p&gt;

&lt;h2 id='créer_la_forme'&gt;Créer la forme&lt;/h2&gt;

&lt;p&gt;Créez maintenant le texte. Sélectionnez la nouvelle police Tron.&lt;/p&gt;

&lt;p&gt;Ajoutez votre texte et donnez lui la taille désirée.&lt;/p&gt;

&lt;p&gt;Afin de recentrer le texte un fois créé,&lt;/p&gt;

&lt;p&gt;Calque &amp;gt; Aligner les calques visibles :&lt;/p&gt;

&lt;p&gt;&lt;img src='/images/tuto_tron/tuto_tron_05.png' alt='Tutoriel Tron, Image 05' /&gt;&lt;/p&gt;

&lt;p&gt;Sur le calque de texte, Alpha vers sélection&lt;/p&gt;

&lt;p&gt;Sélectionnez le calque &lt;strong&gt;bleu foncé&lt;/strong&gt; puis,&lt;/p&gt;

&lt;p&gt;Édition &amp;gt; Effacer (ctrl-K).&lt;/p&gt;

&lt;p&gt;Masquez le calque de texte (ou supprimez le&amp;#8230;).&lt;/p&gt;

&lt;p&gt;&lt;img src='/images/tuto_tron/tuto_tron_06.png' alt='Tutoriel Tron, Image 06' /&gt;&lt;/p&gt;

&lt;p&gt;Créez un nouveau calque transparent et nommez le &lt;strong&gt;formes&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Sur ce calque créez différentes formes que vous souhaitez ajouter à l&amp;#8217;image.&lt;/p&gt;

&lt;p&gt;Un fois terminé, Alpha vers sélection sur le calque &lt;strong&gt;formes&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Sur le calque &lt;strong&gt;dégradé&lt;/strong&gt;, Édition &amp;gt; Effacer.&lt;/p&gt;

&lt;p&gt;Vous pouvez effacer le calque &lt;strong&gt;formes&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;img src='/images/tuto_tron/tuto_tron_07.png' alt='Tutoriel Tron, Image 07' /&gt;&lt;/p&gt;

&lt;h2 id='et_la_lumière_fut'&gt;Et la lumière fut&lt;/h2&gt;

&lt;p&gt;Créez maintenant un calque juste en dessous du calque de dégradé et nommez le &lt;strong&gt;lumière&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Alpha vers sélection sur le calque de &lt;strong&gt;bleu foncé&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Sur le calque &lt;strong&gt;lumière&lt;/strong&gt;, Agrandir la sélection de 1px, Sélection &amp;gt; Agrandir.&lt;/p&gt;

&lt;p&gt;Remplissez ensuite la sélection de blanc, Édition &amp;gt; Remplir avec la couleur d&amp;#8217;AP (ctrl-.).&lt;/p&gt;

&lt;p&gt;Desélectionnez tout, Sélection &amp;gt; Aucune (ctrl-maj-A).&lt;/p&gt;

&lt;p&gt;Appliquez ensuite un flou Gaussien de 5px, Filtres &amp;gt; Flou &amp;gt; Flou Gaussien.&lt;/p&gt;

&lt;p&gt;&lt;img src='/images/tuto_tron/tuto_tron_08.png' alt='Tutoriel Tron, Image 08' /&gt;&lt;/p&gt;

&lt;p&gt;Créez un nouveau calque transparent au dessus de tous les autres calques.&lt;/p&gt;

&lt;p&gt;Alpha vers sélection sur le calque &lt;strong&gt;bleu foncé&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Remplissez ensuite la sélection de blanc sur le nouveau calque.&lt;/p&gt;

&lt;p&gt;Inversez la sélection, Sélection &amp;gt; Inverser (ctrl-I).&lt;/p&gt;

&lt;p&gt;Ajoutez un masque de calque, Calque &amp;gt; Masque &amp;gt; Ajouter masque de calque.&lt;/p&gt;

&lt;p&gt;Choisissez l&amp;#8217;option Sélection (le blanc devrait disparaitre).&lt;/p&gt;

&lt;p&gt;Desélectionnez tout.&lt;/p&gt;

&lt;p&gt;Appliquez ensuite au &lt;strong&gt;masque de calque&lt;/strong&gt; un flou Gaussien de 5px.&lt;/p&gt;

&lt;p&gt;&lt;img src='/images/tuto_tron/tuto_tron_09.png' alt='Tutoriel Tron, Image 09' /&gt;&lt;/p&gt;

&lt;p&gt;Voila c&amp;#8217;est terminé.&lt;/p&gt;

&lt;p&gt;&lt;img src='/images/tuto_tron/tuto_tron_10.png' alt='Tutoriel Tron, Image 10' /&gt; &lt;img src='/images/tuto_tron/tuto_tron_11.png' alt='Tutoriel Tron, Image 11' /&gt;&lt;/p&gt;    &lt;img src="http://feeds.feedburner.com/~r/LeBlogduGeekJoyeux-atom/~4/wKnUEtz3B2g" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://blog.happynoff.fr/post/Une-signature-dans-le-style-de-Tron</feedburner:origLink></entry>
  <entry>
    <title>Installer et configurer Apache2 sous Debian</title>
    <link href="http://feedproxy.google.com/~r/LeBlogduGeekJoyeux-atom/~3/eqKpLnymUJ4/Installer-et-configurer-Apache2-sous-Debian" rel="alternate" />
    <id>http://blog.happynoff.fr/post/Installer-et-configurer-Apache2-sous-Debian</id>
    <updated>2011-08-25T15:02:57Z</updated>
    <author>
      <name>Simon COURTOIS</name>
    </author>
    <summary type="html">
&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;    </summary>
    <content type="html">
&lt;h2 id='première_chose_à_faire__installer_apache2'&gt;Première chose à faire : installer apache2&lt;/h2&gt;

&lt;p&gt;Pour ceux qui n&amp;#8217;aiment pas la console :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;lancez votre gestionnaire de packages (Adept/Synaptic/etc&amp;#8230;)&lt;/li&gt;

&lt;li&gt;cherchez le package apache2 et demandez son installation&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Pour les autres :&lt;/p&gt;
&lt;div class='CodeRay'&gt;
  &lt;div class='code'&gt;&lt;pre&gt;sudo aptitude install apache2&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Par défaut, sous Debian, la racine du serveur se trouve dans /var/www, les fichiers de configuration dans /etc/apache2.&lt;/p&gt;

&lt;p&gt;En ouvrant votre navigateur préféré vous devriez atteindre votre serveur en tapant l&amp;#8217;adresse &lt;a href='http://localhost'&gt;http://localhost&lt;/a&gt; ou &lt;a href='http:
//127.0.0.1'&gt;http://127.0.0.1&lt;/a&gt;.&lt;/p&gt;

&lt;h2 id='configuration_basique_du_serveur'&gt;Configuration basique du serveur&lt;/h2&gt;

&lt;p&gt;Après avoir effectué un changement, il faut redémarrer le serveur pour que celui-ci soit pris en compte.&lt;/p&gt;
&lt;div class='CodeRay'&gt;
  &lt;div class='code'&gt;&lt;pre&gt;sudo /etc/init.d/apache2 force-reload&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Changer le répertoire racine:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;éditer le fichier /etc/apache2/sites-enabled/000-default&lt;/p&gt;
&lt;/li&gt;

&lt;li&gt;
&lt;p&gt;sans se soucier du reste remplacer&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;DocumentRoot /var/www par DocumentRoot /un/autre/chemin&lt;/li&gt;

&lt;li&gt;&amp;#60;Directory /var/www&amp;#62; par &amp;#60;Directory /un/autre/chemin&amp;#62;&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id='gestion_des_virtualhosts'&gt;Gestion des VirtualHosts&lt;/h2&gt;

&lt;p&gt;Il peut arriver que sur votre serveur vous hébergiez plusieurs sites en même temps. Mais comment faire la différence entre les requêtes ? C&amp;#8217;est justement la que les VirutalHosts interviennent.&lt;/p&gt;

&lt;p&gt;Prenons un cas pratique. Je souhaite héberger deux sites, http://www.mon_site1.com et http://www.mon_site2.com sur le même serveur. La racine de mon_site1 se trouve dans /var/www/site1 et celle de mon_sit e2 dans /home/moi/www.&lt;/p&gt;

&lt;p&gt;Le fichier &lt;em&gt;/etc/apache2/sites-enabled/000-default&lt;/em&gt; devrait ressembler a ceci (j&amp;#8217;ai retiré le surplus d&amp;#8217;infos) :&lt;/p&gt;
&lt;div class='CodeRay'&gt;
  &lt;div class='code'&gt;&lt;pre&gt;# signale que cette configuration est valable&lt;br&gt;# pour toutes les connections sur le port 80 (http)&lt;br&gt;# il est possible de specifier une adresse IP a la place de *&lt;br&gt;NameVirtualHost *:80&lt;br&gt;&lt;br&gt;&amp;lt;Virtualhost *:80&amp;gt;&lt;br&gt;    ServerName www.mon_site1.com       # nom du serveur&lt;br&gt;    DocumentRoot /var/www/site1        # la racine du site&lt;br&gt;    # regles du repertoire /var/www/site1&lt;br&gt;    &amp;lt;Directory /var/www/site1&amp;gt;&lt;br&gt;        Options Indexes&lt;br&gt;        AllowOverride FileInfo         # active les .htaccess&lt;br&gt;        Order allow,deny&lt;br&gt;        Allow from all&lt;br&gt;    &amp;lt;/Directory&amp;gt;&lt;br&gt;&lt;br&gt;    # dans le cas ou le serveur liste un repertoire,&lt;br&gt;    # la description du serveur n'est pas affichee&lt;br&gt;    ServerSignature Off&lt;br&gt;&amp;lt;/Virtualhost&amp;gt;&lt;br&gt;&lt;br&gt;&amp;lt;Virtualhost *:80&amp;gt;&lt;br&gt;    ServerName www.mon_site2.com&lt;br&gt;    DocumentRoot /home/moi/www&lt;br&gt;    &amp;lt;Directory /home/moi/www&amp;gt;&lt;br&gt;        Options Indexes&lt;br&gt;        AllowOverride FileInfo&lt;br&gt;        Order allow,deny&lt;br&gt;        allow from all&lt;br&gt;    &amp;lt;/Directory&amp;gt;&lt;br&gt;    ServerSignature Off&lt;br&gt;&amp;lt;/Virtualhost&amp;gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;    &lt;img src="http://feeds.feedburner.com/~r/LeBlogduGeekJoyeux-atom/~4/eqKpLnymUJ4" height="1" width="1"/&gt;</content>
  <feedburner:origLink>http://blog.happynoff.fr/post/Installer-et-configurer-Apache2-sous-Debian</feedburner:origLink></entry>
</feed>

