<?xml version="1.0" encoding="utf-8"?><?xml-stylesheet title="XSL formatting" type="text/xsl" href="http://nicolas.steinmetz.fr/journal/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>Le petit coin de Nicolas</title>
  <link>http://nicolas.steinmetz.fr/journal/</link>
  <atom:link href="http://nicolas.steinmetz.fr/journal/feed/rss2" rel="self" type="application/rss+xml"/>
  <description>Bloc-notes de Nicolas Steinmetz</description>
  <language>fr</language>
  <pubDate>Thu, 11 Mar 2010 16:07:27 +0100</pubDate>
  <copyright>Creative Commons NC-BY-SA</copyright>
  <docs>http://blogs.law.harvard.edu/tech/rss</docs>
  <generator>Dotclear</generator>
  
    
  <item>
    <title>Recherche développeur PHP - Symfony pour un annuaire d'entreprise à JCDecaux</title>
    <link>http://nicolas.steinmetz.fr/journal/post/2010/03/11/Recherche-d%C3%A9veloppeur-PHP-Symfony-pour-un-annuaire-d-entreprise-%C3%A0-JCDecaux</link>
    <guid isPermaLink="false">urn:md5:7a5971acc03523b008d06e96d1f158d6</guid>
    <pubDate>Thu, 11 Mar 2010 15:29:00 +0100</pubDate>
    <dc:creator>Nicolas Steinmetz</dc:creator>
        <category>Intégration</category>
        <category>active directory</category><category>annuaire</category><category>job</category><category>php</category><category>symfony</category>    
    <description>    &lt;p&gt;Ci-après le descriptif de la mission :&lt;/p&gt;


&lt;h3&gt;Mission :&lt;/h3&gt;


&lt;p&gt;Conception et développement du nouvel annuaire d’entreprise Globe.&lt;/p&gt;


&lt;p&gt;Les travaux relatifs à la mission seront :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Participation à la spécification détaillée du système constitué d’une base de données, d’une IHM de consultation et d’un ensemble de traitements batch&lt;/li&gt;
&lt;li&gt;Conception et réalisation en PHP / Symfony (incluant les tests unitaires)&lt;/li&gt;
&lt;li&gt;Elaboration des tests de qualification du système&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;Environnement technique :&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;PHP 5.2.x&lt;/li&gt;
&lt;li&gt;Framework Symfony&lt;/li&gt;
&lt;li&gt;MySQL 5.0/5.1&lt;/li&gt;
&lt;li&gt;Microsoft Active Directory&lt;/li&gt;
&lt;li&gt;Redhat 5.x&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;Compétences techniques requises :&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Rédaction de spécifications détaillées&lt;/li&gt;
&lt;li&gt;Framework Symfony et PHP&lt;/li&gt;
&lt;li&gt;Modèle relationnel, requêtes SQL&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;Compétences techniques appréciées :&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;SQL Oracle (l'existant est stocké dans une base Oracle)&lt;/li&gt;
&lt;li&gt;Javascript et jQuery&lt;/li&gt;
&lt;li&gt;VBS (Visual Basic Script) (pour la réalisation de scripts - compétence non bloquante car pourra au pire être réalisée en interne)&lt;/li&gt;
&lt;li&gt;Active Directory&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;Qualités humaines recherchées :&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Esprit d’analyse&lt;/li&gt;
&lt;li&gt;Rigueur&lt;/li&gt;
&lt;li&gt;Dynamisme&lt;/li&gt;
&lt;li&gt;Sens de la communication&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;Localisation du poste :&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Plaisir ZI Sainte-Apolline (78)&lt;/li&gt;
&lt;li&gt;Pas de télé-travail possible pour cette mission&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;Date de démarrage souhaitée :&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Au plus tôt&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;Durée de la mission :&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;50 jours sur 3 mois&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;Contact :&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;nicolas POINT steinmetz AT jcdecaux POINT fr&lt;/li&gt;
&lt;/ul&gt;</description>
    
    
    
          <comments>http://nicolas.steinmetz.fr/journal/post/2010/03/11/Recherche-d%C3%A9veloppeur-PHP-Symfony-pour-un-annuaire-d-entreprise-%C3%A0-JCDecaux#comment-form</comments>
      <wfw:comment>http://nicolas.steinmetz.fr/journal/post/2010/03/11/Recherche-d%C3%A9veloppeur-PHP-Symfony-pour-un-annuaire-d-entreprise-%C3%A0-JCDecaux#comment-form</wfw:comment>
      <wfw:commentRss>http://nicolas.steinmetz.fr/journal/feed/atom/comments/583</wfw:commentRss>
      </item>
    
  <item>
    <title>Extension Postgres pour PHP sous Slackware</title>
    <link>http://nicolas.steinmetz.fr/journal/post/2010/03/06/Extension-Postgres-pour-PHP-sous-Slackware</link>
    <guid isPermaLink="false">urn:md5:f79373b08b3fb99422e311e86ff54727</guid>
    <pubDate>Sat, 06 Mar 2010 21:35:00 +0100</pubDate>
    <dc:creator>Nicolas Steinmetz</dc:creator>
        <category>Trucs de geek</category>
        <category>php</category><category>postgres</category><category>slackware</category>    
    <description>    &lt;p&gt;Par défaut, la version de PHP fournie par Slackware ne comprend pas les extensions &lt;code&gt;pgsql&lt;/code&gt; et &lt;code&gt;pdo_pgsql&lt;/code&gt;, chose que nous allons corriger dans un instant :&lt;/p&gt;


&lt;p&gt;Pour commencer, récupérer le slackbuild de PHP pour votre version de Slackware :&lt;/p&gt;

&lt;pre class=&quot;bash&quot;&gt;rsync -avz --del rsync://slackware.mirrors.tds.net/slackware/slackware64&lt;span style=&quot;color: #cc66cc;&quot;&gt;-13.0&lt;/span&gt;/patches/&lt;span style=&quot;color: #000066;&quot;&gt;source&lt;/span&gt;/php ./
rsync -avz --del rsync://slackware.mirrors.tds.net/slackware/slackware64&lt;span style=&quot;color: #cc66cc;&quot;&gt;-13.0&lt;/span&gt;/&lt;span style=&quot;color: #000066;&quot;&gt;source&lt;/span&gt;/n/alpine ./&lt;/pre&gt;


&lt;p&gt;Pour PHP, on s'appuie sur les patchs car la version par défaut dans Slackware 13.0 est PHP 5.2.10 et que par la suite il y a eu une mise à jour en PHP 5.2.12. Pour alpine, il s'agit d'une dépendance afin de pouvoir compiler l'extension &lt;code&gt;imap&lt;/code&gt; de PHP. Il n'y a pas eu de mise à jour d'alpine depuis la sortie de Slackware 13.0 donc on le prend dans les sources originelles.&lt;/p&gt;


&lt;p&gt;Editez ensuite &lt;code&gt;php/php.Slackbuild&lt;/code&gt; pour y ajouter les informations relatives à Postgres dans le cadre du &lt;code&gt;configure&lt;/code&gt;, à savoir :&lt;/p&gt;

&lt;pre class=&quot;bash&quot;&gt;--with-&lt;span style=&quot;color: #0000ff;&quot;&gt;pgsql=&lt;/span&gt;shared,/usr \
--with-pdo-&lt;span style=&quot;color: #0000ff;&quot;&gt;pgsql=&lt;/span&gt;shared,/usr \&lt;/pre&gt;


&lt;p&gt;Ce qui me donne au final (et avec au passage modification du &lt;code&gt;BUILD&lt;/code&gt; pour le distinguer du paquet officiel)&lt;/p&gt;

&lt;pre class=&quot;bash&quot;&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;BUILD=&lt;/span&gt;$&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#123;&lt;/span&gt;BUILD:-1_slack13.0_with_pgsql&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#125;&lt;/span&gt;
&amp;nbsp;
&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#91;&lt;/span&gt;...&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#93;&lt;/span&gt;
&amp;nbsp;
  --with-&lt;span style=&quot;color: #0000ff;&quot;&gt;mysql=&lt;/span&gt;shared,/usr \
  --with-&lt;span style=&quot;color: #0000ff;&quot;&gt;mysqli=&lt;/span&gt;shared,/usr/bin/mysql_config \
  --enable-&lt;span style=&quot;color: #0000ff;&quot;&gt;pdo=&lt;/span&gt;shared \
  --with-pdo-&lt;span style=&quot;color: #0000ff;&quot;&gt;mysql=&lt;/span&gt;shared,/usr \
  --with-pdo-&lt;span style=&quot;color: #0000ff;&quot;&gt;sqlite=&lt;/span&gt;shared \
  --with-&lt;span style=&quot;color: #0000ff;&quot;&gt;pgsql=&lt;/span&gt;shared,/usr \
  --with-pdo-&lt;span style=&quot;color: #0000ff;&quot;&gt;pgsql=&lt;/span&gt;shared,/usr \
  --with-&lt;span style=&quot;color: #0000ff;&quot;&gt;pspell=&lt;/span&gt;shared,/usr \
  --with-&lt;span style=&quot;color: #0000ff;&quot;&gt;mm=&lt;/span&gt;/usr \
&amp;nbsp;
&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#91;&lt;/span&gt;...&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#93;&lt;/span&gt;&lt;/pre&gt;


&lt;p&gt;Ensuite il faut éditer le fichier &lt;code&gt;doinst.sh&lt;/code&gt; pour que les extensions relatives à Postgres soient chargées ; il y a surement plus propre comme méthode mais ça marche :&lt;/p&gt;

&lt;pre class=&quot;bash&quot;&gt;&lt;span style=&quot;color: #000066;&quot;&gt;echo&lt;/span&gt; &lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;quot;extension=pgsql.so&amp;quot;&lt;/span&gt; &amp;gt;&amp;gt; /etc/httpd/php.ini
&lt;span style=&quot;color: #000066;&quot;&gt;echo&lt;/span&gt; &lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;quot;extension=pdo_pgsql.so&amp;quot;&lt;/span&gt; &amp;gt;&amp;gt; /etc/httpd/php.ini&lt;/pre&gt;


&lt;p&gt;Ne pas oublier de re-gzipper à nouveau &lt;code&gt;doinst.sh&lt;/code&gt; pour qu'il soit pris en compte par le slackbuild :&lt;/p&gt;

&lt;pre class=&quot;bash&quot;&gt;gzip doinst.sh&lt;/pre&gt;


&lt;p&gt;Une fois cela effectué, pour générer la création de votre package PHP, il vous suffit de faire :&lt;/p&gt;

&lt;pre class=&quot;bash&quot;&gt;./php.SlackBuild&lt;/pre&gt;


&lt;p&gt;Une fois généré, pour l'installer :&lt;/p&gt;

&lt;pre class=&quot;bash&quot;&gt;removepkg php
installpkg /tmp/php&lt;span style=&quot;color: #cc66cc;&quot;&gt;-5.2&lt;/span&gt;&lt;span style=&quot;color: #cc66cc;&quot;&gt;.12&lt;/span&gt;-x86_64-1_slack13.0_with_pgsql.txz&lt;/pre&gt;


&lt;p&gt;Pour ceux qui veulent récupérer le slackbuild ou bien le package 64 bits :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://nicolas.steinmetz.fr/slackware/13/php-5.2.12-slack13-with-pgsql.tgz&quot;&gt;Slackbuild PHP 5.2.12 + pgsql&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://nicolas.steinmetz.fr/slackware/13/php-5.2.12-x86_64-1_slack13.0_with_pgsql.txz&quot;&gt;php-5.2.12-x86_64-1_slack13.0_with_pgsql.txz&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Pour ceux qui ne sont pas en 64 bits, il suffit de recompiler en précisant dans &lt;code&gt;php.Slackbuild&lt;/code&gt; :&lt;/p&gt;

&lt;pre class=&quot;bash&quot;&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;ARCH=&lt;/span&gt;$&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#123;&lt;/span&gt;ARCH:-i486&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#125;&lt;/span&gt;&lt;/pre&gt;


&lt;p&gt;Et voilà...&lt;/p&gt;</description>
    
    
    
          <comments>http://nicolas.steinmetz.fr/journal/post/2010/03/06/Extension-Postgres-pour-PHP-sous-Slackware#comment-form</comments>
      <wfw:comment>http://nicolas.steinmetz.fr/journal/post/2010/03/06/Extension-Postgres-pour-PHP-sous-Slackware#comment-form</wfw:comment>
      <wfw:commentRss>http://nicolas.steinmetz.fr/journal/feed/atom/comments/582</wfw:commentRss>
      </item>
    
  <item>
    <title>Eviter le kernel panic en mettant à jour vers slackware current</title>
    <link>http://nicolas.steinmetz.fr/journal/post/2010/03/06/Eviter-le-kernel-panic-en-mettant-%C3%A0-jour-vers-slackware-current</link>
    <guid isPermaLink="false">urn:md5:b8d65e025e1d0834275fc086e5186b06</guid>
    <pubDate>Sat, 06 Mar 2010 10:08:00 +0100</pubDate>
    <dc:creator>Nicolas Steinmetz</dc:creator>
        <category>Trucs de geek</category>
        <category>current</category><category>kernel</category><category>lilo</category><category>noyau</category><category>slackware</category>    
    <description>    &lt;p&gt;Par curiosité, j&amp;quot;ai voulu voir ce que pouvait donner slackware-current (le branche &amp;quot;bleeding-edge&amp;quot; de slackware) et dans un premier temps bien mal m'en a pris vu que cela s'est terminé par un joli &amp;quot;Kernel Panic&amp;quot;. Après discussion avec un collègue et un peu de recherche sur internet, il s'avère qu'à partir du noyau linux 2.6.32, Slackware a désactivé la vieille couche IDE qui faisait que les périphériques étaient vus en &lt;code&gt;/dev/hd*&lt;/code&gt;.&lt;/p&gt;


&lt;p&gt;Voici la manipulation à suivre pour passer d'une slackware 13.0 à slackware current :&lt;/p&gt;


&lt;p&gt;Tout d'abord, utiliser un mirroir slackware-current en éditant &lt;code&gt;/etc/slackpkg/mirrors&lt;/code&gt; en lieu et place du mirroir de la version stable. Mettre à jour ensuite votre distribution :&lt;/p&gt;

&lt;pre class=&quot;bash&quot;&gt;slackpkg update gpg
slackpkg update
slackpkg install-new
slackpkg upgrade-all&lt;/pre&gt;


&lt;p&gt;A ce stade, votre système est à jour et vous avez un joli noyau 2.6.33 en passe de devenir votre noyau par défaut.&lt;/p&gt;


&lt;p&gt;&lt;ins&gt;&lt;strong&gt;Avant&lt;/strong&gt;&lt;/ins&gt; de redémarrer votre machine, il faut faire les manipulations suivantes :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Edition de &lt;code&gt;/etc/lilo.conf&lt;/code&gt; pour remplacer les occurrences de &lt;code&gt;/dev/hd*&lt;/code&gt; par &lt;code&gt;/dev/sd*&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Edition de &lt;code&gt;/etc/fstab&lt;/code&gt; pour remplacer les occurences de &lt;code&gt;/dev/hd*&lt;/code&gt; par &lt;code&gt;/dev/sd*&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Suppression de &lt;code&gt;/etc/udev/rules.d/70-persistent-cd.rules&lt;/code&gt; ; Le fichier sera régénéré correctement au redémarrage de la machine&lt;/li&gt;
&lt;li&gt;Si vous utilisez &lt;code&gt;initrd&lt;/code&gt; au démarrage, il faut éditer &lt;code&gt;/boot/initrd-tree/rootdev&lt;/code&gt; et regénérer votre image initrd via &lt;code&gt;mkinitrd&lt;/code&gt;. Dans mon cas avec une installation de base de slackware, je n'en ai pas eu besoin. Par contre, j'en aurai besoin pour mon &lt;a href=&quot;http://nicolas.steinmetz.fr/journal/post/2009/09/26/Installer-Slackware-13.0-sur-une-cl%C3%A9-USB-pour-utilisation-dans-un-linutop&quot;&gt;linutop&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A ce stade, si vous faites un &lt;code&gt;lilo -v&lt;/code&gt; pour prendre en compte vos modifications, il va hurler puisqu'il ne trouve pas de périphérique &lt;code&gt;/dev/sd*&lt;/code&gt;.&lt;/p&gt;


&lt;p&gt;Pour cela il suffit de tricher un peu (ma partition &lt;code&gt;/boot&lt;/code&gt; est sur &lt;code&gt;/dev/hda2&lt;/code&gt;) :&lt;/p&gt;

&lt;pre class=&quot;bash&quot;&gt;ln -s /dev/hda /dev/sda
ln -s /dev/hda1 /dev/sda1
ln -s /dev/sda2 /dev/sda2
lilo -v
reboot&lt;/pre&gt;


&lt;p&gt;Au redémarrage, udev remplacera vos liens symboliques &lt;code&gt;/dev/sd*&lt;/code&gt; par les bonnes entrées qui vont bien.&lt;/p&gt;


&lt;p&gt;Vais pouvoir aller tester KDE 4.3.5 en attendant que KDE 4.4.x arrive dans slackware-current du coup... &lt;img src=&quot;/journal/themes/default/smilies/smile.png&quot; alt=&quot;:-)&quot; class=&quot;smiley&quot; /&gt;&lt;/p&gt;


&lt;p&gt;Source : &lt;a href=&quot;http://alien.slackbook.org/blog/robbys-libata-switchover-howto/&quot; hreflang=&quot;en&quot;&gt;Robby’s libata switchover howto&lt;/a&gt;&lt;/p&gt;</description>
    
    
    
          <comments>http://nicolas.steinmetz.fr/journal/post/2010/03/06/Eviter-le-kernel-panic-en-mettant-%C3%A0-jour-vers-slackware-current#comment-form</comments>
      <wfw:comment>http://nicolas.steinmetz.fr/journal/post/2010/03/06/Eviter-le-kernel-panic-en-mettant-%C3%A0-jour-vers-slackware-current#comment-form</wfw:comment>
      <wfw:commentRss>http://nicolas.steinmetz.fr/journal/feed/atom/comments/581</wfw:commentRss>
      </item>
    
  <item>
    <title>Pour ceux qui utiliseraient encore une url en unelectronlibre.info</title>
    <link>http://nicolas.steinmetz.fr/journal/post/2010/01/27/Pour-ceux-qui-utiliseraient-encore-une-url-en-unelectronlibre.info</link>
    <guid isPermaLink="false">urn:md5:bc0bf1de39423108db78afeaadf24920</guid>
    <pubDate>Wed, 27 Jan 2010 04:14:00 +0100</pubDate>
    <dc:creator>Nicolas Steinmetz</dc:creator>
        <category>feedburner</category><category>rss</category><category>unelectronlibre.info</category>    
    <description>    &lt;p&gt;Le domaine expire demain et ne sera pas renouvelé puisque cela fait plus d'un an que tout a migré sur &lt;a href=&quot;http://nicolas.steinmetz.fr&quot; title=&quot;http://nicolas.steinmetz.fr&quot;&gt;http://nicolas.steinmetz.fr&lt;/a&gt; avec les redirections permanentes qui vont bien &lt;img src=&quot;/journal/themes/default/smilies/wink.png&quot; alt=&quot;;-)&quot; class=&quot;smiley&quot; /&gt;&lt;/p&gt;


&lt;p&gt;Pour les 219 abonnés (tout ça ? merci à vous &lt;img src=&quot;/journal/themes/default/smilies/smile.png&quot; alt=&quot;:-)&quot; class=&quot;smiley&quot; /&gt; ) qui utilisent l'url FeedBurner (&lt;a href=&quot;http://feeds.feedburner.com/UnElectronLibre&quot; title=&quot;http://feeds.feedburner.com/UnElectronLibre&quot;&gt;http://feeds.feedburner.com/UnElect...&lt;/a&gt;),  pas de souci, je continue à la maintenir. Rien à changer de ce côté là...&lt;/p&gt;


&lt;p&gt;Certains lecteurs voudraient-ils recevoir le &lt;a href=&quot;http://feedburner.google.com/fb/a/mailverify?uri=UnElectronLibre&amp;amp;loc=fr_FR&quot; hreflang=&quot;fr&quot;&gt;flux RSS par email&lt;/a&gt; ? C'est maintenant possible...&lt;/p&gt;</description>
    
    
    
          <comments>http://nicolas.steinmetz.fr/journal/post/2010/01/27/Pour-ceux-qui-utiliseraient-encore-une-url-en-unelectronlibre.info#comment-form</comments>
      <wfw:comment>http://nicolas.steinmetz.fr/journal/post/2010/01/27/Pour-ceux-qui-utiliseraient-encore-une-url-en-unelectronlibre.info#comment-form</wfw:comment>
      <wfw:commentRss>http://nicolas.steinmetz.fr/journal/feed/atom/comments/580</wfw:commentRss>
      </item>
    
  <item>
    <title>Un modem peut en cacher un autre</title>
    <link>http://nicolas.steinmetz.fr/journal/post/2010/01/26/Un-modem-peut-en-cacher-un-autre</link>
    <guid isPermaLink="false">urn:md5:b6ee67946b61e501874f322c28fa96e5</guid>
    <pubDate>Tue, 26 Jan 2010 23:00:00 +0100</pubDate>
    <dc:creator>Nicolas Steinmetz</dc:creator>
        <category>Trucs de geek</category>
        <category>geek</category><category>polar</category>    
    <description>    &lt;p&gt;Ci-après ma contribution à &lt;a href=&quot;http://polar-geek.org/&quot; hreflang=&quot;fr&quot;&gt;Polar Geek&lt;/a&gt;, initiative pour le moins ingénieuse de &lt;a href=&quot;http://jehaisleprintemps.net/blog/&quot; hreflang=&quot;fr&quot;&gt;Bruno Bord&lt;/a&gt;.&lt;/p&gt;


&lt;p&gt;Mon téléphone s'agita, le message fut bref :&lt;br /&gt;
- &amp;quot;Rendez-vous au Bar de la Taupe à 15 heures&amp;quot;&lt;br /&gt;
J'eus à peine le temps d'assimiler le message que l'appel était fini. Sortant de ma torpeur, je notais rapidement le message sur un bout de papier tant qu'il résonnait encore en ma mémoire. Je ne connaissais qu'une personne en mesure de me passer ce type d'appel et cela faisait bien des années que je n'avais pas entendu cette voix. Me réveillant doucement en sirotant mon café, je songeais à ce message et surtout à son émetteur. Les souvenirs remontaient au fur et à mesure et ma mémoire commençait à rassembler des bribes de visage dans mon esprit. Rigolo, il se rappelait que j'évitais de travailler en début d'après-midi pour cause de digestion et de sa sieste associée. Il ne prenait aucun risque quant à ma disponibilité de me fixer un rendez-vous à 15h dans ce lieu... Il était donc toujours de la partie ? J'aurais pensé qu'il aurait fini par renoncer... L'après-midi s'annonçait intéressant et pour le moins intrigant...&lt;/p&gt;


&lt;p&gt;La matinée passa machinalement avec son lot de paperasses et ses coups de téléphone. Les quelques affaires en cours n'avaient pas grand intérêt mais me permettaient de payer mon toit, mon manger et les croquettes du chat. Pour ne pas rater mon rendez-vous, je mangeai léger et me rendis en marchant jusqu'au Bar de la Taupe. A défaut de dormir, ce sera une marche digestive...&lt;/p&gt;


&lt;p&gt;Le Bar de la Taupe a pour intérêt d'y accueillir une grande diversité de personnes. Des jeunes lycéens crapoteurs aux cadres tirés à quatre épingles, il se transformait en &amp;quot;salon de thé&amp;quot; tous les jeudi après-midi pour y accueillir un groupe de mamies terribles, plus portées sur le panaché que le thé et plus sur leurs parties de poker que leur tricot. Je m'assis donc en terrasse, afin de profiter des quelques rayons de soleil et commandai mon café. A peine eus-je le temps de poser ma veste qu'il arriva. Il n'avait pas changé malgré toutes ces années. Toujours habillé de son vieux costume pastel et de son noeud-papillon, il était maigre comme un clou. De prime abord, il ne ressemblait à rien, beaucoup de personnes s'y étaient laissés prendre et avaient fini par perdre leur dossier contre lui. Denis Zot, alias Papy, s'assit et commanda un café avec son nuage de lait.&lt;br /&gt;
&amp;quot; Toujours avocat ?&amp;quot;, lançai-je&lt;br /&gt;
&amp;quot; Bien évidemment, le petit peuple a besoin qu'on le représente !&amp;quot;&lt;br /&gt;
Ainsi, il n'avait vraiment pas changé. Idéaliste jusqu'au bout des ongles, il était le chevalier servant de la justice dans un monde qui grouillait de requins à la solde de gros intérêts privés. Personne n'avait donc eu raison de lui jusqu'à présent ; ça laissait présager de bonnes choses.&lt;br /&gt;
&amp;quot;J'ai un dossier pour toi&amp;quot;, me dit-il, &amp;quot;c'est urgent et tu es le seul qui peut m'aider&amp;quot;&lt;br /&gt;
Perplexe, je le laissais continuer :&lt;br /&gt;
&amp;quot;Tes derniers dossiers ne t'ayant pas tenu au fait de l'actualité informatico-légale, il se trouve que depuis plusieurs mois, j'ai mis à mal bon nombre de majors et des membres de nos gouvernements dans leurs tentatives de poursuite d'internautes pour des histoires de copyrights. Au début, cela était assez simple, il suffisait de trouver le vide de procédure pour faire tomber le château de cartes. Même si la presse a peu relayer l'information, j'ai quand même réussi à évincer A. Dopi de toute velléité électorale...&amp;quot;&lt;br /&gt;
Ah oui songeais-je. Je m'en souviens maintenant, c'était l'une des dernières informations qu'avait remonté un vieux script en analysant des flux RSS que je pensais périmés. Depuis l'avénement des &amp;quot;Etats Majors&amp;quot; en lieu et place des &amp;quot;Etats Nations&amp;quot; au début du 21ème siècle, la presse était sous contrôle et il était de plus en plus complexe d'échapper à la propagande d'Etat. Le modèle Chinois s'était imposé de part le monde, toute l'information était contrôlée par l'une des cinq Majors et les bribes de gouvernement qui restait ne faisait que leur obéir aveuglément. Arrestations sommaires et mise sur écoute se faisaient à tour de bras. Papy, en face de moi, faisait donc la résistance et jouait le rôle de Chevalier Blanc du petit peuple. Il devait être considéré comme l'ennemi public n°1 ou presque. Il ne devait pas non plus lui rester beaucoup de soutien. Dans quoi allait-il m'embarquer ???&lt;br /&gt;
&amp;quot;... mais bon revenons-en à notre affaire&amp;quot; me dit-il. &amp;quot;Mon client, qui comme moi, milite pour le retour aux libertés fondamentales, après moult menaces (comprendre des courriers envoyés par le ministère de la culture pour des activités soit-disant illégales) vient d'être arrêté. S'il ne signe pas un faux aveu, il sera expédié dans son pays natal avec sa femme et ses deux enfants. S'ils repartent en Birmanie, ce sont les pompes funèbres qui vont les accueillir à l'aéroport...&amp;quot;&lt;br /&gt;
&amp;quot;Qu'attends-tu de moi ?&amp;quot;&lt;br /&gt;
&amp;quot;Trouve la preuve du complot ; seul toi peut la trouver et je n'ai confiance qu'en toi.&amp;quot;&lt;br /&gt;
&amp;quot;Et j'y gagne quoi ? Hormis de passer sur une liste noire ?&amp;quot;&lt;br /&gt;
&amp;quot;Financièrement, donne-moi ton prix et tu l'auras. La question n'est pas là. Comme tu le sais peut-être, la contestation gronde et nous avons besoin d'un coup d'éclat pour faire prendre conscience au reste du peuple que la solution est là. On peut mettre fin au joug des Majors. Ce que je t'offre, c'est la liberté !&amp;quot;
Le bougre, il savait que j'étais sensible à ces mots et que je ne supporterais pas que l'on puisse faire du mal à des enfants. Et puis financièrement, je n'avais pas trop le choix, je commençais à prendre les raviolis en grippe...&lt;br /&gt;
&amp;quot;Ok, j'accepte ; qu'as tu pour moi ?&amp;quot;&lt;br /&gt;
&amp;quot;La clé de sa maison, la milice du Ministère de la Culture ne s'y est pas encore rendue. Ils iront demain d'après un de mes informateurs. C'est ton unique chance de trouver les preuves de son innocence avant qu'ils ne déposent les fausses. C'est tout ce que j'ai pour toi...&amp;quot;&lt;br /&gt;
&amp;quot;Bien, j'y vais de ce pas...&amp;quot;&lt;br /&gt;
&amp;quot;Fais attention à toi et surveille bien tes échanges&amp;quot; me dit-il. Alors qu'il se levait pour partir il me dit &amp;quot;Tu en auras besoin aussi : Pomme Noisette&amp;quot; et il disparut.&lt;/p&gt;


