<?xml version="1.0" encoding="utf-8"?><?xml-stylesheet title="XSL formatting" type="text/xsl" href="http://xbright.codingteam.net/dotclear/index.php/feed/rss2/xslt" ?><rss version="2.0"
  xmlns:dc="http://purl.org/dc/elements/1.1/"
  xmlns:wfw="http://wellformedweb.org/CommentAPI/"
  xmlns:content="http://purl.org/rss/1.0/modules/content/">
<channel>
  <title>xbright’s world - Programmation et bidouillages</title>
  <link>http://xbright.codingteam.net/dotclear/index.php/</link>
  <description>Un blog bien mijoté avec des oignons autour. Miam miam.</description>
  <language>fr</language>
  <pubDate>Thu, 04 Sep 2008 14:31:24 +0400</pubDate>
  <copyright></copyright>
  <docs>http://blogs.law.harvard.edu/tech/rss</docs>
  <generator>Dotclear</generator>
  
    
  <item>
    <title>Internationaliser votre application PHP avec gettext</title>
    <link>http://xbright.codingteam.net/dotclear/index.php/post/2008/06/08/Internationaliser-votre-application-PHP-avec-gettext</link>
    <guid isPermaLink="false">urn:md5:642f5adad0981b1db2642cb9e755c81b</guid>
    <pubDate>Sun, 08 Jun 2008 22:54:00 +0400</pubDate>
    <dc:creator>xbright</dc:creator>
        <category>Programmation et bidouillages</category>
        <category>php</category><category>Planet</category>    
    <description>    &lt;p&gt;Développer une application, c'est bien. La distribuer où l'utiliser, c'est mieux. Cependant, tout le monde ne parle pas votre langue, d'où l'intérêt de l'internationaliser (et paf, une introduction toute pourrie \o/). Dans ce billet, je vous présenterai donc comment j'utilise gettext dans &lt;a hreflang=&quot;fr&quot; href=&quot;http://source.codingteam.net&quot;&gt;CodingTeam&lt;/a&gt;, afin de traduire l'application.&lt;/p&gt;
