<?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... - Tag - Banana</title>
  <link>http://blog.mymind.fr/</link>
  <atom:link href="http://blog.mymind.fr/feed/tag/Banana/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>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>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>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>
    
</channel>
</rss>