&lt;p&gt;Je finis d'un trait mon café, payai l'addition. Je repartis au bureau mais plutôt que de monter à l'étage, je pris le chemin de la cave. Il me fallait du matériel spécifique et qu'on ne remonte pas jusqu'à moi si je me faisais prendre. Je ne faisais aucunement confiance au matériel dernier cri qui était sur mon bureau. Pour mes affaires courantes, cela allait bien mais pas pour des situations comme celles-ci. Je ressortis mon petit netbook sous Slackware en disant &amp;quot;Hello Citrouille, j'ai du boulot pour toi&amp;quot;. Au moins avec Slackware, on sait que l'on installe les sources officielles. Pas de risque de rootkit ou autre tripatouillage exotique. Le temps de vérifier le bon état des batteries et de son bon fonctionnement et je prenais la direction de la maison du client de Papy.&lt;/p&gt;


&lt;p&gt;La maison était située en banlieue Ouest de Paris. Elle était au milieu d'une résidence calme et agréable. Un bon coin pour une vie de famille songeais-je. Un jour peut-être... Après avoir fait un petit tour de la maison pour vérifier de la véracité des propos de l'informateur de Papy, je m'y introduisis sans problème. Pas de voisine curieuse pour casser mon approche, vraiment chouette ce quartier. L'intérieur était propre et bien rangé. Quelques jouets dispersés témoignaient de la présence d'enfants.&lt;br /&gt;
Je m'attelais au travail et cherchais les ordinateurs. Une fois le premier trouvé, je remarquai que le réseau était filaire. Chose étrange de nos jours mais trahissant le coté paranoïaque du client. En effet, le Wifi s'était imposé comme mode d'accès par défaut mais sa médiocre sécurité permettaient une écoute des plus aisées par nos milices étatiques ou la multitudes de sociétés privées dont les résultats étaient basées sur la délation d'internautes. Au moins avec un réseau filaire, il est aisé de trouver les différents ordinateurs. Je dénombrais 2 portables et deux tours, ainsi qu'une sorte de client léger collé sous le bureau, au même niveau que les prises électriques. Avant d'entrer plus loin dans mon investigations, je branchais Citrouille pour vérifier quelques informations supplémentaires : pas de réseau wifi à proximité, donc j'ai bien tous mes PCs. &lt;br /&gt;
Je commençais mon analyse par les deux tours situés dans les chambres des enfants. Je les débranchais du réseau et y introduisis ma clé USB magique contenant un OS minimaliste et surtout des outils d'analyse rapide. Ces derniers ne m'apprirent pas grand chose des deux tours. Les logiciels étaient tous en règles et à jour et les données étaient celles d'un ordinateurs d'enfant : des photos, des jeux vidéos, quelques listes aux Père Noel et quelques menues bricoles. La seule chose repérée fut la présence d'un proxy. Tiens, le père de famille semble vouloir protéger ses enfants. Cela doit correspondre au client léger repéré sous le bureau. Passons à autre chose...&lt;/p&gt;


&lt;p&gt;Je décidais alors de brancher Citrouille sur le réseau en utilisant le câble réseau d'une des tours pour voir s'il y avait des activités suspectes. J'activais le mode furtif et en lecture seule pour éviter toute intrusion désobligeante. Le temps que Citrouille s'initialise, je poursuivais l'analyse des deux portables. Pour l'un des deux, ce fut facile, il était complètement HS et vue la dose de poussière sur la machine, cela ne datait pas d'hier. Pour le second, il était en veille et tout de suite un mot de passe me fut demandé. J'avais deux solutions pour cet ordinateur : soit le redémarrer sur ma clé usb magique et analyser son contenu au risque de perdre les données actuellement en cours ; soit le sortir de sa veille et l'analyser en direct live, sans trop savoir ce qu'il contenait tant d'un point de vue données que de celui du mouchard. Il me fallait bien sur trouver le mot de passe... Un mouvement de lumière attira mon attention. Je retins mon souffle avant de constater que c'était seulement lié au soleil qui se couchait et dont la lumière se reflétait dans la porte du four. Et là, le déclic : Pomme Noisette pardi ! Le mot de passe en ma possession, cela ne m'aidait pas pour autant sur l'attitude à suivre vis à vis de ce portable.&lt;/p&gt;


&lt;p&gt;Mon attention se déporta alors sur le client léger placé sous le bureau. Je connaissais ce genre de modèle, une configuration minimaliste qui ne prend pas de place et qui permet de rendre des services. Une invite me demanda un mot de passe et Pomme Noisette fut le sésame. Mes soupçons étaient justes, la machine faisait bien office de proxy particulièrement agressif. Des tunnels VPN étaient en outre établis et obéissaient à des règles de routage bien particulières. Tout était fait pour protéger les internautes de la maison et anonymiser au maximum certaines pratiques. Le client de Papy est pour le moins paranoïaque et la réalité ne pouvait que lui donner raison. Toutefois, il s'était fait prendre. Il me restait à trouver comment...&lt;/p&gt;


&lt;p&gt;Tout d'un coup, Citrouille se mit à biper dans tous les sens. Elle m'indiqua que le réseau contenait une activité anormale de programmes cherchant à récupérer des informations de tout ce qui circulait sur le réseau et/ou à s'introduire sur les machines présentes sur le réseau. A priori, elle ne s'était pas fait prendre mais il allait falloir la jouer finement pour en apprendre un maximum sans se faire prendre ou montrer que quelqu'un cherche à innocenter le client de Papy... &lt;br /&gt;
Il me fallait maintenant accéder au contenu du portable à tout prix sans éveiller les soupçons. Du client légér, je récupérais toutes les informations réseau sur le profil du portable (Adresse MAC, etc). Ceci s'ajoutant aux informations produit écrites sur le portable, j'étais en mesure de créer un profil factice sur Citrouille pour se faire passer pour le portable afin de pouvoir l'analyser tranquillement. Alors que je notais les informations sur un bout de papier, je notais la présence d'un bon de livraison émis par le FAI pour le remplacement du modem/routeur. En y regardant de plus près, cela datait de la semaine précédente... tiens donc. Le courrier stipulait que l'équipe du FAI en charge de la surveillance du matériel avait noté des incidents sur le modem. Par conséquent, un modem de rechange était envoyé de façon préventive et moyennant l'envoi du modem originel pour réparation. Mon radar vit rouge tout de suite, se pourrait-il que le modem soit le responsable de l'histoire ?&lt;/p&gt;


&lt;p&gt;Rejoignant Citrouille, je peaufinais mon plan d'attaque. Citrouille allait se faire passer pour le portable et me permettrait d'analyser le modem à son insu en lui donnant des données bidon à manger en masse. Ces données était constituées d'un savant mix de consultations de sites honnêtes, téléchargement de binaires et d'images de femmes plus ou moins dénudées, histoire de faire tilter tout algo de surveillance comme il se doit. Citrouille était prête, il ne me restait plus qu'à taper sur &amp;quot;Entrée&amp;quot;. Une pression de touche plus tard et simulant une micro-coupure réseau, Citrouille avait pris la place du portable. J'ouvris alors la session et lança le gestionnaire des tâches ; aucune activité suspecte pour le moment. Il cherchait à se reconnecter sur le réseau mais je ne craignais rien, Citrouille l'empêcherait de revenir en ligne. Je fis une passe rapide sur l'ordinateur. Rapidement je découvris un dossier &amp;quot;Téléchargement&amp;quot; contenant quelques oeuvres piratées à des dates variées. Cela était vraiment trop gros comme pièce à conviction mais à l'heure des Etats Majors, cela suffisait amplement pour vous mettre à l'ombre et vider votre compte en banque. Surtout, cela ne collait pas avec ce que j'avais pu voir précédemment sur le client de Papy. Un Dialer dont le nom contenait celui du FAI chercha alors à s'exécuter ; louche me dis-je et tuait alors le processus. Pour éviter tout autre problème, j'arrêtai l'ordinateur pour une analyse ultérieure. Mon regard revint sur le modem, qui de ses diodes me narguait, je le savais...&lt;/p&gt;


&lt;p&gt;Citrouille me donna la solution. De nombreuses connexions avaient cherché à se connecter sur le portable pour récupérer moult informations et surtout y placer les mêmes fichiers que ceux que j'avais vu dans le dossier &amp;quot;Téléchargement&amp;quot;. Je le tenais mon coupable et il devenait aisé de reconstituer l'histoire. En recevant son nouveau modem, le client de Papy bien qu'habituellement derrière son proxy, dut pour une fois se connecter en direct au modem. A ceci s'ajoutant le CD d'installation dont venait surement le Dialer (et surement d'autres exécutables peu catholiques), le portable avait été compromis à ce moment là. Les autorités n'avaient alors plus qu'à attendre que le modem fasse son travail et de saisir l'individu quand bon leur semblait. L'énigme était résolue, je remis les choses en ordre et quittais discrètement la maison du client de Papy.&lt;/p&gt;


&lt;p&gt;La fin de l'affaire fut explosive. Après avoir fait part de mes découvertes à Papy, celui-ci contacta différents collectifs et associations en faveur de la liberté pour créer un effet presse hors du commun. Lorsque la communication fut lancée, les autorités ne purent la retenir et elle déferla sur l'espace public. Le quidam moyen s'empara du sujet et des manifestations spontanées eurent lieu aux quatre coins du pays. L'opposition bien qu'affaiblie tira son épingle du jeu en faisant part de son expérience à ce mouvement citoyen qui grossissait de façon exponentielle. Le gouvernement chercha à faire sauter quelques fusibles en la présence de Monsieur Lop Psi et d'A. Cta mais cela ne suffit pas. Après un mois de manifestation, il fut contraint à la démission et de désapprouver les Majors. Un nouveau gouvernement fut élu et il s'empressa de rétablir bon nombre de libertés fondamentales bafouées depuis tant d'années, ainsi que la neutralité du net. Quelques FAI jugés trop proches des Majors firent faillite et il fut décider de confier les accès à internet à des associations citoyennes.&lt;/p&gt;


&lt;p&gt;Personnellement, je savourais cette victoire même si je regrettais de ne pas avoir demandé une rémunération supérieure pour ce que j'avais fait. Je me consolais néanmoins en me disant que de toutes façons, la liberté n'a pas de prix...&lt;/p&gt;


