<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss1full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:admin="http://webns.net/mvcb/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns="http://purl.org/rss/1.0/" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0">

<channel rdf:about="http://blog.vanilla-dev.net/">
  <title>Vanilla-DevBlog</title>
  <description><![CDATA[Vanilla-DevBlog]]></description>
  <link>http://blog.vanilla-dev.net/</link>
  <dc:language>fr</dc:language>
  <dc:creator />
  <dc:rights />
  <dc:date>2008-04-14T18:29:04+02:00</dc:date>
  <admin:generatorAgent rdf:resource="http://www.dotclear.net/" />
  
  <sy:updatePeriod>daily</sy:updatePeriod>
  <sy:updateFrequency>1</sy:updateFrequency>
  <sy:updateBase>2008-04-14T18:29:04+02:00</sy:updateBase>
  
  <items>
  <rdf:Seq>
    <rdf:li rdf:resource="http://blog.vanilla-dev.net/2008/04/14/7-mise-a-jour-classe-pour-l-api-xml-de-gandi" />
  <rdf:li rdf:resource="http://blog.vanilla-dev.net/2008/04/06/5-plugin-nabaztag-pour-dotclear-1" />
  <rdf:li rdf:resource="http://blog.vanilla-dev.net/2008/04/05/2-couleurs-dominantes-d-une-image-en-php" />
  <rdf:li rdf:resource="http://blog.vanilla-dev.net/2008/03/20/4-classe-pour-l-api-de-gandi" />
  <rdf:li rdf:resource="http://blog.vanilla-dev.net/2008/03/19/3-pannes-de-courant-choix-de-l-onduleur" />
  <rdf:li rdf:resource="http://blog.vanilla-dev.net/2008/03/07/1-le-blog-de-vanilla-dev-est-enfin-la" />
  </rdf:Seq>
  </items>
<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rdf+xml" href="http://feeds.feedburner.com/Vanilla-DevBlog" /><feedburner:info uri="vanilla-devblog" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /></channel>

<item rdf:about="http://blog.vanilla-dev.net/2008/04/14/7-mise-a-jour-classe-pour-l-api-xml-de-gandi">
  <title>MAJ de la classe pour l'API XML de Gandi</title>
  <link>http://feedproxy.google.com/~r/Vanilla-DevBlog/~3/6DaRYoE_g3U/7-mise-a-jour-classe-pour-l-api-xml-de-gandi</link>
  <dc:date>2008-04-14T18:29:04+02:00</dc:date>
  <dc:language>fr</dc:language>
  <dc:creator>Sylvain DELEZIR</dc:creator>
  <dc:subject>Developpement</dc:subject>
  <description>Voici une nouvelle version de ma classe.


Au menu : des bugs en moins et de nouvelles fonctions (domain_mailbox* &amp; domain_contact* principalement).


Ah et j'ai décidé de passer directement les dates au format d'utilisation de l'api, c'est-à-dire au format iso8601.
Un petit exemple pour...</description>
  <content:encoded><![CDATA[ <p>Voici une nouvelle version de ma classe.</p>


<p><strong>Au menu</strong>&nbsp;: des bugs en moins et de nouvelles fonctions (<strong>domain_mailbox*</strong> &amp; <strong>domain_contact*</strong> principalement).</p>


<p>Ah et j'ai décidé de passer directement les dates au format d'utilisation de l'api, c'est-à-dire au format iso8601.
<em>Un petit exemple pour la route&nbsp;: 20061201T13:56:42 pour le 1er décembre 2006 à 13h56 et 42 secondes.</em></p>


<p>Le format pour la fonction php date est le suivant&nbsp;:
<code>date("Ymd\TH:i:s");</code></p>


<p>Bref, rien d'extraordinaire pour cette petite classe qui peut sauver des vies.</p>


<p>La prochaine fois, j'ajouterais peut-être les fonctionnalités pour l'hébergement (Gandi Host)</p>]]></content:encoded>
<feedburner:origLink>http://blog.vanilla-dev.net/2008/04/14/7-mise-a-jour-classe-pour-l-api-xml-de-gandi</feedburner:origLink></item>
<item rdf:about="http://blog.vanilla-dev.net/2008/04/06/5-plugin-nabaztag-pour-dotclear-1">
  <title>Plugin Nabaztag pour DotClear 1</title>
  <link>http://feedproxy.google.com/~r/Vanilla-DevBlog/~3/zHK9bVzFbgQ/5-plugin-nabaztag-pour-dotclear-1</link>
  <dc:date>2008-04-06T21:00:53+02:00</dc:date>
  <dc:language>fr</dc:language>
  <dc:creator>Sylvain DELEZIR</dc:creator>
  <dc:subject>General</dc:subject>
  <description>Je viens de faire de mon petit bricolage maison un vrai plugin pour dotclear.

