<?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; Programming</title>
	<atom:link href="http://www.csquad.org/category/programming/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.csquad.org</link>
	<description>Just for fun</description>
	<lastBuildDate>Fri, 14 Jan 2011 08:32:33 +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>xPL Perl update script for Pachube</title>
		<link>http://www.csquad.org/2009/11/27/xpl-perl-update-script-for-pachube/</link>
		<comments>http://www.csquad.org/2009/11/27/xpl-perl-update-script-for-pachube/#comments</comments>
		<pubDate>Fri, 27 Nov 2009 22:29:45 +0000</pubDate>
		<dc:creator>cscm</dc:creator>
				<category><![CDATA[Home automation]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Pachube]]></category>
		<category><![CDATA[Perl]]></category>
		<category><![CDATA[xPL]]></category>

		<guid isPermaLink="false">http://www.csquad.org/?p=805</guid>
		<description><![CDATA[I&#8217;ve wrote a small update script for Pachube based on xPL-Perl.
This module is based on Beanz&#8217;s Net::Pachube module.
I use this script, for my pachube feed.
Setup
The setup is very simple on Debian GNU/Linux, at first you need the Net::Pachube module :
$ wget http://search.cpan.org/CPAN/authors/id/B/BE/BEANZ/Net-Pachube-0.01.tar.gz
$ tar xzf Net-Pachube-0.01.tar.gz
$ cd Net-Pachube-0.01
$ perl Makefile.PL
$ make
...
# make install

Note: the dh-make-perl method [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve wrote a small update script for <a href="http://www.pachube.com/">Pachube</a> based on <a href="http://www.xpl-perl.org.uk/">xPL-Perl</a>.<br />
This module is based on Beanz&#8217;s <a href="http://search.cpan.org/dist/Net-Pachube/">Net::Pachube</a> module.<br />
I use this script, for <a href="http://www.pachube.com/feeds/1934">my pachube feed</a>.</p>
<h3>Setup</h3>
<p>The setup is very simple on Debian GNU/Linux, at first you need the Net::Pachube module :<br />
<code>$ wget http://search.cpan.org/CPAN/authors/id/B/BE/BEANZ/Net-Pachube-0.01.tar.gz<br />
$ tar xzf Net-Pachube-0.01.tar.gz<br />
$ cd Net-Pachube-0.01<br />
$ perl Makefile.PL<br />
$ make<br />
...<br />
# make install<br />
</code><br />
Note: the <em>dh-make-perl</em> method does not work, with this package ;-(</p>
<p>Then you can grab, my <em>xpl-pachube</em> script :</p>
<p><code>$ svn co http://svn.csquad.org/xpl-pachube/<br />
..<br />
# chmod +x xpl-pachube/xpl-pachube<br />
# mv xpl-pachube/xpl-pachube /usr/local/bin<br />
</code></p>
<h3>Run</h3>
<p>You can start the <em>xpl-pachube</em> script in verbose this way :<br />
<code><br />
$ xpl-pachube -key 52b37888404598851de -verbose -feed_id 1934 class=sensor device=cc128.01189.0.1<br />
</code></p>
<p>You need to change the <em>-key</em> and <em>-feed_id</em> arguments.</p>
<p>That&#8217;s all folks!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.csquad.org/2009/11/27/xpl-perl-update-script-for-pachube/feed/</wfw:commentRss>
		<slash:comments>2</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>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>PHP REST SQL, Web Services for dummies</title>
		<link>http://www.csquad.org/2006/06/01/php-rest-sql-web-services-for-dummies/</link>
		<comments>http://www.csquad.org/2006/06/01/php-rest-sql-web-services-for-dummies/#comments</comments>
		<pubDate>Thu, 01 Jun 2006 09:51:02 +0000</pubDate>
		<dc:creator>cscm</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[REST]]></category>
		<category><![CDATA[Web Services]]></category>

		<guid isPermaLink="false">http://www.csquad.org/?p=38</guid>
		<description><![CDATA[Je vous passe l&#8217;ensemble de la propagande habituelle sur les Web Services ( l&#8217;architecture SOA, Annuaires de services, SOAP, etc&#8230;).
Pour ma part, je pense qu&#8217;il existe deux grandes familles de WebServices :

Contrôle : l&#8217;éxécution d&#8217;action
Données : la mise à disposition d&#8217;informations

Pour la première famille, l&#8217;ensemble des  techniques disponibles (SOAP, WSDL, UDDI) couvrent les besoins.
Quant [...]]]></description>
			<content:encoded><![CDATA[<p>Je vous passe l&#8217;ensemble de la propagande habituelle sur les Web Services ( l&#8217;architecture SOA, Annuaires de services, SOAP, etc&#8230;).</p>
<p>Pour ma part, je pense qu&#8217;il existe deux grandes familles de WebServices :</p>
<ul>
<li>Contrôle : l&#8217;éxécution d&#8217;action</li>
<li>Données : la mise à disposition d&#8217;informations</li>
</ul>
<p>Pour la première famille, l&#8217;ensemble des  techniques disponibles (SOAP, WSDL, UDDI) couvrent les besoins.<br />
Quant à la seconde famille, je trouve que ces techniques sont bien trop complexes à mettre en oeuvre.</p>
<h3>Problèmatique</h3>
<p>Imaginons que vous avez besoin de mettre à disposition le contenu d&#8217;une base de données relationnelles ( liste de contacts, tickets, commandes en cours, etc. ) à l&#8217;aide d&#8217;un Service Web.</p>
<p>1/ Solution envisagée : le développement d&#8217;une Interface SOAP spécifique à votre problèmatique </p>
<p>Le développement de celle-ci sera long, car il vous faudra :</p>
<ul>
<li>désigner l&#8217;interface</li>
<li>développer les composants</li>
<li>tester le fonctionnement</li>
<li>écrire la documentation</li>
</ul>
<p>2/ Solution envisagée : adopter la méthodologie REST</p>
<p>J&#8217;ai découvert cette méthodologie suite à un article du journal du Net : <a href="http://developpeur.journaldunet.com/tutoriel/xml/041105-xml-rpc-soap-rest-1b.shtml">SOAP, XML-RPC et EST : différences et intérêts</a></p>
<p>Elle est spécifiée dans le mémoire de Roy Thomas Fielding  : <a href="http://www.ics.uci.edu/~fielding/pubs/dissertation/top.htm">Architectural Styles and the Design of Network-based Software Architectures</a></p>
<p>Ce qui est remarquable dans cette méthodologie, c&#8217;est :</p>
<ul>
<li>sa  simplicité</li>
<li>la réutilisation de protocoles standards éxistants du web</li>
<li>la possiblité de mettre en cache le résultat de la requête de manière transparente.</li>
</ul>
<h3>Le project PHP REST SQL</h3>
<p>Par la suite, j&#8217;ai découvert le projet <a href="http://phprestsql.sourceforge.net/">PHP REST SQL</a>, celui-ci permet de mettre à disposition le contenu d&#8217;une base de données MySQL via une interface Web.</p>
<p>Ce projet consiste en une classe, qui s&#8217;interface avec une base de données MySQL et qui permet à l&#8217;aide de requêtes HTTP de récupèrer les données de la base,  créer, modifier et supprimer des champs.</p>
<h3>Ma contribution : abstraction par rapport aux bases de données</h3>
<p>Actuellement, le projet ne supporte que les bases de type MySQL, j&#8217;ai donc réécrit la classe pour prendre en comptes toutes les bases de données supportées par le module <a href="http://pear.php.net/package/MDB">PEAR MDB</a> ( MySQL, PostGreSQL, Oracle, Frontbase, Querysim, Interbase/Firebird, MSSQL et SQLite). </p>
<p>J&#8217;ai testé son fonctionnement avec 3 bases (MySQL, PostGreSQL et SQLite).</p>
<p>Cette contribution est disponible sur SourceForge : <a href="http://sourceforge.net/tracker/?atid=705494&#038;group_id=126371&#038;func=browse"> database abstraction (MySQL, Postgres and SQLite Support)</a>.</p>
<h3>Installation et Configuration</h3>
<p>Installer et mettre en oeuvre le classe, il suffit de :<br />
1/ Télécharger la classe :</p>
<pre>$ wget 'http://sourceforge.net/tracker/download.php?group_id=126371&#038;atid=705494&#038;file_id=180054&#038;aid=1498241'  -O php_rest_sql.tar.gz</pre>
<p>2/ L&#8217;extracter dans votre  arborescence Web :</p>
<pre>tar xzvf php_rest_sql.tar.gz -C /var/www</pre>
<p>3/ Editer le fichier de configuration <em>phprestsql.ini</em>.</p>
<p>4/ Editer un fichier <em>.htacces</em> et activer le module <em>rewrite</em> dans Apache.</p>
<p>Et voila !<br />
Vous pouvez accéder au contenu de votre base de données directement à l&#8217;aide d&#8217;un navigateur.</p>
<p>Il ne vous reste plus qu&#8217;à écrire un client pour accéder aux données,  à l&#8217;aide de la bibilothèque <a href="http://fr2.php.net/manual/fr/ref.curl.php">PHP CURL</a> par  exemple.</p>
<h3>Conclusion</h3>
<p>J&#8217;ai soumis mon patch à Paul James, l&#8217;auteur du projet et proposé l&#8217;idée de transformer celui-ci en module <a href="http://pear.php.net/">Pear</a>. Il faut savoir que l&#8217;auteur a développé le project <a href="http://tonic.sourceforge.net/">Tonic</a> autour du même concept.  </p>
<p>Mais il s&#8217;agit d&#8217;un veritable <em>framework</em> de développement web et qui par conséquent est beaucoup plus intrusif. </p>
]]></content:encoded>
			<wfw:commentRss>http://www.csquad.org/2006/06/01/php-rest-sql-web-services-for-dummies/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>sqlite_fetch_object for PHP4</title>
		<link>http://www.csquad.org/2006/02/04/sqlite_fetch_object-for-php4/</link>
		<comments>http://www.csquad.org/2006/02/04/sqlite_fetch_object-for-php4/#comments</comments>
		<pubDate>Sat, 04 Feb 2006 12:30:34 +0000</pubDate>
		<dc:creator>cscm</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://www.csquad.org/?p=20</guid>
		<description><![CDATA[The sqlite_fetch_object function  is not implemented in the PECL extension version 1.0.3.
I&#8217;ve rewrite it sqlite_fetch_object in PHP :

// An empty class
class bidon {
}

// Fetch resultset as an object
function sqlite_fetch_object(&#038;$resource){
                $arr =  sqlite_fetch_array($resource);
       [...]]]></description>
			<content:encoded><![CDATA[<p>The <a href="http://fr2.php.net/sqlite_fetch_object">sqlite_fetch_object</a> function  is not implemented in the <a href="http://pecl.php.net/package/SQLite/1.0.3">PECL extension version 1.0.3</a>.<br />
I&#8217;ve rewrite it sqlite_fetch_object in PHP :</p>
<pre>
// An empty class
class bidon {
}

// Fetch resultset as an object
function sqlite_fetch_object(&#038;$resource){
                $arr =  sqlite_fetch_array($resource);
                $obj = new bidon();
                foreach ($arr as $key => $value) {
                        # Check is valid $T_VARIABLE
                        if (ereg("[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*", $key)) {
                                $obj->$key;
                        }
                }
                return $obj;
}
</pre>
<p>Voila</p>
]]></content:encoded>
			<wfw:commentRss>http://www.csquad.org/2006/02/04/sqlite_fetch_object-for-php4/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>XMLHttpRequest.status != 302</title>
		<link>http://www.csquad.org/2006/01/19/xmlhttprequeststatus-302/</link>
		<comments>http://www.csquad.org/2006/01/19/xmlhttprequeststatus-302/#comments</comments>
		<pubDate>Thu, 19 Jan 2006 07:25:37 +0000</pubDate>
		<dc:creator>cscm</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[Ajax]]></category>
		<category><![CDATA[Javascript]]></category>

		<guid isPermaLink="false">http://www.csquad.org/?p=15</guid>
		<description><![CDATA[Je viens de découvrir une nouvelle limitation de l&#8217;objet XMLHttpRequest utilisé par la  méthodologie Ajax.
Celui-ci ne supporte pas les rédirections HTTP envoyées par un serveur web. 
Effectivement, un serveur web peut indiquer au client, via l&#8217;envoi d&#8217;une réponse de type 300 que le document demandé ne se trouve pas à la page indiquée.
L&#8217;objet XMLHttpRequest [...]]]></description>
			<content:encoded><![CDATA[<p>Je viens de découvrir une nouvelle limitation de l&#8217;objet XMLHttpRequest utilisé par la  méthodologie <a href="http://http://www.adaptivepath.com/publications/essays/archives/000385.php">Ajax</a>.<br />
Celui-ci ne supporte pas les rédirections HTTP envoyées par un serveur web. </p>
<p>Effectivement, un serveur web peut indiquer au client, via l&#8217;envoi d&#8217;une réponse de type 300 que le document demandé ne se trouve pas à la page indiquée.</p>
<p>L&#8217;objet XMLHttpRequest suit <strong>automatiquement</strong> les redirections sans vous en informer.</p>
<p>De ce fait, il n&#8217;est pas possible d&#8217;informer le client d&#8217;une redirection envoyée par le serveur.</p>
<p>Nous avons experimenté ce comportement avec tous les navigateurs du marché.</p>
<p>Mes recherches sur ce sujet le confirment :<br />
<a href="http://http://www.codecomments.com/archive361-2005-3-412946.html">http://www.codecomments.com/archive361-2005-3-412946.html</a></p>
<p>Il existe une solution, non portable qui conssiste à utiliser l&#8217;objet <a href="http://http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winhttp/http/winhttprequest.asp">WinHttpRequest</a></p>
<p>Celui-ci propose de nombreuses méthodes supplémentaires, dont notamment la désactivation du suivi des rédirections automatiques : <a href="http://http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winhttp/http/winhttprequestoption.asp">WinHttpRequestOption</a></p>
<p>Mais il n&#8217;est disponible que sous Microsoft Windows &#8230; </p>
<p>Il faut noter, que le suivi automatique des rédirections est une <strong>faille de securité</strong>, car lorsque les redirections bouclent, le navigateur du client plante. </p>
<p>C&#8217;est notamment le cas de Mozilla Firefox, qui est pourtant capable de détecter les <em>boucles de redirection classique</em>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.csquad.org/2006/01/19/xmlhttprequeststatus-302/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Gestion des exceptions SOAP en Perl avec les module SOAP::Lite et Error</title>
		<link>http://www.csquad.org/2006/01/12/gestion-des-exceptions-soap-en-perl-avec-soaplite-et-le-module-error/</link>
		<comments>http://www.csquad.org/2006/01/12/gestion-des-exceptions-soap-en-perl-avec-soaplite-et-le-module-error/#comments</comments>
		<pubDate>Thu, 12 Jan 2006 20:20:14 +0000</pubDate>
		<dc:creator>cscm</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[Perl]]></category>
		<category><![CDATA[SOAP]]></category>
		<category><![CDATA[Web Services]]></category>

		<guid isPermaLink="false">http://www.csquad.org/?p=13</guid>
		<description><![CDATA[Après une longue journée de travail, j&#8217;ai enfin réussi à faire fonctionner correctement le système de gestion d&#8217;exception de SOAP::Lite avec le module Error.  Tout d&#8217;abord quelques explications.
Système de gestion d&#8217;exception
Tout programme en exécution peut être sujet à des erreurs, pour lesquels des stratégies de détection et de réparation sont possibles. Ces erreurs ne [...]]]></description>
			<content:encoded><![CDATA[<p>Après une longue journée de travail, j&#8217;ai enfin réussi à faire fonctionner correctement le système de gestion d&#8217;exception de SOAP::Lite avec le module Error.  Tout d&#8217;abord quelques explications.</p>
<h3>Système de gestion d&#8217;exception</h3>
<p>Tout programme en exécution peut être sujet à des erreurs, pour lesquels des stratégies de détection et de réparation sont possibles. Ces erreurs ne sont donc pas des bogues des programmes, mais des conditions particulières, on parle aussi de conditions exceptionnelles ou exceptions dans le déroulement normal d&#8217;une partie d&#8217;un programme.</p>
<h3>Module Perl Error</h3>
<p>Le module CPAN <a href="http://http://search.cpan.org/~birney/bioperl-1.4/examples/root/lib/Error.pm">Error</a> permet de gérér les exceptions en Perl. Il propose une interface objet semblable à celle disponible dans des langages comme Java ou bien C#.  Le module repose sur la fonction <strong>die</strong> du langage.</p>
<h3>SOAP::Lite</h3>
<p>Le projet <a href="http://soaplite.com/">SOAP::Lite</a> permet de prendre en charge l&#8217;ensemble des protocoles lier aux Web Services (SOAP, WSDL et UDDI). L&#8217;ensemble des fonctionnalitées offertes sont extrèment riches et puissantes. Vous pouvez aussi bien faire un serveur qu&#8217;un client en Perl et vous interfacer avec des Service écrit dans de nombreaux autres langages. </p>
<h3>Entre la théorie et la pratique &#8230;</h3>
<p>L&#8217;ensemble des interactions sont décrites dans les spécifications des protocoles de Web Services. Mais comme présque toujours en informatique, chaque constructeur, langage ou implémentation apporte son lot de spécificitées.</p>
<p>Dans le cas du langage Perl, les deux principaux sont l&#8217;absence :</p>
<ul>
<li>de typage</li>
<li>d&#8217;un système de gestion d&#8217;exception</li>
</ul>
<p>Le permier problème se controurne à l&#8217;aide de la déclaration des type dans un fichier WSDL.<br />
Pour le second, j&#8217;ai eu un peu plus de mal avant de trouver la solution.</p>
<h3>A propos du code source de SOAP::Lite</h3>
<p>Ce n&#8217;est vraiment pas un exemple à suivre :</p>
<ul>
<li>très peu de commentaires dans le code</li>
<li>seul fichier de <strong>5000</strong> lignes</li>
<li>le mode de debug trace n&#8217;est pas assez verbeux</li>
<li>on se demande souvent si l&#8217;auteur du module n&#8217;a pas coder sous l&#8217;imfluence de certaines drogues</li>
</ul>
<h3>L&#8217;anomalie de fonctionnement</h3>
<p>Lorsqu&#8217;une exception est levée à l&#8217;aide de la fonction throw dans un module Perl elle créer un objet pour indiquer des informations sur le contexte de l&#8217;erreur. L&#8217;objet le plus simple est <em>Error::Simple</em> </p>
<pre>
sub foo {
   throw Error::Simple( "A simple error");
}
</pre>
<p>Il est possible de créer vos propres objets en utilisant l&#8217;héritage en utilisant l&#8217;objet <em>Error</em> comme base.</p>
<p>La framework SOAP::Lite détourne la fonction <em>die</em> et renvoie une exception SOAP qui contiens un objet.  La problème est que cela ne fonctionne pas correctement :</p>
<pre>
 SOAP Fault :
        Fault String : Application error
        Fault Detail :  {
<strong>          'Error__Simple' => {
                             '-file' => 'Demo.pm',
                             '-text' => 'A simple error',
                             '-package' => 'Demo',
                             '-line' => '9'
                           }</strong>
        };

        Fault Actor  : http://localhost:4242/
</pre>
<p>Le contenu de Fault Detail n&#8217;est pas un objet MAIS une table de HASH.<br />
De plus un message d&#8217;erreur du côte du serveur vous indique qu&#8217;il y&#8217;a visiblement un problème avec la serialisation : </p>
<pre> Use of uninitialized value in sprintf at /usr/share/perl5/SOAP/Lite.pm line 814.
Cannot encode 'namesp1:something' element as 'hash'. Will be encoded as 'map' in  stead</pre>
<p>Après quelques heures de tatonnement et de recherche dans le code source de SOAP::Lite, j&#8217;ai trouver la source du problème.</p>
<p>Les attributs du module Error contiennent tous un préfixe qui fait échouer la serialization : </p>
<pre>
$VAR1 =  bless( {
        '-file' => '...',
        '-text' => '...',
        '-package' => '...',
        '-line' => '...'
        }, 'BadError')
</pre>
<p>La fonction résponsable de ce bug est <em>SOAP::Serializer::encode_hash</em>.<br />
Une expression régulier empeche la serialisation d&#8217;un caractère &#8216;-&#8217; dans le flux XML.</p>
<p>J&#8217;ai donc déciser de supprimer le caractère &#8216;-&#8217; dans le nom des attributs à l&#8217;aide du boût de code suivant :</p>
<pre>
sub encode_hash {

my($self, $hash, $name, $type, $attr) = @_;

  while(my ($k, $v) = each (%$hash))
  {
    if ($k =~ m/^-/)
    {
        $k =~ s/^-//;
        $hash->{$k} = $v;
        delete $hash->{'-'.$k};
    }
  }

  if ($self->autotype &#038;&#038; grep {!/$SOAP::Constants::ELMASK/o} keys %$hash) {
</pre>
<p>Et Voilà !</p>
<p>Cela fonctionne enfin correctement :</p>
<pre>
 SOAP Fault :
        Fault String : Application error
        Fault Detail :  {
                             'detail' => bless ( {
                             '-file' => 'Demo.pm',
                             '-text' => 'A simple error',
                             '-package' => 'Demo',
                             '-line' => '9'
                           }, 'Error::Simple')
        };

        Fault Actor  : http://localhost:4242/
</pre>
<p>Je vais contacter l&#8217;auteur du module pour trouver une solution plus propore ;0)<br />
Mais en attendant celle-ci fonctionne correctement.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.csquad.org/2006/01/12/gestion-des-exceptions-soap-en-perl-avec-soaplite-et-le-module-error/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Génération dynamique de fichiers WSDL avec Perl</title>
		<link>http://www.csquad.org/2005/11/26/generation-dynamique-de-fichiers-wsdl-avec-perl/</link>
		<comments>http://www.csquad.org/2005/11/26/generation-dynamique-de-fichiers-wsdl-avec-perl/#comments</comments>
		<pubDate>Sat, 26 Nov 2005 21:22:58 +0000</pubDate>
		<dc:creator>cscm</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[Perl]]></category>
		<category><![CDATA[Web Services]]></category>
		<category><![CDATA[WSDL]]></category>

		<guid isPermaLink="false">http://www.csquad.org/?p=7</guid>
		<description><![CDATA[Dans le cadre de mon travail, je devais rendre accesible via des Web Services un ensemble de modules écrits en Perl. 
Pour que les interfaces d&#8217;un module soient accessible via SOAP, il faut les décrire à l&#8217;aide du langage WSDL. 
Le format WSDL est basé sur XML, il est relativement difficile de le comprendre et [...]]]></description>
			<content:encoded><![CDATA[<p>Dans le cadre de mon travail, je devais rendre accesible via des Web Services un ensemble de modules écrits en Perl. </p>
<p>Pour que les interfaces d&#8217;un module soient accessible via <a href="http://www.w3.org/TR/soap/">SOAP</a>, il faut les décrire à l&#8217;aide du langage <a href="http://www.w3.org/TR/wsdl">WSDL</a>. </p>
<p>Le format WSDL est basé sur XML, il est relativement difficile de le comprendre et encore plus de l&#8217;écrire à la main.<br />
C&#8217;est pour cette raison que la plupart des langages de programmation proposent des outils de géneration automatique. </p>
<p>Le principale problème que l&#8217;ont peut rencontrer avec ce genre d&#8217;outils est le manque de contrôle. </p>
<p>Pour palier à ce problème, Perl propose une solution remarquable : décrire l&#8217;interface à l&#8217;aide de commentaires directement dans le code.</p>
<p>Effectivement à l&#8217;aide du module <a href="http://http://search.cpan.org/~tareka/Pod-WSDL-0.03/lib/Pod/WSDL.pm">Pod::WSDL</a>, il est possible d&#8217;extraire les informations nécessaires pour créer le fichier de déscription d&#8217;interface.</p>
<p>Par exemple :</p>
<p><code>=begin WSDL</p>
<p>_IN $bar $string description du paramètre<br />
_RETURN $string<br />
_FAULT Error::Simple Le type d'éxception déclancher en cas d'erreur<br />
_DOC description rapide du fonctionnement de ma fonction</p>
<p>=cut</p>
<p>sub foo ($) {<br />
  my $bar = shift;<br />
  return $bar;<br />
}</code></p>
<p>Ensuite, il ne reste plus qu&#8217;à charger le module précédant et extraire les informations pour produire le fichier WSDL, à l&#8217;aide du bout de code suivant:</p>
<p><code>use Pod::WSDL;</p>
<p>my $pod = new Pod::WSDL(<br />
    source => 'My::Server',<br />
    location => 'http://localhost/My/Server',<br />
    pretty => 1,<br />
    withDocumentation => 1);</p>
<p>print $pod->WSDL;</code></p>
<p>Celui-ci vous affiche le fichier WSDL, directement sur la sortie standard.</p>
<p>Les fichiers produits par Pod::WSDL sont conformes aux spécifications et fonctionnent parfaitement.<br />
Je les ai testé avec <a href="http://search.cpan.org/dist/SOAP-Lite/lib/OldDocs/SOAP/Lite.pm">SOAP::Lite</a> et le framework <a href="http://ws.apache.org/axis/index.html">Apache Axis</a>.</p>
<p>Nous avons une jolie solution pour créer des fichiers WSDL directement lors de l&#8217;installation de nos modules.</p>
<p>Néanmoins j&#8217;ai voulu pousser le concept de génération dynamique un peu plus loin. </p>
<p>Tout simplement parce que mon interface SOAP est séparée des modules qu&#8217;elle met à disposition (dans deux paquets différents).</p>
<p>Dans Web Services, il y a la notion de Web. J&#8217;ai donc mis à contribution le framework <a href="http://www.masonhq.com/">Mason</a>, qui est un outil de template permetant de faire des sites web dynamiques en Perl.</p>
<p>Celui-ci dispose deux fonctionnalités intéressantes :</p>
<ul>
<li>un système de cache ;</li>
<li>un système de gestion de page non disponible.</li>
</ul>
<p>Le système d<a href="http://ws.apache.org/axis/index.html">e </a><a href="http://www.masonhq.com/docs/manual/Devel.html#dhandlers">gestion de page non disponbile</a>, permet de créer des pages web dynamiquement en fonction de l&#8217;url demander. </p>
<p>Le fichier dhandler suivant permet de créer dynamiquement un fichier WSDL en fonction du nom du module Perl:<br />
<code><br />
< %once><br />
  use Pod::WSDL;<br />
  use strict;<br />
< %once><br />
< %init><br />
    my $arg = $m->dhandler_arg;<br />
    $arg =~ s/\.wsdl//;<br />
    my $pod;</p>
<p>    eval {<br />
        $pod = new Pod::WSDL(<br />
            source => $arg,<br />
            location => 'http://localhost/soapEndPoint',<br />
            pretty => 1,<br />
            withDocumentation => 0<br />
        );<br />
    };<br />
    if ($@) {<br />
        return 404;<br />
    }<br />
    $m->out($pod->WSDL);<br />
< /%init><br />
</code></p>
<p>Par exemple pour récupèrer le fichier WSDL pour le module Test, il suffit d&#8217;aller sur l&#8217;url : <em>http://localhost/Test.wsdl</em>.</p>
<p>L&#8217;opèration de géneration est rélativement rapide, mais dans le cas d&#8217;un service fortement solicité, il faut mettre en place un système de cache, comme celui décrit dans la documentation de Mason : <a href="http://www.masonhq.com/docs/manual/Devel.html#data_caching">DATA CACHING</a></p>
<p>Voilà</p>
]]></content:encoded>
			<wfw:commentRss>http://www.csquad.org/2005/11/26/generation-dynamique-de-fichiers-wsdl-avec-perl/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>

