<?xml version="1.0" encoding="utf-8"?><?xml-stylesheet title="XSL formatting" type="text/xsl" href="http://blog.mymind.fr/feed/rss2/xslt" ?><rss version="2.0"
  xmlns:dc="http://purl.org/dc/elements/1.1/"
  xmlns:wfw="http://wellformedweb.org/CommentAPI/"
  xmlns:content="http://purl.org/rss/1.0/modules/content/"
  xmlns:atom="http://www.w3.org/2005/Atom">
<channel>
  <title>Mind... - Polytechnique.org</title>
  <link>http://blog.mymind.fr/</link>
  <atom:link href="http://blog.mymind.fr/feed/category/Polytechniqueorg/rss2" rel="self" type="application/rss+xml"/>
  <description></description>
  <language>fr</language>
  <pubDate>Thu, 01 Dec 2011 21:43:54 +0100</pubDate>
  <copyright>© 2007-2008 Florent Bruneau</copyright>
  <docs>http://blogs.law.harvard.edu/tech/rss</docs>
  <generator>Dotclear</generator>
  
    
  <item>
    <title>Polytechnique.org lance son blog</title>
    <link>http://blog.mymind.fr/post/2008/06/03/Polytechniqueorg-lance-son-blog</link>
    <guid isPermaLink="false">urn:md5:5dc1b67cdab0c38509fe06fac4fd19e4</guid>
    <pubDate>Tue, 03 Jun 2008 23:33:00 +0200</pubDate>
    <dc:creator>Florent Bruneau</dc:creator>
        <category>Polytechnique.org</category>
            
    <description>    &lt;p&gt;Voilà... cela fait assez longtemps que nous recevons des demandes d'utilisateurs pour la mise en place de blog via Polytechnique.org. Afin de préparer la mise en place de ce service, Polytechnique.org lance son blog. Cela permettra à la fois&amp;nbsp;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;de tester l'outil d'intégration de l'authentification de Polytechnique.org dans Dotclear.&lt;/li&gt;
&lt;li&gt;d'offrir une nouvelle plateforme souple et conviviale pour informer nos utilisateurs.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Je ne vais pas m'étendre davantage vu que ce ne serait que recopier &lt;a href=&quot;http://blog.polytechnique.org/post/2008/06/01/Creation-du-blog-de-lequipe-Polytechniqueorg&quot;&gt;le post d'Aymeric&lt;/a&gt;&lt;/p&gt;</description>
    
    
    
          <comments>http://blog.mymind.fr/post/2008/06/03/Polytechniqueorg-lance-son-blog#comment-form</comments>
      <wfw:comment>http://blog.mymind.fr/post/2008/06/03/Polytechniqueorg-lance-son-blog#comment-form</wfw:comment>
      <wfw:commentRss>http://blog.mymind.fr/feed/atom/comments/40</wfw:commentRss>
      </item>
    
  <item>
    <title>Afficher des discussions</title>
    <link>http://blog.mymind.fr/post/2007/11/01/Afficher-des-discussions</link>
    <guid isPermaLink="false">urn:md5:1bc6a0f2c9ce16187b5ff9f62df8c2a4</guid>
    <pubDate>Thu, 01 Nov 2007 17:24:00 +0100</pubDate>
    <dc:creator>Florent Bruneau</dc:creator>
        <category>Polytechnique.org</category>
        <category>Banana</category><category>Devel</category><category>PHP</category>    
    <description>&lt;p&gt;Lorsqu'un logiciel a pour vocation d'afficher des discussions, on attend de sa part qu'il nous permette de voir simplement qui répond à qui, dans quel contexte... Ce n'est pas toujours ce qui est le mieux fait. Par exemple, les programmes de fora en ligne à la mode (phpBB par exemple) affiche les discussion comme une succession de rectangles juxtaposés et seul le contenu du message permet de voir qu'il en cite un autre. D'autres logiciels comme Mail.app ont ce défaut et parfois la fâcheuse manie de ne pas vouloir corriger ce problème.&lt;/p&gt;


&lt;p&gt;L'affichage de l'arborescence dans &lt;a href=&quot;http://opensource.polytechnique.org/banana&quot;&gt;Banana&lt;/a&gt; est une des fonctionnalités clés... et elle va beaucoup changer dans la prochaine version.&lt;/p&gt;    &lt;h2&gt;Une ligne par entrée&lt;/h2&gt;


&lt;p&gt;La solution habituelle pour afficher l'arborescence est d'utiliser un message par ligne de telle, des + ou - pour ouvrir ou fermer les noeuds. C'est la solution actuelle de banana.&lt;/p&gt;


&lt;p&gt;&lt;img src=&quot;http://blog.mymind.fr/public/screenshots/old-thread.png&quot; alt=&quot;Banana Thread up to 1.7&quot; /&gt;&lt;/p&gt;


&lt;p&gt;Avec cette solution, on perd très rapidement en lisibilité&amp;nbsp;: dès que la discussion dépasse une vingtaine de messages, l'arborescence devient très haute et plus ça va, plus le titre dérive vers la droite rendant parfois le lien inaccessible. Lorsqu'il y a un troll, il est de fait très courant que certains nouveaux messages se trouvent perdus plusieurs pages en arrière dans l'arborescence, ou que sur certains navigateurs, il soit difficile d'y accéder. De plus l'interface se trouve souvent surchargée, à la limite de la lisibilité&amp;nbsp;: c'est dur de faire tenir un maximum d'informations en un minimum de place en gardant la lisibilité de l'ensemble.&lt;/p&gt;



&lt;h2&gt;Une solution plus visuelle&lt;/h2&gt;


&lt;p&gt;Je ne sais pas combien de personnes connaissent &lt;a href=&quot;http://home.snafu.de/stk/macsoup/&quot;&gt;MacSoup&lt;/a&gt;. Il s'agit d'un petit client NNTP pour MacOS, qui en soit n'a pas beaucoup d'intérêt (il est payant et est relativement limité). Le principal atout de MacSoup est son interface de visualisation des threads (les utilisateurs diront qu'il y a bien plus que l'interface graphique, mais également l'interface clavier etc...). On trouve sur internet quelques captures d'écran en cherchant dans les &lt;a href=&quot;http://www.exalead.com/image/results?q=macsoup%20screenshot&quot;&gt;moteurs de recherche d'image&lt;/a&gt;&amp;nbsp;:&lt;/p&gt;


&lt;p&gt;&lt;img src=&quot;http://www.fen-net.de/~xx511/bilder/macsoup/Thread.gif&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;


&lt;p&gt;Cette interface est compacte, visuelle et permet d'accéder rapidement à n'importe quel message du thread. Pour la prochaine version de Banana, je me suis fortement inspiré de cette interface pour réécrire de 0 l'affichage de l'arborescence. Ceci donne&amp;nbsp;:&lt;/p&gt;


&lt;p&gt;&lt;img src=&quot;http://blog.mymind.fr/public/screenshots/new-thread.png&quot; alt=&quot;Thread view in Banana&quot; /&gt;&lt;/p&gt;


&lt;p&gt;Il s'agit de la même discussion que précédemment. On voit donc ici facilement l'arborescence. Lorsqu'un message est non lu, la branche à laquelle il est attaché est noire au lieu de grise ce qui permet de l'identifier du premier coup d'oeil. Les couleurs de fond des noeuds (une idée de &lt;a href=&quot;http://www.falco.bz&quot;&gt;Falco&lt;/a&gt;) sont obtenue à partir d'un hash quelconque sur l'émetteur et permettent donc d'identifier les messages envoyés par la même personne. Lorsqu'on laisse la souris sur un noeud, le nom de l'expéditeur et l'heure du post s'affichent (malheureusement le pointeur de la souris n'apparaît pas sur la capture d'écran)... et bien sûr quand on clique sur un noeud, on va sur le message correspondant.&lt;/p&gt;


&lt;p&gt;Lorsqu'on est sur un message, on garde également la vue du thread ce qui permet de toujours savoir où on est dans la discussion&amp;nbsp;:&lt;/p&gt;


&lt;p&gt;&lt;img src=&quot;http://blog.mymind.fr/public/screenshots/new-thread-nav.png&quot; alt=&quot;Thread view with selected message&quot; /&gt;&lt;/p&gt;


&lt;p&gt;Il y a encore un peu de travail à faire pour améliorer les performances de la génération des arbres et pour augmenter sa compacité (éviter les branches qui descendent très bas alors qu'elles auraient pu trouver leur place dans le l'espace vide disponible).&lt;/p&gt;</description>
    
    
    
          <comments>http://blog.mymind.fr/post/2007/11/01/Afficher-des-discussions#comment-form</comments>
      <wfw:comment>http://blog.mymind.fr/post/2007/11/01/Afficher-des-discussions#comment-form</wfw:comment>
      <wfw:commentRss>http://blog.mymind.fr/feed/atom/comments/37</wfw:commentRss>
      </item>
    
  <item>
    <title>15 000</title>
    <link>http://blog.mymind.fr/post/2007/10/07/15-000</link>
    <guid isPermaLink="false">urn:md5:3203b5fe73f058361981bf16bcb0e018</guid>
    <pubDate>Sun, 07 Oct 2007 22:32:00 +0200</pubDate>
    <dc:creator>Florent Bruneau</dc:creator>
        <category>Polytechnique.org</category>
            
    <description>    &lt;p&gt;Ca y est... 15 000 inscrits à &lt;a href=&quot;https://www.polytechnique.org&quot;&gt;Polytechnique.org&lt;/a&gt;.&lt;/p&gt;


&lt;p&gt;&lt;a href=&quot;http://blog.mymind.fr/public/screenshots/15.000.png&quot;&gt;&lt;img src=&quot;http://blog.mymind.fr/public/screenshots/15.000.png&quot; alt=&quot;15.000 inscrits&quot; /&gt;&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;Si l'ascension continue, nous devrions atteindre les 16 000 l'année prochaine.&lt;/p&gt;</description>
    
    
    
          <comments>http://blog.mymind.fr/post/2007/10/07/15-000#comment-form</comments>
      <wfw:comment>http://blog.mymind.fr/post/2007/10/07/15-000#comment-form</wfw:comment>
      <wfw:commentRss>http://blog.mymind.fr/feed/atom/comments/36</wfw:commentRss>
      </item>
    
  <item>
    <title>La Banane et l'escargot</title>
    <link>http://blog.mymind.fr/post/2007/05/07/La-Banane-et-lescargot</link>
    <guid isPermaLink="false">urn:md5:f4eb2372ed96701c79b70613de7c59fe</guid>
    <pubDate>Mon, 07 May 2007 17:44:00 +0200</pubDate>
    <dc:creator>Florent Bruneau</dc:creator>
        <category>Polytechnique.org</category>
        <category>Banana</category><category>Devel</category><category>PHP</category>    
    <description>&lt;p&gt;La release de &lt;a href=&quot;http://opensource.polytechnique.org/banana/&quot;&gt;Banana&lt;/a&gt; 1.6 en même temps que celle de plat/al 0.9.14 a mis en évidence un certain nombre de faiblesses dans Banana. En particuliers la génération du spool (mise en cache de l'arborescence des messages) et des flux RSS s'est révélé extrêmement lourde pour plusieurs raisons&amp;nbsp;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;l'accès aux mbox des Mailing-Lists nécessite d'appel du &lt;code&gt;mbox-helper&lt;/code&gt;, et donc un &lt;code&gt;fork&lt;/code&gt;... opération lourde, qui répétée plusieurs fois par mbox devient rapidement très lourde lorsqu'on a plusieurs dizaines de Mailing-Lists.&lt;/li&gt;
&lt;li&gt;le traitement des données par PHP est loin d'être immédiats... et il y a clairement des goulots d'étranglement dans le code.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;C'est pour ces raisons que j'ai passé Banana au &lt;code&gt;profiler&lt;/code&gt;, c'est à dire que j'ai analysé l'exécution de Banana à l'aide d'un outil qui permet de tracer l'exécution du programme et mettant un accent particuliers sur le temps d'exécution de chaque fonction. L'outil que j'ai trouvé pour faire ça est &lt;a href=&quot;http://www.xdebug.org&quot;&gt;xdebug&lt;/a&gt;, utilisé conjointement à &lt;a href=&quot;http://kcachegrind.sourceforge.net/&quot;&gt;KCacheGrind&lt;/a&gt;.&lt;/p&gt;    &lt;h2&gt;Forks&lt;/h2&gt;


&lt;p&gt;Je dois avouer que lorsque j'avais fait mes tests, je n'avais pas plusieurs centaines de Mailing-Lists à traiter... et je ne m'attendais pas à ce qu'une fois passée en production le script de mise à jour des flux RSS puisse prendre toutes les ressources de la machine pendant plusieurs minutes. Il a donc fallu sérieusement restructurer la gestion des accès aux Mailing-Lists pour restreindre au maximum le nombre d'accès au &lt;code&gt;mbox-helper&lt;/code&gt; (un petit programme écrit en C qui se charge de tous les accès aux mbox), et, en cas d'accès, limiter au maximum le temps passer sur le &lt;code&gt;mbox-helper&lt;/code&gt;.&lt;/p&gt;


&lt;p&gt;Donc désormais le &lt;code&gt;mbox-helper&lt;/code&gt; n'est plus appelé que si la mbox a changé depuis le dernier passage (le changement étant détecté par la taille du fichier). Ce qui permet donc de supprimer le lancement d'environ 500 &lt;code&gt;mbox-helper&lt;/code&gt; lors des rafraîchissements des spools (en effet, un nombre négligeable de Mailing-List aura des nouveaux messages lors du passage du script toutes les 5, 10 ou 20 minutes). Ajouté à cela la correction d'un bug qui faisait que l'appel au &lt;code&gt;mbox-helper&lt;/code&gt; oubliait de spécifier l'offset où chercher le message à traiter et qui forçait donc le &lt;code&gt;mbox-helper&lt;/code&gt; à relire la totalité de la mbox, on peut se permettre de supposer que la prochaine version de Banana sera plus efficace pour la gestion des mbox.&lt;/p&gt;



&lt;h2&gt;Array_shift&lt;/h2&gt;


&lt;h3&gt;Piles&lt;/h3&gt;


&lt;p&gt;Il est souvent extrêment pratique d'utiliser une pile de données. Cela permet de traiter les informations dans l'ordre de la pile sans excès de mémoire puisque chaque élément est dépilé avant d'être traité. C'est une technique que j'aime particulièrement lorsque j'ai une suite de lignes à traiter&amp;nbsp;: je prend un tableau contenant une ligne par entrée et je le parcours avec &lt;code&gt;array_shift&lt;/code&gt; qui permet de dépiler le premier élément du tableau. On obtient ainsi un code de la forme&lt;/p&gt;