Ce plugin affiche un formulaire qui permet aux visiteurs d'envoyer des message à votre nabaztag.</description>
  <content:encoded><![CDATA[<p>Je viens de faire de mon petit bricolage maison un vrai plugin pour dotclear.</p>
<img src="http://blog.vanilla-dev.net/images/nabaztag_plugin-form.jpg" alt="Formulaire d'exemple final du plugin" />
<p>Ce plugin affiche un formulaire qui permet aux visiteurs d'envoyer des message à votre nabaztag.</p> <p>Ce plugin nécessite <a href="http://jquery.com/" hreflang="en">jQuery</a>. Il suffit de le télécharger et de l'ajouter dans l'entête de votre template.php</p>
<code class="html">&lt;script type="text/javascript" src="&lt;?php dcInfo('theme');?&gt;/extra/jquery-1.2.3.pack.js"&gt;&lt;/script&gt;</code>


<p>Ajoutez le code suivant dans template.php à l'endroit où vous désirez afficher le formulaire Nabaztag&nbsp;:</p>
<code class="php">&lt;?php dcNabaztag::displayNabaztag(); ?&gt;</code>
<p>N'hésitez pas à me dire ce que vous souhaitez comme modification dans les commentaires. De même si ça ne marche pas comme ça devrait, un petit commentaire et on tentera de régler ça ensemble.</p>

<img src="http://blog.vanilla-dev.net/images/nabaztag_plugin-config.jpg" alt="Configuration du plugin nabaztag" />
<p>Pour l'avenir, j'ai pensé à :</p>
<ul>
 <li>un plugin qui envoi un extrait de chaque nouveau commentaire au Nabaztag</li>
 <li>une évolution de celui-ci qui bidouille les autres fonctions de l'api du nabaztag (oreilles, loupiottes, etc...)</li>
 <li>un plugin de transformation du nabaztag en pangolin (grâce à la fonction <em>transform2Pangolin</em>)</li>
</ul>]]></content:encoded>
<feedburner:origLink>http://blog.vanilla-dev.net/2008/04/06/5-plugin-nabaztag-pour-dotclear-1</feedburner:origLink></item>
<item rdf:about="http://blog.vanilla-dev.net/2008/04/05/2-couleurs-dominantes-d-une-image-en-php">
  <title>Couleurs dominantes d'une image en php</title>
  <link>http://feedproxy.google.com/~r/Vanilla-DevBlog/~3/SknIJ3PWCsM/2-couleurs-dominantes-d-une-image-en-php</link>
  <dc:date>2008-04-05T19:11:25+02:00</dc:date>
  <dc:language>fr</dc:language>
  <dc:creator>Sylvain DELEZIR</dc:creator>
  <dc:subject>Developpement</dc:subject>
  <description>Voici la problématique : connaître la ou les couleurs dominantes. Intuitivement on se dit que ça correspond à la couleur "moyenne"... Mais qu'en est-il vraiment ?

