<?xml version="1.0" encoding="utf-8"?><?xml-stylesheet title="XSL formatting" type="text/xsl" href="http://prendreuncafe.com/blog/feed/rss2/xslt" ?><rss version="2.0"
  xmlns:dc="http://purl.org/dc/elements/1.1/"
  xmlns:wfw="http://wellformedweb.org/CommentAPI/"
  xmlns:content="http://purl.org/rss/1.0/modules/content/"
  xmlns:atom="http://www.w3.org/2005/Atom">
<channel>
  <title>Prendre un Café - Tag - tips</title>
  <link>http://prendreuncafe.com/blog/</link>
  <atom:link href="http://prendreuncafe.com/blog/feed/tag/tips/rss2" rel="self" type="application/rss+xml"/>
  <description></description>
  <language>fr</language>
  <pubDate>Fri, 02 Mar 2012 11:41:49 +0100</pubDate>
  <copyright>Contenus sous licence Creative Commons BY-SA</copyright>
  <docs>http://blogs.law.harvard.edu/tech/rss</docs>
  <generator>Dotclear</generator>
  
    
  <item>
    <title>Optimize your Doctrine Workflow with Specialized Queries</title>
    <link>http://prendreuncafe.com/blog/post/Optimize-your-Doctrine-Workflow-with-Specialized-Queries</link>
    <guid isPermaLink="false">urn:md5:07be0ff35e1f2e047f2faca25323c26e</guid>
    <pubDate>Tue, 15 Sep 2009 19:14:00 +0200</pubDate>
    <dc:creator>NiKo</dc:creator>
        <category>Dev</category>
        <category>bestpractices</category><category>doctrine</category><category>php</category><category>query</category><category>sql</category><category>symfony</category><category>tips</category>    
    <description>    &lt;p&gt;I&amp;#8217;m currently working on a big &lt;a href=&quot;http://www.symfony-project.org/&quot; hreflang=&quot;en&quot;&gt;Symfony&lt;/a&gt; project, with a lot of &lt;a href=&quot;http://www.doctrine-project.org/&quot; hreflang=&quot;en&quot;&gt;Doctrine&lt;/a&gt; models and complex queries to write. I found a way to organize all of them in an object-oriented and cleaner way than using the traditionnal &lt;code&gt;addNamedQuery()&lt;/code&gt; and &lt;code&gt;createNamedQuery()&lt;/code&gt; methods workflow&lt;sup&gt;[&lt;a href=&quot;http://prendreuncafe.com/blog/post/Optimize-your-Doctrine-Workflow-with-Specialized-Queries#pnote-1123-1&quot; id=&quot;rev-pnote-1123-1&quot;&gt;1&lt;/a&gt;]&lt;/sup&gt;.&lt;/p&gt;


&lt;p&gt;The idea is to create dedicated &lt;a href=&quot;http://www.doctrine-project.org/Doctrine_Query/1_2&quot; hreflang=&quot;en&quot;&gt;query&lt;/a&gt; classes for a given model&amp;#160;; this way, you can provide useful methods to build the business-related parts of your query.&lt;/p&gt;


&lt;p&gt;As usual, the theory is more understandable with a concrete example. Let&amp;#8217;s consider this simple Doctrine model&lt;sup&gt;[&lt;a href=&quot;http://prendreuncafe.com/blog/post/Optimize-your-Doctrine-Workflow-with-Specialized-Queries#pnote-1123-2&quot; id=&quot;rev-pnote-1123-2&quot;&gt;2&lt;/a&gt;]&lt;/sup&gt;&amp;#160;:&lt;/p&gt;


&lt;p&gt;&lt;strong&gt;Disclaimer:&lt;/strong&gt; The provided examples have been written in a hurry, so mistakes might have been not detected by my attentive proof-reading &lt;img src=&quot;/blog/themes/battlestar/smilies/wink.gif&quot; alt=&quot;;)&quot; class=&quot;smiley&quot; /&gt;&lt;/p&gt;

&lt;pre&gt; yaml
BlogAuthor:
  columns:
    id:
      type: integer(4)
      primary: true
      autoincrement: true  
    name:
      type: string(255)
  relations:
    Post:
      type: one
      class: BlogPost
      local: id
      foreign: author_id

BlogPost:
  columns:
    id:
      type: integer(4)
      primary: true
      autoincrement: true
    author_id:
      type: integer(4)
      notnull: true
    title:
      type: string(255)
    content:
      type: string(65535)
  relations:
    Author:
      type: one
      class: BlogAuthor
      local: author_id
      foreign: id
    Comments:
      type: many
      class: BlogComment
      local: id
      foreign: post_id

BlogComment:
  columns:
    id:
      type: integer(4)
      primary: true
      autoincrement: true
    post_id:
      type: integer(4)
      notnull: true
    author:
      type: string(255)
    content:
      type: string(5000)
  relations:
    Post:
      type: one
      class: BlogPost
      local: post_id
      foreign: id
&lt;/pre&gt;


&lt;p&gt;Now let&amp;#8217;s imagine a Query class dedicated to query the BlogPost table:&lt;/p&gt;

&lt;pre&gt; php
&amp;lt;?php 
class BlogPostQuery extends Doctrine_Query
{
  static public function create($conn = null, $class = null)
  {
    return parent::create($conn, 'BlogPostQuery')
      -&amp;gt;from('BlogPost p');
  }
  
  public function addPosts($fields = 'p.*')
  {
    return $this-&amp;gt;addSelect('p.*');
  }
  
  public function addComments($fields = 'c.*')
  {
    return $this
      -&amp;gt;addSelect($fields)
      -&amp;gt;leftJoin('p.Comments c')
      -&amp;gt;addGroupBy('c.id');
  }
  
  public function addAuthors($fields = 'a.*')
  {
    return $this
      -&amp;gt;addSelect($fields)
      -&amp;gt;leftJoin('p.Author a')
      -&amp;gt;addGroupBy('a.id');
  }
  
  public function addCommentsCount($alias = 'nb_comments')
  {
    return $this
      -&amp;gt;addSelect(sprintf('COUNT(c.id) as %s', $alias))
      -&amp;gt;addGroupBy('c.id');
  }
  
  public function filterByAuthorName($authorName)
  {
    return $this
      -&amp;gt;andWhere('a.name = ?', $authorName);
  }
}
&lt;/pre&gt;


&lt;p&gt;So how can we use this query object? Here are some sample uses:&lt;/p&gt;

&lt;pre&gt; php
// Retrieve all posts
$posts = BlogPostQuery::create()
  -&amp;gt;addPosts()
  -&amp;gt;fetchArray();

// Retrieve all posts with comments
$posts = BlogPostQuery::create()
  -&amp;gt;addPosts()
  -&amp;gt;addComments()
  -&amp;gt;fetchArray();

