<?xml version="1.0" encoding="utf-8"?><?xml-stylesheet title="XSL formatting" type="text/xsl" href="http://www.unelectronlibre.info/index.php/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/">
<channel>
  <title>Un Electron Libre... - Dev Web</title>
  <link>http://www.unelectronlibre.info/index.php/</link>
  <description>Bloc-notes de Nicolas Steinmetz</description>
  <language>fr</language>
  <pubDate>Tue, 01 Jul 2008 22:32:32 +0200</pubDate>
  <copyright>Creative Commons NC-BY-SA</copyright>
  <docs>http://blogs.law.harvard.edu/tech/rss</docs>
  <generator>Dotclear</generator>
  
    
  <item>
    <title>Selenium, testez fonctionnellement vos applications web (partie 2/2)</title>
    <link>http://www.unelectronlibre.info/index.php/post/2008/01/26/Selenium-testez-fonctionnellement-vos-applications-web-partie-2/2</link>
    <guid isPermaLink="false">urn:md5:4efa44ae8f127d4687a50bac605f441f</guid>
    <pubDate>Sat, 26 Jan 2008 00:53:00 +0100</pubDate>
    <dc:creator>NiCoS</dc:creator>
        <category>Dev Web</category>
        <category>qualité</category><category>selenium</category><category>test</category><category>test fonctionnel</category>    
    <description>    &lt;p&gt;Billet publié initialement sur le &lt;a href=&quot;http://www.clever-age.com/veille/blog/selenium-testez-fonctionnellement-vos-applications-web-partie-2-2-.html&quot; hreflang=&quot;fr&quot;&gt;blog de Clever Age&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;Suite de notre épopée sur Selenium, l’outil de test fonctionnel pour des applications web. Pour ceux qui auraient raté l’épisode 1 : &lt;a href=&quot;http://www.unelectronlibre.info/index.php/post/2007/11/27/Selenium-%3A-testez-fonctionnellement-vos-applications-web-partie-1/2&quot; hreflang=&quot;fr&quot;&gt;Selenium, testez fonctionnellement vos applications web (partie 1/2)&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;Ce second volet suppose que vous avez lu l’épisode 1 et sera davantage axé sur l’implémentation de &lt;a href=&quot;http://www.openqa.org/selenium-ide/&quot; hreflang=&quot;fr&quot;&gt;Selenium &lt;/a&gt; et &lt;a href=&quot;http://www.openqa.org/selenium-rc&quot; hreflang=&quot;fr&quot;&gt;Selenium RC&lt;/a&gt;.&lt;/p&gt;


&lt;h3&gt;Pré-requis&lt;/h3&gt;


&lt;p&gt;Pour Selenium IDE :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Firefox 2.x - &lt;a href=&quot;http://www.mozilla-europe.org/fr/products/firefox/&quot; hreflang=&quot;fr&quot;&gt;Téléchargement&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Selenium IDE &amp;gt;= 0.8.7 - &lt;a href=&quot;http://www.openqa.org/selenium-ide/download.action&quot; hreflang=&quot;en&quot;&gt;Téléchargement&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Pour Selenium RC :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Java Runtime Environment (JRE) &amp;gt;= 1.5.0 – &lt;a href=&quot;http://java.sun.com/&quot; hreflang=&quot;en&quot;&gt;Téléchargement&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Selenium RC &amp;gt;= 0.9.2 - &lt;a href=&quot;http://www.openqa.org/selenium-rc/download.action&quot; hreflang=&quot;en&quot;&gt;Téléchargement&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Si vous comptez utiliser des scripts en Python, Ruby, Java, PHP, .Net ou Perl, il faut que le langage désiré soit installé sur votre ordinateur afin que les tests puissent être exécutés.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;Enregistrer un test&lt;/h3&gt;


&lt;p&gt;Il suffit de procéder de la façon suivante :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Lancer Firefox&lt;/li&gt;
&lt;li&gt;Menu Outils &amp;gt; Selenium IDE&lt;/li&gt;
&lt;li&gt;Vérifier que le bouton d’enregistrement (bouton rond rouge) est bien pressé&lt;/li&gt;
&lt;li&gt;Dans votre fenêtre Firefox, rendez-vous sur la page à tester&lt;/li&gt;
&lt;li&gt;Exécuter les différentes étapes de votre scénario&lt;/li&gt;
&lt;li&gt;Une fois votre scénario fini, stopper l’enregistrement en cliquant sur le bouton rond rouge)&lt;/li&gt;
&lt;li&gt;Sauvegarder votre test (au format HTML)&lt;/li&gt;
&lt;li&gt;Lancer le pour valider son bon fonctionnement (en cliquant sur la flêche verte)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Si besoin, fignoler votre test :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Ajouter des commandes &amp;quot;pause” si Selenium va plus vite que votre application ou détecte mal la fin de chargement de la page&lt;/li&gt;
&lt;li&gt;Ajouter les commandes Selenium nécessaires si certaines parties de votre test n’ont pas pu être enregistrées par Selenium IDE (cas de certains menus/formulaire avec du javascript)&lt;/li&gt;
&lt;li&gt;...&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;Utiliser des valeurs dynamiques&lt;/h3&gt;


&lt;p&gt;Le besoin d’avoir des valeurs dynamiques se fait rapidement sentir dès lors que :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;l’unicité d’une information est mise en place : une fois le test joué, on ne peut plus le rejouer sous peine de lever une erreur. Dans ce cas, le besoin peut être par exemple de pouvoir générer des listes de noms, prénoms et adresses email.&lt;/li&gt;
&lt;li&gt;des mécanismes de cache sont en place : une fois le test joué, l’application a stocké les données demandées dans son cache. Rejouer le test est possible mais ce mécanisme de cache peut influer sur les résultats. Dans ce cas, le besoin peut être par exemple de pouvoir générer des dates aléatoires&lt;/li&gt;
&lt;li&gt;des mécanismes temporels sont en place : si je teste une application de réservation de place de concerts avec pour date le 13 juin 2007, alors le test ne sera plus valide dès le 14 juin, puisque la date de l’événement sera passée.&lt;/li&gt;
&lt;li&gt;...&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Selenium nous permet de définir des valeurs dynamiques, utilisables dans nos cas de test en créant des fonctions JavaScript.&lt;/p&gt;


&lt;p&gt;Pour ce faire, il faut créer un fichier ’user-extensions.js’ qui contiendra par exemple pour la définition d’un jour et d’un mois compris entre aujourd’hui et la fin de l’année (les fonctions peuvent être améliorées, nous ne sommes pas à l’abri d’un 31 novembre par ex) :&lt;/p&gt;

&lt;pre class=&quot;javascript&quot;&gt;&lt;span style=&quot;color: #003366; font-weight: bold;&quot;&gt;function&lt;/span&gt; RandomNumber&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;value&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;
        &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#123;&lt;/span&gt;
        &lt;span style=&quot;color: #000066; font-weight: bold;&quot;&gt;return&lt;/span&gt; Math.&lt;span style=&quot;color: #006600;&quot;&gt;floor&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;Math.&lt;span style=&quot;color: #006600;&quot;&gt;random&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;*value&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;;  
        &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#125;&lt;/span&gt;
&amp;nbsp;
&lt;span style=&quot;color: #003366; font-weight: bold;&quot;&gt;function&lt;/span&gt; RandomDay&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;
        &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#123;&lt;/span&gt;
        date = &lt;span style=&quot;color: #003366; font-weight: bold;&quot;&gt;new&lt;/span&gt; Date&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;;
        day = date.&lt;span style=&quot;color: #006600;&quot;&gt;getDate&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;;      
        &lt;span style=&quot;color: #000066; font-weight: bold;&quot;&gt;return&lt;/span&gt; RandomNumber&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #CC0000;&quot;&gt;31&lt;/span&gt;-day&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;+day;
        &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#125;&lt;/span&gt;
&amp;nbsp;
&lt;span style=&quot;color: #003366; font-weight: bold;&quot;&gt;function&lt;/span&gt; RandomMonth&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;
        &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#123;&lt;/span&gt;
        date = &lt;span style=&quot;color: #003366; font-weight: bold;&quot;&gt;new&lt;/span&gt; Date&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;;
        month = date.&lt;span style=&quot;color: #006600;&quot;&gt;getMonth&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;; &lt;span style=&quot;color: #009900; font-style: italic;&quot;&gt;//janvier = 0 -&amp;gt; décembre = 11&lt;/span&gt;
        &lt;span style=&quot;color: #000066; font-weight: bold;&quot;&gt;return&lt;/span&gt; RandomNumber&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #CC0000;&quot;&gt;11&lt;/span&gt;-month&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;+month;
        &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#125;&lt;/span&gt;&lt;/pre&gt;


&lt;p&gt;Il faut ensuite déclarer ce fichier dans Selenium IDE : Menu Option &amp;gt; Options... &amp;gt; Extensions de Selenium Core (user-extensions.js). Une fois votre fichier sélectionné, il vous faudra relancer votre instance de Selenium IDE pour qu’il soit pris en compte. Si votre fichier contient une erreur de syntaxe, Selenium IDE vous le dira.&lt;/p&gt;


&lt;p&gt;Dans votre test Selenium, remplacez alors la valeur fixe par l’appel à la fonction javascript :&lt;/p&gt;


&lt;p&gt;Ce que vous aviez initialement :&lt;/p&gt;

&lt;table border=&quot;1&quot;&gt;
&lt;tr&gt;
    &lt;td&gt;Commande&lt;/td&gt;
    &lt;td&gt;Cible&lt;/td&gt;
    &lt;td&gt;Valeur&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
    &lt;td&gt;type&lt;/td&gt;
    &lt;td&gt;jour_arrivee&lt;/td&gt;
    &lt;td&gt;22&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
    &lt;td&gt;type&lt;/td&gt;
    &lt;td&gt;mois_arrivee&lt;/td&gt;
    &lt;td&gt;12&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;



&lt;p&gt;Ce que vous obtenez au final :&lt;/p&gt;
&lt;table border=&quot;1&quot;&gt;
&lt;tr&gt;
    &lt;td&gt;Commande&lt;/td&gt;
    &lt;td&gt;Cible&lt;/td&gt;
    &lt;td&gt;Valeur&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
    &lt;td&gt;type&lt;/td&gt;
    &lt;td&gt;jour_arrivee&lt;/td&gt;
    &lt;td&gt;javascript{RandomDay()}&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
    &lt;td&gt;type&lt;/td&gt;
    &lt;td&gt;mois_arrivee&lt;/td&gt;
    &lt;td&gt;javascript{RandomMonth()}&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;



&lt;p&gt;Dans le cas d’une liste déroulante, il faudra procéder en deux étapes :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Génération de la valeur,&lt;/li&gt;
&lt;li&gt;Selection de la valeur obtenue dans la liste.&lt;/li&gt;
&lt;/ul&gt;
&lt;table border=&quot;1&quot;&gt;
&lt;tr&gt;
    &lt;td&gt;Commande&lt;/td&gt;
    &lt;td&gt;Cible&lt;/td&gt;
    &lt;td&gt;Valeur&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
    &lt;td&gt;store&lt;/td&gt;
    &lt;td&gt;mon_jour_arrivee&lt;/td&gt;
    &lt;td&gt;javascript{RandomDay()}&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
    &lt;td&gt;select&lt;/td&gt;
    &lt;td&gt;jour_arrivee&lt;/td&gt;
    &lt;td&gt;label=${mon_jour_arrivee}&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;