&lt;pre&gt;
[php]
while (!is_null($line = array_shift($lines))) {
    do_something($line);
}
do_something($lines);
&lt;/pre&gt;


&lt;p&gt;Un &lt;code&gt;foreach&lt;/code&gt; peut très bien faire la même chose, mais on perd les avantages de la piles. Avec cette structure, pour avoir le même comportement que la boucle précédente, il faut ajouter un &lt;code&gt;unset()&lt;/code&gt;&amp;nbsp;:&lt;/p&gt;

&lt;pre&gt;
[php]
foreach ($lines as $key=&amp;gt;&amp;amp;$value) {
    do_something($line);
    unset($lines[$key]);
}
do_something($lines);
&lt;/pre&gt;


&lt;p&gt;Certes le &lt;code&gt;foreach&lt;/code&gt; sera sensiblement plus rapide que le &lt;code&gt;while&lt;/code&gt;/&lt;code&gt;array_shift()&lt;/code&gt; car il comprend un appel de fonction à chaque itération, mais on peut s'attendre raisonnablement à ce que cet appel soit en O(1), et ait donc un coût négligeable.&lt;/p&gt;


&lt;h3&gt;Profiler&lt;/h3&gt;


&lt;p&gt;Là où il y a un problème c'est que le profiler m'indique que &lt;code&gt;array_shift&lt;/code&gt; prend 57% du temps d'exécution de Banana. Ces 57% sont partagés entre 80000 appels à la fonction, mais le plus marquant c'est que parmi ces 80000 appels, ce ne sont que 24000 d'entre eux qui prennent la quasi-totalité du temps. Pourquoi ces appels particuliers sont-ils si lourd alors que les 60000 autres ont un coût parfaitement négligeable.&lt;/p&gt;


&lt;p&gt;La seule différence entre ces deux cas d'appels c'est que les &lt;em&gt;lourds&lt;/em&gt; traitent un énorme tableau de 24000 lignes, alors que les &lt;em&gt;légers&lt;/em&gt; traitent un grand nombre de petits tableaux de quelques dizaines de lignes chacun. Il est donc extrêmement clair que &lt;code&gt;array_shift&lt;/code&gt; &lt;strong&gt;n'est pas&lt;/strong&gt; une fonction en O(1)... J'ai donc changé la structure de code qui reflétait la structure de données par une simple boucle qui perd en lisibilité dans &lt;a href=&quot;http://opensource.polytechnique.org/viewsvn/diff.php?path=/trunk/banana/mbox.inc.php&amp;amp;rev=248&amp;amp;repname=Banana&quot;&gt;ce patch&lt;/a&gt;. Après ce changement, les 60000 &lt;code&gt;array_shift&lt;/code&gt; restant ne prennent que 0.16% du temps d'exécution de Banana...&lt;/p&gt;</description>
    
    
    
          <comments>http://blog.mymind.fr/post/2007/05/07/La-Banane-et-lescargot#comment-form</comments>
      <wfw:comment>http://blog.mymind.fr/post/2007/05/07/La-Banane-et-lescargot#comment-form</wfw:comment>
      <wfw:commentRss>http://blog.mymind.fr/feed/atom/comments/25</wfw:commentRss>
      </item>
    
  <item>
    <title>0.9.14 en ligne !</title>
    <link>http://blog.mymind.fr/post/2007/04/29/0914-en-ligne</link>
    <guid isPermaLink="false">urn:md5:200148e068514954b2f5974a8553116d</guid>
    <pubDate>Sun, 29 Apr 2007 19:09:00 +0200</pubDate>
    <dc:creator>Florent Bruneau</dc:creator>
        <category>Polytechnique.org</category>
        <category>Devel</category><category>platal</category>    
    <description>&lt;p&gt;Ca y est, comme annoncé dans &lt;a href=&quot;http://blog.mymind.fr/mind/post/2007/03/30/Un-apercu-de-la-version-0914-de-plat/al&quot;&gt;mon billet de fin mars&lt;/a&gt;, la version 0.9.14 de &lt;a href=&quot;http://opensource.polytechnique.org/platal&quot;&gt;plat/al&lt;/a&gt; est en ligne depuis vendredi soir. Comme expliqué précédemment, cette version apporte un grand nombre d'innovations comme &lt;a href=&quot;http://blog.mymind.fr/mind/post/2007/02/25/Un-client-RSS-pour-lire-les-Forums-NNTP-et-les-Mailing-Lists&quot;&gt;le flux RSS pour les Mailing-Lists et les Fora&lt;/a&gt;, la &lt;a href=&quot;http://blog.mymind.fr/mind/post/2007/03/15/Soundex-Francais&quot;&gt;recherche par proximité sonore améliorée&lt;/a&gt; et généralisée, un système d'annonces retravaillé pour offrir un approche plus conviviale, et bien sûr, le passage en UTF-8.&lt;/p&gt;


&lt;p&gt;Mais de tout cela, j'en ai déjà parlé... je tiens par contre à m'étendre sur les quelques fonctionnalités qui ont été développées durant le dernier mois (en fait, durant les dernières deux semaines de développement, le reste du temps ayant été consacré aux tests).&lt;/p&gt;    &lt;h2&gt;Recherche interactive&lt;/h2&gt;


&lt;p&gt;Caribou a réalisé un énorme travail sur la mise en place d'un remplissage automatique (auto-completion pour les geeks) sur la recherche avancée. Ainsi, lorsqu'on tape quelques caractères dans un champ, une liste de propositions apparaît avec pour chaque proposition le nombre de camarades correspondant à la requête. Ce qui donne par exemple&amp;nbsp;:&lt;/p&gt;


&lt;p&gt;&lt;img src=&quot;http://blog.mymind.fr/mind/public/screenshots/select-ville.png&quot; alt=&quot;Auto-Completion sur les villes&quot; /&gt;&lt;/p&gt;


&lt;p&gt;&lt;img src=&quot;http://blog.mymind.fr/mind/public/screenshots/select-pays.png&quot; alt=&quot;Auto-Completion sur les pays&quot; /&gt;&lt;/p&gt;


&lt;p&gt;Par contre, là où cela devient très intéressant, c'est que l'interface reste flexible&amp;nbsp;: si vous préférez choisir dans une liste des valeurs possibles plutôt que d'utiliser l'auto-completion, ce qui est envisageable, il suffit, si c'est disponible pour le champ correspondant, de cliquer sur la petite icône représentant une liste en fin de ligne... Ainsi, pour les pays, cela donne&amp;nbsp;:&lt;/p&gt;


&lt;p&gt;&lt;img src=&quot;http://blog.mymind.fr/mind/public/screenshots/select-pays-dropdown.png&quot; alt=&quot;Choix sur les pays&quot; /&gt;&lt;/p&gt;


&lt;p&gt;Il s'agit du même champ dont le &amp;lt;input type=&quot;text&quot;&amp;gt; a été remplacé par une &amp;lt;select&amp;gt;.&lt;/p&gt;


&lt;h2&gt;Sondages&lt;/h2&gt;


&lt;p&gt;Les sondages étaient la seule fonctionnalité du site qui avait été perdue lors du passage à plat/al il y a maintenant 2 ans et demi. C'est maintenant réparé grâce au travail de pika. Cette fonctionnalité étant de fait encore jeune, on peut s'attendre à ce que l'interface soit retravaillée fortement dans les prochaines versions du site pour s'adapter aux attentes des utilisateurs. Néanmoins, il est à noter que l'édition des sondages a été travaillée de telle sorte qu'un sondage soit facilement éditable&amp;nbsp;: l'utilisateur qui crée un sondage peut aisément ajouter, supprimer ou modifier des questions, et les administrateurs ont accès exactement aux mêmes fonctionnalités pour la maintenance des sondages.&lt;/p&gt;


&lt;p&gt;Nous attendons maintenant l'utilisation de cette fonctionnalité pour avoir des retours de la part de nos utilisateurs. Si l'expérience se révèle concluante, les sondages seront intégrés à Polytechnique.net pour que les animateurs les aient à leur disposition directement depuis l'interface de gestion des groupes.&lt;/p&gt;


&lt;h2&gt;Ensemble d'utilisateurs&lt;/h2&gt;


&lt;p&gt;Il s'agit de la partie sur laquelle j'ai travaillé, et donc celle que je connais le mieux, mais c'est aussi la partie la plus abstraite. Pour l'utilisateur, ça ne change quasiment rien, par contre au niveau du moteur du site, c'est à mon sens un pas en avant important vers des interfaces plus adaptées aux besoins des utilisateurs. C'est pour cette raison que cette partie risque d'être un poil technique.&lt;/p&gt;


&lt;p&gt;Ce dont je parlais au paragraphe précédent est la gestion des ensembles d'utilisateurs... mais qu'est-ce donc&amp;nbsp;? un ensemble d'utilisateur est tout simplement une sélection d'utilisateurs dans l'annuaire, ça peut être les membres d'une Mailing-List, les contacts d'un utilisateur, les membres d'un groupe, les camarades correspondant à une recherche...&lt;/p&gt;


&lt;p&gt;Le problème est que je voudrais que dès que sélectionne un ensemble d'utilisateur, je puisse séparer totalement la représentation de ces utilisateurs de la sélection qui est faite&amp;nbsp;: ainsi si je choisi mes contacts, je veux pouvoir afficher mes contacts sur un planisphère, voir le trombinoscope de mes contacts, mais aussi voir leurs fiches... mais je voudrais avoir les mêmes outils pour toute autre sélection d'utilisateur.&lt;/p&gt;


&lt;p&gt;La résolution propre de ce problème (c'est-à-dire, sans tout recoder à chaque cas possible d'utilisation) est l'utilisation d'un outil orienté Model/View&amp;nbsp;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;le modèle gère la parti sélection des utilisateurs en fonction de la page&lt;/li&gt;
&lt;li&gt;l'afficheur sélectionne les données à afficher pour les utilisateurs et génère ce que l'utilisateur verra&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Dans plat/al, le Model s'appelle PlSet (duquel hérite un UserSet spécialisé dans les ensembles d'utilisateurs), et le View s'appelle PlView. De cette manière, l'affichage des contacts se fait en 5 lignes de code&amp;nbsp;:&lt;/p&gt;

&lt;pre&gt;
[php]
$view = new UserSet(&amp;quot;INNER JOIN contacts AS c2 ON (u.user_id = c2.contact)&amp;quot;, &amp;quot; c2.uid = $uid &amp;quot;);
$view-&amp;gt;addMod('minifiche', 'Mini-Fiches', true); 
$view-&amp;gt;addMod('trombi', 'Trombinoscope', false, array('with_admin' =&amp;gt; false, 'with_promo' =&amp;gt; true)); 
$view-&amp;gt;addMod('geoloc', 'Planisphère'); 
$view-&amp;gt;apply('carnet/contacts', $page, $action, $subaction); 
&lt;/pre&gt;


&lt;p&gt;On crée le UserSet en lui donnant les critères de sélection des utilisateurs à afficher, puis on ajoute les Views à utiliser, enfin on gère l'affichage (en fonction des arguments passés à l'affichage de la page). C'est le type d'abstraction qui font vraiment plaisir car finalement on se rapproche du slogan de Qt&amp;nbsp;: &lt;q&gt;Code less, Do more&lt;/q&gt;.&lt;/p&gt;


&lt;p&gt;Bien sûr, il faut développer tout le background, mais le temps de développement est négligeable comparé à celui qu'on aurait passé à dupliquer ce code, voire justement à ne pas le dupliquer en raison de la complexité de certains cas. Un autre exemple d'utilisation est sur l'annuaire des groupes sur Polytechnique.net&amp;nbsp;:&lt;/p&gt;

&lt;pre&gt;
[php]
$view = new UserSet(); 
$view-&amp;gt;addMod('trombi', 'Trombinoscope'); 
$view-&amp;gt;addMod('geoloc', 'Planisphère'); 
$view-&amp;gt;apply('annuaire', $page, $action, $subaction); 
&lt;/pre&gt;


&lt;p&gt;Dans ce cas, comme UserSet sait que s'il est appelé dans le cadre d'un groupe-X sur Polytechnique.net, il ne doit pas sélectionner d'utilisateurs hors de l'annuaire de ce groupe, il n'y a aucune restriction à lui indiquer&amp;nbsp;: tout l'annuaire du groupe est sélectionné. On ajoute les deux modules de représentation qu'on désire utiliser&amp;nbsp;: trombinoscope et Planispère, et applique à la page... en 4 lignes c'est fait.&lt;/p&gt;


&lt;p&gt;Je m'extasie devant ce travail parce que je suis content du résultat, mais il n'est pas pour autant parfait. Son problème actuel est dû au background basé sur SQL&amp;nbsp;: chaque élément (PlSet ou PlView) apporte des bribes d'une requête SQL permettant de finalement obtenir toutes les informations à afficher (PlView) pour les utilisateurs sélectionnés (PlSet), mais il peut arriver qu'une même donnée soit utilisée pour la sélection et pour l'affichage. Dans ce cas, la solution la plus simple est de dupliquer les jointures dans la requête, mais c'est une solution qui peut sérieusement alourdir et ralentir la requête.&lt;/p&gt;


&lt;p&gt;L'implémentation actuelle gère la duplication au cas par cas&amp;nbsp;: les PlView peuvent contenir tester s'il faut sélectionner un champ ou non en testant la classe du PlSet utilisé. Cette solution n'est pas particulièrement propre. La meilleure solution envisageable est d'utiliser une abstraction des champs SQL&amp;nbsp;: chaque élément ne donnerait plus une bribe de requête SQL mais des informations sur &quot;comment sélectionner la donnée&quot;... ensuite la génération de la requête consiste à comparer toutes ces informations et à les assembler. Plat/al possède déjà les outils nécessaires pour réaliser ce jeu d'assemblage... ce sera très probablement pour la prochaine release.&lt;/p&gt;</description>
    
    
    
          <comments>http://blog.mymind.fr/post/2007/04/29/0914-en-ligne#comment-form</comments>
      <wfw:comment>http://blog.mymind.fr/post/2007/04/29/0914-en-ligne#comment-form</wfw:comment>
      <wfw:commentRss>http://blog.mymind.fr/feed/atom/comments/23</wfw:commentRss>
      </item>
    
  <item>
    <title>Un aperçu de la version 0.9.14 de plat/al</title>
    <link>http://blog.mymind.fr/post/2007/03/30/Un-apercu-de-la-version-0914-de-plat/al</link>
    <guid isPermaLink="false">urn:md5:ec498a28aa5a6eddefe735a40a71e0e8</guid>
    <pubDate>Fri, 30 Mar 2007 11:39:00 +0200</pubDate>
    <dc:creator>Florent Bruneau</dc:creator>
        <category>Polytechnique.org</category>
        <category>Devel</category><category>platal</category>    
    <description>&lt;p&gt;Le site de &lt;a href=&quot;https://www.polytechnique.org&quot;&gt;Polytechnique.org&lt;/a&gt; est prévu pour être mis à jour régulièrement, de l'ordre d'une fois tous les deux mois. Ainsi, les mises à jours sont suffisamment substantielles pour créer un effet d'annonce autour des améliorations apportées au site, sans pour autant laisser traîner les correctifs de bugs trop longtemps dans la branche de développement sans en faire profiter les utilisateurs.&lt;/p&gt;