// Retrieve all posts with comments and their count per post
$posts = BlogPostQuery::create()
  -&amp;gt;addPosts()
  -&amp;gt;addComments()
  -&amp;gt;addCommentsCount('yataa')
  -&amp;gt;fetchArray();

// Retrieve all post with chuck as its author and related comments
$posts = BlogPostQuery::create()
  -&amp;gt;addAuthors()
  -&amp;gt;addPosts()
  -&amp;gt;addComments()
  -&amp;gt;filterByAuthorName('chuck')
  -&amp;gt;fetchArray();

// and so on...
&lt;/pre&gt;


&lt;p&gt;Of course, this example of use is not really relevant as our model is really simple, but when you&amp;#8217;re dealing with dozens of internationalized objects, it can help cleaning your model classes, controllers and improving the organization of your work.&lt;/p&gt;


&lt;h3&gt;Update and important precisions&lt;/h3&gt;


&lt;p&gt;Some people are having negative feedback regarding this technique, claiming it will encourage people using the custom query object directly in the controllers; that&amp;#8217;s absolutely not the case as the queries are to be used only within the model layer, for example in the &lt;code&gt;BlogPostTable&lt;/code&gt; class:&lt;/p&gt;

&lt;pre&gt; php
&amp;lt;?php
class BlogPostTable extends Doctrine_Table
{
  static public function getPostsWithCommentsByAuthor($authorName)
  {
    return BlogPostQuery::create()
      -&amp;gt;addPosts()
      -&amp;gt;addComments()
      -&amp;gt;filterByAuthorName($authorName)
      -&amp;gt;fetchArray()
    ;
  }
}
&lt;/pre&gt;


&lt;p&gt;And in a controller:&lt;/p&gt;