&lt;p&gt;Conseils :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Créer une bibliothèque commune de fonctions JavaScript que chaque testeur/développeur viendra enrichir&lt;/li&gt;
&lt;li&gt;Décomposer au maximum vos fonctions afin de pouvoir réutiliser rapidement certains morceaux pour construire d’autres fonctions.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;Construire une &lt;em&gt;Test Suite&lt;/em&gt;&lt;/h3&gt;


&lt;p&gt;Une &lt;em&gt;Test Suite&lt;/em&gt; est un fichier HTML dans lequel chaque test est référencé dans une ligne du tableau, comme vous pouvez le constater dans l’exemple suivant :&lt;/p&gt;

&lt;pre&gt;
&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;
&amp;lt;meta content=&amp;quot;text/html; charset=UTF-8&amp;quot; http-equiv=&amp;quot;content-type&amp;quot;&amp;gt;
&amp;lt;title&amp;gt;Selenium : CA Technical Meeting&amp;lt;/title&amp;gt;
&amp;lt;script language=&amp;quot;JavaScript&amp;quot; type=&amp;quot;text/javascript&amp;quot;&amp;gt;
   var DISABLED = true; // used to flag failing tests
   function filterTestsForBrowser() {
       var suiteTable = document.getElementById(&amp;quot;suiteTable&amp;quot;);
       var skippedTests = document.getElementById(&amp;quot;skippedTests&amp;quot;);
       for(rowNum = suiteTable.rows.length - 1; rowNum &amp;gt;= 0; rowNum--)
       {
           var row = suiteTable.rows[rowNum];
           var filterString = row.getAttribute(&amp;quot;unless&amp;quot;);
           if (filterString &amp;amp;&amp;amp; eval(filterString))
           {
             var cellHTML = row.cells[0].innerHTML;
             suiteTable.deleteRow(rowNum);
             var newRow = skippedTests.insertRow(1);
             var newCell = newRow.insertCell(0)
             newCell.innerHTML = cellHTML;
           }
       }
   }
   function isFileURL() {
       var p = window.location.protocol;
       var result = (&amp;quot;file:&amp;quot; == p);
       return result;
   }
&amp;lt;/script&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body onload=&amp;quot;filterTestsForBrowser()&amp;quot;&amp;gt;
&amp;lt;table id=&amp;quot;suiteTable&amp;quot; cellpadding=&amp;quot;1&amp;quot; cellspacing=&amp;quot;1&amp;quot; border=&amp;quot;1&amp;quot; class=&amp;quot;selenium&amp;quot;&amp;gt;
        &amp;lt;tbody&amp;gt;
                &amp;lt;tr&amp;gt;
                        &amp;lt;td&amp;gt;&amp;lt;b&amp;gt;Selenium : Test Suite&amp;lt;/b&amp;gt;&amp;lt;/td&amp;gt;
                &amp;lt;/tr&amp;gt;
                &amp;lt;tr&amp;gt;
                        &amp;lt;td&amp;gt;&amp;lt;a target=&amp;quot;testFrame&amp;quot; href=&amp;quot;file:///chemin/des/tests/test1.html&amp;quot;&amp;gt;Test 1&amp;lt;/a&amp;gt;&amp;lt;/td&amp;gt;
                &amp;lt;/tr&amp;gt;
                &amp;lt;tr&amp;gt;
                        &amp;lt;td&amp;gt;&amp;lt;a target=&amp;quot;testFrame&amp;quot; href=&amp;quot;file:///chemin/des/tests/test2.html&amp;quot;&amp;gt;Test 2&amp;lt;/a&amp;gt;&amp;lt;/td&amp;gt;
                &amp;lt;/tr&amp;gt;
        &amp;lt;/tbody&amp;gt;
&amp;lt;/table&amp;gt;
&amp;lt;br /&amp;gt;
&amp;lt;em&amp;gt;Not supported in this suite&amp;lt;/em&amp;gt;
&amp;lt;table id=&amp;quot;skippedTests&amp;quot; cellpadding=&amp;quot;1&amp;quot; cellspacing=&amp;quot;1&amp;quot; border=&amp;quot;1&amp;quot; class=&amp;quot;selenium&amp;quot;&amp;gt;
        &amp;lt;tbody&amp;gt;
                &amp;lt;tr&amp;gt;
                        &amp;lt;td&amp;gt;&amp;lt;b&amp;gt;Skipped Tests&amp;lt;/b&amp;gt;&amp;lt;/td&amp;gt;
                &amp;lt;/tr&amp;gt;
        &amp;lt;/tbody&amp;gt;
&amp;lt;/table&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;
&lt;/pre&gt;


&lt;p&gt;Le bloc qui nous intéresse particulièrement est :&lt;/p&gt;
&lt;pre&gt;
                &amp;lt;tr&amp;gt;
                        &amp;lt;td&amp;gt;&amp;lt;a target=&amp;quot;testFrame&amp;quot; href=&amp;quot;file:///chemin/des/tests/test1.html&amp;quot;&amp;gt;Test 1&amp;lt;/a&amp;gt;&amp;lt;/td&amp;gt;
                &amp;lt;/tr&amp;gt;
&lt;/pre&gt;


&lt;p&gt;A noter :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;La référence au test se fait sous la forme d’un lien.&lt;/li&gt;
&lt;li&gt;Le test doit avoir la référence target=&amp;quot;TestFrame&amp;quot; pour qu’il puisse être lancé.&lt;/li&gt;
&lt;li&gt;Il vous suffit d’ajouter autant de ligne dans votre tableau que vous avez de tests à intégrer dans votre &lt;em&gt;Test Suite&lt;/em&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;Executer une &lt;em&gt;Test Suite&lt;/em&gt; depuis Selenium IDE&lt;/h3&gt;


&lt;p&gt;Vous pouvez lancer une &lt;em&gt;Test Suite&lt;/em&gt; depuis Selenium IDE en utilisant Test Runner. Pour cela il vous suffit de cliquer sur l’icône suivante :&lt;/p&gt;


&lt;p&gt;&lt;img src=&quot;http://www.unelectronlibre.info/public/png_selenium_testrunner.png&quot; alt=&quot;Selenium - TestRunner&quot; style=&quot;display:block; margin:0 auto;&quot; /&gt;&lt;/p&gt;


&lt;p&gt;Dans votre navigateur, une fenêtre s’est alors ouverte et elle est composée de 4 parties :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;En haut à gauche, la zone contenant le détail de votre Test Suite&lt;/li&gt;
&lt;li&gt;En haut au milieu : le contenu de votre cas de test&lt;/li&gt;
&lt;li&gt;En haut à droite : le panneau de contrôle de Test Runner&lt;/li&gt;
&lt;li&gt;En bas : un aperçu du site dans lequel est exécuté votre test.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href=&quot;http://www.unelectronlibre.info/public/png_selenium_testrunner2.png&quot;&gt;&lt;img src=&quot;http://www.unelectronlibre.info/public/./.png_selenium_testrunner2_m.jpg&quot; alt=&quot;Selenium - TestRunner 2&quot; style=&quot;display:block; margin:0 auto;&quot; /&gt;&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;Pour que TestRunner prenne votre Test Suite en considération, il vous suffit de changer le contenu de la variable &amp;quot;test&amp;quot; dans l’url appelée. Une fois votre Test Suite chargée, il vous suffit de l’exécuter.&lt;/p&gt;


&lt;h3&gt;Exporter un test vers Selenium RC&lt;/h3&gt;


&lt;p&gt;Comme dit dans le précédent billet, un des intérêts de Selenium RC est de pouvoir exécuter des tests dans un langage de script. Ce langage permettant de réaliser des actions supplémentaires, impossibles à réaliser depuis Selenium IDE.&lt;/p&gt;


&lt;p&gt;L’export se fait très simplement :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Fichier &amp;gt; Exporter le Test sous &amp;gt; Choisissez le format qui vous intéresse.&lt;/li&gt;
&lt;li&gt;Sauver le fichier avec l’extension appropriée.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Optionel : vous aurez peut être besoin de modifier la valeur de la &amp;quot;base url&amp;quot; dans votre test. Par défaut, Selenium IDE considère que cela est &amp;quot;localhost&amp;quot;, ce qui peut ne pas correspondre à votre environnement.&lt;/p&gt;


&lt;p&gt;Ex pour un test exporté en python :&lt;/p&gt;


&lt;p&gt;Avant :&lt;/p&gt;

&lt;pre class=&quot;python&quot;&gt;&lt;span style=&quot;color: #008000;&quot;&gt;self&lt;/span&gt;.&lt;span style=&quot;color: black;&quot;&gt;selenium&lt;/span&gt; = selenium&lt;span style=&quot;color: black;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #483d8b;&quot;&gt;&amp;quot;localhost&amp;quot;&lt;/span&gt;, &lt;span style=&quot;color: #ff4500;&quot;&gt;4444&lt;/span&gt;, &lt;span style=&quot;color: #483d8b;&quot;&gt;&amp;quot;*iexplore&amp;quot;&lt;/span&gt;, &lt;span style=&quot;color: #483d8b;&quot;&gt;&amp;quot;http://localhost:4444&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;&amp;#41;&lt;/span&gt;‏&lt;/pre&gt;


&lt;p&gt;Après :&lt;/p&gt;

&lt;pre class=&quot;python&quot;&gt;&lt;span style=&quot;color: #008000;&quot;&gt;self&lt;/span&gt;.&lt;span style=&quot;color: black;&quot;&gt;selenium&lt;/span&gt; = selenium&lt;span style=&quot;color: black;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #483d8b;&quot;&gt;&amp;quot;localhost&amp;quot;&lt;/span&gt;, &lt;span style=&quot;color: #ff4500;&quot;&gt;4444&lt;/span&gt;, &lt;span style=&quot;color: #483d8b;&quot;&gt;&amp;quot;*iexplore&amp;quot;&lt;/span&gt;, &lt;span style=&quot;color: #483d8b;&quot;&gt;&amp;quot;http://test.server.tld&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;&amp;#41;&lt;/span&gt;‏&lt;/pre&gt;


&lt;h3&gt;Exécuter un test avec Selenium RC&lt;/h3&gt;


&lt;p&gt;Il vous faut d’un côté lancer le serveur Selenium RC :&lt;/p&gt;

&lt;pre&gt;
java –jar c:\path\to\selenium-rc\selenium-server.jar
&lt;/pre&gt;


&lt;p&gt;et de l’autre lancer votre fichier de test dans votre langage de script (ou de double-cliquer sur le fichier si votre système d’exploitation vous le permet) :&lt;/p&gt;

&lt;pre&gt;
C:\path\to\your\language\language.exe c:\path\to\test\test_case.ext
&lt;/pre&gt;


