<?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>Sukria.net &#187; Coat</title>
	<atom:link href="http://www.sukria.net/fr/archives/tag/coat/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.sukria.net/fr</link>
	<description>I will press many keys on my keyboard causing an implementation to occur.</description>
	<lastBuildDate>Wed, 18 Jan 2012 17:11:38 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Coat is alive (sort of)</title>
		<link>http://www.sukria.net/fr/archives/2009/11/14/coat-is-alive-sort-of/</link>
		<comments>http://www.sukria.net/fr/archives/2009/11/14/coat-is-alive-sort-of/#comments</comments>
		<pubDate>Fri, 13 Nov 2009 23:30:36 +0000</pubDate>
		<dc:creator>sukria</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[Coat]]></category>
		<category><![CDATA[Perl]]></category>

		<guid isPermaLink="false">http://www.sukria.net/fr/?p=1324</guid>
		<description><![CDATA[Coat is a module I wrote when I needed Moose in a restricted environment. I was working for a client back then, and the policy was to stop adding new dependencies to the project. Moose was refused then, because of its huge bag of dependencies. I liked very much the Moose ideas and API and &#8230; <a href="http://www.sukria.net/fr/archives/2009/11/14/coat-is-alive-sort-of/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Coat is a module I wrote when I needed Moose in a restricted environment. I was working for a client back then, and the policy was to stop adding new dependencies to the project. Moose was refused then, because of its huge bag of dependencies.</p>
<p>I liked very much the Moose ideas and API and wanted to use it, that&#8217;s why I wrote Coat: a basic rewrite of Moose goodness in pure Perl 5.</p>
<p>Later on, the Moose team decided to write its own rewrite of Moose in pure Perl 5, it&#8217;s called Mouse (I was a bit surprised at first they didn&#8217;t contact me, but I realized later than it was merely a question of communication, I clearly suck at marketing ;) </p>
<p>Anyways, I also used Coat to write Coat::Persistent, a tiny ORM inspired by Ruby&#8217;s ActiveRecord API. So even if Mouse kind of replace Coat, it still has a reason to live.</p>
<p>More recently, I gave a couple of talks for a client about modern Perl programming (and more precisely the Coat::Persistent ORM) and there was a very good feedback.</p>
<p>A couple of feature requests were made, and I reported them as issues on my GitHub project pages.</p>
<p><a href="http://github.com/sukria/Coat/commit/0caf698f44e299d4ce4cc7fafb0024e111cf1a16">Some</a> <a href="http://github.com/sukria/Coat/commit/e5527967142bacddab902b8a6b320c3425989de0">of</a> <a href="http://github.com/sukria/Coat/commit/0f39e8231d67b1aece8d5ebc2e10bbf74334b821">them</a> are already closed in the GitHub repo. This will certainly lead to a new release of Coat very soon. Yeepee.</p>
<div id='teoShare' ><div id='teo2Google'>
		<!-- Place this tag where you want the +1 button to render -->
		<g:plusone size='tall' annotation='none'></g:plusone>

		<!-- Place this render call where appropriate -->
		<script type='text/javascript'>
		  (function() {
			var po = document.createElement('script'); po.type = 'text/javascript'; po.async = true;
			po.src = 'https://apis.google.com/js/plusone.js';
			var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(po, s);
		  })();
		</script>
		</div><div id="teoTweet" >
		<a href="http://twitter.com/share" class="twitter-share-button" data-count="none" data-via="sukria">Tweet</a><script type="text/javascript" src="http://platform.twitter.com/widgets.js"></script> </div></div><div style="height:0px; width:0px; overflow:hidden;"><a href="http://www.zeitblog.com/?in=plugin">blog tools and plugins from www.zeitblog.com</a></div><p>Related posts:<ol>
<li><a href='http://www.sukria.net/fr/archives/2009/12/24/migrating-homebrew-rails-blog-entries-to-wordpress-with-perl/' rel='bookmark' title='Migrating homebrew Rails blog-entries to WordPress with Perl'>Migrating homebrew Rails blog-entries to WordPress with Perl</a> <small>I was facing a challenge recently at work: migrating a...</small></li>
<li><a href='http://www.sukria.net/fr/archives/2010/07/01/perl-dancer-meeting-1/' rel='bookmark' title='Perl Dancer meeting #1'>Perl Dancer meeting #1</a> <small>As explained on the mailing list, we had the idea...</small></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://www.sukria.net/fr/archives/2009/11/14/coat-is-alive-sort-of/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Publication de Coat::Persistent 0.200</title>
		<link>http://www.sukria.net/fr/archives/2009/06/19/publication-de-coatpersistent-0200/</link>
		<comments>http://www.sukria.net/fr/archives/2009/06/19/publication-de-coatpersistent-0200/#comments</comments>
		<pubDate>Fri, 19 Jun 2009 12:26:12 +0000</pubDate>
		<dc:creator>sukria</dc:creator>
				<category><![CDATA[Main]]></category>
		<category><![CDATA[Coat]]></category>
		<category><![CDATA[Coat::Persistent]]></category>
		<category><![CDATA[Coercition]]></category>
		<category><![CDATA[Perl]]></category>

		<guid isPermaLink="false">http://www.sukria.net/fr/?p=1132</guid>
		<description><![CDATA[Je viens d&#8217;uploader Coat::Persistent sur CPAN. Voila une bonne chose de faîte, c&#8217;est en quelque sorte une manière de boucler la présentation des Journées Perl 2009 et le problème technique qui s&#8217;était posé. Cette version propose les changements suivants : Mention de la licence &#8220;perl&#8221; dans Makefile.PL (bug #46912) Ajout d&#8217;un fichier CHANGES (bug #46913) &#8230; <a href="http://www.sukria.net/fr/archives/2009/06/19/publication-de-coatpersistent-0200/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Je viens d&#8217;uploader <a href="http://search.cpan.org/dist/Coat-Persistent/">Coat::Persistent</a> sur CPAN.</p>
<p>Voila une bonne chose de faîte, c&#8217;est en quelque sorte une manière de boucler <a href="http://www.sukria.net/fr/archives/2009/06/13/coatpersistent-aux-journees-perl-2009/">la présentation des Journées Perl 2009</a> et <a href="http://www.sukria.net/fr/archives/2009/06/16/de-la-bonne-facon-de-manipuler-le-temps-avec-coatpersistent/">le problème technique qui s&#8217;était posé</a>.</p>
<p>Cette version propose les changements suivants :</p>
<ul>
<li>Mention de la licence &#8220;perl&#8221; dans Makefile.PL (bug #<a href="http://rt.cpan.org/Ticket/Display.html?id=46912">46912</a>)
</li>
<li>Ajout d&#8217;un fichier CHANGES (bug #<a href="http://rt.cpan.org/Ticket/Display.html?id=46913">46913</a>)</li>
<li>Support de l&#8217;option <code>store_as</code> pour les attributs persistants</li>
<li>Module <code><a href="http://search.cpan.org/dist/Coat-Persistent/lib/Coat/Persistent/Types/MySQL.pm">Coat::Persistent::Types::MySQL</a></code> qui fournit les types et les coercitions correspondantes pour les types de données MySQL <code>Date</code> et <code>DateTime</code></li>
</ul>
<p>Voici un petit exemple de code qui montre les possibilités de cette nouvelle version :</p>
<p>Reprenons notre chameau utilisé pour illustrer la présentation, nous allons lui ajouter une date de création, que l&#8217;on souhaitera manipuler sous forme de timestamp dans le code de l&#8217;application, et stocker sous forme de MySQL DateTime dans la base.</p>
<pre class="prettyprint">
package Camel;
use Coat;
use Coat::Persistent;
use Coat::Persistent::Types::MySQL;

has_p name => (isa => 'Str');
has_p age => (age => 'Int');

has_p created_at => (
  is => 'rw',
  isa => 'Int',
  store_as => 'MySQL:DateTime',
);
</pre>
<p>Jouons maintenant avec cette classe et observons le comportement de l&#8217;accesseur created_at :</p>
<pre class="prettyprint">
Perl> use Camel
Perl> my $c = Camel->find(3)
$Camel1 = Camel=HASH(0x9967028);

Perl> $c->created_at(time)
1245413521

Perl> $c->save
3
</pre>
<p>Maintenant regardons le contenu de la base de données pour le camel d&#8217;id 3</p>
<pre class="prettyprint">
sqlite> select created_at from camel where id = 3;
2009-06-19 14:12:01
</pre>
<p>Au passage, on notera un effet de bord assez apréciable de cette double coercition entre type réel et type de stockage : on peut très bien assigner une valeur formattée à created_at au lieu d&#8217;un timestamp. La coercition interviendra dans l&#8217;autre sens, et notre objet aura toujours un timestamp :</p>
<pre class="prettyprint">
Perl> $c->created_at('1979-11-20 20:20:00')
311973600
</pre>
<p><em>Mission complete</em> j&#8217;ai envie de dire ;)</p>
<p><em><strong>Update</strong>: Suite à la remarque de oz dans les commentaires, j&#8217;ai publié la version 0.210 qui propose un module Coat::Persistent::Types afin de définir tout plein de types de Date et les coercitions qui vont bien</em></p>
<div id='teoShare' ><div id='teo2Google'>
		<!-- Place this tag where you want the +1 button to render -->
		<g:plusone size='tall' annotation='none'></g:plusone>

		<!-- Place this render call where appropriate -->
		<script type='text/javascript'>
		  (function() {
			var po = document.createElement('script'); po.type = 'text/javascript'; po.async = true;
			po.src = 'https://apis.google.com/js/plusone.js';
			var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(po, s);
		  })();
		</script>
		</div><div id="teoTweet" >
		<a href="http://twitter.com/share" class="twitter-share-button" data-count="none" data-via="sukria">Tweet</a><script type="text/javascript" src="http://platform.twitter.com/widgets.js"></script> </div></div><div style="height:0px; width:0px; overflow:hidden;"><a href="http://www.zeitblog.com/?in=plugin">blog tools and plugins from www.zeitblog.com</a></div><p>Related posts:<ol>
<li><a href='http://www.sukria.net/fr/archives/2009/06/16/de-la-bonne-facon-de-manipuler-le-temps-avec-coatpersistent/' rel='bookmark' title='De la bonne façon de manipuler le temps avec Coat::Persistent'>De la bonne façon de manipuler le temps avec Coat::Persistent</a> <small>Soit la situation suivante : vous avez une classe qui...</small></li>
<li><a href='http://www.sukria.net/fr/archives/2007/10/12/coat-persistent/' rel='bookmark' title='Coat Persistent'>Coat Persistent</a> <small>La famille de Coat s&#8217;agrandit, voici un premier essai de...</small></li>
<li><a href='http://www.sukria.net/fr/archives/2009/06/06/nouvelle-version-de-coatpersistent-0104/' rel='bookmark' title='Nouvelle version de Coat::Persistent : 0.104'>Nouvelle version de Coat::Persistent : 0.104</a> <small>En travaillant sur mes slides pour FPW 2009, je me...</small></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://www.sukria.net/fr/archives/2009/06/19/publication-de-coatpersistent-0200/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>De la bonne façon de manipuler le temps avec Coat::Persistent</title>
		<link>http://www.sukria.net/fr/archives/2009/06/16/de-la-bonne-facon-de-manipuler-le-temps-avec-coatpersistent/</link>
		<comments>http://www.sukria.net/fr/archives/2009/06/16/de-la-bonne-facon-de-manipuler-le-temps-avec-coatpersistent/#comments</comments>
		<pubDate>Tue, 16 Jun 2009 16:41:40 +0000</pubDate>
		<dc:creator>sukria</dc:creator>
				<category><![CDATA[Main]]></category>
		<category><![CDATA[Coat]]></category>
		<category><![CDATA[Coat::Persistent]]></category>
		<category><![CDATA[ORM]]></category>
		<category><![CDATA[Perl]]></category>

		<guid isPermaLink="false">http://www.sukria.net/fr/?p=1103</guid>
		<description><![CDATA[Soit la situation suivante : vous avez une classe qui modélise une table de votre base de données. Cette classe possède un champ de type date. Comment faire pour pouvoir utiliser côté Perl, un timestamp et stocker en base une date formatée pour la base de données ? C&#8217;est le problème que je me suis &#8230; <a href="http://www.sukria.net/fr/archives/2009/06/16/de-la-bonne-facon-de-manipuler-le-temps-avec-coatpersistent/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Soit la situation suivante : vous avez une classe qui modélise une table de votre base de données. Cette classe possède un champ de type date. </p>
<p>Comment faire pour pouvoir utiliser côté Perl, un timestamp et stocker en base une date formatée pour la base de données ?</p>
<p>C&#8217;est le problème que je me suis posé récemment avec Coat::Persistent. Plus exactement, ce problème s&#8217;est posé presque de lui-même pendant ma <a title="voir la vidéo de la présentation" href="http://fpw2009.ubicast.eu/videos/free/63/">présentation aux Journées Perl 2009</a>, suite à une question du public. </p>
<p>En fait, je n&#8217;avais que la moitié de la solution, et depuis, je me suis pris d&#8217;un défi pour résoudre correctement ce problème avec Coat::Persistent.</p>
<p>Je vous propose de voir ensemble comment faire.</p>
<p><strong>Objectifs</strong></p>
<ul>
<li>Utiliser le champ date comme un entier dans le code Perl</li>
<li>Ne pas avoir a se soucier de son format de stockage</li>
</ul>
<p>Dans sa version actuelle, Coat::Persistent ne fait pas de différence entre la valeur assignée a un attribut d&#8217;un objet et celle stockée en base. Il nous est donc impossible de réaliser notre objectif de manière élégante sans modifier Coat::Persistent.</p>
<p>La bonne façon de permettre cette fonctionnalité serait donc de dire qu&#8217;un attribut peut avoir un type propre (isa) et un type de stockage. On aurait donc quelquechose comme ça : </p>
<pre class="prettyprint">
has_p created_at => (
    is => 'rw',
    isa => 'Int',
    store_as => 'DateTime',
);
</pre>
<p>Un attribut ainsi déclaré serait donc conscient que sa valeur mémoire (celle de l&#8217;objet instancié) est différente de celle stockée en base. Toute la logique de conversion qu&#8217;elle soit dans un sens ou dans l&#8217;autre serait donc gérée par Coat::Persistent, et non pas par l&#8217;utilisateur.</p>
<p>Tout cela est réalisable en utilisant une <em>coercition bi-directionnelle</em>. Derrière ce mot barbare se cache un principe finalement assez simple : <strong>une valeur x doit être convertible d&#8217;un type A vers un type B, et reciproquement.</strong></p>
<p>Coat permet de définir des coeriction via le mécanisme de types utilisateurs. La subtilité est donc de :</p>
<ul>
<li>Avoir une coercition de définie pour pouvoir convertir une valeur <em>du type de l&#8217;attribut</em> vers une valeur <em>du type de stockage</em> (qui interviendra avant un <code>save</code>)</li>
<li>Avoir une coercition de définie pour pouvoir convertir une valeur du <em>type de stockage</em> vers une valeur <em>du type de l&#8217;attribut</em> (qui interviendra après un <code>find</code>)</li>
</ul>
<p>Voyons maintenant comment écrire ces types et leur règle de coercition respectives pour le coupe Int,DateTime</p>
<p>Nous allons commencer par définir le type DateTime que nous voulons utiliser pour représenter le format de stockage des date dans une table MySQL (YYYY-MM-DD HH:MM:SS).</p>
<pre class="prettyprint">
subtype 'DateTime'
    => as 'Str'
    => where { /^\d\d\d\d-\d\d-\d\d \d\d:\d\d:\d\d$/ };
</pre>
<p>Un attribut de type DateTime est donc un attribut de type Str et dont la valeur respecte la regexp fournie.<br />
Maintenant il nous faut écire la règle de conversion d&#8217;une valeur Int vers une valeur DateTime :</p>
<pre class="prettyprint">
coerce 'DateTime'
    => from 'Int'
    => via {
        my ($sec, $min, $hour, $day, $mon, $year) =
            localtime($_);
        $year += 1900;
        $mon++;
        $day = sprintf('%02d', $day);
        $mon = sprintf('%02d', $mon);
        $hour = sprintf('%02d', $hour);
        $min = sprintf('%02d', $min);
        $sec = sprintf('%02d', $sec);
        return "$year-$mon-$day $hour:$min:$sec";
    };
</pre>
<p>Le type Int est un type standard, nous n&#8217;avons donc pas besoin de le définir. Nous avons seulement besoin de mettre en place une coercition depuis le type DateTime vers le type Int :</p>
<pre class="prettyprint">
coerce 'Int'
    => from 'DateTime'
    => via {
        my ($year, $mon, $day, $hour, $min, $sec) =
             /^(\d{4})-(\d\d)-(\d\d) (\d\d):(\d\d):(\d\d)$/;
        $year -= 1900;
        $mon--;
        return mktime(
            int($sec), int($min), int($hour),
            $day, $mon, $year);
    };
</pre>
<p>Bien, tout ce code est intéressant, mais est-ce réellement à l&#8217;utilisateur de l&#8217;ORM de le définir ? Je ne crois pas, sa place serait idéale dans un jeu de types prédéfinis. </p>
<p>Pourquoi pas proposer une module <code>Coat::Persistent::Types</code> avec tous les types nécessaires ? Cela me semble bien plus élégant.</p>
<p>Imaginons donc que les types et coercitions définis ci-dessus seraient présents dans, <code>Coat::Persistent::Types::MySQL</code>. Le type pourrait même se nommer <code>'MySQL:DateTime'</code> au lieu de <code>'DateTime'</code>.</p>
<p>L&#8217;utilisateur pourrait donc faire tout simplement :</p>
<pre class="prettyprint">
package Stuff;
use Coat;
use Coat::Persistent;
use Coat::Persistent::Types::MySQL;

has_p created_at => (
    isa => 'Int',
    store_as => 'MySQL:DateTime',
);
</pre>
<p>Et le tour serait joué !</p>
<p>Il ne resterait alors qu&#8217;une seule chose à faire : patcher la mécanique de sauvegarde de Coat::Persistent pour que les valeurs utilisées dans le SQL puissent être converties si nécessaire. </p>
<p>Cela peut se faire très simplement en introduisant la notion de <em>valeur de stockage</em>. Cette valeur serait égale à celle de l&#8217;attribut si aucun <code>store_as</code> n&#8217;est défini, elle serait égale à la coercition adéquate sinon.</p>
<p>Bien, maintenant que ce problème est résolu, il ne me reste plus qu&#8217;à patcher Coat::Persistent et à publier une nouvelle version avec toutes ces bonnes calories intellectuelles&#8230;</p>
<div id='teoShare' ><div id='teo2Google'>
		<!-- Place this tag where you want the +1 button to render -->
		<g:plusone size='tall' annotation='none'></g:plusone>

		<!-- Place this render call where appropriate -->
		<script type='text/javascript'>
		  (function() {
			var po = document.createElement('script'); po.type = 'text/javascript'; po.async = true;
			po.src = 'https://apis.google.com/js/plusone.js';
			var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(po, s);
		  })();
		</script>
		</div><div id="teoTweet" >
		<a href="http://twitter.com/share" class="twitter-share-button" data-count="none" data-via="sukria">Tweet</a><script type="text/javascript" src="http://platform.twitter.com/widgets.js"></script> </div></div><div style="height:0px; width:0px; overflow:hidden;"><a href="http://www.zeitblog.com/?in=plugin">blog tools and plugins from www.zeitblog.com</a></div><p>Related posts:<ol>
<li><a href='http://www.sukria.net/fr/archives/2009/06/19/publication-de-coatpersistent-0200/' rel='bookmark' title='Publication de Coat::Persistent 0.200'>Publication de Coat::Persistent 0.200</a> <small>Je viens d&#8217;uploader Coat::Persistent sur CPAN. Voila une bonne chose...</small></li>
<li><a href='http://www.sukria.net/fr/archives/2007/10/12/coat-persistent/' rel='bookmark' title='Coat Persistent'>Coat Persistent</a> <small>La famille de Coat s&#8217;agrandit, voici un premier essai de...</small></li>
<li><a href='http://www.sukria.net/fr/archives/2007/12/03/nouvelle-fonctionnalite-pour-coatpersistent-__package__-enable_cache/' rel='bookmark' title='Nouvelle fonctionnalité pour Coat::Persistent : cache'>Nouvelle fonctionnalité pour Coat::Persistent : cache</a> <small>Une nouvelle fonctionnalité va faire son apparition d&#8217;ici peu de...</small></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://www.sukria.net/fr/archives/2009/06/16/de-la-bonne-facon-de-manipuler-le-temps-avec-coatpersistent/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Coat::Persistent aux Journées Perl 2009</title>
		<link>http://www.sukria.net/fr/archives/2009/06/13/coatpersistent-aux-journees-perl-2009/</link>
		<comments>http://www.sukria.net/fr/archives/2009/06/13/coatpersistent-aux-journees-perl-2009/#comments</comments>
		<pubDate>Sat, 13 Jun 2009 14:45:14 +0000</pubDate>
		<dc:creator>sukria</dc:creator>
				<category><![CDATA[Main]]></category>
		<category><![CDATA[Coat]]></category>
		<category><![CDATA[Coat::Persistent]]></category>
		<category><![CDATA[FPW2009]]></category>
		<category><![CDATA[Perl]]></category>

		<guid isPermaLink="false">http://www.sukria.net/fr/?p=1060</guid>
		<description><![CDATA[Je reviens à l&#8217;instant des Journées Perl 2009. La conférence se tenait au Carrefour Numérique de la Cité des Sciences et de l&#8217;Industrie, nous y avions deux salles très confortables. Je vous livre à chaud quelques impressions (ce billet n&#8217;est pas une couverture de l&#8217;ensemble de la conférence). A noter au passage que d&#8217;après ce &#8230; <a href="http://www.sukria.net/fr/archives/2009/06/13/coatpersistent-aux-journees-perl-2009/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Je reviens à l&#8217;instant des Journées Perl 2009. La conférence se tenait au <a href="http://carrefour-numerique.cite-sciences.fr/">Carrefour Numérique</a> de la Cité des Sciences et de l&#8217;Industrie, nous y avions deux salles très confortables. Je vous livre à chaud quelques impressions (ce billet n&#8217;est pas une couverture de l&#8217;ensemble de la conférence).</p>
<p><a href="http://www.sukria.net/fr/wp-content/uploads/2009/06/p-1600-1200-4506e4bf-41fe-4a2c-8833-3545a930c073.jpeg"><img src="http://www.sukria.net/fr/wp-content/uploads/2009/06/p-1600-1200-4506e4bf-41fe-4a2c-8833-3545a930c073.jpeg" title="La Géode n'est pas loin" alt="" width="225" height="300" class="illustration alignright size-full wp-image-364" /></a></p>
<p>A noter au passage que d&#8217;après ce que m&#8217;a dit Sébastien Déseille &#8211; vice-président des Mongueurs et organisateur de l&#8217;événement &#8211; ces salles sont grâcieusement prétées à l&#8217;association, ce qui a permi de rendre cette conférence entièrement gratuite. Une belle initiative qui méritait d&#8217;être salluée.</p>
<p>J&#8217;ai d&#8217;abord assisté à la présentation de Philippe « <a href="http://search.cpan.org/~book/">BooK</a> » Bruhat sur les <a href="http://www.mail-archive.com/fwp@perl.org/msg03431.html">opérateurs secrets de Perl</a> : il s&#8217;agit d&#8217;un cocktail explosif de Perl, d&#8217;ASCII Art, de Star Wars et d&#8217;humour &#8211; avec un zeste de Goatse. </p>
<p>Finalement, BooK nous a montré comment on peut combiner différents opérateurs entre eux et avec les jeux de précédence, obtenir de nouveaux opérateurs, ou même des constantes. </p>
<p>L&#8217;immagination semble être la seule limite à cette véritable chasse au trésor. Quelques exemples pris sur le vif :</p>
<ul>
<li>Bang Bang : <code class="prettyprint">!! $anyvalue</code> : retourne l&#8217;expression booléenne de $anyvalue</li>
<li>Inch Worm : <code class="prettyprint">~~ @anylist</code> : retourne l&#8217;expression scalaire de @anylist</li>
<li>Goatse : <code class="prettyprint"> $count =()= $regexp</code> : Retounre le nombre de match dans la $regexp sur $_</li>
</ul>
<p>Je vous renvoie aux slides de BooK Pour plus de détails (et surtout pour les illustrations croustillantes).</p>
<p>Après la pause déjeuner, c&#8217;était au tour de <a href="http://search.cpan.org/dist/Coat/">Coat</a> d&#8217;être présenté par SébastienDéseille.</p>
<p>Pour sa présentation, Sébastien s&#8217;est donné comme défi de reprendre <a href="http://www.sukria.net/fr/archives/2007/08/20/jouons-avec-moose-ou-comment-reapprendre-le-perl-objet/">la série d&#8217;articles</a> publiée sur ce blog et dédiée à l&#8217;apprentissage de Moose afin de l&#8217;adapter avec Coat. On a ainsi pu découvrir comment faire de l&#8217;objet avec Coat et avoir les bases nécessaires à l&#8217;apprentissage de Coat::Persistent.</p>
<p>J&#8217;ai donc ensuite présenté le petit frère <a href="http://search.cpan.org/dist/Coat-Persistent/">Coat::Persistent</a> dont voici les slides :</p>
<p><object style="margin:0px" width="425" height="355"><param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=fpw2009-cp-090613110831-phpapp01&#038;stripped_title=coatpersistent-at-fpw2009" /><param name="allowFullScreen" value="true"/><param name="allowScriptAccess" value="always"/><embed src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=fpw2009-cp-090613110831-phpapp01&#038;stripped_title=coatpersistent-at-fpw2009" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="355"></embed></object></p>
<p>La vidéo de la présentation sera probablement en ligne prochainement, <a href="http://fpw2009.ubicast.eu/videos/">certainement par ici</a>.</p>
<p><a href="http://www.sukria.net/fr/wp-content/uploads/2009/06/l-1600-1200-4783fcae-1f69-4b33-9fa1-e74664d5bdc7.jpeg"><img src="http://www.sukria.net/fr/wp-content/uploads/2009/06/l-1600-1200-4783fcae-1f69-4b33-9fa1-e74664d5bdc7.jpeg" title="Sebastien Déseille Présente Coat" alt="Sebastien Déseille Présente Coat" width="300" height="225" class="illustration alignright size-full wp-image-364" /></a></p>
<p>Dans l&#8217;ensemble la présentation s&#8217;est bien déroulée (du moins je l&#8217;espère :-). </p>
<p>J&#8217;aurais juste dû choisir un autre exemple pour la coercition car le mien ne correspondait pas à quelquechose de convenable en pratique. Lorsqu&#8217;on s&#8217;en rend compte en pleine présentation suite à une question du public ce n&#8217;est pas très agréable.</p>
<p>Du côté des bonnes surprises, Philippe Bruhat m&#8217;a parlé de son module <a href="http://search.cpan.org/dist/Test-Database/">Test::Database</a> qui m&#8217;à tout l&#8217;air d&#8217;être le module manquant du jeu de test de Coat::Persistent : il permet de d&#8217;obtenir un pool de $dbh disponibles sur la machine courante, pour une série de drivers. C&#8217;est tout simplement l&#8217;outil révé pour écrire le jeu de tests unitaires de Coat::Persistent (pour l&#8217;instant je suis contraint à faire tourner les tests uniquement avec le driver CSV). A suivre donc. </p>
<p><a href="http://www.sukria.net/fr/wp-content/uploads/2009/06/l-1600-1200-059e461f-604a-4b6e-babb-7027ea7ba33e.jpeg"><img src="http://www.sukria.net/fr/wp-content/uploads/2009/06/l-1600-1200-059e461f-604a-4b6e-babb-7027ea7ba33e.jpeg" title="Quelques Mongueurs jouent avec la réalité augmentée dans le couloir :-)" alt="" width="300" height="225" class="illustration alignnone size-full wp-image-364" /></a></p>
<div id='teoShare' ><div id='teo2Google'>
		<!-- Place this tag where you want the +1 button to render -->
		<g:plusone size='tall' annotation='none'></g:plusone>

		<!-- Place this render call where appropriate -->
		<script type='text/javascript'>
		  (function() {
			var po = document.createElement('script'); po.type = 'text/javascript'; po.async = true;
			po.src = 'https://apis.google.com/js/plusone.js';
			var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(po, s);
		  })();
		</script>
		</div><div id="teoTweet" >
		<a href="http://twitter.com/share" class="twitter-share-button" data-count="none" data-via="sukria">Tweet</a><script type="text/javascript" src="http://platform.twitter.com/widgets.js"></script> </div></div><div style="height:0px; width:0px; overflow:hidden;"><a href="http://www.zeitblog.com/?in=plugin">blog tools and plugins from www.zeitblog.com</a></div><p>Related posts:<ol>
<li><a href='http://www.sukria.net/fr/archives/2007/10/12/coat-persistent/' rel='bookmark' title='Coat Persistent'>Coat Persistent</a> <small>La famille de Coat s&#8217;agrandit, voici un premier essai de...</small></li>
<li><a href='http://www.sukria.net/fr/archives/2009/06/19/publication-de-coatpersistent-0200/' rel='bookmark' title='Publication de Coat::Persistent 0.200'>Publication de Coat::Persistent 0.200</a> <small>Je viens d&#8217;uploader Coat::Persistent sur CPAN. Voila une bonne chose...</small></li>
<li><a href='http://www.sukria.net/fr/archives/2007/12/03/nouvelle-fonctionnalite-pour-coatpersistent-__package__-enable_cache/' rel='bookmark' title='Nouvelle fonctionnalité pour Coat::Persistent : cache'>Nouvelle fonctionnalité pour Coat::Persistent : cache</a> <small>Une nouvelle fonctionnalité va faire son apparition d&#8217;ici peu de...</small></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://www.sukria.net/fr/archives/2009/06/13/coatpersistent-aux-journees-perl-2009/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>Nouvelle version de Coat::Persistent : 0.104</title>
		<link>http://www.sukria.net/fr/archives/2009/06/06/nouvelle-version-de-coatpersistent-0104/</link>
		<comments>http://www.sukria.net/fr/archives/2009/06/06/nouvelle-version-de-coatpersistent-0104/#comments</comments>
		<pubDate>Sat, 06 Jun 2009 10:31:48 +0000</pubDate>
		<dc:creator>sukria</dc:creator>
				<category><![CDATA[Main]]></category>
		<category><![CDATA[Coat]]></category>
		<category><![CDATA[Coat::Persistent]]></category>
		<category><![CDATA[Perl]]></category>

		<guid isPermaLink="false">http://www.sukria.net/fr/?p=1003</guid>
		<description><![CDATA[En travaillant sur mes slides pour FPW 2009, je me suis penché un peu sur le code de Coat::Persistent histoire que tout soit bien propre. Du coup, j&#8217;en ai profité pour modifier subtilement la gestion des drivers DBI. En effet, comme me l&#8217;avait fait remarquer Sébastien Déseille dans un échange de mails (Sébastien présentera le &#8230; <a href="http://www.sukria.net/fr/archives/2009/06/06/nouvelle-version-de-coatpersistent-0104/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>En travaillant sur mes slides pour <a href="http://conferences.mongueurs.net/fpw2009/">FPW 2009</a>, je me suis penché un peu sur le code de <a href="http://search.cpan.org/dist/Coat-Persistent/">Coat::Persistent</a> histoire que tout soit bien propre. </p>
<p>Du coup, j&#8217;en ai profité pour modifier subtilement la gestion des drivers DBI. En effet, comme me l&#8217;avait fait remarquer Sébastien Déseille dans un échange de mails (<a href="http://conferences.mongueurs.net/fpw2009/talk/1813">Sébastien présentera le module Coat</a>), uniquement les drivers MySQL et CSV étaient supportés alors qu&#8217;un simple patch d&#8217;une ligne permettait de faire fonctionner C::P avec SQLite.</p>
<p>Il est vrai qu&#8217;intrinsèquement, rien n&#8217;interdit d&#8217;autres drivers : le SQL généré est standard puisque produit par <a href="http://search.cpan.org/perldoc?SQL::Abstract">SQL::Abstract</a>, et les séquences sont gérées par <a href="http://search.cpan.org/perldoc?DBIx::Sequence">DBIx::Sequence</a> et ne reposent donc pas sur le SGBD.</p>
<p>La seule difficulté était donc de maintenir une liste de drivers de la bonne façon. J&#8217;ai opté pour un compromis :</p>
<ul>
<li>D&#8217;une part, plutôt que de lister en dur dans le code de C::P la liste de tous les drivers DBI potentiellement compatibles, j&#8217;ai préféré ne lister par défaut que ceux pour lesquels je sais que tout fonctionne bien</li>
<li>D&#8217;autre part, le module propose une interface pour laisser le programme appelant modifier ce registre de drivers, il peut ainsi &#8211; sans patcher C::P &#8211; modifier ou ajouter les drivers connus</li>
</ul>
<p>La documentation a été mise à jour et <a href="http://search.cpan.org/~sukria/Coat-Persistent-0.104/lib/Coat/Persistent.pm#DBI_MAPPING">montre l&#8217;usage des nouvelles méthodes</a> drivers(), get_driver() et add_driver().</p>
<div id='teoShare' ><div id='teo2Google'>
		<!-- Place this tag where you want the +1 button to render -->
		<g:plusone size='tall' annotation='none'></g:plusone>

		<!-- Place this render call where appropriate -->
		<script type='text/javascript'>
		  (function() {
			var po = document.createElement('script'); po.type = 'text/javascript'; po.async = true;
			po.src = 'https://apis.google.com/js/plusone.js';
			var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(po, s);
		  })();
		</script>
		</div><div id="teoTweet" >
		<a href="http://twitter.com/share" class="twitter-share-button" data-count="none" data-via="sukria">Tweet</a><script type="text/javascript" src="http://platform.twitter.com/widgets.js"></script> </div></div><div style="height:0px; width:0px; overflow:hidden;"><a href="http://www.zeitblog.com/?in=plugin">blog tools and plugins from www.zeitblog.com</a></div><p>Related posts:<ol>
<li><a href='http://www.sukria.net/fr/archives/2008/09/27/nouvelle-version-de-coat-0333-disponible-sur-le-cpan/' rel='bookmark' title='Nouvelle version de Coat : 0.333 disponible sur le CPAN'>Nouvelle version de Coat : 0.333 disponible sur le CPAN</a> <small>J&#8217;ai publié une nouvelle version de Coat &#8211; la meta-classe...</small></li>
<li><a href='http://www.sukria.net/fr/archives/2007/12/03/nouvelle-fonctionnalite-pour-coatpersistent-__package__-enable_cache/' rel='bookmark' title='Nouvelle fonctionnalité pour Coat::Persistent : cache'>Nouvelle fonctionnalité pour Coat::Persistent : cache</a> <small>Une nouvelle fonctionnalité va faire son apparition d&#8217;ici peu de...</small></li>
<li><a href='http://www.sukria.net/fr/archives/2009/06/13/coatpersistent-aux-journees-perl-2009/' rel='bookmark' title='Coat::Persistent aux Journées Perl 2009'>Coat::Persistent aux Journées Perl 2009</a> <small>Je reviens à l&#8217;instant des Journées Perl 2009. La conférence...</small></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://www.sukria.net/fr/archives/2009/06/06/nouvelle-version-de-coatpersistent-0104/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Release de Coat 0.334</title>
		<link>http://www.sukria.net/fr/archives/2008/11/25/release-de-coat-0334/</link>
		<comments>http://www.sukria.net/fr/archives/2008/11/25/release-de-coat-0334/#comments</comments>
		<pubDate>Mon, 24 Nov 2008 23:33:44 +0000</pubDate>
		<dc:creator>sukria</dc:creator>
				<category><![CDATA[Main]]></category>
		<category><![CDATA[Coat]]></category>
		<category><![CDATA[Perl]]></category>
		<category><![CDATA[Release]]></category>

		<guid isPermaLink="false">http://www.sukria.net/fr/?p=837</guid>
		<description><![CDATA[Ça faisait quelques semaines que cette version trainait dans mes cartons, je suppose qu&#8217;inconsciemment j&#8217;attendai une vraie raison de publier une nouvelle version (comprendre : une belle ligne dans le Changelog). Rached me l&#8217;a fournie en fin de journée au boulot : il a mis le doigt sur une brêche dans les perfs de Coat &#8230; <a href="http://www.sukria.net/fr/archives/2008/11/25/release-de-coat-0334/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Ça faisait quelques semaines que cette version trainait dans mes cartons, je suppose qu&#8217;inconsciemment j&#8217;attendai une vraie raison de publier une nouvelle version (comprendre : une belle ligne dans le Changelog).</p>
<p><a href="http://www.benmur.net">Rached</a> me l&#8217;a fournie en fin de journée au <a href="http://www.yoolink.fr">bou</a><a href="http://www.yoolinkpro.com">lot</a> : il a mis le doigt sur une brêche dans les perfs de Coat lorsque l&#8217;on utilise la coercition (coerce dans Coat). La chute de perfs était due à une utilisation de Carp::confess, catchée par un bloc eval, ce qui est très mal, car à chaque fois que Perl utilise confess, il va chercher toutes les infos de la pile d&#8217;appel, ce qui est couteux.</p>
<p>Le mécanisme de coercition de Coat utilise désormais une méthode silencieuse qui retourne un booléen au lieu de faire un confess, on évite ainsi de ruiner les performances.</p>
<p>Outre ce correctif important, la version 0.334 apporte le support de BUILDARGS qui vous permet de construire vos arguments lors de l&#8217;instanciation d&#8217;objets.</p>
<p>Je viens d&#8217;uploader le package sur CPAN, donc d&#8217;ici quelques heures ça devrait être dispo <a href="http://search.cpan.org/perldoc?Coat">ici</a>.</p>
<h2>EDIT : 25 Nov. 2008, 10:07</h2>
<p>
Après quelques retours sur ce billet je m&#8217;aperçois que je parle trop vite et que certains ont eu la curiosité éveillée, je m&#8217;empresse de préciser donc :
</p>
<h3>Qu&#8217;est-ce que la coercition</h3>
<p>La coercition est un mécanisme qui permet de transformer à la volée une valeur d&#8217;un champ dans un format particulier. La coercition est utilisée pour modifier une valeur qui ne valide pas le type d&#8217;un attribut mais qui valide un type défini dans une coercition.</p>
<p>Un exemple simple : j&#8217;ai une classe qui possède un attribut &#8220;mysql_date&#8221; qui est valdie le format : <code>YYYY-MM-DD</code>. Je peux définir une coercition sur cet attribut pour toute valeur qui validerait le type &#8216;Timestamp&#8217; par exemple.</p>
<p>Ainsi je pourrai faire </p>
<pre>
$mon_objet->mysql_date( time() );
</pre>
<p>La coercition entrera donc en jeu et convertira l&#8217;entier retourné par time() en une date formatée selon la règle définie par l&#8217;utilisateur.</p>
<h3>Quel était le problème avec confess/eval ? Est-ce mal d&#8217;utiliser confess ?</h3>
<p>La chute de performance n&#8217;était pas due directement à confess, mais plutôt à l&#8217;utilisation que le mécanisme de coercition en faisait. Lorsqu&#8217;une valeur ne validait pas le type premier d&#8217;un attribut et qu&#8217;une coercition était définie, Coat bouclait sur toutes les coercitions définies afin de voir si la valeur validait le type source de la coercition. Or cette validation était faite avec le mécanisme standard de Coat qui déclenche une exception avec confess si la valeur n&#8217;est pas valide. Coat utilisait donc un bloc de code dans eval pour savoir si oui ou non la valeur est acceptée.<br />
C&#8217;est ici que le problème réside : on ne veut pas d&#8217;exception, on veut une réponse booléene, inutile donc de faire appel à confess (et donc de lire la pile d&#8217;appel), il nous faut une méthode de validation silencieuse, qui retourne 1 ou 0 selon la validité du champ.</p>
<p>On peut donc résumer en disant que confess ne pose aucun problème tant qu&#8217;il est utilisé uniquement pour interrompre l&#8217;exécution du programme, et surtout pas pour être catché afin d&#8217;avoir une réponse à une question booléene.</p>
<p>Pour les gens intéressés, <a href="http://svn.sukria.net/diff.php?repname=repos+2&#038;path=%2FCoat%2Flib%2FCoat%2FMeta%2FTypeConstraint.pm&#038;rev=236&#038;sc=0">le diff est dispo ici</a>, on constate également que la construction du message en cas d&#8217;exception était également couteuse, puisqu&#8217;elle fait appel a un bloc de code (les messages d&#8217;erreur de coercition sont des blocs de code, afin de pouvoir expander $_).</p>
<h3>Qu&#8217;est-ce que BUILDARGS</h3>
<p>Cette fonctionnalité vous permet de définir une méthode BUILDARGS dans votre classe. Lorsqu&#8217;un objet de cette classe est instancié, la méthode est appelée avec les arguments donnés à l&#8217;instanciation. Elle peut à loisir modifier les arguments et la valeur qu&#8217;elle retourne sera la structure de données finale reçue par l&#8217;instanciation.</p>
<p>On peut dire qu&#8217;il s&#8217;agit un pre-processing des arguments d&#8217;instanciation. Combiné avec une méthode BUILD ça peut être très combo-magique :-)</p>
<p>Voilà, j&#8217;éspère que ces précisions sont claires (je n&#8217;en suis pas sûr: c&#8217;est le matin et je n&#8217;ai pas bu mon café). Les commentaires sont là si vous avez des questions.</p>
<div id='teoShare' ><div id='teo2Google'>
		<!-- Place this tag where you want the +1 button to render -->
		<g:plusone size='tall' annotation='none'></g:plusone>

		<!-- Place this render call where appropriate -->
		<script type='text/javascript'>
		  (function() {
			var po = document.createElement('script'); po.type = 'text/javascript'; po.async = true;
			po.src = 'https://apis.google.com/js/plusone.js';
			var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(po, s);
		  })();
		</script>
		</div><div id="teoTweet" >
		<a href="http://twitter.com/share" class="twitter-share-button" data-count="none" data-via="sukria">Tweet</a><script type="text/javascript" src="http://platform.twitter.com/widgets.js"></script> </div></div><div style="height:0px; width:0px; overflow:hidden;"><a href="http://www.zeitblog.com/?in=plugin">blog tools and plugins from www.zeitblog.com</a></div><p>Related posts:<ol>
<li><a href='http://www.sukria.net/fr/archives/2009/06/16/de-la-bonne-facon-de-manipuler-le-temps-avec-coatpersistent/' rel='bookmark' title='De la bonne façon de manipuler le temps avec Coat::Persistent'>De la bonne façon de manipuler le temps avec Coat::Persistent</a> <small>Soit la situation suivante : vous avez une classe qui...</small></li>
<li><a href='http://www.sukria.net/fr/archives/2009/06/19/publication-de-coatpersistent-0200/' rel='bookmark' title='Publication de Coat::Persistent 0.200'>Publication de Coat::Persistent 0.200</a> <small>Je viens d&#8217;uploader Coat::Persistent sur CPAN. Voila une bonne chose...</small></li>
<li><a href='http://www.sukria.net/fr/archives/2009/06/13/coatpersistent-aux-journees-perl-2009/' rel='bookmark' title='Coat::Persistent aux Journées Perl 2009'>Coat::Persistent aux Journées Perl 2009</a> <small>Je reviens à l&#8217;instant des Journées Perl 2009. La conférence...</small></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://www.sukria.net/fr/archives/2008/11/25/release-de-coat-0334/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>Nouvelle version de Coat : 0.333 disponible sur le CPAN</title>
		<link>http://www.sukria.net/fr/archives/2008/09/27/nouvelle-version-de-coat-0333-disponible-sur-le-cpan/</link>
		<comments>http://www.sukria.net/fr/archives/2008/09/27/nouvelle-version-de-coat-0333-disponible-sur-le-cpan/#comments</comments>
		<pubDate>Sat, 27 Sep 2008 10:46:30 +0000</pubDate>
		<dc:creator>sukria</dc:creator>
				<category><![CDATA[Main]]></category>
		<category><![CDATA[Coat]]></category>
		<category><![CDATA[CPAN]]></category>
		<category><![CDATA[Perl]]></category>

		<guid isPermaLink="false">http://www.sukria.net/fr/archives/2008/09/27/nouvelle-version-de-coat-0333-disponible-sur-le-cpan/</guid>
		<description><![CDATA[J&#8217;ai publié une nouvelle version de Coat &#8211; la meta-classe Perl 5 pour faire de l&#8217;objet moderne ala Moose, sans installer la moitié du CPAN. Cette version corrige 3 bugs importants, pour les détails de cette version, voir le blog anglophone. Tweet blog tools and plugins from www.zeitblog.comRelated posts: Nouvelle version de Coat::Persistent : 0.104 &#8230; <a href="http://www.sukria.net/fr/archives/2008/09/27/nouvelle-version-de-coat-0333-disponible-sur-le-cpan/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>J&#8217;ai publié une nouvelle version de Coat &#8211; la meta-classe Perl 5 pour faire de l&#8217;objet moderne ala Moose, sans installer la moitié du CPAN.</p>
<p>Cette version corrige 3 bugs importants, pour les détails de cette version, <a href="http://www.sukria.net/en/archives/2008/09/27/coat-0333-released/">voir le blog anglophone</a>.</p>
<div id='teoShare' ><div id='teo2Google'>
		<!-- Place this tag where you want the +1 button to render -->
		<g:plusone size='tall' annotation='none'></g:plusone>

		<!-- Place this render call where appropriate -->
		<script type='text/javascript'>
		  (function() {
			var po = document.createElement('script'); po.type = 'text/javascript'; po.async = true;
			po.src = 'https://apis.google.com/js/plusone.js';
			var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(po, s);
		  })();
		</script>
		</div><div id="teoTweet" >
		<a href="http://twitter.com/share" class="twitter-share-button" data-count="none" data-via="sukria">Tweet</a><script type="text/javascript" src="http://platform.twitter.com/widgets.js"></script> </div></div><div style="height:0px; width:0px; overflow:hidden;"><a href="http://www.zeitblog.com/?in=plugin">blog tools and plugins from www.zeitblog.com</a></div><p>Related posts:<ol>
<li><a href='http://www.sukria.net/fr/archives/2009/06/06/nouvelle-version-de-coatpersistent-0104/' rel='bookmark' title='Nouvelle version de Coat::Persistent : 0.104'>Nouvelle version de Coat::Persistent : 0.104</a> <small>En travaillant sur mes slides pour FPW 2009, je me...</small></li>
<li><a href='http://www.sukria.net/fr/archives/2007/12/03/nouvelle-fonctionnalite-pour-coatpersistent-__package__-enable_cache/' rel='bookmark' title='Nouvelle fonctionnalité pour Coat::Persistent : cache'>Nouvelle fonctionnalité pour Coat::Persistent : cache</a> <small>Une nouvelle fonctionnalité va faire son apparition d&#8217;ici peu de...</small></li>
<li><a href='http://www.sukria.net/fr/archives/2009/06/19/publication-de-coatpersistent-0200/' rel='bookmark' title='Publication de Coat::Persistent 0.200'>Publication de Coat::Persistent 0.200</a> <small>Je viens d&#8217;uploader Coat::Persistent sur CPAN. Voila une bonne chose...</small></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://www.sukria.net/fr/archives/2008/09/27/nouvelle-version-de-coat-0333-disponible-sur-le-cpan/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Nouvelle fonctionnalité pour Coat::Persistent : cache</title>
		<link>http://www.sukria.net/fr/archives/2007/12/03/nouvelle-fonctionnalite-pour-coatpersistent-__package__-enable_cache/</link>
		<comments>http://www.sukria.net/fr/archives/2007/12/03/nouvelle-fonctionnalite-pour-coatpersistent-__package__-enable_cache/#comments</comments>
		<pubDate>Mon, 03 Dec 2007 15:05:24 +0000</pubDate>
		<dc:creator>sukria</dc:creator>
				<category><![CDATA[Main]]></category>
		<category><![CDATA[Coat]]></category>
		<category><![CDATA[ORM]]></category>
		<category><![CDATA[Perl]]></category>

		<guid isPermaLink="false">http://www.sukria.net/fr/archives/2007/12/03/nouvelle-fonctionnalite-pour-coatpersistent-__package__-enable_cache/</guid>
		<description><![CDATA[Une nouvelle fonctionnalité va faire son apparition d&#8217;ici peu de temps dans Coat::Persistent : la possibilité de cacher les résultats des requêtes SQL exécutées. Le cache est géré par l&#8217;excellent Cache::FastMmap. Coat::Persistent proposera une interface simple pour activer le cache : Coat::Persistent->enable_cache( expire_time => '1h', cache_size => '50m', share_file => '/var/cache/apache/sites/www.monsite.cache', ); Comme chaque option &#8230; <a href="http://www.sukria.net/fr/archives/2007/12/03/nouvelle-fonctionnalite-pour-coatpersistent-__package__-enable_cache/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Une nouvelle fonctionnalité va faire son apparition d&#8217;ici peu de temps dans <a href="http://search.cpan.org/perldoc?Coat::Persistent">Coat::Persistent</a> : la possibilité de cacher les résultats des requêtes SQL exécutées.</p>
<p>Le cache est géré par l&#8217;excellent <a href="http://search.cpan.org/perldoc?Cache::FastMmap">Cache::FastMmap</a>. Coat::Persistent proposera une interface simple pour activer le cache :</p>
<pre>
Coat::Persistent->enable_cache(
    expire_time => '1h',
    cache_size  => '50m',
    share_file  => '/var/cache/apache/sites/www.monsite.cache',
);
</pre>
<p>Comme chaque option de configuration fournie par Coat::Persistent, le cache peut être activé ou non pour une classe donnée ou pour toutes les classes (ce qui veut dire qu&#8217;on peut même immaginer avoir des caches différents par classe).</p>
<p>Du coup, c&#8217;est <a href="http://www.libellaris.fr">Libellaris.fr</a> qui a pris un speed.</p>
<p>A suivre sur le CPAN donc (c&#8217;est déjà dans le SVN).</p>
<div id='teoShare' ><div id='teo2Google'>
		<!-- Place this tag where you want the +1 button to render -->
		<g:plusone size='tall' annotation='none'></g:plusone>

		<!-- Place this render call where appropriate -->
		<script type='text/javascript'>
		  (function() {
			var po = document.createElement('script'); po.type = 'text/javascript'; po.async = true;
			po.src = 'https://apis.google.com/js/plusone.js';
			var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(po, s);
		  })();
		</script>
		</div><div id="teoTweet" >
		<a href="http://twitter.com/share" class="twitter-share-button" data-count="none" data-via="sukria">Tweet</a><script type="text/javascript" src="http://platform.twitter.com/widgets.js"></script> </div></div><div style="height:0px; width:0px; overflow:hidden;"><a href="http://www.zeitblog.com/?in=plugin">blog tools and plugins from www.zeitblog.com</a></div><p>Related posts:<ol>
<li><a href='http://www.sukria.net/fr/archives/2007/10/12/coat-persistent/' rel='bookmark' title='Coat Persistent'>Coat Persistent</a> <small>La famille de Coat s&#8217;agrandit, voici un premier essai de...</small></li>
<li><a href='http://www.sukria.net/fr/archives/2009/06/06/nouvelle-version-de-coatpersistent-0104/' rel='bookmark' title='Nouvelle version de Coat::Persistent : 0.104'>Nouvelle version de Coat::Persistent : 0.104</a> <small>En travaillant sur mes slides pour FPW 2009, je me...</small></li>
<li><a href='http://www.sukria.net/fr/archives/2009/06/16/de-la-bonne-facon-de-manipuler-le-temps-avec-coatpersistent/' rel='bookmark' title='De la bonne façon de manipuler le temps avec Coat::Persistent'>De la bonne façon de manipuler le temps avec Coat::Persistent</a> <small>Soit la situation suivante : vous avez une classe qui...</small></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://www.sukria.net/fr/archives/2007/12/03/nouvelle-fonctionnalite-pour-coatpersistent-__package__-enable_cache/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Plus très loin du début du commencement</title>
		<link>http://www.sukria.net/fr/archives/2007/10/24/plus-tres-loin-du-debut-du-commencement/</link>
		<comments>http://www.sukria.net/fr/archives/2007/10/24/plus-tres-loin-du-debut-du-commencement/#comments</comments>
		<pubDate>Wed, 24 Oct 2007 17:55:22 +0000</pubDate>
		<dc:creator>sukria</dc:creator>
				<category><![CDATA[Main]]></category>
		<category><![CDATA[Coat]]></category>
		<category><![CDATA[MVC]]></category>
		<category><![CDATA[Perl]]></category>

		<guid isPermaLink="false">http://www.sukria.net/fr/archives/2007/10/24/plus-tres-loin-du-debut-du-commencement/</guid>
		<description><![CDATA[Mon travail avance bien autour de mon projet de &#8220;Perl on Rails&#8221;, Coat::MVC de son petit nom. J&#8217;en suis presque arrivé à un point ou une doc et un exemple sont envisageables. En attendant, y a un teaser là. Tweet blog tools and plugins from www.zeitblog.comNo related posts.]]></description>
			<content:encoded><![CDATA[<p>Mon travail avance bien autour de mon projet de &#8220;Perl on Rails&#8221;, Coat::MVC de son petit nom. J&#8217;en suis presque arrivé à un point ou une doc et un exemple sont envisageables.<br />
En attendant, <a href="http://www.sukria.net/perl/coat-mvc/">y a un teaser là</a>.</p>
<div id='teoShare' ><div id='teo2Google'>
		<!-- Place this tag where you want the +1 button to render -->
		<g:plusone size='tall' annotation='none'></g:plusone>

		<!-- Place this render call where appropriate -->
		<script type='text/javascript'>
		  (function() {
			var po = document.createElement('script'); po.type = 'text/javascript'; po.async = true;
			po.src = 'https://apis.google.com/js/plusone.js';
			var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(po, s);
		  })();
		</script>
		</div><div id="teoTweet" >
		<a href="http://twitter.com/share" class="twitter-share-button" data-count="none" data-via="sukria">Tweet</a><script type="text/javascript" src="http://platform.twitter.com/widgets.js"></script> </div></div><div style="height:0px; width:0px; overflow:hidden;"><a href="http://www.zeitblog.com/?in=plugin">blog tools and plugins from www.zeitblog.com</a></div><p>No related posts.</p>]]></content:encoded>
			<wfw:commentRss>http://www.sukria.net/fr/archives/2007/10/24/plus-tres-loin-du-debut-du-commencement/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Coat Persistent</title>
		<link>http://www.sukria.net/fr/archives/2007/10/12/coat-persistent/</link>
		<comments>http://www.sukria.net/fr/archives/2007/10/12/coat-persistent/#comments</comments>
		<pubDate>Fri, 12 Oct 2007 16:53:30 +0000</pubDate>
		<dc:creator>sukria</dc:creator>
				<category><![CDATA[Main]]></category>
		<category><![CDATA[Coat]]></category>
		<category><![CDATA[ORM]]></category>
		<category><![CDATA[Perl]]></category>

		<guid isPermaLink="false">http://www.sukria.net/fr/archives/2007/10/12/coat-persistent/</guid>
		<description><![CDATA[La famille de Coat s&#8217;agrandit, voici un premier essai de mélange des concepts de l&#8217;ORM de Rails avec la meta-classe Coat : Coat::Persistent. Tweet blog tools and plugins from www.zeitblog.comRelated posts: Nouvelle fonctionnalité pour Coat::Persistent : cache Une nouvelle fonctionnalité va faire son apparition d&#8217;ici peu de... De la bonne façon de manipuler le temps &#8230; <a href="http://www.sukria.net/fr/archives/2007/10/12/coat-persistent/">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>La famille de Coat s&#8217;agrandit, voici un premier essai de mélange des concepts de l&#8217;ORM de Rails avec la meta-classe Coat : <a href="http://search.cpan.org/~sukria/Coat-Persistent-0.0_0.1/lib/Coat/Persistent.pm">Coat::Persistent</a>.</p>
<div id='teoShare' ><div id='teo2Google'>
		<!-- Place this tag where you want the +1 button to render -->
		<g:plusone size='tall' annotation='none'></g:plusone>

		<!-- Place this render call where appropriate -->
		<script type='text/javascript'>
		  (function() {
			var po = document.createElement('script'); po.type = 'text/javascript'; po.async = true;
			po.src = 'https://apis.google.com/js/plusone.js';
			var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(po, s);
		  })();
		</script>
		</div><div id="teoTweet" >
		<a href="http://twitter.com/share" class="twitter-share-button" data-count="none" data-via="sukria">Tweet</a><script type="text/javascript" src="http://platform.twitter.com/widgets.js"></script> </div></div><div style="height:0px; width:0px; overflow:hidden;"><a href="http://www.zeitblog.com/?in=plugin">blog tools and plugins from www.zeitblog.com</a></div><p>Related posts:<ol>
<li><a href='http://www.sukria.net/fr/archives/2007/12/03/nouvelle-fonctionnalite-pour-coatpersistent-__package__-enable_cache/' rel='bookmark' title='Nouvelle fonctionnalité pour Coat::Persistent : cache'>Nouvelle fonctionnalité pour Coat::Persistent : cache</a> <small>Une nouvelle fonctionnalité va faire son apparition d&#8217;ici peu de...</small></li>
<li><a href='http://www.sukria.net/fr/archives/2009/06/16/de-la-bonne-facon-de-manipuler-le-temps-avec-coatpersistent/' rel='bookmark' title='De la bonne façon de manipuler le temps avec Coat::Persistent'>De la bonne façon de manipuler le temps avec Coat::Persistent</a> <small>Soit la situation suivante : vous avez une classe qui...</small></li>
<li><a href='http://www.sukria.net/fr/archives/2009/06/19/publication-de-coatpersistent-0200/' rel='bookmark' title='Publication de Coat::Persistent 0.200'>Publication de Coat::Persistent 0.200</a> <small>Je viens d&#8217;uploader Coat::Persistent sur CPAN. Voila une bonne chose...</small></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://www.sukria.net/fr/archives/2007/10/12/coat-persistent/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