Je vous propose de suivre avec moi mes réflexions et mes tentatives pour trouver l'algo-qui-va-bien.</description>
  <content:encoded><![CDATA[<p><strong>Voici la problématique</strong> : connaître la ou les <strong>couleurs dominantes</strong>. Intuitivement on se dit que ça correspond à la couleur "<strong>moyenne</strong>"...<br/> Mais qu'en est-il vraiment ?</p>
<img src="http://blog.vanilla-dev.net/images/pangolin.jpg" alt="Allez, faisons subir tout un tas de sévice à notre ami le pangolin !" />
<p>Je vous propose de suivre avec moi mes réflexions et mes tentatives pour <strong>trouver l'algo-qui-va-bien</strong>.</p> <h3>Première tentative&nbsp;: la couleur d'une image réduite en 1x1 pixel</h3>

<code class="php">
$filename = "mon_image.jpg";
$img = imagecreatefromjpeg($filename);
list($w, $h) = getimagesize($filename);
$img2 = imagecreatetruecolor(1, 1);
imagecopyresampled($img2, $img, 0, 0, 0, 0, 1, 1, $w, $h);
imagedestroy($img);
$color = imagecolorat($img2, 0, 0);
$result = imagecolorsforindex($img2, $color);
imagedestroy($img2);
</code>
<p>
Ici, $result nous donne donne donc la couleur (en RGB) du seul pixel de notre nouvelle image. La couleur est légèrement différente avec imagecopyresize.
</p>
<p>Cela peut nous donner une idée sur plusieurs couleurs (il suffit de redimensionner l'image en 3x3 pour avoir les 9 couleurs "moyennes") mais ici, pour une seule couleur cela nous donne très souvent une couleur grisâtre...</p>
<h3>Seconde tentative&nbsp;: la couleur moyenne de toutes les couleurs d'une image</h3>
<p>Issue des <a href="http://fr3.php.net/manual/fr/function.imagecolorat.php#70783" hreflang="en">commentaires de la fonction imagecolorat</a>.</p>
<code class="php">
$filename = "mon_image.jpg";

$img = imagecreatefromjpeg($filename);
list($w, $h) = getimagesize($filename);

$r = $g = $b = 0;
for($y = 0; $y < $h; $y++) {
    for($x = 0; $x < $w; $x++) {
        $rgb = imagecolorat($img, $x, $y);
        $r += $rgb >> 16;
        $g += $rgb >> 8 &255;
        $b += $rgb &255;
    }
}
$pxls = $w * $h;
$r = dechex(round($r / $pxls));
$g = dechex(round($g / $pxls));
$b = dechex(round($b / $pxls));
if (strlen($r) < 2) {
    $r = 0 . $r;
}
if (strlen($g) < 2) {
    $g = 0 . $g;
}
if (strlen($b) < 2) {
    $b = 0 . $b;
}
imagedestroy($img);
$result = "#" . $r . $g . $b;
</code>

<h3>Troisième tentative&nbsp;: on pixelise une image</h3>
<p>Voir la fonction pixelate de <a href="http://blog.vanilla-dev.net/http://www.hudzilla.org/phpbook/read.php/11_2_24" hreflang="en">http://www.hudzilla.org/phpbook/read.php/11_2_24</a>. 
Il faut ensuite prendre la couleur des pixels ainsi créés.
<br/>Grosso modo on se retrouve avec les mêmes problèmes que la première tentative.</p>
<img src="http://blog.vanilla-dev.net/images/pixelate.jpg" alt="Image pixelisé du pangolin croustichoquant" />
<h3>Quatrième tentative&nbsp;: on transforme une image en vraies couleurs en image à palette</h3>
<p>
On transforme en l'image en image à palette et pour chaque index de la palette, on affiche sa couleur.
</p>
<code class="php">
$filename = "mon_image.jpg";
$nbColor = 9;
$img = imagecreatefromjpeg($filename);

imagetruecolortopalette($img ,  true, $nbColor);

$cc = imagecolorstotal($img );
for($n = 0; $n < $cc; $n++) {
    $c = imagecolorsforindex($img , $n);
    $result[] = sprintf('#%02X%02X%02X', $c['red'], $c['green'], $c['blue']);
}
imagedestroy($img);
</code>
<img src="http://blog.vanilla-dev.net/images/palette_ladybird_pangolin.jpg" alt="" />
<p>En réduisant les couleurs d'une image à palette de 9 couleurs, on peut se dire que seules les 9 couleurs dominantes restent. Sauf que dans la palette il y a systématiquement du blanc. Curieux. Je n'ai pas vraiment réussi à comprendre pourquoi une couleur blanche était toujours présente.<br/>
En plus si on indique 9 couleurs pour l'image à palette, on en a généralement moins. Il faut donc en faire une fonction récursive avec pour "condition stop" le fait que le nombre de couleurs réelles dans la palette correspond au nombre voulu...
</p>
<h3>Tentative finale&nbsp;: on "arrondi" les couleurs et on compte leur présence</h3>
<p>On comptabilise le nombre de pixels présents dans l'image pour chacune des couleurs converti en websafe. Au final, on obtient un tableau représentatif des dominances par couleur.</p>
<code class="php">
function colorPalette($imgname)
{
    $im = imagecreatefromjpeg($imgname);
    $width = imagesx($im);
    $height = imagesy($im);

    $palette = array();
    for ($j = 0;$j < $height;$j++) {
        for ($i = 0;$i < $width;$i++) {
            $color = imagecolorat($im, $i, $j);
            $r = ($color >> 16) &0xFF;
            $g = ($color >> 8) &0xFF;
            $b = $color &0xFF;

            $rgbtohex = dechex($color);
            $websafe = hex2websafe($rgbtohex);

            if (array_key_exists($websafe, $palette)) {
                $palette[$websafe]++;
            } else {
                $palette[$websafe] = 1;
            }
        }
    }
    arsort($palette);
    imagedestroy($im);
    return $palette;
}


function hex2websafe($hex)
{

    // websafe color : only "00", "33", "66", "99", "CC" or "FF"
    $step= 51;
    $result = "";

    $rgb['r'] = hexdec(substr($hex, 0, 2));
    $rgb['g'] = hexdec(substr($hex, 2, 2));
    $rgb['b'] = hexdec(substr($hex, 4, 2));
    foreach($rgb as $color) {
        $websafe = $step * round($color / $step);
        $result .= str_pad(dechex($websafe), 2, '0', STR_PAD_LEFT);
    }
    return $result;
}

function limitedPalette($palette, $length)
{
    $n = 0;
    $result = array();
    foreach ($palette as $key => $values) {
        $result[$key] = $values;
        $n++;
        if ($n >= $length) break;
    }
    return $result;
}

$filename = "pangolin.jpg";
//On chope toutes les couleurs de l'image
$allColors = colorPalette("$filename");
//on prend seulement les 8 premières couleurs
$limitedColors = limitedPalette($allColors, 8);
//on affiche les 8 couleurs dominantes de l'image

echo "&lt;p&gt;&lt;img src=".$filename." /&gt;&lt;/p&gt;";
foreach ($limitedColors as $color => $infos) {
     echo "&lt;div style='background-color:#$color;width:100px;height:100px;'&gt;#$color&lt;/div&gt;";
}
</code>

<p>Tout cela nous donne :</p>
<img src="http://blog.vanilla-dev.net/images/pangolin_palette.png" alt="Exemple du palettage d'une image, couleurs dominantes" />

<h3>Conclusion</h3>
<p>
Au terme d'une lutte acharnée avec mon image de pangolin, la <strong>palette finale des 8 couleurs représente assez bien les couleurs dominantes</strong> de cette image.<br/>
Si l'on veut écarter les nuances de couleurs (ici nous avons des bleus relativement proche) il faut allez plus loin qu'un simple "<em>arrondissement</em>" des couleurs en websafe. Pour cela on peut modifier le pas (51 (ou 0x33) pour le websafe, un nombre supérieur pour un "<em>arrondissement</em>" plus prononcé). Attention aux effets de bords cependant...
</p>]]></content:encoded>
<feedburner:origLink>http://blog.vanilla-dev.net/2008/04/05/2-couleurs-dominantes-d-une-image-en-php</feedburner:origLink></item>
<item rdf:about="http://blog.vanilla-dev.net/2008/03/20/4-classe-pour-l-api-de-gandi">
  <title>Classe pour l'API de Gandi</title>
  <link>http://feedproxy.google.com/~r/Vanilla-DevBlog/~3/RwGpboyqlgE/4-classe-pour-l-api-de-gandi</link>
  <dc:date>2008-03-20T13:34:06+01:00</dc:date>
  <dc:language>fr</dc:language>
  <dc:creator>Sylvain DELEZIR</dc:creator>
  <dc:subject>Developpement</dc:subject>
  <description>

Au pays de Gandi, 
comme dans toutes les API
on s'amuse, on pleure, on rit,
ya des méchants, et des gentils !
nana na nanana nananana na...</description>
  <content:encoded><![CDATA[<p><img src="http://blog.vanilla-dev.net/images/candy1.jpg" alt="" /></p>

<pre>Au pays de Gandi, 
comme dans toutes les API
on s'amuse, on pleure, on rit,
ya des méchants, et des gentils !
nana na nanana nananana na...</pre> <p>Allez j'arrête le massacre là.
Voici donc une classe qu'elle est mignonne, elle permet de manipuler l'api de gandi via xml-rpc (ou <a href="http://phpxmlrpc.sourceforge.net/" hreflang="en">phpxmlrpc</a>).</p>


<p>Je l'ai fait rapidement donc il se peut qu'<strong>il subsiste des bugs</strong>. Toutes la doc n'est pas encore faite. Je tenterai de fournir une nouvelle version avec la doc si ça plait aux gens.
Les fonctions sont les mêmes que celles de l'api&nbsp;: <a href="http://api.ote.gandi.net/" hreflang="en">http://api.ote.gandi.net/</a>
Il vous faut un compte revendeur chez Gandi et activer l'api XML via l'interface d'administration.</p>


<p>Leur <strong>API est plutôt très bien faite</strong>. Sauf qu'on ne peut pas encore modifier les zones. Et ça c'est nul. Gandi, si tu m'entends, mets nous les zones dans ton API&nbsp;!</p>


<p>Si vous avez des idées, des suggestions, etc... Les commentaires sont grands ouverts&nbsp;!</p>


<p>Ci-dessous vous pouvez télécharger cette classe et un fichier d'exemples fait à la va-vite. La classe est sous licence <a href="http://creativecommons.org/licenses/by-sa/3.0/" hreflang="en">Creative Commons BY-SA</a>. (en <a href="http://creativecommons.org/licenses/by-sa/2.0/fr/" hreflang="fr">la licence en vf est là</a>)</p>]]></content:encoded>
<feedburner:origLink>http://blog.vanilla-dev.net/2008/03/20/4-classe-pour-l-api-de-gandi</feedburner:origLink></item>
<item rdf:about="http://blog.vanilla-dev.net/2008/03/19/3-pannes-de-courant-choix-de-l-onduleur">
  <title>Pannes de courant, choix de l'onduleur...</title>
  <link>http://feedproxy.google.com/~r/Vanilla-DevBlog/~3/BGFOH4Z2jxA/3-pannes-de-courant-choix-de-l-onduleur</link>
  <dc:date>2008-03-19T16:47:05+01:00</dc:date>
  <dc:language>fr</dc:language>
  <dc:creator>Sylvain DELEZIR</dc:creator>
  <dc:subject>General</dc:subject>
  <description>Aujourd'hui, une panne de courant de 20-30 minutes. Quand on a vraiment besoin de courant pour faire fonctionner son outil de travail c'est un peu rageant...


Bon j'en ai profité pour ranger un peu mon bureau. Et bien sûr, pendant ce laps de temps je n'ai pas pu me faire chauffer mon café......</description>
  <content:encoded><![CDATA[ <p>Aujourd'hui, une <strong>panne de courant de 20-30 minutes</strong>. Quand on a vraiment besoin de courant pour faire fonctionner son outil de travail c'est un peu rageant...</p>


<p>Bon j'en ai profité pour <strong>ranger un peu mon bureau</strong>. Et bien sûr, pendant ce laps de temps <strong>je n'ai pas pu me faire chauffer mon café</strong>... Rhââ&nbsp;!</p>


<p>Ô monde cruel&nbsp;!</p>


<p>J'ai cru voir un camion élévateur avec nacelle au bout du chemin. Certainement un coup des pokémons qui veulent m'empêcher de travailler...</p>


<p>Me voilà donc en quête de l'onduleur-parfait, qui en plus d'être pas cher, pourrait faire des zigouigoui en bonus.
La nouvelle version de wikio me donne&nbsp;:</p>
<ul>
<li><a href="http://www.wikio.fr/produit/merlingerin-8825.html)" hreflang="fr">Merlin Gerin Protection Center 675 USB</a>&nbsp;: ~100 euros</li>
<li><a href="http://www.wikio.fr/produit/merlingerin-8838.html" hreflang="fr">Merlin Gerin Pulsar Ellipse ASR 600</a>&nbsp;: ~100 euros</li>
<li><a href="http://www.wikio.fr/produit/belkin-8806.html" hreflang="fr">Belkin Universal UPS 800</a>&nbsp;: ~140 euros</li>
</ul>

<p>Bon c'est à refouiller tout ça, mais très bientôt à moi les surtensions, micro-coupures, et autres joyeusetés&nbsp;!</p>


<p>PS&nbsp;: en plus <a href="http://fr.wikipedia.org/wiki/Arthur_C._Clarke" hreflang="fr">Arthur C. Clarke</a> est mort.</p>]]></content:encoded>
<feedburner:origLink>http://blog.vanilla-dev.net/2008/03/19/3-pannes-de-courant-choix-de-l-onduleur</feedburner:origLink></item>
<item rdf:about="http://blog.vanilla-dev.net/2008/03/07/1-le-blog-de-vanilla-dev-est-enfin-la">
  <title>Le blog de vanilla-dev est enfin là !</title>
  <link>http://feedproxy.google.com/~r/Vanilla-DevBlog/~3/HkhHAMTa79A/1-le-blog-de-vanilla-dev-est-enfin-la</link>
  <dc:date>2008-03-07T16:45:01+01:00</dc:date>
  <dc:language>fr</dc:language>
  <dc:creator>Sylvain DELEZIR</dc:creator>
  <dc:subject>General</dc:subject>
  <description>Celui que vous attendiez tous est enfin en ligne... 
Le DevBlog associé au site de l'entreprise vanilla-dev.net vient de se (re)faire une petite beauté. 
Mais qu'est-ce vous retrouverez ici ?

 Je vais essayer de montrer quelques astuces de développement. Des bouts de codes, des scripts...</description>
  <content:encoded><![CDATA[ <p>Celui que vous attendiez tous est enfin en ligne... </p>
<p>Le DevBlog associé au site de l'entreprise <a href="http://vanilla-dev.net" hreflang="fr">vanilla-dev.net</a> vient de se (re)faire une petite beauté. <br/></p>
<p><strong>Mais qu'est-ce vous retrouverez ici ?</strong></p>
<ul>
 <li>Je vais essayer de montrer quelques astuces de développement. Des <strong>bouts de codes</strong>, des <strong>scripts complets</strong>, ou des <strong>situations issues de mon expérience</strong>.</li>
 <li>Pour faire original (rapport à la tendance actuelle), si j'ai des choses à dire sur la <strong>création/gestion d'entreprise</strong> je les coucherai sur ce blog</li>
 <li>Parce que quelquefois je suis intelligent (enfin je fais surtout semblant), je tenterai de vous faire part de mes <strong>réflexions sur la vie</strong>, les nuages et les pangolins</li>
 <li>Voilà, pour le reste, on verra... cela évoluera au <em>feeling</em> !</li>
</ul>
<p>
Au niveau de la régularité d'apparition des billets, je n'en ai aucune idée. Pas de pression, c'est mieux ainsi.</p>
<p>
Sur la droite, vous devriez voir une zone où vous pouvez faire parler mon lapin (un <a href="http://nabaztag.com/" hreflang="fr">nabaztag</a> tag), n'hésitez pas à le faire parler quand vous voulez !
</p>


<p>A très vite les ptites loutres !</p>]]></content:encoded>
<feedburner:origLink>http://blog.vanilla-dev.net/2008/03/07/1-le-blog-de-vanilla-dev-est-enfin-la</feedburner:origLink></item>

</rdf:RDF>