&lt;p&gt;Note : si votre test utilise les fonctions javascript définies dans user-extensions.js, il vous suffit d’ajouter le paramètre &amp;quot;–userExtensions c :\path\to\user-extensions.js&amp;quot; lors du lancement du serveur :&lt;/p&gt;

&lt;pre&gt;
java –jar c:\path\to\selenium-rc\selenium-server.jar -userExtensions c:\path\to\user-extensions.js
&lt;/pre&gt;


&lt;h3&gt;Exécuter une Test Suite avec Selenium RC&lt;/h3&gt;


&lt;p&gt;Pour se faire, il vous suffit le serveur en utilisant le paramètre htmlSuite et de préciser :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;le navigateur à utiliser parmi *chrome (firefox) et *iehta (Internet Explorer)&lt;/li&gt;
&lt;li&gt;l’url à tester,&lt;/li&gt;
&lt;li&gt;le chemin de votre Test Suite&lt;/li&gt;
&lt;li&gt;le chemin où stocker les résultats de la Test Suite :&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;
java –jar c:\path\to\selenium-rc\selenium-server.jar –htmlSuite *iehta http://your.server.tld c:\path\to\test\suite\YourTestSuite.html c:\path\toesults.html
&lt;/pre&gt;


&lt;p&gt;De la même façon que précédemment, si vous devez utilser vos fonctions javascript, il faut ajouter le paramètre userExtensions :&lt;/p&gt;

&lt;pre&gt;
java –jar c:\path\to\selenium-rc\selenium-server.jar –htmlSuite *iehta http://your.server.tld c:\path\to\test\suite\YourTestSuite.html c:\path\toesults.html -userExtensions c:\path\to\user-extensions.js
&lt;/pre&gt;


&lt;h3&gt;Exécuter des tests en parallèle avec Selenium RC&lt;/h3&gt;


&lt;p&gt;Il suffit de :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;lancer autant d’instances de Selenium RC que nécessaire sur différents ports (en utilisant le paramètre &amp;quot;–port&amp;quot;&lt;/li&gt;
&lt;li&gt;Adapter vos scripts pour qu’ils utilisent le port en question au lieu du port par défaut (4444)‏&lt;/li&gt;
&lt;li&gt;Exécuter les scripts.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;selectAndWait vs select&lt;/h3&gt;


&lt;p&gt;Dans le cas de formulaire avec des listes déroulantes conditionnelles, il se peut que votre test échoue si vous cherchez à selectionner la valeur par défaut d’une liste rafraichie par la liste précédente.&lt;/p&gt;


&lt;p&gt;Cela s’explique par le fait que Selenium enregistre votre selection via la commande &amp;quot;SelectAndWait&amp;quot;. Comme vous sélectionnez la valeur par défaut d’une liste, Selenium ne voit pas cet événement et attend en vain.&lt;/p&gt;


&lt;p&gt;L’astuce consiste alors à remplacer &amp;quot;selectAndWait&amp;quot; par &amp;quot;select&amp;quot;.&lt;/p&gt;


&lt;h3&gt;Ressources&lt;/h3&gt;


&lt;p&gt;Selenium IDE&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://www.openqa.org/selenium-ide/&quot; title=&quot;http://www.openqa.org/selenium-ide/&quot;&gt;http://www.openqa.org/selenium-ide/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://wiki.openqa.org/display/SIDE/Home&quot; title=&quot;http://wiki.openqa.org/display/SIDE/Home&quot;&gt;http://wiki.openqa.org/display/SIDE...&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://forums.openqa.org/forum.jspa?forumID=2&quot; title=&quot;http://forums.openqa.org/forum.jspa?forumID=2&quot;&gt;http://forums.openqa.org/forum.jspa...&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Selenium RC&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://www.openqa.org/selenium-rc/&quot; title=&quot;http://www.openqa.org/selenium-rc/&quot;&gt;http://www.openqa.org/selenium-rc/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://wiki.openqa.org/display/SRC/Home&quot; title=&quot;http://wiki.openqa.org/display/SRC/Home&quot;&gt;http://wiki.openqa.org/display/SRC/...&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://forums.openqa.org/forum.jspa?forumID=13&quot; title=&quot;http://forums.openqa.org/forum.jspa?forumID=13&quot;&gt;http://forums.openqa.org/forum.jspa...&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://openqa.org/selenium-rc/options.html&quot; title=&quot;http://openqa.org/selenium-rc/options.html&quot;&gt;http://openqa.org/selenium-rc/optio...&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Nous arrivons au terme de ce second épisode sur Selenium. Le but était d’illustrer son fonctionnement au travers de différents exemples. Toutes les fonctionnalités de l’outil n’ont pas été présentées ici (exécution d’un test pas à pas, définition de nouveaux point de démarrage d’un test, etc), l’idée étant de faire avant tout une présentation rapide de l’outil. Il ne vous reste plus qu’à jouer avec pour mieux l’appréhender.&lt;/p&gt;</description>
    
    
    
      </item>
    
  <item>
    <title>ul, li et les listes imbriquées</title>
    <link>http://www.unelectronlibre.info/index.php/post/2008/01/09/ul-li-et-les-listes-imbriquees</link>
    <guid isPermaLink="false">urn:md5:f6a9a59b190d09dd79447adbc05e978d</guid>
    <pubDate>Wed, 09 Jan 2008 21:40:00 +0100</pubDate>
    <dc:creator>NiCoS</dc:creator>
        <category>Dev Web</category>
        <category>html</category><category>liste</category>    
    <description>    &lt;p&gt;Dans la série, &amp;quot;Même pas honte&amp;quot; et &amp;quot;Je me coucherais moins bête ce soir&amp;quot;, je vous présente Nicolas et les listes imbriquées...&lt;/p&gt;


&lt;p&gt;Jusqu'à présent, pouvoir avoir une liste du type :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Liste Niveau 1
&lt;ul&gt;
&lt;li&gt;Liste Niveau 2&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;Liste Niveau 1&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;J'écrivais en HTML depuis de nombreuses années :&lt;/p&gt;

&lt;pre&gt;
&amp;lt;ul&amp;gt;
    &amp;lt;li&amp;gt;Liste Niveau 1&amp;lt;/li&amp;gt;
    &amp;lt;ul&amp;gt;
        &amp;lt;li&amp;gt;Liste Niveau 2&amp;lt;/li&amp;gt;
    &amp;lt;/ul&amp;gt;
    &amp;lt;li&amp;gt;Liste Niveau 1&amp;lt;/li&amp;gt;
&amp;lt;/ul&amp;gt;
&lt;/pre&gt;


&lt;p&gt;Cela avait le mérite de marcher mais le validateur n'aimait pas.&lt;/p&gt;


&lt;p&gt;Et là, ce soir, paf la révélation grâce à l'extension &lt;a href=&quot;http://users.skynet.be/mgueury/mozilla/&quot; hreflang=&quot;en&quot;&gt;HTML Validator&lt;/a&gt;.&lt;/p&gt;

&lt;pre&gt;
&amp;lt;ul&amp;gt;
    &amp;lt;li&amp;gt;Liste Niveau 1&amp;lt;/li&amp;gt;
    &amp;lt;li&amp;gt;
        &amp;lt;ul&amp;gt;
            &amp;lt;li&amp;gt;Liste Niveau 2&amp;lt;/li&amp;gt;
        &amp;lt;/ul&amp;gt;
    &amp;lt;/li&amp;gt;
    &amp;lt;li&amp;gt;Liste Niveau 1&amp;lt;/li&amp;gt;
&amp;lt;/ul&amp;gt;
&lt;/pre&gt;


&lt;p&gt;Quand on y pense, c'est évident (et encore plus quand on imagine un arbre / des noeuds XML) mais jusque là, cela n'avait pas fait tilt...&lt;/p&gt;


&lt;p&gt;Je vais me coucher moins bête ce soir et mon squelette valide au regard de XHTML 1.0 Strict... &lt;img src=&quot;/themes/default/smilies/wink.png&quot; alt=&quot;;-)&quot; class=&quot;smiley&quot; /&gt;&lt;/p&gt;</description>
    
    
    
      </item>
    
  <item>
    <title>Selenium : testez fonctionnellement vos applications web (partie 1/2)</title>
    <link>http://www.unelectronlibre.info/index.php/post/2007/11/27/Selenium-%3A-testez-fonctionnellement-vos-applications-web-partie-1/2</link>
    <guid isPermaLink="false">urn:md5:2bc09f49560f8565c5f1757831ea0056</guid>
    <pubDate>Tue, 27 Nov 2007 13:40:00 +0100</pubDate>
    <dc:creator>NiCoS</dc:creator>
        <category>Dev Web</category>
        <category>qualité</category><category>selenium</category><category>test</category><category>test fonctionnel</category>    
    <description>    &lt;p&gt;Billet publié originellement sur le &lt;a href=&quot;http://www.clever-age.com/veille/blog/&quot; hreflang=&quot;fr&quot;&gt;blog de Clever Age&lt;/a&gt; : &lt;a href=&quot;http://www.clever-age.com/veille/blog/selenium-testez-fonctionnellement-vos-applications-web-partie-1-2-.html&quot; hreflang=&quot;fr&quot;&gt;selenium, testez fonctionnellement vos applications web (partie 1/2)&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;Ce premier billet a pour objectif de présenter Selenium et ses fonctionnalités. Le second sera d’avantage axé sur son implémentation et utilisation.&lt;/p&gt;


&lt;h3&gt;Vous avez dit Selenium ?&lt;/h3&gt;


&lt;p&gt;&lt;a href=&quot;http://openqa.org/selenium/&quot; hreflang=&quot;en&quot;&gt;Selenium&lt;/a&gt; est une suite d’outils permettant de faire des tests fonctionnels d’une application web (et uniquement web). Ces outils sont distribués par &lt;a href=&quot;http://openqa.org&quot; hreflang=&quot;en&quot;&gt;OpenQA&lt;/a&gt;, sous la licence libre Apache 2.0.&lt;/p&gt;


&lt;p&gt;Par outil de test fonctionnel d’une application web, j’entends :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;La capacité à simuler l’action d’un internaute avec prise en charge des actions réalisées avec le clavier et la souris (click, saisie d’un champ, sélection dans une liste déroulante, etc),&lt;/li&gt;
&lt;li&gt;Les simulations sont bien sûr basées sur des cas de tests, basés eux-mêmes sur des cas d’utilisation,&lt;/li&gt;
&lt;li&gt;La capacité à enregistrer ces simulations,&lt;/li&gt;
&lt;li&gt;La capacité à exécuter ces simulations de façon automatisée de manière individuelle ou collective (on parlera alors de &lt;em&gt;Test Suite&lt;/em&gt;).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Selenium est composé de 3 éléments :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://www.openqa.org/selenium-core/&quot; hreflang=&quot;en&quot;&gt;Selenium Core&lt;/a&gt; : coeur de Selenium. Le core doit être installé sur le serveur sur lequel tourne votre application pour pouvoir les tester,&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.openqa.org/selenium-ide/&quot; hreflang=&quot;en&quot;&gt;Selenium IDE&lt;/a&gt; : extension Firefox capable d’enregistrer et d’exécuter des tests et des &lt;em&gt;Test Suites&lt;/em&gt; (via TestRunner, composant de l’IDE capable de jouer des Test Suite),&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.openqa.org/selenium-rc/&quot; hreflang=&quot;en&quot;&gt;Selenium Remote Control&lt;/a&gt; :
&lt;ul&gt;
&lt;li&gt;Serveur qui permet d’exécuter des tests sur différents navigateurs (firefox, internet explorer, opera, etc) et différents systèmes d’exploitation (MS Windows, GNU/Linux, Mac OS)&lt;/li&gt;
&lt;li&gt;Serveur qui permet d’exécuter des Test Suites sur ces différents navigateurs,&lt;/li&gt;
&lt;li&gt;Serveur qui permet d’exécuter des tests écrit dans des languages de script comme Ruby, Python, Java, .Net et Perl.&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Contrairement à Selenium Core, Selenium RC et Selenium IDE s’installent sur le poste du développeur. Selenium RC peut aussi s’installer sur un serveur dédié à l’exécution des tests si l’on souhaite les exécuter de façon automatisée.&lt;/p&gt;


