<?xml version="1.0" encoding="utf-8"?><?xml-stylesheet title="XSL formatting" type="text/xsl" href="http://www.nikrou.net/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>Le Journal de Nikrou</title>
  <link>http://www.nikrou.net/</link>
  <atom:link href="http://www.nikrou.net/feed/rss2" rel="self" type="application/rss+xml"/>
  <description></description>
  <language>fr</language>
  <pubDate>Tue, 31 Aug 2010 19:11:48 +0200</pubDate>
  <copyright></copyright>
  <docs>http://blogs.law.harvard.edu/tech/rss</docs>
  <generator>Dotclear</generator>
  
    
  <item>
    <title>Un aquarium tout beau tout neuf</title>
    <link>http://www.nikrou.net/post/2010/08/30/Un-aquarium-tout-beau-tout-neuf</link>
    <guid isPermaLink="false">urn:md5:36073d22b9c4a4823decc441cedcc4fa</guid>
    <pubDate>Mon, 30 Aug 2010 21:41:00 +0200</pubDate>
    <dc:creator>Nicolas</dc:creator>
        <category>Aquarium</category>
        <category>aquarium</category><category>plante</category><category>poisson</category>    
    <description>&lt;p&gt;Ce weekend, j'ai enfin réinstallé mon aquarium après l'avoir nettoyé de fond en comble ! Je n'aurais pas dû déjà le repeupler mais je n'ai pas pu résister...&amp;nbsp;&lt;/p&gt;    &lt;p&gt;J'ai remis des poissons résistants :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;5 mâles et 10 femelles &lt;a href=&quot;http://www.nikrou.net/mon-aquarium/?id=poissons#guppy&quot;&gt;guppy&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;20 &lt;a href=&quot;http://www.nikrou.net/mon-aquarium/?id=poissons#cardinalis&quot;&gt;cardinalis&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Aujourd'hui grâce à de très sympathiques aquariophiles, j'ai récupéré 10 &lt;a href=&quot;http://www.nikrou.net/post/2006/12/12/118-les-envahisseurs&quot;&gt;ampullaires&lt;/a&gt; et 3 &lt;a href=&quot;http://www.nikrou.net/mon-aquarium/?id=poissons#ancistrus&quot;&gt;ancistrus&lt;/a&gt;. Cela devrait aller pour le moment. Je vais attendre que mes plantes poussent et que tout ce petit monde s'acclimate.&lt;/p&gt;</description>
    
    
    
          <comments>http://www.nikrou.net/post/2010/08/30/Un-aquarium-tout-beau-tout-neuf#comment-form</comments>
      <wfw:comment>http://www.nikrou.net/post/2010/08/30/Un-aquarium-tout-beau-tout-neuf#comment-form</wfw:comment>
      <wfw:commentRss>http://www.nikrou.net/feed/atom/comments/208</wfw:commentRss>
      </item>
    
  <item>
    <title>Autoriser les visiteurs de votre galerie à tagger vos images</title>
    <link>http://www.nikrou.net/post/2010/08/25/Autoriser-les-visiteurs-de-votre-galerie-%C3%A0-tagger-vos-images</link>
    <guid isPermaLink="false">urn:md5:92720b8fd3b1cedbf6692d8897cd0d40</guid>
    <pubDate>Wed, 25 Aug 2010 11:24:00 +0200</pubDate>
    <dc:creator>Nicolas</dc:creator>
        <category>Photos</category>
        <category>photo</category><category>php</category><category>piwigo</category><category>plugin</category><category>tags</category>    
    <description>&lt;p&gt;Vous utilisez &lt;a href=&quot;http://fr.piwigo.org/&quot; hreflang=&quot;fr&quot;&gt;piwigo&lt;/a&gt; pour présenter vos photos au monde entier. Vous taggez vos images pour offrir une navigation alternative. Mais c'est une tâche longue lorsqu'on a beaucoup de photos. Et si vos visiteurs vous aidaient ?&lt;/p&gt;    &lt;p&gt;Le plugin &lt;a href=&quot;http://fr.piwigo.org/ext/extension_view.php?eid=441&quot; hreflang=&quot;fr&quot;&gt;User Tags&lt;/a&gt;&amp;nbsp;permet aux visiteurs de votre galerie de tagger vos photos. Ils peuvent utiliser des tags existants mais ils peuvent aussi en ajouter de nouveaux.&lt;/p&gt;
&lt;p&gt;C'est une première version qui manque à coup sûr de fonctionnalités mais je les ajouterais au fur et à mesure. Pour le moment, seuls les personnes identifiées peuvent ajouter des tags. Une des prochaines évolutions sera de gérer depuis l'administration du plugin qui peut ajouter des tags : tout le monde, les personnes identifiées, les webmasters, les administrateurs.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Si vous avez des idées d'améliorations, elles sont les bienvenues.&lt;/p&gt;
&lt;p&gt;Ci dessous, quelques copies d'écran pour voir à quoi cela ressemble.&lt;/p&gt;
&lt;p&gt;Un petit crayon apparait pour pouvoir éditer les tags :&lt;br /&gt;
&lt;a href=&quot;http://www.nikrou.net/public/piwigo/user_tags4.png&quot;&gt;&lt;img src=&quot;http://www.nikrou.net/public/piwigo/.user_tags4_m.jpg&quot; alt=&quot;&quot; /&gt;
&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Quand on a cliqué, on peut ajouter des tags pré-existants, supprimer des tags, en ajouter des nouveaux :
&lt;a href=&quot;http://www.nikrou.net/public/piwigo/user_tags5.png&quot;&gt;&lt;img src=&quot;http://www.nikrou.net/public/piwigo/.user_tags5_m.jpg&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;http://www.nikrou.net/public/piwigo/user_tags3.png&quot;&gt;&lt;img src=&quot;http://www.nikrou.net/public/piwigo/.user_tags3_m.jpg&quot; alt=&quot;&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Tout cela est possible grâce au superbe plugin &lt;a href=&quot;http://www.emposha.com/javascript/fcbkcomplete.html&quot; hreflang=&quot;en&quot;&gt;fcbkComplete&lt;/a&gt;&lt;/p&gt;</description>
    
    
    
          <comments>http://www.nikrou.net/post/2010/08/25/Autoriser-les-visiteurs-de-votre-galerie-%C3%A0-tagger-vos-images#comment-form</comments>
      <wfw:comment>http://www.nikrou.net/post/2010/08/25/Autoriser-les-visiteurs-de-votre-galerie-%C3%A0-tagger-vos-images#comment-form</wfw:comment>
      <wfw:commentRss>http://www.nikrou.net/feed/atom/comments/207</wfw:commentRss>
      </item>
    
  <item>
    <title>Migration vers un nouveau kimsufi : étape ultime</title>
    <link>http://www.nikrou.net/post/2010/08/22/Migration-vers-un-nouveau-kimsufi-%3A-%C3%A9tape-ultime</link>
    <guid isPermaLink="false">urn:md5:1a50cb69550f280c86a83f9c308a1c5e</guid>
    <pubDate>Sun, 22 Aug 2010 21:54:00 +0200</pubDate>
    <dc:creator>Nicolas</dc:creator>
        <category>Général</category>
        <category>serveur</category>    
    <description>&lt;p&gt;Normalement, j'avais &lt;a hreflang=&quot;fr&quot; href=&quot;http://www.nikrou.net/post/2010/07/02/Migration-vers-un-nouveau-Kimsufi-derni%C3%A8re-%C3%A9tape&quot;&gt;terminé la migration&lt;/a&gt;  vers mon nouveau serveur mais c'était sans compter sur une erreur humaine ! &lt;/p&gt;    &lt;p&gt;Avant de partir en vacances, tout fonctionnait correctement. Enfin c'est ce que je croyais. &lt;/p&gt;