&lt;p&gt;Note de l'auteur : au départ, j'étais parti sur tout à fait autre chose. Le revirement s'est fait suite à la lecture du billet &amp;quot;&lt;a href=&quot;http://blog.fdn.fr/post/2010/01/21/La-quadrature-jette-l-éponge&quot; hreflang=&quot;fr&quot;&gt;La Quadrature jette l'éponge&lt;/a&gt;&amp;quot;. Il semblerait que nous prenions une route où mon histoire pourrait devenir possible (tout au moins le début, pour la fin j'en doute). Après &lt;a href=&quot;http://fr.wikipedia.org/wiki/Droit_d'auteur_et_droits_voisins_dans_la_société_de_l'information&quot; hreflang=&quot;fr&quot;&gt;DADVSI&lt;/a&gt; et &lt;a href=&quot;http://fr.wikipedia.org/wiki/Loi_Création_et_Internet&quot; hreflang=&quot;fr&quot;&gt;HADOPI&lt;/a&gt;, il y maintenant &lt;a href=&quot;http://fr.wikipedia.org/wiki/Loi_d'orientation_et_de_programmation_pour_la_performance_de_la_sécurité_intérieure&quot; hreflang=&quot;fr&quot;&gt;LOPPSI&lt;/a&gt; et &lt;a href=&quot;http://www.laquadrature.net/fr/acta-attaque-linternet-attaquons-acta&quot; hreflang=&quot;fr&quot;&gt;ACTA&lt;/a&gt;... Pour soutenir &lt;a href=&quot;http://www.laquadrature.net/fr/&quot; hreflang=&quot;fr&quot;&gt;la Quadrature du Net&lt;/a&gt;, il vous est possible de &lt;a href=&quot;http://www.laquadrature.net/Soutien2010&quot; hreflang=&quot;fr&quot;&gt;faire un don&lt;/a&gt; si vous n'avez pas la possibilité de les aider autrement...&lt;/p&gt;</description>
    
    
    
          <comments>http://nicolas.steinmetz.fr/journal/post/2010/01/26/Un-modem-peut-en-cacher-un-autre#comment-form</comments>
      <wfw:comment>http://nicolas.steinmetz.fr/journal/post/2010/01/26/Un-modem-peut-en-cacher-un-autre#comment-form</wfw:comment>
      <wfw:commentRss>http://nicolas.steinmetz.fr/journal/feed/atom/comments/579</wfw:commentRss>
      </item>
    
  <item>
    <title>Créer votre première application CouchDB (Partie 4)</title>
    <link>http://nicolas.steinmetz.fr/journal/post/2010/01/06/Cr%C3%A9er-votre-premi%C3%A8re-application-CouchDB-%28Partie-4%29</link>
    <guid isPermaLink="false">urn:md5:b2572ccf598221bb9e2bf8b9f749a1f2</guid>
    <pubDate>Wed, 06 Jan 2010 21:58:00 +0100</pubDate>
    <dc:creator>Nicolas Steinmetz</dc:creator>
        <category>CouchDB</category>
        <category>couchdb</category>    
    <description>    &lt;p&gt;Pour ceux qui utiliserait le code mis dans &lt;a href=&quot;http://nicolas.steinmetz.fr/journal/post/2009/07/03/Couchapp-%3A-cr%C3%A9er-votre-premi%C3%A8re-application-CouchDB-%28Partie-2%29&quot;&gt;les exemples&lt;/a&gt;, sachez qu'à partir de la version 0.10,  le contenu du fichier &lt;code&gt;lists/all.js&lt;/code&gt; qui s'écrivait :&lt;/p&gt;

&lt;pre class=&quot;javascript&quot;&gt;&lt;span style=&quot;color: #003366; font-weight: bold;&quot;&gt;function&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;head, row, req, info&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt; &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#123;&lt;/span&gt;
  &lt;span style=&quot;color: #009900; font-style: italic;&quot;&gt;// !json templates.all&lt;/span&gt;
  &lt;span style=&quot;color: #009900; font-style: italic;&quot;&gt;// !code vendor/couchapp/path.js&lt;/span&gt;
  &lt;span style=&quot;color: #009900; font-style: italic;&quot;&gt;// !code vendor/couchapp/template.js&lt;/span&gt;
 
  &lt;span style=&quot;color: #000066; font-weight: bold;&quot;&gt;return&lt;/span&gt; respondWith&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;req, &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#123;&lt;/span&gt;
    html : &lt;span style=&quot;color: #003366; font-weight: bold;&quot;&gt;function&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt; &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#123;&lt;/span&gt;
      &lt;span style=&quot;color: #000066; font-weight: bold;&quot;&gt;if&lt;/span&gt; &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;head&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt; &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#123;&lt;/span&gt;
        &lt;span style=&quot;color: #000066; font-weight: bold;&quot;&gt;return&lt;/span&gt; template&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;templates.&lt;span style=&quot;color: #006600;&quot;&gt;all&lt;/span&gt;.&lt;span style=&quot;color: #006600;&quot;&gt;head&lt;/span&gt;, &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#123;&lt;/span&gt;
          assets : assetPath&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;,
        &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#125;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;;
      &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#125;&lt;/span&gt; &lt;span style=&quot;color: #000066; font-weight: bold;&quot;&gt;else&lt;/span&gt; &lt;span style=&quot;color: #000066; font-weight: bold;&quot;&gt;if&lt;/span&gt; &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;row&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt; &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#123;&lt;/span&gt;
        &lt;span style=&quot;color: #000066; font-weight: bold;&quot;&gt;return&lt;/span&gt; template&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;templates.&lt;span style=&quot;color: #006600;&quot;&gt;all&lt;/span&gt;.&lt;span style=&quot;color: #006600;&quot;&gt;row&lt;/span&gt;, &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#123;&lt;/span&gt;
          fav: row.&lt;span style=&quot;color: #006600;&quot;&gt;value&lt;/span&gt;,
        &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#125;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;;
      &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#125;&lt;/span&gt; &lt;span style=&quot;color: #000066; font-weight: bold;&quot;&gt;else&lt;/span&gt; &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#123;&lt;/span&gt;
        &lt;span style=&quot;color: #000066; font-weight: bold;&quot;&gt;return&lt;/span&gt; template&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;templates.&lt;span style=&quot;color: #006600;&quot;&gt;all&lt;/span&gt;.&lt;span style=&quot;color: #006600;&quot;&gt;tail&lt;/span&gt;, &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#123;&lt;/span&gt;
            assets : assetPath&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;,
        &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#125;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;;
      &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#125;&lt;/span&gt;
    &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#125;&lt;/span&gt;,
  &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#125;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;
&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#125;&lt;/span&gt;;&lt;/pre&gt;


&lt;p&gt;s'écrit désormais :&lt;/p&gt;

&lt;pre class=&quot;javascript&quot;&gt;&lt;span style=&quot;color: #003366; font-weight: bold;&quot;&gt;function&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;head, req&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt; &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#123;&lt;/span&gt;
  &lt;span style=&quot;color: #009900; font-style: italic;&quot;&gt;// !json templates.all&lt;/span&gt;
  &lt;span style=&quot;color: #009900; font-style: italic;&quot;&gt;// !code vendor/couchapp/path.js&lt;/span&gt;
  &lt;span style=&quot;color: #009900; font-style: italic;&quot;&gt;// !code vendor/couchapp/date.js&lt;/span&gt;
  &lt;span style=&quot;color: #009900; font-style: italic;&quot;&gt;// !code vendor/couchapp/template.js&lt;/span&gt;
  &lt;span style=&quot;color: #009900; font-style: italic;&quot;&gt;// !json myfav&lt;/span&gt;
&amp;nbsp;
  provides&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #3366CC;&quot;&gt;&amp;quot;html&amp;quot;&lt;/span&gt;, &lt;span style=&quot;color: #003366; font-weight: bold;&quot;&gt;function&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt; &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#123;&lt;/span&gt;
      
      send&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;template&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;templates.&lt;span style=&quot;color: #006600;&quot;&gt;all&lt;/span&gt;.&lt;span style=&quot;color: #006600;&quot;&gt;head&lt;/span&gt;, &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#123;&lt;/span&gt;
          assets : assetPath&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;,
          title : myfav.&lt;span style=&quot;color: #006600;&quot;&gt;title&lt;/span&gt;,
       &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#125;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;;
      
      &lt;span style=&quot;color: #003366; font-weight: bold;&quot;&gt;var&lt;/span&gt; row, key;
      &lt;span style=&quot;color: #000066; font-weight: bold;&quot;&gt;while&lt;/span&gt; &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;row = getRow&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt; &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#123;&lt;/span&gt;
        key = row.&lt;span style=&quot;color: #006600;&quot;&gt;key&lt;/span&gt;;
        &lt;span style=&quot;color: #003366; font-weight: bold;&quot;&gt;var&lt;/span&gt; fav = row.&lt;span style=&quot;color: #006600;&quot;&gt;value&lt;/span&gt;;
        send&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;template&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;templates.&lt;span style=&quot;color: #006600;&quot;&gt;all&lt;/span&gt;.&lt;span style=&quot;color: #006600;&quot;&gt;row&lt;/span&gt;, &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#123;&lt;/span&gt;
            url: fav.&lt;span style=&quot;color: #006600;&quot;&gt;url&lt;/span&gt;,
            title: fav.&lt;span style=&quot;color: #006600;&quot;&gt;title&lt;/span&gt;,
            description: fav.&lt;span style=&quot;color: #006600;&quot;&gt;description&lt;/span&gt;,                      
        &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#125;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;;
      &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#125;&lt;/span&gt;
      
      &lt;span style=&quot;color: #000066; font-weight: bold;&quot;&gt;return&lt;/span&gt; template&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;templates.&lt;span style=&quot;color: #006600;&quot;&gt;all&lt;/span&gt;.&lt;span style=&quot;color: #006600;&quot;&gt;tail&lt;/span&gt;, &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#123;&lt;/span&gt;
            assets : assetPath&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;,
      &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#125;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;;
  &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#125;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;;
&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#125;&lt;/span&gt;;&lt;/pre&gt;


&lt;p&gt;et bien sur &lt;code&gt;templates/all/row.html&lt;/code&gt; devient :&lt;/p&gt;

&lt;pre&gt;
&amp;lt;dt&amp;gt;&amp;lt;a href=&amp;quot;&amp;lt;%= url %&amp;gt;&amp;quot;&amp;gt;&amp;lt;%= title %&amp;gt;&amp;lt;/a&amp;gt;&amp;lt;/dt&amp;gt;
&amp;lt;dd&amp;gt;&amp;lt;%= description %&amp;gt;&amp;lt;/dd&amp;gt;
&lt;/pre&gt;


&lt;p&gt;Au passage, il m'a fallu récupérer la nouvelle version de &lt;code&gt;vendor/couchapp/path.js&lt;/code&gt;.&lt;/p&gt;


&lt;p&gt;Pour ceux que ça intéresse, le code est disponible ici : &lt;a href=&quot;http://bitbucket.org/nsteinmetz/mycouchfav/&quot; hreflang=&quot;fr&quot;&gt;http://bitbucket.org/nsteinmetz/mycouchfav/&lt;/a&gt;.&lt;/p&gt;


&lt;p&gt;Pour ceux qui veulent voir le rendu :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Show du document &amp;quot;couchdbkit&amp;quot; : &lt;a href=&quot;http://nsteinmetz.cloudant.com:5984/mycouchfav/_design/mycouchfav/_show/fav/couchdbkit&quot;&gt;http://nsteinmetz.cloudant.com:5984/mycouchfav/_design/mycouchfav/_show/fav/couchdbkit&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;List all favs : &lt;a href=&quot;http://nsteinmetz.cloudant.com:5984/mycouchfav/_design/mycouchfav/_list/all/favs&quot;&gt;http://nsteinmetz.cloudant.com:5984/mycouchfav/_design/mycouchfav/_list/all/favs&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Voilà, c'était histoire de me remotiver dans cette prise en main de CouchDB/CouchApp - peut-être que la prochaine fois, on verra un formulaire de soumission de favoris... &lt;img src=&quot;/journal/themes/default/smilies/wink.png&quot; alt=&quot;;-)&quot; class=&quot;smiley&quot; /&gt;&lt;/p&gt;</description>
    
    
    
          <comments>http://nicolas.steinmetz.fr/journal/post/2010/01/06/Cr%C3%A9er-votre-premi%C3%A8re-application-CouchDB-%28Partie-4%29#comment-form</comments>
      <wfw:comment>http://nicolas.steinmetz.fr/journal/post/2010/01/06/Cr%C3%A9er-votre-premi%C3%A8re-application-CouchDB-%28Partie-4%29#comment-form</wfw:comment>
      <wfw:commentRss>http://nicolas.steinmetz.fr/journal/feed/atom/comments/577</wfw:commentRss>
      </item>
    
  <item>
    <title>CouchDB 0.10.1 on Slackware 13.0</title>
    <link>http://nicolas.steinmetz.fr/journal/post/2010/01/03/CouchDB-0.10.1-on-Slackware-13.0</link>
    <guid isPermaLink="false">urn:md5:dfde98798fb0d4e882768d78a1d4153a</guid>
    <pubDate>Sun, 03 Jan 2010 23:38:00 +0100</pubDate>
    <dc:creator>Nicolas Steinmetz</dc:creator>
        <category>CouchDB</category>
        <category>couchdb</category><category>slackbuild</category><category>slackware</category>    
    <description>    &lt;h3&gt;Dépendances de CouchDB&lt;/h3&gt;


&lt;p&gt;Dans un premier temps, il vous faut récupérer les slackbuilds suivants :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://slackbuilds.org/repository/13.0/network/js/&quot; hreflang=&quot;en&quot;&gt;js&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://slackbuilds.org/repository/13.0/libraries/icu4c/&quot; hreflang=&quot;en&quot;&gt;icu4c&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://slackbuilds.org/repository/13.0/development/erlang-otp/&quot; hreflang=&quot;en&quot;&gt;erlang-otp&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Les &lt;a href=&quot;http://books.couchdb.org/relax/appendix/installing-from-source&quot; hreflang=&quot;en&quot;&gt;autres dépendances&lt;/a&gt; sont normalement satisfaites :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;curl : à vérifier en utilisant un &lt;code&gt;curl-config --version&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;make &amp;amp; gcc&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Créer les packages des slackbuids (les slackbuils sont prévus pour i486 ; si vous êtes en 64 bits, éditer le fichier &amp;lt;package&amp;gt;.Slackbuild pour modifier la valeur de &lt;code&gt;ARCH&lt;/code&gt;.&lt;/p&gt;


&lt;p&gt;Pour que le SlackBuild fonctionne, il vous faut mettre l'archive des sources du package à créer dans le répertoire créé en décompressant le fichier slackbuild.&lt;/p&gt;

&lt;pre class=&quot;bash&quot;&gt;tar xzf js.tar.gz
&lt;span style=&quot;color: #000066;&quot;&gt;cd&lt;/span&gt; js
./js.SlackBuild
=&amp;gt; Slackware package /tmp/js&lt;span style=&quot;color: #cc66cc;&quot;&gt;-1.8&lt;/span&gt;.0_rc1-x86_64-1_SBo.tgz created.
&amp;nbsp;
tar xzf icu4c.tar.gz
&lt;span style=&quot;color: #000066;&quot;&gt;cd&lt;/span&gt; ../icu4c
./icu4c.SlackBuild
=&amp;gt; Slackware package /tmp/icu4c&lt;span style=&quot;color: #cc66cc;&quot;&gt;-4.2&lt;/span&gt;&lt;span style=&quot;color: #cc66cc;&quot;&gt;.1&lt;/span&gt;-x86_64-1_SBo.tgz created
&amp;nbsp;
tar xzf erlang-otp.tar.gz
&lt;span style=&quot;color: #000066;&quot;&gt;cd&lt;/span&gt; erlang-otp
./erlang-otp.SlackBuild
=&amp;gt; Slackware package /tmp/erlang-otp-13B03-x86_64-1_SBo.tgz created.&lt;/pre&gt;


&lt;p&gt;Installer ensuite les packages créés :&lt;/p&gt;

&lt;pre class=&quot;bash&quot;&gt;nicolas@cassis:/tmp$ sudo installpkg icu4c&lt;span style=&quot;color: #cc66cc;&quot;&gt;-4.2&lt;/span&gt;&lt;span style=&quot;color: #cc66cc;&quot;&gt;.1&lt;/span&gt;-x86_64-1_SBo.tgz 
Verifying package icu4c&lt;span style=&quot;color: #cc66cc;&quot;&gt;-4.2&lt;/span&gt;&lt;span style=&quot;color: #cc66cc;&quot;&gt;.1&lt;/span&gt;-x86_64-1_SBo.tgz.                   
Installing package icu4c&lt;span style=&quot;color: #cc66cc;&quot;&gt;-4.2&lt;/span&gt;&lt;span style=&quot;color: #cc66cc;&quot;&gt;.1&lt;/span&gt;-x86_64-1_SBo.tgz:                  
PACKAGE DESCRIPTION:                                              
&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;# icu4c (International Components for Unicode)                    &lt;/span&gt;
&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;#                                                                 &lt;/span&gt;
&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;# The International Components for Unicode (ICU) libraries provide&lt;/span&gt;
&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;# robust and full-featured Unicode services on a wide variety of  &lt;/span&gt;
&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;# platforms.                                                      &lt;/span&gt;
&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;#                                                                 &lt;/span&gt;
&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;# Homepage: http://www.icu-project.org/                           &lt;/span&gt;
&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;#                                                                 &lt;/span&gt;
Executing install script &lt;span style=&quot;color: #b1b100;&quot;&gt;for&lt;/span&gt; icu4c&lt;span style=&quot;color: #cc66cc;&quot;&gt;-4.2&lt;/span&gt;&lt;span style=&quot;color: #cc66cc;&quot;&gt;.1&lt;/span&gt;-x86_64-1_SBo.tgz.        
Package icu4c&lt;span style=&quot;color: #cc66cc;&quot;&gt;-4.2&lt;/span&gt;&lt;span style=&quot;color: #cc66cc;&quot;&gt;.1&lt;/span&gt;-x86_64-1_SBo.tgz installed.                   
&amp;nbsp;
nicolas@cassis:/tmp$ sudo installpkg js&lt;span style=&quot;color: #cc66cc;&quot;&gt;-1.8&lt;/span&gt;.0_rc1-x86_64-1_SBo.tgz
Verifying package js&lt;span style=&quot;color: #cc66cc;&quot;&gt;-1.8&lt;/span&gt;.0_rc1-x86_64-1_SBo.tgz.
Installing package js&lt;span style=&quot;color: #cc66cc;&quot;&gt;-1.8&lt;/span&gt;.0_rc1-x86_64-1_SBo.tgz:
PACKAGE DESCRIPTION:
&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;# SpiderMonkey (Mozilla's JavaScript Engine)&lt;/span&gt;
&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;#&lt;/span&gt;
&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;# SpiderMonkey is the code-name for the Mozilla's C implementation of&lt;/span&gt;
&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;# JavaScript. It can be used by applications such as elinks and others.&lt;/span&gt;
&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;#&lt;/span&gt;
&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;# This is the standalone version of the engine used by Firefox and other&lt;/span&gt;
&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;# Mozilla applications.&lt;/span&gt;
&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;#&lt;/span&gt;
&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;# Homepage: http://www.mozilla.org/js/spidermonkey&lt;/span&gt;
&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;#&lt;/span&gt;
Package js&lt;span style=&quot;color: #cc66cc;&quot;&gt;-1.8&lt;/span&gt;.0_rc1-x86_64-1_SBo.tgz installed.
&amp;nbsp;
nicolas@cassis:/tmp$ sudo installpkg erlang-otp-13B03-x86_64-1_SBo.tgz
Verifying package erlang-otp-13B03-x86_64-1_SBo.tgz.
Installing package erlang-otp-13B03-x86_64-1_SBo.tgz:
PACKAGE DESCRIPTION:
&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;# Erlang (programming language)&lt;/span&gt;
&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;#&lt;/span&gt;
&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;# Erlang is a general-purpose concurrent programming language and&lt;/span&gt;
&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;# runtime system.&lt;/span&gt;
&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;# The sequential subset of Erlang is a functional language,&lt;/span&gt;
&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;# with strict evaluation, single assignment, and dynamic typing.&lt;/span&gt;
&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;# It was designed by Ericsson to support distributed,&lt;/span&gt;
&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;# fault-tolerant, soft-real-time, non-stop applications.&lt;/span&gt;
&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;#&lt;/span&gt;
&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;# http://www.erlang.org/&lt;/span&gt;
&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;#&lt;/span&gt;
Executing install script &lt;span style=&quot;color: #b1b100;&quot;&gt;for&lt;/span&gt; erlang-otp-13B03-x86_64-1_SBo.tgz.
Package erlang-otp-13B03-x86_64-1_SBo.tgz installed.&lt;/pre&gt;


&lt;h3&gt;Installation de CouchDB&lt;/h3&gt;


&lt;p&gt;Il vous faut au préalable créer un utilisateur et un groupe couchdb :&lt;/p&gt;

&lt;pre class=&quot;bash&quot;&gt;groupadd -g &lt;span style=&quot;color: #cc66cc;&quot;&gt;231&lt;/span&gt; couchdb
useradd -u &lt;span style=&quot;color: #cc66cc;&quot;&gt;231&lt;/span&gt; -g couchdb -d /var/lib/couchdb -s /bin/sh couchdb&lt;/pre&gt;


&lt;p&gt;Récupérer le &lt;a href=&quot;http://slackbuilds.org/repository/13.0/development/couchdb/&quot; hreflang=&quot;en&quot;&gt;slackbuild de CouchDB&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;il vous faut alors procéder de la façon suivante :&lt;/p&gt;

&lt;pre class=&quot;bash&quot;&gt;tar xzf couchdb.tar.gz
&lt;span style=&quot;color: #000066;&quot;&gt;cd&lt;/span&gt; couchdb
&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;# récupérer les sources de couchdb 0.10.1 et metter les dans votre répertoire couchdb&lt;/span&gt;
&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;# éditer si besoin le SlackBuild&lt;/span&gt;
&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;# créer votre package :&lt;/span&gt;
./couchdb.Slackbuild
=&amp;gt; Slackware package /tmp/SBo/couchdb&lt;span style=&quot;color: #cc66cc;&quot;&gt;-0.10&lt;/span&gt;&lt;span style=&quot;color: #cc66cc;&quot;&gt;.1&lt;/span&gt;-x86_64-1_SBo.tgz created.&lt;/pre&gt;


&lt;p&gt;Il ne reste plus qu'à installer le paquet :&lt;/p&gt;

&lt;pre class=&quot;bash&quot;&gt;installpkg /tmp/SBo/couchdb&lt;span style=&quot;color: #cc66cc;&quot;&gt;-0.10&lt;/span&gt;&lt;span style=&quot;color: #cc66cc;&quot;&gt;.1&lt;/span&gt;-x86_64-1_SBo.tgz&lt;/pre&gt;


&lt;h4&gt;Démarrage / Arrêt automatique de CouchDB&lt;/h4&gt;


&lt;p&gt;Editer /etc/rc.d/rc.local pour y ajouter :&lt;/p&gt;

&lt;pre class=&quot;bash&quot;&gt;&lt;span style=&quot;color: #b1b100;&quot;&gt;if&lt;/span&gt; &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#91;&lt;/span&gt; -x /etc/rc.d/rc.couchdb &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#93;&lt;/span&gt;; &lt;span style=&quot;color: #b1b100;&quot;&gt;then&lt;/span&gt;
	. /etc/rc.d/rc.couchdb start
&lt;span style=&quot;color: #b1b100;&quot;&gt;fi&lt;/span&gt;&lt;/pre&gt;


&lt;p&gt;et dans /etc/rc.d/rc.local_shutdown :&lt;/p&gt;

&lt;pre class=&quot;bash&quot;&gt;&lt;span style=&quot;color: #b1b100;&quot;&gt;if&lt;/span&gt; &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#91;&lt;/span&gt; -x /etc/rc.d/rc.couchdb &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#93;&lt;/span&gt;; &lt;span style=&quot;color: #b1b100;&quot;&gt;then&lt;/span&gt;
	. /etc/rc.d/rc.couchdb stop
&lt;span style=&quot;color: #b1b100;&quot;&gt;fi&lt;/span&gt;&lt;/pre&gt;


&lt;p&gt;Ouvrez &lt;a href=&quot;http://localhost:5984/_utils/&quot; hreflang=&quot;en&quot;&gt;http://localhost:5984/_utils/&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;Et voilà... il est maintenant temps de vous relaxer &lt;img src=&quot;/journal/themes/default/smilies/wink.png&quot; alt=&quot;;-)&quot; class=&quot;smiley&quot; /&gt;&lt;/p&gt;


&lt;p&gt;&lt;strong&gt;Edit 1&lt;/strong&gt; : Mise à jour suite à l'approbation &amp;amp; correction de mon slackbuild sur Slackbuilds.org&lt;/p&gt;</description>
    
    
    
          <comments>http://nicolas.steinmetz.fr/journal/post/2010/01/03/CouchDB-0.10.1-on-Slackware-13.0#comment-form</comments>
      <wfw:comment>http://nicolas.steinmetz.fr/journal/post/2010/01/03/CouchDB-0.10.1-on-Slackware-13.0#comment-form</wfw:comment>
      <wfw:commentRss>http://nicolas.steinmetz.fr/journal/feed/atom/comments/578</wfw:commentRss>
      </item>
    
  <item>
    <title>Perl vs Shell vs Python</title>
    <link>http://nicolas.steinmetz.fr/journal/post/2009/12/16/Perl-vs-Shell-vs-Python</link>
    <guid isPermaLink="false">urn:md5:ad1fb4bccec40d7194a8c14522f53166</guid>
    <pubDate>Wed, 16 Dec 2009 23:00:00 +0100</pubDate>
    <dc:creator>Nicolas Steinmetz</dc:creator>
        <category>Trucs de geek</category>
        <category>bash</category><category>perl</category><category>python</category><category>shell</category>    
    <description>    &lt;p&gt;Ayant suivi il y a 2 semaines une &lt;a href=&quot;http://www.orsys.fr/formation-perl.asp?sdid=3&quot; hreflang=&quot;fr&quot;&gt;formation Perl&lt;/a&gt; de 3 jours vu qu'il s'agit d'un standard de fait chez JCDecaux pour tout ce qui touche au scripting, mon &lt;em&gt;petit ressenti&lt;/em&gt; sur le sujet.&lt;/p&gt;


&lt;p&gt;Tout d'abord, il faut dire que j'allais à cette formation avec un a priori plutôt négatif sur Perl de part ce que j'avais pu en entendre ici ou là. Il faut dire que j'ai plutôt été agréablement surpris par certains cotés.&lt;/p&gt;


&lt;p&gt;Match perl vs bash :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Perl peut être vue comme une bonne alternative / un bon complément à des scripts bash. Plutôt que de vous casser la tête à apprendre à utiliser grep/sed/awk, vous pouvez faire la même chose mais uniquement en perl. Parce que bon, franchement awk, c'est peut être super puissant mais je trouve ça inabordable et loin d'être évident.&lt;/li&gt;
&lt;li&gt;Je compte ainsi revoir certains scripts bash qui ne me satisfont pas pour voir si Perl ne me permettrait pas d'atteindre l'objectif souhaité.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Match perl vs python : avantage Python&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Pour le coup, le langage avec des des &lt;code&gt;$&lt;/code&gt;, &lt;code&gt;%&lt;/code&gt;, et même &lt;code&gt;&lt;/code&gt;@ devant les types de données, des accolades pour les débuts/fin de bloc qu'on ne sait jamais à quel niveau positionner pour rester lisible de bout en bout et des &lt;code&gt;;&lt;/code&gt; en fin de ligne, j'ai du mal. Surtout maintenant que je me suis habitué à la syntaxe python que je trouve infiniment plus lisible et moins source d'erreur.&lt;/li&gt;
&lt;li&gt;Dans la même veine, les syntaxes sont pas des plus évidentes : ainsi dire que &lt;code&gt;$tab&lt;/code&gt; est un scalaire, &lt;code&gt;@tab&lt;/code&gt; un tableau, &lt;code&gt;%tab&lt;/code&gt; un tableau associatif et que si on met un &amp;quot;antislash&amp;quot; devant on parle alors d'une référence vers le scalaire/tableau/tableau associatif, ça aide pas l'écriture d'un script&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Par ex en perl :&lt;/p&gt;
&lt;pre class=&quot;perl&quot;&gt;&lt;span style=&quot;color: #b1b100;&quot;&gt;if&lt;/span&gt; &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;$toto&lt;/span&gt; == &lt;span style=&quot;color: #cc66cc;&quot;&gt;2&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;
&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#123;&lt;/span&gt;
    &lt;a href=&quot;http://www.perldoc.com/perl5.6/pod/func/print.html&quot;&gt;&lt;span style=&quot;color: #000066;&quot;&gt;print&lt;/span&gt;&lt;/a&gt; &lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;quot;Toto vaut : $toto&lt;span style=&quot;color: #000099; font-weight: bold;&quot;&gt;\n&lt;/span&gt;&amp;quot;&lt;/span&gt;;
&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#125;&lt;/span&gt;&lt;/pre&gt;


&lt;p&gt;et en python :&lt;/p&gt;

&lt;pre class=&quot;python&quot;&gt;&lt;span style=&quot;color: #ff7700;font-weight:bold;&quot;&gt;if&lt;/span&gt; toto == &lt;span style=&quot;color: #ff4500;&quot;&gt;2&lt;/span&gt;:
    &lt;span style=&quot;color: #ff7700;font-weight:bold;&quot;&gt;print&lt;/span&gt; &lt;span style=&quot;color: #483d8b;&quot;&gt;&amp;quot;Toto vaut %s&amp;quot;&lt;/span&gt; % toto&lt;/pre&gt;

&lt;ul&gt;
&lt;li&gt;Perl fonctionne de façon beaucoup trop implicite/facultative contrairement à python. Python impose un certain nombre de conventions et c'est bien. Le &amp;quot;There is more than one way to do it&amp;quot; de Perl peut être séduisant mais aussi contre productif, surtout en entreprise.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Exemple pour parcourir un tableau en perl :&lt;/p&gt;

&lt;pre class=&quot;perl&quot;&gt;&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;#! /usr/bin/perl -w&lt;/span&gt;
&amp;nbsp;
&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;# Tableau simple&lt;/span&gt;
&lt;span style=&quot;color: #0000ff;&quot;&gt;@tab&lt;/span&gt; = &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;quot;fraise&amp;quot;&lt;/span&gt;, &lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;quot;abricot&amp;quot;&lt;/span&gt;, &lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;quot;goyave&amp;quot;&lt;/span&gt;, &lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;quot;pamplemousse&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;;
&lt;span style=&quot;color: #b1b100;&quot;&gt;foreach&lt;/span&gt; &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;@tab&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;
&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#123;&lt;/span&gt;
    &lt;a href=&quot;http://www.perldoc.com/perl5.6/pod/func/print.html&quot;&gt;&lt;span style=&quot;color: #000066;&quot;&gt;print&lt;/span&gt;&lt;/a&gt; &lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;quot;Valeur : $_ &lt;span style=&quot;color: #000099; font-weight: bold;&quot;&gt;\n&lt;/span&gt;&amp;quot;&lt;/span&gt;;
&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#125;&lt;/span&gt;
&amp;nbsp;
&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;# Tableau associatif&lt;/span&gt;
&lt;span style=&quot;color: #0000ff;&quot;&gt;%hash&lt;/span&gt; = &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;quot;France&amp;quot;&lt;/span&gt; =&amp;gt; &lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;quot;Paris&amp;quot;&lt;/span&gt;, &lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;quot;Allemagne&amp;quot;&lt;/span&gt; =&amp;gt; &lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;quot;Berlin&amp;quot;&lt;/span&gt;, &lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;quot;Angleterre&amp;quot;&lt;/span&gt; =&amp;gt; &lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;quot;Londres&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;;
&lt;span style=&quot;color: #b1b100;&quot;&gt;foreach&lt;/span&gt; &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;a href=&quot;http://www.perldoc.com/perl5.6/pod/func/keys.html&quot;&gt;&lt;span style=&quot;color: #000066;&quot;&gt;keys&lt;/span&gt;&lt;/a&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;%hash&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;
&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#123;&lt;/span&gt;
    &lt;a href=&quot;http://www.perldoc.com/perl5.6/pod/func/print.html&quot;&gt;&lt;span style=&quot;color: #000066;&quot;&gt;print&lt;/span&gt;&lt;/a&gt; &lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;quot;Pays : $_ , Capitale: $hash{$_}&lt;span style=&quot;color: #000099; font-weight: bold;&quot;&gt;\n&lt;/span&gt;&amp;quot;&lt;/span&gt;;
&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#125;&lt;/span&gt;&lt;/pre&gt;


&lt;p&gt;Le &lt;code&gt;$_&lt;/code&gt; est appelé scalaire par défaut. Il est conseillé de vivement l'utilisé plutôt que d'initialiser une variable. De prime abord, ça surprend. Il existe aussi un &lt;code&gt;@_&lt;/code&gt; dans les fonctions et qui correspond à un tableau d'arguments passés à la fonction.&lt;/p&gt;


&lt;p&gt;Dans ce cas les parenthèses sont implicites. On peut bien sur écrire :&lt;/p&gt;

&lt;pre class=&quot;perl&quot;&gt;&lt;span style=&quot;color: #b1b100;&quot;&gt;foreach&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;a href=&quot;http://www.perldoc.com/perl5.6/pod/func/keys.html&quot;&gt;&lt;span style=&quot;color: #000066;&quot;&gt;keys&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;%hash&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;/pre&gt;


&lt;p&gt;alors qu'en python :&lt;/p&gt;

&lt;pre class=&quot;python&quot;&gt;tab = &lt;span style=&quot;color: black;&quot;&gt;&amp;#91;&lt;/span&gt;&lt;span style=&quot;color: #483d8b;&quot;&gt;&amp;quot;fraise&amp;quot;&lt;/span&gt;, &lt;span style=&quot;color: #483d8b;&quot;&gt;&amp;quot;abricot&amp;quot;&lt;/span&gt;, &lt;span style=&quot;color: #483d8b;&quot;&gt;&amp;quot;goyave&amp;quot;&lt;/span&gt;, &lt;span style=&quot;color: #483d8b;&quot;&gt;&amp;quot;pamplemousse&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;&amp;#93;&lt;/span&gt;
&lt;span style=&quot;color: #ff7700;font-weight:bold;&quot;&gt;for&lt;/span&gt; fruit &lt;span style=&quot;color: #ff7700;font-weight:bold;&quot;&gt;in&lt;/span&gt; tab:
    &lt;span style=&quot;color: #ff7700;font-weight:bold;&quot;&gt;print&lt;/span&gt; &lt;span style=&quot;color: #483d8b;&quot;&gt;&amp;quot;Valeur : %s&amp;quot;&lt;/span&gt; % fruit
&amp;nbsp;
&lt;span style=&quot;color: #008000;&quot;&gt;hash&lt;/span&gt; = &lt;span style=&quot;color: black;&quot;&gt;&amp;#123;&lt;/span&gt;&lt;span style=&quot;color: #483d8b;&quot;&gt;'France'&lt;/span&gt; : &lt;span style=&quot;color: #483d8b;&quot;&gt;'Paris'&lt;/span&gt;, &lt;span style=&quot;color: #483d8b;&quot;&gt;'Allemagne'&lt;/span&gt;: &lt;span style=&quot;color: #483d8b;&quot;&gt;'Berlin'&lt;/span&gt;,  &lt;span style=&quot;color: #483d8b;&quot;&gt;'Angleterre'&lt;/span&gt; : &lt;span style=&quot;color: #483d8b;&quot;&gt;'Londres'&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;&amp;#125;&lt;/span&gt;;
&lt;span style=&quot;color: #ff7700;font-weight:bold;&quot;&gt;for&lt;/span&gt; key, value &lt;span style=&quot;color: #ff7700;font-weight:bold;&quot;&gt;in&lt;/span&gt; &lt;span style=&quot;color: #008000;&quot;&gt;hash&lt;/span&gt;.&lt;span style=&quot;color: black;&quot;&gt;items&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;&amp;#41;&lt;/span&gt;:
    &lt;span style=&quot;color: #ff7700;font-weight:bold;&quot;&gt;print&lt;/span&gt; &lt;span style=&quot;color: #483d8b;&quot;&gt;&amp;quot;Clé : %s Valeur %s&amp;quot;&lt;/span&gt; % &lt;span style=&quot;color: black;&quot;&gt;&amp;#40;&lt;/span&gt;key, value&lt;span style=&quot;color: black;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;/pre&gt;


&lt;p&gt;Dans les deux cas, nous aurons :&lt;/p&gt;

&lt;pre&gt;
Valeur : fraise
Valeur : abricot
Valeur : goyave
Valeur : pamplemousse
Pays : France , Capitale: Paris
Pays : Angleterre , Capitale: Londres
Pays : Allemagne , Capitale: Berlin

&lt;/pre&gt;


&lt;p&gt;Si on rajoutait un tri en perl, en implicite cela peut aller jusqu'à :&lt;/p&gt;

&lt;pre class=&quot;perl&quot;&gt;&lt;span style=&quot;color: #b1b100;&quot;&gt;foreach&lt;/span&gt; &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;a href=&quot;http://www.perldoc.com/perl5.6/pod/func/sort.html&quot;&gt;&lt;span style=&quot;color: #000066;&quot;&gt;sort&lt;/span&gt;&lt;/a&gt; &lt;a href=&quot;http://www.perldoc.com/perl5.6/pod/func/keys.html&quot;&gt;&lt;span style=&quot;color: #000066;&quot;&gt;keys&lt;/span&gt;&lt;/a&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;%tab&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;
&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#123;&lt;/span&gt;
&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#125;&lt;/span&gt;&lt;/pre&gt;


&lt;p&gt;Difficile de s'y retrouver à mon humble avis.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Perl n'a pas de &amp;quot;prompt&amp;quot; intégré : Franchement pouvoir taper &amp;quot;python&amp;quot; dans un shell et ensuite codé en direct son script et le retoucher, que de temps gagné. Il y a certes &lt;code&gt;perl -pe &amp;quot;commandes perl&amp;quot;&lt;/code&gt; mais c'est bien en deçà de ce que peut offrir python.&lt;/li&gt;
&lt;li&gt;Mettre &lt;code&gt;/usr/bin/perl -w&lt;/code&gt; en début de script permet de lever les warnings et corriger les éventuels bugs&lt;/li&gt;
&lt;li&gt;Python propose le module &amp;quot;re&amp;quot; pour les expressions régulières. Pas besoin donc de se mettre spécifiquement à Perl s'il y a des besoins de RegExp &lt;img src=&quot;/journal/themes/default/smilies/wink.png&quot; alt=&quot;;-)&quot; class=&quot;smiley&quot; /&gt;&lt;/li&gt;
&lt;li&gt;J'ai l'impression que la doc python est de meilleure qualité même si apparemment Perl rattrape petit à petit son chemin...&lt;/li&gt;
&lt;li&gt;Globalement, Python et Perl doivent permettre de faire les mêmes choses, donc je vais considérer le périmètre des langages comme ex-aequo.&lt;/li&gt;
&lt;li&gt;Même si cela m'a troublé de prime abord avec les listes en python, les listes en perl sont sympathiques :&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;perl&quot;&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;@tab&lt;/span&gt; = &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;quot;un&amp;quot;&lt;/span&gt;, &lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;quot;deux&amp;quot;&lt;/span&gt;, &lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;quot;trois&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;;
&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;$t1&lt;/span&gt;, &lt;span style=&quot;color: #0000ff;&quot;&gt;$t2&lt;/span&gt;, &lt;span style=&quot;color: #0000ff;&quot;&gt;$t3&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt; = &lt;span style=&quot;color: #0000ff;&quot;&gt;@tab&lt;/span&gt;;
 &lt;a href=&quot;http://www.perldoc.com/perl5.6/pod/func/print.html&quot;&gt;&lt;span style=&quot;color: #000066;&quot;&gt;print&lt;/span&gt;&lt;/a&gt; &lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;quot;t1 vaut $t1&lt;span style=&quot;color: #000099; font-weight: bold;&quot;&gt;\n&lt;/span&gt;&amp;quot;&lt;/span&gt;;
 &lt;a href=&quot;http://www.perldoc.com/perl5.6/pod/func/print.html&quot;&gt;&lt;span style=&quot;color: #000066;&quot;&gt;print&lt;/span&gt;&lt;/a&gt; &lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;quot;t2 vaut $t2&lt;span style=&quot;color: #000099; font-weight: bold;&quot;&gt;\n&lt;/span&gt;&amp;quot;&lt;/span&gt;;
 &lt;a href=&quot;http://www.perldoc.com/perl5.6/pod/func/print.html&quot;&gt;&lt;span style=&quot;color: #000066;&quot;&gt;print&lt;/span&gt;&lt;/a&gt; &lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;quot;t3 vaut $t3&lt;span style=&quot;color: #000099; font-weight: bold;&quot;&gt;\n&lt;/span&gt;&amp;quot;&lt;/span&gt;;&lt;/pre&gt;


&lt;p&gt;Contrairement à ce que l'on pourrait croire de prime abord, cela n'est pas un tableau mais juste un &amp;quot;panier&amp;quot; de variables. On peut donc utiliser &lt;code&gt;$t1&lt;/code&gt; &amp;amp; co.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;La notation objet est plus claire en Python. Je n'adhère toujours pas au &lt;code&gt;$titi-&amp;gt;dosomething();&lt;/code&gt; (comme en PHP en fait)&lt;/li&gt;
&lt;li&gt;La prise en main de python est beaucoup plus immédiate (aux listes / tuples (grosso modo des listes non modifiables) / dictionnaires (tableaux associatifs) prêt &lt;img src=&quot;/journal/themes/default/smilies/wink.png&quot; alt=&quot;;-)&quot; class=&quot;smiley&quot; /&gt; )
&lt;ul&gt;
&lt;li&gt;D'ailleurs, les listes en python correspondent aux tableaux en perl et les dictionnaires python au hash (tableau associatif) perl.&lt;/li&gt;
&lt;li&gt;Sauf erreur, il n'y a pas d'équivalent des tuples en perl&lt;/li&gt;
&lt;li&gt;Les listes en perl n'ont donc rien à avoir avec les listes en python (cela m'a pas mal dérangé durant la formation)&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ce qui fait qu'au final, je rejoins tout à fait David sur &amp;quot;&lt;a href=&quot;http://www.biologeek.com/conferences,django,python/pourquoi-python-et-django/&quot; hreflang=&quot;fr&quot;&gt;Pourquoi Python &amp;amp; Django&lt;/a&gt;&amp;quot;. A titre personnel, mon langage de prédilection va donc rester python et je vais voir dans quelle mesure je peux encourager python au boulot. J'y ai déjà glissé une appli Django après tout &lt;img src=&quot;/journal/themes/default/smilies/wink.png&quot; alt=&quot;;-)&quot; class=&quot;smiley&quot; /&gt;&lt;/p&gt;


&lt;p&gt;Perl a malgré tout été une bonne surprise, je m'attendais à pire. Il convient par contre dans un contexte d'entreprise je pense de rendre le code le plus verbeux possible pour facilité sa reprise et sa maintenance.&lt;/p&gt;</description>
    
    
    
      </item>
    
  <item>
    <title>Les exilés d'asceltis (Tome 1/2/3)</title>
    <link>http://nicolas.steinmetz.fr/journal/post/2009/12/16/Les-exil%C3%A9s-d-asceltis-%28Tome-1/2/3%29</link>
    <guid isPermaLink="false">urn:md5:9dcd5a45613af66911f2f0e0eb8f623b</guid>
    <pubDate>Wed, 16 Dec 2009 22:07:00 +0100</pubDate>
    <dc:creator>Nicolas Steinmetz</dc:creator>
        <category>BD</category>
            
    <description>    &lt;p&gt;Pour rendre la pareille à la &lt;a href=&quot;http://www.jrenard.info/blog/?cat=38&quot; hreflang=&quot;fr&quot;&gt;revue de BD de Jérome Renard&lt;/a&gt;, je vais vous parler des Exilés d'asceltis.&lt;/p&gt;


&lt;p&gt;Ayant particulièrement aimé &amp;quot;&lt;a href=&quot;http://www.soleilprod.com/?page=Catalogue.Serie&amp;amp;id=89&quot; hreflang=&quot;fr&quot;&gt;Les Brumes d'Asceltis&lt;/a&gt;&amp;quot;, j'ai naturellement suivi sur &amp;quot;&lt;a href=&quot;http://www.soleilprod.com/?page=Catalogue.Serie&amp;amp;id=370&quot; hreflang=&quot;fr&quot;&gt;Les exilés d'Asceltis&lt;/a&gt;&amp;quot; du même auteur Nicolas JARRY (qui au passage à écrit un roman génial : Chroniques du Loup de Deb, à lire également !).&lt;/p&gt;


&lt;p&gt;Le synopsis est le suivant :&lt;/p&gt;


&lt;p&gt;&lt;q&gt;8000 ans avant les Brumes d’Asceltis, les Naabdirs furent chassés du continent par les Guerres Corgones. Ceux qui survécurent à l’exode trouvèrent refuge, puis prospérèrent dans l’Archipel fleuri d’Aloy Nihib.  Sur Asceltis, Obion, le Dieu Naabdir agonise… Pour raviver la foi des siens, il leur envoie un messager, un bébé albinos. Mais les Naabdirs sont partagés: Comment interpréter la venue de cet enfant ? Faut-il revenir sur Asceltis ? Ou au contraire, rester sur l’Archipel ? Pour être certains de respecter la volonté de leur Dieu, ils décident d’attendre que l’enfant soit en âge de prendre lui-même cette délicate décision. Mais dans l’ombre, la présence de ce mystérieux bébé a déjà remis en route les sombres engrenages d’une implacable destinée…&lt;/q&gt;&lt;/p&gt;