&lt;p&gt;Petit aperçu d’un test enregistré dans Selenium IDE :&lt;/p&gt;


&lt;p&gt;&lt;img src=&quot;http://www.unelectronlibre.info/public/selenium.png&quot; alt=&quot;selenium.png&quot; style=&quot;display:block; margin:0 auto;&quot; /&gt;&lt;/p&gt;


&lt;p&gt;Le test consiste à :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Ouvrir la page Google.fr,&lt;/li&gt;
&lt;li&gt;Taper le mot clé &amp;quot;clever age&amp;quot;&lt;/li&gt;
&lt;li&gt;Cliquer sur &amp;quot;Rechercher’&lt;/li&gt;
&lt;li&gt;Cliquer sur le lien &amp;quot;Clever Age, conseil en architecture technique&amp;quot;&lt;/li&gt;
&lt;li&gt;Sur le site de Clever Age, vérifier la présence du texte &amp;quot;systèmes informatiques flexibles&amp;quot;).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Avant d’aller plus loin, Selenium n’est pas fait pour :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Tester des applications non-web : client lourd, service web, etc.&lt;/li&gt;
&lt;li&gt;Faire des tests de performance.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Et pour être totalement honnête, Selenium :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A quelques soucis avec les sites en Ajax ou avec beaucoup de JavaScript.
&lt;ul&gt;
&lt;li&gt;Il convient alors de vérifier la qualité du code javascript développé.&lt;/li&gt;
&lt;li&gt;et si cela ne suffit pas et pour que le test se déroule correctement, il arrive de devoir entrer des commandes équivalentes à ce qui aurait du être fait en javascript (ouverture d’une page, saisie d’une valeur, etc)&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;Ne sait pas gérer plusieurs fenêtres d’un navigateur :
&lt;ul&gt;
&lt;li&gt;Selenium sait ouvrir une pop-up,&lt;/li&gt;
&lt;li&gt;Selenium ne peut piloter deux fenêtres lancées indépendemment l’une de l’autre,&lt;/li&gt;
&lt;li&gt;En travaillant un peu le contenu du test enregistré et si la seconde fenêtre est ouverte depuis la première (cas d’une pop-up par exemple), alors il est possible de les contrôler simultanément.&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;Dois-je utiliser Selenium ?&lt;/h3&gt;


&lt;p&gt;Les utilisateurs de Selenium ont le profil suivant (liste non exhaustive) :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Analyste programmeur : pour vérifier que les développements sont conformes aux besoins exprimés&lt;/li&gt;
&lt;li&gt;Développeur et équipe d’assurance qualité : pour valider le bon fonctionnement de l’application (non-regression, etc) et le passage en production.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;Comment intégrer Selenium dans votre campagne de test ?&lt;/h3&gt;


&lt;p&gt;Sauf à vouloir perdre du temps, il convient de procéder de la façon suivante :&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Lecture des besoins &amp;amp; spécifications,&lt;/li&gt;
&lt;li&gt;Définition du périmètre de test,&lt;/li&gt;
&lt;li&gt;Rédaction des cas de tests,&lt;/li&gt;
&lt;li&gt;Enregistrement des tests dans Selenium,&lt;/li&gt;
&lt;li&gt;Exécution des tests.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;Ce test doit-il être un test Selenium ?&lt;/h3&gt;


&lt;p&gt;La réponse est oui, si :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;le test doit être joué plus d’une fois,&lt;/li&gt;
&lt;li&gt;le test peut être automatisé de bout en bout.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;A quoi sert une &lt;em&gt;Test Suite&lt;/em&gt; ?&lt;/h3&gt;


&lt;p&gt;Nous pouvons voir les &lt;em&gt;Test Suites&lt;/em&gt; de deux façons :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Un ensemble de tests individuels que nous voulons jouer à chaque nouvelle version d’un projet. Chaque test correspond à un cas d’utilisation et permet de valider le bon fonctionnement de l’application dans son ensemble.&lt;/li&gt;
&lt;li&gt;Un ensemble de composants qui seront utilisés pour construire un test.. Ces composants pourront être mutualisés entre les différents tests. Prenons un exemple : le test d’une application est souvent composé de trois étapes : connection à l’application, action à mener puis déconnexion de l’application. Je vais donc créer trois tests :
&lt;ul&gt;
&lt;li&gt;Un test &amp;quot;connexion&amp;quot; : sa portée se limite à aller sur l’écran d’authentification de l’application, saisir les identifiants et se connecter.&lt;/li&gt;
&lt;li&gt;Un test &amp;quot;action&amp;quot; : le coeur du test, il contient la fonctionnalité à tester dans notre scénario&lt;/li&gt;
&lt;li&gt;Un test &amp;quot;déconnexion&amp;quot;, consiste à cliquer sur le lien &amp;quot;Déconnexion&amp;quot; et vérifier que cela est bien le cas.&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Petite illustration : imaginons que notre application porte sur la gestion des congés.&lt;/p&gt;


&lt;p&gt;&lt;img src=&quot;http://www.unelectronlibre.info/public/selenium2.png&quot; alt=&quot;selenium2.png&quot; style=&quot;display:block; margin:0 auto;&quot; /&gt;&lt;/p&gt;


&lt;p&gt;Dans le premier cas, ma &lt;em&gt;Test Suite&lt;/em&gt; est composée de trois cas de test. Chaque test couvre l’ensemble du processus à tester.&lt;/p&gt;


&lt;p&gt;Dans le second cas, chaque composant est une portion du process complet. Le &amp;quot;Test 1&amp;quot; pourrait tout à fait être représenté par ce second cas.&lt;/p&gt;


&lt;h3&gt;Comment s’intègre Selenium dans un processus d’intégration continue ?&lt;/h3&gt;


&lt;p&gt;Il &amp;quot;suffit&amp;quot; de s’appuyer sur la capacité de Selenium à exporter les tests enregistrés dans Selenium IDE dans un des formats supportés par Selenium RC et adapté à votre outil d’intégration continue.&lt;/p&gt;


&lt;p&gt;Une fois exporté et intégré à votre outil, lors d’un commit, une tâche est lancée qui consiste à :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Lancer une instance du serveur Selenium RC&lt;/li&gt;
&lt;li&gt;Lancer votre test qui se connectera à l’instance du Selenium RC et jouera le test.&lt;/li&gt;
&lt;li&gt;Récupérer le fichier de log produit par Selenium RC&lt;/li&gt;
&lt;li&gt;Traiter le fichier de log.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Vous pourriez objecter qu’il est possible de lancer Selenium RC avec un test au format HTML. Certes mais dans la mesure où vous allez vouloir probablement réinitialiser votre application suite à votre test, vous serez contraint de passer par un langage de script.&lt;/p&gt;


&lt;p&gt;Nous arrivons au terme de ce premier billet qui avait pour objectif de planter le décor sur Selenium, ses capacités et son fonctionnement. Le prochain billet consistera à rentrer dans le vif du sujet et montrer comment Selenium IDE et Selenium RC peuvent être utilisés.&lt;/p&gt;</description>
    
    
    
      </item>
    
  <item>
    <title>Getting real : impressions générales...</title>
    <link>http://www.unelectronlibre.info/index.php/post/2007/01/30/Getting-real-%3A-impressions-generales</link>
    <guid isPermaLink="false">urn:md5:f34d2d807aff66df183d7f21e6fac408</guid>
    <pubDate>Tue, 30 Jan 2007 22:18:00 +0100</pubDate>
    <dc:creator>NiCoS</dc:creator>
        <category>Dev Web</category>
        <category>gestion de projet</category><category>getting real</category><category>livre</category>    
    <description>    &lt;p&gt;Après que le buzz soit passé et comme &lt;a href=&quot;http://biologeek.com/journal/index.php/etapes-de-developpement-d-une-application-web&quot; hreflang=&quot;fr&quot;&gt;David&lt;/a&gt; remettait ça sur le tapis, je me suis dit qu'il fallait que je me mettre à lire &lt;a href=&quot;http://gettingreal.37signals.com/&quot; hreflang=&quot;en&quot;&gt;Getting Real&lt;/a&gt;. J'avais lu le chapitre &lt;a href=&quot;http://gettingreal.37signals.com/ch11_Theres_Nothing_Functional_about_a_Functional_Spec.php&quot; hreflang=&quot;en&quot;&gt;&amp;quot;There is nothing functionnal about a functionnal spec&amp;quot;&lt;/a&gt;, qui m'avait fait sourire. Cela pouvait en effet être adapté à certains cas mais dans le cas de gros projets, de telles assertions me laissaient (et me laissent toujours sceptique).&lt;/p&gt;


&lt;p&gt;Bref, je me suis dit, autant ne pas mourir idiot, autant lire le bouquin en entier pour m'en faire une vraie idée. J'ai donc acheté la version PDF que j'ai lu entre hier matin et ce matin en allant et revenant du travail (c'est dire si les 177 pages se lisent bien &lt;img src=&quot;/themes/default/smilies/wink.png&quot; alt=&quot;;-)&quot; class=&quot;smiley&quot; /&gt; ).&lt;/p&gt;


&lt;p&gt;Arrête de causer et viens en au fait me direz-vous... ok ok, j'y arrive !&lt;/p&gt;


&lt;p&gt;Comme marqué dans le titre, ce sont des impressions générales, pour une revue détaillée, il faudra attendre un peu !&lt;/p&gt;