&lt;p&gt;Je suis parti le 9 juillet. OVH a comme prévu récupéré mon ancien serveur le 10 juillet et à partir de là le nouveau a été aux abonnés absents. J'ai mis du temps à m'en rendre compte car je n'avais pas internet sur mes lieux de vacances !!! En fait jusqu'au 9 juillet c'était en fait l'ancien serveur qui renseignait les DNS de la planète sur mon nom de domaine. Le nouveau serveur était mal configuré et refusait les connexions sur le port 53. Du coup pendant un mois, mon serveur ne répondait plus.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Le fichier de configuration fautif était &lt;strong&gt;/etc/bind/named.conf.options&lt;/strong&gt;. Sur mon ancien serveur, j'avais :&lt;/p&gt;
&lt;pre class=&quot;brush: shell&quot;&gt;
options {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; directory &quot;/var/cache/bind&quot;;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; auth-nxdomain no;    # conform to RFC1035
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; listen-on-v6 { any; };
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; allow-recursion { localhost; };
};
&lt;/pre&gt;
&lt;p&gt;Le nouveau était :&lt;/p&gt;
&lt;pre class=&quot;brush: shell&quot;&gt;
options {
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;directory &quot;/var/cache/bind&quot;;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;auth-nxdomain no;    # conform to RFC1035
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;listen-on-v6 { ::1; };
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;listen-on-v6 { any; };
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;listen-on { 127.0.0.1; };
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;allow-recursion { 127.0.0.1; };
};
&lt;/pre&gt;
&lt;p&gt;La ligne fautive était la ligne 6. Elle n'était pas présente dans l'ancienne configuration et faisait que le serveur ne répondait que localement. En la commentant tout est rentré dans l'ordre en quelques heures, le temps que la propagation se fasse.&lt;/p&gt;
&lt;p&gt;Le changement de serveur avant de partir en vacances, c'est un peu comme la mise en production d'une nouvelle version majeure un vendredi, c'est à éviter absolument. On ne s'en rappelle vraiment que quand on a fait une fois la bêtise !&lt;/p&gt;</description>
    
    
    
          <comments>http://www.nikrou.net/post/2010/08/22/Migration-vers-un-nouveau-kimsufi-%3A-%C3%A9tape-ultime#comment-form</comments>
      <wfw:comment>http://www.nikrou.net/post/2010/08/22/Migration-vers-un-nouveau-kimsufi-%3A-%C3%A9tape-ultime#comment-form</wfw:comment>
      <wfw:commentRss>http://www.nikrou.net/feed/atom/comments/206</wfw:commentRss>
      </item>
    
  <item>
    <title>Migration vers un nouveau Kimsufi - dernière étape</title>
    <link>http://www.nikrou.net/post/2010/07/02/Migration-vers-un-nouveau-Kimsufi-derni%C3%A8re-%C3%A9tape</link>
    <guid isPermaLink="false">urn:md5:6e3afbc46e96a42fa492f86cae03969d</guid>
    <pubDate>Fri, 02 Jul 2010 22:59:00 +0200</pubDate>
    <dc:creator>Nicolas</dc:creator>
        <category>Général</category>
        <category>apache</category><category>dotclear</category><category>piwigo</category><category>postgresql</category>    
    <description>Aujourd'hui, j'ai basculé sur le nouveau serveur. C'est la dernière étape de la migration.    &lt;p&gt;Depuis l'interface d'administration d'OVH, j'ai basculé mon IP fail-over de mon ancien serveur vers le nouveau. En une ou deux minutes, c'était le nouveau serveur qui répondait.&lt;/p&gt;
&lt;p&gt;Je n'ai pas tout basculer et je suis pratiquement sûr d'avoir oublié des choses mais j'ai migré ce journal (un autre un peu plus secret) En revanche je suis passé à la toute dernière version de dotclear (la 2.2). La migration est aussi facile que pour Piwigo. Bon en même temps, c'est normal, &lt;a href=&quot;http://fr.piwigo.org/forum/profile.php?id=3449&quot; hreflang=&quot;fr&quot;&gt;P@t&lt;/a&gt; a copié. :-)&lt;/p&gt;
&lt;p&gt;J'en ai profité pour passer sur &lt;a href=&quot;http://www.postgresql.org/&quot; hreflang=&quot;en&quot;&gt;une vraie base de données&lt;/a&gt;.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;J'ai découvert une chose un peu par hasard mais j'ai compris comment profiter des urls propres. J'ai choisit PATH_INFO comme mode de lecture des urls. Dans le fichier &lt;strong&gt;inc/config.php&lt;/strong&gt; j'ai jouté ce code :&lt;/p&gt;
&lt;pre class=&quot;brush: php&quot;&gt;if (!isset($_SERVER['ORIG_PATH_INFO'])) {
&amp;nbsp;&amp;nbsp;if (isset($_SERVER['REDIRECT_URL'])) {
&amp;nbsp;&amp;nbsp; &amp;nbsp;$_SERVER['ORIG_PATH_INFO'] = $_SERVER['REDIRECT_URL'];
&amp;nbsp;&amp;nbsp;} else {
&amp;nbsp;&amp;nbsp; &amp;nbsp;$_SERVER['ORIG_PATH_INFO'] = '';
&amp;nbsp;&amp;nbsp;}
}
$_SERVER['PATH_INFO'] = $_SERVER['ORIG_PATH_INFO'];
&lt;/pre&gt;
&lt;p&gt;Dans la configuration d'apache, j'ai ajouté cela: &lt;/p&gt;
&lt;pre class=&quot;brush: shell&quot;&gt;RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule (.*) index.php/$1
Options&amp;nbsp;-MultiViews
&lt;/pre&gt;
&lt;p&gt;C'est surtout la dernière ligne qui fait qu'en son absence cela ne fonctionne pas. L'option &lt;a href=&quot;http://httpd.apache.org/docs/2.2/content-negotiation.html#multiviews&quot; hreflang=&quot;en&quot;&gt;MultiViews&lt;/a&gt; n'est pas compatible avec le mode &lt;a href=&quot;http://httpd.apache.org/docs/2.2/rewrite/&quot; hreflang=&quot;en&quot;&gt;Rewrite&lt;/a&gt;, en tout cas pour ce cas là.&lt;/p&gt;</description>
    
    
    
          <comments>http://www.nikrou.net/post/2010/07/02/Migration-vers-un-nouveau-Kimsufi-derni%C3%A8re-%C3%A9tape#comment-form</comments>
      <wfw:comment>http://www.nikrou.net/post/2010/07/02/Migration-vers-un-nouveau-Kimsufi-derni%C3%A8re-%C3%A9tape#comment-form</wfw:comment>
      <wfw:commentRss>http://www.nikrou.net/feed/atom/comments/205</wfw:commentRss>
      </item>
    
  <item>
    <title>Migration vers un nouveau Kimsufi - deuxième étape</title>
    <link>http://www.nikrou.net/post/2010/07/02/Migration-vers-un-nouveau-Kimsufi-deuxi%C3%A8me-%C3%A9tape</link>
    <guid isPermaLink="false">urn:md5:0eaea07d758d91f1dc9dda3d875bcdbc</guid>
    <pubDate>Tue, 29 Jun 2010 22:43:00 +0200</pubDate>
    <dc:creator>Nicolas</dc:creator>
        <category>Général</category>
        <category>debian</category><category>dotclear</category><category>free</category><category>git</category><category>gitosis</category><category>linux</category><category>photo</category><category>php</category><category>piwigo</category><category>postgresql</category>    
    <description>&lt;p&gt;La deuxième étape de la migration de mon nouveau serveur, après les &lt;a href=&quot;http://www.nikrou.net/post/2010/06/20/Migration-vers-un-nouveau-Kimsufi&quot; hreflang=&quot;fr&quot;&gt;déclaration DNS sur l'ancien serveur&lt;/a&gt;, est l'installation de tous les services sur le nouveau serveur.&lt;/p&gt;    &lt;p&gt;Je n'héberge pas énormément de services (des sites web, &lt;a href=&quot;http://www.nikrou.net/post/2009/02/20/Mettre-en-place-un-d%C3%A9p%C3%B4t-central-git&quot; hreflang=&quot;fr&quot;&gt;un serveur git&lt;/a&gt;, un dépôt non officiel debian, un serveur de mail,...).&lt;/p&gt;