Traduire une application se fait généralement à l'aide d'outils dédiés comme &lt;a hreflang=&quot;fr&quot; href=&quot;http://www.gnu.org/software/gettext/&quot;&gt;gettext&lt;/a&gt;. Vous écrivez votre code en mettant tous vos textes traduisibles d'une certaine manière et il va aller les chercher pour en faire un fichier modèle (pot), qui servira ensuite à générer des fichiers de langue (po).&lt;br /&gt;En PHP et comme dans beaucoup d'autres langages, il y a déjà &lt;a hreflang=&quot;fr&quot; href=&quot;http://www.php.net/gettext&quot;&gt;quelque chose de tout préparé&lt;/a&gt;, ce qui permet de l'utiliser directement, sans rien installer d'autre.&lt;br /&gt;&lt;br /&gt;Ma façon d'utiliser gettext est inspirée de la lecture de bon nombre d'articles sur le net. En gros, j'utilise ce code pour charger gettext :&lt;br /&gt;&lt;code&gt;setlocale(LC_ALL, $lang.'.UTF-8');&lt;br /&gt;&lt;br /&gt;bindtextdomain('nomdedomaine', 'i18n');&lt;br /&gt;textdomain('nomdedomaine');&lt;br /&gt;bind_textdomain_codeset('nomdedomaine', 'UTF-8');&lt;/code&gt;&lt;br /&gt;Dans cet exemple, &lt;strong&gt;$lang&lt;/strong&gt; doit valoir quelque chose comme en_GB ou fr_FR et &lt;em&gt;nomdedomaine&lt;/em&gt; devrait être le nom de votre application.&lt;br /&gt;Dans le répertoire i18n, il devrait se trouver un dossier fr_FR contenant un autre dossier LC_MESSAGES qui accueillera le binaire produit par gettext (mo).&lt;br /&gt;&lt;br /&gt;De même, on peut faire en sorte que la langue soit enregistrée par l'utilisateur, donnée dans l'URL, lue depuis l'en-tête adéquate... Voilà une manière assez rapide^Wmoche et ne respectant pas les spécifications, de se baser sur la langue du navigateur :&lt;br /&gt;&lt;code&gt;$langlist = array('fr' =&amp;gt; 'fr_FR', 'en' =&amp;gt; 'en_GB');&lt;br /&gt;$accept_language = explode(',', $_SERVER['HTTP_ACCEPT_LANGUAGE']);&lt;br /&gt;&lt;br /&gt;foreach ($accept_language as $value) &lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; $choice = mb_substr($value, 0, 2); &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (array_key_exists($choice, $langlist))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; $lang = $langlist[$choice];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; break;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;if (empty($lang))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; $lang = 'en_GB';&lt;/code&gt;&lt;br /&gt;À noter qu'il n'y a pas besoin de générer de .po/.mo pour la langue dans laquelle vous écrivez vos textes au sein de votre application vu qu'ils sont chargés par défaut si gettext n'arrive pas à trouver les traductions qui vont bien.&lt;br /&gt;&lt;br /&gt;Pour créer le modèle, j'utilise &lt;a hreflang=&quot;fr&quot; href=&quot;http://svn.codingteam.net/code/source/trunk/scripts/i18n/create_pot&quot;&gt;ce script&lt;/a&gt;, qui est bien sûr adaptable. Dès que j'ai créé le .pot, je peux lancer &lt;a hreflang=&quot;fr&quot; href=&quot;http://svn.codingteam.net/code/source/trunk/scripts/i18n/create_po&quot;&gt;cet autre script&lt;/a&gt; qui va me créer le fichier de traduction pour la langue que je désire. Une fois que j'ai traduit toutes les chaines, il me reste à lancer &lt;a hreflang=&quot;fr&quot; href=&quot;http://svn.codingteam.net/code/source/trunk/scripts/i18n/create_mo&quot;&gt;ce dernier script&lt;/a&gt; pour générer le binaire !&lt;br /&gt;&lt;br /&gt;C'est là qu'on arrive au point relativement intéressant de ce billet (l'avant-ici a des airs de déjà-vu). J'ai toujours utilisé la fonction &lt;strong&gt;_()&lt;/strong&gt; ou &lt;strong&gt;gettext()&lt;/strong&gt; couplée à &lt;strong&gt;sprintf()&lt;/strong&gt; afin de remplacer des éléments par d'autres. Exemple, si je veux traduire « Toto a mangé 4 bananes », j'écris : &lt;strong&gt;sprintf(_('Toto a mangé %d bananes'), 4);&lt;/strong&gt; jusqu'au jour où je me suis rendu compte que si je voulais insérer plusieurs éléments dans la chaine tout en les nommant (afin de pouvoir changer leur ordre), j'allais au devant d'une syntaxe affreuse, repoussante,&lt;del&gt; typiquement-php,&lt;/del&gt; à jeter par la fenêtre : &lt;strong&gt;sprintf(_('Le %2$s achète %1$d bananes.'), 42, 'monsieur');&lt;/strong&gt; ! &lt;br /&gt;&lt;strong&gt;&lt;em&gt;%2$s, %1$s&lt;/em&gt;&lt;/strong&gt; ! Mais qui est allé pondre cette horreur ?&lt;br /&gt;&lt;br /&gt;Nostalgique de la façon bien plus propre de remplacer des occurrences dans des chaines en Python, j'ai donc écrit cette fonction, que je vous partage. Et j'espère qu'elle vous sera utile. En tout cas, c'est bien plus facile de ne pas se tromper, le traducteur a en face de lui quelque chose qui a une signification et ça ne fait pas tâche.&lt;br /&gt;&lt;pre&gt;&lt;code&gt;/**&lt;br /&gt; * Translate a string and add arguments&lt;br /&gt; *&lt;br /&gt; * Gets the translated string from gettext and add arguments in it with&lt;br /&gt; * the Python way instead of the *ugly* PHP way (sprintf).&lt;br /&gt; *&lt;br /&gt; * @param $str&lt;br /&gt; *   The string to be translated.&lt;br /&gt; * @param $args&lt;br /&gt; *   All arguments to be added.&lt;br /&gt; * @return&lt;br /&gt; *   The translated and formatted string.&lt;br /&gt; */&lt;br /&gt;function i18n($str, $args=array())&lt;br /&gt;{&lt;br /&gt;    // Get the translated string&lt;br /&gt;    $str = gettext($str);&lt;br /&gt;&lt;br /&gt;    // Add arguments to the string if exist&lt;br /&gt;    if (count($args) &amp;gt; 0)&lt;br /&gt;        // Fetching all arguments&lt;br /&gt;        foreach ($args as $key =&amp;gt; $value)&lt;br /&gt;        {&lt;br /&gt;            // Decimal value&lt;br /&gt;            if (is_numeric($value))&lt;br /&gt;                $type = 'd';&lt;br /&gt;            // String value&lt;br /&gt;            elseif (is_string($value))&lt;br /&gt;                $type = 's';&lt;br /&gt;&lt;br /&gt;            // Replace&lt;br /&gt;            $str = str_replace('%('.$key.')'.$type, $value, $str);&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;    // Return the translated string with arguments&lt;br /&gt;    return $str;&lt;br /&gt;}&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;</description>
    
    
    
          <comments>http://xbright.codingteam.net/dotclear/index.php/post/2008/06/08/Internationaliser-votre-application-PHP-avec-gettext#comment-form</comments>
      <wfw:comment>http://xbright.codingteam.net/dotclear/index.php/post/2008/06/08/Internationaliser-votre-application-PHP-avec-gettext#comment-form</wfw:comment>
      <wfw:commentRss>http://xbright.codingteam.net/dotclear/index.php/feed/rss2/comments/94</wfw:commentRss>
      </item>
    
  <item>
    <title>Code Bar : nouvelle édition du bar virtuel \o/</title>
    <link>http://xbright.codingteam.net/dotclear/index.php/post/2008/04/19/Code-Bar-%3A-nouvelle-edition-du-bar-virtuel-o/</link>
    <guid isPermaLink="false">urn:md5:328e598efba8f2224d8a647f56c4d141</guid>
    <pubDate>Sat, 19 Apr 2008 23:01:00 +0400</pubDate>
    <dc:creator>xbright</dc:creator>
        <category>Programmation et bidouillages</category>
        <category>logiciel libre</category><category>Planet</category><category>Python</category>    
    <description>    Comme &lt;a hreflang=&quot;fr&quot; href=&quot;http://gregoire.menuel.free.fr/blog/?p=18&quot;&gt;Omega&lt;/a&gt; l'a anoncé il y a quelques jours, le Code Bar va de nouveau avoir lieu sur le salon &lt;a hreflang=&quot;fr&quot; href=&quot;http://xbright.codingteam.net/dotclear/index.php/post/2008/04/19/Code-Bar-%3A-nouvelle-edition-du-bar-virtuel-o/xmpp:programmation@chat.jabberfr.org?join&quot;&gt;programmation@chat.jabberfr.org&lt;/a&gt; du samedi 26 avril au dimanche 27 avril 2008, de 12 heures UTC à 12 heures UTC (ça donne 14 heures à Paris et 16 heures dans des contrées plus accueillantes).&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;http://xbright.codingteam.net/dotclear/public/debiensbellesimages/codebar-artridicule.png&quot;&gt;&lt;img style=&quot;margin: 0 auto; display: block;&quot; alt=&quot;&quot; src=&quot;http://xbright.codingteam.net/dotclear/public/debiensbellesimages/codebar-artridicule.png&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Pour ceux qui ne connaissent pas le principe de cette rencontre virtuelle, une page de wiki a été mise en place : &lt;a hreflang=&quot;fr&quot; href=&quot;http://trac.last-exile.org/code_bar/&quot;&gt;http://trac.last-exile.org/code_bar/&lt;/a&gt;. Le but est donc de se rencontrer sur le salon Jabber francophone dédié à la programmation, de découvrir des (nouvelles ?) choses via les cours d'Emacs Lisp ou de Haskell et de travailler ensemble sur des petits projets libres. Cette fois ci, sont retenus un &lt;em&gt;moteur de MUD&lt;/em&gt; sous forme de composant Jabber, un &lt;em&gt;RandomChat&lt;/em&gt; (un truc séduisant pour que les djeunz pensent faire des rencontres anonymes tout en parlant à leur voisin, satyre et pervers sexuel à ses heures perdues) ainsi qu'un certain &lt;em&gt;Zadolbator&lt;/em&gt; (un composant Jabber qui envoie des notifications et qui, accessoirement, possède un nom imprononçable).&lt;br /&gt;&lt;br /&gt;De toute évidence, ce Code Bar est encore très axé sur les technologies liées à Jabber, on rappelle que le projet phare de la première édition du Code Bar était &lt;a hreflang=&quot;fr&quot; href=&quot;http://www.gajim.org&quot;&gt;Gajim&lt;/a&gt; (et non pas &lt;a hreflang=&quot;fr&quot; href=&quot;http://source.codingteam.net&quot;&gt;CodingTeam&lt;/a&gt;, malheureusement ;'(). On remarque aussi que 2 projets sur 3 sont aussi des projets en Python, alors que le composant-au-nom-bizarre, lui, est en Ruby.&lt;br /&gt;Et, si les fans de Jabber se sentaient encore un peu lésés, il y a aura même &lt;a hreflang=&quot;fr&quot; href=&quot;http://nyco.wordpress.com/&quot;&gt;Nÿco&lt;/a&gt; qui vantera la contribution sur le &lt;a hreflang=&quot;fr&quot; href=&quot;http://wiki.jabberfr.org&quot;&gt;wiki&lt;/a&gt; de &lt;a hreflang=&quot;fr&quot; href=&quot;http://www.jabberfr.org&quot;&gt;JabberFR.org&lt;/a&gt; (rien n'est encore sûr) !&lt;br /&gt;&lt;br /&gt;Bien entendu, vous n'êtes pas obligé de venir pour faire le tour de la pendule, il n'y a pas vraiment d'obligations à ce niveau (même si d'un point de vue organisationnel, notamment pour les cours - qui auront lieux à des heures fixes, c'est mieux d'arriver plutot tôt que tard). Si vous n'avez pas encore de client Jabber, &lt;a hreflang=&quot;fr&quot; href=&quot;http://wiki.jabberfr.org/Jabber_en_dix_minutes_avec_Gajim&quot;&gt;installez-en un&lt;/a&gt;.&lt;br /&gt;Pour ceux qui n'ont pas de compte Jabber, il existe aussi une interface web pour se connecter au salon : &lt;a hreflang=&quot;fr&quot; href=&quot;http://chat.jabberfr.org/muckl_int/index.php?room=programmation&quot;&gt;http://chat.jabberfr.org/muckl_int/index.php?room=programmation&lt;/a&gt; !&lt;br /&gt;&lt;br /&gt;Le programme pour ce prochain Code Bar est donc bien rempli et n'attends plus que les patcheurs/codeurs fous que vous êtes et qui n'attendent qu'un peu de projets exotiques pour vous lancer. Alors, à samedi \o_&lt;br /&gt;</description>
    
    
    
          <comments>http://xbright.codingteam.net/dotclear/index.php/post/2008/04/19/Code-Bar-%3A-nouvelle-edition-du-bar-virtuel-o/#comment-form</comments>
      <wfw:comment>http://xbright.codingteam.net/dotclear/index.php/post/2008/04/19/Code-Bar-%3A-nouvelle-edition-du-bar-virtuel-o/#comment-form</wfw:comment>
      <wfw:commentRss>http://xbright.codingteam.net/dotclear/index.php/feed/rss2/comments/83</wfw:commentRss>
      </item>
    
  <item>
    <title>Mon petit compte rendu de ce premier Code Bar.</title>
    <link>http://xbright.codingteam.net/dotclear/index.php/post/2007/06/03/Mon-petit-compte-rendu-de-ce-premier-Code-Bar</link>
    <guid isPermaLink="false">urn:md5:6d672c4d4c958847be7b6638b1ac83c6</guid>
    <pubDate>Sun, 03 Jun 2007 07:39:00 +0400</pubDate>
    <dc:creator>xbright</dc:creator>
        <category>Programmation et bidouillages</category>
        <category>codingteam</category><category>Jabber</category><category>php</category><category>Planet</category><category>Python</category>    
    <description>    &lt;p&gt;Depuis hier après midi jusqu'à aujourd'hui, se tenait la première édition du Code Bar sur Jabber !&lt;/p&gt;