&lt;p&gt;Donc globalement :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;le bouquin est sympa à lire, contient de bonnes idées (pas forcément nouvelles, on retrouve des principes présents dans beaucoup de méthodes (KISS, XP, etc) ou seulement pleines de bon sens)&lt;/li&gt;
&lt;li&gt;tout ça, c'est valable chez 37signals, il est possible de reproduire une partie de leur règles de conduites mais pour toutes les reproduires, les assertions deviennent très fortes. Comme ils le disent eux même, ça marche chez nous, ça peut ne pas marcher chez vous ou pas totalement. Comme toute méthode, il faut adapter à son propre cas,&lt;/li&gt;
&lt;li&gt;J'ai vu pas mal de bonnes idées pour mes projets perso, voir même pro,&lt;/li&gt;
&lt;li&gt;Certaines erreurs pointées du doigt m'ont fait penser à certains (moments de) projets ou missions ou lorsque je vois des clients repondre des méthodologies internes avec des documents de 30 pages mini (quand il est vide) pour chaque phase du projet et un reporting de dingue. Je vois mal un chef de projet faire 80% de reporting et 20% de gestion de projet.&lt;/li&gt;
&lt;li&gt;Certaines de leurs règles sont valables pour des projets simples ou de petites tailles, voir uniquement pour des projets réalisés en interne. Par contre, je vois mal dire à un client : bon ben finalement pour le prix et le délai qu'on a, on ne développe que 50% du périmètre. Pour un engagement au forfait, c'est pas adapté par ex !&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Bref, je pense que tout développeur ou chef de projet devrait lire le livre s'il en a l'occasion. Par contre, comme tout livre de méthodologie, il faut savoir l'adapter à son cas et ne pas se lancer dans une application stricte sous peine d'échec assuré à mon humble avis.&lt;/p&gt;


&lt;p&gt;Pour ceux qui l'ont lu, qu'en avez-vous pensé ?&lt;/p&gt;


&lt;p&gt;Pour la version commentée en détail, faudra attendre un peu &lt;img src=&quot;/themes/default/smilies/wink.png&quot; alt=&quot;;-)&quot; class=&quot;smiley&quot; /&gt;&lt;/p&gt;</description>
    
    
    
      </item>
    
  <item>
    <title>Atome : pause et premiers résultats</title>
    <link>http://www.unelectronlibre.info/index.php/post/2007/01/23/Atome-%3A-pause-et-premiers-resultats</link>
    <guid isPermaLink="false">urn:md5:40cecaa2ef4bb8e23bd973f4e0433559</guid>
    <pubDate>Tue, 23 Jan 2007 13:21:00 +0100</pubDate>
    <dc:creator>NiCoS</dc:creator>
        <category>Dev Web</category>
        <category>django</category><category>framework</category><category>rails</category><category>symfony</category>    
    <description>    &lt;p&gt;Début de résultats sur ma petite pause dans la réalisation du projet Atome avec Django : J'ai cherché à jouer avec &lt;a href=&quot;http://www.symfony-project.com/&quot;&gt;Symfony&lt;/a&gt; et non, décidément, je ne m'y fais pas.&lt;/p&gt;