&lt;p&gt;J'ai commencé par réinstaller le nouveau serveur avec mes choix de tailles de partitions. J'aurais pu utiliser &lt;a href=&quot;http://gparted.sourceforge.net/&quot; hreflang=&quot;en&quot;&gt;gparted&lt;/a&gt; pour les redimensionner et passer ensuite à &lt;a href=&quot;http://fr.wikipedia.org/wiki/Gestion_par_volumes_logiques&quot; hreflang=&quot;fr&quot;&gt;lvm&lt;/a&gt; mais étant donné toute la place disponible et le peu de temps qu'il faut pour réinstaller tout le système (moins de 10 minutes) je n'ai pas hésité : j'ai remis une &lt;a href=&quot;http://www.debian.org/&quot; hreflang=&quot;en&quot;&gt;debian 5.0&lt;/a&gt;, 64bits.&lt;/p&gt;
&lt;p&gt;Je n'en avais pas parlé la dernière fois mais il faut aussi ajouter une adresse IP &quot;virtuelle&quot; qui est en fait l'adresse IP fail-over. Cela se passe dans le fichier &lt;strong&gt;/etc/network/interfaces&lt;/strong&gt; :&lt;/p&gt;
&lt;p&gt;Il faut ajouter quelque chose comme ça :&lt;/p&gt;
&lt;pre class=&quot;brush: shell&quot;&gt;auto eth0:0
iface eth0:0 inet static
address I.P.FAIL.OVER
netmask 255.255.255.0
broadcast I.P.FAIL.255
gateway I.P.FAIL.254
&lt;/pre&gt;
&lt;p&gt;Après il suffit de relancer le service :&lt;/p&gt;
&lt;pre class=&quot;brush: shell&quot;&gt;/etc/init.d/networking restart
&lt;/pre&gt;
&lt;p&gt;J'ai fait la même chose sur le nouveau serveur pour pouvoir tester que le basculement fonctionnait plutôt que de le faire au dernier moment et s'apercevoir de problèmes.&lt;/p&gt;
&lt;p&gt;Pour le moment je migre les services à fonctionnalités ou configurations identiques mais je pense que je vais passer tous mes sites avec une base &lt;a href=&quot;http://www.postgresql.org/&quot; hreflang=&quot;en&quot;&gt;PostgreSQL&lt;/a&gt; au lieu de &lt;a href=&quot;http://dev.mysql.com/&quot; hreflang=&quot;en&quot;&gt;MySQL&lt;/a&gt;. Pour &lt;a href=&quot;http://www.dotclear.net/&quot; hreflang=&quot;fr&quot;&gt;Dotclear&lt;/a&gt; cela ne posera pas de problème, pour &lt;a href=&quot;http://www.redmine.org/&quot; hreflang=&quot;en&quot;&gt;redmine&lt;/a&gt; non plus et finalement pour &lt;a href=&quot;http://fr.piwigo.org/&quot; hreflang=&quot;fr&quot;&gt;Piwigo&lt;/a&gt; non plus. Une fois le serveur bien en place, je migrerais aussi ma galerie familiale qui est actuellement sur &lt;a href=&quot;http://pagesperso.free.fr/&quot; hreflang=&quot;fr&quot;&gt;les pages perso de free&lt;/a&gt;.&lt;/p&gt;</description>
    
    
    
          <comments>http://www.nikrou.net/post/2010/07/02/Migration-vers-un-nouveau-Kimsufi-deuxi%C3%A8me-%C3%A9tape#comment-form</comments>
      <wfw:comment>http://www.nikrou.net/post/2010/07/02/Migration-vers-un-nouveau-Kimsufi-deuxi%C3%A8me-%C3%A9tape#comment-form</wfw:comment>
      <wfw:commentRss>http://www.nikrou.net/feed/atom/comments/204</wfw:commentRss>
      </item>
    
  <item>
    <title>Pourquoi faut-il bannir l'arobase de tout code PHP ?</title>
    <link>http://www.nikrou.net/post/2010/06/26/Pourquoi-faut-il-bannir-l-arobase-de-tout-code-PHP</link>
    <guid isPermaLink="false">urn:md5:af6d3635107d8869be52c17a03e39bfb</guid>
    <pubDate>Sat, 26 Jun 2010 15:07:00 +0200</pubDate>
    <dc:creator>Nicolas</dc:creator>
        <category>PHP</category>
        <category>php</category>    
    <description>&lt;p&gt;Nombreux sont les développeurs (débutants ou non) qui utilisent l'arobase (@) pour masquer les erreurs. C'est un peu cacher la misère et c'est surtout un énorme problème lorsqu'il s'agît de trouver un bug dans un code où fleurissent les arobases.&lt;/p&gt;    &lt;p&gt;L'arobase est un opérateur de contrôle d'erreur. Si on préfixe une &lt;a href=&quot;http://fr.php.net/manual/fr/language.expressions.php&quot; hreflang=&quot;fr&quot;&gt;expression&lt;/a&gt; (affectation de variable, include ou require, expression de comparaison,...) par cet opérateur, les messages d'erreurs qui pourraient éventuellement être générés sont ignorés et par conséquent ne sont pas affichés. C'est de là que vient le problème. Les débutants ne maîtrisant pas tous les concepts du langage utilisent l'arobase pour arriver plus vite à leurs fins. On ne peut pas les blâmer mais le remède est pire que le mal !&lt;/p&gt;
&lt;p&gt;Le principal problème de cet opérateur est qu'il ne masque pas que le problème que l'on a sur le moment. Il masque toutes les erreurs dont les erreurs critiques qui stoppent le programme. Par exemple, si une variable ou une fonction est mal orthographiée, on ne le saura pas.&lt;/p&gt;
&lt;p&gt;Voici un exemple de code à ne pas reproduire qui produirait sans l'arobase un message d'avertissement &quot;Notice Undefined index var ...&quot; :&lt;/p&gt;
&lt;pre class=&quot;brush: php&quot;&gt;&amp;lt;?php
$ma_var = @$_GET['var'];
?&amp;gt;
&lt;/pre&gt;
&lt;p&gt;Si la variable $_GET['var'] n'existe pas, on ne le saura pas et on devra faire le test ultérieurement. Donc autant tester directement :&lt;/p&gt;
&lt;pre class=&quot;brush: php&quot;&gt;&amp;lt;?php
if (isset($_GET['var'])) {
&amp;nbsp;&amp;nbsp;$ma_var = $_GET['var'];
} else {
&amp;nbsp;&amp;nbsp;$ma_var = '';
}
?&amp;gt;
&lt;/pre&gt;
&lt;p&gt;Dans l'exemple précédent il y a peu de conséquences. Imaginons que l'on veuille inclure un fichier de configuration que s'il existe. Une mauvaise pratique serait de préfixer l'inclusion par un arobase :&lt;/p&gt;
&lt;pre class=&quot;brush: php&quot;&gt;&amp;lt;?php
@include 'conf.inc.php';
?&amp;gt;
&lt;/pre&gt;
&lt;p&gt;De prime abord on pourrait penser qu'on a atteint le but souhaité. Si le fichier n'existe pas, on n'aura pas d'erreurs ; dans le cas contraire il sera inclus. Pour rendre les choses plus claires imaginons le code suivant :&lt;/p&gt;
&lt;pre class=&quot;brush: php&quot;&gt;&amp;lt;?php
$nom = 'Pouce';
$prenom = 'Tom';
@include 'conf.inc.php';
echo &quot;Bonjour $prenom $nom
&quot;;
?&amp;gt;
&lt;/pre&gt;
&lt;p&gt;Et voici le contenu du fichier conf.inc.php : &lt;/p&gt;
&lt;pre class=&quot;brush: php&quot;&gt;&amp;lt;?php
$prenom = 'Nicolas';
$nom = 'Cémoi';
?&amp;gt;
&lt;/pre&gt;
&lt;p&gt;Bon l'intérêt de ce code est plus que discutable mais en revanche il va permettre d'expliquer plus clairement mon propos. Si le fichier existe, et que le script courant peut l'inclure alors on aura le super message : &quot;Bonjour Nicolas Cémoi&quot;. Si le fichier n'existe pas on aura le message : &quot;Bonjour Tom Pouce&quot;. Jusque là tout va bien.&lt;/p&gt;

