<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Christophe Nowicki &#187; Work</title>
	<atom:link href="http://www.csquad.org/category/work/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.csquad.org</link>
	<description>Just for fun</description>
	<lastBuildDate>Thu, 29 Jul 2010 19:42:40 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.1</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Présentation du standard Zigbee</title>
		<link>http://www.csquad.org/2009/12/19/zigbee/</link>
		<comments>http://www.csquad.org/2009/12/19/zigbee/#comments</comments>
		<pubDate>Sat, 19 Dec 2009 13:00:50 +0000</pubDate>
		<dc:creator>cscm</dc:creator>
				<category><![CDATA[Home automation]]></category>
		<category><![CDATA[Network]]></category>
		<category><![CDATA[Robotics]]></category>
		<category><![CDATA[Work]]></category>
		<category><![CDATA[ZigBee]]></category>

		<guid isPermaLink="false">http://www.csquad.org/?p=893</guid>
		<description><![CDATA[



Je reviens des mercredis de la RFID organisé par filrfid, le sujet de la présentation était le protocole ZigBee. 
Lors de la présentation faite par Véranith Ly de la société oRFIDée, j&#8217;ai appris beaucoup de choses sur ce protocole. 
J&#8217;aimerai donc vous en faire profiter et parler des domaines qui m&#8217;intéressent à savoir la domotique, [...]]]></description>
			<content:encoded><![CDATA[<table>
<tr valign='top'>
<td valign='top'><img src="http://www.csquad.org/wp-content/uploads/2009/12/ZigBee_Network_Design-za-web.jpg" alt="ZigBee_Network_Design" title="ZigBee_Network_Design" width="257" height="200" class="alignleft size-full wp-image-936" /></td>
<td>
<p>Je reviens des <a href="http://www.filrfid.org/article-16-decembre-un-mercredi-special-zigbee-venez-nombreux--40848259.html">mercredis de la RFID</a> organisé par <a href="http://www.filrfid.org/">filrfid</a>, le sujet de la présentation était le protocole <a href="http://fr.wikipedia.org/wiki/Zigbee">ZigBee</a>. </p>
<p>Lors de la présentation faite par Véranith Ly de la société <a href="http://www.orfidee.com/">oRFIDée</a>, j&#8217;ai appris beaucoup de choses sur ce protocole. </p>
<p>J&#8217;aimerai donc vous en faire profiter et parler des domaines qui m&#8217;intéressent à savoir la domotique, la robotique et la topologie des réseaux maillés.
</p>
</td>
</tr>
</table>
<h3>Description rapide du standard</h3>
<p><a href="http://fr.wikipedia.org/wiki/Zigbee">ZigBee</a>, est un standard de communication sans-fils comme le <a href="http://fr.wikipedia.org/wiki/Wi-Fi">Wifi</a> ou le <a href="http://fr.wikipedia.org/wiki/Bluetooth">Bluetooth</a>.<br />
Les principaux avantages du standard sont :</p>
<ul>
<li>Autonomie de l&#8217;émetteur, il est possible de le faire fonctionner durant <strong>plusieurs années</strong> à l&#8217;aide d&#8217;une batterie ;</li>
<li>La possibilité de mettre en place une <a href="http://fr.wikipedia.org/wiki/Topologie_maill%C3%A9e">topologie de réseaux maillés</a> ;</li>
<li><strong>65535 nœuds</strong> sont <em>addressable</em> sur le réseau ; </li>
<li>le standard définie : les méthodes de communication sur le réseau, <strong>mais aussi</strong> les fonctionnement des applications ;</li>
<li>l&#8217;ensemble des produits sont certifiés par <a href="http://www.zigbee.org/">l&#8217;Alliance ZigBee</a> et soutenus par de <a href="http://www.zigbee.org/zigbee/About/OurMembers/tabid/191/Default.aspx">nombreuses entreprises industriels</a> ;</li>
</ul>
<p>Ce qui est intéressant, c&#8217;est que le standard définit un ensemble de caractéristiques pour un équipement.<br />
Regroupé sous forme de famille :</p>
<ul>
<li><a href="http://www.zigbee.org/Markets/ZigBeeSmartEnergy/ZigBeeSmartEnergyOverview/tabid/431/Default.aspx">ZigBee Smart Energy</a> ;</li>
<li><a href="http://www.zigbee.org/Markets/ZigBeeRemoteControl/ZigBeeRemoteControlOverview/tabid/475/Default.aspx">ZigBee Remote Control</a> ; </li>
<li><a href="http://www.zigbee.org/Markets/ZigBeeRemoteControl/ZigBeeRemoteControlOverview/tabid/475/Default.aspx">ZigBee Home Automation</a> ;</li>
<li><a href="http://www.zigbee.org/Markets/ZigBeeHealthCare/ZigBeeHealthCareOverview/tabid/426/Default.aspx">ZigBee Health Care</a>, non disponible;</li>
<li><a href="http://www.zigbee.org/Markets/ZigBeeBuildingAutomation/tabid/226/Default.aspx">ZigBee Building Automation</a>, pas encore définie ;</li>
<li>ZigBee Telecommunication Services, non encore définie.</li>
</ul>
<h3>Domaines d&#8217;application du protocole</h3>
<p>Les domaines d&#8217;applications du protocole sont les suivants :</p>
<ul>
<li>la gestion de l&#8217;énergie et les réseaux de <a href="http://fr.wikipedia.org/wiki/Smart_grid">distribution d&#8217;électricité « intelligent »</a> ;  </li>
<li>la médecine, avec le <a href="http://fr.wikipedia.org/wiki/WSN#Applications_m.C3.A9dicales_et_v.C3.A9t.C3.A9rinaire">suivi des indicateurs physiologiques</a> sur le long terme pour les maladies chroniques.</li>
<li>Les réseaux de capteurs en général : <a href="http://fr.wikipedia.org/wiki/R%C3%A9seau_de_capteurs_sans-fil">WSN</a> ; </li>
<li>Les télécommandes, le protocole est amené à remplacer les télécommandes infrarouge à moyen terme.</li>
<li>La domotique, pour le contrôle et la gestion des appareils dans une maison ;</li>
<li>La <a href="http://en.wikipedia.org/wiki/Real-time_locating_system">localisation en temps réel</a> ;</li>
<li>Et enfin la robotique, pour le contrôle à distance ;</li>
</ul>
<h3>La promesse du standard</h3>
<p>Les équipements qui respectent le standard et sont <a href="http://www.zigbee.org/Products/CertifiedProducts/CertifiedProductsOverview/tabid/463/Default.aspx">certifiés par l&#8217;Alliance ZigBee</a> sont théoriquement interchangeable et peuvent communiquer ensemble. </p>
<p>Cela signifie, qu&#8217;il est possible d&#8217;allumer à l&#8217;aide d&#8217;une télécommande de marque A, une douille d&#8217;ampoule de marque B et un lecteur de DVD de marque C. </p>
<p>Cela parait trivial dit comme cela, mais dans l&#8217;état actuel de développement de la domotique, cela releve du <strong>miracle</strong> &#8230;</p>
<p>Même, s&#8217;il existe des protocoles propriétaires pour faire cela, il est nécessaire de vendre <em>son âme</em> à un constructeur (<a href="http://fr.wikipedia.org/wiki/Enfermement_propri%C3%A9taire">Vendor lock-in</a> garantie sur facture <img src='http://www.csquad.org/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' />  ) ou bien mettre en place des protocoles de <a href="http://fr.wikipedia.org/wiki/Middleware">Middleware</a> comme <a href="http://xplproject.org.uk/">xPL</a> et une belle galaxie de protocoles hétérogènes. (cf. le schéma de ma <a href="http://www.csquad.org/installation-domotique/">petite installation perso</a> <img src='http://www.csquad.org/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' />  ).</p>
<h3>La gestion des <em>binding</em></h3>
<p>La couche applicatif du standard ZigBee, inclut une possibilité très intéressante pour la domotique : le <em>binding</em>. </p>
<p>L&#8217;idée est de <strong>relier deux équipements</strong> du réseau de manière <strong>automatique et transparente</strong> pour l&#8217;utilisateur. </p>
<p>L&#8217;un des meilleur exemple pour comprendre est celui d&#8217;une ampoule et un d&#8217;un interrupteur.</p>
<p>Lorsque l&#8217;utilisateur active physiquement le <em>binding</em>, à l&#8217;aide d&#8217;un bouton par exemple. </p>
<p>Les deux <em>devices</em> se mettent en relation avec le coordinateur du réseau, qui détermine si oui ou non les profils applicatifs sont compatibles et de les lier. </p>
<p>Ce qui permet aux  équipements d&#8217;être liés automatiquement et il n&#8217;est pas nécessaire de configurer les adresses des équipements, etc&#8230;</p>
<h3>L&#8217;état actuel de la certification </h3>
<p>Pour l&#8217;instant, il y a peu d&#8217;équipements qui sont certifiés par l&#8217;Alliance :</p>
<ul>
<li><a href="http://www.zigbee.org/Products/CertifiedProducts/ZigBeeSmartEnergy/tabid/271/Default.aspx">ZigBee Smart Energy Certified Products</a> ;</li>
<li><a href="http://www.zigbee.org/Products/CertifiedProducts/ZigBeeHomeAutomation/tabid/455/Default.aspx">ZigBee Home Automation Certified Products</a>.</li>
</ul>
<p>Mais on trouve pas mal de vendeurs d&#8217;autres produits que ne sont pas forcement entièrement certifiés mais qui respectent la partie communication du standard. </p>
<h3>Problématique du sans-fils</h3>
<p>Comme toutes technologies sans-fils, elle présente quelques problématiques particulières : </p>
<h4>La source d&#8217;énergie</h4>
<p>Bien que le module ZigBee nécessite très peu d&#8217;énergie pour fonctionner (20mA pour émettre une trame sur le réseau), se pose la question de la source d&#8217;énergie. </p>
<p>Lorsque celle-ci est fournie par une pile cela pose de problématique de :</p>
<ul>
<li>fiabilité / qualité de la source d&#8217;énergie  ;</li>
<li>la nécessité de remplacer régulièrement la source d&#8217;énergie ; </li>
<li>la nécessité de mettre en place un dispositif pour notifier l&#8217;utilisateur du statut de la pile. </li>
</ul>
<h4>La sécurité</h4>
<p>La sécurité du standard ZigBee repose tout d’abord, sur la sécurité du protocole de communication IEEE 802.15.4. Pour mieux comprendre les méthodes de sécurisation mises en place par le protocole, vous pouvez lire cet article de vulgarisation : <a href="http://www.sensor-networks.org/index.php?page=0903503549">Security in 802.15.4 and ZigBee networks</a> ; ou bien cet excellent papier <a href="http://naveen.ksastry.com/papers/15.4-wise04.pdf">Security Considerations for IEEE 802.15.4 Networks</a>. Mais dans ce domaine, rien de nouveau, ce sont toujours les mêmes principes qui s’appliquent, à savoir :</p>
<ul>
<li>Plus la puce dispose de puissance et plus le niveau de chiffrement est fort (au maximum <a href="http://fr.wikipedia.org/wiki/Standard_de_chiffrement_avanc%C3%A9">AES128</a> pour ZigBee) ;</li>
<li>La qualité des composants et du générateur de nombre aléatoire ( <a href="http://digitaloffense.net/tools/debian-openssl/">merci de ne pas utiliser le PID du programme</a> <img src='http://www.csquad.org/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' />  ) ;</li>
<li>La qualité de l’implémentation du code de chiffrement.</li>
</ul>
<p>Bref, vous vous doutez bien que les modules ZigBee qui seront vendus au grand publique ne seront pas d’un niveau de sécurité militaire et n’embarqueront sûrement pas <a href="http://enginova.com/radioactive_random_number_genera.htm">pas un compteur Geiger</a> comme source d&#8217;entropie <img src='http://www.csquad.org/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </p>
<p>D&#8217;autant plus que le standard n&#8217;impose pas forcement un niveau de chiffrement fort à tous les profils applicatifs. </p>
<h3>Robotique</h3>
<p>Pour la robotique, il n&#8217;existe pas de profil dans le standard, mais la plupart des amateurs dans le domaine ont déjà compris les nombreux intérêts de ZigBee et on voit de plus en plus d&#8217;interfaces apparaître (<a href="http://www.trossenrobotics.com/bioloid-zigbee-wireless-module-set.aspx">Bioloid</a>, <a href="http://www.circuitcellar.com/library/print/0306/leland-188/leland-188.pdf">WowWee</a>, etc&#8230; )</p>
<h3>Logiciels libres</h3>
<p>Du coté des logiciels libres, nous avons :</p>
<ul>
<li>Un projet mort : <a href="http://zigbuzz.sourceforge.net/fr/index.html">ZigBuzz</a> ;</li>
<li>Le projet <a href="http://sourceforge.net/apps/trac/linux-zigbee/wiki">IEEE802.15.4/ZigBee Stack for Linux</a>, dont l&#8217;objectif est l&#8217;intégration de la pile ZigBee dans le noyau Linux, commiter dans la version 2.6.30-rc7 ;</li>
<li>Le projet <a href="http://freakz.sourceforge.net/">FreakZ</a>, dont l&#8217;objectif est l&#8217;implémentation du pile ZigBee libre pour l&#8217;embarque ;</li>
</ul>
<p>Malheureusement, il y a une incompatibilité entre la licence des spécifications du standard ZigBee et la licence <a href="http://www.gnu.org/licenses/gpl.html">GPL</a>. en effet celle-ci ne prend pas en compte un usage non commercial. </p>
<p>Pour plus de détails sur ce point : <a href="http://freaklabs.org/index.php/Blog/Zigbee/Zigbee-Linux-and-the-GPL.html">Zigbee, Linux, and the GPL</a>.</p>
<p>Néanmoins, le code du protocole IEEE 802.15.4 est <a href="http://lwn.net/Articles/334666/">déjà le noyau</a> et bénéficie d&#8217;un niveau de protection <img src='http://www.csquad.org/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </p>
<h3>Matériel</h3>
<p>Le matériel ZigBee disponible se découpe en plusieurs familles de la plus simple à la plus complexe :</p>
<h4>Émetteur-récepteur</h4>
<p>Les principaux constructeurs d&#8217;émetteur-récepteur sont <a href="http://www.ti.com/">Texas instruments</a> et <a href="http://www.freescale.com/">Freescale</a>.</p>
<h4>Puce</h4>
<p>Les puces prennent en charge la norme IEEE 802.15.4, elles sont produites par : <a href="http://www.ember.com/">Ember</a>, <a href="http://www.jennic.com/">Jennic</a>, <a href="http://www.ti.com/">Texas instruments</a> et <a href="http://www.freescale.com/">Freescale</a>.</p>
<h4>Modules</h4>
<p>Les modules prennent en charge le standard ZigBee et sont produites par : <a href="http://www.digi.com/">Digi</a>, <a href="http://www.one-rf.com/">One-RF</a>, <a href="http://www.telegesis.com/">Telegesis</a>, <a href="http://www.meshnetics.com/">Meshnetrics</a>, <a href="http://www.radiocrafts.com/">Radiocrafts</a>&#8230;</p>
<h4>Produit fini</h4>
<ul>
<li><a href="http://www.tritech.se/sv/start/tritech.php">Tritech</a> : dongles USB et routeurs Ethernet/Zigbee ;</li>
<li><a href="http://www.digi.com/">Digi</a> : passerelles RS232/485, USB, Ethernet, GPIO, routeurs autonomes</li>
<li><a href="http://www.telegesis.com/">Telegesis</a> : dongles USB et CF, routeurs autonomes et Ethernet</li>
<li><a href=""></a><a href="http://www.alektrona.com/">Alektrona</a> : gateway ethernet / zigbee;</li>
<li><a href="http://www.libelium.com/">Libelium</a> : capteurs et routeurs multi-protocoles Wifi, Bluetooth, GPRS et GPS ;</li>
<li>Des <em>shields</em> pour la carte <a href="http://www.arduino.cc/">Arduino</a> et ses dérivées.
</li>
</ul>
<h4>Offre packagée</h4>
<p>Pour les produits packagés, il existe les solutions suivantes :</p>
<ul>
<li><a href='http://www.control4.com/'>Control4</a> : gamme de produits domotiques ; </li>
<li><a href='http://www.alertme.com/'>AlerteMe</a> : système de suivi de la consommation électrique et  alarme.</li>
</ul>
<h3>Déploiements importants de ces technologies</h3>
<p>Il y a pas mal de déploiements de ces technologies aux USA dans le cadre des réseau de distribution d&#8217;électricité « intelligent » en Californie et au Texas principalement. </p>
<p>En Europe, le ville de <a href="http://www.openstreetmap.org/?mlat=57.706407&#038;mlon=11.968631&#038;zoom=10">Gothenburg en Suède</a> a déployé un réseau de <a href="http://tdworld.com/info_systems/highlights/gothenberg-ge-smart-meters-0609/">90 000 compteurs intelligents</a>. </p>
<p>En France, le déploiement est encore à l&#8217;état de recherche avec le projet <a href="http://www.senslab.info/index.php/Main_Page">SensLab</a>, le projet de localisation fait par <a href="http://www.orfidee.com/">Orfidée</a> pour la <a href="http://www.defense.gouv.fr/marine">Marine Nationale</a>.</p>
<p>Et d&#8217;autres projets couverts par des accords de non divulgation <img src='http://www.csquad.org/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </p>
<h3>Références</h3>
<p>Voici quelques références pour approfondir le sujet :</p>
<ul>
<li>Le site de la <a href="http://www.zigbee.org/">ZigBee Alliance</a> ; </li>
<li>le site <a href="http://www.sensor-networks.org/">sensor-networks</a> ;</li>
<li>l’article de Sensor-networks sur les différence entre <a href="http://www.sensor-networks.org/index.php?page=0823123150">802.15.4 vs ZigBee</a> ;</li>
<li>le site du projet <a href="http://sourceforge.net/apps/trac/linux-zigbee/wiki">IEEE802.15.4/ZigBee Stack for Linux</a> ;</li>
</ul>
<h3>Conclusion</h3>
<p>Voilà, ceci est une petite présentation standard ZigBee, que j&#8217;ai voulu la plus succincte possible. Le sujet étant très vaste et passionnant. J&#8217;ai forcement fait des erreurs et oublié des références.  Merci de m&#8217;en faire part par mail ou via les commentaires.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.csquad.org/2009/12/19/zigbee/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>La dette technique</title>
		<link>http://www.csquad.org/2009/09/12/la-dette-technique/</link>
		<comments>http://www.csquad.org/2009/09/12/la-dette-technique/#comments</comments>
		<pubDate>Sat, 12 Sep 2009 08:24:22 +0000</pubDate>
		<dc:creator>cscm</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[Work]]></category>
		<category><![CDATA[dette technique]]></category>
		<category><![CDATA[refactorisation]]></category>

		<guid isPermaLink="false">http://www.csquad.org/?p=493</guid>
		<description><![CDATA[Je viens de finir une analyse de code pour un client. J’aime beaucoup ce  type de missions, car elles permettent de remettre en perspective mon travail et de mieux analyser les différentes implications de l’organisation sur le développement.
J’essaye dans ce type de mission d’identifier quels sont les points d’organisation qui transparaissent dans l’analyse de [...]]]></description>
			<content:encoded><![CDATA[<p>Je viens de finir une analyse de code pour un client. J’aime beaucoup ce  type de missions, car elles permettent de remettre en perspective mon travail et de mieux analyser les différentes implications de l’organisation sur le développement.</p>
<p>J’essaye dans ce type de mission d’identifier quels sont les points d’organisation qui transparaissent dans l’analyse de code.</p>
<p>Dans plusieurs cas, j’ai pu retrouver des similitudes. Ces similitudes peuvent être regroupées sous le terme de “dette technique”.</p>
<p>Dans cette article, je vais essayer de définir le concept, vous présenter les symptômes, les origines, les conséquences et les solutions envisageables.</p>
<h3>Définition de la dette technique</h3>
<p>Lorsque vous ajoutez une fonctionnalité à un logiciel, vous avez deux<br />
possiblités :</p>
<ul>
<li>Faire le plus rapide possible, c’est à dire en utilisant la<br />
technique la plus facile, la plus rapide et négliger la conception</li>
<li>Prendre le temps de réaliser proprement la fonctionnalité, créer une architecture, spécifier les besoin fonctionnels, techniques, faire des tests, etc.</li>
</ul>
<p>On peut établir une métaphore financière avec la mise en place d&#8217;une solution à court terme telle qu&#8217;évoquée dans le premier cas de figure en parlant de dette technique.</p>
<p>Vous empruntez du temps sur l’avenir. Comme dans le cas d’un crédit. Mais le coût de cet emprunt n’est pas nul.<br />
Plus vous développez rapidement et mal et plus la dette grandit, les intérêts se cumulent.<br />
Et le projet peut faire faillite sous le coût de la dette.</p>
<h3>Symptômes</h3>
<p>Voici des exemples de situations réellement vécues au sein d’entreprises :</p>
<ul>
<li>Absence de documentation sur la structure du projet : où se trouve le code source? dans quel répertoire se trouve la documentation du projet, où sont les fichiers CSS, etc.</li>
<li>Aucun test unitaire ou fonctionnel ;</li>
<li> “Lorsque je change une ligne dans le module A, cela casse le fonctionnement du module B” </li>
<li> “Ne touche pas à cette partie du code, nous ne savons pas ce qu’elle fait exactement, mais dieu merci cela fonctionne encore” ;</li>
<li>Nous venons de perdre un disque dur sur le serveur de production, où sont les sauvegardes?</li>
<li>J’ai l’impression d’avoir déjà corrigé ce bug plusieurs fois, étrange….</li>
<li>Code sans aucun commentaire ou avec des commentaire trop anciens ;</li>
<li>La connaissance du projet dépend d’une seule personne ;</li>
<li>Je vais mettre un commentaire TODO ou FIXME et je corrigerai le problème plus tard ;</li>
<li>Nous ne pouvons pas mettre à jour les composants du serveur, cela va casser le code ;</li>
<li>Nous n’avons pas le temps de faire cela, ce n’est pas une urgence vitale ;</li>
<li>Nous ne pouvons pas mettre à jour le code, personne ne comprend cette partie du code …</li>
<li>La personne responsable du module est partie en vacances …</li>
</ul>
<p>Vous avez aussi entendu ou vécu ce genre de situation ?<br />
Alors appelez le 81212 et dites &#8216;Thermomètre&#8217; <img src='http://www.csquad.org/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </p>
<h3>Les origines</h3>
<p>Qui est responsable de ces problèmes. La réponse est assez simple, car chaque intervenant du projet est responsable :</p>
<ul>
<li>le chef de projet qui néglige la conception, planifie mal<br />
l’exécution des tâches ou ne transmet par correctement les demandes des clients ;</li>
<li>le client qui s’introduit dans la conception technique du<br />
logiciel et qui impose brutalement son point de vue ;</li>
<li>le développeur qui ne sait pas dire “non”, qui surestime ses<br />
capacité ou bien qui ne joue pas collectivement dans une équipe ;</li>
<li>les utilisateurs avides de fonctionnalités et volatiles dans leur<br />
demandes ;</li>
</ul>
<h3>Les conséquences</h3>
<p>Les conséquences de la dette technique sont les suivantes :</p>
<ul>
<li>Augmentation du temps de développement ;</li>
<li>Impossibilité de prévoir et d&#8217;anticiper les coûts d’entretien ;</li>
<li>Difficulté pour faire rentrer un nouveau développeur dans l’équipe ;</li>
<li>Faillite</li>
</ul>
<h3>Solutions</h3>
<h4>Technique</h4>
<p>La solution technique miracle permettant de vous sortir du bourbier n’existe pas.</p>
<p>Ceux qui vous disent qu’il suffit de refaire le logiciel avec une autre<br />
technologie / technique ont sûrement quelque chose à vous vendre <img src='http://www.csquad.org/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </p>
<h4>Infrastructure</h4>
<p>Il faut absolument mettre en place une infrastructure pour chaque<br />
développement quelle que soit la taille du projet.</p>
<ul>
<li>Un logiciel de suivi de bugs : comme <a href="http://bestpractical.com/rt/">Request Tracker</a>, <a href="http://trac.edgewall.org/">Trac</a>, <a href="http://www.mantisbt.org/">Mantis</a>, etc&#8230;</li>
<li>Un système de suivi de version tel que <a href="http://subversion.tigris.org/">Subversion</a>, <a href="http://git-scm.com/">Git</a> ou <a href="http://mercurial.selenic.com/wiki/">Mercurial</a> ;</li>
<li>Un système de sauvegarde ;</li>
<li>L’automatisation des tâches à l’aide d’un système de compilation automatique ;</li>
<li>Des tests unitaires et fonctionnels automatisés ;</li>
</ul>
<h4>Refactorisation</h4>
<p>La <a href="http://fr.wikipedia.org/wiki/Refactorisation">refactorisation</a> est une forme de paiement des intérêts de la dette.<br />
En effet, elle permet de faire une pause dans le développement et de “nettoyer” le code.</p>
<h4>Méthodes de développements</h4>
<p>Je ne vais pas lancer une querelle de clocher, je ne vais pas non plus vous dire que telle ou telle méthode de développement est la meilleure.</p>
<p>Il existe un bon nombre de <a href="http://fr.wikipedia.org/wiki/Cat%C3%A9gorie:M%C3%A9thode_de_d%C3%A9veloppement_logiciel">méthodes de développement</a>.</p>
<p>Chaque méthode présente ses avantages et ses inconvénients.</p>
<p>Par contre, une chose est sûre, les équipes de développement qui appliquent une méthode de développement rencontrent moins souvent ce type de problème.</p>
<h3>Un peu de provocation</h3>
<p>Je ne résiste pas <img src='http://www.csquad.org/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /><br />
Est-ce que la dette technique est mauvaise dans tous les cas ?<br />
Comme dans le cas d’une patate chaude cela dépend de qui paiera les intérêts.<br />
Il est possible de faire un <a href="http://en.wikipedia.org/wiki/No_Income_No_Asset">prêt ninja</a> avec les intérêts de la dette.</p>
<p>Cela fonctionne dans le cas d’un marché ou <a href="http://ingrimayne.com/econ/resouceProblems/WinnerTakeIt.html">“the-winner-takes-all”</a>.<br />
Par exemple, dans le cas d’une start-up innovante dont le seul but est de revendre le logiciel.</p>
<p>La dette technique permet de partir plus vite au soleil <img src='http://www.csquad.org/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </p>
<h3>Références</h3>
<ul>
<li>La conférence d’Andy Lester au YAPC::NA 2006 : <a href="http://www.media-landscape.com/yapc/2006-06-26.AndyLester/">Get out of Technical Debt Now!</a> ;</li>
<li>Un <a href="https://linuxfr.org/comments/1000177,1.html">commentaire sur LinuxFR</a> d’un ancien développeur du site <a href="http://www.voyages-sncf.com/">voyages-sncf.com</a> ;</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.csquad.org/2009/09/12/la-dette-technique/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Système d&#8217;impression PDF &#8220;RESTful&#8221;  pour le Web</title>
		<link>http://www.csquad.org/2009/02/10/systeme-dimpression-pdf-restful-pour-le-web/</link>
		<comments>http://www.csquad.org/2009/02/10/systeme-dimpression-pdf-restful-pour-le-web/#comments</comments>
		<pubDate>Tue, 10 Feb 2009 21:43:13 +0000</pubDate>
		<dc:creator>cscm</dc:creator>
				<category><![CDATA[Work]]></category>
		<category><![CDATA[Apache]]></category>
		<category><![CDATA[Cocoon]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[MAVISE]]></category>
		<category><![CDATA[PDF]]></category>
		<category><![CDATA[REST]]></category>
		<category><![CDATA[Web]]></category>

		<guid isPermaLink="false">http://www.csquad.org/?p=78</guid>
		<description><![CDATA[Le monde du web et celui de l&#8217;impression, ont décidément du mal à se rencontrer.
La prise en charge de l&#8217;impression est bien souvent très problématique dans le cas d&#8217;un projet web. 
Dans la plupart des cas, il est possible de s&#8217;en sortir en utilisant les possiblités offertes par les feuilles de style CSS.
Mais le rendu [...]]]></description>
			<content:encoded><![CDATA[<p>Le monde du web et celui de l&#8217;impression, ont décidément du mal à se rencontrer.<br />
La prise en charge de l&#8217;impression est bien souvent très problématique dans le cas d&#8217;un projet web. </p>
<p>Dans la plupart des cas, il est possible de s&#8217;en sortir en utilisant les possiblités offertes par les feuilles de style CSS.<br />
Mais le rendu final du document n&#8217;est pas garanti, les différents navigateurs interprètent la feuille de style selon leur humeur<br />
et cela ne fonctionne pas dans le cas de documents complexes.</p>
<p>Dans ce cas, l&#8217;unique solution est de produire un document au format PDF, unique garantie pour une impression de qualité.<br />
Je vais donc décrire dans cet article, la solution que nous avons mis en place dans le cadre du projet MAVISE.</p>
<h3>Historique</h3>
<p>La base de données <a href="http://mavise.obs.coe.int/">MAVISE</a> fourni les données sur l’ensemble des chaînes de télévision accessibles dans l’Union européenne.</p>
<p>Elle a été développé par la société Easter-eggs en collaboration avec <a href="http://www.obs.coe.int/">l&#8217;Observatoire européen de l&#8217;audiovisuel</a> (OEA) pour le compte de la <a href="http://ec.europa.eu/dgs/communication/index_en.htm">DG Communication de la Commission Européenne</a>.</p>
<p>Dans la 1ère phase du projet nous avons développé un système d&#8217;impression avec des feuilles de style.<br />
Ce système ne donnait pas entièrement satisfaction au client. </p>
<p>En effet, les pages du projet étant très complexes, le résultat de l&#8217;impression produite par les différents navigateurs était très aléatoire (coupure en plein milieu d&#8217;un tableau, impression sur plusieurs pages et saut de pages inexpliqués).</p>
<p>Le résultat n&#8217;était pas professionnel et il était difficile pour le client d&#8217;alimenter un rapport avec les contenu de la base.<br />
Nous avons donc proposé de mettre en place un export PDF pour l&#8217;ensemble des éléments de l&#8217;application.</p>
<h3>Choix techniques</h3>
<p>Au fils du temps, je suis devenu un expert de la production de document PDF,<br />
en effet, j&#8217;ai été en charge de l&#8217;export PDF dans de nombreux projets. </p>
<p>J&#8217;ai eu le plaisir d&#8217;utiliser plusieurs API pour produire des documents au format PDF, comme par exemple :</p>
<ul>
<li><a href="http://www.reportlab.org/index.html">ReportLab</a> en Python ;</li>
<li><a href="http://www.fpdf.org/">FPDF</a> en PHP ;</li>
<li><a href="http://pdfapi2.sourceforge.net/">PDF::API2</a> en Perl.</li>
</ul>
<p>Le travail pour produire des documents PDF consiste dans la plupart des cas à dessiner avec l&#8217;aide de ces diffèrentes<br />
API, le contenu du document. (texte, tableaux, graphique et mise en page). </p>
<p>Il s&#8217;agit d&#8217;un travail long et fastidieux, qui consiste à fournir une suite d&#8217;instructions pour former le document.<br />
Cette technique montre vite ses limites :</p>
<ul>
<li>les demandes de modification de la mise en page du  document produit, sont lourdes et nécessitent beaucoup de temps ;</li>
<li>le code pour produire le document est difficilement rationalisable ;</li>
<li>elle ne convient pas à des documents de grande taille.</li>
</ul>
<p>Dans le modèle <a href="http://fr.wikipedia.org/wiki/Mod%C3%A8le-Vue-Contr%C3%B4leur">MVC</a>, qu&#8217;utilise la plupart des applications Web, nous utilisons un système de template pour l&#8217;affichage (la vue).  </p>
<p>Alors pourquoi bon &#8220;coder&#8221; la présentation des documents PDF?</p>
<p>Pour cette raison, j&#8217;ai proposé au client de bâtir le système d&#8217;impression des documents PDF sur un système de <em>template</em>.</p>
<p>Ce système repose sur le langage de programmation <a href="http://www.w3.org/TR/xsl/">XSL-FO</a>, les projets <a href="http://xmlgraphics.apache.org/fop/">Apache FOP</a> et  <a href="http://cocoon.apache.org/">Apache Cocoon</a>.</p>
<h3>Architecture du système d&#8217;impression</h3>
<p><img src='/wp-content/mavise_export_pdf_workflow.png' alt='' /></p>
<ol>
<li>Lorsque l&#8217;utilisateur clique sur le lien PDF,  il est redirigé vers Apache Cocoon ;</li>
<li>Cocoon, récupère l&#8217;ensemble des informations directement sur le site web, via l&#8217;API REST ;</li>
<li>Il agrége les informations dans un document XML ;</li>
<li>Ce document est transformé en FO à l&#8217;aide d&#8217;une feuille de style XSLT ;</li>
<li>Le document est produit par Apache FOP ;</li>
<li>L&#8217;utilisateur obtient le document final. </li>
</ol>
<h3>L&#8217;interface entre le Site Web et Apache Cocoon</h3>
<p>L&#8217;architecture du système d&#8217;impression repose sur le fait que l&#8217;ensemble des variables manipulées par notre application sont accessibles à l&#8217;aide d&#8217;URL <a href="http://fr.wikipedia.org/wiki/REST">REST</a>.</p>
<p>En effet, il est possible d&#8217;afficher le contenu des diffèrentes variables manipulées par l&#8217;application à l&#8217;aide d&#8217;adresses URL spécifiques.<br />
Voici un exemple de sortie :<br />
<code><br />
&lt;?xml version="1.0" encoding="UTF-8"?&gt;<br />
&lt;array&gt;<br />
&lt;is_admin /&gt;<br />
&lt;country&gt;<br />
&lt;id&gt;1&lt;/id&gt;<br />
&lt;iso3166&gt;FR&lt;/iso3166&gt;<br />
&lt;name&gt;France&lt;/name&gt;<br />
&lt;enabled&gt;t&lt;/enabled&gt;<br />
&lt;minimal_age_of_audience&gt;4+&lt;/minimal_age_of_audience&gt;<br />
&lt;/country&gt;&lt;/array&gt;<br />
...<br />
</code></p>
<p>Il est donc possible de récupèrer l&#8217;<strong>ensemble</strong> des informations du site à l&#8217;aide du protocol REST.</p>
<p>Nous avons aussi de très nombreux tableaux dans l&#8217;application, pour les récupérer, nous utilisons le format XML natif du contrôleur de tableaux <a href="http://dhtmlx.com/docs/products/dhtmlxGrid/">dhtmlxGrid</a>.<br />
Voici un exemple de sortie : <a href="http://mavise.obs.coe.int/company?id=1&#038;event=get_grid_xml_list_of_channels&#038;presenter=dhtmlXGrid_xml_loader">fichier XML pour dhtmlxGrid</a>.</p>
<h3>Agrégation des données dans un seul fichier</h3>
<p>Pour récupérer l&#8217;ensemble des données du site dans un fichier XML, j&#8217;utilise la directive <em>include</em>, offerte par Cocoon :<br />
<code><br />
$ cat /var/lib/tomcat5/webapps/cocoon/mavise/program/program.xml<br />
&lt;?xml version="1.0"?&gt;</p>
<p>&lt;page name='program' xmlns:i="http://apache.org/cocoon/include/1.0"&gt;<br />
      &lt;i:include src='cocoon:/webui_program'/&gt;<br />
...<br />
</code></p>
<p>Cette directive dit à Cocoon, d&#8217;inclure le contenu qui se trouve à l&#8217;url <em>cocoon:/webui_program</em>, défini dans le fichier<br />
<em>sitemap.xmap</em> :<br />
<code><br />
      &lt;!-- Webui --&gt;<br />
      &lt;map:match pattern="webui_*/*"&gt;<br />
        &lt;map:generate src='http://localhost/{1}?id={2}&amp;presenter=rest&amp;filter=webui'/&gt;<br />
        &lt;map:serialize type="exml"/&gt;<br />
      &lt;/map:match&gt;<br />
</code></p>
<h3>Transformation XSLT</h3>
<p>Pour transformer les données contenues dans ce fichier, nous avons créé notre propre feuille de style XSLT, pour produire un document FO.<br />
Cette feuille de style prend en compte la mise en forme des diffèrentes données du site.</p>
<p>Grâce à ce système, l&#8217;ensemble de la <strong>mise en forme est centralisé</strong> dans un seul fichier.<br />
Il est aussi possible d&#8217;ajouter du contenu statique dans le PDF à l&#8217;aide de balises dédiées.<br />
Comme par exemple, une balise <em>copyright</em>, qui sera transformées en un texte statique dans tous les documents PDF.</p>
<h3>Le pipeline pour les documents PDF</h3>
<p>Voici le <em>pipeline</em> final pour produire des documents PDF :<br />
<code><br />
      &lt;!-- PDF --&gt;<br />
      &lt;map:match pattern="*/*/*.pdf"&gt;<br />
        &lt;map:generate src='{1}/{3}.xml'/&gt;<br />
        &lt;map:transform src="mk_id.xsl" type="xslt"&gt;<br />
                &lt;map:parameter name="val" value="{2}" /&gt;<br />
        &lt;/map:transform&gt;<br />
        &lt;map:transform type="include"&gt;<br />
           &lt;map:parameter name="parallel" value="true"/&gt;<br />
           &lt;map:parameter name="support-caching" value="true"/&gt;<br />
           &lt;map:parameter name="expires" value="600"/&gt;<br />
        &lt;/map:transform&gt;<br />
</code></p>
<p>Le point intéressant à noter dans ce pipeline est l&#8217;encodage des arguments passés via l&#8217;URL pour le document PDF.<br />
En effet,  les URL pour produire les PDF sont formés de la manière suivante :</p>
<p>http://mavise.obs.coe.int/cocoon/mavise/channel/2157/channel.pdf</p>
<p>L&#8217;URL contient, le nom du module et l&#8217;identifiant de la chaîne.<br />
De cette manière, il est possible de passer d&#8217;autres arguments au système d&#8217;impression (comme par exemple, changer l&#8217;orientation du document).</p>
<h3>Performances</h3>
<p>Au niveau des performances du système d&#8217;impression, nous n&#8217;avons pas une charge très importante sur la génération des documents PDF.<br />
La production des documents est  une tâche complexe et nécessite donc de manière génèrale beaucoup de ressources.<br />
Néanmoins, il y a une chose intéressante à noter au niveau de la génération des documents PDF.<br />
Celle-ci est plus rapide que l&#8217;affichage dans un navigateur.<br />
En effet cela est lié au fait que les échanges de données se font en local sur le serveur, il y a donc moins de bande passante utilisée que dans le cas de l&#8217;affichage de cette même page par le navigateur.</p>
<h3>Les petits désagréments du format PDF</h3>
<p>Nous avons rencontré un petit problème, avec la gestion des polices UTF-8, en effet, comme la base contient des données sur des chaînes de télévision et des entreprises Turques, nous avons eu besoin d&#8217;embarquer une police UTF-8 à l&#8217;intérieur du document.<br />
Et visiblement cela pose des problèmes à certains lecteurs.</p>
<h3>Quelques liens utiles</h3>
<p>Voici quelques liens utiles qui nous ont aidé dans la réalisation de ce système d&#8217;impression :</p>
<ul>
<li><a href="http://howto.landure.fr/gnu-linux/debian-4-0-etch/installer-cocoon-2-1-x-et-fop-0-9x-sur-debian-4-0-etch">Le guide d&#8217;installation d&#8217;Apache Cocoon, FOP sur Debian GNU/Linux</a> ;</li>
<li><a href="http://cocoon.apache.org/2.1/introduction.html">Documentation de la version 2.1 d&#8217;Apache Cocoon</a> ;</li>
<li><a href="http://www.zvon.org/xxl/XPathTutorial/General/examples.html">XPath Tutorial</a> ; </li>
<li><a href="http://www.zvon.org/xxl/XSLTutorial/Output_fre/contents.html">XSLT Tutorial</a> ;</li>
<li><a href="http://www.ecrion.com/Support/Resources/XSL-FO-Tutorial-French/toc.xml.html">XSL-FO</a> ;</li>
</ul>
<h3>Conclusion</h3>
<p>En conclusion, j&#8217;aimerais remercié l&#8217;<a href="http://www.obs.coe.int/">Observatoire européen de l&#8217;audiovisuel</a> (OEA), pour nous avoir fait confiance pour la mise en place de cette solution.<br />
Au 1er abord, le schéma de l&#8217;architecture n&#8217;est pas très engageant <img src='http://www.csquad.org/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </p>
<p>J&#8217;espère que cette solution donnera des idées à d&#8217;autres personnes, pour leur système d&#8217;impression.<br />
L&#8217;objectif final est de faire des économies de papier par rapport à une impression faite via Internet Explorer <img src='http://www.csquad.org/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' />  </p>
]]></content:encoded>
			<wfw:commentRss>http://www.csquad.org/2009/02/10/systeme-dimpression-pdf-restful-pour-le-web/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Retour sur l&#8217;optimisation des performances  du projet MAVISE</title>
		<link>http://www.csquad.org/2009/02/04/retour-sur-loptimisation-des-performances-du-projet-mavise/</link>
		<comments>http://www.csquad.org/2009/02/04/retour-sur-loptimisation-des-performances-du-projet-mavise/#comments</comments>
		<pubDate>Wed, 04 Feb 2009 20:42:21 +0000</pubDate>
		<dc:creator>cscm</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[Work]]></category>
		<category><![CDATA[MAVISE]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Web]]></category>

		<guid isPermaLink="false">http://www.csquad.org/?p=76</guid>
		<description><![CDATA[La base de données MAVISE fournir les données de base sur l’ensemble des chaînes de télévision accessibles dans l’Union européenne.
Elle à été développer par la société Easter-eggs pour le compte de la DG Communication de la Commission européenne.
Je vais décrire dans cet article les diffèrentes méthodes que nous avons mise en place pour optimiser les [...]]]></description>
			<content:encoded><![CDATA[<p>La base de données <a href="http://mavise.obs.coe.int/">MAVISE</a> fournir les données de base sur l’ensemble des chaînes de télévision accessibles dans l’Union européenne.<br />
Elle à été développer par la société Easter-eggs pour le compte de la DG Communication de la Commission européenne.<br />
Je vais décrire dans cet article les diffèrentes méthodes que nous avons mise en place pour optimiser les performances de cette application.</p>
<h3>Problèmatique</h3>
<p>La base de données contiens beaucoups d&#8217;informations :</p>
<ul>
<li>la description du paysage audiovisuele de 30 pays ;</li>
<li>des fiches sur 5000 chaînes de télévision ;</li>
<li>des fiches sur 4000 entreprises ;</li>
<li>des fiches sur 8000 programmes de télévision ;</li>
</ul>
<p>L&#8217;ensemble des ses données ne sont pas accessibles au grand publique.</p>
<p>D&#8217;un point de vu technique, la base de données <a href="http://www.postgresql.org/">PostgreSQL</a> contient :</p>
<ul>
<li>115 tables ;</li>
<li>100 vues ;</li>
<li>220Mo de données.</li>
</ul>
<p>Cela vous donne une petite idées de la taille de l&#8217;application.<br />
La complexitées de l&#8217;application, la quantité de données disponibles et leur affichage nous as posées de nombreux problèmes :</p>
<ul>
<li>Quantité de données très importante à transferer entre le client et le serveur Web ;</li>
<li>Requêtes complexes au niveau de la base de données ;</li>
</ul>
<h3>Optimisation de la base de données</h3>
<p>Pour l&#8217;optimisation de la base de données, il faut faire attention aux points suivants :</p>
<ol>
<li>L&#8217;<a href="http://fr.wikipedia.org/wiki/ORM">ORM</a> (<a href="http://pear.php.net/package/DB_DataObject">DB_DataObject</a> dans notre cas)  ne doit faire aucune opération de jointure .  Il utilise toujours une vue dédier pour chaque fonctionnalitées ;</li>
<li>Chaque vue ne calcule que les champs qui sont nécessaire à l&#8217;affichage ; </li>
<li>Le plan d&#8217;execution de chaque vue est optimiser à l&#8217;aide d&#8217;index. Pour trouver quels sont les indexes à créer, il faut utiliser l&#8217;instruction <em>EXPLAIN ANALYSE</em> , comme décrit sur le wiki de Postgres : <a href="http://wiki.postgresql.org/wiki/Using_EXPLAIN">Using EXPLAIN</a>.</li>
</ol>
<p>Le travail principal consiste donc à éxécuter toutes les vues de l&#8217;application pour optimiser les plans d&#8217;éxécution à l&#8217;aide d&#8217;indexes.<br />
Pour mieux comprendre la sortie de l&#8217;instruction EXPLAIN ANALYSE, j&#8217;utilise l&#8217;outil suivant : <a href="http://explain-analyze.info/">explain-analyze.info</a>.</p>
<p>Pour savoir quelles sont les optimisations les plus pertinantes, il est intéressant d&#8217;analyser les logs du serveur Postgres à l&#8217;aide du logiciel <a href="http://pqa.projects.postgresql.org/">Practical Query Analysis</a>.</p>
<p>Il faut aussi &#8220;tuner&#8221; la configuration du serveur de base de données pour utiliser le maximum de la mémoire disponible sur le serveur. </p>
<h3>Javascript</h3>
<p>Nous avons utilisé le framework Javascript <a href="http://mootools.net/">Mootools</a>, le contrôleur de tableau <a href="http://dhtmlx.com/docs/products/dhtmlxGrid/">dhtmlxGrid</a> et l&#8217;éditeur de contenu <a href="http://tinymce.moxiecode.com/">TinyMCE</a>. </p>
<p>Dans chaque page de l&#8217;application, il faut faire attention à ne charger que les fichiers nécessaire.<br />
En effet, ces outils, bien que très pratiques sont très volumineux et augementent la taille des pages dans des proportions importantes.  </p>
<p>Dans certains cas, nous avons dépasser plus de 640Ko de code Javascript dans une page <img src='http://www.csquad.org/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </p>
<p>Les solutions que nous avons mis en place pour réduire la taille de ces fichiers : </p>
<ul>
<li>La compression Gzip, malheureusement nous avons rencontrer de problèmes très importants avec Internet Explorer ;</li>
<li>Nous avons ensuite opter pour <a href="http://www.julienlecomte.net/yuicompressor/">YUI Compressor</a> qui fonctionne bien mieux ;</li>
</ul>
<h3>Systèmes de Cache</h3>
<p>L&#8217;application dispose de nombreux systèmes de caches :</p>
<ul>
<li>Le <a href="http://www.smarty.net/manual/en/caching.php"> système de cache</a> du gestionaire de <em>template</em> <a href="http://www.smarty.net/">Smarty</a> ; </li>
<li>Notre propre système de cache pour le contenu des tableaux, réalisé à l&#8217;aide du module Pear <a href="http://pear.php.net/package/Cache_Lite">Cache_Lite</a> ; </li>
<li>L&#8217;<a href="http://xcache.lighttpd.net/wiki/XcacheApi">API de XCache</a>, pour certains calculs  et <a href="http://xcache.lighttpd.net/">XCache</a> pour les opcodes PHP ;</li>
<li>Le système de cache d&#8217;<a href="http://cocoon.apache.org/">Apache Cocoon</a> pour le système d&#8217;impression ;</li>
<li>La cache du navigateur des utilisateurs. Il est possible de bien contrôler le contenu du navigateur des clients à l&#8217;aide du module <a href="http://httpd.apache.org/docs/2.0/mod/mod_expires.html">mod_expires</a> d&#8217;Apache.</li>
</ul>
<h3>Réduction de la taille des pages</h3>
<p>Nous avons travailler pour réduire au maximum la taille des échanges entre le navigateur web et le serveur.<br />
Pour cela nous avons utilisé la compression <em>Gzip</em> sur :</p>
<ul>
<li>Le contenu des tableaux ;</li>
<li>Les pages produites par le système de tempate ;</li>
</ul>
<p>Celle-ci est réalisé par le gestionnaire de tempon de PHP, à l&#8217;aide de la fonction <a href="http://fr.php.net/ob_gzhandler">ob_gzhandler</a> ;</p>
<h3>Outils utilisés</h3>
<p>L&#8217;optimisation d&#8217;une application est toujours empirique, il est nécessaire d&#8217;avoir de bon outils pour observer les effets des modifications.<br />
Pour cela nous avons utilisé :</p>
<ul>
<li>Le module <a href="http://getfirebug.com/">Firebug</a>  pour Firefox ; </li>
<li>Et son add-ons <a href="http://developer.yahoo.com/yslow/YSlow">YSlow</a>.</li>
</ul>
<h3>Les liens utiles pour l&#8217;optimisation des performances d&#8217;une application Web</h3>
<p>Pour finir, voici quelques liens très interessants sur l&#8217;optimisation d&#8217;une application Web :</p>
<ul>
<li>Le blog <a href="http://performance.survol.fr/">Performance web</a> ;</li>
<li>Sermon de l&#8217;équipe de Yahoo : <a href="http://developer.yahoo.com/performance/index.html#rules">Exceptional Performance</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.csquad.org/2009/02/04/retour-sur-loptimisation-des-performances-du-projet-mavise/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Architecture de gestion de contacts</title>
		<link>http://www.csquad.org/2009/01/11/architecture-de-gestion-de-contacts/</link>
		<comments>http://www.csquad.org/2009/01/11/architecture-de-gestion-de-contacts/#comments</comments>
		<pubDate>Sun, 11 Jan 2009 19:42:37 +0000</pubDate>
		<dc:creator>cscm</dc:creator>
				<category><![CDATA[Debian]]></category>
		<category><![CDATA[Work]]></category>
		<category><![CDATA[LDAP]]></category>

		<guid isPermaLink="false">http://www.csquad.org/?p=73</guid>
		<description><![CDATA[Je vais essayer de décrire l&#8217;architecture que j&#8217;ai mis en place chez moi et que j&#8217;utilise tous les jours pour ma gestion des contacts personnels et professionnels.

Problèmatique
Ma problèmatique est extrêment simple et beaucoup de gens doivent avoir la même :
J&#8217;ai beaucoup de contacts dans mon carnets d&#8217;adresses, je me déplace et j&#8217;utilise plusieurs outils.
Je suis [...]]]></description>
			<content:encoded><![CDATA[<p>Je vais essayer de décrire l&#8217;architecture que j&#8217;ai mis en place chez moi et que j&#8217;utilise tous les jours pour ma gestion des contacts personnels et professionnels.</p>
<p><img src='/wp-content/archi_contacts.png' alt='' /></p>
<h3>Problèmatique</h3>
<p>Ma problèmatique est extrêment simple et beaucoup de gens doivent avoir la même :<br />
J&#8217;ai beaucoup de contacts dans mon carnets d&#8217;adresses, je me déplace et j&#8217;utilise plusieurs outils.</p>
<p>Je suis tête en l&#8217;air et j&#8217;ai  tendance à oublier les coordonnées d&#8217;une personne <img src='http://www.csquad.org/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </p>
<h3>Ma solution</h3>
<p>Elle repose sur les composants suivants :</p>
<ul>
<li>L&#8217;annuaire LDAP : <a href="http://www.openldap.org/">OpenLDAP</a></li>
<li>La suite de logiciel de communication pour KDE : <a href="http://kontact.kde.org/">Kontact</a></li>
<li>Le logiciel de synchronisation : <a href="http://www.opensync.org/">OpenSync</a> et le protocole <a href="http://www.openmobilealliance.org/tech/affiliates/syncml/syncmlindex.html">SyncML</a></li>
<li>Le webmail : <a href="http://www.horde.org/">Horde</a></li>
</ul>
<h3>Stockage des contacts</h3>
<p>Je sais qu&#8217;utiliser un annuaire LDAP pour la gestion des contacts donne l&#8217;impression d&#8217;utiliser un Bazouka pour tuer une mouche.<br />
Mais la technologie LDAP permet de stocker les informations sans être dépendant d&#8217;une solution ou d&#8217;un système de stockage spécifique.</p>
<p>En effet, de nombreux logiciels sont compatibles avec le protocole LDAP et permettent donc d&#8217;accèder à vos contacts. </p>
<p>J&#8217;ai donc installé OpenLDAP sur mon réseau.</p>
<p>Les schèmas LDAP <em>inetorgperson</em> et <em>core</em> et une <em>ou=contacts</em> sur laquel vous avez tous les droits sont nécessaires.</p>
<h3>Gestion des contacts</h3>
<p>Pour la gestion des contacts, j&#8217;utilise le carnet d&#8217;adresse de Kontact.<br />
En effet, celui-ci permet de saisir les informations directement dans l&#8217;Annuaire grâce au système de resource de KDE.<br />
Kontact propose une gestion <em>offline</em> des contacts, permettant de consulter ses contacts sans accès réseau, mais pas de les modifier.</p>
<p>Le schèma LDAP <em>inetorgperson</em> et <em>core</em> ne prend pas en charge tous les attributs de Kontact.<br />
Mais l&#8217;essentiel des informations sont disponibles.</p>
<p>L&#8217;avantage de stocker les données dans une resource KDE est que l&#8217;ensemble des logiciels KDE peuvent utiliser ces données :</p>
<ul>
<li>Kmail peut completer les adresses e-mails issues de l&#8217;annuaire ;</li>
<li>Twinkle permet d&#8217;appeler les numèros de téléphone ; </li>
<li>KMobileTools permet d&#8217;envoyer des SMS ; </li>
</ul>
<h3>Synchonisation des contacts avec le téléphone portable</h3>
<p>Pour la synchronisation des contacts avec mon téléphone portable, un <a href="http://www.nokia.fr/A4363024">Nokia N95</a>,  j&#8217;utilise le logiciel <a href="http://multisync.sourceforge.net/">MultiSync</a>.<br />
Celui-ci permet de synchroniser les contacts issus du carnet d&#8217;adresse KDE  vers le téléphone à l&#8217;aide du protocole SyncML et à l&#8217;aide d&#8217;un dongle Bluetooth.</p>
<p>La configuration est la mise en place de ce système est décrite dans ce Thread du forum Ubuntu :<br />
<a href="http://ubuntuforums.org/showthread.php?t=705103">HOWTO: Sync Evolution with Nokia N95 via Bluetooth on Ubuntu Gutsy</a>.<br />
Le plus simple est de configurer le <em>conduit</em> à l&#8217;aide de l&#8217;interface graphique de <a href="http://www.kontact.org/kitchensync/index.php">kitchensync</a>. </p>
<h3>Webmail</h3>
<p>Pour mon Webmail, j&#8217;ai installé le gestionnaire de contacts sur projet Horde : <a href="http://www.horde.org/turba/">Trean</a>.<br />
Celui-ci dispose d&#8217;un support LDAP assez complet :  <a href="http://wiki.horde.org/ExistingLDAPHowTo#toc12"> LDAP Based Address Book</a></p>
<h3>Intégration avec le système de téléphonie</h3>
<p>L&#8217;intégration avec ma PABX IP se fait à l&#8217;aide du module Asterisk<br />
<a href="http://www.voip-info.org/wiki/view/Asterisk+cmd+LDAPget">LDAPget</a>, qui permet de recherche le numèro de téléphone de l&#8217;appellant dans l&#8217;Annuaire.</p>
<p>J&#8217;ai aussi essayé d&#8217;alimenter le contenu du carnet d&#8217;adresse de mon téléphone DECT à l&#8217;aide du contenu de l&#8217;annuaire LDAP.<br />
Mon téléphone, le <a href="http://www.materiel.net/ctl/Telephonie_fixe/35928-Gigaset_SL560.html">Siemens Gigaset SL560</a>, qui dispose du support Bluetooth.<br />
Mais malheureusement, le protocole utilisé entre le téléphone et le PC n&#8217;est pas standard.<br />
Il faut donc passer par un logiciel propriétaire sous Windows, pour synchroniser ses contacts ;-(</p>
<h3>Problèmatiques et idées d&#8217;évolutions</h3>
<p>Mon système est fonctionnel, même si c&#8217;est parfois artisanal et que certaines problèmatiques sont encore posées :</p>
<ul>
<li>certains logiciels sont encore en phase de développement et donc pas toujours très stables ;</li>
<li>entre l&#8217;annuaire LDAP et les diffèrents composants, il y a toujours une perte d&#8217;informations, toutes les informations ne sont pas toujours disponibles ;</li>
<li>Les composants de l&#8217;architecture ne disposent pas tous de fonctions de filtrages nécessaire.</li>
</ul>
<p>Le principal problème avec la gestion des contacts est leur mise à jours.<br />
En effet,  il faut mettre soit même les informations à jours <img src='http://www.csquad.org/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </p>
<p>C&#8217;est pour cette raison que je pense qu&#8217;une évolution intéressante de mon  architecture,<br />
serait  la mise à jours des informations par les contacts eux mêmes. </p>
<p>Via une simple page web ou bien par la récupèration des informations sur les nombreux réseaux sociaux.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.csquad.org/2009/01/11/architecture-de-gestion-de-contacts/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Validation d&#8217;un fichier CSV à l&#8217;aide d&#8217;un Schéma XML</title>
		<link>http://www.csquad.org/2008/06/03/validation-dun-fichier-csv-a-laide-dun-schema-xml/</link>
		<comments>http://www.csquad.org/2008/06/03/validation-dun-fichier-csv-a-laide-dun-schema-xml/#comments</comments>
		<pubDate>Tue, 03 Jun 2008 06:10:49 +0000</pubDate>
		<dc:creator>cscm</dc:creator>
				<category><![CDATA[Work]]></category>
		<category><![CDATA[CSV]]></category>
		<category><![CDATA[MAVISE]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[XML]]></category>

		<guid isPermaLink="false">http://www.csquad.org/?p=56</guid>
		<description><![CDATA[Malgré tout le mal qu’il est possible de penser ou de dire sur le format de fichier CSV, celui-ci présente beaucoup d’avantages :

il est facilement manipulable pour les utilisateurs à l’aide d’un tableur comme Calc, Gnumeric ou bien Excel ;
il permet d’écrire rapidement et facilement des routines d’import / export ;
il permet d’échanger les données [...]]]></description>
			<content:encoded><![CDATA[<p>Malgré tout le mal qu’il est possible de penser ou de dire sur le format de fichier CSV, celui-ci présente beaucoup d’avantages :</p>
<ul>
<li>il est facilement manipulable pour les utilisateurs à l’aide d’un tableur comme Calc, Gnumeric ou bien Excel ;</li>
<li>il permet d’écrire rapidement et facilement des routines d’import / export ;</li>
<li>il permet d’échanger les données entre des bases et des systèmes hétérogène.</li>
</ul>
<p>Mais ce format de fichier ne dispose pas d’un système de validation. Dans la plupart des cas ce sont les routines d’import / export qui prennent en charge la validation des données et de leur mise en forme.</p>
<p>Ce travail est pénible, répetitif et ennuyeux mais nécessaire si vous ne voulez pas qu’un fichier mal formaté ne corrompe les données de votre base.</p>
<p>L’objectif de cette article est de proposer une solution simple permettant la validation d’un fichier CSV en utilisant les fonctionnalités offertes par les schémas XML.</p>
<p>Les exemples fournis sont écrit à l’aide du language de programmation PHP5.</p>
<h3>Transformation CSV vers XML</h3>
<p>Votre fichier doit contenir sur la 1ère ligne, le nom de chaque cologne :</p>
<p>
<strong>&#8220;CHANNEL&#8221;;&#8221;COMPANY&#8221;;&#8221;BVD_ID_Groupe_1&#8243;;&#8221;BVD_ID_Groupe_2&#8243;;&#8221;GENRE&#8221;;&#8221;URL&#8221;;&#8221;OTHER_URL&#8221;;&#8221;COMPETENT_AUTHORITY&#8221;</strong><br />
&#8220;Canal+ Film 1&#8243;;&#8221;C MORE ENTERTAINMENT AB&#8221;;&#8221;NL33268595&#8243;;&#8221;DE8330261794&#8243;;&#8221;CIN&#8221;;&#8221;http://www.canalplus.se&#8221;;&#8221;http://www.sbsbroadcasting.com/, http://www.prosiebensat1.de/&#8221;;&#8221;RTVV&#8221;<br />
&#8220;Canal+ Film 2&#8243;;&#8221;C MORE ENTERTAINMENT AB&#8221;;&#8221;NL33268595&#8243;;&#8221;DE8330261794&#8243;;&#8221;CIN&#8221;;&#8221;http://www.canalplus.se&#8221;;&#8221;http://www.sbsbroadcasting.com/, http://www.prosiebensat1.de/&#8221;;&#8221;RTVV&#8221;<br />
&#8220;Canal+ Film 2 Sport Weekend&#8221;;&#8221;C MORE ENTERTAINMENT AB&#8221;;&#8221;NL33268595&#8243;;&#8221;DE8330261794&#8243;;&#8221;CIN&#8221;;&#8221;http://www.canalplus.se&#8221;;&#8221;http://www.sbsbroadcasting.com/, http://www.prosiebensat1.de/&#8221;;&#8221;RTVV&#8221;<br />
&#8220;Canal+ Film 3&#8243;;&#8221;C MORE ENTERTAINMENT AB&#8221;;&#8221;NL33268595&#8243;;&#8221;DE8330261794&#8243;;&#8221;CIN&#8221;;&#8221;http://www.canalplus.se&#8221;;&#8221;http://www.sbsbroadcasting.com/, http://www.prosiebensat1.de/&#8221;;&#8221;RTVV&#8221;<br />
&#8220;Canal+ Film HD&#8221;;&#8221;C MORE ENTERTAINMENT AB&#8221;;&#8221;NL33268595&#8243;;&#8221;DE8330261794&#8243;;&#8221;CIN&#8221;;&#8221;http://www.canalplus.se&#8221;;&#8221;http://www.sbsbroadcasting.com/, http://www.prosiebensat1.de/&#8221;;&#8221;RTVV&#8221;
</p>
<p>Pour transformer le fichier CSV en XML, il suffit de lire le fichier CSV avec la fonction fgetcsv et mettre les données dans des balisent XML : <a href="http://svn.csquad.org/misc/csv_xsd/csv_to_xml.php">csv_to_xml.php</a></p>
<p>Une fichier CSV converti en XML ressemble à cela  : <a href="http://svn.csquad.org/misc/csv_xsd/channel.xml">channel.xml</a></p>
<h3>Validation du fichier XML</h3>
<p>Il ne reste plus qu’à écrire le schéma permettant de valider le fichier XML : <a href="http://svn.csquad.org/misc/csv_xsd/channel.xsd">channel.xsd</a></p>
<p>Vous pouvez tester vos schéma en ligne de commande en utilisant la commande <em>xmllint</em> issue du paquet Debian <em>libxml2-utils</em>   :</p>
<blockquote><p><code><br />
$ xmllint --noout --schema channel.xsd channel.xml<br />
channel.xml validates<br />
</code></p></blockquote>
<h3>Validation en PHP</h3>
<p>Une fois que votre schéma est correct et permet de valider le contenu du fichier XML, il faut l’intégrer directement dans votre application : <a href="http://svn.csquad.org/misc/csv_xsd/validate.php">validate.php</a></p>
<h3>Conculsion</h3>
<p>Cette méthode apporte les avantages suivants :</p>
<ul>
<li>Les règles de validation sont décrites directement via le schéma, et celui-ci dispose de nombreuses fonctionnalités tels les types de bases, les expression rationnelle, les séquences, etc…</li>
<li>Les messages d’erreur sont compréhensibles pour l’utilisateur même, s’il faut parfois les traduire (en convertissant les numéros de lignes et certaines notions) ;</li>
<li>La simplicité ;0)</li>
</ul>
<p>Cette technique a été mise en oeuvre dans le cadre du projet <a href="http://mavise.obs.coe.int/">MAVISE</a> pour valider plus d’une vingtaine de formats de fichiers différents.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.csquad.org/2008/06/03/validation-dun-fichier-csv-a-laide-dun-schema-xml/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Système de synchronisation conditionnel  pour PostgreSQL</title>
		<link>http://www.csquad.org/2008/05/30/systeme-de-synchronisation-conditionnel-pour-postgresql/</link>
		<comments>http://www.csquad.org/2008/05/30/systeme-de-synchronisation-conditionnel-pour-postgresql/#comments</comments>
		<pubDate>Fri, 30 May 2008 13:30:33 +0000</pubDate>
		<dc:creator>cscm</dc:creator>
				<category><![CDATA[Work]]></category>
		<category><![CDATA[MAVISE]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[PostgreSQL]]></category>

		<guid isPermaLink="false">http://www.csquad.org/?p=54</guid>
		<description><![CDATA[Il existe des outils tel que SQLSync permettant de synchroniser les données d&#8217;une base PostgreSQL.  Mais cette outil, ne permet pas de faire une copie partiel des données.
Dans la plus part des cas, il faut programmer la synchronisation soit même, l&#8217;objectif de mon article est de vous proposer une solution simple et  élégante.
La [...]]]></description>
			<content:encoded><![CDATA[<p>Il existe des outils tel que <a href="http://silvercoders.com/index.php?page=sqlsync">SQLSync</a> permettant de synchroniser les données d&#8217;une base PostgreSQL.  Mais cette outil, ne permet pas de faire une copie partiel des données.<br />
Dans la plus part des cas, il faut programmer la synchronisation soit même, l&#8217;objectif de mon article est de vous proposer une solution simple et  élégante.</p>
<h3>La problèmatique</h3>
<table>
<tr>
<td><img src='/wp-content/sync.png' alt='' /></td>
<td valign='top'>Des données sensibles se trouvent dans la base principale et il ne faut synchoniser qu&#8217;une partie de ces données vers les autres bases. </p>
<p>L&#8217;architecture dispose des caractèristiques suivantes :</p>
<ul>
<li>Le schèma est identique sur chaque base ;</li>
<li>Les opèrations d&#8217;écriture se font seulement sur la base principale ;</li>
<li>Les bases sont accessibles en réseau.</li>
</ul>
</td>
</tr>
</table>
<h3>La solution</h3>
<p>
Pour résoudre le problème, j&#8217;ai testé plusieurs approches avant de retenir l&#8217;utilisation d&#8217;un fonction de hachage dont voici le principe :</p>
<ul>
<li>chaque table doit disposer d&#8217;un identifiant unique. (champ id de type SERIAL) ;</li>
<li>un programme récupère le couple <em> id</em> et la sum de <em>hachage</em> pour chaque table de chaque base qui doit être synchroniseés ; </li>
<li>il compare le couple et si celui-ci est diffèrent alors les données sont mise à jour.</li>
</ul>
<h3>Implementation au niveau de la base de données</h3>
</p>
<p>
 Le calcul de la somme de hachage se fait un niveau de la base de données à l&#8217;aide d&#8217;un fonction :</p>
<blockquote>
<pre>
SELECT id,md5 FROM get_table_md5('nom_de_la_table');
 id |               md5
----+----------------------------------
  4 | 9f3bcd2fae528244669613ae0466cc3c
  5 | 1f3bcd2fa24528244669613ae66cc3czd
...
(42 row)
</pre>
</blockquote>
<p>Voici le code de la function PL/Perl:</p>
<blockquote>
<pre>
CREATE LANGUAGE plperl;
CREATE TYPE table_md5 AS (id INTEGER, md5 TEXT);
CREATE OR REPLACE FUNCTION get_table_md5(varchar) RETURNS SETOF table_md5 AS $$
    my ($rv, $status, $nrows, $row);
    # Get Table OID
    $rv = spi_exec_query("SELECT c.oid AS oid FROM pg_catalog.pg_class c
        LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace
        WHERE c.relname LIKE '$_[0]';");
    $status = $rv->{status};
    $nrows = $rv->{processed};
    return undef if ($nrows != 1);
    my $oid = $rv->{rows}[0]->{oid};
    # Get Table attributs
    $rv = spi_exec_query("SELECT attname,atttypid FROM pg_catalog.pg_attribute a
        WHERE a.attrelid = $oid AND a.attnum > 0 AND NOT a.attisdropped");
    $status = $rv->{status};
    $nrows = $rv->{processed};
    return undef if ($nrows < 1);
    my $atts;
    my $atts_not_null;
    foreach my $rn (0 .. $nrows - 1) {
        if ($rv->{rows}[$rn]->{atttypid} == 16) {
            $atts .= " (CASE WHEN $rv->{rows}[$rn]->{attname} THEN 't' ELSE 'f' END) AS $rv->{rows}[$rn]->{attname}";
        } else {
            $atts .= " $rv->{rows}[$rn]->{attname}::text";
        }
        $atts_not_null .= " (CASE WHEN $rv->{rows}[$rn]->{attname} IS NULL THEN '' ELSE $rv->{rows}[$rn]->{attname} END)";
        $atts .= ',' if ($rn != $nrows - 1);
        $atts_not_null .= ' || ' if ($rn != $nrows - 1);
    }
    # Calc MD5
    my $sql = "SELECT id, MD5($atts_not_null) AS md5 FROM (SELECT $atts FROM $_[0]) AS $_[0];";
    $rv = spi_exec_query($sql);
    $nrows = $rv->{processed};
    foreach my $rn (0 .. $nrows - 1) {
        return_next({
            id  => $rv->{rows}[$rn]->{id},
            md5 => $rv->{rows}[$rn]->{md5}
        });
    }
    return undef;
$$ LANGUAGE plperl;
</pre>
</blockquote>
<p>Pour utiliser cette fonction vous avez besoin du support du language de programmation PL/Perl dans Postgres, celui-ci se trouve dans le paquet Debian :  <em>postgresql-plperl-<version></version></em>
</p>
<h3>La gestion des conditions</h3>
<p>
Le choix des données à synchroniser se fait individuellement pour chaque table à l&#8217;aide de la clause <em>WHERE</em> de la manère suivante :</p>
<blockquote>
<pre>
SELECT id,md5 FROM get_table_md5('nom_de_la_table') WHERE id IN(SELECT id FROM nom_de_la_table WHERE nom_de_la_table.champ LIKE 'sync');
 id |               md5
----+----------------------------------
  1 | fdd56eabd4bb997e453e33f0022d46c1
(1 row)
</pre>
</blockquote>
<h3>Implementation du script de synchronisation</h3>
<p>
La synchronisation des données peut être réalisée à l&#8217;aide de n&#8217;importe quel language de programmation,<br />
il suffit juste de disposer d&#8217;un accèss à la base de données.
</p>
<p>
Voici un <a href="http://svn.csquad.org/misc/synchro_data/synchro_data.php">exemple de script</a> écrit par  <em>Emmanuel Saracco</em> en PHP5 qui se repose sur les modules <a href="http://pear.php.net">PEAR</a> suivants :</p>
<ul>
<li><a href="http://pear.php.net/package/DB">DB</a> : pour l&#8217;accès à la base de donnée.</li>
<li><a href="http://pear.php.net/package/Console_Getopt">Console_Getopt</a> : pour la gestion de la ligne de commande.</li>
</ul>
<p>Ce script nécessite un fichier de configuration, en voici un <a href="http://svn.csquad.org/misc/synchro_data/synchro_data.ini">exemple</a>.<br />
Ce fichier contiens la configuration des diffèrentes base de données et les conditions sous-forme de clauses where.
</p>
<h3>Conclusion</h3>
<p>Cette méthode de synchronisation fonctionne, elle est en production chez un client pour une base de données de plus de 100 tables, elle permet de synchronisé le contenu d&#8217;une base vers deux autres.<br />
Les avantages de cette méthode sont les suivants :</p>
<ul>
<li>le fait de pouvoir choisir le contenu de la clause <em>where</em> permet de réalisé des <em>régles de synchronisation très complexes</em> ;</li>
<li>les performances sont très bonnes car les transfert réseau sont <em>limités</em> ;</li>
<li>il est possible d&#8217;écrire le script de synchronisation avec n&#8217;importe quel language de programmation.</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.csquad.org/2008/05/30/systeme-de-synchronisation-conditionnel-pour-postgresql/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Mise en place d&#8217;un système de vidéo surveillance avec ZoneMinder</title>
		<link>http://www.csquad.org/2008/02/16/mise-en-place-dun-systeme-de-video-surveillance-avec-zoneminder/</link>
		<comments>http://www.csquad.org/2008/02/16/mise-en-place-dun-systeme-de-video-surveillance-avec-zoneminder/#comments</comments>
		<pubDate>Sat, 16 Feb 2008 21:58:32 +0000</pubDate>
		<dc:creator>cscm</dc:creator>
				<category><![CDATA[Debian]]></category>
		<category><![CDATA[Hardware]]></category>
		<category><![CDATA[Work]]></category>
		<category><![CDATA[ZoneMinder]]></category>

		<guid isPermaLink="false">http://www.csquad.org/?p=51</guid>
		<description><![CDATA[





Au cours de l&#8217;année dernière, j&#8217;ai mis en place un système de vidéo-surveillance à mon domicile, ce système se base sur un serveur sous Debian GNU/Linux et le logiciel libre Zone Minder. 

Au cours de cette mise en place, j&#8217;ai acquis une expèrience sur les technologies de vidéo surveillance.
Suite à de nombreuses demandes de collèges [...]]]></description>
			<content:encoded><![CDATA[<table>
<tr>
<td valign="top">
<img src="http://www.csquad.org/wp-content/ZoneMinderSmall.gif" alt="ZoneMinder" />
</td>
<td valign="top">
<p>Au cours de l&#8217;année dernière, j&#8217;ai mis en place un système de vidéo-surveillance à mon domicile, ce système se base sur un serveur sous Debian GNU/Linux et le logiciel libre Zone Minder. </p>
<p>
Au cours de cette mise en place, j&#8217;ai acquis une expèrience sur les technologies de vidéo surveillance.</p>
<p>Suite à de nombreuses demandes de collèges et amis, je tiens à partager cette expèrience :</p>
<p><a href="http://www.csquad.org/cocoon/tags/public/zoneminder/zoneminder.html">Mise en place d&#8217;un système de vidéo surveillance avec ZoneMinder</a></p>
</td>
</tr>
</table>
]]></content:encoded>
			<wfw:commentRss>http://www.csquad.org/2008/02/16/mise-en-place-dun-systeme-de-video-surveillance-avec-zoneminder/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Mise en place d’un système de publication de contenu basé sur le projet Apache Cocoon et le langage de balises DocBook</title>
		<link>http://www.csquad.org/2008/01/15/mise-en-place-d%e2%80%99un-systeme-de-publication-de-contenu-base-sur-le-projet-apache-cocoon-et-le-langage-de-balises-docbook/</link>
		<comments>http://www.csquad.org/2008/01/15/mise-en-place-d%e2%80%99un-systeme-de-publication-de-contenu-base-sur-le-projet-apache-cocoon-et-le-langage-de-balises-docbook/#comments</comments>
		<pubDate>Tue, 15 Jan 2008 16:27:35 +0000</pubDate>
		<dc:creator>cscm</dc:creator>
				<category><![CDATA[Work]]></category>
		<category><![CDATA[Apache]]></category>
		<category><![CDATA[Cocoon]]></category>
		<category><![CDATA[DocBook]]></category>
		<category><![CDATA[Java]]></category>

		<guid isPermaLink="false">http://www.csquad.org/?p=49</guid>
		<description><![CDATA[Tous les documents disponibles dans la partie publication de mon site web, sont écrit à l&#8217;aide du langage DocBook,
cette méthode permet de séparer fond du document de sa mise en forme et ainsi publier le document dans plusieurs formats (HTML, PDF, Texte, etc&#8230;). 
Cette possibilité forte intéressante, est devenus au fils du temps un handicape. [...]]]></description>
			<content:encoded><![CDATA[<p>Tous les documents disponibles dans la partie publication de mon site web, sont écrit à l&#8217;aide du langage DocBook,<br />
cette méthode permet de séparer fond du document de sa mise en forme et ainsi publier le document dans plusieurs formats (HTML, PDF, Texte, etc&#8230;). </p>
<p>Cette possibilité forte intéressante, est devenus au fils du temps un handicape. </p>
<p>Car la moindre modification d&#8217;un document nécessite la régénération des différents formats d&#8217;export. </p>
<p>J&#8217;ai donc cherché à simplifié et automatisé la procedure de publication. La résultat de ce travail est décrit dans ce document :</p>
<p><a href="http://www.csquad.org/cocoon/tags/public/cocoon/cocoon.html">Mise en place d’un système de publication de contenu basé sur le projet Apache Cocoon et le langage de balises DocBook</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.csquad.org/2008/01/15/mise-en-place-d%e2%80%99un-systeme-de-publication-de-contenu-base-sur-le-projet-apache-cocoon-et-le-langage-de-balises-docbook/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>DNS Secret Key Transaction Authentication (TSIG) support for MyDNS</title>
		<link>http://www.csquad.org/2006/03/14/dns-secret-key-transaction-authentication-tsig-support-for-mydns/</link>
		<comments>http://www.csquad.org/2006/03/14/dns-secret-key-transaction-authentication-tsig-support-for-mydns/#comments</comments>
		<pubDate>Tue, 14 Mar 2006 09:31:49 +0000</pubDate>
		<dc:creator>cscm</dc:creator>
				<category><![CDATA[Network]]></category>
		<category><![CDATA[Work]]></category>
		<category><![CDATA[DNS]]></category>
		<category><![CDATA[MyDNS]]></category>
		<category><![CDATA[TSIG]]></category>

		<guid isPermaLink="false">http://www.csquad.org/?p=28</guid>
		<description><![CDATA[ For Work related reasons,  I&#8217;ve added transaction authentication support for MyDNS version 1.1.0 in tree days for one of our clients.
I&#8217;ve used the source code of ISC Bind, OpenSSL and  RFC 2847 to write my patch.
MyDNS
MyDNS is a free (as freedom) DNS server for UNIX systems. It is designed to serve DNS [...]]]></description>
			<content:encoded><![CDATA[<p> For Work related reasons,  I&#8217;ve added transaction authentication support for <a href="http://mydns.bboy.net/">MyDNS</a> version 1.1.0 in tree days for one of our clients.<br />
I&#8217;ve used the source code of <a href="http://www.isc.org/index.pl?/sw/bind/">ISC Bind</a>, <a href="http://www.openssl.org/">OpenSSL</a> and  <a href="http://www.faqs.org/rfcs/rfc2845.html">RFC 2847</a> to write my patch.</p>
<h3>MyDNS</h3>
<p>MyDNS is a free (as freedom) DNS server for UNIX systems. It is designed to serve DNS records directly from an SQL database (<a href="http://www.mysql.com/">MySQL</a> or <a href="http://www.postgresql.org/">PostgreSQL</a> are supported).<br />
It&#8217;s a very useful software, used by many dynamic <a href="http://www.technopagan.org/dynamic/">DNS providers</a>.<br />
I&#8217;ve used it at <a href="http://www.easter-eggs.com/">work</a> for many projects, because is very easy to manage DNS records with it. But this time we needed to secure dynamic DNS updates.</p>
<h3>TSIG</h3>
<p>This protocol allows for transaction level authentication using shared secrets and one way hashing (with the <a href="http://en.wikipedia.org/wiki/HMAC">HMAC-MD5</a> algorithm).<br />
It can be used to authenticate dynamic updates as coming from an approved client or to authenticate<br />
responses as coming from an approved recursive name server.<br />
It&#8217;s an easy and strong authentication method, simpler than <a href="http://en.wikipedia.org/wiki/DNSSEC">DNSSEC</a>.<br />
If you want more informations about Dynamic DNS Updates with TSIG and Security,  please read this <a href="http://www.lesbell.com.au/Home.nsf/0/3f0a77f02a05e665ca256bee00104c74?OpenDocument">document</a>.</p>
<h3>Installation</h3>
<p>Download and extract the source code of MyDNS version 1.1.0 at <a href="http://mydns.bboy.net/download/">http://mydns.bboy.net/download</a> :</p>
<p><code><br />
$ wget http://mydns.bboy.net/download/mydns-1.1.0.tar.gz<br />
$ tar xzf mydns-1.1.0.tar.gz<br />
</code></p>
<p>Download and apply my patch : <a href="http://www.csquad.org/wp-content/contrib/mydns-1.1.0-tsig.patch">http://www.csquad.org/wp-content/contrib/mydns-1.1.0-tsig.patch</a></p>
<p><code><br />
$ cd mydns-1.1.0<br />
$ wget http://www.csquad.org/wp-content/contrib/mydns-1.1.0-tsig.patch<br />
$ patch -p1 < mydns-1.1.0-tsig.patch<br />
</code></p>
<h3>Build process</h3>
<p>You need to build the program with OpenSSL support :<br />
</code><code><br />
$ ./configure --with-openssl<br />
$ make<br />
# make install<br />
</code></p>
<h3>Database setup</h3>
<p>To create database structure use the &#8216;&#8211;create-table&#8217; option :<br />
<code><br />
$ mydns --create-table | mysql<br />
</code><br />
Transaction Keys are stored in the &#8216;dnskey&#8217; table and the name of the key.<br />
Keyname allowed to update an record are stored in column &#8216;update_key&#8217; of the &#8217;soa&#8217; table.</p>
<p>You can generate you own key with dnssec-keygen tool :<br />
<code><br />
$ dnssec-keygen  -a HMAC-MD5 -b 128 -n HOST client.domain.com<br />
</code></p>
<p>Insert the value of this key in the &#8216;dnskey&#8217; table :<br />
<code><br />
mydns>  INSERT INTO dnskey (name, algorithm, size, type, private) VALUES<br />
                   ('client.domain.com', 'HMAC-MD5', 128, 'HOST', 'IYrqgYuJaTkL2Xs34GZ7+w==');<br />
</code></p>
<p>Add the &#8216;update_acl&#8217; column in the &#8217;soa&#8217; table :<br />
<code><br />
mydns> ALTER TABLE `soa` ADD `update_key` VARCHAR( 255 ) ;<br />
</code></p>
<p>Assign the update key to an DNS entry :<br />
<code><br />
mydns> UPDATE soa SET update_key = 'client.domain.com' WHERE origin='domain.com.';<br />
</code><br />
Restart the MyDNS server and check if the optional column &#8216;update_key&#8217; was found :<br />
<code><br />
    # mydns -v<br />
    ...<br />
    mydns: optional 'update_key' column found in 'soa' table<br />
    ...<br />
</code></p>
<h3>Usage</h3>
<p>Update an domain entry with the nsupdate client :<br />
<code><br />
$ nsupdate -d -y client.domain.com:IYrqgYuJaTkL2Xs34GZ7+w==<br />
> server ns.domain.com<br />
> zone domain.com<br />
> update add entry.domain.com 60 A 192.168.0.1<br />
> send<br />
</code></p>
<h3>Conculsion</h3>
<p>The full RFC in not totaly implanted, thoses features are missing :</p>
<ul>
<li>TCP support, I&#8217;am not an expert of the DNS protocol and I dont fully understand TCP usage and message chunking.</li>
<li>Authentication of responses from an approved recursive name server.</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.csquad.org/2006/03/14/dns-secret-key-transaction-authentication-tsig-support-for-mydns/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
