<?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; Perl</title>
	<atom:link href="http://www.csquad.org/tag/perl/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>xPL Automatic Speech Recognition with Julius</title>
		<link>http://www.csquad.org/2009/10/23/xpl-automatic-speech-recognition-with-julius/</link>
		<comments>http://www.csquad.org/2009/10/23/xpl-automatic-speech-recognition-with-julius/#comments</comments>
		<pubDate>Fri, 23 Oct 2009 14:26:26 +0000</pubDate>
		<dc:creator>cscm</dc:creator>
				<category><![CDATA[Home automation]]></category>
		<category><![CDATA[Julius]]></category>
		<category><![CDATA[Perl]]></category>
		<category><![CDATA[Speech recognition]]></category>
		<category><![CDATA[xPL]]></category>

		<guid isPermaLink="false">http://www.csquad.org/?p=735</guid>
		<description><![CDATA[I&#8217;ve wrote a very small Perl module for interfacing my home automation  Speech Recognition Engine based on Julius with the xPL Network. 
The goal of this xpl-perl module, is to broadcast recognised speech.
I&#8217;ve described the ASR xPL schema on the project forum : ASR.BASIC Schema proposal
You need a working Julius installation running in monitor [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve wrote a very small Perl module for interfacing my home automation  <a href="http://en.wikipedia.org/wiki/Speech_Recognition">Speech Recognition Engine</a> based on <a href="http://julius.sourceforge.jp/en_index.php">Julius</a> with the <a href="http://xplproject.org.uk/">xPL Network</a>. </p>
<p>The goal of this <a href="http://www.xpl-perl.org.uk/">xpl-perl module</a>, is to broadcast recognised speech.</p>
<p>I&#8217;ve described the ASR xPL schema on the project forum : <a href="http://xplproject.org.uk/forums/viewtopic.php?f=2&#038;t=877">ASR.BASIC Schema proposal</a></p>
<p>You need a working Julius installation running in monitor mode (listening on the network) and an xpl-perl setup. </p>
<p>Here is an sample command output :<br />
<code>$ julius -input file -C julian.jconf<br />
...<br />
Stat: server-client: socket ready as server<br />
///////////////////////////////<br />
///  Module mode ready<br />
///  waiting client at 10500<br />
/////////////////////////////// </code><br />
In others windows, you must run <em>xpl-asr-julius</em> and <em>xpl-logger</em>.<br />
When you speak or send a wav file to Julius, the reconised text is broadcasted on the network :<br />
<code>### read waveform input<br />
enter filename->  test.wav<br />
Stat: adin_file: input speechfile: test.wav<br />
STAT: 180003 samples (3.75 sec.)<br />
STAT: ### speech analysis (waveform -> MFCC)<br />
STAT: 00 _default: 17 generated, 17 pushed, 6 nodes popped in 1123<br />
</code><br />
xpl-logger output :<br />
<code>10.0.0.242:53922 [xpl-trig/asr.basic: bnz-julius.nux -> * - &lt;s&gt; éteindre lumière chambre &lt;/s&gt;]</code></p>
<h3>Installation</h3>
<p>The setup is very simple on Debian GNU/Linux. Just fallow thoses instructions :<br />
<code>$ wget http://www.csquad.org/wp-content/contrib/xpl-asr-julius/xPL-ASR-Julius-0.01.tar.gz<br />
$ tar xzf xPL-ASR-Julius-0.01.tar.gz<br />
$ dh-make-perl xPL-ASR-Julius-0.01<br />
$ cd xPL-ASR-Julius-0.01<br />
$ dpkg-buildpackage -b<br />
# dpkg -i ../libxpl-asr-julius-perl*.deb<br />
</code></p>
<p>That&#8217;s all ! </p>
]]></content:encoded>
			<wfw:commentRss>http://www.csquad.org/2009/10/23/xpl-automatic-speech-recognition-with-julius/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Archivage des messages xPL dans une base de données</title>
		<link>http://www.csquad.org/2009/09/26/archivage-des-messages-xpl-dans-une-base-de-donnees/</link>
		<comments>http://www.csquad.org/2009/09/26/archivage-des-messages-xpl-dans-une-base-de-donnees/#comments</comments>
		<pubDate>Sat, 26 Sep 2009 10:44:03 +0000</pubDate>
		<dc:creator>cscm</dc:creator>
				<category><![CDATA[Debian]]></category>
		<category><![CDATA[Home automation]]></category>
		<category><![CDATA[Monit]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[Perl]]></category>
		<category><![CDATA[xPL]]></category>

		<guid isPermaLink="false">http://www.csquad.org/?p=537</guid>
		<description><![CDATA[Voici la procédure pour archiver les messages de votre réseau xPL dans une base de données MySQL.
L&#8217;objectif
Beanz, l&#8217;auteur du projet xpl-perl a supprimé la fonctionnalité du projet dans la version 0.08. 
Cette fonctionnalité répond à un besoin très spécifique.
Archiver TOUS les messages dans une base de données MySQL demande beaucoup de ressources.
Sur mon petit réseau [...]]]></description>
			<content:encoded><![CDATA[<p>Voici la procédure pour archiver les messages de votre réseau <a href="http://xplproject.org.uk/">xPL</a> dans une base de données MySQL.</p>
<h3>L&#8217;objectif</h3>
<p>Beanz, l&#8217;auteur du projet <a href="http://www.xpl-perl.org.uk/">xpl-perl</a> a supprimé la fonctionnalité du projet dans la version 0.08. </p>
<p>Cette fonctionnalité répond à un besoin très spécifique.<br />
Archiver <strong>TOUS</strong> les messages dans une base de données MySQL demande beaucoup de ressources.<br />
Sur mon petit <a href="http://www.csquad.org/installation-domotique/">réseau domotique</a>, j&#8217;ai déjà plus de 25 messages par minute.</p>
<p>Ce qui produit une base de données importante avec 100 000 entrées par semaine, soit 500 000 par mois, 6 000 000 par an. </p>
<p>Et la taille de la base de données fait dans les 50 Mo par semaine, soit 250Mo par mois, 3Go par an. </p>
<p>Donc pour stocker ces données vous devez en avoir vraiment besoin. C&#8217;est mon cas, car :</p>
<ul>
<li>Je veux conserver la consommation électrique exact de chaque appareil ;</li>
<li>Utiliser des optimisations à l&#8217;aide d&#8217;un <a href="http://fr.wikipedia.org/wiki/R%C3%A9seau_de_neurones">réseau de neurones</a>. </li>
</ul>
<h3>Installation</h3>
<p>Vous devez disposer d&#8217;un réseau xPL fonctionnel et d&#8217;une installation de xpl-perl. </p>
<h4>Programme</h4>
<p>Nous allons récupèrer le code des modules directement dans le svn.</p>
<p><code><br />
# cd /usr/share/perl5/xPL<br />
# wget http://www.xpl-perl.org.uk/export/892/xpl-perl/branches/r0.08/lib/xPL/SQL.pm<br />
# sed -i -e  's#/etc/xpl-perl/db.config#/etc/xplperl/db.config#' SQL.pm<br />
# cd /usr/bin<br />
# wget http://www.xpl-perl.org.uk/export/892/xpl-perl/branches/r0.08/bin/xpl-sql-logger<br />
# chmod +x xpl-sql-logger<br />
# apt-get install libclass-dbi-loader-perl libdatetime-perl<br />
# cd /etc/xplperl<br />
# cat < <EOF > db.config<br />
dsn=dbi:mysql:xpl:localhost<br />
user=xpl<br />
password=secret<br />
EOF<br />
#<br />
</code></p>
<h4>Base de données</h4>
<p>Une fois que vous avez installé le programme, il est nécessaire de configurer la base de données.</p>
<p>Pour cela vous devez créer un utilisateur <em>xpl</em> et une base de données <em>xpl</em> sur votre serveur MySQL.<br />
Ensuite vous créer les tables de la base de données à l&#8217;aide des requêtes SQL suivantes :<br />
<code><br />
  CREATE TABLE body (<br />
    id int NOT NULL auto_increment,<br />
    body varchar(1500) default NULL,<br />
    PRIMARY KEY  (id),<br />
    KEY body_idx (body(1000))<br />
  );<br />
  CREATE TABLE elt (<br />
    id int NOT NULL auto_increment,<br />
    name varchar(16) default NULL,<br />
    value varchar(128) default NULL,<br />
    PRIMARY KEY  (id),<br />
    KEY name_idx (name)<br />
  );<br />
  CREATE TABLE msg (<br />
    id int NOT NULL auto_increment,<br />
    time int default NULL,<br />
    usec int default NULL,<br />
    type char(8) default NULL,<br />
    source varchar(34) default NULL,<br />
    target varchar(34) default NULL,<br />
    class varchar(15) default NULL,<br />
    incomplete int default NULL,<br />
    body int default NULL,<br />
    PRIMARY KEY  (id),<br />
    KEY class_idx (class),<br />
    KEY time_idx (time,usec),<br />
    KEY type_idx (type),<br />
    KEY body_idx (body)<br />
  );<br />
  CREATE TABLE msgelt (<br />
    id int NOT NULL auto_increment,<br />
    msg int NOT NULL,<br />
    elt int NOT NULL,<br />
    PRIMARY KEY  (id),<br />
    KEY msg_idx (msg),<br />
    KEY elt_idx (elt)<br />
  );<br />
</code></p>
<h4>Lancement et recette</h4>
<p>Vous pouvez ensuite lancer le programme en ligne de commande :<br />
<code>$ xpl-sql-logger</code><br />
Vous pouvez ensuite vérifier que cela fonctionne dans la base de données :<br />
<code>mysql> SELECT * FROM `msg` ORDER BY id DESC LIMIT 3;<br />
+---------+------------+--------+----------+----------------+--------+--------------+------------+<br />
| id      | time       | usec   | type     | source         | target | class        | incomplete |<br />
+---------+------------+--------+----------+----------------+--------+--------------+------------+<br />
| 7711941 | 1253948224 | 252455 | xpl-trig | bnz-ccost.milk | *      | sensor.basic |          0 |<br />
| 7711931 | 1253948224 | 211170 | xpl-trig | bnz-ccost.milk | *      | sensor.basic |          0 |<br />
| 7711921 | 1253948224 | 130241 | xpl-trig | bnz-ccost.milk | *      | sensor.basic |          0 |<br />
+---------+------------+--------+----------+----------------+--------+--------------+------------+<br />
3 rows in set (0.00 sec)</code></p>
<h4>Lancement automatique</h4>
<p>Vous pouvez lancer automatiquement le programme à l&#8217;aide de <em>daemontools</em> en plaçant le programme dans le répertoire <em>/etc/services</em> de la manière suivante :<br />
<code><br />
# cd /etc/xplperl/service<br />
# cp -r xpl-hub xpl-sql-logger<br />
# cd xpl-sql-logger<br />
# cat < <EOF > run<br />
#!/bin/sh<br />
exec 2>&#038;1<br />
exec setuidgid xplperl envdir ./env softlimit -d300000 /usr/bin/xpl-sql-logger<br />
EOF<br />
# cd /etc/service<br />
# ln -s /etc/xplperl/service/xpl-sql-logger/<br />
# ps auxww | grep xpl-sql-logger<br />
root      3306  0.0  0.0   1620   332 ?        S    Sep22   0:00 supervise xpl-sql-logger<br />
xplperl  23943  1.3  0.6  16944 12952 ?        S    08:20   0:37 /usr/bin/perl -w /usr/bin/xpl-sql-logger<br />
</code></p>
<h4>Surveillance de l&#8217;archivage</h4>
<table>
<tr>
<td valign='top'><img src="http://www.csquad.org/wp-content/uploads/2009/09/whoweare.png" alt="monit logo" title="monit logo" width="55" height="64" class="size-full wp-image-539" /></td>
<td>
Le système fonctionne très bien. Par contre, j&#8217;ai rencontré quelques problèmes au bout d&#8217;une ou deux semaines le programme arrête d&#8217;archiver les données dans la base, il faut donc le relancer.<br />
La solution la plus simple et de relancer le script à l&#8217;aide d&#8217;un cron et <a href="http://mmonit.com/monit/">monit</a></td>
</tr>
</table>
<p>.<br />
Voici mon crontab :<br />
<code><br />
*/1 * * * * echo "SELECT NOW() - FROM_UNIXTIME(time)  FROM msg ORDER BY id DESC LIMIT 1;" | mysql -hlocalhost -uxpl -psecret -s xpl > /tmp/xpl-sql-logger<br />
</code></p>
<p>Voici ma configuration pour monit dans le fichier <em>/etc/monit.d/xpl-sql-logger</em> :<br />
<code><br />
check file xpl-sql-logger with path /tmp/xpl-sql-logger<br />
if match "^[0-9]{1,2}"  then stop<br />
stop program = "/usr/bin/killall -r xpl-sql-logger"<br />
</code></p>
<h3>Exploitation des données</h3>
<p>Pour exploiter les données, je suis en train d&#8217;écrire des gadgets pour <a href="http://www.portaneo.com/solutions/en/opensource.php">Portaneo</a> (P.O.S.H) à afin de pouvoir afficher les données sous forme de graphiques <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/09/26/archivage-des-messages-xpl-dans-une-base-de-donnees/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>xPL Text-to-Speech module</title>
		<link>http://www.csquad.org/2009/08/11/xpl-text-to-speech-module/</link>
		<comments>http://www.csquad.org/2009/08/11/xpl-text-to-speech-module/#comments</comments>
		<pubDate>Tue, 11 Aug 2009 16:17:18 +0000</pubDate>
		<dc:creator>cscm</dc:creator>
				<category><![CDATA[Home automation]]></category>
		<category><![CDATA[eSpeak]]></category>
		<category><![CDATA[Perl]]></category>
		<category><![CDATA[Text-to-Speech]]></category>
		<category><![CDATA[xPL]]></category>

		<guid isPermaLink="false">http://www.csquad.org/?p=404</guid>
		<description><![CDATA[I&#8217;ve wote an Text-to-Speech module for xPL Perl based on eSpeak and the Speech::eSpeak Perl module.
The xPL TTS.BAISC schema is very basic, but suffisent for my text-to-speech needs.
Setup on Debian GNU/Linux
You should install the fallowing packages with apt :
 # apt-get install libespeak-dev dh-make-perl espeak-data devscripts
And build the Perl module :
# cd /usr/src
# wget http://search.cpan.org/CPAN/authors/id/H/HG/HGNENG/Speech-eSpeak-0.3.tar.gz
# [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve wote an <a href="http://en.wikipedia.org/wiki/Speech_synthesis">Text-to-Speech module</a> for <a href="http://www.xpl-perl.org.uk/">xPL Perl</a> based on <a href="http://espeak.sourceforge.net/">eSpeak</a> and the <a href="http://search.cpan.org/dist/Speech-eSpeak/lib/Speech/eSpeak.pm">Speech::eSpeak</a> Perl module.</p>
<p>The xPL <a href="http://wiki.xplproject.org.uk/index.php/Schema_-_TTS.BASIC">TTS.BAISC</a> schema is very basic, but suffisent for my text-to-speech needs.</p>
<h3>Setup on Debian GNU/Linux</h3>
<p>You should install the fallowing packages with apt :<br />
<code> # apt-get install libespeak-dev dh-make-perl espeak-data devscripts</code></p>
<p>And build the Perl module :<br />
<code># cd /usr/src<br />
# wget http://search.cpan.org/CPAN/authors/id/H/HG/HGNENG/Speech-eSpeak-0.3.tar.gz<br />
# tar xzf Speech-eSpeak-0.3.tar.gz<br />
# dh-make-perl Speech-eSpeak-0.3<br />
# cd Speech-eSpeak-0.3<br />
# debuild<br />
# dpkg -i dpkg -i ../libspeech-espeak-perl*<br />
</code></p>
<p>Get my source code :<br />
<code># wget http://www.csquad.org/wp-content/contrib/eSpeak.pm -O /usr/share/perl5/xPL/Dock/eSpeak.pm<br />
# wget http://www.csquad.org/wp-content/contrib/xpl-tts -O /usr/bin/xpl-tts<br />
# chmod +x /usr/bin/xpl-tts<br />
</code></p>
<h3>Usage exemples</h3>
<p>Launch the <em>xpl-tts</em> program :<br />
<code>$ xpl-tts -espeak-verbose -espeak-voice-language en -espeak-voice-gender 2 -espeak-voice-age 42</code><br />
Then, send an xpl command on the network :<br />
<code>$ xpl-sender -m xpl-cmnd -c tts.basic speech="xPL rocks everything"<br />
</code></p>
<p>You should hear the synthesized voice.</p>
<p>And Voila <img src='http://www.csquad.org/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </p>
<h3>Bugs and evolutions</h3>
<p>I will submit this module to the xpl-perl project and try to implement  <a href="http://tcts.fpms.ac.be/synthesis/mbrola.html">MBROLA</a> project support. Because I&#8217;ve got a more humain voices.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.csquad.org/2009/08/11/xpl-text-to-speech-module/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Retour d&#8217;expérience sur la personnalisation du logiciel libre de gestion d&#8217;incident « Request Tracker »</title>
		<link>http://www.csquad.org/2006/02/11/retour-dexperience-sur-la-personnalisation-du-logiciel-libre-de-gestion-dincident-%c2%ab-request-tracker-%c2%bb/</link>
		<comments>http://www.csquad.org/2006/02/11/retour-dexperience-sur-la-personnalisation-du-logiciel-libre-de-gestion-dincident-%c2%ab-request-tracker-%c2%bb/#comments</comments>
		<pubDate>Sat, 11 Feb 2006 09:20:56 +0000</pubDate>
		<dc:creator>cscm</dc:creator>
				<category><![CDATA[Work]]></category>
		<category><![CDATA[Perl]]></category>
		<category><![CDATA[Request Tracker]]></category>

		<guid isPermaLink="false">http://www.csquad.org/?p=23</guid>
		<description><![CDATA[Après plusieurs mois de travail sur la personnalisation de cet outils pour un client, j&#8217;ai le plaisir de vous presenter un article qui décrit notre travail.
Mais tout d&#8217;abord une rapide présentation du logiciel.
Request Tracker
RT est un logiciel libre de gestion d&#8217;incident, en anglais ticketing, il permet la prise en charge des demandes client. Lorsqu&#8217;un problème [...]]]></description>
			<content:encoded><![CDATA[<p>Après plusieurs mois de travail sur la personnalisation de cet outils pour un client, j&#8217;ai le plaisir de vous presenter un article qui décrit notre travail.<br />
Mais tout d&#8217;abord une rapide présentation du logiciel.</p>
<h3>Request Tracker</h3>
<p><a href="http://www.bestpractical.com/rt/">RT</a> est un logiciel libre de gestion d&#8217;incident, en anglais ticketing, il permet la prise en charge des demandes client. Lorsqu&#8217;un problème survient chez un de nos clients (plantage serveur, coupure de service, etc&#8230;) celui-ci envoie un mail ou bien téléphonne au support pour signaler l&#8217;incident.<br />
Cet incident donne lieu à un ticket qui sera pris en charge par le support technique.<br />
Grace à ce système : </p>
<ul>
<li>Les clients peuvent suivre en temps réel, la résolution de l&#8217;incident</li>
<li>Communiquer avec le support</li>
<li>Le support facture les interventions</li>
<li>L&#8217;ensemble des interventions sont archivées.</li>
</ul>
<p>Nous utilisons ce système chez <a href="http://www.easter-eggs.com/">Easter-eggs</a> depuis près de 3ans avec succés et nous en sommes très content, comme <a href="http://www.bestpractical.com/rt/praise.html">beaucoup d&#8217;autres</a>.<br />
La mise en place de système est assez complexe et nécessite de bonnes compétances en administration système et en programmation Perl ( si vous voulez modifier l&#8217;outils pour l&#8217;adapter aux besoins spécifiques de votre entreprise).<br />
Pour vous aider dans l&#8217;installation de l&#8217;outil, un article est paru dans le <a href="http://www.gnulinuxmag.com/">Linux Magazine France</a> de ce mois-ci (Février 2006),  mais celui-ci ne parle pas de la personnalisation de l&#8217;outils. </p>
<h3>L&#8217;application de Suivi Qualité</h3>
<p>L’Application de <a href="http://www.easter-eggs.com/article_372_Application_de_Suivi_Qualite.html">Suivi Qualité</a> développée par Easter-eggs à partir de RT offre la possibilité de :</p>
<ul>
<li> s’interfacer avec l’annuaire LDAP de l’entreprise ;</li>
<li>importer les bases de données d’un outil existant ;</li>
<li> effectuer des recherches dynamiques simplifiées ;</li>
<li> réaliser des imports CSV à partir d&#8217;un ERP ;</li>
<li>avoir une interface dynamique sans rechargement avec Javascript, méthodologie <a href="http://adaptivepath.com/publications/essays/archives/000385.php">AJAX</a>;</li>
<li>personnaliser les emails ;</li>
<li> gérer de manière automatisée les relances des tâches échues ;</li>
<li>extraire des statistiques d’activité.</li>
</ul>
<h3>Le retour d&#8217;expérience sur la modification</h3>
<p>Mon article est disponible au format PDF à l&#8217;adresse suivante :</p>
<p><a href="http://www.csquad.org/pub/rt_qualite/20060207-rt_qualite.pdf">Retour d’expérience sur la personnalisation du logiciel libre de gestion d’incident « Request Tracker » </a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.csquad.org/2006/02/11/retour-dexperience-sur-la-personnalisation-du-logiciel-libre-de-gestion-dincident-%c2%ab-request-tracker-%c2%bb/feed/</wfw:commentRss>
		<slash:comments>0</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>