&lt;p&gt;Maintenant supposons que le fichier soit bien là mais qu'il y ait une erreur dans le fichier conf.inc.php, par exemple qu'il manque le point virgule à la fin de la première ligne. On n'aura aucun message d'erreur, mais comme l'erreur est critique l'exécution du script s'arrête et on n'a pas de message du tout. L'exécution du script s'arrête à la ligne où on tente de faire l'inclusion du fichier. L'arobase a masqué l'erreur de syntaxe &quot;Parse error:  syntax error, unexpected T_VARIABLE ...&quot;. L'exemple est très simple et on ne fait appel qu'à deux fichiers mais si on fait de nombreuses inclusions, et/ou des inclusions en cascade, trouver le problème devient un vrai casse-tête.&lt;/p&gt;
&lt;p&gt;Encore une fois, le code pour éviter le problème est d'une simplicité enfantine :&lt;/p&gt;
&lt;pre class=&quot;brush: php&quot;&gt;&amp;lt;?php
if (file_exists('conf.inc.php')) {
&amp;nbsp;&amp;nbsp;include 'conf.inc.php';
}
?&amp;gt;
&lt;/pre&gt;
&lt;p&gt;L'utilisation de l'arobase est une très mauvaise pratique qui est à bannir. Elle crée plus de problèmes qu'elle n'en résoud. &lt;/p&gt;
&lt;p&gt;Il y a tout de même des exceptions à cette pratique : si on teste l'erreur. Par exemple lorsqu'on veut créer une connexion à une base de données pour ne pas afficher d'erreur si un problème survenait, on peut utiliser l'arobase devant la fonction pg_connect() (ou mysql_connect() ou ...). Il faut bien entendu ensuite tester le retour de la fonction qui est soit false soit une ressource de connexion.&lt;/p&gt;</description>
    
    
    
          <comments>http://www.nikrou.net/post/2010/06/26/Pourquoi-faut-il-bannir-l-arobase-de-tout-code-PHP#comment-form</comments>
      <wfw:comment>http://www.nikrou.net/post/2010/06/26/Pourquoi-faut-il-bannir-l-arobase-de-tout-code-PHP#comment-form</wfw:comment>
      <wfw:commentRss>http://www.nikrou.net/feed/atom/comments/203</wfw:commentRss>
      </item>
    
  <item>
    <title>Delamaison.fr, un &quot;commerçant&quot; à fuir.</title>
    <link>http://www.nikrou.net/post/2010/06/25/Delamaison.fr%2C-un-commer%C3%A7ant-%C3%A0-fuir.</link>
    <guid isPermaLink="false">urn:md5:aa2424f898ebc2efdfb74750c1c74173</guid>
    <pubDate>Fri, 25 Jun 2010 22:25:00 +0200</pubDate>
    <dc:creator>Nicolas</dc:creator>
        <category>Général</category>
        <category>arnaque</category><category>commerce</category><category>mail</category>    
    <description>&lt;p&gt;Si vous tombez par hasard, ou en suivant un lien sur le site &lt;a href=&quot;http://www.delamaison.fr&quot;&gt;Delamaison.fr&lt;/a&gt;, fuyez. Fuez avant de faire la bêtise de commander. Ne tombez pas dans leur piège vantant une livraison &quot;en 48 heures&quot; ou une &quot;livraison offerte&quot;, c'est un piège. Si vous commandez, il sera trop tard et vous ne pourrez pas dire que je ne vous avais pas prévenu.&lt;/p&gt;    &lt;p&gt;Récemment, j'ai voulu acheté un barbecue. En cherchant ,une offre intéressante je tombe par hasard sur le site de&amp;nbsp;&lt;a href=&quot;http://www.delamaison.fr/&quot; hreflang=&quot;fr&quot;&gt;Delamaison.fr&lt;/a&gt;. Une publicité attire mon attention : &quot;livraison en 48 heures&quot;. Je ne suis pas spécialement pressé mais pour ce genre d'objet une livraison rapide est plutôt appréciable. Je commande le lundi 7 juin en me disant que je pourrais tester mon nouveau &quot;jouet&quot; le weekend suivant.&lt;/p&gt;
&lt;p&gt;Ce jour là, j'aurais mieux fait de passer mon chemin. Aujourd'hui, le 25 juin soit presque 3 semaines après ma commande pas de barbecue en vue. J'ai bien tenté de contacter la société sans réussite. Je n'ai pas envie d'appeler un numéro surtaxé. Quand on est une société commerciale sur le web, on se doit de faire l'effort minimal à mon sens d'être joignable par le même vecteur de communication.&lt;/p&gt;
&lt;p&gt;J'ai envoyé maintes fois des messages par l'intermédiaire du formulaire en ligne, sans aucune réponse à ce jour. La communication fonctionne tout de même car ma boîte mail regorge de mail de publicité de leur part. Pas moyen de répondre à ces mails car l'adresse qu'ils utilisent n'existe pas :&amp;nbsp;&lt;a href=&quot;mailto:email@delamaison.fr&quot;&gt;email@delamaison.fr&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Je persiste et j'essaie de trouver une adresse sur leur site. J'en trouve une sur la page &lt;a href=&quot;http://www.delamaison.fr/confidentialite.php&quot; hreflang=&quot;fr&quot;&gt;mentions légales&lt;/a&gt;&amp;nbsp;: &lt;a href=&quot;mailto:&quot;&gt;contact@delamaison.fr&lt;/a&gt;. Elle semble existé mais un robot renvoie le message suivant :&lt;/p&gt;
&lt;pre&gt;Bonjour,
Pour contacter nos conseillers, merci de passer par le formulaire que vous pouvez trouver à l'adresse suivante :
&lt;a href=&quot;http://www.delamaison.fr/service-client&quot;&gt;http://www.delamaison.fr/&lt;wbr&gt;service-client&lt;/a&gt;
Merci de votre compréhension.
&lt;/pre&gt;
&lt;p&gt;J'ai laissé le joli lien qui renvoie vers une page qui n'existe pas. Il n'y a pas de service client chez Delamaison !&lt;/p&gt;
&lt;p&gt;Dans le même esprit, j'ai essayé &lt;a href=&quot;mailto:webmaster@delamaison.fr&quot;&gt;webmaster@delamaison.fr&lt;/a&gt;, &lt;a href=&quot;mailto:postmaster@delamaison.fr&quot;&gt;postmaster@delamaison.fr&lt;/a&gt;, sans plus de réussite.&lt;/p&gt;
&lt;p&gt;Je me suis finalement résolu à faire une recherche &lt;a href=&quot;http://fr.wikipedia.org/wiki/Whois&quot; hreflang=&quot;fr&quot;&gt;Whois&lt;/a&gt;&amp;nbsp;pour tenter de trouver une adresse valide. J'ai envoyé un mail au propriétaire du nom de domaine ce matin. Pour le moment, pas de réponse.&lt;/p&gt;
&lt;p&gt;Je me suis dit que j'étais un cas isolé et que je n'avais pas eu de chance, mais visiblement je ne suis pas le seul à vouloir fuir &lt;a href=&quot;http://www.delamaison.fr/&quot; hreflang=&quot;fr&quot;&gt;Delamaison.fr&lt;/a&gt;, à flairer l'anarque:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://www.ciao.fr/Delamaison_fr__821264&quot;&gt;Ciao.fr&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.vozavi.com/service/e-commercant/delamaison-fr_s7_356.html&quot;&gt;Vozavi.fr&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.commentcamarche.net/sites/reviews/delamaison.fr&quot;&gt;Comment ça marche&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.wikio.fr/vendor/delamaison.html&quot;&gt;Wikio.fr&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Du coup ce n'est plus le fruit du hasard. Il est vraiment dommage que l'&lt;a href=&quot;http://fr.wikipedia.org/wiki/Action_de_groupe_(droit)&quot; hreflang=&quot;fr&quot;&gt;action de groupe&lt;/a&gt; ne soit pas légale en France car sinon je pense que cette société n'existerait plus.&lt;/p&gt;
&lt;p&gt;Note :&lt;/p&gt;
&lt;p&gt;Si quelqu'un de la société&amp;nbsp;&lt;a href=&quot;http://www.elbee.fr/&quot; hreflang=&quot;fr&quot;&gt;ELBEE&lt;/a&gt;, ou du site &lt;a href=&quot;http://www.delamaison.fr/&quot; hreflang=&quot;fr&quot;&gt;Delamaison.fr&lt;/a&gt;&amp;nbsp;tombe sur ce billet, je suis bien entendu prêt à régler ce différend rapidement et à l'amiable.&lt;/p&gt;</description>
    
    
    
          <comments>http://www.nikrou.net/post/2010/06/25/Delamaison.fr%2C-un-commer%C3%A7ant-%C3%A0-fuir.#comment-form</comments>
      <wfw:comment>http://www.nikrou.net/post/2010/06/25/Delamaison.fr%2C-un-commer%C3%A7ant-%C3%A0-fuir.#comment-form</wfw:comment>
      <wfw:commentRss>http://www.nikrou.net/feed/atom/comments/202</wfw:commentRss>
      </item>
    
  <item>
    <title>Migration vers un nouveau Kimsufi</title>
    <link>http://www.nikrou.net/post/2010/06/20/Migration-vers-un-nouveau-Kimsufi</link>
    <guid isPermaLink="false">urn:md5:99879658bda3529b58df06d385d10654</guid>
    <pubDate>Mon, 21 Jun 2010 22:49:00 +0200</pubDate>
    <dc:creator>Nicolas</dc:creator>
        <category>Général</category>
        <category>debian</category><category>serveur</category>    
    <description>&lt;p&gt;Depuis le mois d'octobre 2008, je loue un serveur &lt;a href=&quot;http://www.nikrou.net/post/2010/06/20/Kimsufi&quot; hreflang=&quot;fr&quot;&gt;Kimsufi&lt;/a&gt;. J'en suis très content. Début juin, &lt;a href=&quot;http://www.ovh.com/&quot; hreflang=&quot;fr&quot;&gt;OVH&lt;/a&gt; change ses tarifs à la baisse (de 19,99€ HT à 14,99€ HT) en passant la mémoire vie du serveur de 1Go à 2Go.&amp;nbsp;J'hésite un moment car il va falloir tout réinstaller et risquer une interruption de service mais c'était sans compter le service d'&lt;a href=&quot;http://guide.ovh.com/IpFailover&quot; hreflang=&quot;fr&quot;&gt;IP fail-over&lt;/a&gt;.&lt;/p&gt;    &lt;p&gt;L'option d'IP fail-over permet à la base de palier aux pannes matérielles, sert pour mettre à jour une machine en basculant les différents services (ou seulement certains) sur une autre. Le basculement se fait en quelques secondes.&lt;/p&gt;