&lt;pre&gt; php
class blogActions extends sfActions
{
  public function executeListByAuthor(sfWebRequest $request)
  {
    $this-&amp;gt;posts = BlogPostTable::getPostsWithCommentsByAuthor($request-&amp;gt;getParameter('author'));
  }
}
&lt;/pre&gt;
&lt;div class=&quot;footnotes&quot;&gt;&lt;h4&gt;Notes&lt;/h4&gt;
&lt;p&gt;[&lt;a href=&quot;http://prendreuncafe.com/blog/post/Optimize-your-Doctrine-Workflow-with-Specialized-Queries#rev-pnote-1123-1&quot; id=&quot;pnote-1123-1&quot;&gt;1&lt;/a&gt;] &amp;#8230; or raw queries written directly within controllers, but you may know that &lt;a href=&quot;http://www.slideshare.net/nperriault/30-symfony-best-practices&quot; hreflang=&quot;en&quot;&gt;this is really bad&lt;/a&gt; &lt;img src=&quot;/blog/themes/battlestar/smilies/wink.gif&quot; alt=&quot;;)&quot; class=&quot;smiley&quot; /&gt;&lt;/p&gt;
&lt;p&gt;[&lt;a href=&quot;http://prendreuncafe.com/blog/post/Optimize-your-Doctrine-Workflow-with-Specialized-Queries#rev-pnote-1123-2&quot; id=&quot;pnote-1123-2&quot;&gt;2&lt;/a&gt;] I&amp;#8217;m using Doctrine 1.2 beta (bundled with upcoming symfony 1.3) in the provided example.&lt;/p&gt;&lt;/div&gt;&lt;hr/&gt;&lt;p style=&quot;margin:.5em 0;padding:.5em;border:1px solid #333;background:#eee;color:#222&quot;&gt;&lt;small&gt;Ce billet intitulé &lt;a href=&quot;http://prendreuncafe.com/blog/post/Optimize-your-Doctrine-Workflow-with-Specialized-Queries&quot;&gt;Optimize your Doctrine Workflow with Specialized Queries&lt;/a&gt; a été rédigé par &lt;a href=&quot;http://prendreuncafe.com/cv&quot;&gt;Nicolas Perriault&lt;/a&gt; et publié sur le blog &lt;a href=&quot;http://prendreuncafe.com/blog/&quot;&gt;Prendre un Café&lt;/a&gt; sous licence &lt;a href=&quot;http://creativecommons.org/licenses/by-nc-sa/2.5/&quot;&gt;Creative Commons BY-NC-SA&lt;/a&gt;.&lt;/small&gt;&lt;/p&gt;</description>
    
    
    
      </item>
    
  <item>
    <title>ESC_RAWquerie</title>
    <link>http://prendreuncafe.com/blog/post/2008/06/24/ESC_RAWquerie</link>
    <guid isPermaLink="false">urn:md5:8d1cad8142d699739985dfec903b024f</guid>
    <pubDate>Tue, 24 Jun 2008 07:28:00 +0200</pubDate>
    <dc:creator>NiKo</dc:creator>
        <category>Dev</category>
        <category>escaping</category><category>php</category><category>symfony</category><category>tips</category>    
    <description>    &lt;p&gt;Le saviez-vous ? Dans &lt;a href=&quot;http://symfony-project.org&quot; hreflang=&quot;en&quot;&gt;symfony&lt;/a&gt;, il est possible de désactiver l'&lt;a href=&quot;http://www.symfony-project.org/book/1_0/07-Inside-the-View-Layer#Output%20Escaping&quot; hreflang=&quot;en&quot;&gt;échappement des contenus&lt;/a&gt; en passant la constante &lt;code&gt;ESC_RAW&lt;/code&gt; en dernier paramètre d'une fonction ou méthode de classe depuis une template :&lt;/p&gt;

&lt;pre&gt; php
&amp;lt;?php echo $article-&amp;gt;getTitle(ESC_RAW) ?&amp;gt;
&lt;/pre&gt;


&lt;p&gt;Plutôt donc que :&lt;/p&gt;

&lt;pre&gt; php
&amp;lt;?php echo $article-&amp;gt;getRawValue()-&amp;gt;getTitle() ?&amp;gt;
&lt;/pre&gt;


&lt;p&gt;Ou l'infâme :&lt;/p&gt;

&lt;pre&gt; php
&amp;lt;?php echo $sf_data-&amp;gt;getRaw('article')-&amp;gt;getTitle() ?&amp;gt;
&lt;/pre&gt;


&lt;p&gt;Voila, c'est tout, c'était surtout l'occasion de faire en titre le pire jeu de mot de ce blog, et de pousser le billet d'humeur sur la RATP un peu plus bas sur la home.&lt;/p&gt;&lt;hr/&gt;&lt;p style=&quot;margin:.5em 0;padding:.5em;border:1px solid #333;background:#eee;color:#222&quot;&gt;&lt;small&gt;Ce billet intitulé &lt;a href=&quot;http://prendreuncafe.com/blog/post/2008/06/24/ESC_RAWquerie&quot;&gt;ESC_RAWquerie&lt;/a&gt; a été rédigé par &lt;a href=&quot;http://prendreuncafe.com/cv&quot;&gt;Nicolas Perriault&lt;/a&gt; et publié sur le blog &lt;a href=&quot;http://prendreuncafe.com/blog/&quot;&gt;Prendre un Café&lt;/a&gt; sous licence &lt;a href=&quot;http://creativecommons.org/licenses/by-nc-sa/2.5/&quot;&gt;Creative Commons BY-NC-SA&lt;/a&gt;.&lt;/small&gt;&lt;/p&gt;</description>
    
    
    
      </item>
    
  <item>
    <title>Rendre les extensions Firefox disponibles pour la version 3 beta</title>
    <link>http://prendreuncafe.com/blog/post/2008/02/18/Rendre-les-extensions-Firefox-disponibles-pour-la-version-3-beta</link>
    <guid isPermaLink="false">urn:md5:344aa37c9515bcb968168212956c5712</guid>
    <pubDate>Mon, 18 Feb 2008 11:20:00 +0100</pubDate>
    <dc:creator>NiKo</dc:creator>
        <category>Divers</category>
        <category>browsers</category><category>extensions</category><category>firefox</category><category>tips</category>    
    <description>    &lt;p&gt;Clairement, &lt;a href=&quot;http://standblog.org/blog/post/2008/02/13/Sortie-de-Firefox-3-Beta-3&quot; hreflang=&quot;fr&quot;&gt;Firefox 3 beta 3&lt;/a&gt; est une énorme tuerie. Le programme, à charge d'extensions comparable, est beaucoup plus véloce et moins gourmand en mémoire que son ainé Firefox 2.&lt;/p&gt;


&lt;p&gt;J'utilise depuis quelques temps la version 3 beta comme navigateur principal avec bonheur, à une exception près : l'absence cruelle de disponibilité d'extensions incontournables pour tout développeur web qui se respecte, comme la &lt;a href=&quot;http://chrispederick.com/work/web-developer/&quot; hreflang=&quot;en&quot;&gt;Web Developer Toolbar&lt;/a&gt; par exemple.&lt;/p&gt;


&lt;p&gt;Pour contourner le problème et forcer l'installation de ces extensions officiellement déclarées non compatibles avec Firefox 3, voici une petite astuce (&lt;a href=&quot;http://abaditya.com/2007/12/19/firefox-3-beta-2-and-incompatible-extension-workarounds/&quot; hreflang=&quot;en&quot;&gt;via&lt;/a&gt;) qui désactivera la vérification de compatibilité à l'installation de ces dernières :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Ouvrir le panneau de configuration en tapant &lt;code&gt;about:config&lt;/code&gt; dans la barre d'adresse du navigateur&lt;/li&gt;
&lt;li&gt;Créer une nouvelle entrée booléenne nommée &lt;code&gt;extensions.checkCompatibility&lt;/code&gt; et positionner sa valeur à &lt;code&gt;false&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;C'est tout, vous pouvez installer ce que bon vous semble.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;&lt;strong&gt;Attention :&lt;/strong&gt; La désactivation la vérification de compatibilité des extensions peut engendrer une instabilité de ces dernières et du navigateur. À manier avec la plus grande précaution.&lt;/em&gt;&lt;/p&gt;&lt;hr/&gt;&lt;p style=&quot;margin:.5em 0;padding:.5em;border:1px solid #333;background:#eee;color:#222&quot;&gt;&lt;small&gt;Ce billet intitulé &lt;a href=&quot;http://prendreuncafe.com/blog/post/2008/02/18/Rendre-les-extensions-Firefox-disponibles-pour-la-version-3-beta&quot;&gt;Rendre les extensions Firefox disponibles pour la version 3 beta&lt;/a&gt; a été rédigé par &lt;a href=&quot;http://prendreuncafe.com/cv&quot;&gt;Nicolas Perriault&lt;/a&gt; et publié sur le blog &lt;a href=&quot;http://prendreuncafe.com/blog/&quot;&gt;Prendre un Café&lt;/a&gt; sous licence &lt;a href=&quot;http://creativecommons.org/licenses/by-nc-sa/2.5/&quot;&gt;Creative Commons BY-NC-SA&lt;/a&gt;.&lt;/small&gt;&lt;/p&gt;</description>
    
    
    
      </item>
    
  <item>
    <title>Petit pense-bête des raccourcis Mac OS X</title>
    <link>http://prendreuncafe.com/blog/post/2007/05/19/Petit-pense-bete-des-raccourcis-Mac-OS-X</link>
    <guid isPermaLink="false">urn:md5:1a616bbfe36f995cda4c5437fa48b76f</guid>
    <pubDate>Sat, 19 May 2007 14:21:00 +0200</pubDate>
    <dc:creator>NiKo</dc:creator>
        <category>Mac</category>
        <category>accessibilité</category><category>apple</category><category>clavier</category><category>osx</category><category>tips</category>    
    <description>    &lt;p&gt;Je travaille depuis peu et à temps partiel sous &lt;a href=&quot;http://fr.wikipedia.org/wiki/Mac_OS_X&quot; hreflang=&quot;fr&quot;&gt;Mac OS X&lt;/a&gt; et je suis relativement destabilisé par la profusion de raccourcis clavier propres au système d'exploitation. Voici donc un petit pense-bête des raccourcis que j'ai mis un peu de temps à découvrir et à assimiler &lt;sup&gt;[&lt;a href=&quot;http://prendreuncafe.com/blog/post/2007/05/19/Petit-pense-bete-des-raccourcis-Mac-OS-X#pnote-885-1&quot; id=&quot;rev-pnote-885-1&quot;&gt;1&lt;/a&gt;]&lt;/sup&gt; :&lt;/p&gt;


&lt;h3&gt;Gestion des fenêtres&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Naviguer entre les applications : &lt;code&gt;&amp;lt;pomme&amp;gt; + &amp;lt;Tab&amp;gt;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Masquer les fenêtres de l'application active : &lt;code&gt;&amp;lt;pomme&amp;gt; + H&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Masquer toutes les autres applications : &lt;code&gt;&amp;lt;pomme&amp;gt; + &amp;lt;alt&amp;gt; + H&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Naviguer parmis les fenêtres de l'application active : &lt;code&gt;&amp;lt;pomme&amp;gt; + &amp;lt;&lt;/code&gt; ou &lt;code&gt;&amp;lt;pomme&amp;gt; + &amp;gt;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Minimiser une fenêtre dans le dock : &lt;code&gt;&amp;lt;pomme&amp;gt; + M&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;Émulation de touches et caractères virtuels&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Émuler la touche &lt;code&gt;&amp;lt;delete&amp;gt;&lt;/code&gt; : &lt;code&gt;&amp;lt;fn&amp;gt; + &amp;lt;backspace&amp;gt;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Émuler les touches &lt;code&gt;&amp;lt;Page Up&amp;gt;&lt;/code&gt; et &lt;code&gt;&amp;lt;Page Down&amp;gt;&lt;/code&gt; : &lt;code&gt;&amp;lt;fn&amp;gt; + &amp;lt;Haut&amp;gt;&lt;/code&gt; et &lt;code&gt;&amp;lt;fn&amp;gt; + &amp;lt;Bas&amp;gt;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Émuler les touches &lt;code&gt;&amp;lt;Home&amp;gt;&lt;/code&gt; et &lt;code&gt;&amp;lt;End&amp;gt;&lt;/code&gt; : &lt;code&gt;&amp;lt;pomme&amp;gt; + &amp;lt;Gauche&amp;gt;&lt;/code&gt; et &lt;code&gt;&amp;lt;pomme&amp;gt; + &amp;lt;Droite&amp;gt;&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;Raccourcis pratiques du Finder&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Vider la corbeille depuis le finder : &lt;code&gt;&amp;lt;pomme&amp;gt; + &amp;lt;shift&amp;gt; + &amp;lt;backspace&amp;gt;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Ouvrir le répertoire home : &lt;code&gt;&amp;lt;pomme&amp;gt; + &amp;lt;shift&amp;gt; + H&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Ouvrir le répertoire des applications : &lt;code&gt;&amp;lt;pomme&amp;gt; + &amp;lt;shift&amp;gt; + A&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Ouvrir un emplacement sur le système de fichier : &lt;code&gt;&amp;lt;pomme&amp;gt; + &amp;lt;shift&amp;gt; + G&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;Caractères spéciaux&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Pipe (|) : &lt;code&gt;&amp;lt;alt&amp;gt; + &amp;lt;shift&amp;gt; + L&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Accolades ({}) : &lt;code&gt;&amp;lt;alt&amp;gt; + (&lt;/code&gt; et &lt;code&gt;&amp;lt;alt&amp;gt; + )&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Crochets ([]) : &lt;code&gt;&amp;lt;alt&amp;gt; + &amp;lt;shift&amp;gt; + (&lt;/code&gt; et &lt;code&gt;&amp;lt;alt&amp;gt; + &amp;lt;shift&amp;gt; + )&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Backslash (\) : &lt;code&gt;&amp;lt;shift&amp;gt; + &amp;lt;alt&amp;gt; + :&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Euro (€) : &lt;code&gt;&amp;lt;alt&amp;gt; + $&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Tilde (~) : &lt;code&gt;&amp;lt;alt&amp;gt; + N&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;E dans l'O (œ) : &lt;code&gt;&amp;lt;alt&amp;gt; + O&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;C cédille majuscule (Ç) : &lt;code&gt;&amp;lt;alt&amp;gt; + ç&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;U accent grave majuscule (Ù) : &lt;code&gt;&amp;lt;alt&amp;gt; + u&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;Captures d'écran&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Pour une capture de tout l'écran : &lt;code&gt;&amp;lt;pomme&amp;gt; + &amp;lt;shift&amp;gt; + &amp;quot; (guillemet double)&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Pour une capture zonnée de l'écran : &lt;code&gt;&amp;lt;pomme&amp;gt; + &amp;lt;shift&amp;gt; + ' (guillemet simple)&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Pour capturer une fenêtre : &lt;code&gt;&amp;lt;pomme&amp;gt; + &amp;lt;shift&amp;gt; + ' (guillemet simple) + &amp;lt;Espace&amp;gt;&lt;/code&gt; (sélectionner ensuite la fenêtre à capturer)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;Navigation au sein de formulaires&lt;/h3&gt;


&lt;p&gt;Dans Safari comme dans Firefox, il faut activer manuellement la navigation au sein des formulaires au moyen de la touche &lt;code&gt;&amp;lt;Tab&amp;gt;&lt;/code&gt; :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Dans Safari, cochez &lt;em&gt;Préférences &amp;gt; Avancées &amp;gt; La touche Tab permet de naviguer parmis les objets des pages web&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;Dans Firefox, cochez &lt;em&gt;Préférences &amp;gt; Avancé &amp;gt; Toujours utiliser les touches de navigation pour se déplacer à l'intérieur d'une page&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Pour activer la navigation au clavier pour l'&lt;acronym title=&quot;User Interface, ou Interface Utilisateur&quot;&gt;UI&lt;/acronym&gt; du système d'exploitation, il faut se rendre dans &lt;em&gt;Préférences Système &amp;gt; Clavier &amp;amp; Souris &amp;gt; Raccourcis clavier&lt;/em&gt; et selectionner l'option &lt;em&gt;Dans les fenêtres et zones de dialogues, la touche Tabulation activera : &lt;strong&gt;tous les réglages&lt;/strong&gt;&lt;/em&gt;.&lt;/p&gt;


&lt;h3&gt;D'autres ressources plus complètes sur le sujet&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://developer.apple.com/documentation/UserExperience/Conceptual/OSXHIGuidelines/XHIGKeyboardShortcuts/chapter_20_section_1.html&quot; hreflang=&quot;en&quot;&gt;Référence sur l'Apple Developer Center&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://docs.info.apple.com/article.html?artnum=75459-fr&quot; hreflang=&quot;fr&quot;&gt;Raccourcis clavier Mac OS X : Documentation Apple&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.funnymac.com/raccourcis/&quot; hreflang=&quot;fr&quot;&gt;Raccourcis clavier sur Funnymac&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://developer.apple.com/documentation/Accessibility/Conceptual/AccessibilityMacOSX/index.html#//apple_ref/doc/uid/TP40001078&quot; hreflang=&quot;fr&quot;&gt;Référentiel d'accessibilité Mac OS X&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;footnotes&quot;&gt;&lt;h4&gt;Notes&lt;/h4&gt;
&lt;p&gt;[&lt;a href=&quot;http://prendreuncafe.com/blog/post/2007/05/19/Petit-pense-bete-des-raccourcis-Mac-OS-X#rev-pnote-885-1&quot; id=&quot;pnote-885-1&quot;&gt;1&lt;/a&gt;] Ces raccourcis sont valables pour le &lt;a href=&quot;http://www.apple.com/fr/macbook/macbook.html&quot; hreflang=&quot;fr&quot;&gt;Macbook&lt;/a&gt;. Je ne sais pas s'ils fonctionnent sur les autres modèles Apple...&lt;/p&gt;&lt;/div&gt;&lt;hr/&gt;&lt;p style=&quot;margin:.5em 0;padding:.5em;border:1px solid #333;background:#eee;color:#222&quot;&gt;&lt;small&gt;Ce billet intitulé &lt;a href=&quot;http://prendreuncafe.com/blog/post/2007/05/19/Petit-pense-bete-des-raccourcis-Mac-OS-X&quot;&gt;Petit pense-bête des raccourcis Mac OS X&lt;/a&gt; a été rédigé par &lt;a href=&quot;http://prendreuncafe.com/cv&quot;&gt;Nicolas Perriault&lt;/a&gt; et publié sur le blog &lt;a href=&quot;http://prendreuncafe.com/blog/&quot;&gt;Prendre un Café&lt;/a&gt; sous licence &lt;a href=&quot;http://creativecommons.org/licenses/by-nc-sa/2.5/&quot;&gt;Creative Commons BY-NC-SA&lt;/a&gt;.&lt;/small&gt;&lt;/p&gt;</description>
    
    
    
      </item>
    
  <item>
    <title>Rhythmbox tips</title>
    <link>http://prendreuncafe.com/blog/post/2007/03/04/Rhythmbox-tips</link>
    <guid isPermaLink="false">urn:md5:11a9d4066f27864d56cde1290b5a149d</guid>
    <pubDate>Sun, 04 Mar 2007 00:30:00 +0100</pubDate>
    <dc:creator>NiKo</dc:creator>
        <category>Ubuntu</category>
        <category>gajim</category><category>gnome</category><category>plugins</category><category>rhythmbox</category><category>tips</category><category>ubuntu</category>    
    <description>    &lt;p&gt;(Excusez cette soudaine profusion de billets, je solde)&lt;/p&gt;


&lt;p&gt;Je suis fan de &lt;a href=&quot;http://www.gnome.org/projects/rhythmbox/&quot; hreflang=&quot;en&quot;&gt;Rhythmbox&lt;/a&gt;, le gestionnaire de fichiers musicaux fourni avec &lt;a href=&quot;http://gnome.org/&quot; hreflang=&quot;en&quot;&gt;Gnome&lt;/a&gt; dans &lt;a href=&quot;http://ubuntu-fr.org/&quot; hreflang=&quot;fr&quot;&gt;Ubuntu&lt;/a&gt;. C'est simple, ça fonctionne. Voici quelques astuces destinées à une utilisation optimale du programme.&lt;/p&gt;


&lt;h3&gt;Applet de contrôle dans un tableau de bord Gnome&lt;/h3&gt;


&lt;p&gt;&lt;a href=&quot;http://www.kuliniewicz.org/music-applet/&quot; hreflang=&quot;en&quot;&gt;Music Applet&lt;/a&gt; permet de contrôler votre lecteur musical préféré depuis un tableau de bord Gnome :&lt;/p&gt;


&lt;p&gt;&lt;img src=&quot;http://prendreuncafe.com/blog/public/images/ScreenShots/Gnome/music-applet.png&quot; alt=&quot;Music Applet&quot; style=&quot;display:block; margin:0 auto;&quot; /&gt;&lt;/p&gt;


&lt;p&gt;Pour l'installer :&lt;/p&gt;


&lt;pre&gt;$ sudo apt-get install rhythmbox-applet&lt;/pre&gt;


&lt;p&gt;Puis ajouter un nouvel applet au tableau de bord et choisissez &lt;em&gt;Music Applet&lt;/em&gt; dans la section &lt;em&gt;Multimedia&lt;/em&gt;. Notez qu'il est également capable de piloter &lt;a href=&quot;http://www.banshee-project.org/Main_Page&quot; hreflang=&quot;en&quot;&gt;Banshee&lt;/a&gt; ou &lt;a href=&quot;http://muine-player.org/wiki/Main_Page&quot; hreflang=&quot;en&quot;&gt;Muine&lt;/a&gt;.&lt;/p&gt;


&lt;h3&gt;Notification du titre écouté dans Gajim&lt;/h3&gt;

&lt;p&gt;&lt;a href=&quot;http://madchicken.altervista.org/&quot; hreflang=&quot;en&quot;&gt;Pierpaolo Follia&lt;/a&gt; a réalisé un &lt;a href=&quot;http://madchicken.altervista.org/tech/2006/10/rhythmbox-096-plugin-for-gajim-status.html&quot; hreflang=&quot;en&quot;&gt;plugin pour Rhythmbox&lt;/a&gt; permettant de changer votre message de statut &lt;a href=&quot;http://www.gajim.org/&quot; hreflang=&quot;en&quot;&gt;Gajim&lt;/a&gt; en fonction du titre que vous écoutez. Pour l'installer, c 'est très simple :&lt;/p&gt;


&lt;pre&gt;$ mkdir ~/.gnome2/rhythmbox ~/.gnome2/rhythmbox/plugins
$ cd ~/.gnome2/rhythmbox/plugins
$ wget -c http://madchicken.altervista.org/tech/download/gajim-status.tar.gz
$ tar xvzf gajim-status.tar.gz &amp;amp;&amp;amp; rm gajim-status.tar.gz&lt;/pre&gt;


&lt;p&gt;Relancez Rhythmbox, et configurez le plugin via le menu &lt;em&gt;Edition &amp;gt; Greffons &amp;gt; Gajim status changer&lt;/em&gt; :&lt;/p&gt;


&lt;p&gt;&lt;img src=&quot;http://prendreuncafe.com/blog/public/images/ScreenShots/Gnome/Capture-Gajim_Status_Changer.png&quot; alt=&quot;Capture-Gajim_Status_Changer.png&quot; style=&quot;display:block; margin:0 auto;&quot; /&gt;&lt;/p&gt;


&lt;h3&gt;Suggestions Last.fm avec le plugin LastRhythm&lt;/h3&gt;


&lt;p&gt;Je suis également un très grand &lt;a href=&quot;http://www.lastfm.fr/user/nperriault/&quot; hreflang=&quot;fr&quot;&gt;fan&lt;/a&gt; de &lt;a href=&quot;http://last.fm/&quot; hreflang=&quot;fr&quot;&gt;last.fm&lt;/a&gt;, particulièrement des fonctionnalités de suggestions par similarité artistique. Aussi, quand je suis tombé complètement par hasard sur l'existence d'un &lt;a href=&quot;http://usrportage.de/archives/763-the-last-rhythm-for-me.html&quot; hreflang=&quot;en&quot;&gt;plugin LastRhythm pour Rhythmbox&lt;/a&gt;, je me suis empressé de l'installer pour le tester.&lt;/p&gt;


&lt;p&gt;Verdict, ça marche fort bien (sous &lt;a href=&quot;http://doc.ubuntu-fr.org/versions/edgy_eft&quot; hreflang=&quot;fr&quot;&gt;Edgy&lt;/a&gt; du moins.)&lt;/p&gt;


&lt;p&gt;La procédure d'installation est très simple :&lt;/p&gt;


&lt;pre&gt;$ sudo apt-get install subversion python-elementtree
$ svn co https://svn.usrportage.de/lastrhythm/trunk/ /usr/lib/rhythmbox/plugins/lastrhythm&lt;/pre&gt;


&lt;p&gt;Redémarrez rhythmbox, activez le &lt;del&gt;plugin&lt;/del&gt; greffon et appréciez &lt;img src=&quot;/blog/themes/battlestar/smilies/smile.gif&quot; alt=&quot;:)&quot; class=&quot;smiley&quot; /&gt;&lt;/p&gt;&lt;hr/&gt;&lt;p style=&quot;margin:.5em 0;padding:.5em;border:1px solid #333;background:#eee;color:#222&quot;&gt;&lt;small&gt;Ce billet intitulé &lt;a href=&quot;http://prendreuncafe.com/blog/post/2007/03/04/Rhythmbox-tips&quot;&gt;Rhythmbox tips&lt;/a&gt; a été rédigé par &lt;a href=&quot;http://prendreuncafe.com/cv&quot;&gt;Nicolas Perriault&lt;/a&gt; et publié sur le blog &lt;a href=&quot;http://prendreuncafe.com/blog/&quot;&gt;Prendre un Café&lt;/a&gt; sous licence &lt;a href=&quot;http://creativecommons.org/licenses/by-nc-sa/2.5/&quot;&gt;Creative Commons BY-NC-SA&lt;/a&gt;.&lt;/small&gt;&lt;/p&gt;</description>
    
    
    
      </item>
    
  <item>
    <title>Back(space) to the future</title>
    <link>http://prendreuncafe.com/blog/post/2006/12/21/Backspace-to-the-future</link>
    <guid isPermaLink="false">urn:md5:20071870ab9df79fec3115fb6b16574b</guid>
    <pubDate>Thu, 21 Dec 2006 15:51:00 +0100</pubDate>
    <dc:creator>NiKo</dc:creator>
        <category>Libritudes</category>
        <category>browsers</category><category>firefox</category><category>tips</category><category>ubuntu</category>    
    <description>    &lt;p&gt;[Via &lt;a href=&quot;http://ubuntu.wordpress.com/2006/12/21/fix-firefox-backspace-to-take-you-to-the-previous-page/&quot; hreflang=&quot;en&quot;&gt;Ubuntonista&lt;/a&gt;]&lt;/p&gt;


&lt;p&gt;On était quelques-uns à regretter, depuis la sortie de Firefox2 sous Ubuntu, la disparition de la fonctionnalité permettant de revenir en arrière dans son historique de navigation au moyen de la touche &lt;code&gt;[Backspace]&lt;/code&gt;. Et bien réjouissons-nous, une solution a été trouvée rétablissant l'odre naturel et immuable des choses en ce bas monde \o/ :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Tapez &lt;a href=&quot;http://prendreuncafe.com/blog/post/2006/12/21/Backspace-to-the-future#&quot; title=&quot;about:config&quot;&gt;about:config&lt;/a&gt; dans la barre d'adresse de Firefox 2,&lt;/li&gt;
&lt;li&gt;Cherchez &lt;code&gt;browser.backspace_action&lt;/code&gt; et remplacez la valeur par &lt;code&gt;0&lt;/code&gt; (zéro)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;C'est tout. Content.&lt;/p&gt;&lt;hr/&gt;&lt;p style=&quot;margin:.5em 0;padding:.5em;border:1px solid #333;background:#eee;color:#222&quot;&gt;&lt;small&gt;Ce billet intitulé &lt;a href=&quot;http://prendreuncafe.com/blog/post/2006/12/21/Backspace-to-the-future&quot;&gt;Back(space) to the future&lt;/a&gt; a été rédigé par &lt;a href=&quot;http://prendreuncafe.com/cv&quot;&gt;Nicolas Perriault&lt;/a&gt; et publié sur le blog &lt;a href=&quot;http://prendreuncafe.com/blog/&quot;&gt;Prendre un Café&lt;/a&gt; sous licence &lt;a href=&quot;http://creativecommons.org/licenses/by-nc-sa/2.5/&quot;&gt;Creative Commons BY-NC-SA&lt;/a&gt;.&lt;/small&gt;&lt;/p&gt;</description>
    
    
    
      </item>
    
  <item>
    <title>Sauvegarde facile avec Hubackup</title>
    <link>http://prendreuncafe.com/blog/post/2006/10/22/Sauvegarde-facile-avec-Hubackup</link>
    <guid isPermaLink="false">urn:md5:33fcaf5de0a4cdca11696d5f161f024d</guid>
    <pubDate>Sun, 22 Oct 2006 13:18:00 +0200</pubDate>
    <dc:creator>NiKo</dc:creator>
        <category>Ubuntu</category>
        <category>backup</category><category>bestpractices</category><category>libre</category><category>linux</category><category>softs</category><category>tips</category><category>ubuntu</category>    
    <description>    &lt;p&gt;[via &lt;a href=&quot;http://www.whiprush.org/2006/10/ahhh_backups.html&quot; hreflang=&quot;en&quot;&gt;Jorge Castro&lt;/a&gt;]&lt;/p&gt;


&lt;p&gt;Sauvegarder son répertoire &lt;code&gt;/home&lt;/code&gt; régulièrement peut vous prémunir contre l'aliénation mentale en cas de crash disque. Pour vous aider à backuper votre système simplement, Dieu a inventé &lt;a href=&quot;http://packages.ubuntu.com/edgy/source/hubackup&quot; hreflang=&quot;en&quot;&gt;hubackup&lt;/a&gt; :&lt;/p&gt;


&lt;pre&gt;$ sudo apt-get install hubackup
$ hubackup&lt;/pre&gt;


&lt;p&gt;&lt;img src=&quot;http://prendreuncafe.com/blog/public/images/ScreenShots/hubackup.png&quot; alt=&quot;Hubackup&quot; style=&quot;display:block; margin:0 auto;&quot; /&gt;&lt;/p&gt;


&lt;p&gt;Vous n'avez plus qu'à insérer un CD/DVD vierge, et à le graver.&lt;/p&gt;


&lt;p&gt;Simple, efficace, sans bavure.&lt;/p&gt;


&lt;p&gt;&lt;strong&gt;Edit :&lt;/strong&gt; Preuve (s'il en est besoin) de l'utilité de &lt;a href=&quot;http://forum.ubuntu-fr.org/viewtopic.php?id=70596&quot; hreflang=&quot;fr&quot;&gt;faire des backups régulièrement&lt;/a&gt; &lt;img src=&quot;/blog/themes/battlestar/smilies/icon_ohwell.gif&quot; alt=&quot;:-/&quot; class=&quot;smiley&quot; /&gt;&lt;/p&gt;&lt;hr/&gt;&lt;p style=&quot;margin:.5em 0;padding:.5em;border:1px solid #333;background:#eee;color:#222&quot;&gt;&lt;small&gt;Ce billet intitulé &lt;a href=&quot;http://prendreuncafe.com/blog/post/2006/10/22/Sauvegarde-facile-avec-Hubackup&quot;&gt;Sauvegarde facile avec Hubackup&lt;/a&gt; a été rédigé par &lt;a href=&quot;http://prendreuncafe.com/cv&quot;&gt;Nicolas Perriault&lt;/a&gt; et publié sur le blog &lt;a href=&quot;http://prendreuncafe.com/blog/&quot;&gt;Prendre un Café&lt;/a&gt; sous licence &lt;a href=&quot;http://creativecommons.org/licenses/by-nc-sa/2.5/&quot;&gt;Creative Commons BY-NC-SA&lt;/a&gt;.&lt;/small&gt;&lt;/p&gt;</description>
    
    
    
      </item>
    
  <item>
    <title>Dotclear2 et les gravatars</title>
    <link>http://prendreuncafe.com/blog/post/2006/09/21/Dotclear2-et-les-gravatars</link>
    <guid isPermaLink="false">urn:md5:e373eb4bcb3ea78d58dc411c1705e4a2</guid>
    <pubDate>Thu, 21 Sep 2006 15:07:00 +0200</pubDate>
    <dc:creator>NiKo</dc:creator>
        <category>dev</category><category>dotclear</category><category>gravatar</category><category>mail</category><category>php</category><category>tips</category>    
    <description>    &lt;p&gt;Voici une astuce pour gérer les &lt;a href=&quot;http://www.gravatar.com&quot; hreflang=&quot;en&quot; title=&quot;Gravatars&quot;&gt;gravatars&lt;/a&gt; dans les commentaires de votre blog &lt;a href=&quot;http://www.dotclear.net&quot; hreflang=&quot;fr&quot; title=&quot;Dotclear2&quot;&gt;Dotclear2&lt;/a&gt;. Dans le répertoire de votre thème courant, créez un fichier &lt;code&gt;_public.php&lt;/code&gt; et ajoutez-y ces quelques lignes de code &lt;sup&gt;[&lt;a href=&quot;http://prendreuncafe.com/blog/post/2006/09/21/Dotclear2-et-les-gravatars#pnote-796-1&quot; id=&quot;rev-pnote-796-1&quot;&gt;1&lt;/a&gt;]&lt;/sup&gt; :&lt;/p&gt;

&lt;pre&gt;
&amp;lt;?php
$core-&amp;gt;tpl-&amp;gt;addValue('gravatar', array('gravatar', 'tplGravatar'));
class gravatar {
  public static function tplGravatar($attr)
  {
    return '&amp;lt;?php echo md5(strtolower($_ctx-&amp;gt;comments-&amp;gt;getEmail(false))); ?&amp;gt;';
  }
}
?&amp;gt;
&lt;/pre&gt;


&lt;p&gt;Maintenant, dans votre fichier de template pour les billets (généralement, il s'agit de &lt;code&gt;post.html&lt;/code&gt;), vous pouvez appeller votre image de gravatar de cette façon entre les balises &lt;code&gt;&amp;lt;tpl:Comments&amp;gt;&lt;/code&gt; et &lt;code&gt;&amp;lt;/tpl:Comments&amp;gt;&lt;/code&gt; :&lt;/p&gt;

&lt;pre&gt;
&amp;lt;img src=&amp;quot;http://www.gravatar.com/avatar.php?gravatar_id={{tpl:gravatar}}&amp;quot;
     class=&amp;quot;gravatar_img&amp;quot; alt=&amp;quot;Gravatar Image&amp;quot; /&amp;gt;
&lt;/pre&gt;


&lt;p&gt;Voila, c'est codé en 5 minutes et vous aurez constaté que je ne génère pas directement l'url complète du gravatar et encore moins la syntaxe HTML de la balise image depuis la classe PHP, c'est tout simplement car :&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;J'en ai la flemme,&lt;/li&gt;
&lt;li&gt;Je préfère gérer ça dans le template.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Hope it helps anyway &lt;img src=&quot;/blog/themes/battlestar/smilies/smile.gif&quot; alt=&quot;:)&quot; class=&quot;smiley&quot; /&gt;&lt;/p&gt;


&lt;h3&gt;Edit du 22 septembre 2006&lt;/h3&gt;


&lt;p&gt;Bon, voila finalement une version un poil plus customizable. Le code qui suit annule et remplace le précedent dans votre fichier &lt;code&gt;_public.php&lt;/code&gt; :&lt;/p&gt;

&lt;pre&gt;
&amp;lt;?php
$core-&amp;gt;tpl-&amp;gt;addValue('gravatar', array('gravatar', 'tplGravatar'));

class gravatar {

  const
    URLBASE = 'http://www.gravatar.com/avatar.php?gravatar_id=%s&amp;amp;amp;default=%s&amp;amp;amp;size=%d',
    HTMLTAG = '&amp;lt;img src=&amp;quot;%s&amp;quot; class=&amp;quot;%s&amp;quot; alt=&amp;quot;%s&amp;quot; /&amp;gt;',
    DEFAULT_SIZE = '40',
    DEFAULT_CLASS = 'gravatar_img',
    DEFAULT_ALT = 'Gravatar de %s';

  public static function tplGravatar($attr)
  {
    $md5mail = '\'.md5(strtolower($_ctx-&amp;gt;comments-&amp;gt;getEmail(false))).\'';
    $size    = array_key_exists('size',   $attr) ? $attr['size']   : self::DEFAULT_SIZE;
    $class   = array_key_exists('class',  $attr) ? $attr['class']  : self::DEFAULT_CLASS;
    $alttxt  = array_key_exists('alt',    $attr) ? $attr['alt']    : self::DEFAULT_ALT;
    $altimg  = array_key_exists('altimg', $attr) ? $attr['altimg'] : '';
    $gurl    = sprintf(self::URLBASE,
                       $md5mail, urlencode($altimg), $size);
    $gtag    = sprintf(self::HTMLTAG,
                       $gurl, $class, eregi(&amp;quot;%s&amp;quot;, $alttxt) ?
                                      sprintf($alttxt, '\'.$_ctx-&amp;gt;comments-&amp;gt;comment_author.\'') : $alttxt);
    return '&amp;lt;?php echo \'' . $gtag . '\'; ?&amp;gt;';
  }

}
?&amp;gt;
&lt;/pre&gt;


&lt;p&gt;Du côté de votre template &lt;code&gt;post.html&lt;/code&gt; et toujours entre vos deux balises &lt;code&gt;&amp;lt;tpl:Comments&amp;gt;&lt;/code&gt; et &lt;code&gt;&amp;lt;/tpl:Comments&amp;gt;&lt;/code&gt;, voila comment ça se passe :&lt;/p&gt;

&lt;pre&gt;
{{tpl:gravatar class=&amp;quot;gravatar_img&amp;quot; size=&amp;quot;80&amp;quot; altimg=&amp;quot;http://www.example.host/default_gravatar.png&amp;quot; alt=&amp;quot;Gravatar de %s&amp;quot;}}
&lt;/pre&gt;


&lt;p&gt;Je crois que les attributs sont assez parlants, mais en voici le détail au cas où :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;class&lt;/code&gt; : le nom de la classe CSS à appliquer à l'image&lt;/li&gt;
&lt;li&gt;&lt;code&gt;size&lt;/code&gt; : la taille en pixels&lt;/li&gt;
&lt;li&gt;&lt;code&gt;alt&lt;/code&gt; : Le contenu du texte alternatif à l'image (acepte la syntaxe de &lt;a href=&quot;http://fr.php.net/sprintf&quot; hreflang=&quot;fr&quot; title=&quot;La fonction sprintf() en PHP&quot;&gt;sprintf&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;altimg&lt;/code&gt; : L'url de l'image par defaut en l'absence de gravatar (sera url encodée automatiquement)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Enjoy.&lt;/p&gt;


&lt;h3&gt;Finalement, voila le plugin &lt;img src=&quot;/blog/themes/battlestar/smilies/smile.gif&quot; alt=&quot;:-)&quot; class=&quot;smiley&quot; /&gt;&lt;/h3&gt;


&lt;p&gt;Bon, je suis incorrigible mais l'occasion était trop belle pour commencer à mettre le nez dans le nouveau système de plugins de Dotclear2 ; voici donc le plugin Gravatars &lt;sup&gt;[&lt;a href=&quot;http://prendreuncafe.com/blog/post/2006/09/21/Dotclear2-et-les-gravatars#pnote-796-2&quot; id=&quot;rev-pnote-796-2&quot;&gt;2&lt;/a&gt;]&lt;/sup&gt; :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://prendreuncafe.com/blog/share/plugin-gravatars-1.0.pkg.gz&quot; hreflang=&quot;fr&quot; title=&quot;Installeur du plugin Gravatars pour Dotclear2&quot;&gt;Gravatars pour Dotclear2 v1.0 - Installeur&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://prendreuncafe.com/blog/share/plugin-gravatars-1.0.tar.gz&quot; hreflang=&quot;fr&quot; title=&quot;Archive TAR Gzippée du plugin Gravatars pour Dotclear2&quot;&gt;Gravatars pour Dotclear2 v1.0 - Archive tar.gz&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://prendreuncafe.com/blog/share/plugin-gravatars-1.0.zip&quot; hreflang=&quot;fr&quot; title=&quot;Archive ZIP du plugin Gravatars pour Dotclear2&quot;&gt;Gravatars pour Dotclear2 v1.0 - Archive Zip&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Bien évidemment, pour une toute première version, il doit exister quelques bugs et limitations :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Pas de traduction française&lt;/li&gt;
&lt;li&gt;Pas d'aide contextuelle&lt;/li&gt;
&lt;li&gt;Pas de configuration par blog (à venir)&lt;/li&gt;
&lt;li&gt;Utilisation d'un archaïque fichier INI (pas compris comment mettre les settings en base)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Au chapitre des fonctionnalités :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Possibilité de définir les paramètres des gravatars de façon globale...&lt;/li&gt;
&lt;li&gt;ou individuellement au niveau du template d'appel (voir plus haut)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Edit du 25 août 2007 :&lt;/strong&gt; Grâce à &lt;a href=&quot;http://blog.userland.fr/&quot; hreflang=&quot;fr&quot;&gt;Goulven&lt;/a&gt;, vous avez droit à la version patchée compatible Dotclear2b7 du plugin :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://prendreuncafe.com/blog/share/plugin-gravatars-1.0.1.pkg.gz&quot; hreflang=&quot;fr&quot; title=&quot;Installeur du plugin Gravatars pour Dotclear2b7&quot;&gt;Gravatars pour Dotclear2 v1.0.1 - Installeur&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://prendreuncafe.com/blog/share/plugin-gravatars-1.0.1.tar.gz&quot; hreflang=&quot;fr&quot; title=&quot;Archive TAR Gzippée du plugin Gravatars pour Dotclear2b7&quot;&gt;Gravatars pour Dotclear2 v1.0.1 - Archive tar.gz&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://prendreuncafe.com/blog/share/plugin-gravatars-1.0.1.zip&quot; hreflang=&quot;fr&quot; title=&quot;Archive ZIP du plugin Gravatars pour Dotclear2b7&quot;&gt;Gravatars pour Dotclear2 v1.0.1 - Archive Zip&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;footnotes&quot;&gt;&lt;h4&gt;Notes&lt;/h4&gt;
&lt;p&gt;[&lt;a href=&quot;http://prendreuncafe.com/blog/post/2006/09/21/Dotclear2-et-les-gravatars#rev-pnote-796-1&quot; id=&quot;pnote-796-1&quot;&gt;1&lt;/a&gt;] Prochaine étape : gérer la coloration syntaxique du code dans Dotclear2.&lt;/p&gt;
&lt;p&gt;[&lt;a href=&quot;http://prendreuncafe.com/blog/post/2006/09/21/Dotclear2-et-les-gravatars#rev-pnote-796-2&quot; id=&quot;pnote-796-2&quot;&gt;2&lt;/a&gt;] Packagé grâce au plugin &lt;a href=&quot;http://www.elaboration.be/post/Pack-it&quot; hreflang=&quot;fr&quot; title=&quot;Packager de plugin pour Dotclear2&quot;&gt;Pack it! d'Elaboration.be&lt;/a&gt;&lt;/p&gt;&lt;/div&gt;&lt;hr/&gt;&lt;p style=&quot;margin:.5em 0;padding:.5em;border:1px solid #333;background:#eee;color:#222&quot;&gt;&lt;small&gt;Ce billet intitulé &lt;a href=&quot;http://prendreuncafe.com/blog/post/2006/09/21/Dotclear2-et-les-gravatars&quot;&gt;Dotclear2 et les gravatars&lt;/a&gt; a été rédigé par &lt;a href=&quot;http://prendreuncafe.com/cv&quot;&gt;Nicolas Perriault&lt;/a&gt; et publié sur le blog &lt;a href=&quot;http://prendreuncafe.com/blog/&quot;&gt;Prendre un Café&lt;/a&gt; sous licence &lt;a href=&quot;http://creativecommons.org/licenses/by-nc-sa/2.5/&quot;&gt;Creative Commons BY-NC-SA&lt;/a&gt;.&lt;/small&gt;&lt;/p&gt;</description>
    
    
    
      </item>
    
</channel>
</rss>