&lt;p&gt;La version 0.9.13 est sortie fin janvier, un peu plus d'un mois après la 0.9.12. La 0.9.14 sortira probablement fin avril (en tout cas, ce sera après le passage de &lt;a href=&quot;http://www.debian.org/releases/etch/&quot;&gt;etch&lt;/a&gt; en stable chez debian). Néanmoins, vue la masse de changement de cette nouvelle version, nous avons décidé de lancer les tests plus tôt qu'à l'accoutumée. Voici donc un aperçu des nouveautés (seulement un aperçu car le développement de cette version n'est pas freezé).&lt;/p&gt;


&lt;p&gt;Comme à l'accoutumée, la liste exhaustive des changements se trouve dans le &lt;a href=&quot;http://dev.m4x.org/changelog&quot;&gt;ChangeLog&lt;/a&gt;.&lt;/p&gt;    &lt;h2&gt;Passage en UTF8&lt;/h2&gt;


&lt;p&gt;C'est le changement le moins visible... mais le plus douloureux. En fait pour l'utilisateur a priori, rien ne change... mais en background &lt;strong&gt;toutes&lt;/strong&gt; les pages, sans exception, sont affectées et donc potentiellement buggées. La plupart du temps un bug d'UTF8 (dans le sens latin1 interprété comme de l'UTF8) entraîne l'affichage d'une page vide ou blanche, ce qui est beaucoup plus douloureux que dans l'autre sens (UTF8 interprété comme du latin1).&lt;/p&gt;


&lt;p&gt;Le passage en UTF8 s'accompagne d'un passage de MySQL 4.0 à MySQL 5... a priori la plupart des incompatibilités SQL sont corrigées mais on ne sait jamais. Pour l'instant nous n'utilisons pas vraiment les nouveautés de MySQL 5 (en fait un MySQL 4.1 aurait suffi pour l'usage qu'on en fait). Mais ce changement permet de prévoir à l'avenir un changement de la structure de la base SQL que nous utilisons, ce qui sera sans doute nécessaire lors de la &lt;a href=&quot;http://trackers.polytechnique.org/task/547&quot;&gt;fusion des annuaires&lt;/a&gt;.&lt;/p&gt;


&lt;h2&gt;Syntaxe Wiki généralisée&lt;/h2&gt;


&lt;p&gt;Autre nouveauté majeure, mais cette fois dont l'utilisateur bénéficiera directement&amp;nbsp;: une syntaxe wiki généralisée est désormais mise en place sur la grande majorité des textes que l'utilisateur peut entrer sur le site. La syntaxe utilisée est celle de &lt;a href=&quot;http://www.pmwiki.org/&quot;&gt;PmWiki&lt;/a&gt;, le moteur wiki que nous utilisons déjà pour les pages de documentation du site. Malheureusement la structure de PmWiki interdisant son utilisation comme une bibliothèque (en gros il ne fournit pas de fonction wikiToHtml, comme le fait par exemple &lt;a href=&quot;http://www.dotclear.net&quot;&gt;Dotclear&lt;/a&gt;), il a fallu réimplémenter un nouveau moteur wiki léger.&lt;/p&gt;


&lt;p&gt;Cette &lt;a href=&quot;http://dev.m4x.org/wiki_help&quot;&gt;syntaxe wiki&lt;/a&gt; permet la plupart des formatages attendus&amp;nbsp;: gras, italique, couleur, soulignement, listes, titres et tailles, liens hypertextes. On conserve également un url-catcher qui permet à l'utilisateur qui n'a pas envie de prendre le temps de formater son annonce d'avoir tout de même les URL transformées en lien.&lt;/p&gt;


&lt;p&gt;La syntaxe wiki est utilisable&amp;nbsp;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;pour le formulaire d'envoi de mail&lt;/li&gt;
&lt;li&gt;pour les champs &quot;freetext&quot; de la fiche (CV et Commentaires)&lt;/li&gt;
&lt;li&gt;pour l'édition d'annonces (pour la page d'accueil et pour la lettre mensuelle)&lt;/li&gt;
&lt;li&gt;...&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;Amélioration des annonces&lt;/h2&gt;


&lt;p&gt;Comme indiqué dans le paragraphe précédent, les annonces bénéficieront d'une syntaxe wiki qui permet de formater l'annonce (ce qui n'était jusqu'à présent faisable que par les administrateurs du site, en éditant directement le code HTML de l'annonce). Mais ce n'est pas la seule amélioration. L'amélioration du système d'annonce de Polytechnique.org était un des points les plus importants que j'avais annoncés dans un &lt;a href=&quot;http://blog.mymind.fr/mind/post/2007/03/01/Polytechniqueorg-en-retard&quot;&gt;précédent billet&lt;/a&gt;.&lt;/p&gt;


&lt;p&gt;&lt;a href=&quot;http://blog.mymind.fr/mind/public/screenshots/annonce-0.9.14.png&quot;&gt;&lt;img src=&quot;http://blog.mymind.fr/mind/public/screenshots/.annonce-0.9.14_m.jpg&quot; alt=&quot;Système d&amp;#039;annonces de plat/al 0.9.14&quot; style=&quot;display:block; margin:0 auto;&quot; /&gt;&lt;/a&gt;&lt;/p&gt;


&lt;h3&gt;Classement des annonces&lt;/h3&gt;


&lt;p&gt;Au lieu d'avoir toutes les annonces dans un ordre incompréhensible qui ne permet pas de distinguer les nouvelles des anciennes, les annonces seront désormais classées selon leur date d'arrivée, leur date de péremption et leur importance. Ce classement est &lt;em&gt;'très&lt;/em&gt;' fortement inspiré du classement utilisé sur &lt;a href=&quot;http://www.frankiz.net&quot;&gt;Frankiz (le portail des élèves de l'X)&lt;/a&gt;. L'ordre de traitement (en first-match) est le suivant&amp;nbsp;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;si une annonce est marquée comme importante, elle va dans la catégorie du même nom.&lt;/li&gt;
&lt;li&gt;si une annonce a été validée (et non postée) il y a moins de 48 heures, elle est dans &quot;Nouvelles annonces&quot;&lt;/li&gt;
&lt;li&gt;si une annonce périme dans moins de 48 heures, elle est dans &quot;Bientôt fini&quot;&lt;/li&gt;
&lt;li&gt;toutes les autres annonces sont dans &quot;Mais encore...&quot;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;Une image par annonce...&lt;/h3&gt;


&lt;p&gt;Les annonces autorisent désormais l'ajout d'une image qui illustre l'annonce ou le groupe qui a posté l'annonce. Pour le design, nous sommes cette fois plus proche de ce qui est fait sur le &lt;a href=&quot;http://www.polytechnicien.com&quot;&gt;site de l'AX&lt;/a&gt;&amp;nbsp;: l'image est placée sur le côté de l'annonce, ce qui permet de limiter l'espace inutilisé. Moins il y a de vide, plus on a de chance que les utilisateurs aillent lire le contenu sans trop &quot;scroller&quot;, ce qui est à mon avis mieux pour la lisibilité des annonces.&lt;/p&gt;


&lt;h3&gt;Discussion&lt;/h3&gt;


&lt;p&gt;Enfin la dernière grande nouveauté est l'ajout de la notion de discussion. Lorsqu'une annonce est validée, elle est automatiquement postée sur un newsgroup (grâce à &lt;a href=&quot;http://opensource.polytechnique.org/banana&quot;&gt;banana&lt;/a&gt; et l'annonce elle-même contient un lien vers ce post. Je suis curieux de voir à quel point cela va fonctionner (j'ai tendance à penser que ce sera encore une fonctionnalité inutilisée... en tout cas pendant les premiers mois) mais en tout cas c'est avant tout un début vers une meilleure interactivité entre les utilisateurs.&lt;/p&gt;


&lt;h2&gt;Recherche par proximité sonore généralisée&lt;/h2&gt;


&lt;p&gt;Une autre nouveauté dont j'ai déjà parlé dans &lt;a href=&quot;http://blog.mymind.fr/mind/post/2007/03/15/Soundex-Francais&quot;&gt;un billet précédent&lt;/a&gt;. Alors qu'auparant la recherche par proximité sonore était limitée à la recherche avancée et n'était pas toujours correcte, la nouvelle étant la possibilité à la recherche rapide (selon le choix de l'utilisateur évidemment) et devrait être (je l'espère) plus efficace qu'auparavant grâce au nouvel algorithme de soundex conçu pour mieux s'adapter à la langue française.&lt;/p&gt;


&lt;p&gt;Le seul moyen de se faire une idée est de &lt;a href=&quot;http://dev.m4x.org/search&quot;&gt;tester sur le site&lt;/a&gt; ou de &lt;a href=&quot;http://blog.mymind.fr/mind/post/2007/03/15/Soundex-Francais#test&quot;&gt;tester l'algorithme&lt;/a&gt;.&lt;/p&gt;


&lt;h2&gt;Les forums et les Mailing-Lists en RSS&lt;/h2&gt;


&lt;p&gt;La prochaine version de plat/al intégrera Banana 1.6 dont l'innovation majeure est l'ajout de flux RSS pour les forums. Je ne m'étendrais pas sur le sujet étant donné qu'il y a déjà un &lt;a href=&quot;http://blog.mymind.fr/mind/post/2007/02/25/Un-client-RSS-pour-lire-les-Forums-NNTP-et-les-Mailing-Lists&quot;&gt;billet à ce sujet&lt;/a&gt;. Mais les forums ne sont pas les seuls à se doter d'un flux RSS avec cette nouvelle version, c'est également le cas des pages de documentation. Ainsi il sera possible de suivre les modifications de la documentation (ce qui sera principalement utile pour les administrateurs du site).&lt;/p&gt;


&lt;h2&gt;Mais aussi... en vrac&lt;/h2&gt;


&lt;p&gt;Les versions précédentes du site offraient la possibilité d'ajouter l'annuaire de Polytechnique.org aux moteurs de recherche de Firefox. Désormais ce sera aussi possible de le faire dans Internet Explorer 7 et dans tous les navigateurs qui supportent le format &lt;a href=&quot;http://www.opensearch.org&quot;&gt;OpenSearch&lt;/a&gt;.&lt;/p&gt;


&lt;p&gt;L'ajout d'un nouveau module pour faire des sondages. Ce module est encore en développement et n'est pas actuellement accessible sur le site de développement, mais il devrait être intégré à la prochaine version du site. Les sondages étaient la seule fonctionnalité du site perdue en octobre 2004 lorsque la première version de plat/al avait replacé l'ancienne version du site. C'est un outil très attendu que nous sommes heureux de retrouver grâce au travail de &lt;a href=&quot;https://www.polytechnique.org/profile/fabien.laborde.2004&quot;&gt;pika&lt;/a&gt;.&lt;/p&gt;


&lt;p&gt;Et il y a encore d'autres nouveautés, ainsi qu'un grand nombre de corrections de bugs.&lt;/p&gt;


&lt;h2&gt;Venez tester&amp;nbsp;!&lt;/h2&gt;


&lt;p&gt;N'hésitez donc pas à venir nous aider à tester toutes ces nouvelles fonctionnalités. Pour ceci il suffit d'avoir un compte sur Polytechnique.org (donc d'être un X) et d'aller sur&amp;nbsp;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://dev.m4x.org&quot;&gt;Le site de test de Polytechnique.org&lt;/a&gt; pour tester le site principal&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://dev.polytechnique.net&quot;&gt;le site de test de Polytechnique.net&lt;/a&gt; pour tester le site des groupes&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;La &lt;a href=&quot;http://www.polytechnique.net/Polytechnique.org/lists/members/testeurs&quot;&gt;liste de diffusion des testeurs&lt;/a&gt; est également ouverte à toutes les bonnes volontés et permet de discuter simplement les bugs et de l'avancement des corrections.&lt;/p&gt;</description>
    
    
    
          <comments>http://blog.mymind.fr/post/2007/03/30/Un-apercu-de-la-version-0914-de-plat/al#comment-form</comments>
      <wfw:comment>http://blog.mymind.fr/post/2007/03/30/Un-apercu-de-la-version-0914-de-plat/al#comment-form</wfw:comment>
      <wfw:commentRss>http://blog.mymind.fr/feed/atom/comments/18</wfw:commentRss>
      </item>
    
  <item>
    <title>Soundex Français</title>
    <link>http://blog.mymind.fr/post/2007/03/15/Soundex-Francais</link>
    <guid isPermaLink="false">urn:md5:0b44d76db88f4470bb76e4bc56c891fe</guid>
    <pubDate>Thu, 15 Mar 2007 18:06:00 +0100</pubDate>
    <dc:creator>Florent Bruneau</dc:creator>
        <category>Polytechnique.org</category>
        <category>Devel</category><category>PHP</category>    
    <description>&lt;p&gt;Pour faire une recherche phonétique, on utilise souvent ce qu'on appelle une transcription &lt;strong&gt;soundex&lt;/strong&gt; des mots. C'est une réécriture du mot, dans un alphabet restreint et sur un nombre de caractères restreint également. La plupart des algorithmes qu'on peut trouver sur internet sont conçus uniquement à la langue anglaise. Pour utiliser la recherche phonétique en français, il faut donc adapter cet algorithme.&lt;/p&gt;


&lt;p&gt;L'implémentation française la plus courante utilise l'&lt;a href=&quot;http://sqlpro.developpez.com/cours/soundex/&quot;&gt;algorithme décrit par Frédéric Brouard&lt;/a&gt;. Malheureusement cet algorithme ne me satisfait pas vraiment, car il n'est finalement pas très adapté à langue française.&lt;/p&gt;    &lt;p&gt;En effet cet algorithme a pas mal de défauts&amp;nbsp;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;il est très aléatoire dans le cas de dédoublement de consonnes. Par exemple, il ne permet de trouver que &lt;em&gt;bananne&lt;/em&gt; (soundex &lt;code&gt;BNN&lt;/code&gt;) est une approximation de &lt;em&gt;banane&lt;/em&gt; (soundex &lt;code&gt;BN&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;il est très peu sélectif sur les voyelles. Par exemple &lt;em&gt;poulpe&lt;/em&gt; et &lt;em&gt;palpa&lt;/em&gt; ont le même soundex (&lt;code&gt;PLP&lt;/code&gt;) alors que pour moi, poulpe et palpa sont deux mots éloignés, malgré leur consonnes communes. Par contre, il ne reconnaîtra pas Aymeric (soundex &lt;code&gt;AYMR&lt;/code&gt;) comme étant un homophone de Emeric (soundex &lt;code&gt;EMRC&lt;/code&gt;)...&lt;/li&gt;
&lt;li&gt;il n'est pas vraiment capable de distinguer les conjugaisons. Par exemple &lt;em&gt;palper&lt;/em&gt; (soundex &lt;code&gt;PLPR&lt;/code&gt;) et &lt;em&gt;palpé&lt;/em&gt; (soundex &lt;code&gt;PLP&lt;/code&gt;) sont éloignés l'un de l'autre.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;J'ai donc réalisé une nouvelle implémentation de &lt;code&gt;soundex&lt;/code&gt; qui est plus adaptée (à mon sens) à la langue française. Je n'ai évidemment pas pour ambition de réaliser une solution parfaite (ce qui est impossible à faire à partir d'un système automatisé sans dictionnaire).&lt;/p&gt;


&lt;h2&gt;Algorithme&lt;/h2&gt;


&lt;p&gt;Mon algorithme, comme je l'ai déjà dit, est une adaptation de celui de &lt;a href=&quot;http://sqlpro.developpez.com/cours/soundex/&quot;&gt;Frédéric Brouard&lt;/a&gt;. Il se compose de 2 étapes principales&amp;nbsp;:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;le préformatage, qui consiste à transformer le chaîne de caractère brute, en une chaîne analysable.&lt;/li&gt;
&lt;li&gt;l'analyse de la chaîne, et la recherche de entités phoniques élémentaires qui la composent&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;Préformatage&lt;/h3&gt;


&lt;p&gt;Le préformatage est extrêmement simple&amp;nbsp;:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;On converti la chaîne en majuscule&lt;/li&gt;
&lt;li&gt;On converti chaque caractère accentué vers son caractère non-accentué correspondant&lt;/li&gt;
&lt;li&gt;On filtre pour ne conserver que les lettres (de A à Z)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Ainsi après ce premier filtrage, &lt;em&gt;Mac-Cartney&lt;/em&gt; devient &lt;em&gt;MACCARTNEY&lt;/em&gt; et &lt;em&gt;palpé&lt;/em&gt; sera &lt;em&gt;PALPE&lt;/em&gt;&lt;/p&gt;


&lt;h3&gt;Traitement des données&lt;/h3&gt;


&lt;p&gt;Le traitement des données consiste à reconnaître les sonorités. Pour ceci on utilise la table de conversion suivante qui associe à chaque sonorité complexe un caractère&amp;nbsp;:&lt;/p&gt;

&lt;table&gt;
  &lt;tr&gt;&lt;th&gt;Combinaison&lt;/th&gt;&lt;th&gt;Caractère&lt;/th&gt;&lt;/tr&gt;
  &lt;tr&gt;&lt;td&gt;G (prononcé GUE), C (prononcé Q), CK, K, QU, Q&lt;/td&gt;&lt;td&gt;K&lt;/td&gt;&lt;/tr&gt;
  &lt;tr&gt;&lt;td&gt;CH, SH, SCH&lt;/td&gt;&lt;td&gt;9&lt;/td&gt;&lt;/tr&gt;
  &lt;tr&gt;&lt;td&gt;ST&lt;/td&gt;&lt;td&gt;T&lt;/td&gt;&lt;/tr&gt;
  &lt;tr&gt;&lt;td&gt;PF (en début de mot), PH&lt;/td&gt;&lt;td&gt;F&lt;/td&gt;&lt;/tr&gt;
  &lt;tr&gt;&lt;td&gt;Z (en fin de mot)&lt;/td&gt;&lt;td&gt;ZE&lt;/td&gt;&lt;/tr&gt;
  &lt;tr&gt;&lt;td&gt;Z, ZZ, C (prononcé SE)&lt;/td&gt;&lt;td&gt;S&lt;/td&gt;&lt;/tr&gt;
  &lt;tr&gt;&lt;td&gt;G (prononcé JE)&lt;/td&gt;&lt;td&gt;J&lt;/td&gt;&lt;/tr&gt;
  &lt;tr&gt;&lt;td&gt;EAU, AU&lt;/td&gt;&lt;td&gt;O&lt;/td&gt;&lt;/tr&gt;
  &lt;tr&gt;&lt;td&gt;IN, UN, AIN, EIN (proncés UN)&lt;/td&gt;&lt;td&gt;1&lt;/td&gt;&lt;/tr&gt;
  &lt;tr&gt;&lt;td&gt;AON, AOM, EN, AN (prononcés EN)&lt;/td&gt;&lt;td&gt;A&lt;/td&gt;&lt;/tr&gt;
  &lt;tr&gt;&lt;td&gt;EY, EI, AY, AI, OE, OEU, EU, ER&lt;/td&gt;&lt;td&gt;E&lt;/td&gt;&lt;/tr&gt;
  &lt;tr&gt;&lt;td&gt;OI&lt;/td&gt;&lt;td&gt;O&lt;/td&gt;&lt;/tr&gt;
  &lt;tr&gt;&lt;td&gt;ILLE, I&lt;/td&gt;&lt;td&gt;Y&lt;/td&gt;&lt;/tr&gt;
  &lt;tr&gt;&lt;td&gt;OU, OW&lt;/td&gt;&lt;td&gt;U&lt;/td&gt;&lt;/tr&gt;
  &lt;tr&gt;&lt;td&gt;ON, OM&lt;/td&gt;&lt;td&gt;O&lt;/td&gt;&lt;/tr&gt;
  &lt;tr&gt;&lt;td&gt;KN (en début de mot)&lt;/td&gt;&lt;td&gt;N&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;



&lt;p&gt;Une fois qu'on a cette table de correspondances (elle n'est peut-être pas exhaustive... je n'hésiterais pas à l'améliorer), on applique toutes les modifications, on supprime les lettres qui sont présentes en doublon et finalement on supprime les H restants. Il faut également supprimer les caractères muets en fin de mot. En français, ce seront les X, T, D, S (et le L qui les précède si il existe) ou les E.&lt;/p&gt;


&lt;p&gt;Ensuite, il faut faire un nettoyage sur la chaîne de caractère. Ce nettoyage consiste à rechercher les phonèmes importants et à supprimer les caractères muets ou peu audibles&amp;nbsp;: on veut identifier ce qui fait la particularité d'une syllabe. Frédéric Brouard considère que toutes les voyelles (exceptés les Y précédés d'une voyelle) placées autre part qu'en début de mot sont insignifiantes... ça me paraît le gros point faible de sa méthode. Personnellement j'ai essayé d'identifier une liste de sonorité dominantes. Voici celles que j'ai actuellement&amp;nbsp;:&lt;/p&gt;

&lt;table&gt;
  &lt;tr&gt;&lt;th&gt;Sonorité&lt;/th&gt;&lt;th&gt;Informations&lt;/th&gt;&lt;/tr&gt;
  &lt;tr&gt;
    &lt;td&gt;K, T, P&lt;/td&gt;
    &lt;td&gt;Ce sont les consonnes qui sont très marquées, qui rythment le mot&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td&gt;A, U, O, 1&lt;/td&gt;
    &lt;td&gt;Ce sont les son qu'on entend le mieux, contrairement aux I ou aux E qui mettent plus en avant les consonnes. Le A est à mon avis particulier, car il est faible mais suffisamment marquant pour effacer des consonnes comme le R&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td&gt;Y&lt;/td&gt;
    &lt;td&gt;Y n'est marquant que lorsqu'il a un rôle de consonne : quand il permet de lier deux parties du mot, comme dans ''voyelle'', où il lie le ''vo'' et le ''elle''. Il est donc important lorsqu'il est encadré par une ou des voyelles. Dans les autres cas, c'est une voyelle faible&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td&gt;L&lt;/td&gt;
    &lt;td&gt;Contrairement aux K, T et P, le L permet d'adoucir le mot, en particulier lorsqu'il sert de liaison entre une consonne et une voyelle. Il est donc important de le conserver&lt;/tr&gt;
  &lt;/tr&gt;
&lt;/table&gt;



&lt;p&gt;Ces choix sont relativement arbitraires. Le comportement de l'algorithme est alors simple&amp;nbsp;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Si une voyelle est liée à une consonne de liaison (qui fait le lien entre la voyelle et une autre consonne, c'est souvent le cas du L ou du R, on exclut de ce cas les consommes fortes)&lt;/li&gt;
&lt;li&gt;Si en plus il s'agit d'une voyelle forte
&lt;ul&gt;
&lt;li&gt;alors, on supprime la consonne de liaison et on garde la voyelle&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ensuite, on supprime les voyelles faibles (sauf si elles commencent le mot). Pour cette suppression, on considère le A comme une voyelle faible.&lt;/p&gt;