&lt;p&gt;Cette option va servir à basculer sur le nouveau serveur sans interruption de services.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;La première étape est d'activer l'option fail-over sur l'ancien serveur. On reçoit par mail ou une nouvelle adresse IP. Il faut alors configurer tous les services pour qu'il utilise cette nouvelle adresse au lieu de l'adresse principale. On commence par le &lt;acronym title=&quot;Domain Name System lang=&quot; en&quot;=&quot;&quot;&gt;DNS&lt;/acronym&gt;. Il suffit de remplacer dans l'ancienne configuration les lignes :&lt;/p&gt;
&lt;pre class=&quot;brush: shell&quot;&gt;IN      NS      ksNNNNNN.kimsufi.com.
IN      NS      ns.kimsufi.com.
&lt;/pre&gt;
Par les lignes suivantes :
&lt;pre class=&quot;brush: shell&quot;&gt;IN      NS      I.P.FAIL.OVER.kimsufi.com.
IN      NS      sdns1.kimsufi.com.
&lt;/pre&gt;
&lt;p&gt;I.P.FAIL.OVER est mon IP fail-over, ksNNNNNN est le p'tit nom du serveur. Le reste du fichier ne change mis à part le champ SOA qu'il faut incrémenter pour que les informations soient prises en compte par les autres DNS. J'ai fait l'opération hier et le serveur est accessible à la nouvelle adresse IP (celle en fail-over).&lt;/p&gt;</description>
    
    
    
          <comments>http://www.nikrou.net/post/2010/06/20/Migration-vers-un-nouveau-Kimsufi#comment-form</comments>
      <wfw:comment>http://www.nikrou.net/post/2010/06/20/Migration-vers-un-nouveau-Kimsufi#comment-form</wfw:comment>
      <wfw:commentRss>http://www.nikrou.net/feed/atom/comments/201</wfw:commentRss>
      </item>
    
  <item>
    <title>Intégrer une vidéo</title>
    <link>http://www.nikrou.net/post/2010/06/18/Int%C3%A9grer-une-vid%C3%A9o</link>
    <guid isPermaLink="false">urn:md5:617e88cb5c03e3c0ec6968ff279cc11e</guid>
    <pubDate>Fri, 18 Jun 2010 20:44:00 +0200</pubDate>
    <dc:creator>Nicolas</dc:creator>
        <category>Photos</category>
        <category>ffmpeg</category><category>flash</category><category>photo</category><category>vidéo</category>    
    <description>&lt;p&gt;Mon &lt;a href=&quot;http://www.panasonic.fr/html/fr_FR/Produits/DMC-FZ38/Pr%C3%A9sentation/2721302/index.html&quot; hreflang=&quot;fr&quot;&gt;appareil photo&lt;/a&gt; me permet de faire des vidéos haute définition au format AVCHD. Mais ce format n'est pas facile à lire depuis une interface web. En attendant que le format &lt;a href=&quot;http://www.webmproject.org/&quot; hreflang=&quot;en&quot;&gt;WebM&lt;/a&gt;&amp;nbsp;soit populaire je me contente bêtement de les fournir en &lt;a href=&quot;http://fr.wikipedia.org/wiki/Flash_Video&quot; hreflang=&quot;fr&quot;&gt;FLV&lt;/a&gt;.&lt;/p&gt;    &lt;p&gt;Pour transformer mes vidéos au format FLV, j'utilise &lt;a href=&quot;http://www.ffmpeg.org/&quot; hreflang=&quot;en&quot;&gt;ffmpeg&lt;/a&gt;&amp;nbsp;que j'ai intégré dans un script shell me permettant de faire plusieurs transformations à la suite si besoin :&lt;/p&gt;
&lt;pre class=&quot;brush: shell&quot;&gt;#!/bin/sh
video=`echo $1|sed -e 's/\..*//'`
ffmpeg -i $1 -vcodec flv -f flv -r 25 -s 800x450 -aspect 16:9 \r
-b 2000k -g 160 -cmp 2 -subcmp 2 -mbd 2 -flags +aic+cbp+mv0+mv4  \r
-trellis 2 -acodec libmp3lame -ac 2 -ar 44100 -ab 256k \r
&quot;$video.flv&quot;
&lt;/pre&gt;
&lt;p&gt;Pour présenter cette vidéo, j'utilise l'excellent &lt;a href=&quot;http://flv-player.net/fr/&quot; hreflang=&quot;fr&quot;&gt;lecteur de neolao&lt;/a&gt;. Ce lecteur offre la possibilité d'afficher une image avant le chargement de la vidéo. Pour faire simple, je mets la première image de la vidéo que je viens de fabriquer avec le script suivant :&lt;/p&gt;
&lt;pre class=&quot;brush: shell&quot;&gt;#!/bin/sh
video=`echo $1|sed -e 's/\..*//'`
ffmpeg -i $1 -vcodec mjpeg -vframes 1 -an -f rawvideo &quot;$video.jpg&quot;
&lt;/pre&gt;</description>
    
    
    
          <comments>http://www.nikrou.net/post/2010/06/18/Int%C3%A9grer-une-vid%C3%A9o#comment-form</comments>
      <wfw:comment>http://www.nikrou.net/post/2010/06/18/Int%C3%A9grer-une-vid%C3%A9o#comment-form</wfw:comment>
      <wfw:commentRss>http://www.nikrou.net/feed/atom/comments/200</wfw:commentRss>
      </item>
    
  <item>
    <title>Afficher les photos dans le bon sens</title>
    <link>http://www.nikrou.net/post/2010/06/11/Afficher-les-photos-dans-le-bon-sens</link>
    <guid isPermaLink="false">urn:md5:329e06ceacc6496c8623727f0ce5a34f</guid>
    <pubDate>Fri, 11 Jun 2010 22:14:00 +0200</pubDate>
    <dc:creator>Nicolas</dc:creator>
        <category>Photos</category>
        <category>photo</category><category>piwigo</category><category>script</category>    
    <description>&lt;p&gt;Lorsqu'on prend des photos avec un appareil on ne garde pas toujours l'appareil dans sa position &quot;normale&quot;. On prend quelque fois des photos au format portrait. Elles ne sont pas toujours affichées correctement dans une galerie photo. Comment faire ?&lt;/p&gt;    &lt;p&gt;La plupart des appareils photos récents ont un capteur sensoriel permettant de déterminer l'orientation de l'appareil et d'écrire cette information dans le champ&amp;nbsp;&lt;acronym title=&quot;Exchangeable image file format&quot; lang=&quot;en&quot;&gt;EXIF&lt;/acronym&gt;&amp;nbsp;- orientation - de la photo.&lt;/p&gt;