&lt;p&gt;L'histoire s'étale sur 3 tomes (et je ne pense pas qu'un 4ème arrive) ce qui fait qu'elle a le temps de se mettre en place, se développer et se finir sans tomber dans les séries à 40 épisodes où on gère mal sa fin comme Lanfeust des Etoiles par ex. Les dessins sont très beaux et le scénario se tient de bout en bout (avec un rythme assez continu, je n'ai pas observé de trous). Les personnages sont aussi bien réalisés, chacun apportant sa spécificité à l'édifice.&lt;/p&gt;


&lt;p&gt;Pour ceux qui auraient lu les brumes d'Asceltis, ils peuvent éventuellement être un peu désemparés aux début car il n'y a pas vraiment de liens entre les deux séries (pas les mêmes races de personnages hormis les nains sur la fin et une autre race dont je ne retrouve pas le nom) et les dessins ne sont pas du tout les mêmes. Les exilés d'Asceltis sur une chronologie se place en fait bien avant les brumes d'Asceltis.&lt;/p&gt;


&lt;p&gt;Bien sur, pour apprécier la série, il vous faut passer par le tome 1 car prendre l'histoire en route ne vous ménera nulle part.&lt;/p&gt;


&lt;p&gt;Au final, ces deux séries se placent dans le haut de ma liste de BDs en terme de préférence. Il n'y a peut être que &amp;quot;&lt;a href=&quot;http://www.soleilprod.com/?page=Catalogue.Serie&amp;amp;id=254&quot; hreflang=&quot;fr&quot;&gt;Les naufragés d'Ythaq&lt;/a&gt;&amp;quot; (autre coup de coeur de l'année, j'y reviendrais prochainement) qui pourrait leur faire un peu d'ombre. Tout dépend comment cela va se terminer, en espérant qu'ils évitent l'écueil Lanfeust des Etoiles...&lt;/p&gt;</description>
    
    
    
      </item>
    
  <item>
    <title>Faut-il sauver MySQL ?</title>
    <link>http://nicolas.steinmetz.fr/journal/post/2009/12/13/Faut-il-sauver-MySQL</link>
    <guid isPermaLink="false">urn:md5:93ad1917eeddb45e9b297aeefff11329</guid>
    <pubDate>Sun, 13 Dec 2009 17:41:00 +0100</pubDate>
    <dc:creator>Nicolas Steinmetz</dc:creator>
        <category>Trucs de geek</category>
        <category>mysql</category><category>oracle</category>    
    <description>    &lt;p&gt;A la &lt;a href=&quot;http://twitter.com/jeromerenard/status/6625632738&quot;&gt;demande&lt;/a&gt; de &lt;a href=&quot;http://www.jrenard.info/blog/&quot; hreflang=&quot;fr&quot;&gt;Jérome Renard&lt;/a&gt; et suite à la publication de &amp;quot;&lt;a href=&quot;http://monty-says.blogspot.com/2009/12/help-saving-mysql.html&quot; hreflang=&quot;en&quot;&gt;Help saving MySQL&lt;/a&gt;&amp;quot; par le fondateur de MySQL, ma &lt;a href=&quot;http://twitter.com/nsteinmetz/status/6625184987&quot; hreflang=&quot;en&quot;&gt;première pensée&lt;/a&gt; fut ; &amp;quot;Hard to have an opinion on oracle/mysql debate. Was sun a better home ? &lt;a href=&quot;http://fr.wikipedia.org/wiki/Fear,_uncertainty_and_doubt&quot; hreflang=&quot;fr&quot;&gt;FUD&lt;/a&gt; ?'&lt;/p&gt;


&lt;p&gt;Sans nul doute il y a conflits d'intérêts entre Oracle &amp;amp; MySQL vu qu'il s'agit de deux bases de données relationelles; toutefois sur MySQL :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;SI vous utilisez le moteur InnoDB, vous ^tes déjà dpendant d'Oracle depuis que ce dernier à racheter Innobase en &lt;a href=&quot;http://www.oracle.com/innodb/index.html&quot; hreflang=&quot;en&quot;&gt;octobre 2005&lt;/a&gt;. Votre dépendance  cessera lorsque le nouveau plugin InnoDB sera sorti en version stable&lt;/li&gt;
&lt;li&gt;La base de données Oracle est je pense principalement utilisée pour des applications orientées &amp;quot;entreprise&amp;quot;. Dans ce contexte, pour Oracle, l'acquisition de MySQL peut lui permettre d'être sur de nouveaux segments comme le web ou les PME (qui ne peuvent s'offrir des licences Oracle).&lt;/li&gt;
&lt;li&gt;En qui Sun était une meilleure maison pour MySQL ? J'ai plutôt l'impression que MySQL en a pati que tirer partie ?&lt;/li&gt;
&lt;li&gt;Le fondateur de MySQL a déjà lancé l'&lt;a href=&quot;http://odba.org/&quot; hreflang=&quot;en&quot;&gt;Open Database Alliance&lt;/a&gt; ainsi qu'un fork de MySQL : &lt;a href=&quot;http://askmonty.org/wiki/index.php/MariaDB_versus_MySQL&quot; hreflang=&quot;en&quot;&gt;Maria DB&lt;/a&gt; et une société de services Mpnthy AB. Quel est son intérêt dans l'histoire ? Est-ce si &amp;quot;désintéressé&amp;quot; que cela ?&lt;/li&gt;
&lt;li&gt;La gestion du développement de MySQL était déjà sujet à &lt;a href=&quot;http://monty-says.blogspot.com/2008/11/oops-we-did-it-again-mysql-51-released.html&quot; hreflang=&quot;en&quot;&gt;critiques&lt;/a&gt; (toujours par le fondateur de MYSQL). En quoi cela peut être pire ?&lt;/li&gt;
&lt;li&gt;Si Oracle venait à tuer MySQL (activement ou pas), il est toujours possible de forker (c'est d'ailleurs déjà fait) - donc hormis le coté médiatique /  crédibilité / image de marque à gérer, où est le problème ?&lt;/li&gt;
&lt;li&gt;MySQL s'est imposée comme base de données par défaut pour le web et PME. Ce serait certes une mauvaise image pour la promotion du libre de voir MySQL disparaitre. Mais comme dit précédemment, le fork peut se faire.&lt;/li&gt;
&lt;li&gt;Pour les constructeurs de solutions opensource (ou pas) autour de MySQL, il leur faut évaluer leur dépendance vis à vis des composants retenus. Temps d'adopter un ORM ou d'être compatible multi-db ?&lt;/li&gt;
&lt;li&gt;Pour éviter ce cas, n'aurait-il pas fallu créer une fondation MySQL, détentrice des droits et du contrôle sur son développement ? Cela pourrait être une porte de sortie pour Oracle... A vouloir monétiser MySQL, c'est peut être une leçon à retenir ?&lt;/li&gt;
&lt;li&gt;(Edit1) La grand gagnant de MySQL vs Oracle sera-t-il Postgres ?&lt;/li&gt;
&lt;li&gt;(Edit 2) Le MagIT &lt;a href=&quot;http://www.lemagit.fr/article/sun-mysql-oracle-bruxelles/5066/1/sun-oracle-oracle-engage-sur-mysql-monty-appelle-revolution/&quot; hreflang=&quot;fr&quot;&gt;indique&lt;/a&gt;  d'ailleurs : &amp;quot;&lt;q&gt;Notons que Monty Widenius n'est pas totalement désinteressé. Il a récement lancé Maria DB, un fork de MySQL et ambitionne de répliquer le succès qu'il a connu avec la première itération de sa base. Autant dire qu'un MySQL en bonne santé entre les griffres d'Oracle, pourrait largement éclipser ses chances de réussite&lt;/q&gt;&amp;quot;.&lt;/li&gt;
&lt;li&gt;(Edit 3) : Monty &lt;a href=&quot;http://www.lemagit.fr/article/mysql-oracle-rachat-antitrust-opensource-ue-widenius-commission/4818/1/monty-widenius-fondateur-mysql-oracle-aucun-interet-faire-vivre-mysql/&quot; hreflang=&quot;fr&quot;&gt;admet&lt;/a&gt; (fin d'article) que les développements autour de MySQL sont &amp;quot;morts&amp;quot; depuis 5 ans. Le rachat de MySQL par Sun n'a rien changé : &lt;q&gt;Les innovations sur MySQL ont déjà été stoppées il y a 5 ans. Il s'agissait d'ailleurs d'un point sur lequel javais beaucoup d'espoirs en intégrant Sun. C'était un désastre complet en matière de développements. Et je comptais beaucoup sur Sun pour régler le problème. Malheureusement, cela ne s'est jamais produit. On peut donc dire que les développements sont déjà morts. C'est également pour cette raison que j'ai quitté le projet. D'ailleurs aujourd'hui, il y deux vrais forks (nouveaux projets dérivant du code initial de la base libre, NDLR) de MySQL, hors Drizzle.&lt;/q&gt;. Cela en fait de l'agitation poru un mort... &lt;img src=&quot;/journal/themes/default/smilies/wink.png&quot; alt=&quot;;-)&quot; class=&quot;smiley&quot; /&gt;&lt;/li&gt;
&lt;li&gt;(Edit 4 du 05.01.10) : La communauté semble de plus en plus critique sur Monty par bien des aspets (cf &lt;a href=&quot;http://holdenweb.blogspot.com/2010/01/wht-save-mysql-now.html&quot; hreflang=&quot;en&quot;&gt;billet du président de la fondation python&lt;/a&gt;). Plus j'y pense, plus je me dis que le danger de l'acquisition pour Monthy est de ne plus pouvoir profiter gratuitement du code de MySQL. Je m'explique, si on considère que MariaDB == MySQL + code spécifique, alors son entreprise dans son business plan prévoyait pour le moment de ne payer que les dev spécifiques. L'acquisition d'oracle peut mettre fin à ce modèle. D'où 2 solutons pour Monty : soit on reste dans la situation actuelle et il peut bénéficier du code de MySQL gratuitement pour faire ses affaires avec MariaDB. Soit il cherche à ce que les développeurs MySQL passent à MariaDB pour reproduire l'existant. Ainsi, le cout logiciel de MariaDB reste le code spécifique et non la globalité du code (MySQL + code spécifique).&lt;/li&gt;
&lt;li&gt;(Edit 5 du 06/01/10)  :&lt;a href=&quot;http://standardsandfreedom.net/index.php/2010/01/05/monty-widenius-wants-another-billion-dollars-should-we-help-him/&quot; hreflang=&quot;en&quot;&gt;Monty Widenius wants another billion dollars, should we help him ?&lt;/a&gt;. Tout est dit sur Monty...&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Sans vouloir voir MySQL disparaitre, j'ai plutôt l'impression que les problèmes étaient déjà présents par le passé et que l'acquisition d'Oracle ne fait que les mettre en valeur / compléter.&lt;/p&gt;


&lt;p&gt;Votre avis ?&lt;/p&gt;</description>
    
    
    
      </item>
    
  <item>
    <title>Clément</title>
    <link>http://nicolas.steinmetz.fr/journal/post/2009/11/13/Cl%C3%A9ment</link>
    <guid isPermaLink="false">urn:md5:cd43f3f4b73c70b08fbe330bdc4eadee</guid>
    <pubDate>Fri, 13 Nov 2009 00:17:00 +0100</pubDate>
    <dc:creator>Nicolas Steinmetz</dc:creator>
        <category>Moi et jus de cervelle</category>
        <category>clément</category><category>naissance</category><category>papa</category>    
    <description>    &lt;p&gt;2 ans, 8 mois et 20 minutes après &lt;a href=&quot;http://nicolas.steinmetz.fr/journal/post/2007/03/10/Hugo&quot; hreflang=&quot;fr&quot;&gt;Hugo&lt;/a&gt;, voici Clément (4.4 kg, 54.5 cm) :&lt;/p&gt;


&lt;p&gt;&lt;a href=&quot;http://www.flickr.com/photos/nicolas-steinmetz/4098722297/&quot;&gt;&lt;img src=&quot;http://farm3.static.flickr.com/2783/4098722297_dccefbd283.jpg&quot; alt=&quot;Clément - Naissance - 11&quot; style=&quot;display:block; margin:0 auto;&quot; /&gt;&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;Toute la famille se porte bien.&lt;/p&gt;</description>
    
    
    
      </item>
    
  <item>
    <title>Les vues DNS pour fluidifier la gestion de vos applications</title>
    <link>http://nicolas.steinmetz.fr/journal/post/2009/11/02/Les-vues-DNS-pour-fluidifier-la-gestion-de-vos-applications</link>
    <guid isPermaLink="false">urn:md5:944898a2f4def4d7a0af3763a2753d04</guid>
    <pubDate>Fri, 06 Nov 2009 00:18:00 +0100</pubDate>
    <dc:creator>Nicolas Steinmetz</dc:creator>
        <category>Intégration</category>
        <category>bind</category><category>dns</category><category>mutualisation</category><category>répartition</category><category>vue</category>    
    <description>    &lt;h2&gt;Contexte / Objectifs&lt;/h2&gt;


&lt;p&gt;Imaginer :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Vous êtes dans un grosse PME multi-sites ou avec un hébergement multi-sites&lt;/li&gt;
&lt;li&gt;Un applicatif est soit réparti sur chaque site, soit il est porté globalement en multi-site (ex un serveur de mail, une application web, etc)&lt;/li&gt;
&lt;li&gt;Votre but est de minimiser la gestion de ces équipements tout en gardant une homogénéité au niveau de la conf (tout le monde utilise par ex mail.maboite.tld pour accéder au webmail mais cela pointe en fait sur chaque serveur de mail local).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Deux modes de gestion :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Au niveau de chaque site, vous avez la solution de déployer un serveur DNS qui gère les entrées correspondantes et faire ainsi la gestion de N dns lors de la modification d'une entrée.&lt;/li&gt;
&lt;li&gt;Vous utilisez les vues DNS et vous déployez un serveur maitre et les vues se transmettront aux esclaves par simple transfert de zone.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Mais au fait, c'est quoi une vue DNS ???&lt;/p&gt;


&lt;h2&gt;Kezako une vue DNS ?&lt;/h2&gt;


&lt;p&gt;Pour un serveur DNS donné, celui-ci peut répondre des informations différentes suivant le client ou bien l'IP du serveur DNS utilisée pour faire sa requête.&lt;/p&gt;


&lt;p&gt;Dans le cas de mon webmail :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Suppsons que la répartition entre le site A et le site B se fasse par round robin&lt;/li&gt;
&lt;li&gt;le client arrive sur un Reverse Proxy (RP) qui le dispatche ensuite parmi plusieurs frontaux&lt;/li&gt;
&lt;li&gt;Quand un client arrive sur le site A, le RP doit renvoyer sur les frontaux 10.8.0.102 à 10.8.0.104&lt;/li&gt;
&lt;li&gt;Quand un client arrive sur le site B, le RP doit renvoyer sur les frontaux 10.9.0.102 à 10.9.0.104&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Construisons une petite matrice de flux :&lt;/p&gt;

&lt;table border=&quot;1&quot;&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;/td&gt;
&lt;td&gt;Vue Site A&lt;/td&gt;
&lt;td&gt;Vue Site B&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Frontaux Site A&lt;/td&gt;
&lt;td&gt;X&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Frontaux Site B&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;X&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;RP Site A&lt;/td&gt;
&lt;td&gt;X&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;RP Site B&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;X&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Transfert de zone&lt;/td&gt;
&lt;td&gt;X&lt;/td&gt;
&lt;td&gt;X&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;



&lt;h2&gt;Equipements&lt;/h2&gt;


&lt;p&gt;Soit 5 serveurs ayant les rôles suivants :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;srv101 / 10.8.0.1 : RP + DNS Master site A&lt;/li&gt;
&lt;li&gt;srv102 / 10.8.0.102 : Serveur Mail Site A 1&lt;/li&gt;
&lt;li&gt;srv103 / 10.8.0.103 : Serveur Mail Site A 2&lt;/li&gt;
&lt;li&gt;srv104 / 10.8.0.104 : Serveur Mail Site A 3&lt;/li&gt;
&lt;li&gt;srv201 / 10.9.0.1 - 10.9.0.2 : RP + DNS Slave site B&lt;/li&gt;
&lt;li&gt;srv202 / 10.9.0.102 : Serveur Mail Site B 1&lt;/li&gt;
&lt;li&gt;srv203 / 10.9.0.103 : Serveur Mail Site B 2&lt;/li&gt;
&lt;li&gt;srv204 / 10.9.0.104 : Serveur Mail Site B 3&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;Mise en place de la configuration DNS&lt;/h2&gt;


&lt;h3&gt;Note&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Le DNS ne doit plus écouter sur le port local&lt;/li&gt;
&lt;li&gt;Il ne doit pas y avoir de règle sur localhost
&lt;ul&gt;
&lt;li&gt;Si localhost autorisé, alors localhost == 127.0.0.1 == IP1.DU.SERVEUR.FQDN == IP2.DU.SERVEUR.FQDN == ... =&amp;gt; /etc/resolv.conf à renseigner avec l'IP locale sur lequel le serveur DNS écoute.&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;Pour permettre le transfert de zone, le DNS slave doit se synchroniser avec le serveur maitre en faisant des requêtes sur 2 ip distinctes pour voir les 2 vues :
&lt;ul&gt;
&lt;li&gt;Si le DNS slave interroge le DNS maitre avec son IP principale (10.9.0.1), alors il obtient la vue du site B&lt;/li&gt;
&lt;li&gt;Si le DNS slave interroge le DNS maitre avec son IP secondaire (10.9.0.2), alors il obtient la vue du site A&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;Mise en place du transfert sur le DNS slave :
&lt;ul&gt;
&lt;li&gt;Installer Bind&lt;/li&gt;
&lt;li&gt;Mettre en place le fichier named.conf&lt;/li&gt;
&lt;li&gt;Lancez bind, il récupère alors les fichiers de zone automatiquement du serveur maitre&lt;/li&gt;
&lt;/ul&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;Conf DNS Master&lt;/h3&gt;


&lt;p&gt;Contenu de /etc/named.conf&lt;/p&gt;

&lt;pre&gt;
acl &amp;quot;trusted&amp;quot; {
 localhost;
 10.0.0.0/8;
};
 
options {
    directory &amp;quot;/var/named&amp;quot;;
    listen-on {
        10.8.0.1;
    };
    auth-nxdomain no;
    allow-query { trusted; };
    allow-recursion { trusted; };
};
 
# Define ACL for views
acl &amp;quot;frontaux_siteb&amp;quot; {
    10.9.0.102;
    10.9.0.103;
    10.9.0.104;
};

acl &amp;quot;frontaux_sitea&amp;quot; {
    10.8.0.102;
    10.8.0.103;
    10.8.0.104;
};
 
 acl &amp;quot;rpdns_sitea&amp;quot; {
    10.8.0.1; 
};
 
acl &amp;quot;rpdns_siteb&amp;quot; {
    10.9.0.1;
};

acl &amp;quot;rpdns_siteb_ext&amp;quot; {
    10.9.0.2;
};

 # Views definitions
view &amp;quot;site_a&amp;quot; {
	match-clients { frontaux_sitea; rpdns_sitea; };

	# Vue locale
	zone &amp;quot;domaine.tld&amp;quot; IN {
		type master;
		file &amp;quot;sitea.domaine.tld.zone&amp;quot;;
		allow-update { none; };
		allow-transfer { 10.9.0.2; };
		notify yes;
	}; 
};
 
view &amp;quot;dns_slave&amp;quot; {
	match-clients { rpdns_siteb_ext; };
 
	# Vue locale
 	zone &amp;quot;domain.tld&amp;quot; IN {
		type master;
 		file &amp;quot;siteb.domaine.tld.zone&amp;quot;;
		allow-update { none; };
		allow-transfer { 10.9.0.2; };
		notify yes;
	}; 
};
 
view &amp;quot;site_b&amp;quot; {
	match-clients { frontaux_siteb; rpdns_siteb; };
 
	# Vue locale
	zone &amp;quot;cyclo.priv&amp;quot; IN {
		type master;
 		file &amp;quot;pla.cyclo.priv.zone&amp;quot;;
		allow-update { none; };
		allow-transfer { 10.9.0.1; };
		notify yes;
	}; 
};
 &lt;/pre&gt;


&lt;h3&gt;Conf DNS Slave&lt;/h3&gt;

&lt;pre&gt;
acl &amp;quot;trusted&amp;quot; {
 localhost;
 10.0.0.0/8;
};
 
options {
    directory &amp;quot;/var/named&amp;quot;;
    listen-on {
        10.8.0.1;
    };
    auth-nxdomain no;
    allow-query { trusted; };
    allow-recursion { trusted; };
};
 
# Define ACL for views
acl &amp;quot;frontaux_siteb&amp;quot; {
    10.9.0.102;
    10.9.0.103;
    10.9.0.104;
};

acl &amp;quot;frontaux_sitea&amp;quot; {
    10.8.0.102;
    10.8.0.103;
    10.8.0.104;
};
 
 acl &amp;quot;rpdns_sitea&amp;quot; {
    10.8.0.1; 
};
 
acl &amp;quot;rpdns_siteb&amp;quot; {
    10.9.0.1;
};

acl &amp;quot;rpdns_siteb_ext&amp;quot; {
    10.9.0.2;
};

# Views definitions
view &amp;quot;site_a&amp;quot; {
	match-clients { frontaux_sitea; rpdns_sitea; };

	# Vue locale
	zone &amp;quot;domaine.tld&amp;quot; IN {
		type slave;
		file &amp;quot;sitea.domaine.tld.zone&amp;quot;;
		masters { 10.8.0.1; };
		transfer-source 10.9.0.2;
	}; 
};
 
view &amp;quot;dns_slave&amp;quot; {
	match-clients { rpdns_siteb_ext; };
 
	# Vue locale
 	zone &amp;quot;domain.tld&amp;quot; IN {
		type slave;
 		file &amp;quot;sitea.domaine.tld.zone&amp;quot;;
		masters { 10.8.0.1; };
		transfer-source 10.9.0.1;
	}; 
};
 
view &amp;quot;site_b&amp;quot; {
	match-clients { frontaux_siteb; rpdns_siteb; };
 
	# Vue locale
	zone &amp;quot;cyclo.priv&amp;quot; IN {
		type slave;
 		file &amp;quot;siteb.domaine.tld.zone&amp;quot;;
		masters { 10.8.0.1; };
		transfer-source 10.9.0.1;
	}; 
};
 &lt;/pre&gt;


&lt;h3&gt;Conf Zone sitea.domaine.tld.zone&lt;/h3&gt;

&lt;pre&gt;
$TTL 864000
domaine.tld. IN SOA dns.domaine.tld. root.domaine.tld. (
        2009100101
        3600
        3600
        3600
        3600 )
@           IN      NS      domaine.tld.
dns     	IN      A       10.8.0.1
www2		IN      A       10.8.0.102
www2		IN      A       10.8.0.103
www2		IN      A       10.8.0.104
webmail 	IN		CNAME	www2
&lt;/pre&gt;


&lt;h3&gt;Conf Zone siteb.domaine.tld.zone&lt;/h3&gt;

&lt;pre&gt;
$TTL 864000
domaine.tld. IN SOA dns.domaine.tld. root.domaine.tld. (
        2009100101
        3600
        3600
        3600
        3600 )
@           IN      NS      domaine.tld.
dns     	IN      A       10.8.0.1
www2		IN      A       10.9.0.102
www2		IN      A       10.9.0.103
www2		IN      A       10.9.0.104
webmail 	IN		CNAME	www2
&lt;/pre&gt;


&lt;h2&gt;Conf OS&lt;/h2&gt;


&lt;h3&gt;/etc/resolv.conf&lt;/h3&gt;


&lt;p&gt;Serveurs du site A :&lt;/p&gt;

&lt;pre&gt;
search domaine.tld
nameserver 10.8.0.1
&lt;/pre&gt;


&lt;p&gt;Serveurs du site B :&lt;/p&gt;

&lt;pre&gt;
search domaine.tld
nameserver 10.9.0.1
&lt;/pre&gt;


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

&lt;h3&gt;Depuis le site A&lt;/h3&gt;


&lt;p&gt;La commande &lt;code&gt;dig @10.8.0.1 webmail.domain.tld&lt;/code&gt; depuis un serveur du site A doit vous renvoyer une réponse en 10.8.0.x&lt;/p&gt;


&lt;h3&gt;Depuis le site B&lt;/h3&gt;


&lt;p&gt;La commande &lt;code&gt;dig @10.9.0.1 webmail.domain.tld&lt;/code&gt; depuis un serveur du site A doit vous renvoyer une réponse en 10.9.0.x&lt;/p&gt;


&lt;h3&gt;Transfer de zone&lt;/h3&gt;


&lt;p&gt;Lorsque vous démarrez le DNS esclave, il doit récupérer automatiquement les deux fichiers de zone avec un contenu identique à celui décrit plus haut.&lt;/p&gt;


&lt;h2&gt;Sources&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://www.oreillynet.com/pub/a/oreilly/networking/news/views_0501.html&quot; hreflang=&quot;en&quot;&gt;Views in Bind 9&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.knowplace.org/pages/howtos/split_view_with_bind_9_howto.php&quot; hreflang=&quot;en&quot;&gt; Split views with Bind 9 Howto&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://fr.gentoo-wiki.com/wiki/Bind&quot; hreflang=&quot;en&quot;&gt;Bind - Gentoo Linux Wiki&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;Pour conclure...&lt;/h2&gt;


&lt;p&gt;J'espère que c'est pas trop confus et que cela vous aura donner des idées.&lt;/p&gt;


&lt;p&gt;Dans mon cas, j'utilise ça avec en plus une zone privée :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;les internautes arrivent de l'extérieur avec une url publique&lt;/li&gt;
&lt;li&gt;ils transitent sur le réseau interne via des urls privées&lt;/li&gt;
&lt;/ul&gt;</description>
    
    
    
      </item>
    
  <item>
    <title>mod_wsgi 2.6 pour slackware 13.0 x86_64 et 12.x</title>
    <link>http://nicolas.steinmetz.fr/journal/post/2009/10/21/mod_wsgi-2.6-pour-slackware-13.0-x86_64-%28et-bient%C3%B4t-12.x%29</link>
    <guid isPermaLink="false">urn:md5:a0f25dcadea7b1f3e4e12c3e7f6b0982</guid>
    <pubDate>Wed, 21 Oct 2009 23:29:00 +0200</pubDate>
    <dc:creator>Nicolas Steinmetz</dc:creator>
        <category>Python - Django</category>
        <category>apache</category><category>mod_wsgi</category><category>python</category><category>slackware</category>    
    <description>    &lt;p&gt;Décidément, je vais finir par packager &lt;a href=&quot;http://www.modwsgi.org/&quot; hreflang=&quot;en&quot;&gt;mod_wsgi&lt;/a&gt; pour toutes les distributions : après &lt;a href=&quot;http://www.archlinux.org/&quot; hreflang=&quot;en&quot;&gt;Arch&lt;/a&gt; il y a de ça quelques temps, voici le package &lt;a href=&quot;http://www.slackware.com&quot; hreflang=&quot;en&quot;&gt;Slackware&lt;/a&gt;.&lt;/p&gt;


&lt;p&gt;Restons modeste, il ne s'agit que d'une mise à jour mineure du &lt;a href=&quot;http://slackbuilds.org/repository/13.0/network/mod_wsgi/&quot; hreflang=&quot;en&quot;&gt;slackbuild&lt;/a&gt; existant pour passer de la version 2.0 à 2.6.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://nicolas.steinmetz.fr/slackware/13/mod_wsgi-2.6-sb.tgz&quot;&gt;Slackbuild mod_wsgi 2.6&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://nicolas.steinmetz.fr/slackware/13/mod_wsgi-2.6-x86_64-1_nst.tgz&quot;&gt;mod_wsgi-2.6-x86_64-1_nst.tgz&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Une fois récupéré :&lt;/p&gt;

&lt;pre class=&quot;bash&quot;&gt;installpkg mod_wsgi&lt;span style=&quot;color: #cc66cc;&quot;&gt;-2.6&lt;/span&gt;-x86_64-1_nst.tgz&lt;/pre&gt;


&lt;p&gt;Ensuite dans /etc/httpd.conf, il vous suffit de rajouter une ligne du type :&lt;/p&gt;

&lt;pre class=&quot;apache&quot;&gt;&lt;span style=&quot;color: #00007f;&quot;&gt;Include&lt;/span&gt; /etc/httpd/mod_wsgi.conf&lt;/pre&gt;


&lt;p&gt;Puis de redémarrer apache :&lt;/p&gt;

&lt;pre class=&quot;bash&quot;&gt;/etc/rc.d/rc.httpd reload&lt;/pre&gt;


&lt;p&gt;Pour Slackware 12.2 :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://nicolas.steinmetz.fr/slackware/12/mod_wsgi-2.6-sb.tgz&quot;&gt;Slackbuild mod_wsgi 2.6&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://nicolas.steinmetz.fr/slackware/12/mod_wsgi-2.6-i486-1_nst.tgz&quot;&gt;mod_wsgi-2.6-i486-1_nst.tgz&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Par contre, il vous faut créer le fichier /etc/httpd/mod_wsgi.conf :&lt;/p&gt;

&lt;pre class=&quot;apache&quot;&gt;&lt;span style=&quot;color: #00007f;&quot;&gt;LoadModule&lt;/span&gt; wsgi_module lib/httpd/modules/mod_wsgi.so&lt;/pre&gt;</description>
    
    
    
      </item>
    
  <item>
    <title>Django : limit_choices_to pour présenter un sous-ensemble des données d'un modèle</title>
    <link>http://nicolas.steinmetz.fr/journal/post/2009/09/29/Django-%3A-limit_choices_to-pour-pr%C3%A9senter-un-sous-ensemble-des-donn%C3%A9es-d-un-mod%C3%A8le</link>
    <guid isPermaLink="false">urn:md5:96a22fe4167e630e551303d7920d43b8</guid>
    <pubDate>Tue, 29 Sep 2009 09:54:00 +0200</pubDate>
    <dc:creator>Nicolas Steinmetz</dc:creator>
        <category>Python - Django</category>
        <category>django</category><category>filtre</category><category>limit_choices_to</category><category>modèle</category><category>python</category>    
    <description>    &lt;p&gt;Dans le cadre des relations &amp;quot;One to many&amp;quot; ou &amp;quot;Many to Many&amp;quot;, il est possible de présenter un sous-ensemble de votre modèle en fonction de critères de tri.&lt;/p&gt;


&lt;p&gt;Codant une application de gestion de reverse proxys pour les sites web Vélos en libre service, il me faut gérer différents types d'url (une url publique, une url pour les abonnements, une url d'admin, les déclinaisons linguistiques et autres alias en tous genre) et ce pour chaque type d'environnement (VABF, PREPROD, PROD). J'aurais pu créer autant de modèles que j'ai de type d'url mais cela aurait été particulièrement contre-productif. J'ai donc un modèle unique avec les paramètres &amp;quot;type d'url&amp;quot; et &amp;quot;environnement&amp;quot;. Dès lors, quand je définis les urls d'une ville, il me suffit de faire des relations &amp;quot;One to Many&amp;quot; ou &amp;quot;Many to many&amp;quot; vers mon objet &lt;code&gt;Url&lt;/code&gt;.&lt;/p&gt;


&lt;p&gt;Cela donne grosso modo la chose suivante  pour l'objet &lt;code&gt;Url&lt;/code&gt;:&lt;/p&gt;

&lt;pre class=&quot;python&quot;&gt;&lt;span style=&quot;color: #ff7700;font-weight:bold;&quot;&gt;class&lt;/span&gt; Url&lt;span style=&quot;color: black;&quot;&gt;&amp;#40;&lt;/span&gt;models.&lt;span style=&quot;color: black;&quot;&gt;Model&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;&amp;#41;&lt;/span&gt;:
    &lt;span style=&quot;color: #483d8b;&quot;&gt;&amp;quot;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #483d8b;&quot;&gt;&amp;quot;
    Url description
    &amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #483d8b;&quot;&gt;&amp;quot;&amp;quot;&lt;/span&gt;
    ENVT_CHOICES = &lt;span style=&quot;color: black;&quot;&gt;&amp;#40;&lt;/span&gt;
        &lt;span style=&quot;color: black;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #483d8b;&quot;&gt;'1'&lt;/span&gt;, &lt;span style=&quot;color: #483d8b;&quot;&gt;'VABF'&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;&amp;#41;&lt;/span&gt;,
        &lt;span style=&quot;color: black;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #483d8b;&quot;&gt;'2'&lt;/span&gt;, &lt;span style=&quot;color: #483d8b;&quot;&gt;'PREPROD'&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;&amp;#41;&lt;/span&gt;,
        &lt;span style=&quot;color: black;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #483d8b;&quot;&gt;'3'&lt;/span&gt;, &lt;span style=&quot;color: #483d8b;&quot;&gt;'PROD'&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;&amp;#41;&lt;/span&gt;,
    &lt;span style=&quot;color: black;&quot;&gt;&amp;#41;&lt;/span&gt;
    URL_CHOICES = &lt;span style=&quot;color: black;&quot;&gt;&amp;#40;&lt;/span&gt;
        &lt;span style=&quot;color: black;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #483d8b;&quot;&gt;'1'&lt;/span&gt;, &lt;span style=&quot;color: #483d8b;&quot;&gt;'www'&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;&amp;#41;&lt;/span&gt;,
        &lt;span style=&quot;color: black;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #483d8b;&quot;&gt;'2'&lt;/span&gt;, &lt;span style=&quot;color: #483d8b;&quot;&gt;'subscription'&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;&amp;#41;&lt;/span&gt;,
        &lt;span style=&quot;color: black;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #483d8b;&quot;&gt;'3'&lt;/span&gt;, &lt;span style=&quot;color: #483d8b;&quot;&gt;'admin'&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;&amp;#41;&lt;/span&gt;,
        &lt;span style=&quot;color: black;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #483d8b;&quot;&gt;'4'&lt;/span&gt;, &lt;span style=&quot;color: #483d8b;&quot;&gt;'secondary'&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;&amp;#41;&lt;/span&gt;,
        &lt;span style=&quot;color: black;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #483d8b;&quot;&gt;'5'&lt;/span&gt;, &lt;span style=&quot;color: #483d8b;&quot;&gt;'translation'&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;&amp;#41;&lt;/span&gt;,        
    &lt;span style=&quot;color: black;&quot;&gt;&amp;#41;&lt;/span&gt;
    name = models.&lt;span style=&quot;color: black;&quot;&gt;CharField&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #483d8b;&quot;&gt;&amp;quot;DNS&amp;quot;&lt;/span&gt;, help_text=&lt;span style=&quot;color: #483d8b;&quot;&gt;&amp;quot;Provide url of the site without http(s)://&amp;quot;&lt;/span&gt;, max_length=&lt;span style=&quot;color: #ff4500;&quot;&gt;100&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;&amp;#41;&lt;/span&gt;
    description = models.&lt;span style=&quot;color: black;&quot;&gt;CharField&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;&amp;#40;&lt;/span&gt;help_text=&lt;span style=&quot;color: #483d8b;&quot;&gt;&amp;quot;You can provide extra information on the url&amp;quot;&lt;/span&gt;, blank=&lt;span style=&quot;color: #008000;&quot;&gt;True&lt;/span&gt;, max_length=&lt;span style=&quot;color: #ff4500;&quot;&gt;100&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;&amp;#41;&lt;/span&gt;
    url = models.&lt;span style=&quot;color: black;&quot;&gt;URLField&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #483d8b;&quot;&gt;&amp;quot;URL&amp;quot;&lt;/span&gt;, help_text=&lt;span style=&quot;color: #483d8b;&quot;&gt;&amp;quot;Provide url of the site *with* http(s)://&amp;quot;&lt;/span&gt;, verify_exists=&lt;span style=&quot;color: #008000;&quot;&gt;False&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;&amp;#41;&lt;/span&gt;
    urltype = models.&lt;span style=&quot;color: black;&quot;&gt;CharField&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #483d8b;&quot;&gt;&amp;quot;URL Type&amp;quot;&lt;/span&gt;, help_text=&lt;span style=&quot;color: #483d8b;&quot;&gt;&amp;quot;What kind of url it is ?&amp;quot;&lt;/span&gt;, max_length=&lt;span style=&quot;color: #ff4500;&quot;&gt;20&lt;/span&gt;, choices=URL_CHOICES&lt;span style=&quot;color: black;&quot;&gt;&amp;#41;&lt;/span&gt;
    envt = models.&lt;span style=&quot;color: black;&quot;&gt;CharField&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #483d8b;&quot;&gt;&amp;quot;Environement&amp;quot;&lt;/span&gt;, help_text=&lt;span style=&quot;color: #483d8b;&quot;&gt;&amp;quot;In which environment is used this url ?&amp;quot;&lt;/span&gt;, max_length=&lt;span style=&quot;color: #ff4500;&quot;&gt;100&lt;/span&gt;, choices=ENVT_CHOICES&lt;span style=&quot;color: black;&quot;&gt;&amp;#41;&lt;/span&gt;
    
    &lt;span style=&quot;color: #ff7700;font-weight:bold;&quot;&gt;def&lt;/span&gt; &lt;span style=&quot;color: #0000cd;&quot;&gt;__unicode__&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;self&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;&amp;#41;&lt;/span&gt;:
        &lt;span style=&quot;color: #ff7700;font-weight:bold;&quot;&gt;return&lt;/span&gt; &lt;span style=&quot;color: #008000;&quot;&gt;self&lt;/span&gt;.&lt;span style=&quot;color: black;&quot;&gt;name&lt;/span&gt;&lt;/pre&gt;


&lt;p&gt;Dans un premier temps, la classe &lt;code&gt;Town&lt;/code&gt; est assez simple à monter :&lt;/p&gt;

&lt;pre class=&quot;python&quot;&gt;&lt;span style=&quot;color: #ff7700;font-weight:bold;&quot;&gt;class&lt;/span&gt; Town&lt;span style=&quot;color: black;&quot;&gt;&amp;#40;&lt;/span&gt;models.&lt;span style=&quot;color: black;&quot;&gt;Model&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;&amp;#41;&lt;/span&gt;:
    &lt;span style=&quot;color: #483d8b;&quot;&gt;&amp;quot;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #483d8b;&quot;&gt;&amp;quot;
    Town
    &amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #483d8b;&quot;&gt;&amp;quot;&amp;quot;&lt;/span&gt;
    ENVT_CHOICES = &lt;span style=&quot;color: black;&quot;&gt;&amp;#40;&lt;/span&gt;
        &lt;span style=&quot;color: black;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #483d8b;&quot;&gt;'1'&lt;/span&gt;, &lt;span style=&quot;color: #483d8b;&quot;&gt;'VABF'&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;&amp;#41;&lt;/span&gt;,
        &lt;span style=&quot;color: black;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #483d8b;&quot;&gt;'2'&lt;/span&gt;, &lt;span style=&quot;color: #483d8b;&quot;&gt;'PREPROD'&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;&amp;#41;&lt;/span&gt;,
        &lt;span style=&quot;color: black;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #483d8b;&quot;&gt;'3'&lt;/span&gt;, &lt;span style=&quot;color: #483d8b;&quot;&gt;'PROD'&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;&amp;#41;&lt;/span&gt;,
    &lt;span style=&quot;color: black;&quot;&gt;&amp;#41;&lt;/span&gt;
    STATE_CHOICES = &lt;span style=&quot;color: black;&quot;&gt;&amp;#40;&lt;/span&gt;
        &lt;span style=&quot;color: black;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #483d8b;&quot;&gt;'1'&lt;/span&gt;, &lt;span style=&quot;color: #483d8b;&quot;&gt;'On construction'&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;&amp;#41;&lt;/span&gt;,
        &lt;span style=&quot;color: black;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #483d8b;&quot;&gt;'2'&lt;/span&gt;, &lt;span style=&quot;color: #483d8b;&quot;&gt;'On maintenance'&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;&amp;#41;&lt;/span&gt;,
        &lt;span style=&quot;color: black;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #483d8b;&quot;&gt;'3'&lt;/span&gt;, &lt;span style=&quot;color: #483d8b;&quot;&gt;'Open'&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;&amp;#41;&lt;/span&gt;,
        &lt;span style=&quot;color: black;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #483d8b;&quot;&gt;'4'&lt;/span&gt;, &lt;span style=&quot;color: #483d8b;&quot;&gt;'Closed'&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;&amp;#41;&lt;/span&gt;,
    &lt;span style=&quot;color: black;&quot;&gt;&amp;#41;&lt;/span&gt;
    name = models.&lt;span style=&quot;color: black;&quot;&gt;CharField&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;&amp;#40;&lt;/span&gt;help_text=&lt;span style=&quot;color: #483d8b;&quot;&gt;&amp;quot;Provide the name of the town&amp;quot;&lt;/span&gt;, max_length=&lt;span style=&quot;color: #ff4500;&quot;&gt;100&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;&amp;#41;&lt;/span&gt;
    description = models.&lt;span style=&quot;color: black;&quot;&gt;CharField&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;&amp;#40;&lt;/span&gt;help_text=&lt;span style=&quot;color: #483d8b;&quot;&gt;&amp;quot;You can provide extra information on the town&amp;quot;&lt;/span&gt;, blank=&lt;span style=&quot;color: #008000;&quot;&gt;True&lt;/span&gt;, max_length=&lt;span style=&quot;color: #ff4500;&quot;&gt;100&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;&amp;#41;&lt;/span&gt;
    prod_status = models.&lt;span style=&quot;color: black;&quot;&gt;CharField&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #483d8b;&quot;&gt;&amp;quot;PROD status&amp;quot;&lt;/span&gt;, help_text=&lt;span style=&quot;color: #483d8b;&quot;&gt;&amp;quot;State of the site on PROD environment&amp;quot;&lt;/span&gt;, max_length=&lt;span style=&quot;color: #ff4500;&quot;&gt;20&lt;/span&gt;, choices=STATE_CHOICES&lt;span style=&quot;color: black;&quot;&gt;&amp;#41;&lt;/span&gt;
    prod_www = models.&lt;span style=&quot;color: black;&quot;&gt;ForeignKey&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;&amp;#40;&lt;/span&gt;Url, verbose_name=&lt;span style=&quot;color: #483d8b;&quot;&gt;&amp;quot;WWW Public URL&amp;quot;&lt;/span&gt;, help_text=&lt;span style=&quot;color: #483d8b;&quot;&gt;&amp;quot;Public url of the site like www.velib.paris.fr&amp;quot;&lt;/span&gt;, related_name=&lt;span style=&quot;color: #483d8b;&quot;&gt;&amp;quot;prod_www&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;&amp;#41;&lt;/span&gt;
    prod_abo = models.&lt;span style=&quot;color: black;&quot;&gt;ForeignKey&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;&amp;#40;&lt;/span&gt;Url, verbose_name=&lt;span style=&quot;color: #483d8b;&quot;&gt;&amp;quot;Subscription URL&amp;quot;&lt;/span&gt;, help_text=&lt;span style=&quot;color: #483d8b;&quot;&gt;&amp;quot;HTTPS URL used for all sensible process like subscribption, my account, etc. Is often like https://abo-&amp;lt;town&amp;gt;.cyclocity.fr&amp;quot;&lt;/span&gt;, related_name=&lt;span style=&quot;color: #483d8b;&quot;&gt;&amp;quot;prod_abo&amp;quot;&lt;/span&gt;,&lt;span style=&quot;color: black;&quot;&gt;&amp;#41;&lt;/span&gt;
    prod_admin = models.&lt;span style=&quot;color: black;&quot;&gt;ManyToManyField&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;&amp;#40;&lt;/span&gt;Url, verbose_name=&lt;span style=&quot;color: #483d8b;&quot;&gt;&amp;quot;Internal administration URL(s)&amp;quot;&lt;/span&gt;, help_text=&lt;span style=&quot;color: #483d8b;&quot;&gt;&amp;quot;URL used to access back-office&amp;quot;&lt;/span&gt;, related_name=&lt;span style=&quot;color: #483d8b;&quot;&gt;&amp;quot;prod_admin&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;&amp;#41;&lt;/span&gt; 
    prod_other = models.&lt;span style=&quot;color: black;&quot;&gt;ManyToManyField&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;&amp;#40;&lt;/span&gt;Url, verbose_name=&lt;span style=&quot;color: #483d8b;&quot;&gt;&amp;quot;Other URL(s)&amp;quot;&lt;/span&gt;, help_text=&lt;span style=&quot;color: #483d8b;&quot;&gt;&amp;quot;Other urls related to the site like aliases related to the public url&amp;quot;&lt;/span&gt;, related_name=&lt;span style=&quot;color: #483d8b;&quot;&gt;&amp;quot;prod_other&amp;quot;&lt;/span&gt;, blank=&lt;span style=&quot;color: #008000;&quot;&gt;True&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;&amp;#41;&lt;/span&gt;
    prod_translation = models.&lt;span style=&quot;color: black;&quot;&gt;ManyToManyField&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;&amp;#40;&lt;/span&gt;Url, verbose_name=&lt;span style=&quot;color: #483d8b;&quot;&gt;&amp;quot;Translations URL&amp;quot;&lt;/span&gt;, help_text=&lt;span style=&quot;color: #483d8b;&quot;&gt;&amp;quot;If site has translated versions, their public urls are listed here&amp;quot;&lt;/span&gt; ,related_name=&lt;span style=&quot;color: #483d8b;&quot;&gt;&amp;quot;prod_translation&amp;quot;&lt;/span&gt;, blank=&lt;span style=&quot;color: #008000;&quot;&gt;True&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;/pre&gt;


&lt;p&gt;Cette modélisation, bien que remplissant le besoin a un désavantage certain : tous les objets de type &lt;code&gt;Url&lt;/code&gt; sont présentés. Si on part sur 17 villes * 3 environnements * 3 urls &amp;quot;publiques&amp;quot; à minima, soit pas moins de 153 urls disponibles. Pas simple de s'y retrouver (et encore je vous dis pas tout, il y en a bien plus en fait &lt;img src=&quot;/journal/themes/default/smilies/wink.png&quot; alt=&quot;;-)&quot; class=&quot;smiley&quot; /&gt; )&lt;/p&gt;


&lt;p&gt;Il faut alors être en mesure pour l'attribut &lt;code&gt;prod_www&lt;/code&gt; de ne présenter que les urls de type &amp;quot;www&amp;quot; et pour l'environnement &amp;quot;prod&amp;quot;.&lt;/p&gt;


&lt;p&gt;Cela est possible très simplement grâce au filtre &lt;code&gt;limit_choices_to&lt;/code&gt; qui adopte la syntaxe suivante :&lt;/p&gt;

&lt;pre class=&quot;python&quot;&gt;&lt;span style=&quot;color: #ff7700;font-weight:bold;&quot;&gt;class&lt;/span&gt; Example&lt;span style=&quot;color: black;&quot;&gt;&amp;#40;&lt;/span&gt;models.&lt;span style=&quot;color: black;&quot;&gt;Model&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;&amp;#41;&lt;/span&gt;:
    foo = models.&lt;span style=&quot;color: black;&quot;&gt;ForeignKey&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;&amp;#40;&lt;/span&gt;&amp;lt;Modèle&amp;gt;, limit_choices_to = &lt;span style=&quot;color: black;&quot;&gt;&amp;#123;&lt;/span&gt;&lt;span style=&quot;color: #483d8b;&quot;&gt;'&amp;lt;attribut du modèle en question&amp;gt;'&lt;/span&gt;: &lt;span style=&quot;color: #483d8b;&quot;&gt;&amp;quot;&amp;lt;valeur&amp;gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;&amp;#125;&lt;/span&gt;&lt;/pre&gt;


&lt;p&gt;Ce qui dans mon cas donne pour filtrer sur le type d'url et l'environnement :&lt;/p&gt;

&lt;pre class=&quot;python&quot;&gt;&lt;span style=&quot;color: #ff7700;font-weight:bold;&quot;&gt;class&lt;/span&gt; Town&lt;span style=&quot;color: black;&quot;&gt;&amp;#40;&lt;/span&gt;models.&lt;span style=&quot;color: black;&quot;&gt;Model&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;&amp;#41;&lt;/span&gt;:
    &lt;span style=&quot;color: #483d8b;&quot;&gt;&amp;quot;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #483d8b;&quot;&gt;&amp;quot;
    Town
    &amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #483d8b;&quot;&gt;&amp;quot;&amp;quot;&lt;/span&gt;
    ENVT_CHOICES = &lt;span style=&quot;color: black;&quot;&gt;&amp;#40;&lt;/span&gt;
        &lt;span style=&quot;color: black;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #483d8b;&quot;&gt;'1'&lt;/span&gt;, &lt;span style=&quot;color: #483d8b;&quot;&gt;'VABF'&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;&amp;#41;&lt;/span&gt;,
        &lt;span style=&quot;color: black;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #483d8b;&quot;&gt;'2'&lt;/span&gt;, &lt;span style=&quot;color: #483d8b;&quot;&gt;'PREPROD'&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;&amp;#41;&lt;/span&gt;,
        &lt;span style=&quot;color: black;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #483d8b;&quot;&gt;'3'&lt;/span&gt;, &lt;span style=&quot;color: #483d8b;&quot;&gt;'PROD'&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;&amp;#41;&lt;/span&gt;,
    &lt;span style=&quot;color: black;&quot;&gt;&amp;#41;&lt;/span&gt;
    STATE_CHOICES = &lt;span style=&quot;color: black;&quot;&gt;&amp;#40;&lt;/span&gt;
        &lt;span style=&quot;color: black;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #483d8b;&quot;&gt;'1'&lt;/span&gt;, &lt;span style=&quot;color: #483d8b;&quot;&gt;'On construction'&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;&amp;#41;&lt;/span&gt;,
        &lt;span style=&quot;color: black;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #483d8b;&quot;&gt;'2'&lt;/span&gt;, &lt;span style=&quot;color: #483d8b;&quot;&gt;'On maintenance'&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;&amp;#41;&lt;/span&gt;,
        &lt;span style=&quot;color: black;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #483d8b;&quot;&gt;'3'&lt;/span&gt;, &lt;span style=&quot;color: #483d8b;&quot;&gt;'Open'&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;&amp;#41;&lt;/span&gt;,
        &lt;span style=&quot;color: black;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #483d8b;&quot;&gt;'4'&lt;/span&gt;, &lt;span style=&quot;color: #483d8b;&quot;&gt;'Closed'&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;&amp;#41;&lt;/span&gt;,
    &lt;span style=&quot;color: black;&quot;&gt;&amp;#41;&lt;/span&gt;
    name = models.&lt;span style=&quot;color: black;&quot;&gt;CharField&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;&amp;#40;&lt;/span&gt;help_text=&lt;span style=&quot;color: #483d8b;&quot;&gt;&amp;quot;Provide the name of the town&amp;quot;&lt;/span&gt;, max_length=&lt;span style=&quot;color: #ff4500;&quot;&gt;100&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;&amp;#41;&lt;/span&gt;
    description = models.&lt;span style=&quot;color: black;&quot;&gt;CharField&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;&amp;#40;&lt;/span&gt;help_text=&lt;span style=&quot;color: #483d8b;&quot;&gt;&amp;quot;You can provide extra information on the town&amp;quot;&lt;/span&gt;, blank=&lt;span style=&quot;color: #008000;&quot;&gt;True&lt;/span&gt;, max_length=&lt;span style=&quot;color: #ff4500;&quot;&gt;100&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;&amp;#41;&lt;/span&gt;
    prod_status = models.&lt;span style=&quot;color: black;&quot;&gt;CharField&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #483d8b;&quot;&gt;&amp;quot;PROD status&amp;quot;&lt;/span&gt;, help_text=&lt;span style=&quot;color: #483d8b;&quot;&gt;&amp;quot;State of the site on PROD environment&amp;quot;&lt;/span&gt;, max_length=&lt;span style=&quot;color: #ff4500;&quot;&gt;20&lt;/span&gt;, choices=STATE_CHOICES&lt;span style=&quot;color: black;&quot;&gt;&amp;#41;&lt;/span&gt;
    prod_www = models.&lt;span style=&quot;color: black;&quot;&gt;ForeignKey&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;&amp;#40;&lt;/span&gt;Url, verbose_name=&lt;span style=&quot;color: #483d8b;&quot;&gt;&amp;quot;WWW Public URL&amp;quot;&lt;/span&gt;, help_text=&lt;span style=&quot;color: #483d8b;&quot;&gt;&amp;quot;Public url of the site like www.velib.paris.fr&amp;quot;&lt;/span&gt;, related_name=&lt;span style=&quot;color: #483d8b;&quot;&gt;&amp;quot;prod_www&amp;quot;&lt;/span&gt;, limit_choices_to = &lt;span style=&quot;color: black;&quot;&gt;&amp;#123;&lt;/span&gt;&lt;span style=&quot;color: #483d8b;&quot;&gt;'urltype'&lt;/span&gt;: &lt;span style=&quot;color: #ff4500;&quot;&gt;1&lt;/span&gt;, &lt;span style=&quot;color: #483d8b;&quot;&gt;'envt'&lt;/span&gt;: &lt;span style=&quot;color: #ff4500;&quot;&gt;3&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;&amp;#125;&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;&amp;#41;&lt;/span&gt;
    prod_abo = models.&lt;span style=&quot;color: black;&quot;&gt;ForeignKey&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;&amp;#40;&lt;/span&gt;Url, verbose_name=&lt;span style=&quot;color: #483d8b;&quot;&gt;&amp;quot;Subscription URL&amp;quot;&lt;/span&gt;, help_text=&lt;span style=&quot;color: #483d8b;&quot;&gt;&amp;quot;HTTPS URL used for all sensible process like subscribption, my account, etc. Is often like https://abo-&amp;lt;town&amp;gt;.cyclocity.fr&amp;quot;&lt;/span&gt;, related_name=&lt;span style=&quot;color: #483d8b;&quot;&gt;&amp;quot;prod_abo&amp;quot;&lt;/span&gt;, limit_choices_to = &lt;span style=&quot;color: black;&quot;&gt;&amp;#123;&lt;/span&gt;&lt;span style=&quot;color: #483d8b;&quot;&gt;'urltype'&lt;/span&gt;: &lt;span style=&quot;color: #ff4500;&quot;&gt;2&lt;/span&gt;, &lt;span style=&quot;color: #483d8b;&quot;&gt;'envt'&lt;/span&gt;: &lt;span style=&quot;color: #ff4500;&quot;&gt;3&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;&amp;#125;&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;&amp;#41;&lt;/span&gt;
    prod_admin = models.&lt;span style=&quot;color: black;&quot;&gt;ManyToManyField&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;&amp;#40;&lt;/span&gt;Url, verbose_name=&lt;span style=&quot;color: #483d8b;&quot;&gt;&amp;quot;Internal administration URL(s)&amp;quot;&lt;/span&gt;, help_text=&lt;span style=&quot;color: #483d8b;&quot;&gt;&amp;quot;URL used to access back-office&amp;quot;&lt;/span&gt;, related_name=&lt;span style=&quot;color: #483d8b;&quot;&gt;&amp;quot;prod_admin&amp;quot;&lt;/span&gt;, limit_choices_to = &lt;span style=&quot;color: black;&quot;&gt;&amp;#123;&lt;/span&gt;&lt;span style=&quot;color: #483d8b;&quot;&gt;'urltype'&lt;/span&gt;: &lt;span style=&quot;color: #ff4500;&quot;&gt;3&lt;/span&gt;, &lt;span style=&quot;color: #483d8b;&quot;&gt;'envt'&lt;/span&gt;: &lt;span style=&quot;color: #ff4500;&quot;&gt;3&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;&amp;#125;&lt;/span&gt; &lt;span style=&quot;color: black;&quot;&gt;&amp;#41;&lt;/span&gt; 
    prod_other = models.&lt;span style=&quot;color: black;&quot;&gt;ManyToManyField&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;&amp;#40;&lt;/span&gt;Url, verbose_name=&lt;span style=&quot;color: #483d8b;&quot;&gt;&amp;quot;Other URL(s)&amp;quot;&lt;/span&gt;, help_text=&lt;span style=&quot;color: #483d8b;&quot;&gt;&amp;quot;Other urls related to the site like aliases related to the public url&amp;quot;&lt;/span&gt;, related_name=&lt;span style=&quot;color: #483d8b;&quot;&gt;&amp;quot;prod_other&amp;quot;&lt;/span&gt;, limit_choices_to = &lt;span style=&quot;color: black;&quot;&gt;&amp;#123;&lt;/span&gt;&lt;span style=&quot;color: #483d8b;&quot;&gt;'urltype'&lt;/span&gt;: &lt;span style=&quot;color: #ff4500;&quot;&gt;4&lt;/span&gt;, &lt;span style=&quot;color: #483d8b;&quot;&gt;'envt'&lt;/span&gt;: &lt;span style=&quot;color: #ff4500;&quot;&gt;3&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;&amp;#125;&lt;/span&gt;, blank=&lt;span style=&quot;color: #008000;&quot;&gt;True&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;&amp;#41;&lt;/span&gt;
    prod_translation = models.&lt;span style=&quot;color: black;&quot;&gt;ManyToManyField&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;&amp;#40;&lt;/span&gt;Url, verbose_name=&lt;span style=&quot;color: #483d8b;&quot;&gt;&amp;quot;Translations URL&amp;quot;&lt;/span&gt;, help_text=&lt;span style=&quot;color: #483d8b;&quot;&gt;&amp;quot;If site has translated versions, their public urls are listed here&amp;quot;&lt;/span&gt; ,related_name=&lt;span style=&quot;color: #483d8b;&quot;&gt;&amp;quot;prod_translation&amp;quot;&lt;/span&gt;, limit_choices_to = &lt;span style=&quot;color: black;&quot;&gt;&amp;#123;&lt;/span&gt;&lt;span style=&quot;color: #483d8b;&quot;&gt;'urltype'&lt;/span&gt;: &lt;span style=&quot;color: #ff4500;&quot;&gt;5&lt;/span&gt;, &lt;span style=&quot;color: #483d8b;&quot;&gt;'envt'&lt;/span&gt;: &lt;span style=&quot;color: #ff4500;&quot;&gt;3&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;&amp;#125;&lt;/span&gt;, blank=&lt;span style=&quot;color: #008000;&quot;&gt;True&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;/pre&gt;


&lt;p&gt;Comme le montre l'exemple de la &lt;a href=&quot;http://docs.djangoproject.com/en/dev/ref/models/fields/#database-representation&quot; hreflang=&quot;en&quot;&gt;documentation&lt;/a&gt;, ce filtre marche aussi de façon dynamique ou bien avec des objets Q pour les &lt;a href=&quot;http://docs.djangoproject.com/en/dev/topics/db/queries/#complex-lookups-with-q&quot; hreflang=&quot;en&quot;&gt;requêtes complexes&lt;/a&gt; :&lt;/p&gt;

&lt;pre class=&quot;python&quot;&gt;limit_choices_to = &lt;span style=&quot;color: black;&quot;&gt;&amp;#123;&lt;/span&gt;&lt;span style=&quot;color: #483d8b;&quot;&gt;'pub_date__lte'&lt;/span&gt;: &lt;span style=&quot;color: #dc143c;&quot;&gt;datetime&lt;/span&gt;.&lt;span style=&quot;color: black;&quot;&gt;now&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;&amp;#125;&lt;/span&gt;&lt;/pre&gt;


&lt;p&gt;Du coup, le formulaire de création/édition d'une ville ne me présente plus qu'un nombre réduit d'urls pour un champ donné. Au pire, ma liste de choix aura un maximum d'éléments correspondant au nombre de villes déjà entrées dans le système. Il me faudrait affiner le filtre pour en plus ne présenter que les urls non déjà liées à une autre ville. Mais c'est moins évident et immédiat &lt;img src=&quot;/journal/themes/default/smilies/wink.png&quot; alt=&quot;;-)&quot; class=&quot;smiley&quot; /&gt;&lt;/p&gt;


&lt;p&gt;En espérant que cela puisse être utile à d'autres...&lt;/p&gt;</description>
    
    
    
      </item>
    
  <item>
    <title>Installer Slackware 13.0 sur une clé USB pour utilisation dans un linutop</title>
    <link>http://nicolas.steinmetz.fr/journal/post/2009/09/26/Installer-Slackware-13.0-sur-une-cl%C3%A9-USB-pour-utilisation-dans-un-linutop</link>
    <guid isPermaLink="false">urn:md5:9922a6b330186e12d0b928312da24125</guid>
    <pubDate>Sat, 26 Sep 2009 00:26:00 +0200</pubDate>
    <dc:creator>Nicolas Steinmetz</dc:creator>
        <category>Trucs de geek</category>
        <category>clé usb</category><category>installation</category><category>linutop</category><category>slackware</category><category>tutoriel</category><category>usb</category>    
    <description>    &lt;p&gt;Si comme moi, vous avez un &lt;a href=&quot;http://www.linutop.com/&quot; hreflang=&quot;fr&quot;&gt;linutop&lt;/a&gt; et que vous souhaitez y mettre en place une slackware plutôt que la version Linutop (basée sur Xubuntu), voici la marche à suivre.&lt;/p&gt;


&lt;p&gt;Depuis un autre ordinateur, faire une installation classique de Slackware sur votre clé USB&lt;/p&gt;


&lt;p&gt;Dans mon cas, cela donne :&lt;/p&gt;

&lt;pre&gt;
/dev/sda1    swap     1G
/dev/sda2    ext4     8G
&lt;/pre&gt;


&lt;p&gt;A ce stade, dans mon cas, la clé refuse de démarrer. Même en créer la clé usb de démarrage, pas mieux car les modules USB sont chargés après qu'il chercheà accéder aux données de la partition /&lt;/p&gt;


&lt;p&gt;Une fois l'installation finie, redemarrer votre ordinateur en laissant le CD de Slackware pour qu'il se lance automatiquement. Au lieu de taper &lt;code&gt;setup&lt;/code&gt; pour lancer l'installateur Slackware, procéder de la façon suivante.&lt;/p&gt;


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

&lt;pre class=&quot;bash&quot;&gt;mount /dev/sda1 /mnt
swapon /dev/sda2
mount -o &lt;span style=&quot;color: #000066;&quot;&gt;bind&lt;/span&gt; /proc /mnt/proc
chroot /mnt /bin/bash&lt;/pre&gt;


&lt;h3&gt;Récupérer la version du noyau :&lt;/h3&gt;


&lt;p&gt;Via un &lt;code&gt;uname -r&lt;/code&gt; :&lt;/p&gt;

&lt;pre&gt;
uname -r
2.6.29.6-smp
&lt;/pre&gt;


&lt;h3&gt;Création d'un initrd personnalisé&lt;/h3&gt;


&lt;p&gt;Le but ici est de rajouter les modules permettant de booter sur une clé USB et en ext4 ; se reporter à /boot/README.initrd pour plus d'info.&lt;/p&gt;

&lt;pre&gt;
mkinitrd -c -k 2.6.29.6-smp -m usbcore:ehci-hcd:uhci-hcd:ohci-hcd:usb-storage:ext4 -f ext4 -r /dev/sda2
&lt;/pre&gt;


&lt;p&gt;A adapter bien sur à vos besoins.&lt;/p&gt;


&lt;p&gt;Ensuite modifier le fichier &lt;code&gt;/boot/initrd-tree/init&lt;/code&gt; :&lt;/p&gt;


&lt;p&gt;Trouvez la ligne &lt;code&gt;# Initialize LVM:&lt;/code&gt; et au dessus, ajoutez les 2 lignes suivantes :&lt;/p&gt;

&lt;pre class=&quot;bash&quot;&gt;&lt;span style=&quot;color: #000066;&quot;&gt;echo&lt;/span&gt; &lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;quot;Sleeping to allow USB Init.&amp;quot;&lt;/span&gt;
sleep &lt;span style=&quot;color: #cc66cc;&quot;&gt;10&lt;/span&gt;&lt;/pre&gt;


&lt;p&gt;Regénérez l'initrd en tapant &lt;code&gt;mkinitrd&lt;/code&gt; sans arguments.&lt;/p&gt;


&lt;h3&gt;Mise à jour de Lilo&lt;/h3&gt;


&lt;p&gt;Modifier &lt;code&gt;/etc/lilo.conf&lt;/code&gt; pour ajouter la ligne &lt;code&gt;initrd = /boot/initrd.gz&lt;/code&gt; :&lt;/p&gt;

&lt;pre class=&quot;bash&quot;&gt;&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;# Linux bootable partition config begins&lt;/span&gt;
image = /boot/vmlinuz
  root = /dev/sda2
  label = Linux
  read-only
  initrd = /boot/initrd.gz
&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;# Linux bootable partition config ends &lt;/span&gt;&lt;/pre&gt;


&lt;p&gt;Faites un test de chargement des paramètres de lilo :&lt;/p&gt;

&lt;pre class=&quot;bash&quot;&gt;lilo -t -v&lt;/pre&gt;


&lt;p&gt;Si pas d'erreurs (il se peut qu'il y ait des warnings par contre), appliquez les nouveaux paramètres :&lt;/p&gt;

&lt;pre class=&quot;bash&quot;&gt;lilo -v&lt;/pre&gt;


&lt;p&gt;Sortez de votre chroot via un &lt;code&gt;exit&lt;/code&gt;, démontez vos périphériques :&lt;/p&gt;

&lt;pre class=&quot;bash&quot;&gt;swapff /dev/sda1
umount /mnt&lt;/pre&gt;


&lt;p&gt;Redémarrez votre ordinateur via un &lt;code&gt;reboot&lt;/code&gt;.&lt;/p&gt;


&lt;p&gt;Mettre la clé dans le linutop et apprécier &lt;img src=&quot;/journal/themes/default/smilies/smile.png&quot; alt=&quot;:-)&quot; class=&quot;smiley&quot; /&gt;&lt;/p&gt;


&lt;p&gt;Source et autres méthodes (non testées) : &lt;a href=&quot;http://www.linuxquestions.org/questions/slackware-14/guide-installing-slack-12.0-to-a-usb-drive-566697/&quot; hreflang=&quot;en&quot;&gt;Guide - Installing Slack 12.0 To a USB Drive&lt;/a&gt;&lt;/p&gt;</description>
    
    
    
      </item>
    
  <item>
    <title>Mon comparatif Django vs Symfony</title>
    <link>http://nicolas.steinmetz.fr/journal/post/2009/08/03/Mon-comparatif-Django-vs-Symfony</link>
    <guid isPermaLink="false">urn:md5:72618e1cf2f1ac6879296825bfeb8a75</guid>
    <pubDate>Mon, 03 Aug 2009 14:31:00 +0200</pubDate>
    <dc:creator>Nicolas Steinmetz</dc:creator>
        <category>Python - Django</category>
        <category>django</category><category>framework</category><category>php</category><category>python</category><category>symfony</category>    
    <description>    &lt;p&gt;Dans la mesure où au boulot les applications symfony commencent à se multiplier (on va passer de 1 à 2, restons modestes &lt;img src=&quot;/journal/themes/default/smilies/wink.png&quot; alt=&quot;;-)&quot; class=&quot;smiley&quot; /&gt; ) et que je songeais par ailleurs à recoder une appli existante en symfony pour des raisons de compétences internes à JCDecaux (Python/Django, c'est pas gagné a priori...), je me suis décidé à me (re)plonger dans Symfony.&lt;/p&gt;


&lt;p&gt;Après quelques heures de lectures et fait le &lt;a href=&quot;http://www.symfony-project.org/tutorial/1_2/my-first-project&quot; hreflang=&quot;en&quot;&gt;tutoriel en une heure&lt;/a&gt; et surtout le &lt;a href=&quot;http://www.symfony-project.org/jobeet/1_2/Doctrine/en/&quot; hreflang=&quot;en&quot;&gt;tutoriel Jobeet&lt;/a&gt;, voici ce que j'en retire par rapport à mon expérience sur Django. (pour être tout à fait honnête, j'ai consciencieusement suivi le tutoriel jusqu'à la fin du jour 7 - après, j'ai lu avec attention mais pas recopié les bouts de code).&lt;/p&gt;


&lt;p&gt;Cela n'engage bien sur que moi, je suis ouvert à toute discussion constructive et cela ne se veut pas être un nid à troll &lt;img src=&quot;/journal/themes/default/smilies/wink.png&quot; alt=&quot;;-)&quot; class=&quot;smiley&quot; /&gt; N'ayant pas non plus lu toute la documentation Symfony, je peux dire des âneries ou des choses fausses car non présentées dans les documents que j'ai pu lire.&lt;/p&gt;


&lt;p&gt;&lt;strong&gt;Sur les modèles&lt;/strong&gt; :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Relations OneToOne, OneToMany ou ManyToMany : avantage Django puisque beaucoup plus limpide et pas besoin de déclarer les tables intermédiaires pour les relations ManyToMany. A contrario, cela peut paraître trop magique&lt;/li&gt;
&lt;li&gt;Type de modèle : avantage Django. Symfony reste sur les types &amp;quot;de base&amp;quot; et il faut donc appeler ensuite un validateur pour valider le contenu d'un champ. Avec Django, c'est du tout en un par ex : models.UrlField qui ne stocke qu'une url et vérifie si elle est valide (et éventuellement si elle existe bien)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Routing&lt;/strong&gt; :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Avantage Symfony sur les &amp;quot;Route Collection Class&amp;quot; : en gros en déclarant une fois par ex &lt;a href=&quot;http://www.symfony-project.org/api/1_2/sfDoctrineRouteCollection&quot; hreflang=&quot;en&quot;&gt;SfDoctrineCollectionRoute&lt;/a&gt;, cela vous met automatiquement les 7 méthodes à disposition (de base, new, create, edit, update, delete, show). Dans django, à ma connaissance, cela n'existe pas.&lt;/li&gt;
&lt;li&gt;&lt;del&gt;Avantage Django sur la flexibilité des urls (mais en est-ce vraiment un). On peut sortir du /module/action/param de Symfony.&lt;/del&gt; Ex-aequo sur la capacité à créer son schema d'url (merci Niko pour la correction)&lt;/li&gt;
&lt;li&gt;Définition des routes : Avantage Symfony - les possibilités ont l'air plus fines (limité une route à une méthode par ex) et plus lisibles à mettre en oeuvre (les regexps des routes Django sont pas les plus simples à mon sens). Par contre, c'est sur que les routes Django sont du coup moins verbeuses que celle de Symfony (là encore, ça se discute)&lt;/li&gt;
&lt;li&gt;Les urls par défaut fonctionnent de base sous Symfony. Le /module/action a pour avantage de pouvoir jouer tout de suite avec Symfony. Sous Django, cela n'est pas possible de sauter la case urls.py.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Fixtures&lt;/strong&gt; :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Sous Symfony, il est intéressant de voir que l'on peut faire une boucle &amp;quot;for&amp;quot; pour insérer des fixtures en masse&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Formulaires&lt;/strong&gt; :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Symfony s'inspirant officiellement de django.forms, je ne reviendrais pas là dessus.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Templating&lt;/strong&gt; :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Même si PHP peut être vu comme un langage de template en tant que tel, je suis plutôt adepte de l'approche de django.&lt;/li&gt;
&lt;li&gt;Avantage Symfony sur les &amp;quot;partials&amp;quot;. Je ne vois pas trop l'équivalent sous django de prime abord. C'est autre chose que l'héritage de template...&lt;/li&gt;
&lt;li&gt;Avantage Symfony sur la gestion des &amp;quot;flash&amp;quot; (inspiré de Rails de mémoire). N'existe pas à ma connaissance sous Django.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Tests&lt;/strong&gt; :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Pas de comparatif, je n'ai pas pris le temps de regarder ceux de django (aie, pas taper...)&lt;/li&gt;
&lt;li&gt;En me basant sur la lecture j'ai l'impression que les tests de Symfony vont plus loin (tests unitaites + fonctionnels)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Authentification/Authorisation/Cache&lt;/strong&gt; :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Ex-aequo ?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Gestion des &amp;quot;settings&amp;quot;&lt;/strong&gt; :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Avantage Symfony (sous réserve d'aimer YAML) vu qu'il est possible de renseigner un fichier &lt;code&gt;&amp;lt;module&amp;gt;/config/app.yml&lt;/code&gt; par ex. Ca évite de polluer le &lt;code&gt;settings.py&lt;/code&gt; ou d'oublier des settings sur votre machine de dev lors d'un déploiement en prod.&lt;/li&gt;
&lt;li&gt;Avantage Symfony sur la gestion des environnements sur le principe. Après tout dépend comment se fait le déploiement et qui le gère... (par ex, je ne donne pas les identifiants de prod aux équipes de dev au bureau...)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Interface d'admin&lt;/strong&gt; :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Avantage Django je trouve, même si le fait qu'il faille maintenant toucher à admin.py rend l'accès à l'interface un peu plus fastidieux.&lt;/li&gt;
&lt;li&gt;Le chevauchement de l'admin Symfony entre les données et le formulaire de tri sous Safari sur mon macbook n'aide pas non plus...&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;PHP / Python&lt;/strong&gt; :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Même si j'arrive à lire la syntaxe PHP (que de progrès...), je trouve celle de python beaucoup plus agréable à lire et les &lt;code&gt;$this-&amp;gt;&lt;/code&gt; et les &lt;code&gt;foo::bar&lt;/code&gt; me laissent toujours perplexe &lt;img src=&quot;/journal/themes/default/smilies/wink.png&quot; alt=&quot;;-)&quot; class=&quot;smiley&quot; /&gt;&lt;/li&gt;
&lt;li&gt;J'ai l'impression (donc totalement subjectif) que pour un résultat égal, il y aurait bcp plus de lignes dans un projet Symfony que Django&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Plugins vs Applications redistribuables&lt;/strong&gt; :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Dans django, tout est application et il est assez aisé de les redistribuer. Sous Symfony, cela prend le nom de plugins et je pense au final que c'est assez équivalent.&lt;/li&gt;
&lt;li&gt;Symfony a un gros avantage, c'est que les plugins sont officiellement référencés. Pour django, faut passer par la case Google ou chercher dans les entrailes de github, bitbucket, google-code.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Globalement&lt;/strong&gt; :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;J'ai l'impression que Python/Django est de plus haut niveau (dans le sens macro/micro et non qualitatif) que PHP/Symfony. Je rajoute volontairement le langage car je me demande si ça ne vient pas également du langage et non uniquement du mode d'implémentation du framework. A l'inverse, on a peut être un niveau de granularité plus fin avec Symfony ?&lt;/li&gt;
&lt;li&gt;J'ai une impression de &amp;quot;trop de fichiers&amp;quot; dans Symfony et de me noyer un peu dans cet ensemble.&lt;/li&gt;
&lt;li&gt;Le tutoriel en une heure qui n'existe pas en version doctrine, c'est un peu dommage lorsqu'on veut partir sur Doctrine dès le départ&lt;/li&gt;
&lt;li&gt;La double doc en version doctrine / propel est peut être source de confusion&lt;/li&gt;
&lt;li&gt;Django et Symfony ont tous les deux une doc de qualité, même si parfois je m'y perds un peu (l'une comme l'autre).&lt;/li&gt;
&lt;li&gt;Symfony est dans une logique beaucoup plus stricte au niveau MVC quand Django fait du MVT (Modèle Vue Template)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Pour bien faire, il faudrait faire un jobeet en version Django pour se faire une véritable idée sur les 2 frameworks. Pas sur d'avoir envie de faire ça dans l'immédiat par contre...&lt;/p&gt;


&lt;p&gt;&lt;strong&gt;Personnellement&lt;/strong&gt; :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;J'y vois plus clair sur Symfony et c'était le but de l'exercice&lt;/li&gt;
&lt;li&gt;je pense aller titiller un peu l'équipe de dev sur quelques points en particulier à mon retour de congés &lt;img src=&quot;/journal/themes/default/smilies/wink.png&quot; alt=&quot;;-)&quot; class=&quot;smiley&quot; /&gt;&lt;/li&gt;
&lt;li&gt;Pour coder à titre perso, je vais rester sur Django&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Au plaisir d'échanger avec vous maintenant (pour les qqs uns qui ne seraient pas en vacances) &lt;img src=&quot;/journal/themes/default/smilies/smile.png&quot; alt=&quot;:-)&quot; class=&quot;smiley&quot; /&gt;&lt;/p&gt;</description>
    
    
    
      </item>
    
  <item>
    <title>Couchapp : créer votre première application CouchDB (Partie 3)</title>
    <link>http://nicolas.steinmetz.fr/journal/post/2009/07/10/Couchapp-%3A-cr%C3%A9er-votre-premi%C3%A8re-application-CouchDB-%28Partie-3%29</link>
    <guid isPermaLink="false">urn:md5:8eb206edd29b91684edcc55703fade11</guid>
    <pubDate>Fri, 10 Jul 2009 23:16:00 +0200</pubDate>
    <dc:creator>Nicolas Steinmetz</dc:creator>
        <category>CouchDB</category>
        <category>couchapp</category><category>couchdb</category>    
    <description>    &lt;p&gt;Devant la &amp;quot;foule&amp;quot; de commentaires (hum), je continue (tout seul) mon épopée dans les méandres de CouchDB.&lt;/p&gt;


&lt;p&gt;Dans les points non traités la dernière fois, nous allons voir ce jour :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Voir comment on peut remplacer le &amp;quot;My favs ... &amp;quot; dans head.html par une variable extérieure au template (facile - déjà fait mais cela rajoutait une grande quantité d&amp;quot;infos à ce post déjà très long je pense...),&lt;/li&gt;
&lt;li&gt;Mieux comprendre les &amp;quot;!json&amp;quot; et &amp;quot;!code&amp;quot;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;Externaliser le &amp;quot;My favs ...&amp;quot;&lt;/h3&gt;


&lt;p&gt;Commençons par créer un fichier &amp;quot;myfav.json&amp;quot; à la racine du projet contenant, qui contiendra une valeur qui sera utilisé dans la balise &lt;code&gt;title&lt;/code&gt; et en tête de page du site :&lt;/p&gt;

&lt;pre class=&quot;javascript&quot;&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#123;&lt;/span&gt;
   &lt;span style=&quot;color: #3366CC;&quot;&gt;&amp;quot;title&amp;quot;&lt;/span&gt;: &lt;span style=&quot;color: #3366CC;&quot;&gt;&amp;quot;My favs - All my bookmarks.&amp;quot;&lt;/span&gt;
&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#125;&lt;/span&gt;&lt;/pre&gt;


&lt;p&gt;Ensuite dans &amp;quot;list/all.js&amp;quot;, nous avons deux actions à mener :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Faire en sorte que ce fichier soit lu lors de la création de la liste, afin de récupérer la valeur de &amp;quot;title&amp;quot;,&lt;/li&gt;
&lt;li&gt;Mettre à la disposition du template la valeur title contenu dans myfav.json.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ce qui nous donne :&lt;/p&gt;

&lt;pre class=&quot;javascript&quot;&gt;&lt;span style=&quot;color: #003366; font-weight: bold;&quot;&gt;function&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;head, row, req, info&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt; &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#123;&lt;/span&gt;
  &lt;span style=&quot;color: #009900; font-style: italic;&quot;&gt;// !json templates.all&lt;/span&gt;
  &lt;span style=&quot;color: #009900; font-style: italic;&quot;&gt;// !code vendor/couchapp/path.js&lt;/span&gt;
  &lt;span style=&quot;color: #009900; font-style: italic;&quot;&gt;// !code vendor/couchapp/template.js&lt;/span&gt;
  &lt;span style=&quot;color: #009900; font-style: italic;&quot;&gt;// !json myfav&lt;/span&gt;
&amp;nbsp;
  &lt;span style=&quot;color: #000066; font-weight: bold;&quot;&gt;return&lt;/span&gt; respondWith&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;req, &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#123;&lt;/span&gt;
    html : &lt;span style=&quot;color: #003366; font-weight: bold;&quot;&gt;function&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt; &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#123;&lt;/span&gt;
      &lt;span style=&quot;color: #000066; font-weight: bold;&quot;&gt;if&lt;/span&gt; &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;head&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt; &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#123;&lt;/span&gt;
        &lt;span style=&quot;color: #000066; font-weight: bold;&quot;&gt;return&lt;/span&gt; template&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;templates.&lt;span style=&quot;color: #006600;&quot;&gt;all&lt;/span&gt;.&lt;span style=&quot;color: #006600;&quot;&gt;head&lt;/span&gt;, &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#123;&lt;/span&gt;
          assets : assetPath&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;,
          title : myfav.&lt;span style=&quot;color: #006600;&quot;&gt;title&lt;/span&gt;,
        &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#125;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;;
      &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#125;&lt;/span&gt; &lt;span style=&quot;color: #000066; font-weight: bold;&quot;&gt;else&lt;/span&gt; &lt;span style=&quot;color: #000066; font-weight: bold;&quot;&gt;if&lt;/span&gt; &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;row&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt; &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#123;&lt;/span&gt;
        &lt;span style=&quot;color: #000066; font-weight: bold;&quot;&gt;return&lt;/span&gt; template&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;templates.&lt;span style=&quot;color: #006600;&quot;&gt;all&lt;/span&gt;.&lt;span style=&quot;color: #006600;&quot;&gt;row&lt;/span&gt;, &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#123;&lt;/span&gt;
          fav: row.&lt;span style=&quot;color: #006600;&quot;&gt;value&lt;/span&gt;,          
        &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#125;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;;
      &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#125;&lt;/span&gt; &lt;span style=&quot;color: #000066; font-weight: bold;&quot;&gt;else&lt;/span&gt; &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#123;&lt;/span&gt;
        &lt;span style=&quot;color: #000066; font-weight: bold;&quot;&gt;return&lt;/span&gt; template&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;templates.&lt;span style=&quot;color: #006600;&quot;&gt;all&lt;/span&gt;.&lt;span style=&quot;color: #006600;&quot;&gt;tail&lt;/span&gt;, &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#123;&lt;/span&gt;
            assets : assetPath&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;,
        &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#125;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;;
      &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#125;&lt;/span&gt;
    &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#125;&lt;/span&gt;,
  &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#125;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;
&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#125;&lt;/span&gt;;&lt;/pre&gt;


&lt;p&gt;Dans la mesure où je ne veux faire apparaître la valeur de &amp;quot;title&amp;quot; que pour la balise &lt;code&gt;&amp;lt;title&amp;gt;&amp;lt;/title&amp;gt;&lt;/code&gt; et en tête de page, je n'ai besoin de le fournir que pour le template head.&lt;/p&gt;


&lt;p&gt;D'ailleurs le fichier templates/all/head.html devient :&lt;/p&gt;

&lt;pre&gt;
&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html&amp;gt;
  &amp;lt;head&amp;gt;
    &amp;lt;link rel=&amp;quot;stylesheet&amp;quot; href=&amp;quot;../../style/main.css&amp;quot; type=&amp;quot;text/css&amp;quot;/&amp;gt;
    &amp;lt;title&amp;gt;&amp;lt;%= title %&amp;gt;&amp;lt;/title&amp;gt;
  &amp;lt;/head&amp;gt;
  &amp;lt;body&amp;gt;
    &amp;lt;div id=&amp;quot;header&amp;quot;&amp;gt;
        &amp;lt;h1&amp;gt;&amp;lt;%= title %&amp;gt;&amp;lt;/h1&amp;gt;
    &amp;lt;/div&amp;gt;
    &amp;lt;div id=&amp;quot;content&amp;quot;&amp;gt;
      &amp;lt;h2&amp;gt;Recently...&amp;lt;/h2&amp;gt;
      &amp;lt;dl&amp;gt;
&lt;/pre&gt;


&lt;p&gt;Si vous rajoutez par ex &lt;code&gt;&amp;lt;%= title %&amp;gt;&lt;/code&gt; dans templates/all/row.html en pensant que la valeur sera renseignez et bien vous vous trompez et provoquerez une jolie erreur au niveau de CouchDB.&lt;/p&gt;


&lt;p&gt;Faites un push de votre application et rendez-vous ensuite sur &lt;a href=&quot;http://localhost:5984/myfav/_design/mycouchfav/_list/all/favs/&quot;&gt;http://localhost:5984/myfav/_design/mycouchfav/_list/all/favs/&lt;/a&gt; pour apprécier le résultat.&lt;/p&gt;


&lt;p&gt;Dans la même veine, il vous reste à modifier &amp;quot;shows/fav.js&amp;quot;  et &amp;quot;templates/fav.html&amp;quot; ; par contre, utilisant déjà la variable &lt;code&gt;title&lt;/code&gt; pour le titre du favori, j'utilise à la place la variable &lt;code&gt;site_title&lt;/code&gt; :&lt;/p&gt;

&lt;pre class=&quot;javascript&quot;&gt;&lt;span style=&quot;color: #003366; font-weight: bold;&quot;&gt;function&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;doc, req&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt; &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#123;&lt;/span&gt;  
  &lt;span style=&quot;color: #009900; font-style: italic;&quot;&gt;// !json templates.fav&lt;/span&gt;
  &lt;span style=&quot;color: #009900; font-style: italic;&quot;&gt;// !code vendor/couchapp/template.js&lt;/span&gt;
  &lt;span style=&quot;color: #009900; font-style: italic;&quot;&gt;// !code vendor/couchapp/path.js&lt;/span&gt;
  &lt;span style=&quot;color: #009900; font-style: italic;&quot;&gt;// !json myfav&lt;/span&gt;
&amp;nbsp;
  &lt;span style=&quot;color: #009900; font-style: italic;&quot;&gt;// we only show html&lt;/span&gt;
  &lt;span style=&quot;color: #000066; font-weight: bold;&quot;&gt;return&lt;/span&gt; template&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;templates.&lt;span style=&quot;color: #006600;&quot;&gt;fav&lt;/span&gt;, &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#123;&lt;/span&gt;
    title : doc.&lt;span style=&quot;color: #006600;&quot;&gt;title&lt;/span&gt;,
    url : doc.&lt;span style=&quot;color: #006600;&quot;&gt;url&lt;/span&gt;,
    description : doc.&lt;span style=&quot;color: #006600;&quot;&gt;description&lt;/span&gt;,
    assets : assetPath&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;,
    site_title : myfav.&lt;span style=&quot;color: #006600;&quot;&gt;title&lt;/span&gt;,
  &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#125;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;;
&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#125;&lt;/span&gt;&lt;/pre&gt;

&lt;pre&gt;
&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html&amp;gt;
  &amp;lt;head&amp;gt;
    &amp;lt;title&amp;gt;&amp;lt;%= title %&amp;gt; - &amp;lt;%= site_title %&amp;gt;&amp;lt;/title&amp;gt;
    &amp;lt;link rel=&amp;quot;stylesheet&amp;quot; href=&amp;quot;../../style/main.css&amp;quot; type=&amp;quot;text/css&amp;quot;&amp;gt;
  &amp;lt;/head&amp;gt;
  &amp;lt;body&amp;gt;
    &amp;lt;div id=&amp;quot;header&amp;quot;&amp;gt;
        &amp;lt;h1&amp;gt;&amp;lt;%= site_title %&amp;gt;&amp;lt;/h1&amp;gt;
    &amp;lt;/div&amp;gt;
    &amp;lt;div id=&amp;quot;content&amp;quot;&amp;gt;
      &amp;lt;h2&amp;gt;&amp;lt;a href=&amp;quot;&amp;lt;%= url %&amp;gt;&amp;quot;&amp;gt;&amp;lt;%= title %&amp;gt;&amp;lt;/a&amp;gt;&amp;lt;/h2&amp;gt;
        &amp;lt;div class=&amp;quot;body&amp;quot;&amp;gt;&amp;lt;%= description %&amp;gt;&amp;lt;/div&amp;gt;
    &amp;lt;/div&amp;gt;    
  &amp;lt;/body&amp;gt;
  &amp;lt;script src=&amp;quot;/_utils/script/json2.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;
  &amp;lt;script src=&amp;quot;/_utils/script/jquery.js?1.2.6&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;
  &amp;lt;script src=&amp;quot;/_utils/script/jquery.couch.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;
  &amp;lt;script src=&amp;quot;&amp;lt;%= assets %&amp;gt;/vendor/couchapp/jquery.couchapp.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;/html&amp;gt;
&lt;/pre&gt;


&lt;p&gt;Faites un push de votre application et rendez-vous ensuite sur &lt;a href=&quot;http://localhost:5984/myfav/_design/mycouchfav/_show/fav/couchdbkit&quot;&gt;http://localhost:5984/myfav/_design/mycouchfav/_show/fav/couchdbkit&lt;/a&gt; pour apprécier le résultat.&lt;/p&gt;


&lt;h3&gt;Mieux comprendre &amp;quot;!json&amp;quot; et &amp;quot;!code&amp;quot;&lt;/h3&gt;


&lt;p&gt;Grosso modo, &lt;code&gt;!code&lt;/code&gt; et &lt;code&gt;!json&lt;/code&gt; ont la même objectif : insérer des données dans votre vue. La différence tient dans le fait que &lt;code&gt;!code&lt;/code&gt; injecte du code alors que &lt;code&gt;!json&lt;/code&gt; injecte des données ou des fichiers (en utilisant par ex &lt;code&gt;!json _attachments/file.ext&lt;/code&gt;).&lt;/p&gt;


&lt;p&gt;De même, attention lors de vos inclusions : dans le cas d'une arboresence, si vous appelez un élément de premier niveau, alors tous ses sous-niveaux seront inclus. L'écriture suivante est donc redondante :&lt;/p&gt;

&lt;pre class=&quot;javascript&quot;&gt;&lt;span style=&quot;color: #003366; font-weight: bold;&quot;&gt;function&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;doc&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt; &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#123;&lt;/span&gt;
  &lt;span style=&quot;color: #009900; font-style: italic;&quot;&gt;// !json lib&lt;/span&gt;
  &lt;span style=&quot;color: #009900; font-style: italic;&quot;&gt;// !json lib.templates.post&lt;/span&gt;
&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#125;&lt;/span&gt;&lt;/pre&gt;


&lt;p&gt;Pour plus d'info, voir la fin de &lt;a href=&quot;http://github.com/couchapp/couchapp/tree/master&quot; hreflang=&quot;en&quot;&gt;cette page&lt;/a&gt;.&lt;/p&gt;


&lt;p&gt;Voilà pour aujourd'hui, suite au prochain épisode...&lt;/p&gt;</description>
    
    
    
      </item>
    
  <item>
    <title>Couchapp : créer votre première application CouchDB (Partie 2)</title>
    <link>http://nicolas.steinmetz.fr/journal/post/2009/07/03/Couchapp-%3A-cr%C3%A9er-votre-premi%C3%A8re-application-CouchDB-%28Partie-2%29</link>
    <guid isPermaLink="false">urn:md5:c4d39b5c8211f6d83b2ad4c98f59bc4e</guid>
    <pubDate>Fri, 03 Jul 2009 00:04:00 +0200</pubDate>
    <dc:creator>Nicolas Steinmetz</dc:creator>
        <category>CouchDB</category>
        <category>couchapp</category><category>couchdb</category><category>python</category>    
    <description>    &lt;p&gt;La dernière fois, je vous ai laissé avec pas grand chose, à savoir &lt;a href=&quot;http://nicolas.steinmetz.fr/journal/post/2009/06/27/Couchapp-%3A-cr%C3%A9er-votre-premi%C3%A8re-application-CouchDB-%28Partie-1%29&quot;&gt;couchapp installé et une squelette d'application&lt;/a&gt;.&lt;/p&gt;


&lt;p&gt;Aujourd'hui, nous allons être nettement plus ambitieux en prenant comme prétexte une application de gestion de favoris (à la delicious, en mode mono-utilisateur). Nous allons aborder le rendu d'un document en tant que tel (aka &amp;quot;show&amp;quot;) et les listes de documents (aka &amp;quot;list&amp;quot;).&lt;/p&gt;


&lt;h3&gt;Avant toute chose... couchapp !&lt;/h3&gt;


&lt;p&gt;Générons notre petite application :&lt;/p&gt;

&lt;pre class=&quot;bash&quot;&gt;couchapp-cloned	mycouchapp
tetram:CouchDB nicolas$ couchapp generate mycouchfav
&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#91;&lt;/span&gt;INFO&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#93;&lt;/span&gt; Generating a new CouchApp &lt;span style=&quot;color: #b1b100;&quot;&gt;in&lt;/span&gt; /Users/nicolas/Documents/Projets/CouchDB/mycouchfav&lt;/pre&gt;


&lt;p&gt;Et poussons notre application dans notre instance CouchDB (que vous avez démarré par ailleurs) :&lt;/p&gt;

&lt;pre class=&quot;bash&quot;&gt;tetram:CouchDB nicolas$ &lt;span style=&quot;color: #000066;&quot;&gt;cd&lt;/span&gt; mycouchfav/
tetram:mycouchfav nicolas$ couchapp push myfav
&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#91;&lt;/span&gt;INFO&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#93;&lt;/span&gt; Pushing CouchApp &lt;span style=&quot;color: #b1b100;&quot;&gt;in&lt;/span&gt; /Users/nicolas/Documents/Projets/CouchDB/mycouchfav to design doc:
http://&lt;span style=&quot;color: #cc66cc;&quot;&gt;127.0&lt;/span&gt;&lt;span style=&quot;color: #cc66cc;&quot;&gt;.0&lt;/span&gt;&lt;span style=&quot;color: #cc66cc;&quot;&gt;.1&lt;/span&gt;:&lt;span style=&quot;color: #cc66cc;&quot;&gt;5984&lt;/span&gt;/myfav/_design/mycouchfav
&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#91;&lt;/span&gt;INFO&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#93;&lt;/span&gt; Visit your CouchApp here:
http://&lt;span style=&quot;color: #cc66cc;&quot;&gt;127.0&lt;/span&gt;&lt;span style=&quot;color: #cc66cc;&quot;&gt;.0&lt;/span&gt;&lt;span style=&quot;color: #cc66cc;&quot;&gt;.1&lt;/span&gt;:&lt;span style=&quot;color: #cc66cc;&quot;&gt;5984&lt;/span&gt;/myfav/_design/mycouchfav/index.html&lt;/pre&gt;


&lt;h3&gt;Vinrent ensuite les documents&lt;/h3&gt;


&lt;p&gt;Commençons par nous créer trois favoris depuis Futon ( &lt;a href=&quot;http://localhost:5984/_utils/&quot;&gt;http://localhost:5984/_utils/&lt;/a&gt;) avec la structure suivante :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;title&lt;/li&gt;
&lt;li&gt;url&lt;/li&gt;
&lt;li&gt;description&lt;/li&gt;
&lt;li&gt;tag&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ci-après mon jeu d'exemple au format json :&lt;/p&gt;

&lt;pre class=&quot;javascript&quot;&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#123;&lt;/span&gt;
   &lt;span style=&quot;color: #3366CC;&quot;&gt;&amp;quot;_id&amp;quot;&lt;/span&gt;: &lt;span style=&quot;color: #3366CC;&quot;&gt;&amp;quot;couchdb&amp;quot;&lt;/span&gt;,
   &lt;span style=&quot;color: #3366CC;&quot;&gt;&amp;quot;title&amp;quot;&lt;/span&gt;: &lt;span style=&quot;color: #3366CC;&quot;&gt;&amp;quot;CouchDB Official site&amp;quot;&lt;/span&gt;,
   &lt;span style=&quot;color: #3366CC;&quot;&gt;&amp;quot;url&amp;quot;&lt;/span&gt;: &lt;span style=&quot;color: #3366CC;&quot;&gt;&amp;quot;http://couchdb.apache.org/&amp;quot;&lt;/span&gt;,
   &lt;span style=&quot;color: #3366CC;&quot;&gt;&amp;quot;description&amp;quot;&lt;/span&gt;: &lt;span style=&quot;color: #3366CC;&quot;&gt;&amp;quot;Apache CouchDB is a distributed, fault-tolerant and schema-free document-oriented database accessible via a RESTful HTTP/JSON API&amp;quot;&lt;/span&gt;,
   &lt;span style=&quot;color: #3366CC;&quot;&gt;&amp;quot;tag&amp;quot;&lt;/span&gt;: &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#91;&lt;/span&gt;
       &lt;span style=&quot;color: #3366CC;&quot;&gt;&amp;quot;couchdb&amp;quot;&lt;/span&gt;,
       &lt;span style=&quot;color: #3366CC;&quot;&gt;&amp;quot;database&amp;quot;&lt;/span&gt;,
       &lt;span style=&quot;color: #3366CC;&quot;&gt;&amp;quot;document&amp;quot;&lt;/span&gt;
   &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#93;&lt;/span&gt;
&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#125;&lt;/span&gt;
&amp;nbsp;
&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#123;&lt;/span&gt;
   &lt;span style=&quot;color: #3366CC;&quot;&gt;&amp;quot;_id&amp;quot;&lt;/span&gt;: &lt;span style=&quot;color: #3366CC;&quot;&gt;&amp;quot;couchdbkit&amp;quot;&lt;/span&gt;,
   &lt;span style=&quot;color: #3366CC;&quot;&gt;&amp;quot;title&amp;quot;&lt;/span&gt;: &lt;span style=&quot;color: #3366CC;&quot;&gt;&amp;quot;Couchdbkit&amp;quot;&lt;/span&gt;,
   &lt;span style=&quot;color: #3366CC;&quot;&gt;&amp;quot;description&amp;quot;&lt;/span&gt;: &lt;span style=&quot;color: #3366CC;&quot;&gt;&amp;quot;Couchdbkit goal is to provide a framework for your Python application to access and manage Couchdb.&amp;quot;&lt;/span&gt;,
   &lt;span style=&quot;color: #3366CC;&quot;&gt;&amp;quot;url&amp;quot;&lt;/span&gt;: &lt;span style=&quot;color: #3366CC;&quot;&gt;&amp;quot;http://www.couchdbkit.org/&amp;quot;&lt;/span&gt;,
   &lt;span style=&quot;color: #3366CC;&quot;&gt;&amp;quot;tag&amp;quot;&lt;/span&gt;: &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#91;&lt;/span&gt;
       &lt;span style=&quot;color: #3366CC;&quot;&gt;&amp;quot;couchdb&amp;quot;&lt;/span&gt;,
       &lt;span style=&quot;color: #3366CC;&quot;&gt;&amp;quot;python&amp;quot;&lt;/span&gt;,
       &lt;span style=&quot;color: #3366CC;&quot;&gt;&amp;quot;framework&amp;quot;&lt;/span&gt;
   &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#93;&lt;/span&gt;
&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#125;&lt;/span&gt;
&amp;nbsp;
&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#123;&lt;/span&gt;
   &lt;span style=&quot;color: #3366CC;&quot;&gt;&amp;quot;_id&amp;quot;&lt;/span&gt;: &lt;span style=&quot;color: #3366CC;&quot;&gt;&amp;quot;couchapp&amp;quot;&lt;/span&gt;,
   &lt;span style=&quot;color: #3366CC;&quot;&gt;&amp;quot;title&amp;quot;&lt;/span&gt;: &lt;span style=&quot;color: #3366CC;&quot;&gt;&amp;quot;couchapp&amp;quot;&lt;/span&gt;,
   &lt;span style=&quot;color: #3366CC;&quot;&gt;&amp;quot;description&amp;quot;&lt;/span&gt;: &lt;span style=&quot;color: #3366CC;&quot;&gt;&amp;quot;Utilities to make standalone CouchDB application development simple&amp;quot;&lt;/span&gt;,
   &lt;span style=&quot;color: #3366CC;&quot;&gt;&amp;quot;url&amp;quot;&lt;/span&gt;: &lt;span style=&quot;color: #3366CC;&quot;&gt;&amp;quot;http://github.com/couchapp/couchapp/tree/master&amp;quot;&lt;/span&gt;,
   &lt;span style=&quot;color: #3366CC;&quot;&gt;&amp;quot;tag&amp;quot;&lt;/span&gt;: &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#91;&lt;/span&gt;
       &lt;span style=&quot;color: #3366CC;&quot;&gt;&amp;quot;couchdb&amp;quot;&lt;/span&gt;,
       &lt;span style=&quot;color: #3366CC;&quot;&gt;&amp;quot;python&amp;quot;&lt;/span&gt;,
       &lt;span style=&quot;color: #3366CC;&quot;&gt;&amp;quot;ruby&amp;quot;&lt;/span&gt;
   &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#93;&lt;/span&gt;
&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#125;&lt;/span&gt;&lt;/pre&gt;


&lt;pre&gt;&lt;/pre&gt;

&lt;h3&gt;Tu me le montres ton document ?&lt;/h3&gt;


&lt;p&gt;L'url pour accéder à un document est du type :&lt;/p&gt;

&lt;pre&gt;
http://localhost:5984/&amp;lt;nom_de_la_db&amp;gt;/_design/&amp;lt;nom_du_design&amp;gt;/_show/&amp;lt;nom_du_show&amp;gt;/&amp;lt;id_du_document&amp;gt;
&lt;/pre&gt;


&lt;p&gt;Dans notre cas, par ex : http://localhost:5984/&lt;strong&gt;myfav&lt;/strong&gt;/_design/&lt;strong&gt;mycouchfav&lt;/strong&gt;/_show/&lt;strong&gt;fav&lt;/strong&gt;/&lt;strong&gt;couchdbkit&lt;/strong&gt; (si je prends le favori ayant pour id &amp;quot;couchdbkit&amp;quot;.&lt;/p&gt;


&lt;p&gt;Vous venez de déduire que mon &amp;quot;show&amp;quot; se nomme &amp;quot;fav&amp;quot;. Plus exactement, il s'agit du fichier show/fav.js avec le contenu suivant :&lt;/p&gt;

&lt;pre class=&quot;javascript&quot;&gt;&lt;span style=&quot;color: #003366; font-weight: bold;&quot;&gt;function&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;doc, req&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt; &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#123;&lt;/span&gt;  
    &lt;span style=&quot;color: #009900; font-style: italic;&quot;&gt;// !json templates.fav&lt;/span&gt;
    &lt;span style=&quot;color: #009900; font-style: italic;&quot;&gt;// !code vendor/couchapp/template.js&lt;/span&gt;
    &lt;span style=&quot;color: #009900; font-style: italic;&quot;&gt;// !code vendor/couchapp/path.js&lt;/span&gt;
&amp;nbsp;
    &lt;span style=&quot;color: #000066; font-weight: bold;&quot;&gt;return&lt;/span&gt; template&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;templates.&lt;span style=&quot;color: #006600;&quot;&gt;fav&lt;/span&gt;, &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#123;&lt;/span&gt;
        title : doc.&lt;span style=&quot;color: #006600;&quot;&gt;title&lt;/span&gt;,
        url : doc.&lt;span style=&quot;color: #006600;&quot;&gt;url&lt;/span&gt;,
        description : doc.&lt;span style=&quot;color: #006600;&quot;&gt;description&lt;/span&gt;,
        assets : assetPath&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;,
       &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#125;&lt;/span&gt;
    &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;;
&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#125;&lt;/span&gt;&lt;/pre&gt;


&lt;p&gt;Expliquons ce qu'il contient :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Pour un show, la fonction js prend 2 arguments : doc et req ; ce dernier content la requête et va trouver le document associée à cette requête.&lt;/li&gt;
&lt;li&gt;On initialise une variable json, qui est utilisée ensuite pour appelé le template templates/fav.html&lt;/li&gt;
&lt;li&gt;On inclut ensuite 2 fichiers js fournis par couchapp&lt;/li&gt;
&lt;li&gt;Le return indique que l'on va charger le fichier templates/fav.html avec 4 variables qui sont le titre (title), l'url, la description du favori, ainsi qu'une variable assets qui permet de renseigner un chemin vers différents fichiers (css, js, etc).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Il nous resque plus qu'à construire le fichier templates/fav.html :&lt;/p&gt;

&lt;pre&gt;
&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html&amp;gt;
    &amp;lt;head&amp;gt; 
        &amp;lt;title&amp;gt;&amp;lt;%= title %&amp;gt;&amp;lt;/title&amp;gt;
    &amp;lt;/head&amp;gt;
    &amp;lt;body&amp;gt;
    &amp;lt;div id=&amp;quot;header&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
    &amp;lt;div id=&amp;quot;content&amp;quot;&amp;gt;
        &amp;lt;h1&amp;gt;&amp;lt;a href=&amp;quot;&amp;lt;%= url %&amp;gt;&amp;quot;&amp;gt;&amp;lt;%= title %&amp;gt;&amp;lt;/a&amp;gt;&amp;lt;/h1&amp;gt;
        &amp;lt;div class=&amp;quot;body&amp;quot;&amp;gt;&amp;lt;%= description %&amp;gt;&amp;lt;/div&amp;gt;
    &amp;lt;/div&amp;gt;    
&amp;lt;/body&amp;gt;
&amp;lt;script src=&amp;quot;/_utils/script/json2.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script src=&amp;quot;/_utils/script/jquery.js?1.2.6&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script src=&amp;quot;/_utils/script/jquery.couch.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script src=&amp;quot;&amp;lt;%= assets %&amp;gt;/vendor/couchapp/jquery.couchapp.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;/html&amp;gt;
&lt;/pre&gt;


&lt;p&gt;Il ne nous reste plus qu'à .... et non pas visualiser votre page mais au préalable pousser vos fichiers dans votre instance CouchDB :&lt;/p&gt;

&lt;pre class=&quot;bash&quot;&gt;tetram:mycouchfav nicolas$ couchapp push myfav
&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#91;&lt;/span&gt;INFO&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#93;&lt;/span&gt; Pushing CouchApp &lt;span style=&quot;color: #b1b100;&quot;&gt;in&lt;/span&gt; /Users/nicolas/Documents/Projets/CouchDB/mycouchfav to design doc:
http://&lt;span style=&quot;color: #cc66cc;&quot;&gt;127.0&lt;/span&gt;&lt;span style=&quot;color: #cc66cc;&quot;&gt;.0&lt;/span&gt;&lt;span style=&quot;color: #cc66cc;&quot;&gt;.1&lt;/span&gt;:&lt;span style=&quot;color: #cc66cc;&quot;&gt;5984&lt;/span&gt;/myfav/_design/mycouchfav
&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#91;&lt;/span&gt;INFO&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#93;&lt;/span&gt; Visit your CouchApp here:
http://&lt;span style=&quot;color: #cc66cc;&quot;&gt;127.0&lt;/span&gt;&lt;span style=&quot;color: #cc66cc;&quot;&gt;.0&lt;/span&gt;&lt;span style=&quot;color: #cc66cc;&quot;&gt;.1&lt;/span&gt;:&lt;span style=&quot;color: #cc66cc;&quot;&gt;5984&lt;/span&gt;/myfav/_design/mycouchfav/index.html&lt;/pre&gt;


&lt;p&gt;Maintenant, ouvrez votre navigateur sur l'url &lt;a href=&quot;http://localhost:5984/myfav/_design/mycouchfav/_show/fav/couchdbkit&quot;&gt;http://localhost:5984/myfav/_design/mycouchfav/_show/fav/couchdbkit&lt;/a&gt; et vous retrouvez le contenu très sommairement présenté de votre favori avec son titre, son url et sa description.&lt;/p&gt;


&lt;p&gt;En conclusion, pour afficher un document, il nous faut :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Un template (ici : templates/fav.html)&lt;/li&gt;
&lt;li&gt;Une fonction en javascript qui nous permet de manipuler les attributs du documents en vue de leur rendu. La fonction est de type function(doc,req). La fonction est située dans un fichier shows/nom_du_show.js (ici shows/fav.js)&lt;/li&gt;
&lt;li&gt;Ne pas oublier de faire un &amp;quot;couchapp push&amp;quot; pour envoyer vos fichiers dans votre instance CouchDB&lt;/li&gt;
&lt;li&gt;Une url du type : http://localhost:5984/&amp;lt;nom_de_la_db&amp;gt;/_design/&amp;lt;nom_du_design&amp;gt;/_show/&amp;lt;nom_du_show&amp;gt;/&amp;lt;id_du_document&amp;gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;Et ta liste, tu me la montres aussi ?&lt;/h3&gt;


&lt;p&gt;Pour les listes, c'est un peu plus complexe mais pas insurmontable &lt;img src=&quot;/journal/themes/default/smilies/smile.png&quot; alt=&quot;:-)&quot; class=&quot;smiley&quot; /&gt;&lt;/p&gt;


&lt;p&gt;L'url est du type :&lt;/p&gt;

&lt;pre&gt;
http://localhost:5984/&amp;lt;nom_de_la_db&amp;gt;/_design/&amp;lt;nom_du_design&amp;gt;/_list/&amp;lt;nom_de_la_liste&amp;gt;/&amp;lt;nom_de_la_vue&amp;gt;?&amp;lt;paramètres&amp;gt;
&lt;/pre&gt;


&lt;p&gt;Supposons que je veuille créer la page d'accueil de mon application, celle-ci listant tous les favoris stockés. Le nom de la liste pourrait donc tout naturellement s'appeller &amp;quot;all&amp;quot; et le nom de la vue &amp;quot;favs&amp;quot;. On pourrait imaginer avoir une liste &amp;quot;search&amp;quot; par ex pour afficher les résultats d'une recherche sur les favoris avec des paramètres de recherche.&lt;/p&gt;


&lt;p&gt;Il faut donc bien avoir en tête qu'une liste est un moyen d'afficher une vue. Une même vue peut donc partager plusieurs listes.&lt;/p&gt;


&lt;p&gt;Ex :&lt;/p&gt;

&lt;pre&gt;
http://localhost:5984/myfav/_design/mycouchfav/_list/all/favs
http://localhost:5984/myfav/_design/mycouchfav/_list/search/favs?limit=25&amp;amp;key=%22python%22
&lt;/pre&gt;


&lt;p&gt;Commençons donc par créer notre vue, avec le fichier views/favs/map.js&lt;/p&gt;

&lt;pre class=&quot;javascript&quot;&gt;&lt;span style=&quot;color: #003366; font-weight: bold;&quot;&gt;function&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;doc&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt; &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#123;&lt;/span&gt;
    emit&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;doc._id, &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#123;&lt;/span&gt;title: doc.&lt;span style=&quot;color: #006600;&quot;&gt;title&lt;/span&gt;, description: doc.&lt;span style=&quot;color: #006600;&quot;&gt;description&lt;/span&gt;, url:doc.&lt;span style=&quot;color: #006600;&quot;&gt;url&lt;/span&gt; &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#125;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;   
&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#125;&lt;/span&gt;;&lt;/pre&gt;


&lt;p&gt;Cette fonction me renvoi tous les documents de mon instance, trié par &amp;quot;_id&amp;quot; et avec une série de variables (title, description, url - je ne les réexplique pas, ce sont les mêmes que précédemment).&lt;/p&gt;


&lt;p&gt;Passons à notre liste : lists/all.js&lt;/p&gt;


&lt;p&gt;&lt;strong&gt;Note :&lt;/strong&gt;  Pour ceux qui son en CouchDB &amp;gt;= 0.10.x, le code est à récupérer dans &lt;a href=&quot;http://nicolas.steinmetz.fr/journal/post/2010/01/06/Cr%C3%A9er-votre-premi%C3%A8re-application-CouchDB-%28Partie-4%29&quot;&gt;ce billet&lt;/a&gt;. Le code ci-dessous est valable pour CouchDB 0.9.x&lt;/p&gt;

&lt;pre class=&quot;javascript&quot;&gt;&lt;span style=&quot;color: #003366; font-weight: bold;&quot;&gt;function&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;head, row, req, info&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt; &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#123;&lt;/span&gt;
  &lt;span style=&quot;color: #009900; font-style: italic;&quot;&gt;// !json templates.all&lt;/span&gt;
  &lt;span style=&quot;color: #009900; font-style: italic;&quot;&gt;// !code vendor/couchapp/path.js&lt;/span&gt;
  &lt;span style=&quot;color: #009900; font-style: italic;&quot;&gt;// !code vendor/couchapp/template.js&lt;/span&gt;
&amp;nbsp;
  &lt;span style=&quot;color: #000066; font-weight: bold;&quot;&gt;return&lt;/span&gt; respondWith&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;req, &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#123;&lt;/span&gt;
    html : &lt;span style=&quot;color: #003366; font-weight: bold;&quot;&gt;function&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt; &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#123;&lt;/span&gt;
      &lt;span style=&quot;color: #000066; font-weight: bold;&quot;&gt;if&lt;/span&gt; &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;head&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt; &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#123;&lt;/span&gt;
        &lt;span style=&quot;color: #000066; font-weight: bold;&quot;&gt;return&lt;/span&gt; template&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;templates.&lt;span style=&quot;color: #006600;&quot;&gt;all&lt;/span&gt;.&lt;span style=&quot;color: #006600;&quot;&gt;head&lt;/span&gt;, &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#123;&lt;/span&gt;
          assets : assetPath&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;,
        &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#125;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;;
      &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#125;&lt;/span&gt; &lt;span style=&quot;color: #000066; font-weight: bold;&quot;&gt;else&lt;/span&gt; &lt;span style=&quot;color: #000066; font-weight: bold;&quot;&gt;if&lt;/span&gt; &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;row&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt; &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#123;&lt;/span&gt;
        &lt;span style=&quot;color: #000066; font-weight: bold;&quot;&gt;return&lt;/span&gt; template&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;templates.&lt;span style=&quot;color: #006600;&quot;&gt;all&lt;/span&gt;.&lt;span style=&quot;color: #006600;&quot;&gt;row&lt;/span&gt;, &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#123;&lt;/span&gt;
          fav: row.&lt;span style=&quot;color: #006600;&quot;&gt;value&lt;/span&gt;,
        &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#125;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;;
      &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#125;&lt;/span&gt; &lt;span style=&quot;color: #000066; font-weight: bold;&quot;&gt;else&lt;/span&gt; &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#123;&lt;/span&gt;
        &lt;span style=&quot;color: #000066; font-weight: bold;&quot;&gt;return&lt;/span&gt; template&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;templates.&lt;span style=&quot;color: #006600;&quot;&gt;all&lt;/span&gt;.&lt;span style=&quot;color: #006600;&quot;&gt;tail&lt;/span&gt;, &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#123;&lt;/span&gt;
            assets : assetPath&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;,
        &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#125;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;;
      &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#125;&lt;/span&gt;
    &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#125;&lt;/span&gt;,
  &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#125;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;
&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#125;&lt;/span&gt;;&lt;/pre&gt;


&lt;p&gt;La nouveauté ici tient dans la fonction qui prend différents paramètres en compte (contenus honteusement récupérés de benoitc &amp;quot;&lt;a href=&quot;http://benoitc.im/b/_design/blog/_show/post/20090223_lego-2-les-listes&quot; hreflang=&quot;fr&quot;&gt;Légo 2 : les listes&lt;/a&gt;&amp;quot;):&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;head: est renseigné lorsque couchdb envoie la tête de la vue. head est un objet contenant les paramètres &amp;quot;total-rows&amp;quot; et &amp;quot;offset&amp;quot; correspondant au résultat de la vue. Cela nous permet, par exemple comme dans l'exemple ci-dessus, afficher l'entête d'une page html en chargeant un template particulier.&lt;/li&gt;
&lt;li&gt;row : la ligne de la vue actuellement envoyée par CouchDB.&lt;/li&gt;
&lt;li&gt;req : un objet contenant les paramètres de la requête&lt;/li&gt;
&lt;li&gt;row_info : un objet contenant les infos sur la ligne en cours, sa position, quel était la ligne précendente, quelle est la première ligne de la vue.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;L'autre nouveauté tient dans la gestion des templates HTML :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Pour head, on va charger templates/all/head.html&lt;/li&gt;
&lt;li&gt;Pour chaque ligne de résultat, on va charger templates/all/row.html&lt;/li&gt;
&lt;li&gt;Une fois que les résultats de la requête sont épuisés, on va charger templates/all/tail.html (qui fait donc office de voiture-balai).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Contenu de templates/all/head.html :&lt;/p&gt;

&lt;pre&gt;
&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html&amp;gt;
  &amp;lt;head&amp;gt;
    &amp;lt;title&amp;gt;My favs&amp;lt;/title&amp;gt;
    &amp;lt;link rel=&amp;quot;stylesheet&amp;quot; href=&amp;quot;../../screen.css&amp;quot; type=&amp;quot;text/css&amp;quot;/&amp;gt;
  &amp;lt;/head&amp;gt;
  &amp;lt;body&amp;gt;
    &amp;lt;div id=&amp;quot;header&amp;quot;&amp;gt;
      &amp;lt;h2&amp;gt;My favs...&amp;lt;/h2&amp;gt;
    &amp;lt;/div&amp;gt;
    &amp;lt;div id=&amp;quot;content&amp;quot;&amp;gt;
      &amp;lt;h1&amp;gt;Recently...&amp;lt;/h1&amp;gt;
      &amp;lt;dl id=&amp;quot;bookmarks&amp;quot;&amp;gt;
&lt;/pre&gt;


&lt;p&gt;Contenu de templates/all/row.html :&lt;/p&gt;

&lt;pre&gt;
  &amp;lt;dt&amp;gt;&amp;lt;a href=&amp;quot;&amp;lt;%= fav.url %&amp;gt;&amp;quot;&amp;gt;&amp;lt;%= fav.title %&amp;gt;&amp;lt;/a&amp;gt;&amp;lt;/dt&amp;gt;
  &amp;lt;dd&amp;gt;&amp;lt;%= fav.description %&amp;gt;&amp;lt;/dd&amp;gt;
&lt;/pre&gt;


&lt;p&gt;Contenu de templates/all/tail.html :&lt;/p&gt;

&lt;pre&gt;
    &amp;lt;/dl&amp;gt;
  &amp;lt;/div&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;script src=&amp;quot;/_utils/script/json2.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script src=&amp;quot;/_utils/script/jquery.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script src=&amp;quot;/_utils/script/jquery.couch.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script src=&amp;quot;&amp;lt;%= assets %&amp;gt;/vendor/couchapp/jquery.couchapp.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;/html&amp;gt;
&lt;/pre&gt;


&lt;p&gt;Il ne vous reste plus qu'à pousser vos modifications dans votre instane CouchDB (ici en mode verbeux pour bien voir ce qui est poussé) :&lt;/p&gt;

&lt;pre&gt;
tetram:mycouchfav nicolas$ couchapp push -v myfav
[INFO] push lists/all.js
[INFO] push shows/fav.js
[INFO] push templates/all/head.html
[INFO] push templates/all/row.html
[INFO] push templates/all/tail.html
[INFO] push templates/fav.html
[INFO] push vendor/couchapp/_attachments/jquery.couchapp.js
[INFO] push vendor/couchapp/couchapp.js
[INFO] push vendor/couchapp/date.js
[INFO] push vendor/couchapp/path.js
[INFO] push vendor/couchapp/README.md
[INFO] push vendor/couchapp/template.js
[INFO] push views/favs/map.js
[INFO] process code macro: /Users/nicolas/Documents/Projets/CouchDB/mycouchfav/vendor/couchapp/template.js
[INFO] process code macro: /Users/nicolas/Documents/Projets/CouchDB/mycouchfav/vendor/couchapp/path.js
[INFO] process code macro: /Users/nicolas/Documents/Projets/CouchDB/mycouchfav/vendor/couchapp/path.js
[INFO] process code macro: /Users/nicolas/Documents/Projets/CouchDB/mycouchfav/vendor/couchapp/template.js
[INFO] Pushing CouchApp in /Users/nicolas/Documents/Projets/CouchDB/mycouchfav to design doc:
http://127.0.0.1:5984/myfav/_design/mycouchfav
[INFO] Visit your CouchApp here:
http://127.0.0.1:5984/myfav/_design/mycouchfav/index.html
&lt;/pre&gt;


&lt;p&gt;Rendez vous ensuite sur : &lt;a href=&quot;http://localhost:5984/myfav/_design/mycouchfav/_list/all/favs&quot;&gt;http://localhost:5984/myfav/_design/mycouchfav/_list/all/favs&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;Au bout du compte, nous venons de voir pour les listes :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Les listes comme moyen d'afficher une vue,&lt;/li&gt;
&lt;li&gt;Cela se traduit par un fichier de vue (views/mon_de_ma_vue/map.js) et un fichier liste (lists/&amp;lt;nom_de_ma_liste&amp;gt;.js)&lt;/li&gt;
&lt;li&gt;La liste est une fonction de type function(head, row, req, info)&lt;/li&gt;
&lt;li&gt;On peut spliter les templates en head.html / row.html / tail.html&lt;/li&gt;
&lt;li&gt;url de type :  http://localhost:5984/&amp;lt;nom_de_la_db&amp;gt;/_design/&amp;lt;nom_du_design&amp;gt;/_list/&amp;lt;nom_de_la_liste&amp;gt;/&amp;lt;nom_de_la_vue&amp;gt;?&amp;lt;paramètres&amp;gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;Au bout de cette &amp;quot;journée&amp;quot;&lt;/h3&gt;


&lt;p&gt;Nous avons vu aux termes des parties 1 et 2 :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Comment installer couchapp et générer le squelette d'une application Couchdb&lt;/li&gt;
&lt;li&gt;Jouer un peu avec Futon pour créer des enregistrements dans CouchDB (même si je ne le couvre pas directement, voir pas du tout en fait)&lt;/li&gt;
&lt;li&gt;Comment afficher des documents sous forme de &amp;quot;list/views&amp;quot; pour une collection de documents et de &amp;quot;show&amp;quot; pour un document de façon unitaire&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Il reste encore plein de choses à voir (au moins à mon niveau) :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Voir comment on peut remplacer le &amp;quot;My favs ... &amp;quot; dans head.html par une variable extérieure au template (facile - déjà fait mais cela rajoutait une grande quantité d&amp;quot;infos à ce post déjà très long je pense...)&lt;/li&gt;
&lt;li&gt;Mieux comprendre les &amp;quot;!json&amp;quot; et &amp;quot;!code&amp;quot;&lt;/li&gt;
&lt;li&gt;Les options de tri&lt;/li&gt;
&lt;li&gt;&amp;lt;insérer votre sujet ici via un commentaire&amp;gt;&lt;/li&gt;
&lt;li&gt;...&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;Sources utiles&lt;/h3&gt;


&lt;p&gt;Les lectures indispensables pour faire ce tutoriel :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;benoitc : &amp;quot;&lt;a href=&quot;http://benoitc.im/b/_design/blog/_show/post/20090223_lego-2-les-listes&quot; hreflang=&quot;fr&quot;&gt;Légo 2 : les listes&lt;/a&gt;&amp;quot;&lt;/li&gt;
&lt;li&gt;benoitc : &amp;quot;&lt;a href=&quot;http://benoitc.im/b/_design/blog/_show/post/20090302_legos-3-tu-vu-comme-mon-doc-rend-bien&quot; hreflang=&quot;fr&quot;&gt;Légo 3 : Tu as vu comme mon doc rend bien ?&lt;/a&gt;&amp;quot;&lt;/li&gt;
&lt;li&gt;CouchDB Wiki : &amp;quot;&lt;a href=&quot;http://wiki.apache.org/couchdb/Formatting_with_Show_and_List&quot; hreflang=&quot;en&quot;&gt;Formatting with Show and List&lt;/a&gt;&amp;quot;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Au passage, les &lt;a href=&quot;http://benoitc.im/b/_design/blog/_show/post/20090629_mise-jour-benoitcim-nouveautes-couchdb-couchapp&quot; hreflang=&quot;fr&quot;&gt;nouveautés de CouchDB / Couchapp&lt;/a&gt; mentionnées pat Benoit sont des plus intéressantes (surtout pour les listes, plus souple/flexible a priori).&lt;/p&gt;


&lt;p&gt;Merci à benoitc pour éclairer ma lanterne sur couchdb/couchapp ces derniers jours &lt;img src=&quot;/journal/themes/default/smilies/smile.png&quot; alt=&quot;:-)&quot; class=&quot;smiley&quot; /&gt;&lt;/p&gt;</description>
    
    
    
      </item>
    
  <item>
    <title>Couchapp : créer votre première application CouchDB (Partie 1)</title>
    <link>http://nicolas.steinmetz.fr/journal/post/2009/06/27/Couchapp-%3A-cr%C3%A9er-votre-premi%C3%A8re-application-CouchDB-%28Partie-1%29</link>
    <guid isPermaLink="false">urn:md5:feb5caccf152a59f7cfafdecf8ca163f</guid>
    <pubDate>Sat, 27 Jun 2009 16:19:00 +0200</pubDate>
    <dc:creator>Nicolas Steinmetz</dc:creator>
        <category>CouchDB</category>
        <category>couchapp</category><category>couchdb</category><category>python</category>    
    <description>    &lt;p&gt;Je continue ma découverte de CouchDB avec &lt;a href=&quot;http://github.com/couchapp/couchapp/tree/master&quot; hreflang=&quot;en&quot;&gt;Couchapp&lt;/a&gt;, logiciel qui se définit comme un ensemble d'outils pour simplifier le développement d'une application avec CouchDB.&lt;/p&gt;


&lt;p&gt;Ce billet chercher à compléter / mettre à jour le billet de Benoit Chesneau : &amp;quot;&lt;a href=&quot;http://benoitc.org/b/_design/blog/_show/post/20090219_et-les-legos-blancs-semboiterent&quot; hreflang=&quot;fr&quot;&gt;Et les légos s'emboitèrent&lt;/a&gt;&amp;quot; que je vous conseille de lire par ailleurs.&lt;/p&gt;


&lt;h3&gt;Installation de Couchapp&lt;/h3&gt;

&lt;pre class=&quot;bash&quot;&gt;tetram:CouchDB nicolas$ sudo easy_install couchapp&lt;/pre&gt;


&lt;p&gt;Cela vous installe couchapp 0.3.2 à ce jour.&lt;/p&gt;


&lt;h3&gt;Génération du squelette de votre application&lt;/h3&gt;

&lt;pre class=&quot;bash&quot;&gt;tetram:CouchDB nicolas$ couchapp generate mycouchapp
&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#91;&lt;/span&gt;INFO&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#93;&lt;/span&gt; Generating a new CouchApp &lt;span style=&quot;color: #b1b100;&quot;&gt;in&lt;/span&gt; /Users/nicolas/Documents/Projets/CouchDB/mycouchapp&lt;/pre&gt;


&lt;p&gt;Le contenu est le suivant :&lt;/p&gt;

&lt;pre class=&quot;bash&quot;&gt;tetram:CouchDB nicolas$ ls mycouchapp/
_attachments	lists		vendor
lib		shows		views&lt;/pre&gt;


&lt;p&gt;Pour pousser votre application dans votre instance CouchDB dans une base &amp;quot;monapp&amp;quot; :&lt;/p&gt;

&lt;pre class=&quot;bash&quot;&gt;tetram:CouchDB nicolas$ &lt;span style=&quot;color: #000066;&quot;&gt;cd&lt;/span&gt; mycouchapp/
tetram:mycouchapp nicolas$ couchapp push monapp -v
&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#91;&lt;/span&gt;INFO&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#93;&lt;/span&gt; push vendor/couchapp/_attachments/jquery.couchapp.js
&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#91;&lt;/span&gt;INFO&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#93;&lt;/span&gt; push vendor/couchapp/couchapp.js
&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#91;&lt;/span&gt;INFO&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#93;&lt;/span&gt; push vendor/couchapp/date.js
&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#91;&lt;/span&gt;INFO&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#93;&lt;/span&gt; push vendor/couchapp/path.js
&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#91;&lt;/span&gt;INFO&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#93;&lt;/span&gt; push vendor/couchapp/README.md
&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#91;&lt;/span&gt;INFO&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#93;&lt;/span&gt; push vendor/couchapp/template.js
&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#91;&lt;/span&gt;INFO&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#93;&lt;/span&gt; Pushing CouchApp &lt;span style=&quot;color: #b1b100;&quot;&gt;in&lt;/span&gt; /Users/nicolas/Documents/Projets/CouchDB/mycouchapp to design doc:
http://&lt;span style=&quot;color: #cc66cc;&quot;&gt;127.0&lt;/span&gt;&lt;span style=&quot;color: #cc66cc;&quot;&gt;.0&lt;/span&gt;&lt;span style=&quot;color: #cc66cc;&quot;&gt;.1&lt;/span&gt;:&lt;span style=&quot;color: #cc66cc;&quot;&gt;5984&lt;/span&gt;/monapp/_design/mycouchapp
&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#91;&lt;/span&gt;INFO&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#93;&lt;/span&gt; Visit your CouchApp here:
http://&lt;span style=&quot;color: #cc66cc;&quot;&gt;127.0&lt;/span&gt;&lt;span style=&quot;color: #cc66cc;&quot;&gt;.0&lt;/span&gt;&lt;span style=&quot;color: #cc66cc;&quot;&gt;.1&lt;/span&gt;:&lt;span style=&quot;color: #cc66cc;&quot;&gt;5984&lt;/span&gt;/monapp/_design/mycouchapp/index.html
&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#91;&lt;/span&gt;INFO&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#93;&lt;/span&gt; Attaching index.html &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #cc66cc;&quot;&gt;413&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;
&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#91;&lt;/span&gt;INFO&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#93;&lt;/span&gt; Attaching style/main.css &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #cc66cc;&quot;&gt;21&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;
&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#91;&lt;/span&gt;INFO&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#93;&lt;/span&gt; Attaching vendor/couchapp/jquery.couchapp.js &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #cc66cc;&quot;&gt;6984&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;/pre&gt;


&lt;p&gt;Si vous ouvrez votre navigateur sur &lt;a href=&quot;http://127.0.0.1:5984/monapp/_design/mycouchapp/index.html&quot;&gt;http://127.0.0.1:5984/monapp/_design/mycouchapp/index.html&lt;/a&gt;, vous voyez l'écran suivant :&lt;/p&gt;


&lt;p&gt;&lt;img src=&quot;http://nicolas.steinmetz.fr/journal/public/Couchapp-1.png&quot; alt=&quot;Couchapp-1.png&quot; style=&quot;display:block; margin:0 auto;&quot; title=&quot;Couchapp-1.png, juin 2009&quot; /&gt;&lt;/p&gt;


&lt;p&gt;A ce stade, 2 commandes ont été utilisées :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;generate : crée le squelette d'application&lt;/li&gt;
&lt;li&gt;push : envoie l'application dans couchdb&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Si vous voulez récupérer une application de couchdb, il faut utiliser la commande &amp;quot;clone&amp;quot;. Cela permet d'éditer votre application couchdb depuis votre disque dur et non plus depuis futon par ex. Au passage, vous ne pouvez pas cloner votre application dans le même répertoire que l'initial :&lt;/p&gt;

&lt;pre class=&quot;bash&quot;&gt;tetram:mycouchapp nicolas$ &lt;span style=&quot;color: #000066;&quot;&gt;cd&lt;/span&gt; ..
tetram:CouchDB nicolas$ couchapp clone http://&lt;span style=&quot;color: #cc66cc;&quot;&gt;127.0&lt;/span&gt;&lt;span style=&quot;color: #cc66cc;&quot;&gt;.0&lt;/span&gt;&lt;span style=&quot;color: #cc66cc;&quot;&gt;.1&lt;/span&gt;:&lt;span style=&quot;color: #cc66cc;&quot;&gt;5984&lt;/span&gt;/monapp/_design/mycouchapp
&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#91;&lt;/span&gt;CRITICAL&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#93;&lt;/span&gt; an app already exist here: mycouchapp&lt;/pre&gt;


&lt;p&gt;Il vous faut donc spécifier un chemin différent :&lt;/p&gt;

&lt;pre class=&quot;bash&quot;&gt;tetram:CouchDB nicolas$ couchapp clone http://&lt;span style=&quot;color: #cc66cc;&quot;&gt;127.0&lt;/span&gt;&lt;span style=&quot;color: #cc66cc;&quot;&gt;.0&lt;/span&gt;&lt;span style=&quot;color: #cc66cc;&quot;&gt;.1&lt;/span&gt;:&lt;span style=&quot;color: #cc66cc;&quot;&gt;5984&lt;/span&gt;/monapp/_design/mycouchapp mycouchapp-cloned
&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#91;&lt;/span&gt;INFO&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;#93;&lt;/span&gt; Cloning mycouchapp to mycouchapp-cloned...
tetram:CouchDB nicolas$ ls mycouchapp-cloned/
_attachments	lib		shows		views
couchapp.json	lists		vendor&lt;/pre&gt;


&lt;p&gt;A noter que la version clonée a un fichier couchapp.json en plus et donc je ne connais pas encore l'intérêt / l'utilité à ce stade.&lt;/p&gt;


&lt;p&gt;Si on revient un instant sur ces répertoires :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;_attachments contiendra les fichiers attachés à votre application&lt;/li&gt;
&lt;li&gt;views contient les vues&lt;/li&gt;
&lt;li&gt;lists contient les listes de vues ; utilisées par ex pour une page listant les 10 derniers documents par ex style page d'accueil d'un blog.&lt;/li&gt;
&lt;li&gt;shows contient les rendus d'un document ; la visualisation d'un article d'un blog par ex.&lt;/li&gt;
&lt;li&gt;lib contient les modèles et macros&lt;/li&gt;
&lt;li&gt;vendor contient des composants tiers fournis par couchapp pour le moment mais on peut imaginer je suppose d'autres briques tierces dans cet espace .&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Voilà pour un début, dès que je suis plus clair sur les listes / vues / rendus, vous aurez droit à un autre billet &lt;img src=&quot;/journal/themes/default/smilies/smile.png&quot; alt=&quot;:-)&quot; class=&quot;smiley&quot; /&gt;&lt;/p&gt;</description>
    
    
    
      </item>
    
  <item>
    <title>Lecture : High Performance MySQL</title>
    <link>http://nicolas.steinmetz.fr/journal/post/2009/06/17/Lecture-%3A-High-Performance-MySQL</link>
    <guid isPermaLink="false">urn:md5:7bc77ebaf7159b8a28aff91ccf8200d2</guid>
    <pubDate>Wed, 17 Jun 2009 11:56:00 +0200</pubDate>
    <dc:creator>Nicolas Steinmetz</dc:creator>
        <category>Intégration</category>
        <category>mysql</category><category>opitimisation</category><category>performance</category><category>réplication</category><category>sauvegarde</category><category>sécurité</category>    
    <description>    &lt;p&gt;L'intranet du groupe JCDecaux utilisant MySQL comme base de données, et devant travailler sur les problématiques de scalabilité / Plan de reprise d'activité, je m'étais acheté le livre &amp;quot;&lt;a href=&quot;http://oreilly.com/catalog/9780596101718/&quot; hreflang=&quot;en&quot;&gt;High Performance MySQL&lt;/a&gt;&amp;quot;, considéré comme la référence en la matière. Autant le dire de  suite, je n'ai pas été déçu et s'il avait été publié chez Apress, il aurait été appelé sans aucun doute : &amp;quot;MySQL : The definitive guide&amp;quot;.&lt;/p&gt;


&lt;p&gt;Contrairement à ce que pourrait laisser croire le titre, il ne se focalise pas uniquement sur la performance. Ou sinon il faut l'entendre comme utiliser MySQL de façon performante à tous les niveaux (code, infrastructure, sécurité, backup, etc).&lt;/p&gt;


&lt;p&gt;Le livre couvre les sujets suivants :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Architecture de MySQL (architecture logique, moteurs de stockage, etc)&lt;/li&gt;
&lt;li&gt;Benchmark et profilage en vue de trouver les goulots d'étranglements&lt;/li&gt;
&lt;li&gt;Optimisation des schema et des index&lt;/li&gt;
&lt;li&gt;Optimisation des requêtes&lt;/li&gt;
&lt;li&gt;Fonctionnalités avancées de MySQL (Vues, Cache, Partitionnement, Clés étrangères, etc)&lt;/li&gt;
&lt;li&gt;Optimisation de la configuration du serveur MySQL&lt;/li&gt;
&lt;li&gt;Optimisation système et logicielle d'un serveur MySQL&lt;/li&gt;
&lt;li&gt;Réplication&lt;/li&gt;
&lt;li&gt;Montée en charge et/ou haute dispo&lt;/li&gt;
&lt;li&gt;Optimisation applicatives (Serveur web, Cache, etc)&lt;/li&gt;
&lt;li&gt;Sauvegarde et restauration&lt;/li&gt;
&lt;li&gt;Sécurité&lt;/li&gt;
&lt;li&gt;Les status d'un serveur MySQL (Show status &amp;amp; co)&lt;/li&gt;
&lt;li&gt;Outils de consultation, surveillance, analyse, etc d'un serveur MySQL&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;J'ai bien aimé :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;La complétude du livre : même si je ne suis pas concerné par tous les chapitres, au moins on a au final une vue complète sur MySQL. Dans ce sens, il devrait être lu par toute personne touchant de près ou de loin à MySQL&lt;/li&gt;
&lt;li&gt;La prudence / le pragmatisme / les conseils sur les aspects performance et sur les capacités de MySQL face à tel ou tel objectif.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;J'aurais bien aimé :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Sur la réplication, un peu plus de détail sur l'implémentation de certaines typologies de réplication - seul le cas basique (maitre/esclave) est couvert techniquement. Pour les autres cas, c'est plus une présentation + SWOT qu'une implémentation qui est proposée dans le livre.&lt;/li&gt;
&lt;li&gt;Peut être une meilleure formulation de certains ratios car pour réussir à en calculer certains, c'est pas aisé aisé.&lt;/li&gt;
&lt;li&gt;Au niveau configuration, ils auraient pu parler de la &lt;a href=&quot;http://nicolas.steinmetz.fr/tutoriels/serveur_web/mysql5_surcharger_votre_configuration.html&quot; hreflang=&quot;fr&quot;&gt;surchage de la configuration par défaut&lt;/a&gt; (une mise à jour du tutoriel va arriver prochainement) via les directives &lt;a href=&quot;http://dev.mysql.com/doc/refman/5.0/en/option-files.html&quot; hreflang=&quot;en&quot;&gt;include et/ou includedir&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Je n'ai pas aimé :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Rien &lt;img src=&quot;/journal/themes/default/smilies/smile.png&quot; alt=&quot;:)&quot; class=&quot;smiley&quot; /&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Par contre, moi qui était globalement un partisan de MySQL, j'avoue être un peu refroidi par certains cotés dans le cadre d'un déploiement en entreprise (lié à la lecture du livre et l'expérience d'intégration/production à JCDecaux) :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;L'instructon &amp;quot;Stop Slave&amp;quot; jusqu'à la &lt;a href=&quot;http://dev.mysql.com/doc/refman/5.1/en/news-5-1-35.html&quot; hreflang=&quot;en&quot;&gt;version 5.1.35&lt;/a&gt; arrête la réplication sans attendre la fin de la transaction en cours.&lt;/li&gt;
&lt;li&gt;La sauvegarde par copie physique des fichiers a l'air plus que fragile.&lt;/li&gt;
&lt;li&gt;La sauvegarde par export logique (à la mysqldump) semble être la seule voie stable avec pour inconvénient de (re)jouer un grand nombre de requêtes SQL (et donc d'être plus longue qu'une sauvegarde physique)&lt;/li&gt;
&lt;li&gt;La gestion des log innodb (/var/lib/mysql/ibdata* /var/lib/mysql/iblogfile*) que l'on ne peut pas purger sans reconstruire complètement son serveur. Le risque étant que ces fichiers remplissent la partition s'ils ne sont pas limitées en taille ou que si la taille est atteinte, alors votre applicatif est figé. Coté indisponibilité de service, c'est pas mal non plus...&lt;/li&gt;
&lt;li&gt;Le fait de mixer des tables au format MyISAM et InnoDB créent des contraintes d'exploitation potentiellement assez intéressantes puisque suivant le type de table, il ne faudrait pas utiliser les mêmes options pour mysqldump par ex. De même au niveau tuning, vu les ressources limitées d'un serveur, l'arbitrage du tuning entre les 2 types de tables peut être globalement &amp;quot;sous-performant&amp;quot;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Du coup, je crains que MySQL, dans le contexte JCDecaux, se limite à des petits applicatifs ou avec une criticité pas trop élevée alors que SQL Server / Oracle sera utilisé pour le reste.&lt;/p&gt;</description>
    
    
    
      </item>
    
</channel>
</rss>