&lt;p&gt;Tout comme l'avait &lt;a hreflang=&quot;fr&quot; href=&quot;http://news.jabberfr.org/?p=26&quot;&gt;préparé les organisateurs &lt;strong&gt;Omega&lt;/strong&gt; et &lt;strong&gt;Elghinn&lt;/strong&gt;&lt;/a&gt; sur le salon &lt;a hreflang=&quot;fr&quot; href=&quot;http://xbright.codingteam.net/dotclear/index.php/post/2007/06/03/xmpp:programmation@chat.jabberfr.org&quot;&gt;programmation@chat.jabberfr.org&lt;/a&gt;. Cette soirée (nuit ?) s'est donc déroulée dans la bonne humeur et a été productive.&lt;/p&gt;
&lt;br /&gt;&lt;p&gt;Voilà &lt;a hreflang=&quot;fr&quot; href=&quot;http://trac.last-exile.org/code_bar/log/&quot;&gt;un log de tous les commit&lt;/a&gt; effectués sur le SVN de l'occasion (deux projets étaient proposés pour cette première édition : &lt;a hreflang=&quot;fr&quot; href=&quot;http://www.gajim.org&quot;&gt;Gajim&lt;/a&gt; et &lt;a hreflang=&quot;fr&quot; href=&quot;http://www.codingteam.net&quot;&gt;CodingTeam&lt;/a&gt;). Il y en a eu plus d'une cinquantaine, pour - au mieux de la soirée - une vingtaine de connectés au salon, dont seulement 7 avaient un accès en écriture au dépôt SVN.&lt;/p&gt;
&lt;br /&gt;Concernant Gajim, les principaux développements ont été &lt;a hreflang=&quot;fr&quot; href=&quot;http://trac.last-exile.org/code_bar/log/gajim/branches/pep/&quot;&gt;l'amélioration du support de PEP&lt;/a&gt;, des travaux divers &lt;a hreflang=&quot;fr&quot; href=&quot;http://trac.last-exile.org/code_bar/log/gajim/trunk/&quot;&gt;sur le trunk&lt;/a&gt; où encore - j'y ai un peu participé - sur une branche à part nommée &lt;a hreflang=&quot;fr&quot; href=&quot;http://trac.last-exile.org/code_bar/log/gajim/branches/chat2muc/&quot;&gt;chat2muc&lt;/a&gt; : pour transformer un chat normal en salon de discussion, &lt;a hreflang=&quot;fr&quot; href=&quot;http://www.xmpp.org/extensions/xep-0045.html#continue&quot;&gt;XEP-0045&lt;/a&gt;). Bien entendu, nous n'avons pas terminé cette intégration, et nous la continuons sur le salon &lt;a hreflang=&quot;fr&quot; href=&quot;http://xbright.codingteam.net/dotclear/index.php/post/2007/06/03/xmpp:gajim-chat2muc@conference.codingteam.net&quot;&gt;gajim-chat2muc@conference.codingteam.net&lt;/a&gt; !&lt;br /&gt;&lt;br /&gt;CodingTeam a bénéficié de l'aide de quelques uns aussi via le dépôt mis en place pour l'occasion sur le serveur de &lt;a hreflang=&quot;fr&quot; href=&quot;http://last-exile.org&quot;&gt;Elghinn&lt;/a&gt;.&lt;br /&gt;Ainsi, l'intégration Jabber dans la forge &lt;a hreflang=&quot;fr&quot; href=&quot;http://trac.last-exile.org/code_bar/log/codingteam/&quot;&gt;a été travaillée&lt;/a&gt; et j'ai synchronisé le travail effectué avec &lt;a hreflang=&quot;fr&quot; href=&quot;http://www.codingteam.net/websvn/listing.php?repname=source&amp;amp;path=%2F&amp;amp;rev=44&amp;amp;sc=1&quot;&gt;le trunk officiel&lt;/a&gt; !&lt;br /&gt;&lt;br /&gt;Historiques des salons :&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a hreflang=&quot;fr&quot; href=&quot;http://chat.jabberfr.org/logs/programmation@chat.jabberfr.org/&quot;&gt;programmation@chat.jabberfr.org&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a hreflang=&quot;fr&quot; href=&quot;http://www.codingteam.net/jabber.php?action=gajim-chat2muc@conference.codingteam.net&quot;&gt;gajim-chat2muc@conference.codingteam.net&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;Merci donc à tous les participants pour le coup de pouce aux projets ;-)&lt;br /&gt;</description>
    
    
    
          <comments>http://xbright.codingteam.net/dotclear/index.php/post/2007/06/03/Mon-petit-compte-rendu-de-ce-premier-Code-Bar#comment-form</comments>
      <wfw:comment>http://xbright.codingteam.net/dotclear/index.php/post/2007/06/03/Mon-petit-compte-rendu-de-ce-premier-Code-Bar#comment-form</wfw:comment>
      <wfw:commentRss>http://xbright.codingteam.net/dotclear/index.php/feed/rss2/comments/41</wfw:commentRss>
      </item>
    
  <item>
    <title>Une soirée coding ouverte à tous !</title>
    <link>http://xbright.codingteam.net/dotclear/index.php/post/2007/05/23/Une-soiree-coding-ouverte-a-tous</link>
    <guid isPermaLink="false">urn:md5:d68271a452b803b84c7880215379ee7d</guid>
    <pubDate>Wed, 23 May 2007 18:16:00 +0400</pubDate>
    <dc:creator>xbright</dc:creator>
        <category>Programmation et bidouillages</category>
        <category>Jabber</category><category>Planet</category>    
    <description>    &lt;p&gt;Le samedi 2 juin, sera organisé une soirée coding sur Jabber !&lt;/p&gt;