&lt;p&gt;L'axe du capteur repère les photos verticales et horizontales uniquement et donc il n'y a que 4 valeurs possibles pour l'orientation. La valeur &quot;normale&quot;, quand l'appareil est dans la position standard est 1. Par exemple avec une belle image de vache comme celle-ci :&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://www.nikrou.net/public/vaches.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Ce qui est perturbant dans l'histoire et qui est source d'incompréhension, c'est que l'appareil photo a une fonctionnalité qui permet de tourner automatiquement la photo. De même de nombreux logiciels tournent les photos automatiquement. Du coup on ne comprend pas toujours pourquoi elles se retrouvent dans le mauvais sens lorsqu'on les affiche dans notre &lt;a href=&quot;http://fr.piwigo.org/&quot; hreflang=&quot;fr&quot;&gt;galerie préférée&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Il existe de nombreuses méthodes pour corriger ce problème. Pour ma part, j'utilise &lt;a href=&quot;http://www.nikrou.net/post/2010/06/11/ImageMagick&quot; hreflang=&quot;en&quot;&gt;ImageMagick&lt;/a&gt;, dans un petit script pour appliquer par exemple la correction à toutes les images d'un répertoire :&lt;/p&gt;
&lt;pre class=&quot;brush: shell&quot;&gt;#!/bin/sh
for i in *.jpg;
do
echo $i;
o=$(identify -format &quot;%[exif:orientation]&quot; $i);
if [ $o -eq 8 ]; then
convert -rotate -90 $i $i
elif [ $o -eq 6 ]; then
convert -rotate 90 $i $i
elif [ $o -eq 3 ]; then
convert -rotate 180 $i $i
fi
done
&lt;/pre&gt;</description>
    
    
    
          <comments>http://www.nikrou.net/post/2010/06/11/Afficher-les-photos-dans-le-bon-sens#comment-form</comments>
      <wfw:comment>http://www.nikrou.net/post/2010/06/11/Afficher-les-photos-dans-le-bon-sens#comment-form</wfw:comment>
      <wfw:commentRss>http://www.nikrou.net/feed/atom/comments/199</wfw:commentRss>
      </item>
    
  <item>
    <title>A la découverte de Piwigo</title>
    <link>http://www.nikrou.net/post/2010/06/07/A-la-d%C3%A9couverte-de-Piwigo</link>
    <guid isPermaLink="false">urn:md5:0bfdc803fc6ff6839fa3fff8882570d4</guid>
    <pubDate>Mon, 07 Jun 2010 14:35:00 +0200</pubDate>
    <dc:creator>Nicolas</dc:creator>
        <category>Général</category>
        <category>demo</category><category>piwigo</category>    
    <description>&lt;p&gt;Vous ne connaissez pas &lt;a href=&quot;http://fr.piwigo.org/&quot; hreflang=&quot;fr&quot;&gt;piwigo&lt;/a&gt;. Vous cherchez un logiciel pour présenter vos photos sur le web, venez découvrir Piwigo à Parinux demain (le mardi 8 juin).&amp;nbsp;&lt;/p&gt;    Cette présentation de Piwigo est organisée par l'association &lt;a href=&quot;http://www.parinux.org/&quot; hreflang=&quot;fr&quot;&gt;Parinux&lt;/a&gt;, dans le
cadre de la promotion des logiciels libres en région parisienne.&lt;div&gt;La présentation sera une découverte de Piwigo. C'est avant tout une démonstration pour ceux qui ne connaissent pas (ou très peu) le logiciel.&lt;/div&gt;&lt;div&gt;Si vous êtes intéressés, &lt;a href=&quot;http://www.parinux.org/content/piwigo-le-logiciel-libre-de-galerie-photo-pour-le-web&quot; hreflang=&quot;fr&quot;&gt;n'hésitez pas à vous inscrire&lt;/a&gt;. Attention le nombre de places est limité.&lt;/div&gt;&lt;div&gt;A l'issue de la présentation, &lt;a href=&quot;http://www.nikrou.net/post/2010/06/07/Pierrick&quot; hreflang=&quot;fr&quot;&gt;Pierrick&lt;/a&gt; et moi-même répondrons à vos questions.&lt;/div&gt;&lt;div&gt;Si vous ne pouvez pas venir demain ou si la salle était comble vous pouvez aussi tenter votre chance &lt;a href=&quot;http://www.parinux.org/content/atelier-piwigo&quot; hreflang=&quot;fr&quot;&gt;à l'atelier Piwigo&lt;/a&gt;, le samedi 26 juin. Cela ne sera pas une présentation du logiciel mais une séance d'installation.&lt;/div&gt;</description>
    
    
    
          <comments>http://www.nikrou.net/post/2010/06/07/A-la-d%C3%A9couverte-de-Piwigo#comment-form</comments>
      <wfw:comment>http://www.nikrou.net/post/2010/06/07/A-la-d%C3%A9couverte-de-Piwigo#comment-form</wfw:comment>
      <wfw:commentRss>http://www.nikrou.net/feed/atom/comments/198</wfw:commentRss>
      </item>
    
  <item>
    <title>Préparation des photos pour mise en ligne</title>
    <link>http://www.nikrou.net/post/2010/06/06/Pr%C3%A9paration-des-photos-pour-mise-en-ligne</link>
    <guid isPermaLink="false">urn:md5:9a80047b10483e5a12e318e5adae3db1</guid>
    <pubDate>Sun, 06 Jun 2010 14:58:00 +0200</pubDate>
    <dc:creator>Nicolas</dc:creator>
        <category>Photos</category>
        <category>photo</category><category>php</category><category>piwigo</category><category>ploader</category><category>sed</category>    
    <description>&lt;p&gt;J'utilise &lt;a href=&quot;http://fr.piwigo.org/&quot; hreflang=&quot;fr&quot;&gt;Piwigo&lt;/a&gt; pour présenter mes photos à ma famille, mes amis,... L'application fournit tout ce qu'il me faut pour les présenter mais pour ne pas surcharger le serveur de mon hébergeur je prépare mes photos avant de les envoyer sur le serveur...&lt;/p&gt;    &lt;p&gt;&lt;a href=&quot;http://www.panasonic.fr/html/fr_FR/Produits/DMC-FZ38/Pr%C3%A9sentation/2721302/index.html&quot; hreflang=&quot;fr&quot;&gt;Mon appareil photo&lt;/a&gt; prend des photos de très grand taille pas du tout adaptée à un navigateur web. J'ai pris pour habitude de les proposer en 640x480.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;En récupérant le contenu de ma carte mémoire, les différents fichiers sont en majuscules sans que je me l'explique. En attendant de trouver pourquoi, je mets tous ces noms de fichiers en minuscules :&lt;/p&gt;