&lt;p&gt;J'ai reproduit le &lt;a href=&quot;http://www.symfony-project.com/tutorial/my_first_project.html&quot;&gt;tutoriel&lt;/a&gt; en l'adaptant un peu pour être plus conforme au projet Atome et bof :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Je trouve que la &lt;a href=&quot;http://www.symfony-project.com/content/documentation.html&quot;&gt;documentation de Symfony&lt;/a&gt; est moins exhaustive que &lt;a href=&quot;http://www.djangoproject.com/documentation/&quot;&gt;celle de Django&lt;/a&gt;. Suffit de voir la doc des modèles pour cela : &lt;a href=&quot;http://www.symfony-project.com/book/trunk/model&quot;&gt;Symfony model&lt;/a&gt; vs &lt;a href=&quot;http://www.djangoproject.com/documentation/model_api/&quot;&gt;Django - model api&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Pour produire un résultat équivalent ou presque, je dois écrire beaucoup plus de code coté symfony que du coté de django,&lt;/li&gt;
&lt;li&gt;J'ai toujours autant de mal avec la syntaxe de PHP avec ces &lt;code&gt;::&lt;/code&gt;, &lt;code&gt;-&amp;gt;&lt;/code&gt;, etc. La base de PHP en fait peut être un langage facile à prendre en main mais pour le moment, je trouve python plus simple &lt;img src=&quot;/themes/default/smilies/smile.png&quot; alt=&quot;:-)&quot; class=&quot;smiley&quot; /&gt;&lt;/li&gt;
&lt;li&gt;Faut faire un nombre de commande considérable avant d'avoir qqc (&lt;code&gt;symfony propel-build-model&lt;/code&gt;, &lt;code&gt;symfony propel-build-sql&lt;/code&gt;, &lt;code&gt;symfony propel-insert-sql&lt;/code&gt;, &lt;code&gt;symfony propel-generate-crud&lt;/code&gt;). A contrario, cela donne peut être à Symfony plus de souplesse et lui permet peut être de construire une interface d'admin plus souple que celle fournit nativement dans Django (mais j'avoue ne pas avoir trop creuser ce point).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Donc après un rapide test, je mets Symfony de coté et je le laisse à mes camarades de bac à sable &lt;img src=&quot;/themes/default/smilies/wink.png&quot; alt=&quot;;-)&quot; class=&quot;smiley&quot; /&gt; .&lt;/p&gt;


&lt;p&gt;Reste rails, ce qui présuppose que j'achère la dernière version du bouquin, car contrairement à Django, il n'y a pas de véritable documentation en ligne (ou à toi cher lecteur de me montrer où elle est...)&lt;/p&gt;


&lt;p&gt;Suite au prochain épisode !&lt;/p&gt;</description>
    
    
    
      </item>
    
  <item>
    <title>Atome : petite pause</title>
    <link>http://www.unelectronlibre.info/index.php/post/2007/01/19/Atome-%3A-petite-pause</link>
    <guid isPermaLink="false">urn:md5:4517b4d69f447767a06156769d02a0b4</guid>
    <pubDate>Fri, 19 Jan 2007 20:27:00 +0100</pubDate>
    <dc:creator>NiCoS</dc:creator>
        <category>Dev Web</category>
        <category>cakephp</category><category>django</category><category>framework</category><category>php</category><category>python</category><category>rails</category><category>ruby</category><category>symfony</category><category>turbogears</category>    
    <description>    &lt;p&gt;C'est encore la faute à &lt;a href=&quot;http://www.prendreuncafe.com/blog/&quot;&gt;Niko&lt;/a&gt; qui me demandait pourquoi je n'étais pas parti sur un framework PHP ou sur (Ruby on) Rails pour le projet Atome.&lt;/p&gt;


&lt;p&gt;Mes raisons sont assez simples :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;C'est en lisant &amp;quot;&lt;a href=&quot;http://www.cifen.ulg.ac.be/inforef/swi/python.htm&quot;&gt;Apprendre à programmer en python&lt;/a&gt;&amp;quot; que j'ai découvert python et compris le fonctionnement de la programmation orienté objet et les notions de classes, méthodes, etc.&lt;/li&gt;
&lt;li&gt;Python est un langage universel dans le sens où on peut aussi bien faire des scripts batch, que des applications graphiques ou du développement web (contrairement à PHP, même s'il y a un php-cli et php-gtk)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.biologeek.com&quot;&gt;David&lt;/a&gt; m'avait bien vendu python lors d'échanges par mail,&lt;/li&gt;
&lt;li&gt;le modèle objet de PHP reste obscure pour moi avec ces &lt;code&gt;-&amp;gt;&lt;/code&gt; et ces &lt;code&gt;$this&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Maintenant que j'ai un début de blog qui tourne sous &lt;a href=&quot;http://www.djangoproject.com&quot;&gt;django&lt;/a&gt; (comprendre je peux créer/modifier/supprimer des billets, les assigner à des catégories et/ou tags, lister les catégories/tags et lister les billets d'une catégorie ou d'un tag), je me demande si je ne vais pas m'occtroyer une petite pause dans mon développement (pourtant, ce matin dans le train, je me suis noté 25 tâches à faire pour terminer ce projet &lt;img src=&quot;/themes/default/smilies/wink.png&quot; alt=&quot;;-)&quot; class=&quot;smiley&quot; /&gt; ).&lt;/p&gt;


&lt;p&gt;Cette pause consisterait à recréer ce que j'ai fait pour le moment sous Django sous d'autres frameworks pour voir ce que j'en pense en vrai &lt;img src=&quot;/themes/default/smilies/smile.png&quot; alt=&quot;:-)&quot; class=&quot;smiley&quot; /&gt;&lt;/p&gt;


&lt;p&gt;La liste des prétendants pourrait être la suivante :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Framework PHP : &lt;a href=&quot;http://www.symfony-project.com/&quot;&gt;Symfony&lt;/a&gt;, mais c'est peut être sortir un tank pour pas grand chose...&lt;/li&gt;
&lt;li&gt;Framework Ruby : &lt;a href=&quot;http://www.rubyonrails.org/&quot;&gt;Rails&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Brièvement, le projet Atome a pour objectif de permettre d'avoir en un seul et unique endroit, un espace &amp;quot;blog&amp;quot; et un espace &amp;quot;tutoriel&amp;quot; avec tout ce qui va bien (commentaire threadé, tags, catégories, flux rss/atom, trackbacks, pings, coloration syntaxique, éditeur riche (pas forcément wysiwyg...), urls propres, etc).&lt;/p&gt;


&lt;p&gt;et toi cher lecteur, qu'en penses-tu de cette idée ? que ferais-tu à ma place ?&lt;/p&gt;</description>
    
    
    
      </item>
    
  <item>
    <title>Où hébergez-vous vos instances trac/subversion et vos projets python ?</title>
    <link>http://www.unelectronlibre.info/index.php/post/2006/11/21/Ou-hebergez-vous-vos-instances-trac/subversion-et-vos-projets-python</link>
    <guid isPermaLink="false">urn:md5:f35ba8a62a0aa781b30c7c69a07ed5e9</guid>
    <pubDate>Tue, 21 Nov 2006 15:58:00 +0100</pubDate>
    <dc:creator>NiCoS</dc:creator>
        <category>Dev Web</category>
        <category>apache</category><category>django</category><category>hébergement</category><category>subversion</category><category>trac</category>    
    <description>    &lt;p&gt;Le VDS que j'occupe à ce jour connaissant quelques surchages, je suis repassé sous &lt;a href=&quot;http://www.unelectronlibre.info/index.php/post/2006/11/19/Back-to-apache-13&quot;&gt;apache 1.3&lt;/a&gt;. La conséquence directe est que je ne peux plus héberger sur ce serveur mes instance trac, subversion et mon projet django à venir vu que Django requiert &lt;a href=&quot;http://www.djangoproject.com/documentation/modpython/&quot;&gt;Apache2 &amp;amp; mod_python 3.x&lt;/a&gt;.&lt;/p&gt;


&lt;p&gt;Je me suis posé un instant la question d'utiliser :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://gna.org&quot;&gt;Gna&lt;/a&gt;, &lt;a href=&quot;http://www.sourceforge.net&quot;&gt;SourceForge.net&lt;/a&gt;, &lt;a href=&quot;http://developer.berlios.de/&quot;&gt;Berlios&lt;/a&gt; et assimilés mais leur interface est &lt;del&gt;pourrie&lt;/del&gt; moche, certains en sont encore à CVS et pas de Trac&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://code.google.com&quot;&gt;Google Code&lt;/a&gt; : dépot subversion certes mais l'ergonomie de l'interface est étrange&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://tuxfamily.org/&quot;&gt;TuxFamily&lt;/a&gt; : pas de Trac et plus généralement pas d'outil de ticket &amp;amp; co.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.prosvn.org/&quot;&gt;ProSVN&lt;/a&gt; : a l'air sympa de prime abord avec notamment une &lt;a href=&quot;http://www.prosvn.org/page_products.php&quot;&gt;offre gratuite&lt;/a&gt; (voir en bas de page). Par contre, ils disposent a priori d'une vieille instance de trac (0.8.4), les forums sont vides, ce qui me laisse sceptique sur le projet.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://opensvn.csie.org/&quot;&gt;OpenSVN&lt;/a&gt; : la dernière mise à jour des infos date de décembre 2005, rien que ça me fait fuir... même s'ils ont l'air de tourner avec Trac 0.10.1&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.webfaction.com/freetrac&quot;&gt;Python-Hosting&lt;/a&gt;, offre gratuite d'un instance trac/subversion pour des projets python uniquement - a l'air pas mal du tout&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.webfaction.com/shared_hosting&quot;&gt;Webfaction&lt;/a&gt;, offre mutualisée. J'ai plutôt lu du bien sur cet hébergeur sur la liste django. Leur positionnement est assez intéressant je trouve puisqu'ils se positionnent sur des projets rails ou framework python et permettent le déploiement et l'administration d'instance trac/subversion.&lt;/li&gt;
&lt;li&gt;Une boite &lt;a href=&quot;http://www.kimsufi.com&quot;&gt;Kimsufi&lt;/a&gt; ou &lt;a href=&quot;http://www.dedibox.fr&quot;&gt;Dedibox&lt;/a&gt; - suis-je obligé de tomber si bas ?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Et toi cher lecteur, comment fais-tu ?&lt;/p&gt;</description>
    
    
    
      </item>
    
  <item>
    <title>MySQL et les jeux de caractères...</title>
    <link>http://www.unelectronlibre.info/index.php/post/2006/09/19/319-mysql-et-les-jeux-de-caracteres</link>
    <guid isPermaLink="false">urn:md5:a297df971a853cfff37103b1143481b5</guid>
    <pubDate>Tue, 19 Sep 2006 21:53:57 +0000</pubDate>
    <dc:creator>NiCoS</dc:creator>
        <category>Dev Web</category>
            
    <description>    &lt;p&gt;Depuis MySQL 4.x, il est possible de définir des jeux de caractères à différents endroits&amp;nbsp;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;au niveau de la base,&lt;/li&gt;
&lt;li&gt;au niveau de la table,&lt;/li&gt;
&lt;li&gt;au niveau du champ.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ajoutez à ceci que le client mysql peut apparemment en utiliser un autre et là vous devenez fous.&lt;/p&gt;


&lt;p&gt;C'est ce que je viens de vivre avec &lt;a href=&quot;http://chaudron.unelectronlibre.info/wiki/dc2drupal&quot;&gt;dc2drupal&lt;/a&gt; où sur mon serveur de prod, les bases sont sous MySQL 5.0 (alors que mon poste perso est encore en MySQL 4.1) et donc tout d'un coup les billets n'étaient plus convertis dès lors qu'il y avait un caractère accentué... &lt;img src=&quot;/themes/default/smilies/sad.png&quot; alt=&quot;:-(&quot; class=&quot;smiley&quot; /&gt;&lt;/p&gt;


&lt;p&gt;Screugneugneu&amp;nbsp;!&lt;/p&gt;</description>
    
    
    
      </item>
    
  <item>
    <title>2 questions sur eclipse</title>
    <link>http://www.unelectronlibre.info/index.php/post/2006/09/17/317-2-questions-sur-eclipse</link>
    <guid isPermaLink="false">urn:md5:cbfaade865590bfa956a6d9463764ae4</guid>
    <pubDate>Sun, 17 Sep 2006 23:41:00 +0000</pubDate>
    <dc:creator>NiCoS</dc:creator>
        <category>Dev Web</category>
            
    <description>    &lt;p&gt;Question 1 (1 point) : Vaut-il mieux installer son instance Eclipse (en partant des paquets Ubuntu) et installer les plugins nécessaires ou partir d'une version packagée proposée par ex par &lt;a href=&quot;http://www.easyeclipse.org&quot;&gt;EasyEclipse&lt;/a&gt; ?&lt;/p&gt;


&lt;p&gt;Question 2 (2 points) : Eclipse et les frameworks : la plupart des frameworks comme Rails, Symfony ou Django permettent de créer des fichiers via des commandes à exécuter dans une console. Comment ces fichiers apparaissent-ils ensuite dans Eclipse ? Vous faites pas un &amp;quot;import from filesystem&amp;quot; à chaque fois quand même, si ?&lt;/p&gt;</description>
    
    
    
      </item>
    
  <item>
    <title>De Python ou Ruby, il va falloir choisir...</title>
    <link>http://www.unelectronlibre.info/index.php/post/2006/08/23/299-de-python-ou-ruby-il-va-falloir-choisir</link>
    <guid isPermaLink="false">urn:md5:2c844200746cf9b4c16b4e610241f77d</guid>
    <pubDate>Wed, 23 Aug 2006 21:37:00 +0000</pubDate>
    <dc:creator>NiCoS</dc:creator>
        <category>Dev Web</category>
            
    <description>    &lt;p&gt;J'ai fini de lire en début de semaine &amp;quot;&lt;a href=&quot;http://www.cifen.ulg.ac.be/inforef/swi/python.htm&quot;&gt;Apprendre à programmer avec Python&lt;/a&gt;&amp;quot; et suis actuellement en train de lire &amp;quot;&lt;a href=&quot;http://www.editions-eyrolles.com/Livre/9782212117462/&quot;&gt;Ruby on Rails&lt;/a&gt;&amp;quot;.&lt;/p&gt;


&lt;p&gt;Sur Apprendre à programmer avec Python, j'en dis :&lt;/p&gt;


&lt;p&gt;Points positifs :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Grâce au livre, j'y vois plus clair sur les notions d'objet, classe, méthode, attribut,&lt;/li&gt;
&lt;li&gt;J'ai découvert un langage plus limpide que PHP dans sa syntaxe&lt;/li&gt;
&lt;li&gt;J'ai découvert un langage ayant une utilisation plus universelle. On peut en effet utiliser python pour des scripts systèmes, produit des applications avec des interfaces graphiques ou encore faire des applications web.&lt;/li&gt;
&lt;li&gt;L'apprentissage est des plus progressifs et accessibles&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Points &amp;quot;négatifs&amp;quot; :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Le libre insiste surtout sur les applications avec des interfaces graphiques et assez peu sur la partie système et web. Néanmoins, via les exercices proposés, on balaye tous les concepts et aspects de python (du simple script à la réalisation d'un jeu complexe)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Sur Ruby on Rails, je peux en dire pour le moment :&lt;/p&gt;


&lt;p&gt;Points positifs :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Je comprends en fait les concepts de &amp;quot;&lt;a href=&quot;http://fr.wikipedia.org/wiki/Mod%C3%A8le-Vue-Contr%C3%B4leur&quot;&gt;Modèle Vue Contrôlleur&lt;/a&gt;&amp;quot; et d'&lt;a href=&quot;http://en.wikipedia.org/wiki/Object-relational_mapping&quot; hreflang=&quot;en&quot;&gt;Object Relationnal Mapping&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Points négatifs :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Pas encore trouvé mais j'ai pas encore tout lu... &lt;img src=&quot;/themes/default/smilies/wink.png&quot; alt=&quot;;-)&quot; class=&quot;smiley&quot; /&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Je ne peux pas comparer en tant que tel les deux livres vu que le premier parle d'un langage alors que le second d'un &lt;a href=&quot;http://fr.wikipedia.org/wiki/Framework&quot;&gt;framework&lt;/a&gt; web basé sur le langage &lt;a href=&quot;http://fr.wikipedia.org/wiki/Ruby&quot;&gt;ruby&lt;/a&gt;.&lt;/p&gt;


&lt;p&gt;Pour le peu que j'ai vu de Ruby/Rails, Python et Ruby semble avoir des structures similaires.&lt;/p&gt;


&lt;p&gt;Néanmoins, il va falloir que je me décide vers quelle technologie aller car je ne me vois pas investir du temps sur ces 2 technologies.&lt;/p&gt;


&lt;p&gt;En tous cas, ces 2 lecteurs sont très intéressantes et permettent d'y voir plus clair sur pas mal de concepts utilisés dans la &amp;quot;programmation moderne&amp;quot;.&lt;/p&gt;


&lt;p&gt;Si cher lecteur tu as un avis sur les technos en présence, je te serais reconnaissant de me faire partager tes avis/commentaires/réflexions...&lt;/p&gt;


&lt;p&gt;En attendant, je continue mes lectures pour me faire une idée plus complète... &lt;img src=&quot;/themes/default/smilies/wink.png&quot; alt=&quot;;-)&quot; class=&quot;smiley&quot; /&gt;&lt;/p&gt;


&lt;p&gt;PS : &amp;lt;mode troll&amp;gt;en attendant, je trouve que ces livres et langages sont nettement plus intéressants, clairs et limpides que tout ce que j'ai pu lire/voir sur PHP...&amp;lt;/mode&amp;gt;&lt;/p&gt;</description>
    
    
    
      </item>
    
  <item>
    <title>Symfony, ça en jette...</title>
    <link>http://www.unelectronlibre.info/index.php/post/2006/03/22/237-symfony-ca-en-jette</link>
    <guid isPermaLink="false">urn:md5:07688c7e66ce1d78619d58af415204c1</guid>
    <pubDate>Wed, 22 Mar 2006 18:49:00 +0000</pubDate>
    <dc:creator>NiCoS</dc:creator>
        <category>Dev Web</category>
            
    <description>&lt;p&gt;Certes mais pourquoi donc me direz-vous&amp;nbsp;?&lt;/p&gt;    &lt;p&gt;Je viens de regarder le &quot;&lt;a href=&quot;http://www.symfony-project.com/weblog/2006/03/22/admin-generator-screencast.html&quot; hreflang=&quot;en&quot;&gt;Screencast&lt;/a&gt;&quot; (la vidéo quoi... mais ça fait moins hype (NDLR&amp;nbsp;: branché)) qui illustre la création d'une interface privée de gestion d'un blog en un temps minimaliste et d'une simplicité parfois déconcertantes.&lt;/p&gt;


&lt;p&gt;Cela me laisse définitivement rêveur car cela parait très (trop ?) simple à faire.&lt;/p&gt;


&lt;p&gt;Le site de &lt;a href=&quot;http://www.symfony-project.com/&quot; hreflang=&quot;en&quot;&gt;Symfony&lt;/a&gt; m'avait déjà agréablement surpris de part sa &lt;a href=&quot;http://www.symfony-project.com/content/documentationhome.html&quot; hreflang=&quot;en&quot;&gt;documentation&lt;/a&gt; et la clareté du &lt;a href=&quot;http://www.symfony-project.com/tutorial/my_first_project.html&quot; hreflang=&quot;en&quot;&gt;1er projet&lt;/a&gt; (qui fait office de tutoriel de prise en main de symfony) ou de leur projet plus complet, à savoir &lt;a href=&quot;http://www.symfony-project.com/askeet&quot; hreflang=&quot;en&quot;&gt;askeet&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;Bon revenons à la vidéo, j'ai globalement compris ce qu'il s'y passait, juste vers la fin où j'ai un peu décroché.&lt;/p&gt;