&lt;p&gt;Pour terminer on coupe la chaîne obtenue à 4 caractères (mais il est parfaitement envisageable de prendre un soundex sur plus (ou moins) de caractères. Simplement, dans la plupart des cas, 4 caractères suffisent amplement à avoir un mot significatif.&lt;/p&gt;


&lt;h2&gt;Implémentation&lt;/h2&gt;


&lt;p&gt;Mon implémentation en PHP est téléchargeable &lt;a href=&quot;http://blog.mymind.fr/soundex_fr.php?action=download&quot;&gt;ici&lt;/a&gt;. Elle est testable &lt;a href=&quot;http://blog.mymind.fr/mind/post/2007/03/15/Soundex-Francais#test&quot;&gt;plus bas dans cette même page&lt;/a&gt;. Voici le code de la fonction soundex_fr (je ne garantis pas que le code disponible sur cette page reste constamment à jour, contrairement au lien de téléchargement) :&lt;sup&gt;[&lt;a href=&quot;http://blog.mymind.fr/post/2007/03/15/Soundex-Francais#pnote-14-1&quot; id=&quot;rev-pnote-14-1&quot;&gt;1&lt;/a&gt;]&lt;/sup&gt;&lt;/p&gt;

&lt;pre&gt;
[php]
function soundex_fr($sIn) 
{ 
    static $convVIn, $convVOut, $convGuIn, $convGuOut, $accents; 
    if (!isset($convGuIn)) { 
        $accents = array('É' =&amp;gt; 'E', 'È' =&amp;gt; 'E', 'Ë' =&amp;gt; 'E', 'Ê' =&amp;gt; 'E', 
                    'Á' =&amp;gt; 'A', 'À' =&amp;gt; 'A', 'Ä' =&amp;gt; 'A', 'Â' =&amp;gt; 'A', 'Å' =&amp;gt; 'A', 'Ã' =&amp;gt; 'A', 
                    'Ï' =&amp;gt; 'I', 'Î' =&amp;gt; 'I', 'Ì' =&amp;gt; 'I', 'Í' =&amp;gt; 'I', 
                    'Ô' =&amp;gt; 'O', 'Ö' =&amp;gt; 'O', 'Ò' =&amp;gt; 'O', 'Ó' =&amp;gt; 'O', 'Õ' =&amp;gt; 'O', 'Ø' =&amp;gt; 'O', 
                    'Ú' =&amp;gt; 'U', 'Ù' =&amp;gt; 'U', 'Û' =&amp;gt; 'U', 'Ü' =&amp;gt; 'U', 
                    'Ç' =&amp;gt; 'C', 'Ñ' =&amp;gt; 'N', 'Ç' =&amp;gt; 'S', '¿' =&amp;gt; 'E', 
                    'é' =&amp;gt; 'e', 'è' =&amp;gt; 'e', 'ë' =&amp;gt; 'e', 'ê' =&amp;gt; 'e', 
                    'á' =&amp;gt; 'a', 'à' =&amp;gt; 'a', 'ä' =&amp;gt; 'a', 'â' =&amp;gt; 'a', 'å' =&amp;gt; 'a', 'ã' =&amp;gt; 'a', 
                    'ï' =&amp;gt; 'i', 'î' =&amp;gt; 'i', 'ì' =&amp;gt; 'i', 'í' =&amp;gt; 'i', 
                    'ô' =&amp;gt; 'o', 'ö' =&amp;gt; 'o', 'ò' =&amp;gt; 'o', 'ó' =&amp;gt; 'o', 'õ' =&amp;gt; 'o', 'ø' =&amp;gt; 'o', 
                    'ú' =&amp;gt; 'u', 'ù' =&amp;gt; 'u', 'û' =&amp;gt; 'u', 'ü' =&amp;gt; 'u', 
                    'ç' =&amp;gt; 'c', 'ñ' =&amp;gt; 'n'); 
        $convGuIn  = array( 'GUI', 'GUE', 'GA', 'GO', 'GU', 'SCI', 'SCE', 'SC', 'CA', 'CO', 
                            'CU', 'QU', 'Q', 'CC', 'CK', 'G', 'ST', 'PH'); 
        $convGuOut = array( 'KI', 'KE', 'KA', 'KO', 'K', 'SI', 'SE', 'SK', 'KA', 'KO', 
                            'KU', 'K', 'K', 'K', 'K', 'J', 'T', 'F'); 
        $convVIn   = array( '/E?(AU)/', '/([EA])?[UI]([NM])([^EAIOUY]|$)/', '/[AE]O?[NM]([^AEIOUY]|$)/', 
                            '/[EA][IY]([NM]?[^NM]|$)/', '/(^|[^OEUIA])(OEU|OE|EU)([^OEUIA]|$)/', '/OI/', 
                            '/(ILLE?|I)/', '/O(U|W)/', '/O[NM]($|[^EAOUIY])/', '/(SC|S|C)H/', 
                            '/([^AEIOUY1])[^AEIOUYLKTPNR]([UAO])([^AEIOUY])/', '/([^AEIOUY]|^)([AUO])[^AEIOUYLKTP]([^AEIOUY1])/', '/^KN/', 
                            '/^PF/', '/C([^AEIOUY]|$)/',  '/E(Z|R)$/', 
                            '/C/', '/Z$/', '/(?&amp;lt;!^)Z+/', '/H/', '/W/'); 
        $convVOut  = array( 'O', '1\\3', 'A\\1', 
                            'E\\1', '\\1E\\3', 'O', 
                            'Y', 'U', 'O\\1', '9',- 
                            '\\1\\2\\3', '\\1\\2\\3', 'N', 
                            'F', 'K\\1', 'E', 
                            'S', 'SE', 'S', '', 'V'); 
    } 
    // Si il n'y a pas de mot, on sort immédiatement
    if ( $sIn === '' ) return '    '; 
    // On supprime les accents- 
    $sIn = strtr( $sIn, $accents); 
    // On met tout en minuscule- 
    $sIn = strtoupper( $sIn ); 
    // On supprime tout ce qui n'est pas une lettre
    $sIn = preg_replace( '`[^A-Z]`', '', $sIn ); 
    // Si la chaîne ne fait qu'un seul caractère, on sort avec.
    if ( strlen( $sIn ) === 1 ) return $sIn . '   '; 
    // on remplace les consonnances primaires
    $sIn = str_replace( $convGuIn, $convGuOut, $sIn ); 
    // on supprime les lettres répétitives 
    $sIn = preg_replace( '`(.)\\1`', '$1', $sIn ); 
    // on réinterprète les voyelles 
    $sIn = preg_replace( $convVIn, $convVOut, $sIn); 
 
    // on supprime les terminaisons T, D, S, X (et le L qui précède si existe)
    $sIn = preg_replace( '`L?[TDX]?S?$`', '', $sIn ); 
    // on supprime les E, A et Y qui ne sont pas en première position 
    $sIn = preg_replace( '`(?!^)Y([^AEOU]|$)`', '\\1', $sIn); 
    $sIn = preg_replace( '`(?!^)[EA]`', '', $sIn); 
    return substr( $sIn . '    ', 0, 4); 
} 
&lt;/pre&gt;


&lt;h2&gt;Tests&lt;/h2&gt;


&lt;p&gt;Avec cette implémentation, on a par exemple&amp;nbsp;:&lt;/p&gt;

&lt;table&gt;
  &lt;tr&gt;&lt;th&gt;Mot&lt;/th&gt;&lt;th&gt;Soundex&lt;/th&gt;&lt;th&gt;Mot&lt;/th&gt;&lt;th&gt;Soundex&lt;/th&gt;&lt;/tr&gt;
  &lt;tr&gt;&lt;td&gt;Aymeric&lt;/td&gt;&lt;td&gt;EMRK&lt;/td&gt;&lt;td&gt;Emeric&lt;/td&gt;&lt;td&gt;EMRK&lt;/td&gt;&lt;/tr&gt;
  &lt;tr&gt;&lt;td&gt;Banane&lt;/td&gt;&lt;td&gt;BNN&lt;/td&gt;&lt;td&gt;Bananne&lt;/td&gt;&lt;td&gt;BNN&lt;/td&gt;&lt;/tr&gt;
  &lt;tr&gt;&lt;td&gt;Palper&lt;/td&gt;&lt;td&gt;PLP&lt;/td&gt;&lt;td&gt;Palpé&lt;/td&gt;&lt;td&gt;PLP&lt;/td&gt;&lt;/tr&gt;
  &lt;tr&gt;&lt;td&gt;Palpa&lt;/td&gt;&lt;td&gt;PLP&lt;/td&gt;&lt;td&gt;Poulpe&lt;/td&gt;&lt;td&gt;PULP&lt;/td&gt;&lt;/tr&gt;
  &lt;tr&gt;&lt;td&gt;Mario&lt;/td&gt;&lt;td&gt;MRYO&lt;/td&gt;&lt;td&gt;Marion&lt;/td&gt;&lt;td&gt;MRYO&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;



&lt;p&gt;On a par contre des résultats moyens lorsque des H séparent des voyelles faibles&amp;nbsp;: par exemple &lt;em&gt;Mouahaha&lt;/em&gt; donne MU (contre M avec la version précédente).&lt;/p&gt;


&lt;p&gt;&lt;a name=&quot;test&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;script type=&quot;text/javascript&quot; src=&quot;http://blog.mymind.fr/ajax.js&quot;&gt;&lt;/script&gt;
&lt;script type=&quot;text/javascript&quot;&gt;
function get_soundex()
{
    Ajax.update_html(&quot;sdx_result&quot;, &quot;/soundex_fr.php?text=&quot; + encodeURIComponent(document.getElementById(&quot;sdx_form&quot;).value));
    return false;
}
&lt;/script&gt;
&lt;div&gt;
&lt;form action=&quot;http://blog.mymind.fr/post/2007/03/15/&quot; method=&quot;get&quot; onsubmit=&quot;return false;&quot;&gt;
   &lt;p&gt;
      &lt;strong&gt;Entrer un texte à convertir : &lt;/strong&gt;
      &lt;input type=&quot;text&quot; id=&quot;sdx_form&quot; name=&quot;sdx_form&quot; value=&quot;&quot; /&gt;
      &lt;input type=&quot;submit&quot; name=&quot;submit&quot; value=&quot;Obtenir le Soundex&quot;  onclick=&quot;get_soundex(); return false;&quot;/&gt;&lt;br /&gt;
      &lt;strong&gt;Résultat : &lt;span id=&quot;sdx_result&quot; style=&quot;color: red&quot;&gt; &lt;/span&gt;&lt;/strong&gt;
   &lt;/p&gt;
&lt;/form&gt;
&lt;/div&gt;



&lt;p&gt;&lt;em&gt;N'hésitez pas à faire des tests et à me faire part des résultats qui semblent anormaux.&lt;/em&gt;&lt;/p&gt;


&lt;h2&gt;Conclusion&lt;/h2&gt;


&lt;p&gt;Cette version est loin d'être parfaite, mais elle est plus adaptée au français que celle de Frédéric Brouard. Elle n'est d'ailleurs pas terminée et risque d'évoluer dans un futur proche, en particuliers pour ce qui est des tables de transcriptions et de prédominances.&lt;/p&gt;
&lt;div class=&quot;footnotes&quot;&gt;&lt;h4&gt;Notes&lt;/h4&gt;
&lt;p&gt;[&lt;a href=&quot;http://blog.mymind.fr/post/2007/03/15/Soundex-Francais#rev-pnote-14-1&quot; id=&quot;pnote-14-1&quot;&gt;1&lt;/a&gt;] L'algorithme prend en compte les modifications fournies par les lecteurs et dont vous retrouverez le détail dans les commentaires. Merci donc aux commentateurs, et particulièrement à &lt;a href=&quot;http://azur.ironie.org/&quot;&gt;David&lt;/a&gt;&lt;/p&gt;&lt;/div&gt;
</description>
    
    
    
          <comments>http://blog.mymind.fr/post/2007/03/15/Soundex-Francais#comment-form</comments>
      <wfw:comment>http://blog.mymind.fr/post/2007/03/15/Soundex-Francais#comment-form</wfw:comment>
      <wfw:commentRss>http://blog.mymind.fr/feed/atom/comments/14</wfw:commentRss>
      </item>
    
  <item>
    <title>Démon pour khtml2png</title>
    <link>http://blog.mymind.fr/post/2007/03/14/Demon-pour-khtml2png</link>
    <guid isPermaLink="false">urn:md5:58e9608d38ac069663e670c212792f8b</guid>
    <pubDate>Wed, 14 Mar 2007 18:24:00 +0100</pubDate>
    <dc:creator>Florent Bruneau</dc:creator>
        <category>Polytechnique.org</category>
        <category>C</category><category>Devel</category><category>khtml2png</category><category>khtmld</category>    
    <description>&lt;p&gt;Une fois qu'on a un outils pour faire les vignettes de site, il devient utile de pouvoir automatiser le travail. Pour ceci, il existe un &lt;a href=&quot;http://wiki.goatpron.de/project/khtmld&quot;&gt;démon pour khtml2png&lt;/a&gt;. Malheureusement (encore une fois), cet outil ne correspondait pas exactement à mes besoins. Donc je l'ai partiellement réécrit (mais rien d'extraordinaire).&lt;/p&gt;    &lt;p&gt;Ce démon qui s'appelle &lt;code&gt;khtmld&lt;/code&gt; fonctionne simplement&amp;nbsp;: il lit une file et à chaque entrée dans cette file, il lance &lt;code&gt;khtml2png&lt;/code&gt;. Donc, il y a deux étapes.&lt;/p&gt;


&lt;p&gt;La première consiste à lancer le démon. Pour ceci, j'ai développé un script d'init... qui sera donc probablement lancé par l'utilisateur &lt;code&gt;root&lt;/code&gt;. Il suffit de modifier ce script pour régler les variables en fonction de son installation, puis dans lancer la commande&amp;nbsp;:&lt;/p&gt;
&lt;pre&gt;
[bash]
./init-script.sh start
&lt;/pre&gt;


&lt;p&gt;Ensuite il n'y a plus qu'à donner au démon la liste des actions à réaliser sous la forme&lt;sup&gt;[&lt;a href=&quot;http://blog.mymind.fr/post/2007/03/14/Demon-pour-khtml2png#pnote-13-1&quot; id=&quot;rev-pnote-13-1&quot;&gt;1&lt;/a&gt;]&lt;/sup&gt;&amp;nbsp;:&lt;/p&gt;
&lt;pre&gt;
[bash]
echo &amp;quot;url fichier&amp;quot; &amp;gt;&amp;gt; /tmp/khtmld.spool
&lt;/pre&gt;


&lt;p&gt;Le principal développement que j'ai réalisé sur &lt;code&gt;khtmld&lt;/code&gt; permet de donner au processus de &lt;code&gt;khtml2png&lt;/code&gt; les droits d'un utilisateur du choix de la personne qui a lancé le démon (certes rien d'extraordinaire, mais ça manquait au programme).&lt;/p&gt;


&lt;p&gt;Voilà, donc un système pour automatiser la réalisation de vignettes même si il reste quelques points sur lesquels il faut réfléchir&amp;nbsp;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;on ne veut pas un service ouvert (faire un screenshot est une opération lourde)&lt;/li&gt;
&lt;li&gt;on ne peut pas mettre ce service sur un serveur de prod (il est hors de question de lancer un X en production)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Donc il faut s'orienter sur la réalisation d'un serveur de screenshot avec authentification et modération... non-trivial.&lt;/p&gt;


&lt;p&gt;Pour ceux qui voudraient récupérer ma version, elle est disponible dans &lt;a href=&quot;http://blog.mymind.fr/mind/public/khtml2png/khtmld-fru-last.tar.bz2&quot;&gt;les téléchargements&lt;/a&gt;.&lt;/p&gt;
&lt;div class=&quot;footnotes&quot;&gt;&lt;h4&gt;Notes&lt;/h4&gt;
&lt;p&gt;[&lt;a href=&quot;http://blog.mymind.fr/post/2007/03/14/Demon-pour-khtml2png#rev-pnote-13-1&quot; id=&quot;pnote-13-1&quot;&gt;1&lt;/a&gt;] Attention à ne pas mettre d'espace dans le nom du fichier et dans l'url.&lt;/p&gt;&lt;/div&gt;
</description>
    
    
    
          <comments>http://blog.mymind.fr/post/2007/03/14/Demon-pour-khtml2png#comment-form</comments>
      <wfw:comment>http://blog.mymind.fr/post/2007/03/14/Demon-pour-khtml2png#comment-form</wfw:comment>
      <wfw:commentRss>http://blog.mymind.fr/feed/atom/comments/13</wfw:commentRss>
      </item>
    
  <item>
    <title>Vignette de site</title>
    <link>http://blog.mymind.fr/post/2007/03/12/Vignette-de-site</link>
    <guid isPermaLink="false">urn:md5:1dab6c8c0ffc8170605688465d4e9a44</guid>
    <pubDate>Mon, 12 Mar 2007 10:40:00 +0100</pubDate>
    <dc:creator>Florent Bruneau</dc:creator>
        <category>Polytechnique.org</category>
        <category>khtml2png</category><category>root</category>    
    <description>&lt;p&gt;Pour continuer sur le sujet de &lt;a href=&quot;http://blog.mymind.fr/post/2007/03/10/A-croire-que-certains-le-font-expres&quot;&gt;mon billet précédent&lt;/a&gt;, voici une solution simple pour réaliser des vignettes de site web.&lt;/p&gt;    &lt;h3&gt;Technique&lt;/h3&gt;


&lt;p&gt;Pour faire une vignette d'un site web la solution est simple&amp;nbsp;:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;on lance un navigateur (c'est à dire un moteur de rendu) et on ouvre la page dont on eut le screenshot&lt;/li&gt;
&lt;li&gt;on fait un screenshot, c'est à dire qu'on copie la fenêtre d'affichage dans une image&lt;/li&gt;
&lt;li&gt;on fait du post-traitement sur l'image obtenue pour l'adapter à nos besoins&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Donc, rien de bien compliqué... le problème est maintenant le faire de manière automatisée...&lt;/p&gt;


&lt;p&gt;Il existe divers outils pour le faire... la plupart des sites qui fournissent des services de screenshot sur Internet font leur captures avec Internet Explorer (IE6 la plupart de temps), Exalead le fait avec un moteur KHTML, il existe des outils libres qui le font avec &lt;a href=&quot;http://www.hackdiary.com/archives/000055.html&quot;&gt;Gecko&lt;/a&gt;, avec &lt;a href=&quot;http://www.paulhammond.org/webkit2png/&quot;&gt;WebKit&lt;/a&gt; ou &lt;a href=&quot;http://khtml2png.sourceforge.net/&quot;&gt;KHTML&lt;/a&gt;.&lt;/p&gt;


&lt;p&gt;Personnellement &lt;a href=&quot;http://blog.mymind.fr/post/2007/03/10/A-croire-que-certains-le-font-expres&quot;&gt;j'ai travaillé avec khtml2png&lt;/a&gt;.&lt;/p&gt;


&lt;h3&gt;Mise en place&lt;/h3&gt;


&lt;p&gt;Que ce soit la solution qui utilise Gecko, ou celle qui utilise KHTML, il est nécessaire de faire fonctionner le programme dans un serveur X, car il faut réaliser le rendu dans une fenêtre avant d'en faire une capture. Quand on a un serveur X déjà en place, ça ne pose pas de problème... mais quand on veut faire tourner ça sur un serveur, ça devient plus casse-pied. La solution la plus courante est d'utiliser un &lt;code&gt;vncserver&lt;/code&gt;.&lt;/p&gt;


&lt;p&gt;Le lancement du &lt;code&gt;vncserver&lt;/code&gt; nécessite de respecter quelques contraintes&amp;nbsp;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;il faut que le rendu se fasse en couleur vraies... &lt;code&gt;VNC&lt;/code&gt; offre deux modes&amp;nbsp;: 8bits et 32bits, il faut donc choisir 32bits (qui n'est pas le mode par défaut)&lt;/li&gt;
&lt;li&gt;plus la résolution du serveur X est grande, plus on pourra faire des captures de grande taille (ou faire moins de capture si on fait du pavage). De plus, &lt;code&gt;khtml2png&lt;/code&gt; contient un bug qui entraîne des bandes grises dans la capture si celle-ci est trop grande (par exemple, avec un serveur de 1280x960, je ne peux pas faire de capture 1024x768). C'est un problème sur lequel je vais travailler durant la semaine.&lt;sup&gt;[&lt;a href=&quot;http://blog.mymind.fr/post/2007/03/12/Vignette-de-site#pnote-10-1&quot; id=&quot;rev-pnote-10-1&quot;&gt;1&lt;/a&gt;]&lt;/sup&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ainsi, j'utilise la commande suivante pour lancer mon &lt;code&gt;vncserver&lt;/code&gt;&amp;nbsp;:&lt;/p&gt;
&lt;pre&gt;
[bash]
vncserver :60 -geometry 1280x960 -depth 32
&lt;/pre&gt;


&lt;p&gt;Ensuite, il suffit de faire tourner notre outils dans l'environnement graphique qu'on vient d'obtenir. Avec khtml2png, cela donne&amp;nbsp;:&lt;/p&gt;
&lt;pre&gt;
[bash]
./khtml2png2 --display :60 --nocrashhandler --width 840 --height 600 http://fruneau.rznc.net/ /tmp/test-fru.png
&lt;/pre&gt;


&lt;p&gt;Les différentes options données sont&amp;nbsp;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;display&lt;/code&gt; est une option Qt qui spécifie le serveur X sur lequel il faut faire tourner le programme. En mettant DISPLAY=&quot;:60.0&quot; comme variable d'environnement, on devrait (je n'ai pas testé) obtenir le même résultat&lt;/li&gt;
&lt;li&gt;&lt;code&gt;nocrashhandler&lt;/code&gt; est une option KDE qui indique qu'on ne veut pas que KDE lance le KDE-Crash Handler en cas de plantage... celui-ci irait encombrer le serveur graphique. Etant donné qu'on a pas accès à ce serveur graphique, autant éviter de le remplir de fenêtre inutiles&lt;/li&gt;
&lt;li&gt;&lt;code&gt;width&lt;/code&gt; et &lt;code&gt;height&lt;/code&gt; donne la taille du screenshot&lt;/li&gt;
&lt;li&gt;ensuite on donne l'URL et le nom du fichier (le format est deviné à partir de l'extension)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;La ligne précédente donne le résultat suivant&amp;nbsp;:&lt;/p&gt;


&lt;p&gt;&lt;a href=&quot;http://blog.mymind.fr/public/khtml2png/test-fru.png&quot;&gt;&lt;img src=&quot;http://blog.mymind.fr/public/khtml2png/.test-fru_m.jpg&quot; alt=&quot;Test de screenshots avec KHTML2PNG&quot; style=&quot;display:block; margin:0 auto;&quot; /&gt;&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;Attention tout de même, la version 2.5.0 (et sans doute les précédentes) de &lt;code&gt;khtml2png&lt;/code&gt; est bloquante dans le cas où elle rencontre un type mime non supporté par l'installation actuelle de KDE. Il vaut mieux utiliser &lt;a href=&quot;http://blog.mymind.fr/public/khtml2png/khtml2png-fru-last.tar.bz2&quot;&gt;ma dernière version&lt;/a&gt; qui corrige ce bug. Dans tous les cas, en installant les modules adaptés (comme flash), on obtient un meilleur rendu.&lt;/p&gt;
&lt;div class=&quot;footnotes&quot;&gt;&lt;h4&gt;Notes&lt;/h4&gt;
&lt;p&gt;[&lt;a href=&quot;http://blog.mymind.fr/post/2007/03/12/Vignette-de-site#rev-pnote-10-1&quot; id=&quot;pnote-10-1&quot;&gt;1&lt;/a&gt;] Edit 12 mars à 23h40 : Ce problème est corrigé dans &lt;a href=&quot;http://blog.mymind.fr/public/khtml2png/khtml2png-fru-last.tar.bz2&quot;&gt;la toute dernière version&lt;/a&gt;. On peut de fait envisager d'utiliser un serveur X plus petit sans bug, le rendu reste plus rapide lorsque le serveur X est suffisamment grand.&lt;/p&gt;&lt;/div&gt;
</description>
    
    
    
          <comments>http://blog.mymind.fr/post/2007/03/12/Vignette-de-site#comment-form</comments>
      <wfw:comment>http://blog.mymind.fr/post/2007/03/12/Vignette-de-site#comment-form</wfw:comment>
      <wfw:commentRss>http://blog.mymind.fr/feed/atom/comments/10</wfw:commentRss>
      </item>
    
  <item>
    <title>A croire que certains le font exprès !</title>
    <link>http://blog.mymind.fr/post/2007/03/10/A-croire-que-certains-le-font-expres</link>
    <guid isPermaLink="false">urn:md5:d6e16a34562220853a6bcc75151964c7</guid>
    <pubDate>Sat, 10 Mar 2007 19:57:00 +0100</pubDate>
    <dc:creator>Florent Bruneau</dc:creator>
        <category>Polytechnique.org</category>
        <category>Cpp</category><category>Devel</category><category>khtml2png</category><category>Qt</category><category>Sécurité</category>    
    <description>&lt;p&gt;Depuis trois jours, je travaille sur la mise ne place d'un outil permettant de faire des aperçus graphiques de site web (des vignettes façon &lt;a href=&quot;http://www.exalead.fr&quot;&gt;Exalead&lt;/a&gt; par exemple). C'est une fonctionnalité très à la mode... et c'est aussi un bon moyen d'avoir un aperçu d'un site. Donc dans ce cadre, j'ai commencé à travailler sur &lt;a href=&quot;http://khtml2png.sourceforge.net&quot;&gt;khtml2png&lt;/a&gt;. Malheureusement, comme il ne correspondait pas exactement à mes besoins, j'ai commencé à en modifier le code source... et j'ai eu quelques surprises&amp;nbsp;!&lt;/p&gt;    &lt;h3&gt;Strings&lt;/h3&gt;


&lt;p&gt;Ma première (mauvaise) surprise a été de constater que le code était loin d'être propre. Il s'agit d'un programme écrit avec la bibliothèque &lt;a href=&quot;http://www.trolltech.com/qt&quot;&gt;Qt&lt;/a&gt; (KHTML oblige), et pourtant la gestion des chaînes de caractère est faite pour moitié avec QString, pour moitié avec l'API C... sans vérification de la taille des buffers.&lt;/p&gt;


&lt;p&gt;Par exemple&amp;nbsp;:&lt;/p&gt;
&lt;pre&gt;
[cpp]
QString filename = &amp;quot;/tmp/khtml2png.png&amp;quot;;
int g = sprintf(nrStr,&amp;quot;_x%iy%i&amp;quot;,xNr,yNr);
nrStr[g]='\\0';
filename+=QString(nrStr);
&lt;/pre&gt;


&lt;p&gt;Quitte à utiliser l'API C autant le faire proprement, en vérifiant la taille du buffer (dans le cas présent, le buffer nrStr avait une taille de 10)... mais en plus pourquoi faire ça de cette manière alors que Qt fournit l'API suffisant pour coder ces 4 lignes sans le moindre risque de buffer overflow&amp;nbsp;?&lt;/p&gt;


&lt;p&gt;//
&lt;a href=&quot;http://blog.mymind.fr/post/2007/03/10/cpp&quot; title=&quot;cpp&quot;&gt;cpp&lt;/a&gt;
QString filename = QString( &quot;/tmp/khtml2png.png_x%1y%2&quot;).arg(xNr).arg(yNr);
//&lt;/p&gt;


&lt;p&gt;Ensuite (toujours dans la gestion des chaînes de caractères), la méthode pour éviter le buffer overflow était le &quot;Je fais un gros buffer, au moins je suis sûr que ça ne débordera pas&quot;... mais le problème, c'est que ça peut déborder&amp;nbsp;!&lt;/p&gt;

&lt;pre&gt;
[cpp]
char 	[5000], //command line string

memset(cmd,0,sizeof(cmd));

//append the row images from top to bottom to one image
strcpy(cmd,&amp;quot;convert &amp;quot;);

for (int y=0; y &amp;lt; yNr; y++)
    sprintf(cmd,&amp;quot;%s /tmp/khtml2png.png_r%i&amp;quot;,cmd,y);
		
sprintf(cmd,&amp;quot;%s -append %s&amp;quot;,cmd,args-&amp;gt;arg(1));
system(cmd);
&lt;/pre&gt;


&lt;p&gt;Dans ce cas précis, &lt;code&gt;args-&amp;gt;arg(1)&lt;/code&gt; est contrôlé par l'utilisateur (c'est en fait le fichier destination de la capture demandée... le &lt;code&gt;sprintf&lt;/code&gt; est donc une &lt;strong&gt;erreur impardonnable&lt;/strong&gt;... sans compter qu'en plus cet argument qui est passé à un exécutable externe sans le moindre check sur le contenu de la chaîne. On risque non seulement le buffer overflow, mais également l'injection de code dans le &lt;code&gt;system&lt;/code&gt; (par exemple, je peux appeler mon fichier &lt;code&gt;fichier;sh&lt;/code&gt;, ça me lancera un shell avec les droits de l'utilisateur qui a lancé le programme.&lt;/p&gt;


&lt;p&gt;Une solution (non testée) pourrait être&amp;nbsp;:&lt;/p&gt;

&lt;pre&gt;
[cpp]
QProcess process(&amp;quot;convert&amp;quot;);
for (int y=0 ; y &amp;lt; yNr ; y++) {
    process.addArgument(QString(&amp;quot;/tmp/khtml2png.png_r%i&amp;quot;).arg(y);
}
process.addArgument(&amp;quot;-append&amp;quot;);
process.addArgument(args-&amp;gt;arg(1));
process.start();
while (process.isRunning()) {
    wait(10); // nombre choisi aléatoirement
}
&lt;/pre&gt;


&lt;p&gt;Cette solution a le mérite&amp;nbsp;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;d'être safe car elle ne permet pas d'injecter des commandes dans notre code&lt;/li&gt;
&lt;li&gt;d'être safe car elle ne permet pas de buffer overflow&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Bien sûr ceci repose sur la confiance qu'on peut avoir en Qt...&lt;/p&gt;



&lt;h3&gt;Images&lt;/h3&gt;


&lt;p&gt;Pour générer le screenshot, khtml2png fait plusieurs captures dans une fenêtre en scrollant à l'intérieur de manière à recouvrir une zone aillant la taille demandée par l'utilisateur. C'est très bien... malheureusement, encore une fois je me demande quel est l'intérêt d'utiliser Qt dans le cas présent. La technique de khtml2png (version 2.5.0) est de faire une capture d'écran à chaque fois... puis de la stocker dans un fichier temporaire indexé avec le numéro du morceau en X et en Y.&lt;/p&gt;


&lt;p&gt;Une fois tous les morceaux obtenus, le programme utilise &lt;code&gt;convert&lt;/code&gt; de ImageMagick pour coller les morceaux de chaque ligne, puis une deuxième fois (enfin, ce n'est pas la deuxième fois, mais la deuxième boucle) pour coller les différentes lignes et convertir dans le format voulu (c'est en fait le dernier morceau de code que j'ai collé ci-dessus).&lt;/p&gt;


&lt;p&gt;Pourquoi faire si compliqué&amp;nbsp;?&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;On ne peut pas lancer deux fois khtml2png en même temps (le programme utilisant toujours le même nom pour les fichiers temporaires)&lt;/li&gt;
&lt;li&gt;Qt aussi est capable d'enregistrer les fichiers dans différents formats... pas besoin de ImageMagick pour ça&lt;/li&gt;
&lt;li&gt;khtml2png dépend d'un programme extérieur qu'il n'est pas certain de trouver sur les machines des utilisateurs...&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ma technique est beaucoup plus simple, ne nécessite de lancer &lt;strong&gt;aucun&lt;/strong&gt; programme externe... et en plus se révèle plus légère en quantité de mémoire (parce que j'utilise des pointeurs au lieu de recopier les images dans tous les sens en en créant plusieurs instances à chaque fois)&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;tout d'abord je crée une image vierge de la taille voulue par l'utilisateur&lt;/li&gt;
&lt;li&gt;je fais les captures du site et au lieu de les stockers dans un fichier, je les colle au bon endroit dans mon image&lt;/li&gt;
&lt;li&gt;j'utilise Qt pour enregistrer l'image au format désiré par l'utilisateur (en fonction de l'extension)...&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Ainsi, j'ai supprimé la &lt;em&gt;totalité&lt;/em&gt; du code qui utilisait des traitements de chaînes de caractères (qui n'étaient autres que les appels à &lt;code&gt;convert&lt;/code&gt;), ce qui supprime toutes les failles dont j'ai parlé ci-dessus... en gardant les mêmes fonctionnalités que la version publique du programme.&lt;/p&gt;



&lt;h3&gt;Besoins particuliers&lt;/h3&gt;


&lt;p&gt;J'ai également rencontré un besoin qui a mon avis n'était pas prévu par les développeurs du programme&amp;nbsp;: étant donné que je le fais tourner dans un environnement graphique inaccessible (en fait dans un &lt;code&gt;vncserver&lt;/code&gt;), je ne vois pas ce qu'il se passe. Or, KHTML déclenche automatiquement une boîte de dialogue modale dès qu'il rencontre un objet d'un type mime inconnu... dans mon cas il s'agissait d'un applet active-x qui traîne sur le &lt;a href=&quot;http://www.polytechnique.fr&quot;&gt;site de l'Ecole Polytechnique&lt;/a&gt;.&lt;/p&gt;


&lt;p&gt;J'ai donc cherché pendant 2 jours comment contourner le programme&amp;nbsp;: il me faut pouvoir avoir accès à la boîte de dialogue créée, et la supprimer puisque l'API de &lt;a href=&quot;http://api.kde.org/3.1-api/khtml/html/classKHTMLPart.html&quot;&gt;KHML&lt;/a&gt; ne permet pas de désactiver ces intrusions directement depuis le programme.&lt;/p&gt;


&lt;p&gt;Tout d'abord j'ai cru qu'en réimplémentant la méthode &lt;code&gt;showError&lt;/code&gt; ça marcherait... mais en fait non, elle n'est pas appelée dans le cas présent, c'est uniquement généré à l'intérieur du moteur KHTML... la classe &lt;code&gt;KHTMLPart&lt;/code&gt; n'est jamais notifiée de l'apparition de cette boîte de dialogue.&lt;/p&gt;


&lt;p&gt;J'ai donc cherché qui pouvait bien être le père de ce &lt;code&gt;QMessageBox&lt;/code&gt;... et en fait, c'est le &lt;code&gt;KHTMLPart::view()&lt;/code&gt;. N'ayant pas vraiment la possibilité de substituer à cet objet, un objet de mon choix, j'ai ajouté un &lt;code&gt;eventFilter&lt;/code&gt; qui filtre les messages reçus par la fenêtre de rendu... et lorsque apparaît un &lt;code&gt;QDialog&lt;/code&gt; (classe mère de &lt;code&gt;QMessageBox&lt;/code&gt;), je me charge directement de le rendre non modal, de le découpler du view et de le détruire)... et là, victoire !!!&lt;/p&gt;


&lt;p&gt;Je comprends parfaitement que les développeurs n'aient pas pensé que ces boîtes de dialogues puissent être gênantes car ils doivent travailler dans un environnement graphique et les voir... moi non&amp;nbsp;! Mais en fait, ce que je comprends moins bien c'est qu'ils ont clairement déjà rencontré le problème dans le cadre de la réalisation du screenshot. En effet, on y trouve le code (pour sélectionner les fenêtres-filles qui méritent d'apparaître dans le screenshot)&amp;nbsp;:&lt;/p&gt;

&lt;pre&gt;
[cpp]
if ( child-&amp;gt;isWidgetType() &amp;amp;&amp;amp;
    ((QWidget *)child)-&amp;gt;geometry().intersects( w-&amp;gt;rect() ) &amp;amp;&amp;amp;
    ! child-&amp;gt;inherits( &amp;quot;QDialog&amp;quot; ) ) {
&lt;/pre&gt;


&lt;p&gt;Les développeurs ont donc déjà rencontré des QDialog... pourquoi ne pas déjà les avoir désactivés&amp;nbsp;?&lt;/p&gt;



&lt;h3&gt;Conclusion&lt;/h3&gt;


&lt;p&gt;J'ai donc maintenant un khtml2png adapté à mes besoins. Je vais soumettre mon code aux développeurs du projet.&lt;/p&gt;


&lt;p&gt;À savoir qu'à l'heure actuelle (et je n'ai pas fini le nettoyage), mon code fait 80 lignes de moins que le code dont je suis parti... et ce malgré l'ajout de fonctionnalités.&lt;/p&gt;


&lt;p&gt;&lt;a href=&quot;http://blog.mymind.fr/mind/public/khtml2png/khtml2png-fru-last.tar.bz2&quot;&gt;Télécharger la dernière version&lt;/a&gt;&lt;/p&gt;</description>
    
    
    
          <comments>http://blog.mymind.fr/post/2007/03/10/A-croire-que-certains-le-font-expres#comment-form</comments>
      <wfw:comment>http://blog.mymind.fr/post/2007/03/10/A-croire-que-certains-le-font-expres#comment-form</wfw:comment>
      <wfw:commentRss>http://blog.mymind.fr/feed/atom/comments/9</wfw:commentRss>
      </item>
    
  <item>
    <title>Polytechnique.org en retard ?</title>
    <link>http://blog.mymind.fr/post/2007/03/01/Polytechniqueorg-en-retard</link>
    <guid isPermaLink="false">urn:md5:ad2416e637423f187d754928f7039285</guid>
    <pubDate>Thu, 01 Mar 2007 16:28:00 +0100</pubDate>
    <dc:creator>Florent Bruneau</dc:creator>
        <category>Polytechnique.org</category>
        <category>Devel</category><category>Ergonomie</category><category>platal</category>    
    <description>&lt;p&gt;&lt;a href=&quot;https://www.polytechnique.org&quot;&gt;Polytechnique.org&lt;/a&gt; est, comme l'indique le nom du logiciel OpenSource sur lequel le site repose (&lt;a href=&quot;http://opensource.polytechnique.org/platal/&quot;&gt;plat/al&lt;/a&gt;), une plateforme pour les anciens élèves de l'&lt;a href=&quot;http://www.polytechnique.fr&quot;&gt;École&lt;/a&gt;... c'est à dire que Polytechnique.org devrait&amp;nbsp;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;apporter de la vie dans la communauté&lt;/li&gt;
&lt;li&gt;faciliter les mises en relation entre les membres&lt;/li&gt;
&lt;li&gt;offrir des services à la communauté&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Polytechnique.org offre ces trois services... mais pourtant moins d'un utilisateur sur 5 se connecte régulièrement au site (une fois par semaine - et le plus souvent c'est pour accéder à des sites qui utilisent l'authentification de Polytechnique.org), environ un sur 3 se connecte une fois par mois, et un sur 3 ne se connecte tout bonnement jamais. Face à cela, on dénombre un grand nombre d'utilisateurs qui sont intéressés par un groupe Polytechnique sur des outils comme Linked-In... pourquoi&amp;nbsp;? parce que le rôle de Polytechnique.org n'est rempli qu'à moitié et ce pour plusieurs raisons&amp;nbsp;:&lt;/p&gt;    &lt;h2&gt;Ergonomie&lt;/h2&gt;


&lt;p&gt;La catastrophe sur Polytechnique.org c'est l'ergonomie... ce n'est certes pas la fin du monde (on peut encore s'y retrouver), mais le site ne donne pas envie de s'y arrêter. Je vais essayer de détailler les divers problèmes&amp;nbsp;:&lt;/p&gt;


&lt;h3&gt;Le menu&lt;/h3&gt;


&lt;p&gt;&lt;a href=&quot;http://blog.mymind.fr/mind/public/screenshots/menu.jpg&quot;&gt;&lt;img src=&quot;http://blog.mymind.fr/mind/public/screenshots/.menu_t.jpg&quot; alt=&quot;Menu du site&quot; style=&quot;float:left; margin: 0 1em 1em 0;&quot; /&gt;&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;Le menu de Polytechnique.org témoigne de la richesse du site&amp;nbsp;: il est long. Comme tout menu, il a fallu choisir l'ordre des entrées. Le choix de cet ordonnancement laisse clairement à désirer. Par exemple&amp;nbsp;: où chercher un lien vers l'annuaire&amp;nbsp;? Dans &lt;em&gt;Services&lt;/em&gt; ou &lt;em&gt;Communauté X&lt;/em&gt;&amp;nbsp;? Etant un utilisateur du site depuis longtemps, je mets toujours autant de temps avant de trouver ce que je cherche dans le menu.&lt;/p&gt;


&lt;p&gt;Peut-être devrions-nous revoir tout bonnement l'organisation du menu, par exemple avec des catégories plus parlantes, par exemple un premier jet pourrait donner (mais ça mérite d'être travaillé)&amp;nbsp;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Mes emails
&lt;ul&gt;
&lt;li&gt;Mes redirections&lt;/li&gt;
&lt;li&gt;Mes abonnements&lt;/li&gt;
&lt;li&gt;Antispam&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;Annuaire
&lt;ul&gt;
&lt;li&gt;Rechercher&lt;/li&gt;
&lt;li&gt;Mon profil&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;Communauté
&lt;ul&gt;
&lt;li&gt;Annonces&lt;/li&gt;
&lt;li&gt;Lettre mensuelle&lt;/li&gt;
&lt;li&gt;Discussions&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;Emploi&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;Deux sites séparés&lt;/h3&gt;


&lt;p&gt;Polytechnique.org c'est aussi Polytechnique.net&amp;nbsp;: le site des groupes. Le fait d'avoir 2 sites totalement séparés pose un grand nombre de problème, depuis le partage de l'authentification, jusqu'à la cohérence des données.&lt;/p&gt;


&lt;p&gt;Il faut clairement envisager de fusionner les deux sites dans un avenir plus ou moins proche si on veut que les utilisateurs s'y retrouvent. De la même manière qu'on peut réorganiser le menu, on peut réorganiser l'accès général au site... Par exemple, on pourrait envisager de créer un menu tabulé&amp;nbsp;: dans chaque tab, on retrouve un menu spécifique. Par exemple, on pourrait, au lieu d'avoir un menu à deux niveaux, des tabs (Mes emails, Annuaire, Annonces...) et dans chaque tabs un menu spécifique donnant accès aux fonctionnalités correspondantes.&lt;/p&gt;


&lt;p&gt;&lt;strong&gt;Avantages :&lt;/strong&gt; On aurait ainsi un proprement rangé... le site étant modulaire, chaque module pourrait lui même générer ses entrées dans les menus/tabs, l'intégration des Polytechnique.net à Polytechnique.org ne serait que l'ajout d'un tab &quot;Mes groupes X&quot;&lt;br /&gt;
&lt;strong&gt;Défauts :&lt;/strong&gt; On a pas d'accès facile à l'ensemble des fonctionnalités... c'est le seul défaut (pas des moindres) que je vois.&lt;/p&gt;


&lt;p&gt;C'est une solution qui mérite qu'on s'y intéresse... le choix de la meilleur ergonomie possible nécessitera de toute façon des tests.&lt;/p&gt;


&lt;h3&gt;Dinosaure&lt;/h3&gt;


&lt;p&gt;&lt;strong&gt;Toutes&lt;/strong&gt; les skins de Polytechnique.org sont carrées... En particulier la skin par défaut a très mal vieilli. Les polices y sont énormes, toutes les informations sont dans des boîtes carrées. Le site à sérieusement besoin d'une petite cure de jouvence pour retrouver un design aguichant.&lt;/p&gt;



&lt;h2&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/Web_2.0&quot;&gt;Web 2.0&lt;/a&gt;&lt;/h2&gt;


&lt;p&gt;Dire que son site est Web 2.0 est à la mode... Polytechnique.org ne l'est pas vraiment, et ceci pour diverses raisons.&lt;/p&gt;


&lt;h3&gt;La pointe de la technologie&lt;/h3&gt;


&lt;p&gt;Tout d'abord le site est trop statique. Quand la page d'accueil est chargée, elle est chargée... à la rigueur on peut fermer quelques boites mais c'est tout. Le site est statique... Le Web actuel s'ouvre vers des pages vivantes avec lesquels l'utilisateur peut interagir... Le plus souvent cela repose sur des technologies du type Ajax. Polytechnique.org utilise un peu Ajax, mais on va dire que c'est &lt;em&gt;artisanal&lt;/em&gt;... il y a un gros boulot à faire de ce côté si on veut que le site devienne un outil convivial pour l'utilisateur.&lt;/p&gt;


&lt;p&gt;Une autre technologie qui fait le succès du web est l'édition dynamique de contenu. Polytechnique.org utilise du wiki pour l'édition de sa documentation... mais, en grande majorité, ceci se limite à la simplification du travail d'administration du site. Par contre pour tous les contenus dynamiques, nous n'offrons que du texte brut à nos utilisateurs. Là où se trouve le vrai problème, c'est sur l'outil d'hébergement que nous offrons aux groupes&amp;nbsp;: &lt;a href=&quot;http://opensource.polytechnique.org/diogenes&quot;&gt;Diogenes&lt;/a&gt;.&lt;/p&gt;


&lt;p&gt;Diogenes a mal vieilli parce que sont apparus face à lui des outils plus simples à utiliser. Aujourd'hui Diogenes mérite un gros décrassage si on veut pouvoir continuer à l'utiliser.&lt;/p&gt;


&lt;h3&gt;Vie sociale&lt;/h3&gt;


&lt;p&gt;Là où Polytechnique.org est le plus en retard, c'est sur les outils qui permettent de donner vie à la communauté. Certes nous avons nos forums, mais ils ne sont pas vraiment mis en avant sur le site... Nous n'avons en effet nulle part des liens qui permettent aux utilisateurs de commenter l'actualité de la communauté. Pour améliorer ça, nous pourrions par exemple associer à chaque annonce une discussion sur un forum dédié (discussion qui serait initiée par la publication de l'annonce en question sur le forum en plus de la page d'accueil).&lt;/p&gt;


&lt;h2&gt;Conclusion&lt;/h2&gt;


&lt;p&gt;Voilà, tout ceci un peu en vrac pour dire que nous avons des outils, de très bons outils même, largement en avance sur l'utilisation qu'en font les utilisateurs. Malheureusement nous souffrons d'un manque d'adaptation à l'utilisateur&amp;nbsp;: l'utilisateur recherche avant tout un site facile à utiliser sur lequel il puisse faire ce qu'il cherche le plus rapidement possible.&lt;/p&gt;


&lt;p&gt;Il est nécessaire de réorienter fortement le développement vers l'ergonomie dans les mois qui viennent&amp;nbsp;: à terme il faudrait que les utilisateurs puissent utiliser Polytechnique.org comme une page d'accueil conviviale offrant des services tels qu'on en trouve couramment sur les principaux portails (recherche Internet, outils de gestion &lt;a href=&quot;http://en.wikipedia.org/wiki/Personal_information_manager&quot;&gt;PIM&lt;/a&gt;...) tout en offrant les services de base d'une plateforme pour alumnis.&lt;/p&gt;</description>
    
    
    
          <comments>http://blog.mymind.fr/post/2007/03/01/Polytechniqueorg-en-retard#comment-form</comments>
      <wfw:comment>http://blog.mymind.fr/post/2007/03/01/Polytechniqueorg-en-retard#comment-form</wfw:comment>
      <wfw:commentRss>http://blog.mymind.fr/feed/atom/comments/7</wfw:commentRss>
      </item>
    
  <item>
    <title>Un premier bilan sur la sécurité...</title>
    <link>http://blog.mymind.fr/post/2007/02/27/Un-premier-bilan-sur-la-securite</link>
    <guid isPermaLink="false">urn:md5:5debc753ced5c7a6159d5a3b800b820b</guid>
    <pubDate>Tue, 27 Feb 2007 16:47:00 +0100</pubDate>
    <dc:creator>Florent Bruneau</dc:creator>
        <category>Polytechnique.org</category>
        <category>platal</category><category>Sécurité</category><category>Usurpation</category>    
    <description>&lt;p&gt;Sans entrer dans les détails du fonctionnement des filtres de protection de &lt;a href=&quot;https://www.polytechnique.org&quot;&gt;Polytechnique.org&lt;/a&gt; (je laisse ce plaisir à ceux qui auront le courage de lire le code de &lt;a href=&quot;http://opensource.polytechnique.org/platal/&quot;&gt;plat/al&lt;/a&gt;), nous avons ces derniers mois fortement amélioré les outils de surveillance. Alors qu'il y a encore un an, nous ne détections que quelques usurpations par an, nous sommes actuellement à environ une usurpation détectée par semaine.&lt;/p&gt;    &lt;h3&gt;De quoi s'inquiéter&amp;nbsp;?&lt;/h3&gt;


&lt;p&gt;Certes la fréquence des usurpations est plus importante que nous pensions mais plus on a d'outils de protection, plus on a d'usurpations... non seulement parce qu'on en détecte plus, mais aussi parce que d'une certaine manière, on provoque les usurpations. En effet, lorsque nous détectons une usurpation, nous fermons le compte. Lorsque l'usurpateur se rend compte qu'il a perdu l'accès, il usurpe (ou tout au moins tente d'usurper) un autre compte.&lt;/p&gt;


&lt;p&gt;Ainsi, nous avions détecté un usurpateur mi-janvier. Suite à celà il s'est réinscrit une fois. Nous l'avons trouvé et nous avons redésactivé le compte... il s'est de nouveau réinscrit, mais pour une raison que je ne comprends pas, nous avons manqué cette inscription... mais finalement, il a oublié son compte, et hier il a retenté de se connecter. Mais cette fois-ci son IP était bannie, et c'est donc 2 comptes qu'il a tenté d'usurper tour à tour.&lt;/p&gt;


&lt;p&gt;C'est donc &lt;strong&gt;5&lt;/strong&gt; comptes pour une personne... pas mal non&amp;nbsp;? Nous n'aurions pas détecté la première de ces usurpations, il en serait resté à une seule.&lt;/p&gt;


&lt;p&gt;De plus, la plus grande majorité des comptes usurpés sont abandonnés par leur usurpateur dans le mois qui suit l'inscription. Nous détectons donc majoritairement des comptes abandonnés. Les usurpations sont donc gênantes, mais certainement pas inquiétantes. A force de tests, nous épurons petit-à-petit la base.&lt;/p&gt;


&lt;p&gt;Donc, je ne pense pas qu'il y ait de quoi s'inquiéter de la fréquence des usurpations et la proportion de comptes usurpés de notre base.&lt;/p&gt;


&lt;h3&gt;Sécuriser une inscription peu sélective&lt;/h3&gt;


&lt;p&gt;La faille de Polytechnique.org est la faible sélectivité de son système d'inscription. Le problème est que nous avons une base des alumnis et qu'il faut faire correspondre chaque entrée à la bonne personne physique. Il est quasiment trivial pour n'importe qui de trouver les informations nécessaire pour remplir le formulaire d'inscription... comment s'assurer que finalement il s'agit bien de la bonne personne&amp;nbsp;?&lt;/p&gt;


&lt;p&gt;Nous avons donc plusieurs niveaux de filtrages&amp;nbsp;:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Le premier consiste à vérifier autant que possible la crédibilité des informations données dans le formulaire d'inscription&lt;/li&gt;
&lt;li&gt;Le deuxième consiste à réaliser un filtrage &quot;humain&quot;... il suffit de vérifier pour chaque inscription les informations de chaque inscription&lt;/li&gt;
&lt;li&gt;Traitement comportemental. C'est le filtrage qu'il nous faut améliorer actuellement&lt;/li&gt;
&lt;li&gt;La vérification de cohérence de la base de donnée (à partir d'idées données de temps en temps, on défini un critère d'usurpation &lt;em&gt;probable&lt;/em&gt;, et on check)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Là où nous avons fait beaucoup de progrès, c'est sur le points 1 et 2&amp;nbsp;: nous sommes désormais en mesure de contrer la plupart des usurpations dès l'inscription alors qu'il y a quelques mois, nous n'avions que le point 4... c'est à dire des vérifications éparses.&lt;/p&gt;


&lt;h3&gt;Nos points faibles... et nos évolutions&lt;/h3&gt;


&lt;p&gt;Tout d'abord, si je me permets d'écire ce billet, c'est que je pense que nous sommes suffisamment sécurisés pour contrer les petits plaisantins qui en lisant ce texte voudraient tenter une usurpation... ce n'est pas de la provocation, mais un bilan.&lt;/p&gt;


&lt;p&gt;Nos points faibles sont actuellement dans l'analyse de la base établie avant la mise en place de nos filtres. Il s'agit donc d'améliorer les points 3 et 4 indiqués précédemment. Le 3 repose principalement sur un facteur humain&amp;nbsp;: non seulement personne n'est parfait, et l'usurpateur fera quasiment toujours une erreur, mais en plus il sera en contact avec d'autres utilisateurs et c'est au travers de ses échanges (que ce soit via une fiche de l'annuaire ou via des discussions par mail ou sur un forum) que nous pourrons envisager de le cerner.&lt;/p&gt;


&lt;p&gt;La vérification de la base de données nécessite des idées... mais également des informations&amp;nbsp;: nous pouvons vérifier la cohérence de notre base sur le fondement de quelques idées, mais rien ne vaut la comparaison avec des informations que nous savons exactes. Obtenir ces informations est le point bloquant... et là encore il y a un facteur humain.&lt;/p&gt;


&lt;p&gt;Nous ne pouvons donc qu'espérer que la prochaine fusion de notre annuaire avec celui de l'&lt;a href=&quot;http://www.polytechnicien.com&quot;&gt;AX&lt;/a&gt;, qui est vérifié par des secrétaires qui ont les moyens matériels et temporels de le faire, sera le meilleur moyen de nettoyer notre annuaire.&lt;/p&gt;</description>
    
    
    
          <comments>http://blog.mymind.fr/post/2007/02/27/Un-premier-bilan-sur-la-securite#comment-form</comments>
      <wfw:comment>http://blog.mymind.fr/post/2007/02/27/Un-premier-bilan-sur-la-securite#comment-form</wfw:comment>
      <wfw:commentRss>http://blog.mymind.fr/feed/atom/comments/6</wfw:commentRss>
      </item>
    
  <item>
    <title>Un client RSS pour lire les Forums NNTP et les Mailing-Lists...</title>
    <link>http://blog.mymind.fr/post/2007/02/25/Un-client-RSS-pour-lire-les-Forums-NNTP-et-les-Mailing-Lists</link>
    <guid isPermaLink="false">urn:md5:ccec4d2a8525474fc851b3082b3f91ad</guid>
    <pubDate>Sun, 25 Feb 2007 19:05:00 +0100</pubDate>
    <dc:creator>Florent Bruneau</dc:creator>
        <category>Polytechnique.org</category>
        <category>Banana</category><category>Devel</category><category>Mailing-Lists</category><category>NNTP</category><category>PHP</category><category>RSS</category>    
    <description>    &lt;p&gt;Si il y a un bout de code dont je suis content au sein de &lt;a href=&quot;https://www.polytechnique.org&quot;&gt;Polytechnique.org&lt;/a&gt;, c'est &lt;a href=&quot;http://opensource.polytechnique.org/banana/&quot;&gt;Banana&lt;/a&gt;. Banana est à l'origine un client Web pour le protocole NNTP (c'est à dire le protocole utilisé par Usenet). Depuis sa dernière version (la 1.5), Banana est capable d'utiliser n'importe quel protocole comme source (les protocoles actuellement implémentés étant le NNTP et la lecture de MBox, mais on pourrait envisager d'ajouter le support des Maildir ou d'IMAP sans problème), ainsi, à Polytechnique.org, nous utilisons Banana pour offrir une plateforme Web vers &lt;a href=&quot;https://www.polytechnique.org/banana&quot;&gt;nos forums&lt;/a&gt; et pour mettre en ligne les archives des Mailing-Lists que nous hébergeons.&lt;/p&gt;


&lt;p&gt;Banana est à mon avis un bon outils&amp;nbsp;: il permet un rendu plus que correct de la plupart des mails HTML (même ceux dont le formatage est défini dans une feuille de style), il affiche les discussions proprement et rapidement (grâce à un système de cache du côté serveur). C'est donc un gros plus en comparaison des interfaces habituelles de consultation d'archives de Mailing-List qu'on peut trouver sur Internet... et puis, ce n'est pas un forum php, pas de fioritures à la phpbb&amp;nbsp;: Banana est clair, lisible et rapide... et facile à installer. Pour s'en convaincre, il suffit de regarder la &lt;a href=&quot;http://opensource.polytechnique.org/viewsvn/filedetails.php?repname=Banana&amp;amp;path=/trunk/examples/index.php&amp;amp;rev=0&amp;amp;sc=1&quot;&gt;fichier d'exemple&lt;/a&gt; qui fournit un banana totalement fonctionnel (à chacun ensuite d'y ajouter sa couche d'authentification si nécessaire).&lt;/p&gt;


&lt;p&gt;La grande nouveauté de la prochaine version de Banana est l'intégration de flux RSS... ainsi il sera possible de lire les forums sans se connecter au site et sans client news, ou de suivre les discussions des mailing-lists sans relever son courrier (le premier des 2 cas étant certainement le plus intéressant). Pour les utilisateurs de Polytechnique.org, la fonctionnalité est d'ores et déjà disponible sur &lt;a href=&quot;http://dev.m4x.org/~x2003bruneau/banana&quot;&gt;ma version de développement&lt;/a&gt;. Deux types de flux son disponibles&amp;nbsp;: soit un flux par groupe, soit un flux regroupant tous les groupes auxquels on est abonné.&lt;/p&gt;</description>
    
    
    
          <comments>http://blog.mymind.fr/post/2007/02/25/Un-client-RSS-pour-lire-les-Forums-NNTP-et-les-Mailing-Lists#comment-form</comments>
      <wfw:comment>http://blog.mymind.fr/post/2007/02/25/Un-client-RSS-pour-lire-les-Forums-NNTP-et-les-Mailing-Lists#comment-form</wfw:comment>
      <wfw:commentRss>http://blog.mymind.fr/feed/atom/comments/4</wfw:commentRss>
      </item>
    
  <item>
    <title>Pourquoi faire propre quand on peut faire sale ?</title>
    <link>http://blog.mymind.fr/post/2007/02/23/Pourquoi-faire-propre-quand-on-peut-faire-sale</link>
    <guid isPermaLink="false">urn:md5:497ef5042d883f45e02684065d1fd7bd</guid>
    <pubDate>Fri, 23 Feb 2007 23:08:00 +0100</pubDate>
    <dc:creator>Florent Bruneau</dc:creator>
        <category>Polytechnique.org</category>
        <category>Devel</category><category>HTML</category><category>IE6</category><category>platal</category>    
    <description>&lt;p&gt;Il y a quelques jours, &lt;a href=&quot;http://myks.org&quot;&gt;mYk&lt;/a&gt; est venu me voir pour me dire qu'il avait réussi à se débrouiller pour que IE6 fasse un rendu correct de son site web perso... c'est à dire que le site (XHTML avec une CSS non triviale) ressemble à quelque chose sur IE6.&lt;/p&gt;


&lt;p&gt;Il m'explique alors que IE6 a 2 modes de fonctionnement pour le rendu&amp;nbsp;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Le premier, qu'il appelle &quot;mode normal&quot; fait un rendu correct (pas parfait, mais correct)&lt;/li&gt;
&lt;li&gt;Le second, (dont je ne me souviens plus le nom à dormir debout), a quant à lui un rendu &quot;tout pourri&quot;... par exemple, le margin: auto; de CSS ne fonctionne pas, le margin est à l'intérieur des boîtes et une partie de la CSS n'est tout bonnement pas pris en compte.&lt;/li&gt;
&lt;/ul&gt;    &lt;p&gt;Mais alors, comment passer d'un mode à l'autre&amp;nbsp;? Un des facteur, toujours d'après mYk est la présence d'un tag &amp;lt;?xml ...&amp;gt; en en-tête du fichier, comme par exemple&amp;nbsp;:&lt;/p&gt;
&lt;pre&gt;
[html4strict]
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;iso-8859-15&amp;quot;?&amp;gt;
&amp;lt;!DOCTYPE html PUBLIC &amp;quot;-//W3C//DTD XHTML 1.1//EN&amp;quot; &amp;quot;http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd&amp;quot;&amp;gt;
&amp;lt;html xmlns=&amp;quot;http://www.w3.org/1999/xhtml&amp;quot;&amp;gt;
  &amp;lt;head&amp;gt;
  &amp;lt;/head&amp;gt;
...
&lt;/pre&gt;


&lt;p&gt;Donc, j'ai testé sur &lt;a href=&quot;http://opensource.polytechnique.org/platal/&quot;&gt;plat/al&lt;/a&gt;, le site web de Polytechnique.org&amp;nbsp;: le résultat est impressionnant&amp;nbsp;!&lt;/p&gt;


&lt;p&gt;Tout d'abord, voici l'état actuel de le prod de Polytechnique.org sous IE6&amp;nbsp;:&lt;/p&gt;


&lt;p&gt;&lt;a href=&quot;http://blog.mymind.fr/mind/public/screenshots/ie6-prod.jpg&quot;&gt;&lt;img src=&quot;http://blog.mymind.fr/mind/public/screenshots/.ie6-prod_m.jpg&quot; alt=&quot;Polytechnique.org sous IE6 avec &amp;lt;?xml &amp;gt;&quot; style=&quot;display:block; margin:0 auto;&quot; /&gt;&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;Le corps du site n'est pas centré, le menu est mal formaté, les polices sont énormes, les backgrounds ne sont pas tous respectés... donc clairement c'est IE6 dans toute sa grandeur. Maintenant, en supprimant le &lt;code&gt;&amp;lt;?xml version=&quot;1.0&quot; encoding=&quot;iso-8859-15&quot;?&amp;gt;&lt;/code&gt; du code (il faut faire abstraction du bandeau de développement)&amp;nbsp;:&lt;/p&gt;


&lt;p&gt;&lt;a href=&quot;http://blog.mymind.fr/mind/public/screenshots/ie6-dev.jpg&quot;&gt;&lt;img src=&quot;http://blog.mymind.fr/mind/public/screenshots/.ie6-dev_m.jpg&quot; alt=&quot;Version de développement de Polytechnique.org sous IE6, sans le &amp;lt;?xml ...&amp;gt;&quot; style=&quot;display:block; margin:0 auto;&quot; /&gt;&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;Cette fois-ci la mise en page est correcte, le menu qui est dans un tableau bicolore est &lt;strong&gt;vraiment&lt;/strong&gt; bicolore... on a là un site rendu quasiment aussi bien que sur les navigateurs récents, et en particuliers, le rendu d'IE6 dans ces conditions est quasiment celui d'IE7 (en tout cas, ils ont les mêmes bugs sur les fieldset/legend en particuliers).&lt;/p&gt;


&lt;p&gt;Donc, il semblerait qu'IE7 n'a pas un moteur de rendu si &lt;em&gt;révolutionnaire&lt;/em&gt;... au moins, les utilisateurs d'IE6 retrouveront enfin un site agréable à utiliser lors de la prochaine release de plat/al... d'ici un gros mois sans doute.&lt;/p&gt;


&lt;p&gt;Edit du 21 mars 2007&amp;nbsp;: pour plus de détail sur les modes de fonctionnement des navigateurs, vous pouvez regarder sur &lt;a href=&quot;http://hsivonen.iki.fi/doctype/&quot;&gt;cette page&lt;/a&gt;.&lt;/p&gt;</description>
    
    
    
          <comments>http://blog.mymind.fr/post/2007/02/23/Pourquoi-faire-propre-quand-on-peut-faire-sale#comment-form</comments>
      <wfw:comment>http://blog.mymind.fr/post/2007/02/23/Pourquoi-faire-propre-quand-on-peut-faire-sale#comment-form</wfw:comment>
      <wfw:commentRss>http://blog.mymind.fr/feed/atom/comments/2</wfw:commentRss>
      </item>
    
</channel>
</rss>