&lt;pre class=&quot;brush: shell&quot;&gt;#!/bin/sh
for f in *;do mv $f `echo $f|sed -e 's/.*/\L&amp;amp;/'`;done
&lt;/pre&gt;
&lt;p&gt;Il y a de très nombreux outils pour retailler mes images. Etant adepte de la ligne de commande, j'utilise les outils d'&lt;a href=&quot;http://www.nikrou.net/post/2010/06/06/ImageMagick&quot; hreflang=&quot;en&quot;&gt;ImageMagick&lt;/a&gt;&amp;nbsp;et en particulier &lt;strong&gt;convert&lt;/strong&gt;. Par exemple pour fabriquer toutes les images en 640x480 du répertoire courant, j'utilise le script suivant :&lt;/p&gt;
&lt;pre class=&quot;brush: shell&quot;&gt;#!/bin/sh
QUICKLOOK=&quot;convert -resize 640x480&quot;
for i in *.jpg;do echo $i;$QUICKLOOK $i $i;done
&lt;/pre&gt;
&lt;p&gt;De façon identique, une fois les photos choisies, je fabrique les imagettes :&lt;/p&gt;
&lt;pre class=&quot;brush: shell&quot;&gt;#!/bin/sh
THUMBNAIL=&quot;convert -resize 128x96&quot;
mkdir thumbnail
for i in *.jpg;do echo $i;$THUMBNAIL $i thumbnail/TN-$i;done
&lt;/pre&gt;
&lt;p&gt;Mes images sont prêtes à être envoyées vers le serveur.&lt;/p&gt;
&lt;p&gt;Comme dirait &lt;a href=&quot;http://www.le-gall.net/pierrick/&quot; hreflang=&quot;fr&quot;&gt;Pierrick&lt;/a&gt;, il faut utiliser &lt;a href=&quot;http://fr.piwigo.org/doc/doku.php?id=pwg2:apprendre:outils:ploader&quot; hreflang=&quot;fr&quot;&gt;pLoader&lt;/a&gt; qui fait tout ça pour toi et même bien plus. J'ai pris de mauvaises habitudes au temps où pLoader n'existait pas. Cela ne sera pas facile de changer.&lt;/p&gt;</description>
    
    
    
          <comments>http://www.nikrou.net/post/2010/06/06/Pr%C3%A9paration-des-photos-pour-mise-en-ligne#comment-form</comments>
      <wfw:comment>http://www.nikrou.net/post/2010/06/06/Pr%C3%A9paration-des-photos-pour-mise-en-ligne#comment-form</wfw:comment>
      <wfw:commentRss>http://www.nikrou.net/feed/atom/comments/197</wfw:commentRss>
      </item>
    
  <item>
    <title>Mise à jour</title>
    <link>http://www.nikrou.net/post/2010/06/04/Mise-%C3%A0-jour</link>
    <guid isPermaLink="false">urn:md5:17c19f72c2588b0c985d5dfe59321d6a</guid>
    <pubDate>Fri, 04 Jun 2010 20:45:00 +0200</pubDate>
    <dc:creator>Nicolas</dc:creator>
        <category>Général</category>
        <category>dotclear</category><category>plugin</category>    
    <description>    &lt;p&gt;Je viens de passer à la &lt;a href=&quot;http://download.dotclear.net/latest-2.0.tar.gz&quot; hreflang=&quot;fr&quot;&gt;dernière version de dotclear&lt;/a&gt;. Il va vraiment falloir que je me décide à mettre à jour mes plugins. Je vais peut-être attendre la sortie de la version 2.2 (&lt;a href=&quot;http://download.dotclear.org/latest/dotclear-2.2-beta1.zip&quot; hreflang=&quot;fr&quot;&gt;en beta&lt;/a&gt; pour le moment) qui visiblement &lt;a href=&quot;http://www.morefnu.org/post/2010/06/01/Sur-le-chemin-de-la-2.2&quot; hreflang=&quot;fr&quot;&gt;va changer pas mal de choses&lt;/a&gt;, .&lt;/p&gt;</description>
    
    
    
          <comments>http://www.nikrou.net/post/2010/06/04/Mise-%C3%A0-jour#comment-form</comments>
      <wfw:comment>http://www.nikrou.net/post/2010/06/04/Mise-%C3%A0-jour#comment-form</wfw:comment>
      <wfw:commentRss>http://www.nikrou.net/feed/atom/comments/196</wfw:commentRss>
      </item>
    
  <item>
    <title>Une nouvelle version majeure de Piwigo</title>
    <link>http://www.nikrou.net/post/2010/05/19/Une-nouvelle-version-majeure-de-Piwigo</link>
    <guid isPermaLink="false">urn:md5:f3e4ef14ed2e7017a16e4ea593fee176</guid>
    <pubDate>Wed, 19 May 2010 20:39:00 +0200</pubDate>
    <dc:creator>Nicolas</dc:creator>
        <category>Développement</category>
        <category>php</category><category>piwigo</category><category>plugin</category><category>postgresql</category><category>sql</category><category>sqlite</category>    
    <description>&lt;p&gt;&lt;a href=&quot;http://fr.piwigo.org/&quot; hreflang=&quot;fr&quot;&gt;Piwigo&lt;/a&gt; est un logiciel permettant de gérer facilement sa propre galerie photos.&amp;nbsp;&lt;/p&gt;    &lt;p&gt;Une nouvelle version majeure - &lt;a href=&quot;http://fr.piwigo.org/basics/downloads&quot; hreflang=&quot;fr&quot;&gt;la 2.1&lt;/a&gt; - vient de sortir. Vous pouvez facilement mettre à jour depuis une version antérieure ou faire une installation toute &quot;neuve&quot;.&lt;/p&gt;
&lt;p&gt;Une des évolutions que je trouve intéressante est la possibilité d'utiliser une autre base de données que Mysql. Si vous utilisez Piwigo depuis longtemps et que vous venez de mettre à jour vous pouvez néanmoins changer de base de données grâce au plugin &lt;a href=&quot;http://piwigo.org/ext/extension_view.php?eid=394&quot; hreflang=&quot;fr&quot;&gt;Database Migration&lt;/a&gt;. Vous pouvez alors utiliser &lt;a href=&quot;http://sqlite.org/&quot; hreflang=&quot;en&quot;&gt;SQLite&lt;/a&gt; ou &lt;a href=&quot;http://www.nikrou.net/post/2010/05/19/PostgreSQL&quot; hreflang=&quot;en&quot;&gt;PostgreSQL&lt;/a&gt;.&lt;/p&gt;</description>
    
    
    
          <comments>http://www.nikrou.net/post/2010/05/19/Une-nouvelle-version-majeure-de-Piwigo#comment-form</comments>
      <wfw:comment>http://www.nikrou.net/post/2010/05/19/Une-nouvelle-version-majeure-de-Piwigo#comment-form</wfw:comment>
      <wfw:commentRss>http://www.nikrou.net/feed/atom/comments/195</wfw:commentRss>
      </item>
    
  <item>
    <title>Calcul d'écart-type avec sqlite</title>
    <link>http://www.nikrou.net/post/2010/01/26/Calcul-d-%C3%A9cart-type-avec-sqlite</link>
    <guid isPermaLink="false">urn:md5:157c420af33696db5a6a57e1d7e96e0d</guid>
    <pubDate>Tue, 26 Jan 2010 20:56:00 +0100</pubDate>
    <dc:creator>Nicolas</dc:creator>
        <category>Développement</category>
        <category>php</category><category>sql</category><category>sqlite</category>    
    <description>&lt;p&gt;&lt;a href=&quot;http://www.sqlite.org/&quot; hreflang=&quot;en&quot;&gt;SQLite&lt;/a&gt; est une bibliothèque qui propose un moteur de base de données. Le grand intérêt de SQLite est que toute la base tient dans un unique fichier. SQLite implémente en grande partie le standard SQL 92 mais certaines fonctions sont manquantes. Par exemple les fonctions mathématiques sont simples et il n'y a pas de fonction de calcul d'écart type.&lt;/p&gt;    &lt;p&gt;Mais pour pallier au manque de fonction, une fonctionnalité bien pratique de SQLite est qu'on peut créer ou redéfinir des fonctions. C'est ce que nous allons faire pour pouvoir calculer l'écart type dans une requête.&lt;/p&gt;


&lt;p&gt;Il y a de nombreuses formules de calcul d'écart type suivant les cas où on fait une estimation ou si on est sur un ensemble fini de valeurs. Dans le cas d'une requête SQL, on a un ensemble fini de valeurs et donc la formule suivante convient&amp;nbsp;:
&lt;img src=&quot;http://www.nikrou.net/public/ecart-type.png&quot; alt=&quot;Formule écart type&quot; /&gt;&lt;/p&gt;


&lt;p&gt;L'écart type est la racine carré de la variance. La variance est la moyenne est carrés des écarts à la moyenne. On peut scinder la somme et on obtient la moyenne de la somme des carré moins la moyenne au carré. En PHP, si on a un tableau $values qui contient les différentes valeurs, cela peut s'écrire comme ceci&amp;nbsp;:&lt;/p&gt;


&lt;pre class=&quot;brush: php&quot;&gt;&amp;lt;?php
function ecart_type($values) {
  if (count($values)&amp;lt;=1)
  {
    return 0;
  }

  $somme = 0;
  $somme_carre = 0;
  foreach ($values as $value)
  {
    $somme += $value;
    $somme_carre += pow($value, 2);
  }

  $moyenn = $somme/count($values);
  $variance = $somme_carre/count($values) - pow($moyenne, 2);
 
  return sqrt($variance);
}
?&amp;gt;&lt;/pre&gt;


&lt;p&gt;Nous allons mainteant créer la fonction d'aggrégation en utilisant la méthode &lt;a href=&quot;http://www.php.net/manual/fr/sqlite3.createaggregate.php&quot; hreflang=&quot;fr&quot;&gt;SQLite3::createAggregate&lt;/a&gt;&amp;nbsp;:&lt;/p&gt;

&lt;pre class=&quot;brush: php&quot;&gt;&amp;lt;?php
SQLite3::createAggregate('std', 'ecart_type_step', 'ecart_type_finalize');