&lt;p&gt;Globalement tout parait clair, simple et bien structuré. Je doute pas de me confronter prochainement à un effort d'apprentissage vu que la &lt;acronym title=&quot;Programmation Orientée Objet&quot;&gt;POO&lt;/acronym&gt; c'est encore assez vague pour moi et qu'il faut apprendre le fonctionnement de symfony.&lt;/p&gt;


&lt;p&gt;En tous cas, ça va me motiver pour avancer sur mon projet et prendre le temps de faire le bô &lt;acronym title=&quot;Modèle Conceptuel de Données&quot;&gt;MCD&lt;/acronym&gt; de GUSS &lt;img src=&quot;/themes/default/smilies/wink.png&quot; alt=&quot;;)&quot; class=&quot;smiley&quot; /&gt;&lt;/p&gt;</description>
    
    
    
      </item>
    
  <item>
    <title>En finir avec les [warn] NameVirtualHost domaine.com:80 has no VirtualHosts</title>
    <link>http://www.unelectronlibre.info/index.php/post/2006/03/12/228-en-finir-avec-les-warn-namevirtualhost-domainecom-80-has-no-virtualhosts</link>
    <guid isPermaLink="false">urn:md5:5973096fa9815c9ad014a8907e5442bd</guid>
    <pubDate>Sun, 12 Mar 2006 22:14:24 +0000</pubDate>
    <dc:creator>NiCoS</dc:creator>
        <category>Dev Web</category>
            
    <description>&lt;p&gt;Marre d'avoir ceci dans vos logs apache&amp;nbsp;?&lt;/p&gt;    &lt;p&gt;Ben en fait c'est simple et même logique mais seulement une fois qu'on a lu la documentation d'apache à ce sujet...&lt;/p&gt;


&lt;p&gt;Si comme moi vous hébergez plusieurs sites sur un serveur avec une adresse IP, il faut en fait faire&amp;nbsp;:&lt;/p&gt;


&lt;pre&gt;NameVirtualHost 192.168.1.1:80
&amp;lt;VirtualHost 192.168.1.1:80&amp;gt;
 ServerName www.domaine.com
 ...
&amp;lt;/VirtualHost&amp;gt;
&amp;lt;VirtualHost 192.168.1.1:80&amp;gt;
 ServerName sous.domaine.com
 ...
&amp;lt;/VirtualHost&amp;gt;&lt;/pre&gt;

&lt;p&gt;La directive &lt;em&gt;NameVirtualHost&lt;/em&gt; n'apparaît donc qu'une seule et unique fois quelque soit le nombre de domaines que vous hébergez et ne contient que l'ip du serveur (+ le port si vous écoutez sur différents ports). Ce n'est pas ce que j'avais jusque-là. Ca marchait bien quand même mais maintenant si j'ai bien compris la doc, je vais m'éviter ainsi en plus une requête DNS vu que j'ai remplacé les noms des hotes par leur IP &lt;img src=&quot;/themes/default/smilies/wink.png&quot; alt=&quot;;-)&quot; class=&quot;smiley&quot; /&gt;&lt;/p&gt;


&lt;p&gt;J'en ai profité pour mettre mon tutoriel à jour&amp;nbsp;: &lt;a href=&quot;http://www.destination-linux.org/article30.html&quot;&gt;Serveur Web sous Debian Sarge (Apache2, PHP 4, MySQL, SSL, Virtual Hosts)&lt;/a&gt;&lt;/p&gt;</description>
    
    
    
      </item>
    
  <item>
    <title>Simplicité, efficacité, prise en main, pérennité, ...</title>
    <link>http://www.unelectronlibre.info/index.php/post/2006/01/25/206-simplicite-efficacite-prise-en-main-perennite</link>
    <guid isPermaLink="false">urn:md5:d3205e643a3a774d0e7397ef3f1cd6ed</guid>
    <pubDate>Wed, 25 Jan 2006 12:50:00 +0000</pubDate>
    <dc:creator>NiCoS</dc:creator>
        <category>Dev Web</category>
            
    <description>&lt;p&gt;Quel serait le meilleur choix en matière de développement&amp;nbsp;?&lt;/p&gt;    &lt;p&gt;Chers amis développeurs, encore des questions qui me trottent en tête, surtout après la lecture du PDF &lt;a href=&quot;http://www.phpsolmag.org/files/seagull_FR.pdf&quot; hreflang=&quot;fr&quot;&gt;Seagull, cadre d'application PHP&lt;/a&gt; sur le cadre d'application (aka framework) &lt;a href=&quot;http://seagull.phpkitchen.com/&quot;&gt;Seagull&lt;/a&gt;.&lt;/p&gt;


&lt;p&gt;Le &quot;débat&quot; se situe entre le &quot;tout faire soi-même&quot; et le &quot;reprendre du code existant&quot; selon plusieurs points de vue&amp;nbsp;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Simplicité / Prise en main,&lt;/li&gt;
&lt;li&gt;Efficacité,&lt;/li&gt;
&lt;li&gt;Perennité,&lt;/li&gt;
&lt;li&gt;Evolutivité.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Tout faire soi-même&lt;/strong&gt;&amp;nbsp;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Simplicité / Prise en main&amp;nbsp;: simple a priori et ce devrait être le plus instructif dans la mesure où je crée tout de A à Z et m'obligerait à me confronter à tous les aspects de la création des objets et leur gestion. Ce serait donc a priori, le plus &lt;em&gt;instructif&lt;/em&gt; pour moi.&lt;/li&gt;
&lt;li&gt;Efficacité&amp;nbsp;: vu que je débute, mon code ne sera surement pas optimisé mais devrait faire ce que je veux qu'il fasse&lt;/li&gt;
&lt;li&gt;Pérennité&amp;nbsp;: limitée au temps où je décide de maintenir mon développement&lt;/li&gt;
&lt;li&gt;Evolutivité&amp;nbsp;: faible à forte suivant comment je parviens à modulariser le tout&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Reprendre / s'appuyer sur des librairies / framework existants&lt;/strong&gt;&amp;nbsp;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Simplicité / Prise en main&amp;nbsp;: nécessité de se plonger dans le code d'un autre avec le risque que cela soit peu/pas documenté ou pas assez pour un débutant comme moi mais cela peut donner des bonnes pratiques en matière de développement et évite de réinventer la roue...&lt;/li&gt;
&lt;li&gt;Efficacité&amp;nbsp;: a priori, les librairies / framework sont développées/validées par des développeurs maitrisant leur domaine, la seule limite étant qu'il faille personnaliser la librairie si elle ne fait pas exactement ce qu'on souhaite...&lt;/li&gt;
&lt;li&gt;Pérennité&amp;nbsp;: bonne a priori si les librairies évoluent en assurant une compatibilité ascendante et si les librairies &quot;patchées&quot; sont aussi évolutives&lt;/li&gt;
&lt;li&gt;Evolutivité&amp;nbsp;: forte a priori&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Bref, je vois des avantages / inconvénients dans les 2 solutions.&lt;/p&gt;


&lt;p&gt;La solution serait-elle de faire un premier projet dans mon coin et pour un autre de partir sur des librairies/framework existants&amp;nbsp;?&lt;/p&gt;


&lt;p&gt;Qu'en penses-tu cher ami développeur&amp;nbsp;?&lt;/p&gt;</description>
    
    
    
      </item>
    
  <item>
    <title>De l'oeuf ou la poule...</title>
    <link>http://www.unelectronlibre.info/index.php/post/2006/01/25/205-de-l-oeuf-ou-la-poule</link>
    <guid isPermaLink="false">urn:md5:a0a1eb30981446ab58a189cce062213d</guid>
    <pubDate>Wed, 25 Jan 2006 12:24:00 +0000</pubDate>
    <dc:creator>NiCoS</dc:creator>
        <category>Dev Web</category>
            
    <description>&lt;p&gt;Par quoi commencer ?&lt;/p&gt;    &lt;p&gt;Question qui me trotte dans la tête depuis quelques jours : dans une appli, il y a toujours une notion de sécurité / accès et donc :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Mieux vaut-il créer toutes les interfaces de l'application sans se préoccuper de l'aspect sécurité/accès dans un premier temps,&lt;/li&gt;
&lt;li&gt;Mieux vaut-il créer son système de sécurité et développer ensuite les interfaces ?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Je me doute qu'idéalement il faut avoir les 2 en têtes mais je crois que c'est trop me demander dans un premier temps &lt;img src=&quot;/themes/default/smilies/wink.png&quot; alt=&quot;;-)&quot; class=&quot;smiley&quot; /&gt;&lt;/p&gt;


&lt;p&gt;Alors ami développeur, comment tu fais toi ?&lt;/p&gt;


&lt;p&gt;&lt;strong&gt;Mise à jour&lt;/strong&gt; : il est étendu que mes profils &amp;amp; workflows sont bien sur définis au préalable - c'est juste l&amp;quot;implémentation du contrôle des accès et des workflow dont il est question&lt;/p&gt;</description>
    
    
    
      </item>
    
  <item>
    <title>PHP4 &amp; PHP5 sur une même instance apache, c'est possible !</title>
    <link>http://www.unelectronlibre.info/index.php/post/2005/12/15/187-php4-php5-sur-une-meme-instance-apache-c-est-possible</link>
    <guid isPermaLink="false">urn:md5:fb4440133a0840ffc204e2cb3498aac7</guid>
    <pubDate>Thu, 15 Dec 2005 00:16:00 +0000</pubDate>
    <dc:creator>NiCoS</dc:creator>
        <category>Dev Web</category>
            
    <description>&lt;p&gt;et je l'ai fait ! &lt;img src=&quot;/themes/default/smilies/smile.png&quot; alt=&quot;:-)&quot; class=&quot;smiley&quot; /&gt;&lt;/p&gt;    &lt;p&gt;Après avoir vu :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;2 instances apache avec chacun sa version de PHP : ce qui fait qu'il fallait tester sa page en php4 sur &lt;a href=&quot;http://localhost/mapage.php&quot; title=&quot;http://localhost/mapage.php&quot;&gt;http://localhost/mapage.php&lt;/a&gt; et en php5 sur &lt;a href=&quot;http://localhost:81/mapage.php&quot; title=&quot;http://localhost:81/mapage.php&quot;&gt;http://localhost:81/mapage.php&lt;/a&gt;,&lt;/li&gt;
&lt;li&gt;1 instance apache mais avec des fichiers .php pour tout ce qui doit être traité par PHP4 et des fichiers en .php5 pour les fichiers PHP5,&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;J'ai trouvé une solution et mixé différents trucs vus à droite et à gauche pour obtenir ceci :&lt;/p&gt;