&lt;p&gt;En effet, sur le salon &lt;a hreflang=&quot;fr&quot; href=&quot;http://xbright.codingteam.net/dotclear/index.php/post/2007/05/23/xmpp:programmation@chat.jabberfr.org&quot;&gt;programmation@chat.jabberfr.org&lt;/a&gt; l'après midi et la soirée (voire la nuit, plutôt) seront consacrées à la programmation.&lt;/p&gt;
&lt;p&gt;La tête d'affiche pour cette première édition : &lt;a hreflang=&quot;fr&quot; href=&quot;http://www.gajim.org&quot;&gt;Gajim&lt;/a&gt; ! Ainsi, le principal objectif est la correction de bug ainsi que l'implémentation de nouvelles fonctionnalités dans Gajim. D'ailleurs, le développeur principal, Asterix, sera présent ce soir !&lt;/p&gt;
&lt;p&gt;Voici les objectifs que l'on peut trouver &lt;a hreflang=&quot;fr&quot; href=&quot;http://trac.last-exile.org/test/wiki/Prog-gajim&quot;&gt;sur le wiki&lt;/a&gt; : &lt;/p&gt;
&lt;ul&gt;&lt;li&gt;Implémentation de PEP (&lt;a class=&quot;ext-link&quot; title=&quot;http://www.xmpp.org/extensions/xep-0163.html&quot; href=&quot;http://www.xmpp.org/extensions/xep-0163.html&quot;&gt;http://www.xmpp.org/extensions/xep-0163.html&lt;/a&gt;) notamment pour l'affichage de la musique en cours
&lt;/li&gt;
&lt;li&gt;Ajout des groupes en « cascade » (nested groups) dans le roster (&lt;a class=&quot;ext-link&quot; title=&quot;http://www.xmpp.org/extensions/xep-0083.html&quot; href=&quot;http://www.xmpp.org/extensions/xep-0083.html&quot;&gt;http://www.xmpp.org/extensions/xep-0083.html&lt;/a&gt; et &lt;a class=&quot;ext-link&quot; title=&quot;http://trac.gajim.org/ticket/1381&quot; href=&quot;http://trac.gajim.org/ticket/1381&quot;&gt;http://trac.gajim.org/ticket/1381&lt;/a&gt;)
&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;Pour ceux qui n'aiment pas Python, ou qui n'aiment pas Gajim, d'autres projets pourront être abordés ce soir là, comme indiqué &lt;a hreflang=&quot;fr&quot; href=&quot;http://trac.last-exile.org/test/wiki/Prog-gajim&quot;&gt;sur le wiki&lt;/a&gt; :&lt;br /&gt;&lt;blockquote&gt;&lt;p&gt;Intégrer Jabber dans &lt;a class=&quot;ext-link&quot; title=&quot;http://www.codingteam.net&quot; href=&quot;http://www.codingteam.net/&quot;&gt;CodingTeam&lt;/a&gt; (forge codée en PHP)&lt;/p&gt;
&lt;/blockquote&gt;Donc, si l'envie vous en prend, vous pourrez même donner un petit coup de main à CodingTeam :-)&lt;br /&gt;Le Roi de la pluie &lt;a hreflang=&quot;fr&quot; href=&quot;http://4526.free.fr/julien/?p=10&quot;&gt;en parle&lt;/a&gt; !&lt;br /&gt;</description>
    
    
    
          <comments>http://xbright.codingteam.net/dotclear/index.php/post/2007/05/23/Une-soiree-coding-ouverte-a-tous#comment-form</comments>
      <wfw:comment>http://xbright.codingteam.net/dotclear/index.php/post/2007/05/23/Une-soiree-coding-ouverte-a-tous#comment-form</wfw:comment>
      <wfw:commentRss>http://xbright.codingteam.net/dotclear/index.php/feed/rss2/comments/39</wfw:commentRss>
      </item>
    
  <item>
    <title>Compter les utilisateurs connectés et enregistrés avec ejabberd</title>
    <link>http://xbright.codingteam.net/dotclear/index.php/post/2007/05/20/Compter-les-utilisateurs-connectes-et-enregistres-avec-ejabberd</link>
    <guid isPermaLink="false">urn:md5:795027356f2c4c069ce175861bd94f14</guid>
    <pubDate>Sun, 20 May 2007 15:16:00 +0400</pubDate>
    <dc:creator>xbright</dc:creator>
        <category>Programmation et bidouillages</category>
        <category>Jabber</category><category>Planet</category>    
    <description>    &lt;p&gt;Eh bien, voilà un billet un peu technique, ça manquait !&lt;/p&gt;
&lt;br /&gt;&lt;p&gt;La problématique est la suivante : on a installé un serveur Jabber ejabberd (au passage, c'est une grossière erreur, ce serveur est en ERLANG, et j'me rend compte après coup que j'y suis allergique) sans se prendre la tête. Donc, ce ejabberd a décidé d'utiliser la base de données mnesia (un truc inconnu qui est un pote à ERLANG, justement). &lt;/p&gt;
&lt;p&gt;Alors, je vous laisse chercher longtemps pour faire une requette PHP là dedans...&lt;/p&gt;
&lt;br /&gt;&lt;p&gt;Heureusement, je suis tombé sur un truc formidable, tout à l'heure : &lt;strong&gt;mod_ctlextra&lt;/strong&gt;, en faisant une n-ième recherche sur leur &lt;a hreflang=&quot;fr&quot; href=&quot;http://ejabberd.jabber.ru&quot;&gt;site officiel&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Bref, ce module ajoute pleins de fonctions inutiles, dont : &lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;  stats registeredusers         number of registered users&lt;br /&gt;  stats onlineusers             number of logged users&lt;/p&gt;
&lt;/blockquote&gt;&lt;p&gt;De plus, l'installation a été très simple sur &lt;a hreflang=&quot;fr&quot; href=&quot;http://www.codingteam.net&quot;&gt;lanoiraude&lt;/a&gt; :&lt;/p&gt;
&lt;p&gt;On commence par se placer dans un répertoire qui servira pour récupérer la copie courante de ce module.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;svn co https://svn.process-one.net/ejabberd-modules&lt;/code&gt;&lt;/pre&gt;Ensuite, on va dans le répertoire de ce module :&lt;br /&gt;&lt;pre&gt;&lt;code&gt;cd ejabberd-modules/mod_ctlextra/trunk&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;On va construire le bidule :&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;./build.sh&lt;/code&gt;&lt;/pre&gt;Ensuite, dans le dossier &lt;strong&gt;ebin&lt;/strong&gt;, on tombe sur le fichier intéressant &lt;strong&gt;mod_ctlextra.beam&amp;nbsp;&lt;/strong&gt; ! On le met dans &lt;strong&gt;/var/lib/ejabberd&lt;/strong&gt; et il n'y a plus qu'à ajouter ça au &lt;strong&gt;ejabberd.cfg&lt;/strong&gt; :&lt;br /&gt;&lt;pre&gt;&lt;code&gt;  {mod_ctlextra, []},&lt;/code&gt;&lt;/pre&gt;(Oui, Jérémy, cette syntaxe de malade, c'est du ERLANG !)&lt;br /&gt;&lt;br /&gt;Et voilà, il ne nous reste plus qu'à redémarrer le serveur pour bénéficier de ces nouvelles commandes ultra pratiques !&lt;br /&gt;Ensuite, un petit peu de Python, un petit tour dans crontab et on obtient ça : &lt;a hreflang=&quot;fr&quot; href=&quot;http://www.codingteam.net/muclogs/stat.txt&quot;&gt;stat.txt&lt;/a&gt; ! _o/&lt;br /&gt;</description>
    
    
    
          <comments>http://xbright.codingteam.net/dotclear/index.php/post/2007/05/20/Compter-les-utilisateurs-connectes-et-enregistres-avec-ejabberd#comment-form</comments>
      <wfw:comment>http://xbright.codingteam.net/dotclear/index.php/post/2007/05/20/Compter-les-utilisateurs-connectes-et-enregistres-avec-ejabberd#comment-form</wfw:comment>
      <wfw:commentRss>http://xbright.codingteam.net/dotclear/index.php/feed/rss2/comments/38</wfw:commentRss>
      </item>
    
  <item>
    <title>Créer des fils RSS avec mise en cache</title>
    <link>http://xbright.codingteam.net/dotclear/index.php/post/2007/03/12/Creer-des-fils-RSS-avec-mise-en-cache</link>
    <guid isPermaLink="false">urn:md5:647e4548b09cf047620959acf0c42e07</guid>
    <pubDate>Fri, 06 Apr 2007 14:19:00 +0400</pubDate>
    <dc:creator>xbright</dc:creator>
        <category>Programmation et bidouillages</category>
        <category>php</category><category>Planet</category><category>rss</category><category>web 2.0</category>    
    <description>&lt;p&gt;Voilà un petit script que j'ai codé pour CodingTeam et qui peut être utile; c'est pourquoi je le met à disposition.&lt;/p&gt;    Les fils RSS sont à la mode en ce moment et permettent, depuis un aggrégateur, d'obtenir les dernières actualités d'autant de sites que l'on désire.&lt;br /&gt;En plus, c'est très simple de générer un fil de ce type en PHP (là ou ça se corse un peu c'est pour convertir une date &lt;em&gt;d/m/Y&lt;/em&gt; et une heure &lt;em&gt;H:i:s&lt;/em&gt; en &lt;em&gt;RFC822&lt;/em&gt;).&lt;br /&gt;&lt;br /&gt;Commencez par mettre ce code entre les &lt;em&gt;&amp;lt;head&amp;gt;&amp;lt;/head&amp;gt;&lt;/em&gt; de la page proposant l'abonnement :&lt;br /&gt;&lt;pre&gt;&lt;code&gt;&amp;lt;&lt;span class=&quot;start-tag&quot;&gt;link&lt;/span&gt;&lt;span class=&quot;attribute-name&quot;&gt; rel&lt;/span&gt;=&lt;span class=&quot;attribute-value&quot;&gt;&quot;alternate&quot; &lt;/span&gt;&lt;span class=&quot;attribute-name&quot;&gt;type&lt;/span&gt;=&lt;span class=&quot;attribute-value&quot;&gt;&quot;application/rss+xml&quot; &lt;/span&gt;&lt;span class=&quot;attribute-name&quot;&gt;title&lt;/span&gt;=&lt;span class=&quot;attribute-value&quot;&gt;&quot;RSS 2.0&quot; &lt;/span&gt;&lt;span class=&quot;attribute-name&quot;&gt;href&lt;/span&gt;=&lt;span class=&quot;attribute-value&quot;&gt;&quot;rss.php&quot; &lt;/span&gt;&lt;span class=&quot;attribute-name&quot;&gt;/&lt;/span&gt;&amp;gt;&lt;/code&gt;&lt;/pre&gt;
Dans le répertoire où se trouve ce script, vous devez aussi avoir un dossier /cache en chmod 777 afin que l'application puisse y écrire.&lt;br /&gt;Pour renouveller le cache, il suffit d'ajouter dans votre code (par exemple, lorsqu'un nouvel article est posté) :&lt;br /&gt;&lt;pre&gt;&lt;code&gt;&amp;lt;?php&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; unlink(&quot;cache/cache-rss.php&quot;);&lt;br /&gt;?&amp;gt;&lt;/code&gt;&lt;/pre&gt;Le script de base du cache a été trouvé sur WebRankInfo et je l'ai adapté à la situation : &lt;a hreflang=&quot;fr&quot; href=&quot;http://www.webrankinfo.com/forums/viewtopic_28614.htm&quot;&gt;Mise en cache des pages PHP&lt;/a&gt; !&lt;br /&gt;&lt;p&gt;Le voici dans sa version originale :&lt;/p&gt;
&lt;pre&gt;&lt;BEGIN GeSHi&gt;&lt;code class=&quot;php&quot;&gt;&amp;lt;?php&lt;br /&gt;$urldemandee=$_SERVER['REQUEST_URI'];&lt;br /&gt;$urldemandee=ereg_replace('/','-',$urldemandee);&lt;br /&gt;$fichierCache=&quot;cache/cache&quot;.$urldemandee;&lt;br /&gt;if (@filemtime($fichierCache)&amp;lt;time()-(3600*24*360)) {&lt;br /&gt;&amp;nbsp;&amp;nbsp; ob_start(); &lt;br /&gt;&lt;br /&gt;header(&quot;Content-Type: text/xml;charset=utf-8&quot;);&lt;br /&gt;require_once(&quot;../include/config.inc.php&quot;);&lt;br /&gt;require_once(&quot;../include/bbcode.inc.php&quot;);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;echo '&amp;lt;rss version=&quot;2.0&quot;&amp;gt;&lt;br /&gt;&amp;lt;channel&amp;gt;&lt;br /&gt;&amp;lt;title&amp;gt;CodingTeam - Forum&amp;lt;/title&amp;gt;&lt;br /&gt;&amp;lt;link&amp;gt;http://www.codingteam.net&amp;lt;/link&amp;gt;&lt;br /&gt;&amp;lt;description&amp;gt;Les derniers messages postés dans le forum.&amp;lt;/description&amp;gt;&lt;br /&gt;&amp;lt;language&amp;gt;fr-FR&amp;lt;/language&amp;gt;&lt;br /&gt;';&lt;br /&gt;&lt;br /&gt;&amp;nbsp; $sql = mysql_query(&quot;SELECT * FROM forum_sujet ORDER BY id DESC LIMIT 5&quot;) or die (mysql_error());&lt;br /&gt;&amp;nbsp; while ($row = mysql_fetch_array($sql))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;$dd = explode('/',$row['date']);&lt;br /&gt;$dc = explode(':',$row['heure']);&lt;br /&gt;&lt;br /&gt;echo '&lt;br /&gt;&amp;lt;item&amp;gt;&lt;br /&gt;&amp;lt;title&amp;gt;'.utf8_encode($row['titre']).'&amp;lt;/title&amp;gt;&lt;br /&gt;&amp;lt;link&amp;gt;'.$racine.'/forumvoir,'.$row['cat'].','.$row['id'].'.html&amp;lt;/link&amp;gt;&lt;br /&gt;&amp;lt;pubDate&amp;gt;'.date(DATE_RFC822, mktime($dc[0], $dc[1], $dc[2], $dd[1], $dd[0], $dd[2])).'&amp;lt;/pubDate&amp;gt;&lt;br /&gt;&amp;lt;description&amp;gt;'.htmlentities(bb_parse($row['message'])).'&amp;lt;/description&amp;gt;&lt;br /&gt;&amp;lt;author&amp;gt;'.$row['auteur'].'&amp;lt;/author&amp;gt;&lt;br /&gt;&amp;lt;/item&amp;gt;&lt;br /&gt;';&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&lt;br /&gt;echo '&lt;br /&gt;&amp;lt;/channel&amp;gt;&lt;br /&gt;&amp;lt;/rss&amp;gt;';&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; $contenuCache = ob_get_contents();&lt;br /&gt;&amp;nbsp;&amp;nbsp; ob_end_flush();&lt;br /&gt;&amp;nbsp;&amp;nbsp; $fd = fopen($fichierCache, &quot;w&quot;);&lt;br /&gt;&amp;nbsp;&amp;nbsp; if ($fd) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; fwrite($fd,$contenuCache);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; fclose($fd);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;} else {&lt;br /&gt;&amp;nbsp; include ($fichierCache);&lt;br /&gt;}&lt;br /&gt;?&amp;gt;&lt;/code&gt;&lt;END GeSHi&gt;&lt;/pre&gt;</description>
    
    
    
          <comments>http://xbright.codingteam.net/dotclear/index.php/post/2007/03/12/Creer-des-fils-RSS-avec-mise-en-cache#comment-form</comments>
      <wfw:comment>http://xbright.codingteam.net/dotclear/index.php/post/2007/03/12/Creer-des-fils-RSS-avec-mise-en-cache#comment-form</wfw:comment>
      <wfw:commentRss>http://xbright.codingteam.net/dotclear/index.php/feed/rss2/comments/10</wfw:commentRss>
      </item>
    
  <item>
    <title>Créer des dépôts facilement sur un serveur SVN</title>
    <link>http://xbright.codingteam.net/dotclear/index.php/post/2007/03/21/Creer-des-depots-facilement-sur-un-serveur-SVN</link>
    <guid isPermaLink="false">urn:md5:1a178d6f5f0d913e2a77ad82a3c82694</guid>
    <pubDate>Wed, 21 Mar 2007 13:14:00 +0400</pubDate>
    <dc:creator>xbright</dc:creator>
        <category>Programmation et bidouillages</category>
        <category>Planet</category><category>Python</category><category>Subversion</category>    
    <description>&lt;p&gt;Deux petits scripts très pratique pour ajouter des dépôts sur votre serveur Subversion et pour ajouter des utilisateurs en écriture, par la suite.&lt;/p&gt;
&lt;p&gt;Ce sont les scripts utilisés pour le serveur de CodingTeam !&lt;/p&gt;    &lt;p&gt;Pour installer Subversion sur ma Debian, je n'ai eu qu'à faire :&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;apt-get install libapache2-svn subversion subversion-tools&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;br /&gt;Pour ajouter un dépôt à mon serveur SVN, voici le script (très facilement modifiable pour votre utilisation) :&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;#!/usr/bin/env python&lt;br /&gt;# -*- coding: UTF8 -*-&lt;br /&gt;&lt;br /&gt;###&lt;br /&gt;#&lt;br /&gt;# svn-create.py is the legal property of Erwan Briand &amp;lt;xbright2005@gmail.com&amp;gt;&lt;br /&gt;# Copyright (c) 2007 Erwan Briand&lt;br /&gt;#&lt;br /&gt;# This program is free software; you can redistribute it and/or modify&lt;br /&gt;# it under the terms of the GNU General Public License version 2 as&lt;br /&gt;# published by the Free Software Foundation&lt;br /&gt;#&lt;br /&gt;# This program is distributed in the hope that it will be useful,&lt;br /&gt;# but WITHOUT ANY WARRANTY; without even the implied warranty of&lt;br /&gt;# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.&amp;nbsp; See the&lt;br /&gt;# GNU General Public License for more details.&lt;br /&gt;#&lt;br /&gt;# You should have received a copy of the GNU General Public License&lt;br /&gt;# along with this program; if not, write to the Free Software&lt;br /&gt;# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA&amp;nbsp; 02111-1307&amp;nbsp; USA&lt;br /&gt;#&lt;br /&gt;###&lt;br /&gt;&lt;br /&gt;import os&lt;br /&gt;&lt;br /&gt;base = &quot;http://svn.codingteam.net&quot;&lt;br /&gt;svn_repository = &quot;/var/www/code/&quot;&lt;br /&gt;svn_msg = &quot;[CodingTeam] Subversion : &quot;&lt;br /&gt;svn_suffix = &quot;/src&quot;&lt;br /&gt;apache_config = &quot;/etc/apache2/projectalias.conf&quot;&lt;br /&gt;&lt;br /&gt;print &quot;#################################################&quot;&lt;br /&gt;print &quot;Créer un dépôt SVN sur CodingTeam&quot;&lt;br /&gt;print &quot;#################################################&quot;&lt;br /&gt;&lt;br /&gt;try:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; nom_projet = raw_input(&quot;Nom du projet : &quot;)&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ## Création du projet&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; os.system(&quot;mkdir &quot; + svn_repository + nom_projet)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; os.system(&quot;chown www-data &quot; + svn_repository + nom_projet)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; os.system(&quot; su www-data -c \&quot;svnadmin create &quot; + svn_repository + nom_projet + svn_suffix + &quot;\&quot; &quot;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; print &quot;\nCréation du projet\t\t\t\t[OK]&quot;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ## Configuration du serveur&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; file = open(apache_config,&quot;a&quot;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; file.write(&quot;##### Serveur pour &quot; + nom_projet + &quot;\n&quot;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; file.write(&quot;&amp;lt;Location /code/&quot; + nom_projet + &quot;&amp;gt;\n&quot;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; file.write(&quot;&amp;nbsp; DAV svn\n&quot;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; file.write(&quot;&amp;nbsp; DavDepthInfinity on\n&quot;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; file.write(&quot;&amp;nbsp; SVNPath &quot; + svn_repository + nom_projet + svn_suffix + &quot;\n&quot;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; file.write(&quot;&amp;nbsp; AuthType Basic\n&quot;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; file.write(&quot;&amp;nbsp; AuthName \&quot;&quot; + svn_msg + nom_projet + &quot;\&quot;\n&quot;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; file.write(&quot;&amp;nbsp; AuthUserFile &quot;+ svn_repository + nom_projet +&quot;/.dav_svn.passwd\n&quot;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; file.write(&quot;&amp;nbsp; &amp;lt;LimitExcept GET PROPFIND OPTIONS REPORT&amp;gt;\n&quot;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; file.write(&quot;&amp;nbsp;&amp;nbsp;&amp;nbsp; Require valid-user\n&quot;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; file.write(&quot;&amp;nbsp; &amp;lt;/LimitExcept&amp;gt;\n&quot;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; file.write(&quot;&amp;lt;/Location&amp;gt;\n\n&quot;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; file.close()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; print &quot;\nConfiguration du serveur (VirtualHost)\t\t[OK]&quot;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ## Ajout des droits&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; admin_projet = raw_input(&quot;\nNom de l'administrateur : &quot;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; os.system(&quot; su www-data -c \&quot;htpasswd2 -c -m &quot;+ svn_repository + nom_projet +&quot;/.dav_svn.passwd &quot; + admin_projet + &quot;\&quot; &quot;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; #print &quot;Pour ajouter des droits par la suite, il faudra exécuter cette commande :&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; #print &quot;=&amp;gt;\tsu www-data -c \&quot;htpasswd2 -m &quot;+ svn_repository + nom_projet +&quot;/.dav_svn.passwd user\&quot; &quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; print &quot;\nAjout des droits\t\t\t\t[OK]&quot;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ## Redémarrage du serveur Apache&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; print &quot;&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; os.system(&quot;/etc/init.d/apache2 force-reload&quot;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; print &quot;\nRedémarrage du serveur\t\t\t\t[OK]&quot;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; print &quot;\n\n&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; print &quot;Dépôt Subversion\t\t\t[Créé]&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; print &quot;Nom du serveur\t\t\t\t&quot; + nom_projet&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; print &quot;Nom de l'administrateur\t\t\t&quot; + admin_projet&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; print &quot;Adresse du dépôt\t\t\t&quot; + base + &quot;/&quot; + nom_projet&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; print &quot;\nTravail effectué.&quot;&lt;br /&gt;&lt;br /&gt;except:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; print &quot;\nErreur ! Abandon.&quot;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Enfin, pour ajouter un utilisateur en écriture à un dépôt :
&lt;pre&gt;&lt;code&gt;#!/usr/bin/env python&lt;br /&gt;# -*- coding: UTF8 -*-&lt;br /&gt;&lt;br /&gt;###&lt;br /&gt;#&lt;br /&gt;# svn-adduser.py is the legal property of Erwan Briand &amp;lt;xbright2005@gmail.com&amp;gt;&lt;br /&gt;# Copyright (c) 2007 Erwan Briand&lt;br /&gt;#&lt;br /&gt;# This program is free software; you can redistribute it and/or modify&lt;br /&gt;# it under the terms of the GNU General Public License version 2 as&lt;br /&gt;# published by the Free Software Foundation&lt;br /&gt;#&lt;br /&gt;# This program is distributed in the hope that it will be useful,&lt;br /&gt;# but WITHOUT ANY WARRANTY; without even the implied warranty of&lt;br /&gt;# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.&amp;nbsp; See the&lt;br /&gt;# GNU General Public License for more details.&lt;br /&gt;#&lt;br /&gt;# You should have received a copy of the GNU General Public License&lt;br /&gt;# along with this program; if not, write to the Free Software&lt;br /&gt;# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA&amp;nbsp; 02111-1307&amp;nbsp; USA&lt;br /&gt;#&lt;br /&gt;###&lt;br /&gt;&lt;br /&gt;import os&lt;br /&gt;&lt;br /&gt;svn_repository = &quot;/var/www/code/&quot;&lt;br /&gt;&lt;br /&gt;print &quot;#################################################&quot;&lt;br /&gt;print &quot;Ajouter un utilisateur à un dépôt SVN&quot;&lt;br /&gt;print &quot;#################################################&quot;&lt;br /&gt;&lt;br /&gt;try:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; nom_projet = raw_input(&quot;Nom du projet : &quot;)&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if os.path.isdir(svn_repository + nom_projet) == False:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; print &quot;\nErreur ! Abandon.&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; else:&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; ## Ajout des droits&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; admin_projet = raw_input(&quot;\nNom de l'utilisateur : &quot;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; os.system(&quot; su www-data -c \&quot;htpasswd2 -m &quot;+ svn_repository + nom_projet +&quot;/.dav_svn.passwd &quot; + admin_projet + &quot;\&quot; &quot;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; print &quot;\nAjout des droits\t\t\t\t[OK]&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; print &quot;\n\n&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; print &quot;Dépôt Subversion\t\t\t[Modifié]&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; print &quot;Nom du dépôt\t\t\t\t&quot; + nom_projet&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; print &quot;Nouvel utilisateur\t\t\t&quot; + admin_projet&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; print &quot;\nTravail effectué.&quot;&lt;br /&gt;&lt;br /&gt;except:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; print &quot;\nErreur ! Abandon.&quot;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Voilà, en espérant que ces scripts puissent vous servir ;)&lt;br /&gt;&lt;br /&gt;En effet, j'ai eu du mal à trouver de la bonne doc pour administrer un serveur Subversion et ces scripts me permettent en fait d'optimiser ce très bon How To : &lt;a hreflang=&quot;fr&quot; href=&quot;http://wiki.freaks-unidos.net/Apache2%20SSL%20and%20Subversion%20in%20Debian&quot;&gt;Subversion in Debian&lt;/a&gt;&amp;nbsp; !&lt;br /&gt;</description>
    
    
    
          <comments>http://xbright.codingteam.net/dotclear/index.php/post/2007/03/21/Creer-des-depots-facilement-sur-un-serveur-SVN#comment-form</comments>
      <wfw:comment>http://xbright.codingteam.net/dotclear/index.php/post/2007/03/21/Creer-des-depots-facilement-sur-un-serveur-SVN#comment-form</wfw:comment>
      <wfw:commentRss>http://xbright.codingteam.net/dotclear/index.php/feed/rss2/comments/18</wfw:commentRss>
      </item>
    
</channel>
</rss>