function ecart_type_step(&amp;amp;$values, $row_number, $value)  {
  $values[] = $value;

  return $values;
}

function ecart_type_finalize(&amp;amp;$values, $row_number)  {
  if (count($values)&amp;lt;=1)
  {
    return 0;
  }

  $somme = 0;
  $somme_carre = 0;
  foreach ($values as $value)
  {
    $somme += $value;
    $somme_carre += pow($value, 2);
  }

  $moyenn = $somme/count($values);
  $variance = $somme_carre/count($values) - pow($moyenne, 2);
 
  return sqrt($variance);
}
?&amp;gt;&lt;/pre&gt;

&lt;p&gt;La fonction ecart_type_step() se contente de stocker les différentes valeurs. La fonction ecart_type_finalize() est la même que tout à l'heure aux paramètres près.&lt;/p&gt;


&lt;p&gt;On peut désormais calculer l'écart type sur un ensemble de valeur avec une requête du type&amp;nbsp;:&lt;/p&gt;

&lt;pre class=&quot;brush: sql&quot;&gt;select count(*), std(valeur) from ma_table&lt;/pre&gt;


&lt;p&gt;Le choix du nom de la fonction que l'on vient de créer (std) permet d'avoir la même requête qu'on utilise SQLite, Mysql ou PostgreSQL.&lt;/p&gt;</description>
    
    
    
      </item>
    
  <item>
    <title>git : annuler le dernier commit non propagé</title>
    <link>http://www.nikrou.net/post/2009/11/29/git-%3A-annuler-le-dernier-commit-non-propag%C3%A9</link>
    <guid isPermaLink="false">urn:md5:1c361de03f0fe5046a33f7a5e6827cc2</guid>
    <pubDate>Sun, 29 Nov 2009 13:42:00 +0100</pubDate>
    <dc:creator>Nicolas</dc:creator>
        <category>Développement</category>
        <category>git</category>    
    <description>    &lt;p&gt;Je me pose à chaque fois la question et je n'arrive jamais à me rappeler comment annuler le dernier commit avant de le propager (git push).&lt;/p&gt;


&lt;p&gt;Voici la situation, je viens de faire un commit et je m'apprête à le propager et je me rends compte à ce moment là qu'il manque des fichiers ou que certains changements manquent ou que d'autres ne font pas partie du commit. A ce moment, il n'y a rien de gênant car je suis le seul à voir ces changements. Je décide donc d'annuler le commit, en gardant tous les changements bien évidemment. La commande est finalement toute simple&amp;nbsp;:&lt;/p&gt;

&lt;pre class=&quot;brush: plain&quot;&gt;git reset HEAD^&lt;/pre&gt;


&lt;p&gt;Cela replace la copie de travail telle qu'elle était avant le commit.&lt;/p&gt;</description>
    
    
    
      </item>
    
  <item>
    <title>Installer une version particulière d'un package debian</title>
    <link>http://www.nikrou.net/post/2009/11/28/Installer-une-version-particuli%C3%A8re-d-un-package-debian</link>
    <guid isPermaLink="false">urn:md5:461c407123a0f0524dbcc4e385a1a0d0</guid>
    <pubDate>Sat, 28 Nov 2009 09:27:00 +0100</pubDate>
    <dc:creator>Nicolas</dc:creator>
        <category>Linux</category>
        <category>debian</category><category>linux</category>    
    <description>    &lt;p&gt;Je n'arrive jamais à m'en souvenir et pourtant la syntaxe est simplissime. En même temps ce n'est pas quelque chose que je fais tous les matins. La commande pour installer la version X.Y.Z du package MON_PACKAGE sous debian est&amp;nbsp;:&lt;/p&gt;


&lt;pre class=&quot;brush: plain&quot;&gt;apt-get install MON_PACKAGE=X.Y.Z&lt;/pre&gt;


&lt;p&gt;Il y a tout de même des restrictions&amp;nbsp;: il faut que le package dans la version voulue soit &quot;accessible&quot;, c'est-à-dire qu'il existe et qu'il soit dans une branche (unstable, stable, testing, experimental) déclarée dans le fichier &lt;strong&gt;/etc/apt/sources.list&lt;/strong&gt;&lt;/p&gt;</description>
    
    
    
      </item>
    
  <item>
    <title>Lancer plusieurs firefox avec plusieurs profils sous debian</title>
    <link>http://www.nikrou.net/post/2009/11/27/Lancer-plusieurs-firefox-avec-plusieurs-profils-sous-debian</link>
    <guid isPermaLink="false">urn:md5:24af05ccb289ce95e108153239121feb</guid>
    <pubDate>Fri, 27 Nov 2009 16:19:00 +0100</pubDate>
    <dc:creator>Nicolas</dc:creator>
        <category>Outils</category>
        <category>debian</category><category>firefox</category>    
    <description>    &lt;p&gt;Avant la version 3.5.5, il me semble, lorsque je tappais les commandes suivantes&amp;nbsp;:&lt;/p&gt;

&lt;pre class=&quot;brush: plain&quot;&gt;iceweasel -P profil1
iceweasel -P profil2&lt;/pre&gt;


&lt;p&gt;J'avais deux firefox (et oui iceweasel est le petit nom de firefox sous debian) avec deux profils différents. Depuis cette version, la deuxième commande provoque l'ouverture d'une nouvelle fenêtre mais avec le premier profil. Cette régression est très pénible. Heureusement, il y a une parade&amp;nbsp;: il suffit d'exécuter chaque commande en ajoutant le paramètre &lt;strong&gt;-no-remote&lt;/strong&gt;&amp;nbsp;:&lt;/p&gt;

&lt;pre class=&quot;brush: plain&quot;&gt;iceweasel -P profil1 -no-remote
iceweasel -P profil2 -no-remote&lt;/pre&gt;</description>
    
    
    
      </item>
    
  <item>
    <title>La vie en bleu</title>
    <link>http://www.nikrou.net/post/2009/10/27/La-vie-en-bleu</link>
    <guid isPermaLink="false">urn:md5:573da0546c7093fe8c70b9891d90cddb</guid>
    <pubDate>Tue, 27 Oct 2009 17:04:00 +0100</pubDate>
    <dc:creator>Nicolas</dc:creator>
        <category>Général</category>
        <category>dotclear</category><category>html</category>    
    <description>    &lt;p&gt;Juste un petit billet pour &quot;fêter&quot; la mise en place de mon nouveau thème. Il n'est pas parfait, loin de là, mais en attendant mieux...&lt;/p&gt;</description>
    
    
    
      </item>
    
  <item>
    <title>Mise à jour laborieuse de mysql 5.1</title>
    <link>http://www.nikrou.net/post/2009/10/17/Mise-%C3%A0-jour-laborieuse-de-mysql-5.1</link>
    <guid isPermaLink="false">urn:md5:4bc9d17ea58ae99a4b0193663df433f9</guid>
    <pubDate>Sat, 17 Oct 2009 20:55:00 +0200</pubDate>
    <dc:creator>Nicolas</dc:creator>
        <category>Linux</category>
        <category>debian</category><category>linux</category>    
    <description>    &lt;p&gt;Je mets régulièrement mon système (debian) à jour et depuis la fin septembre je bloque sur la mise à jour de mysql pour passer en version 5.1. Le paquet refuse de s'installer. J'ai beau regarder les logs, je ne comprends pas.&lt;/p&gt;
&lt;p&gt;Par hasard, j'ai trouvé l'explication. En fait en regardant les logs système (&lt;strong&gt;/var/log/syslog&lt;/strong&gt;) à l'installation du paquet, j'ai un message qui me propose de régler le problème en lançant le démon mysql à la main :&lt;/p&gt;
&lt;p&gt;&lt;code&gt;/usr/sbin/mysql --skip-grant-tables &amp;amp;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;Cela ne fonctionne pas et j'ai droit à un message pas clair du tout :&lt;/p&gt;
&lt;p&gt;&lt;code&gt;091017 20:47:27 [ERROR] /usr/sbin/mysqld: unknown option '--skip-bdb'&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;091017 20:47:27 [ERROR] Aborting&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&lt;br /&gt;091017 20:47:27&amp;nbsp; InnoDB: Starting shutdown...&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;En fait c'était clair mais je ne comprenais pas. Il suffit de supprimer la ligne &quot;--skip-bdb&quot; dans le fichier /etc/mysql/my.cnf.&lt;/p&gt;</description>
    
    
    
      </item>
    
</channel>
</rss>