&lt;p&gt;&lt;a href=&quot;http://www.destination-linux.org/article66.html&quot;&gt;Installer PHP4 et PHP5 sur une même instance d’Apache&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;Je suis ravi &lt;img src=&quot;/themes/default/smilies/smile.png&quot; alt=&quot;:-)&quot; class=&quot;smiley&quot; /&gt;&lt;/p&gt;</description>
    
    
    
      </item>
    
  <item>
    <title>Mes extensions Dotclear</title>
    <link>http://www.unelectronlibre.info/index.php/post/2005/12/13/183-mes-extensions-dotclear</link>
    <guid isPermaLink="false">urn:md5:dc7973c8aca9ab390f16413d001d0542</guid>
    <pubDate>Tue, 13 Dec 2005 15:08:11 +0000</pubDate>
    <dc:creator>NiCoS</dc:creator>
        <category>Dev Web</category>
            
    <description>&lt;p&gt;Petite liste...&lt;/p&gt;    &lt;p&gt;Sont installés&amp;nbsp;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://zeubeubeu.net/blog/plugins-dotclear#spamplemousse&quot;&gt;Spamplemousse&lt;/a&gt;&amp;nbsp;: pour contrer les spams dans les commentaires &amp;amp; trackbacks&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.prendreuncafe.com/blog/2005/05/01/89-plugin-last-blogmarks-pour-dotclear&quot;&gt;Last Blogmarks&lt;/a&gt;&amp;nbsp;: pour afficher ses derniers blogmarks&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.forx.fr/blog/2005/09/06/13&quot;&gt;Gestionnaire d'accronymes&lt;/a&gt;, pour que &lt;acronym title=&quot;PHP: Hypertext Preprocessor&quot;&gt;PHP&lt;/acronym&gt;, &lt;acronym title=&quot;Cascading Style Sheets&quot;&gt;CSS&lt;/acronym&gt;, etc ne soient plus des concepts inintelligibles&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.abysses.net/blog/2005/09/22/90-le-retour-des-gravatars-faq-et-nouvelle-version-12&quot;&gt;Gravatars&lt;/a&gt;, pour rendre les commentaires un peu plus funs &lt;img src=&quot;/themes/default/smilies/wink.png&quot; alt=&quot;;-)&quot; class=&quot;smiley&quot; /&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Certains étant fraichement installés, il va falloir que je les paramètre &lt;img src=&quot;/themes/default/smilies/wink.png&quot; alt=&quot;;-)&quot; class=&quot;smiley&quot; /&gt;&lt;/p&gt;</description>
    
    
    
      </item>
    
  <item>
    <title>Mais pourquoi tant d'avant gardisme ?</title>
    <link>http://www.unelectronlibre.info/index.php/post/2005/12/06/177-mais-pourquoi-tant-d-avant-gardisme</link>
    <guid isPermaLink="false">urn:md5:434f52f71b11a7fdb5bb910f90888917</guid>
    <pubDate>Tue, 06 Dec 2005 23:18:16 +0000</pubDate>
    <dc:creator>NiCoS</dc:creator>
        <category>Dev Web</category>
            
    <description>&lt;p&gt;C'est la question que je me pose en voyant le contenu de XAMP/WAMP - heureusement EasyPHP veille &lt;img src=&quot;/themes/default/smilies/smile.png&quot; alt=&quot;:-)&quot; class=&quot;smiley&quot; /&gt;&lt;/p&gt;    &lt;p&gt;&lt;a href=&quot;http://www.apachefriends.org/en/xampp-windows.html&quot;&gt;XAMP&lt;/a&gt; et &lt;a href=&quot;http://www.wampserver.com/&quot;&gt;WAMP&lt;/a&gt; sont des solutions packagées permettant de mettre en place rapidement un petit serveur web sur son PC. Jusque là, je trouvais ça assez pratique.&lt;/p&gt;


&lt;p&gt;Sauf que, je ne sais pas ce qui leur prennent, mais ils ont une tendance avant-gardiste (comprendre qu'ils ont les dernières versions à jour) qui me laisse sceptique dans la mesure où je ne connais aucun projet développé sous PHP 5.x / MySQL 5.x or les dernières versions.&lt;/p&gt;


&lt;p&gt;Même pour des webmasters du dimanche, s'ils veulent reproduire un tant soit peu la configuration de leur hébergeur, il ne leur reste plus qu'&lt;a href=&quot;http://www.easyphp.org/&quot;&gt;EasyPHP&lt;/a&gt;, très bien au demeurant comme solution, ou alors revenir sur la version &lt;a href=&quot;https://sourceforge.net/project/showfiles.php?group_id=116092&amp;amp;package_id=126042&amp;amp;release_id=317301&quot;&gt;1.4.4&lt;/a&gt; de Wamp5.&lt;/p&gt;


&lt;p&gt;Cette course à la mise à jour, hormis l'exploit technique (si on peut parler d'exploit), n'a donc pour moi que peu d'intérêt même si je reconnais qu'il ne faut pas non plus se scléroser sur de vieilles versions. Toutefois, je pense que PHP 4.3.x et MySQL 4.x sont plutôt le référentiel du moment...&lt;/p&gt;</description>
    
    
    
      </item>
    
  <item>
    <title>Associer Flickr &amp; Dotclear</title>
    <link>http://www.unelectronlibre.info/index.php/post/2005/09/05/105-associer-flickr-dotclear</link>
    <guid isPermaLink="false">urn:md5:4a072e44d6ceb98bba7bfd3b9ecc1075</guid>
    <pubDate>Mon, 05 Sep 2005 11:29:22 +0000</pubDate>
    <dc:creator>NiCoS</dc:creator>
        <category>Dev Web</category>
            
    <description>&lt;p&gt;C'est possible&lt;/p&gt;    &lt;p&gt;Depuis Flickr, définissez votre blog de la façon suivante&amp;nbsp;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Type&amp;nbsp;: MetaWeblogAPI Enabled Blog&lt;/li&gt;
&lt;li&gt;API Endpoint&amp;nbsp;: http://www.monblog.com/dotclear/ecrire/xmlrpc.php&lt;/li&gt;
&lt;li&gt;Username &amp;amp; password&amp;nbsp;: à votre avis&amp;nbsp;?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Et c'est fini&amp;nbsp;; Flickr récupère le nom de votre blog et son url.&lt;/p&gt;


&lt;p&gt;Vous pouvez procéder à un test pour voir si le billet se retrouve bien dans votre blog.&lt;/p&gt;


&lt;p&gt;Maintenant, j'ai plus qu'à en trouver l'utilité... :-P&lt;/p&gt;


&lt;p&gt;&lt;strong&gt;Mise à jour&lt;/strong&gt;&amp;nbsp;: j'ai trouvé l'&lt;a href=&quot;http://www.flickr.com/help/blogging/#55&quot;&gt;utilité&lt;/a&gt; maintenant, vais-je m'approprier cette fonctionnalité&amp;nbsp;? Mystère&amp;nbsp;!&lt;/p&gt;</description>
    
    
    
      </item>
    
  <item>
    <title>Mettez votre serveur web sur clé usb !</title>
    <link>http://www.unelectronlibre.info/index.php/post/2005/03/15/11-mettez-votre-serveur-web-sur-cle-usb</link>
    <guid isPermaLink="false">urn:md5:a6bf2ea5c48498f21847501c3c9a2d22</guid>
    <pubDate>Tue, 15 Mar 2005 20:30:52 +0000</pubDate>
    <dc:creator>NiCoS</dc:creator>
        <category>Dev Web</category>
            
    <description>&lt;p&gt;Après les logiciels tout en un qui permettaient de mettre en place un serveur Apache / PHP / MySQL de développement en trois clicks sous Windows, voici leur version mobile&amp;nbsp;!&lt;/p&gt;    &lt;p&gt;Nous connaissions les paquets tout en un permettant d'installer rapidement un serveur Apache / PHP / MySQL sous windows&amp;nbsp;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://www.easyphp.org&quot; hreflang=&quot;fr&quot;&gt;EasyPHP&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.wampserver.com&quot; hreflang=&quot;fr&quot;&gt;Wamp&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.apachefriends.org/en/xampp-windows.html&quot; hreflang=&quot;en&quot;&gt;Xampp&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Voilà que les versions mobiles, comprenez que tout est installable sur une clé USB, débarquent&amp;nbsp;!&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://www.easyphp.org&quot; hreflang=&quot;fr&quot;&gt;EasyPHP&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.movamp.net/&quot; hreflang=&quot;fr&quot;&gt;Mov'AMP&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.uni-d.net/index.php?type=project&amp;amp;id=3&quot; hreflang=&quot;fr&quot;&gt;Wamp Mobile Storage&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Idéal pour les développeurs itinérants ou pour faire des démos chez des clients &lt;img src=&quot;/themes/default/smilies/smile.png&quot; alt=&quot;:-)&quot; class=&quot;smiley&quot; /&gt;&lt;/p&gt;</description>
    
    
    
      </item>
    
  <item>
    <title>Installer des modules PEAR sous Windows (avec XAMPP)</title>
    <link>http://www.unelectronlibre.info/index.php/post/2005/03/15/10-installer-des-modules-pear-sous-windows-avec-xampp</link>
    <guid isPermaLink="false">urn:md5:9b881283dd086cfa54ac1fbad19c27b8</guid>
    <pubDate>Tue, 15 Mar 2005 15:47:00 +0000</pubDate>
    <dc:creator>NiCoS</dc:creator>
        <category>Dev Web</category>
            
    <description>&lt;p&gt;Voulant faire une démo de &lt;a href=&quot;http://agora.gouv.fr&quot; hreflang=&quot;fr&quot;&gt;Spip-Agora&lt;/a&gt;, je me suis heurté à l'erreur suivante :&lt;/p&gt;

&lt;pre&gt;SPIP-AGORA nécessite le package PEAR DB_Nestedset en version 1.3.6 minimum 
http://pear.php.net/package/DB_NestedSet&lt;/pre&gt;


&lt;p&gt;Voilà comment faut faire pour s'en sortir...&lt;/p&gt;    &lt;p&gt;Rappel des outils en présence :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Windows XP&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.apachefriends.org/en/xampp-windows.html&quot; hreflang=&quot;en&quot;&gt;XAMPP&lt;/a&gt; en version 1.4.12, switché en php4&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ouvez une console MS DOS (Démarrer - Exécuter - cmd.com)&lt;/p&gt;


&lt;p&gt;Là, tapez :&lt;/p&gt;


&lt;pre&gt;c:
cd apachefriends\xampp\php\
pear list (liste les modules pear installés)
pear upgrade-all (facultatif, seulement histoire d'être à jour)
pear config-set preferred_state beta (car DB_NestedSet 1.3.6 est une version beta)
pear upgrade DB_NestedSet
pear list (vérifiez la version de DB_NestedSet qui doit être la 1.3.6)&lt;/pre&gt;


&lt;p&gt;Relancez Apache et relancez l'installation d'agora, cela doit fonctionner.&lt;/p&gt;


&lt;p&gt;&lt;strong&gt;Edit :&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Par contre, cela génère potentiellement un autre &lt;a href=&quot;http://lists.adullact.net/pipermail/agora-devel/2005-March/001248.html&quot; hreflang=&quot;fr&quot;&gt;bug&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description>
    
    
    
      </item>
    
</channel>
</rss>