<?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"
	>

<channel>
	<title>JDK Coding Club</title>
	<atom:link href="http://www.jdkcodingclub.net/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.jdkcodingclub.net</link>
	<description>Un blog qui se la compile !</description>
	<pubDate>Sun, 25 Oct 2009 13:24:12 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.6.3</generator>
	<language></language>
			<item>
		<title>Google App Engine (GAE) : une première requête coûteuse</title>
		<link>http://www.jdkcodingclub.net/2009/10/google-app-engine-gae-une-premiere-requete-couteuse/</link>
		<comments>http://www.jdkcodingclub.net/2009/10/google-app-engine-gae-une-premiere-requete-couteuse/#comments</comments>
		<pubDate>Sat, 24 Oct 2009 15:14:25 +0000</pubDate>
		<dc:creator>Romain LAFOND</dc:creator>
		
		<category><![CDATA[JDKCC]]></category>

		<category><![CDATA[GAE; GWT; DataStore;Latence;Java;]]></category>

		<guid isPermaLink="false">http://www.jdkcodingclub.net/?p=321</guid>
		<description><![CDATA[Une latence excessive sur votre application GWT/GAE? pas de panique, c'est "peut-être normal"! Pour toi lecteur, je te partage l'info ! ]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">IBonjour à tous,</p>
<p><img class="size-medium wp-image-324 alignleft" style="border: 1px solid black;" title="Escargot" src="http://www.jdkcodingclub.net/wp-content/uploads/2009/10/escargot-300x177.gif" alt="C'est lent !" width="188" height="124" /></p>
<p style="text-align: justify;">
<p style="text-align: justify;">Une latence excessive sur votre application GWT/GAE? pas de panique, c&#8217;est &#8220;peut-être normal&#8221;! <strong>Pour toi lecteur,</strong> je te partage l&#8217;info !</p>
<p style="text-align: justify;">Je développe en ce moment une petite application WEB basée sur les technologies GWT et GAE.</p>
<p style="text-align: justify;">
<p style="text-align: justify;">Lors de mes récents tests en environnement de &#8220;production&#8221;, j&#8217;ai constaté une réactivité faiblarde à la première interaction avec mon application. Etant donné que l&#8217;ensemble de mes fonctions appelées interagissent toutes avec le datastore, et ayant résolu le problème avant d&#8217;aller plus loin, je ne peux pas réellement affirmer si c&#8217;est l&#8217;accès au datastore qui est en cause (les requêtes sont plutôt simples) ou si c&#8217;est le serveur applicatif).</p>
<p style="text-align: justify;">Mais une fois passé cette première requête lente&#8230;ça envoie de la <em>patate.</em> Et c&#8217;est surtout taillé pour monter en charge de manière totalement transparente (avantage du GAE).</p>
<p style="text-align: justify;">Bref, en gros maniaque des performances&#8230;je ne pouvais laisser mes futurs utilisateurs adorés avec ce temps d&#8217;attente affreux (entre 6 à 8 sec) et surtout trouver l&#8217;origine du problème. Ci dessous le message visible dans les logs de GAE (interface admin).</p>
<blockquote style="text-align: justify;">
<p style="text-align: left;"><em>#10-22 12:19PM 12.330 /topsecret/log 200<span style="color: red;"> 6352ms 7993cpu_ms 176api_cpu_ms</span> 0kb Mozilla/5.0 (Windows; U; Windows NT 5.1; fr; rv:1.9.1.3) Gecko/20090824 Firefox/3.5.3,gzip(gfe)<br />
78.228.96.116 - - [22/Oct/2009:12:19:18 -0700] &#8220;POST /topsecret/log HTTP/1.1&#8243; 200 132 &#8220;http://topsecret-beta.appspot.com/topsecret/0D01E7FF5AD6B94356E41E31751A053C.cache.html&#8221; &#8220;Mozilla/5.0 (Windows; U; Windows NT 5.1; fr; rv:1.9.1.3) Gecko/20090824 Firefox/3.5.3,gzip(gfe)&#8221;</em></p></blockquote>
<p style="text-align: justify;">Google App Engine optimise ses webfarms. Les ressources allouées pour chaque application est également gérées. Je ne sais pas exactement ce qu&#8217;il s&#8217;y passe derrière, mais une application tombe en &#8220;veille&#8221; au bout d&#8217;un certain temps (5-10 minutes) s&#8217;il n&#8217;y a aucune activité (pas de requête).</p>
<p style="text-align: justify;">Voici le test que j&#8217;ai réalisé:</p>
<ul style="text-align: justify;">
<li>J&#8217;ai attendu au moins 10 min pour placer l&#8217;application en veille.</li>
<li>Une personne s&#8217;est connectée à l&#8217;application et a appelé une fonction (en observant ce phénomène de latence).</li>
<li>Je me suis connecté à l&#8217;application juste après (1 min) et j&#8217;ai observé aucune latence sur la même fonction appelée.</li>
<li>CQFD.</li>
</ul>
<p>Cette latence ne sera donc pas observée si l&#8217;application est périodiquement utilisée. C&#8217;est à dire qu&#8217;il faudra que GAE réalise une consommation CPU toutes les 5 ou 10m pour éviter de tomber en mode &#8220;veille&#8221;, sinon le <em>réveilleur </em>observera ce phénomène de &#8220;lenteur&#8221;.</p>
<p>Il me semblait intéressant de partager  cette information.</p>
<p>Si toi, cher lecteur, tu connait plus précisément le fonctionnement de &#8220;veille&#8221; de GAE, il serait généreux de ta part de nous éclaircir la lanterne. Merci d&#8217;avance.</p>
<p>Merci de m&#8217;avoir lu.</p>
<p>RL.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.jdkcodingclub.net/2009/10/google-app-engine-gae-une-premiere-requete-couteuse/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Google App Engine Java + GWT</title>
		<link>http://www.jdkcodingclub.net/2009/05/google-app-engine-java-gwt/</link>
		<comments>http://www.jdkcodingclub.net/2009/05/google-app-engine-java-gwt/#comments</comments>
		<pubDate>Mon, 18 May 2009 19:13:03 +0000</pubDate>
		<dc:creator>Romain LAFOND</dc:creator>
		
		<category><![CDATA[Non classé]]></category>

		<category><![CDATA[Datastore]]></category>

		<category><![CDATA[Eclipse]]></category>

		<category><![CDATA[GAE]]></category>

		<category><![CDATA[Google]]></category>

		<category><![CDATA[Google App Engine]]></category>

		<category><![CDATA[Google Web Toolkit]]></category>

		<category><![CDATA[gwt]]></category>

		<guid isPermaLink="false">http://www.jdkcodingclub.net/?p=311</guid>
		<description><![CDATA[
Pour tous ceux qui aime le développement web, mais qui sont rebutés à l&#8217;idée de déployer leur application, Google lance son Google App Engine qui supporte désormais le JAVA. Il n&#8217;est, bien sûr, pas là par hasard, il vise à étendre l&#8217;utilisation de GWT, véritable combattant de la guerre des plateformes client riche avec SilverLight, [...]]]></description>
			<content:encoded><![CDATA[<div id="attachment_312" class="wp-caption alignleft" style="width: 148px"><img class="size-full wp-image-312" title="Google App Engine" src="http://www.jdkcodingclub.net/wp-content/uploads/2009/05/appengine_lowres.gif" alt="Google App Engine" width="138" height="107" /><p class="wp-caption-text">Google App Engine</p></div>
<p>Pour tous ceux qui aime le développement web, mais qui sont rebutés à l&#8217;idée de déployer leur application, Google lance son Google App Engine qui supporte désormais le <strong>JAVA</strong>. Il n&#8217;est, bien sûr, pas là par hasard, il vise à étendre l&#8217;utilisation de GWT, véritable combattant de la guerre des plateformes client riche avec SilverLight, Flash, JavaFX, Flex, Echo2, YahooUI!, etc&#8230;</p>
<p>Un <em>plugin</em> eclipse est disponible comprenant 3 boutons <a href="http://www.jdkcodingclub.net/wp-content/uploads/2009/05/gae-gwt-eclipse.png"><img class="size-full wp-image-313" title="Plugins Eclipse" src="http://www.jdkcodingclub.net/wp-content/uploads/2009/05/gae-gwt-eclipse.png" alt="Plugins Eclipse" width="71" height="28" /><br />
</a></p>
<ul>
<li>créer une application (GWT),</li>
<li>compiler son application,</li>
<li>déployer son application sur GAE.</li>
</ul>
<p><span id="more-311"></span></p>
<p style="text-align: justify;">Pour rappel, GAE vous fournit le serveur avec une scalabilité impressionnante. Il supporte jusqu&#8217;à 400 requêtes secondes sans une perte de performance (quota du compte gratuit). Au delà, si vous voulez plus, vous devrez vous acquittez de certains frais supplémentaires). De plus, il vous est possible d&#8217;utiliser soit une base de données relationnel soit le datastore de google dont ils fournissent l&#8217;API.</p>
<p style="text-align: justify;">Il est clair que Google peut facilement imposer son GWT en offrant une plateforme largement au dessus de tout ce qui existe déjà et sans débourser le moindre centime. A ma connaissance, il n&#8217;existe aucun hébergeur sur le marché capable de faire mieux. Son slogan est véritablement évocateur: <span style="font-size: 120%; padding-top: 10px;">&#8220;Easy to build, easy to maintain, easy to scale&#8221;</span></p>
<p style="text-align: justify;">Si vous voulez débuter, je vous envoie sur ce mini-tuto de prise en main pour installer l&#8217;environnement, le plugin, créer votre compte Google App Engine et faire votre premier déploiement. En 30 min, c&#8217;est réglé.</p>
<p style="text-align: justify;"><a href="http://www.programmez.com/tutoriels.php?tutoriel=99&amp;titre=Ma-premiere-application-Google-App-Engine-Java-dans-le-cloud-computing" target="_blank">http://www.programmez.com/tutoriels.php?tutoriel=99&amp;titre=Ma-premiere-application-Google-App-Engine-Java-dans-le-cloud-computing</a></p>
<p style="text-align: justify;"><strong>PS</strong>: à noter qu&#8217;il faut demander la prise en charge de JAVA sur votre compte.</p>
<p style="text-align: justify;">Vous recevrez l&#8217;erreur suivante lors de votre déploiement:</p>
<blockquote>
<pre><strong><span style="color: #339966;">java.io.IOException: Error posting to URL: http://appengine.google.com/api/appversion/...
400 Bad Request
Invalid runtime specified.

Unable to upload app: Error posting to URL: http://appengine.google.com/api/appversion/...
400 Bad Request
Invalid runtime specified.</span></strong></pre>
</blockquote>
<p style="text-align: justify;">Pour corriger cela, rendez-vous sur la page suivante et postulez: <a href="http://appengine.google.com/promo/java_runtime" target="_blank">http://appengine.google.com/promo/java_runtime</a></p>
<p style="text-align: justify;">
<p style="text-align: justify;">Merci de m&#8217;avoir lu.</p>
<p style="text-align: justify;">Romain LAFOND.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.jdkcodingclub.net/2009/05/google-app-engine-java-gwt/feed/</wfw:commentRss>
		</item>
		<item>
		<title>To be free() !</title>
		<link>http://www.jdkcodingclub.net/2009/05/to-be-free-anonyme-via-proxy/</link>
		<comments>http://www.jdkcodingclub.net/2009/05/to-be-free-anonyme-via-proxy/#comments</comments>
		<pubDate>Thu, 14 May 2009 19:18:42 +0000</pubDate>
		<dc:creator>Romain LAFOND</dc:creator>
		
		<category><![CDATA[Astuces]]></category>

		<category><![CDATA[proxy-list.org;serveur anonyme; connexion internet; IP;]]></category>

		<guid isPermaLink="false">http://www.jdkcodingclub.net/?p=296</guid>
		<description><![CDATA[Être incognito sur internet ! Voilà une belle idée ! Mais est-ce vraiment possible ? Avec l’annonce de la loi HADOPI qui compromet sérieusement la liberté de l’internaute, il convient de s’y intéresser d’un peu plus près.
Tout d’abord, dressons un petit schéma de ce qui se trame aujourd’hui lorsque vous naviguez sur internet.




Actuellement, lorsque que [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;"><a href="http://www.jdkcodingclub.net/wp-content/uploads/2009/05/homme_invisible.jpg"><img class="size-medium wp-image-297 alignleft" style="border: 1px solid black; margin: 5px;" title="homme_invisible" src="http://www.jdkcodingclub.net/wp-content/uploads/2009/05/homme_invisible-300x229.jpg" alt="" width="171" height="133" /></a>Être incognito sur internet ! Voilà une belle idée ! Mais est-ce vraiment possible ? Avec l’annonce de la loi HADOPI qui compromet sérieusement la liberté de l’internaute, il convient de s’y intéresser d’un peu plus près.</p>
<p style="text-align: justify;">Tout d’abord, dressons un petit schéma de ce qui se trame aujourd’hui lorsque vous naviguez sur internet.</p>
<p style="text-align: justify;">
<p style="text-align: justify;">
<p style="text-align: justify;">
<div id="attachment_300" class="wp-caption aligncenter" style="width: 553px"><a href="http://www.jdkcodingclub.net/wp-content/uploads/2009/05/connexion_internet1.png"><img class="size-full wp-image-300" title="connexion_internet1" src="http://www.jdkcodingclub.net/wp-content/uploads/2009/05/connexion_internet1.png" alt="" width="543" height="342" /></a><p class="wp-caption-text">Connexion Internet de chez vous à JDK CC</p></div>
<p style="text-align: justify;">
<p>Actuellement, lorsque que vous vous connectez à votre « box » pour aller naviguer sur Internet, votre FAI (Orange, Free, Alice, Darty,  Neuf, etc..) vous attribue une adresse IP. C’est cette adresse IP qui permettra, en cas de problème, de vous retrouver.</p>
<p><span id="more-296"></span></p>
<p>Dans le cas d’un adressage statique, vous avez toujours la même IP, mais bien souvent les FAI vous fournissent une adresse IP dit dynamique, c&#8217;est-à-dire, qui change à chaque reboot de la « box ». Dans ce cas, ne vous croyait pas hors d’atteindre, les FAI archivent et savent quand et à quel abonné une adresse IP a été fournit. Si vous commettez une infraction,  la brigade de police judiciaire BRCI (Brigade de Répression de la Criminalité Informatique) sera vous retrouver. Comment ? Légalement, il est obligatoire pour chaque serveur de conserver ses logs pendant plusieurs années. C’est grâce à ses logs (avec l’IP) qu’ils vous retrouveront sans problème.<br />
Bref, sur internet à chaque fois que l’on fait quelque chose (clic, téléchargement, soumission d’un formulaire), on laisse une empreinte. De plus,  sur le schéma, on voit bien que tout passe par le FAI. Il sait absolument tout de ce que chaque internaute fait.</p>
<h3>Une solution</h3>
<p>Si l’on veut rester incognito (sans passer par la box de son voisin), il faut passer par un proxy anonyme pour « masquer » l’IP FAI qui permettrait de nous retrouver. Lorsque l’on se connecte à un site, nous n&#8217;avons plus comme empreinte l&#8217;IP de notre FAI, mais l’IP du proxy par lequel on passe. On devient donc impossible à retrouver.</p>
<p>Pourquoi un proxy anonyme ? Et tout simplement pas un proxy tout court ? Un proxy log, c’est une obligation. Si l’on veut vous retrouver, il suffira d’aller voir dans les logs du proxy pour récupérer votre IP du FAI. Un proxy anonyme par principe ne log pas, c&#8217;est-à-dire qu’il s’engage à désactiver ce mécanisme. Mais le fait-il vraiment ? Voilà une autre question.</p>
<h3>Pratique (avec firefox).</h3>
<p>Allons sur le site <a title="http://www.localiser-ip.com" href="http://www.localiser-ip.com" target="_blank">http://www.localiser-ip.com</a> (il géo-localise votre ip).</p>
<div class="mceTemp mceIEcenter">
<div id="attachment_309" class="wp-caption aligncenter" style="width: 500px"><img class="size-full wp-image-309" title="Geolocalisation IP" src="http://www.jdkcodingclub.net/wp-content/uploads/2009/05/geolocalisation_ip1.png" alt="Geolocalisation IP" width="490" height="643" /><p class="wp-caption-text">Sans proxy anonyme (IP FAI)</p></div>
</div>
<p>Voyons maintenant le site proxy-list.org qui propose des proxys anonymes.</p>
<div id="attachment_302" class="wp-caption aligncenter" style="width: 510px"><a href="http://www.jdkcodingclub.net/wp-content/uploads/2009/05/proxy-listorg.png"><img class="size-full wp-image-302" title="Référencement des proxys anonymes" src="http://www.jdkcodingclub.net/wp-content/uploads/2009/05/proxy-listorg.png" alt="Référencement des proxys anonymes" width="500" height="540" /></a><p class="wp-caption-text">Référencement des proxys anonymes</p></div>
<p>La configuration sous firefox pour passer par un serveur proxy: &#8220;Outils &gt; Options &gt; (onglet avancé et réseaux) &gt; paramètres&#8221;.</p>
<div id="attachment_303" class="wp-caption aligncenter" style="width: 481px"><a href="http://www.jdkcodingclub.net/wp-content/uploads/2009/05/config-firefox-proxy-anonyme.png"><img class="size-full wp-image-303" title="Configurer firefox pour un proxy anonyme" src="http://www.jdkcodingclub.net/wp-content/uploads/2009/05/config-firefox-proxy-anonyme.png" alt="Configurer firefox pour un proxy anonyme" width="471" height="421" /></a><p class="wp-caption-text">Configurer firefox pour un proxy anonyme</p></div>
<p>Et voyons maintenant le résultat, nous sommes en plein Nigeria <img src='http://www.jdkcodingclub.net/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> </p>
<div id="attachment_304" class="wp-caption aligncenter" style="width: 510px"><a href="http://www.jdkcodingclub.net/wp-content/uploads/2009/05/geolocalisation_ip_sous_proxy_anonyme.png"><img class="size-full wp-image-304" title="Géolocalisation IP avec un serveur proxy anonyme" src="http://www.jdkcodingclub.net/wp-content/uploads/2009/05/geolocalisation_ip_sous_proxy_anonyme.png" alt="Géolocalisation IP avec un serveur proxy anonyme" width="500" height="638" /></a><p class="wp-caption-text">Géolocalisation IP avec un serveur proxy anonyme</p></div>
<p>A utiliser avec précaution. Merci de m&#8217;avoir lu.</p>
<p>Romain LAFOND</p>
]]></content:encoded>
			<wfw:commentRss>http://www.jdkcodingclub.net/2009/05/to-be-free-anonyme-via-proxy/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Un nommage à Hibernate</title>
		<link>http://www.jdkcodingclub.net/2009/04/un-nommage-a-hibernate/</link>
		<comments>http://www.jdkcodingclub.net/2009/04/un-nommage-a-hibernate/#comments</comments>
		<pubDate>Mon, 06 Apr 2009 17:56:41 +0000</pubDate>
		<dc:creator>Romain LAFOND</dc:creator>
		
		<category><![CDATA[Non classé]]></category>

		<category><![CDATA[Hibernate]]></category>

		<guid isPermaLink="false">http://www.jdkcodingclub.net/?p=287</guid>
		<description><![CDATA[
Je remonte un problème qui m&#8217;a paru personnellement assez fourbe. Il concerne un bug (ou pas?) lors de la création d&#8217;une base de données alimenté par un fichier de conf Hibernate.  Bien entendu, je fournis la solution&#8230;  

On obtient la sortie d&#8217;erreurs suivante (il ne veut rien savoir, la table &#8220;USER&#8221; ne lui plaît [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.jdkcodingclub.net/wp-content/uploads/2009/04/logo_hibernate.gif"><img class="size-medium wp-image-288 alignleft" title="Hibernate" src="http://www.jdkcodingclub.net/wp-content/uploads/2009/04/logo_hibernate.gif" alt="Hibernate" width="186" height="58" /></a></p>
<p style="text-align: justify;">Je remonte un problème qui m&#8217;a paru personnellement assez fourbe. Il concerne un bug (ou pas?) lors de la création d&#8217;une base de données alimenté par un fichier de conf Hibernate.  Bien entendu, je fournis la solution&#8230; <img src='http://www.jdkcodingclub.net/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p style="text-align: justify;">
<p style="text-align: justify;">On obtient la sortie d&#8217;erreurs suivante (il ne veut rien savoir, la table &#8220;USER&#8221; ne lui plaît pas):</p>
<p>24 mars 2009 22:54:45 org.hibernate.tool.hbm2ddl.SchemaExport create<br />
GRAVE: Unsuccessful: create table USER (UID integer not null, LOGIN varchar(12) not null unique, PASSWORD varchar(12) not null, EMAIL varchar(255) not null, REGISTRATION-DATE timestamp not null, STATUS integer not null, primary key (UID))<br />
24 mars 2009 22:54:45 org.hibernate.tool.hbm2ddl.SchemaExport create<br />
GRAVE: Erreur de syntaxe : Encountered &#8220;USER&#8221; at line 1, column 14</p>
<p>Avec comme configuration :</p>

<div class="wp_syntax"><div class="code"><pre class="xml xml" style="font-family:monospace;"><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;class</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;core.User&quot;</span> <span style="color: #000066;">table</span>=<span style="color: #ff0000;">&quot;USER&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
        <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;id</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;uid&quot;</span> <span style="color: #000066;">column</span>=<span style="color: #ff0000;">&quot;UID&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>
            <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;generator</span> <span style="color: #000066;">class</span>=<span style="color: #ff0000;">&quot;increment&quot;</span><span style="color: #000000; font-weight: bold;">/&gt;</span></span>
        <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/id<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
        <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;property</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;login&quot;</span> <span style="color: #000066;">column</span>=<span style="color: #ff0000;">&quot;LOGIN&quot;</span> <span style="color: #000066;">not-null</span>=<span style="color: #ff0000;">&quot;true&quot;</span> <span style="color: #000066;">unique</span>=<span style="color: #ff0000;">&quot;true&quot;</span> <span style="color: #000066;">length</span>=<span style="color: #ff0000;">&quot;12&quot;</span><span style="color: #000000; font-weight: bold;">/&gt;</span></span>
        <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;property</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;password&quot;</span> <span style="color: #000066;">column</span>=<span style="color: #ff0000;">&quot;PASSWORD&quot;</span> <span style="color: #000066;">not-null</span>=<span style="color: #ff0000;">&quot;true&quot;</span> <span style="color: #000066;">length</span>=<span style="color: #ff0000;">&quot;12&quot;</span><span style="color: #000000; font-weight: bold;">/&gt;</span></span>
        <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;property</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;email&quot;</span> <span style="color: #000066;">column</span>=<span style="color: #ff0000;">&quot;EMAIL&quot;</span> <span style="color: #000066;">not-null</span>=<span style="color: #ff0000;">&quot;true&quot;</span> <span style="color: #000000; font-weight: bold;">/&gt;</span></span>
        <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;property</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;registrationDate&quot;</span> <span style="color: #000066;">column</span>=<span style="color: #ff0000;">&quot;REGISTRATION-DATE&quot;</span> <span style="color: #000066;">not-null</span>=<span style="color: #ff0000;">&quot;true&quot;</span> <span style="color: #000066;">type</span>=<span style="color: #ff0000;">&quot;timestamp&quot;</span><span style="color: #000000; font-weight: bold;">/&gt;</span></span>
        <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;property</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;status&quot;</span> <span style="color: #000066;">column</span>=<span style="color: #ff0000;">&quot;STATUS&quot;</span> <span style="color: #000066;">not-null</span>=<span style="color: #ff0000;">&quot;true&quot;</span> <span style="color: #000066;">type</span>=<span style="color: #ff0000;">&quot;integer&quot;</span><span style="color: #000000; font-weight: bold;">/&gt;</span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/class<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></pre></div></div>

<h3 style="text-align: justify;">Problème bête (une histoire de nommage&#8230;):</h3>
<p style="text-align: justify;">Le problème vient de la définition de l&#8217;attribut &#8220;column&#8221;.  Hibernate ne supporte pas les majuscules en nom de colonne. C&#8217;est valable également pour les tables.</p>
<h3 style="text-align: justify;">Solutions (si j&#8217;avais su&#8230;):</h3>
<ul style="text-align: justify;">
<li>écrire les tables en minuscule,</li>
<li>rajouter des back-quotes &#8211;&gt; ` &lt;&#8211; (comme ceci: <strong>column=&#8221;`LOGIN`&#8221;</strong>)</li>
</ul>
<p style="text-align: justify;">En espérant vous avoir aidé !</p>
<p style="text-align: justify;">Romain LAFOND.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.jdkcodingclub.net/2009/04/un-nommage-a-hibernate/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Codeurs du dimanche</title>
		<link>http://www.jdkcodingclub.net/2009/03/codeurs-du-dimanche/</link>
		<comments>http://www.jdkcodingclub.net/2009/03/codeurs-du-dimanche/#comments</comments>
		<pubDate>Wed, 18 Mar 2009 20:03:03 +0000</pubDate>
		<dc:creator>Romain LAFOND</dc:creator>
		
		<category><![CDATA[Non classé]]></category>

		<category><![CDATA[Codeur du dimanche]]></category>

		<guid isPermaLink="false">http://www.jdkcodingclub.net/?p=267</guid>
		<description><![CDATA[




Il faut l’avouer, en tant que développeurs, nous avons acquis des compétences particulières nous octroyant la merveilleuse capacité de…créer. Ça fait un peu « dieu » dit comme ça. Mais créer quoi au fait ? Nous ne sommes pas vraiment ce que l’on appelle « des artistes ». Ou du moins, pas au sens des [...]]]></description>
			<content:encoded><![CDATA[<div class="mceTemp">
<dl id="attachment_269" class="wp-caption alignleft" style="width: 274px;">
<dt class="wp-caption-dt"><a href="http://www.jdkcodingclub.net/wp-content/uploads/2009/03/artiste.jpg"><img class="size-medium wp-image-269" title="Artiste" src="http://www.jdkcodingclub.net/wp-content/uploads/2009/03/artiste-300x229.jpg" alt="Artiste" width="264" height="202" /></a></dt>
</dl>
</div>
<p style="text-align: justify;">Il faut l’avouer, en tant que développeurs, nous avons acquis des compétences particulières nous octroyant la merveilleuse capacité de…créer. Ça fait un peu « dieu » dit comme ça. Mais créer quoi au fait ? Nous ne sommes pas vraiment ce que l’on appelle « des artistes ». Ou du moins, pas au sens des beaux arts comme on l’entend. Nos outils ne sont pas aussi nobles qu’un pinceau ou qu’un crayon. La création se fait avec des centaines voire des milliers de lignes de code Et oui…c’est nettement moins sexy dit comme ça, mais on aime ça ! Mais quelque part, il y a une graine d’artiste qui sommeille en nous avec un style, par contre, beaucoup plus…geek !</p>
<p style="text-align: justify;"><span id="more-267"></span></p>
<p style="text-align: justify;">
<p style="text-align: justify;">Au-delà de la technique,  ce qui importe le plus, c’est bien sûr la finalité (ce que l’utilisateur va bien pouvoir en faire et ce pourquoi il va l’utiliser). Son succès réside bien souvent dans son inventivité, identité, unicité et sa créativité dans la manière dont elle s’utilise (il faut que l’utilisateur y trouve un intérêt, sans quoi elle finit à la poubelle). Dans un monde où tout va vite, c’est l’idée qui est bien souvent la clef et non la manière de la mettre en œuvre.</p>
<p style="text-align: justify;">
<p><a href="http://www.jdkcodingclub.net/wp-content/uploads/2009/03/500e.jpg"><img class="size-medium wp-image-271 alignright" style="border: 1px solid black;" title="500 Euros" src="http://www.jdkcodingclub.net/wp-content/uploads/2009/03/500e-300x225.jpg" alt="" width="245" height="206" /></a></p>
<p style="text-align: justify;">De plus, compte tenu du contexte économique lié au monde d’internet, il est désormais possible de tirer profit de sa création. Un bon point pour nous, les geeks, faces aux artistes, les vrais. Comment ça ? Il y a deux solutions viables actuellement. La première étant de privilégier les micro-transactions en « commercialisant » son appli. à de très petit prix de l’ordre de 50 centimes d’euros/dollars (ex : iPhone store). La deuxième, surement la plus utilisée, est le recours aux revenus publicitaires (ce qui signifie déjà une orientation axée web). Sur le papier, ça n’a l’air de rien, mais cette modique somme multipliée par 50 000, 100 000, ou 500 000 utilisateurs permet de générer de vrais revenus. En vivre n’est pas usuel et n’arrive qu’à très peu de personnes (on pourra noter la réussite du projet ma-bimbo.com qui est devenu aujourd’hui une entreprise). Généralement, on en tire de petits bénéfices permettant de s’acheter une petite babiole. Mais l’argent, ce n’est pas la finalité recherchée, mais disons que c’est le petit « bonus-track ». Et ce n’est déjà pas si mal que ça !</p>
<p style="text-align: justify;">
<div class="mceTemp">
<dl id="attachment_273" class="wp-caption alignleft" style="width: 268px;">
<dt class="wp-caption-dt"><a href="http://www.jdkcodingclub.net/wp-content/uploads/2009/03/geek.jpg"><img class="size-medium wp-image-273" title="Geek" src="http://www.jdkcodingclub.net/wp-content/uploads/2009/03/geek-258x300.jpg" alt="Mes projets persos..." width="258" height="300" /></a></dt>
</dl>
</div>
<p style="text-align: justify;">Adepte des projets « perso », c’est à foison que je me suis exercé dans ma jeune carrière de « développeur ». De manière générale, j’ai toujours réalisé mes projets en fonction des compétences que j’avais à ce moment là. Depuis, j’ai constaté que plus j’accroissais mes compétences, plus j’avais de nouvelles idées de projet aussi folles les unes que les autres. Le hic dans tout ça, c’est véritablement le problème du temps. Impossible d’aller jusqu’au bout d’un projet. Entre l’école, les sorties, les vacances, c’est un hachage continue qui tend à stopper un projet. Depuis le début de mon master MIAGe, j’ai commencé un projet d’une envergure plutôt conséquente visant à développer une plateforme de poker. Ayant touché du doigt plusieurs domaines compliquées, je ne suis même pas arrivé à la moitié de mes objectifs. Beaucoup trop long pour un seul homme. J’étais aux environs de 500 heures de développement. Ce qui fait 62.5 jours homme. Malheureusement, depuis, j’ai acquis de nouvelles compétences rendant quasiment obsolète une grosse partie du moteur de jeu. Il y a tant à refaire par rapport à l’existant : programmation par les patrons, gestion de la persistance, web services, server push, etc.  De plus, mes goûts ont changé et ma vision de la « bête » a véritablement évoluée. D’autant plus que je me suis sensibilisé à des problématiques beaucoup plus évidentes et pérennes selon moi (maintenance, vélocité, robustesse, ergonomie, et j’en passe…). C’est pourquoi, pour la première fois de ma vie, j’en suis à écrire les spécifications détaillées avant de commencer le cycle de développement. Et j’espère cette fois-ci pouvoir arriver au bout. C’est devenu, au fil du temps, beaucoup plus qu’un simple projet, c’est un mélange de défi, de curiosité et de volonté de ne pas rester sur un gout d’inachevé. Sachant que cela reste évidemment un plaisir d’occupation.</p>
<p style="text-align: justify;">
<p><a href="http://www.jdkcodingclub.net/wp-content/uploads/2009/03/ampoule.png"><img class="size-medium wp-image-274 alignleft" title="Idée" src="http://www.jdkcodingclub.net/wp-content/uploads/2009/03/ampoule-300x300.png" alt="Les idées ont du génie !" width="199" height="199" /></a></p>
<p style="text-align: justify;">Le développeur assume à 100% sa pulsion créative et son plaisir réside aussi bien dans la réalisation que dans la satisfaction d’y parvenir. Généralement, les projets sont longs, se segmentent dans le temps et se font très souvent sur le temps libre…d’où le surnom « développeur du dimanche ». Au final, ce qui est le plus drôle, c’est souvent la période où le projet naît. C’est généralement des tas d’idées plus  farfelus les uns que les autres. Ca fristouille dans tous les sens !<br />
Il y également ceux qui pense inventer quelque chose de « révolutionnaire », ce développeur fou voudra alors concrétiser cette envie et vivre son rêve jusqu’au bout (on pourrait comparer cette envie à celle de créer une entreprise, ou d’un inventeur et de son invention. Tous les deux sont persuadés que cela va marcher !).</p>
<p style="text-align: justify;">
<p style="text-align: justify;">
<p style="text-align: justify;">Que ça soit par envi ou par intérêt, le développeur « fabrique » ses programmes ! <strong>Utile ou pas utile, cela n’a aucune importance</strong>. La finalité est de se faire plaisir. <strong>Développer, coder, c’est une vrai passion</strong>. Et à ce titre, ça vaut le coup de la vivre à 200% ! <strong>N’en n’ayez pas honte</strong> !</p>
<p style="text-align: justify;">
<p style="text-align: justify;">Romain LAFOND</p>
]]></content:encoded>
			<wfw:commentRss>http://www.jdkcodingclub.net/2009/03/codeurs-du-dimanche/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Changer la couleur d&#8217;un Clip Flash en AS3</title>
		<link>http://www.jdkcodingclub.net/2008/11/changer-couleur-clip-movieclip-flash-as3/</link>
		<comments>http://www.jdkcodingclub.net/2008/11/changer-couleur-clip-movieclip-flash-as3/#comments</comments>
		<pubDate>Sat, 29 Nov 2008 10:40:19 +0000</pubDate>
		<dc:creator>Romain LAFOND</dc:creator>
		
		<category><![CDATA[Astuces]]></category>

		<category><![CDATA[ActionScript 3.0]]></category>

		<category><![CDATA[Flash]]></category>

		<guid isPermaLink="false">http://www.jdkcodingclub.net/?p=258</guid>
		<description><![CDATA[




Vous voulez changer dynamiquement la couleur d&#8217;un de vos Clip ou MovieClip en Flash à partir d&#8217;Action Script 3.0 (AS3).
Cela se fait en 3 lignes de code:

/* création du Clip - MovieClip */
var monClip:Rond = new Rond&#40;&#41;;
this.addChild&#40;monClip&#41;;
&#160;
/* on change ici sa couleur */
var newColorTransform:ColorTransform=monClip.transform.colorTransform;
newColorTransform.color=0x330000; // ici le code couleur FF330000
&#160;
monClip.transform.colorTransform=newColorTransform;

Voilà !
Romain LAFOND
]]></description>
			<content:encoded><![CDATA[<div class="mceTemp">
<dl id="attachment_263" class="wp-caption alignleft" style="width: 78px;">
<dt class="wp-caption-dt"><img class="size-full wp-image-263" title="Changer la couleur d'un Clip Flash en AS" src="http://www.jdkcodingclub.net/wp-content/uploads/2008/11/color.png" alt="Changer la couleur d'un Clip Flash en AS" width="68" height="68" /></dt>
</dl>
</div>
<p>Vous voulez changer dynamiquement la couleur d&#8217;un de vos <em>Clip</em> ou <em>MovieClip</em> en Flash à partir d&#8217;Action Script 3.0 (AS3).</p>
<p>Cela se fait en 3 lignes de code:</p>

<div class="wp_syntax"><div class="code"><pre class="actionscript3 actionscript3" style="font-family:monospace;"><span style="color: #3f5fbf;">/* création du Clip - MovieClip */</span>
<span style="color: #6699cc; font-weight: bold;">var</span> monClip<span style="color: #000000; font-weight: bold;">:</span>Rond = <span style="color: #0033ff; font-weight: bold;">new</span> Rond<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>;
<span style="color: #0033ff; font-weight: bold;">this</span>.<span style="color: #004993;">addChild</span><span style="color: #000000;">&#40;</span>monClip<span style="color: #000000;">&#41;</span>;
&nbsp;
<span style="color: #3f5fbf;">/* on change ici sa couleur */</span>
<span style="color: #6699cc; font-weight: bold;">var</span> newColorTransform<span style="color: #000000; font-weight: bold;">:</span><span style="color: #004993;">ColorTransform</span>=monClip.<span style="color: #004993;">transform</span>.<span style="color: #004993;">colorTransform</span>;
newColorTransform.<span style="color: #004993;">color</span>=0x330000; <span style="color: #009900;">// ici le code couleur FF330000</span>
&nbsp;
monClip.<span style="color: #004993;">transform</span>.<span style="color: #004993;">colorTransform</span>=newColorTransform;</pre></div></div>

<p>Voilà !</p>
<p>Romain LAFOND</p>
]]></content:encoded>
			<wfw:commentRss>http://www.jdkcodingclub.net/2008/11/changer-couleur-clip-movieclip-flash-as3/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Le problème des threads avec Server Push</title>
		<link>http://www.jdkcodingclub.net/2008/11/le-probleme-des-threads-avec-server-push/</link>
		<comments>http://www.jdkcodingclub.net/2008/11/le-probleme-des-threads-avec-server-push/#comments</comments>
		<pubDate>Tue, 25 Nov 2008 21:49:21 +0000</pubDate>
		<dc:creator>Romain LAFOND</dc:creator>
		
		<category><![CDATA[Comet]]></category>

		<category><![CDATA[Tutorial]]></category>

		<category><![CDATA[CometProcessor]]></category>

		<category><![CDATA[Continuations]]></category>

		<category><![CDATA[Jetty]]></category>

		<category><![CDATA[server push]]></category>

		<category><![CDATA[Servlet]]></category>

		<category><![CDATA[Thread]]></category>

		<category><![CDATA[Tomcat]]></category>

		<guid isPermaLink="false">http://www.jdkcodingclub.net/?p=195</guid>
		<description><![CDATA[Nous verrons dans cet article les limites du principe de Server Push lorsqu’il est implanté avec une API I/O standard (non multiplexée).  Pour mieux comprendre, rappelons brièvement le cycle de vie d’une servlet (source).





Cycle de vie d&#8217;une Servlet
Le cycle de vie d&#8217;une servlet est assuré par le conteneur de servlet (Tomcat, Jetty, Glassfish, etc..). Ainsi [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">Nous verrons dans cet article les limites du principe de <em>Server Push</em> lorsqu’il est implanté avec une API I/O standard (non multiplexée).  Pour mieux comprendre, rappelons brièvement le cycle de vie d’une servlet (<a title="http://www.commentcamarche.net/contents/servlets/servcycle.php3" href="http://www.commentcamarche.net/contents/servlets/servcycle.php3" target="_blank">source</a>).</p>
<p style="text-align: center;"><img class="aligncenter size-medium wp-image-227" style="border: 1px solid black;" title="1 requête = 1 Thread" src="http://www.jdkcodingclub.net/wp-content/uploads/2008/11/thread-requete-300x296.jpg" alt="" width="300" height="296" /></p>
<p style="text-align: justify;">
<p style="text-align: justify;">
<p style="text-align: center;">
<p><span id="more-195"></span></p>
<h3>Cycle de vie d&#8217;une Servlet</h3>
<p style="text-align: justify;">Le cycle de vie d&#8217;une servlet est assuré par le conteneur de servlet (Tomcat, Jetty, Glassfish, etc..). Ainsi afin d&#8217;être à même de fournir la requête à la servlet, récupérer la réponse ou bien tout simplement démarrer/arrêter la servlet, il implémente l’interface (servlet) permettant de réaliser :</p>
<ol>
<li style="text-align: justify;">Le serveur crée un pool de threads auxquels il va pouvoir affecter chaque requête  (ce pool est limité dans la configuration du serveur, pas plus de x threads exécutant la servlet)</li>
<li style="text-align: justify;">La servlet est chargée au démarrage du serveur ou lors de la première requête</li>
<li style="text-align: justify;">La servlet est instanciée par le serveur  (1 fois)</li>
<li style="text-align: justify;">La méthode init() est invoquée par le conteneur</li>
<li style="text-align: justify;">Lors de la première requête, le conteneur crée les objets <em>Request</em> et <em>Response</em> spécifiques à la requête</li>
<li style="text-align: justify;">La méthode service() est appelée à chaque requête dans une nouvelle thread. Les objets <em>Request </em>et <em>Response</em> lui sont passés en paramètre. Une <em>servlet</em> est donc accessible par plusieurs threads en même temps.</li>
<li style="text-align: justify;">Grâce à l&#8217;objet Request, la méthode service() va pouvoir analyser les informations en provenance du client</li>
<li style="text-align: justify;">Grâce à l&#8217;objet Response, la méthode service() va fournir une réponse au client (puis ferme la connexion)</li>
<li style="text-align: justify;">La méthode destroy() est appelée lors du déchargement de la servlet, c&#8217;est-à-dire lorsqu&#8217;elle n&#8217;est plus requise par le serveur. La servlet est alors signalée au garbage collector (communément francisé en ramasse-miette)</li>
</ol>
<h3>Geler une requête</h3>
<p style="text-align: justify;">Dans le but de « geler » la réponse du coté serveur, on interrompt le traitement de la réponse en « bloquant » le thread (à l’aide d&#8217;un verrou en attente sur une ressource - autre que la servlet sinon toutes les requêtes seront bloquées). Autre remarque, les spécifications servlets interdisent d&#8217;utiliser un Thread.sleep() dans une servlet. En effet, une servlet est un objet partagé par plusieurs clients (donc plusieurs Threads).</p>
<p style="text-align: justify;">
Dans l’exemple ci-dessous, on désire toujours récupérer la 200éme ligne. La servlet se met en attente – wait() – s’il n’y a pas cette dernière.</p>
<p style="text-align: justify;">

<div class="wp_syntax"><div class="code"><pre class="php php" style="font-family:monospace;">try<span style="color: #009900;">&#123;</span>
   synchronized <span style="color: #009900;">&#40;</span> chatMessages <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
      <span style="color: #b1b100;">while</span> <span style="color: #009900;">&#40;</span> chatMessages<span style="color: #339933;">.</span>size<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">&amp;</span>lt; <span style="color: #cc66cc;">200</span> <span style="color: #009900;">&#41;</span> try <span style="color: #009900;">&#123;</span>
         <span style="color: #666666; font-style: italic;">// on gèle la connexion tant qu’il n’y a pas eu d’événement</span>
         chatMessages<span style="color: #339933;">.</span>wait<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>;
      <span style="color: #009900;">&#125;</span>
      repondre<span style="color: #009900;">&#40;</span>chatMessages<span style="color: #339933;">.</span>get<span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">200</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span>;
   <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span>catch <span style="color: #009900;">&#40;</span> InterruptedException e <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
   repondre<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Server interrupted. Chat Session Closed.&quot;</span><span style="color: #009900;">&#41;</span>;
<span style="color: #009900;">&#125;</span></pre></div></div>

<p style="text-align: justify;">Lorsqu&#8217;on client envoie un message, il ajoute ce message à la ligne des messages. Puis, on réveille alors tous les threads endormis (en attente d&#8217;un message). Lorsqu&#8217;il se réveille, il exécute donc l’instruction juste après le <strong><em>wait()</em></strong>), c&#8217;est à dire <em><strong>return(chatMessages.get(200));</strong></em> qui retourne au client la 200éme ligne, libère le thread et ferme la connexion.</p>
<p style="text-align: justify;">Ci-dessous les instructions de traitement lorsqu&#8217;un client envoie un message.</p>
<p style="text-align: justify;">

<div class="wp_syntax"><div class="code"><pre class="php php" style="font-family:monospace;">synchronized <span style="color: #009900;">&#40;</span> chatMessages <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    chatMessages<span style="color: #339933;">.</span>add<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;je suis la 200eme ligne...&quot;</span><span style="color: #009900;">&#41;</span>;
    chatMessages<span style="color: #339933;">.</span>notifyAll<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>;
<span style="color: #009900;">&#125;</span></pre></div></div>

<p style="text-align: justify;">
<h3>Problèmes</h3>
<p style="text-align: justify;">Malheureusement, cela signifie qu’un thread est alloué pour chaque requête gelée (type “server push”). Généralement les serveurs web (Tomcat, Jetty, etc..) ont un nombre limité de threads autorisés (sinon, il serait très facile de faire crasher un serveur). Une fois ce cap atteint, il refuse d’accepter une nouvelle connexion, donc de lancer un nouveau thread. Toute nouvelle requête est simplement ignorée. <strong>Le serveur pense qu’il est sous une charge importante, alors qu’il ne l’est pas du tout</strong>.</p>
<p style="text-align: justify;">Il est toujours possible de modifier le nombre de threads disponibles pour une servlet, mais ce n&#8217;est pas une bonne solution. Aujourd&#8217;hui, il existe quelque chose de beaucoup plus robuste et qui supporte très bien la charge. Ça s’appelle <em>Comet.</em> Il est implanté dans Jetty sous le nom de « continuations » ou « CometProcessor » sous Tomcat.</p>
<p style="text-align: justify;">L’idée derrière la <em>continuation</em> est bien sûr de geler les connexions (comme on l’a vu précédemment). Sauf que cette fois-ci on va employer une API de bas niveau pour gérer les entrées/sorties dans le but de n’avoir qu’un seul thread qui gère les requêtes « server push » (au lieu du schéma &#8220;1 requête = 1 thread&#8221;).</p>
<p style="text-align: justify;">Jusqu’à l’API 3.0 Servlet, le principe de continuation n’existait pas. Chaque conteneur de Servlet le faisait à sa sauce.<br />
On peut citer les deux plus connus :</p>
<ul style="text-align: justify;">
<li>Jetty Continuations</li>
<li>Tomcat Advanced I/O Support (CometProcessor)</li>
</ul>
<p style="text-align: justify;">ps: l’API Servlet 3.0 est encore en bêta.</p>
<p style="text-align: justify;">Romain LAFOND</p>
]]></content:encoded>
			<wfw:commentRss>http://www.jdkcodingclub.net/2008/11/le-probleme-des-threads-avec-server-push/feed/</wfw:commentRss>
		</item>
		<item>
		<title>La solution du server push : « connection refresh »</title>
		<link>http://www.jdkcodingclub.net/2008/11/server-push-connexion-refresh/</link>
		<comments>http://www.jdkcodingclub.net/2008/11/server-push-connexion-refresh/#comments</comments>
		<pubDate>Fri, 21 Nov 2008 18:51:07 +0000</pubDate>
		<dc:creator>Romain LAFOND</dc:creator>
		
		<category><![CDATA[Comet]]></category>

		<category><![CDATA[Tutorial]]></category>

		<category><![CDATA[connexion refresh]]></category>

		<category><![CDATA[long polling]]></category>

		<category><![CDATA[polling]]></category>

		<category><![CDATA[server push]]></category>

		<guid isPermaLink="false">http://www.jdkcodingclub.net/?p=172</guid>
		<description><![CDATA[Le protocole TCP/IP s&#8217;assure, entre autre, du bon transport d’une information (un ensemble de paquets  IP) d&#8217;un point A au point B (rapide résumé de ce qui nous intéresse sur ce protocole). Cette traversé, si on peut l’appeler comme ça, est composée d’une multitude d&#8217;obstacles comme par exemple des routeurs, des firewall, des proxy, des [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">Le protocole TCP/IP s&#8217;assure, entre autre, du bon transport d’une information (un ensemble de paquets  IP) d&#8217;un point A au point B (rapide résumé de ce qui nous intéresse sur ce protocole). Cette traversé, si on peut l’appeler comme ça, est composée d’une multitude d&#8217;obstacles comme par exemple des routeurs, des <em>firewall</em>, des <em>proxy</em>, des <em>VLAN</em>, etc. Chaque élément est soumis à des contraintes physiques (avoir un temps de réponse acceptable), des contraintes de sécurité et des contraintes de bon fonctionnement (ne pas altérer l&#8217;intégrité des données).</p>
<p style="text-align: justify;">
<p style="text-align: center;"><img class="size-medium wp-image-176 aligncenter" title="Connection refresh : la solution du server push" src="http://www.jdkcodingclub.net/wp-content/uploads/2008/11/connection-refresh-solution-300x187.jpg" alt="Connection refresh : la solution du server push" width="300" height="187" /></p>
<p style="text-align: center;">
<p><span id="more-172"></span></p>
<h3 style="text-align: justify;">Problématique</h3>
<p style="text-align: justify;">Pour garantir ce transport, des règles ont été établies. Les plus gros routeurs, véritable piliers du trafic mondial, rencontrent tous le même problème : la taille de leur table de routage. Si cette dernière devient trop volumineuse, l’accès aux entrées croît très vite et le temps de traitement des paquets (au final, de la requête) augmente. Si on multiplie ce temps par le nombre de routeurs traversés, alors la latence devient énorme (plusieurs secondes)…</p>
<p style="text-align: justify;">Pour remédier à ce problème, le routeur a pour tâche d’effacer périodiquement les entrées les plus anciennes/moins utilisées dans sa table de routage. Il doit adapter ce temps de suppression en fonction de sa capacité à traiter les informations (configuration matériel) et du trafic subit (nombre de paquets à router/temps).</p>
<p style="text-align: justify;">Le NAT, par exemple, a lui aussi une table avec une durée de vie limitée. il en existe surement d’autres…</p>
<p style="text-align: justify;">Tout ça pour dire qu’une requête ne peut plus forcement revenir là d’où elle vient si elle est bloquée trop longtemps. C’est pourquoi, dans la plupart des systèmes, il existe un système de <em>timeout</em> permettant de ne pas attendre indéfiniment la requête. Il est appliqué par tout le monde. Il représente le temps maximum qu’une entité (exemple : un client web) est prête à attendre avant qu’une réponse de l&#8217;entité distante dont il attend cette même réponse, lui parvienne. Au-delà de ce temps, on soulève donc l’erreur <em>timeout</em>, ou en français « temps d’attente dépassé ».</p>
<h3 style="text-align: justify;">Explication</h3>
<p style="text-align: justify;">En pratique, on ne devrait jamais laisser notre <em>server push</em> maintenir une connexion plus d’une minute. Le <em>timeout</em> est inévitable sur internet&#8230; C’est pourquoi, on ruse en employant la technique du « connexion refresh ». Détaillons.</p>
<p style="text-align: justify;">
<div id="attachment_177" class="wp-caption aligncenter" style="width: 510px"><img class="size-full wp-image-177" title="Schéma du principe de &quot;connection refresh&quot;" src="http://www.jdkcodingclub.net/wp-content/uploads/2008/11/connection-refresh-schema.jpg" alt="Schéma du principe de &quot;connection refresh&quot;" width="500" height="303" /><p class="wp-caption-text">Schéma du principe du connection refresh</p></div>
<p style="text-align: justify;">
<p style="text-align: justify;">
<p style="text-align: justify;">Le <em>connection refresh</em> est une technique simple visant à forcer le rafraichissement de la requête coté serveur.</p>
<p style="text-align: justify;">Par exemple, si toutes les 40 secondes, je n’ai pas d’événements à notifier,  afin d’éviter que le client parte en <em>timeout</em>,  je réponds quand même au client avec « n’existe pas » et je ferme la connexion. Le client, de son coté, va simplement ré-établir une nouvelle connexion qui durera également 40 secondes si aucun événement se produit. Et ainsi de suite…Avec cette technique, on évite donc ainsi les désagréments dus au transport « physique » de notre requête (paquets IP).</p>
<h3 style="text-align: justify;">Conclusion</h3>
<p style="text-align: justify;">Il faut l’avouer, cette technique reste très proche du « polling ». C’est pour cela que la technique du <em>server push </em>est également appelée « long polling ».</p>
<p>On n’a pas réellement trouvé mieux à l’heure actuelle, mais elle est beaucoup plus efficace en termes de latence et de charge qu’une répétition de demande (scrutation) toutes les x secondes.</p>
<p style="text-align: justify;">Romain LAFOND</p>
]]></content:encoded>
			<wfw:commentRss>http://www.jdkcodingclub.net/2008/11/server-push-connexion-refresh/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Comet ? Qu’est-ce que c’est ?</title>
		<link>http://www.jdkcodingclub.net/2008/11/definition-comet/</link>
		<comments>http://www.jdkcodingclub.net/2008/11/definition-comet/#comments</comments>
		<pubDate>Sun, 16 Nov 2008 12:15:46 +0000</pubDate>
		<dc:creator>Romain LAFOND</dc:creator>
		
		<category><![CDATA[Comet]]></category>

		<category><![CDATA[Tutorial]]></category>

		<category><![CDATA[comet pattern]]></category>

		<category><![CDATA[cometd]]></category>

		<category><![CDATA[HTTP]]></category>

		<category><![CDATA[long polling]]></category>

		<category><![CDATA[long-lived HTTP connections]]></category>

		<category><![CDATA[reverse-ajax]]></category>

		<category><![CDATA[server push]]></category>

		<category><![CDATA[slow polling]]></category>

		<guid isPermaLink="false">http://www.jdkcodingclub.net/?p=116</guid>
		<description><![CDATA[Le terme « comet » est employé à toutes les sauces aujourd’hui. C’est devenu un terme fourre-tout et ultra tendance lorsqu’on veut parler de web 2.0 ou 3.0. Lorsqu’on parle de comet, on parle également de reverse-ajax, cometd, long polling, slow polling, long-lived HTTP connections, server push…Une petite explication s’impose !

On va tâcher d’expliquer la [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">Le terme « comet » est employé à toutes les sauces aujourd’hui. C’est devenu un terme fourre-tout et ultra tendance lorsqu’on veut parler de web 2.0 ou 3.0. Lorsqu’on parle de comet, on parle également de <em>reverse-ajax</em>, cometd, <em>long polling</em>, <em>slow polling</em>, <em>long-lived HTTP connections</em>, <em>server push</em>…Une petite explication s’impose !</p>
<p style="text-align: center;"><img class="size-full wp-image-117 aligncenter" style="border: 0pt none;" title="Comet" src="http://www.jdkcodingclub.net/wp-content/uploads/2008/11/comet.jpg" alt="Comet" width="279" height="223" /></p>
<p style="text-align: justify;">On va tâcher d’expliquer la différence entre <em>server push</em> et comet. Nous verrons que ce n’est pas tout à fait la même chose, bien qu’ils soient, aujourd’hui, très souvent associés l’un à l’autre.</p>
<p><span id="more-116"></span></p>
<p>Nous allons tout d&#8217;abord schématiser:</p>
<ol>
<li>le cycle de vie d&#8217;une requête HTTP standard</li>
<li>le cycle de vie d&#8217;une requête HTTP type <em>server push </em>(avec une API bloquante)</li>
<li>idem mais avec une API non bloquante</li>
</ol>
<h3>1. Le cycle de vie d&#8217;une requête HTTP standard</h3>
<div id="attachment_127" class="wp-caption aligncenter" style="width: 510px"><a href="http://www.jdkcodingclub.net/wp-content/uploads/2008/11/cycle-de-vie-requete-http-standard.jpg"><img class="size-full wp-image-127" title="cycle-de-vie-requete-http-standard" src="http://www.jdkcodingclub.net/wp-content/uploads/2008/11/cycle-de-vie-requete-http-standard.jpg" alt="Cycle de vie d'une requête HTTP standard" width="500" height="239" /></a><p class="wp-caption-text">Cycle de vie d&#39;une requête HTTP standard</p></div>
<p style="text-align: justify;">Ce schéma décrit le cycle de vie d’une requête http standard. La requête est envoyée, récupérée par le serveur (la traite dans un thread), répond immédiatement au client, ferme la connexion et libère le thread. On a donc 1 requête = 1 thread.</p>
<p style="text-align: justify;">
<h3 style="text-align: justify;">2. Le cycle de vie d&#8217;une requête type server push avec une API bloquante</h3>
<div id="attachment_131" class="wp-caption aligncenter" style="width: 510px"><img class="size-full wp-image-131" title="cycle-de-vie-requete-server-push-api-bloquante" src="http://www.jdkcodingclub.net/wp-content/uploads/2008/11/cycle-de-vie-requete-server-push-api-bloquante.jpg" alt="Cycle de vie d'une requête type server push avec une API bloquante" width="500" height="255" /><p class="wp-caption-text">Cycle de vie d&#39;une requête type server push avec une API bloquante </p></div>
<p style="text-align: justify;">On implémente le système de <em>server push</em> avec une API bloquante (le plus facile à mettre en place). Lorsque le serveur reçoit la requête, elle est prise en charge dans un thread. Au lieu de retourner la requête réponse, on ne retourne rien volontairement. C&#8217;est à dire qu&#8217;on gèle la connexion en attendant un événement coté serveur.</p>
<p>Par exemple, un client a une liste de messages non lus. S’il n’a aucun message, alors on attend:<span style="color: #339966;"><code><br />
messagesNonLus.wait();</code></span></p>
<p>Lorsque le serveur récupère un message d’un autre client pour le client en attente:</p>
<p><span style="color: #339966;"><code>utilisateurEnAttente.messagesNonLus.add(new Message(« JDK Coding Club !»));<br />
utilisateurEnAttente.messagesNonLus.notify ();</code></span></p>
<p style="text-align: justify;">Le notify() a pour effet de réveiller le thread qui était verrouillé sur la liste. A ce moment, le thread récupère les messages non lus, et les envoie au client et se termine.<br />
On est bien dans un schéma 1 requête = 1 thread.</p>
<p style="text-align: justify;">
<h3 style="text-align: justify;">3. Le cycle de vie d&#8217;une requête type server push avec une API non bloquante</h3>
<p style="text-align: justify;">
<div id="attachment_135" class="wp-caption aligncenter" style="width: 510px"><img class="size-full wp-image-135" title="cycle-de-vie-requete-server-push-api-non-bloquante" src="http://www.jdkcodingclub.net/wp-content/uploads/2008/11/cycle-de-vie-requete-server-push-api-non-bloquante.jpg" alt="Cycle de vie d'une requête type server push avec une API non bloquante" width="500" height="274" /><p class="wp-caption-text">Cycle de vie d&#39;une requête type server push avec une API non bloquante </p></div>
<p style="text-align: justify;">Avec l’API non bloquante, on s’approche du modèle d’architecture « Comet » (<strong>comet pattern</strong>).</p>
<p style="text-align: justify;">En effet, lorsqu’un client envoie une requête, le serveur lance un thread pour la prendre en charge. Jusque là, on suit le même schéma que les deux précédents.<br />
Mais, cette fois-ci on va dé-sérialiser la requête et la stocker (éventuellement l’associer à un client - utilisateur par exemple) pour pouvoir la récupérer ultérieurement.  On peut libérer le thread. Ensuite, on ne fait rien (la requête est gelée) jusqu’à ce qu’un événement arrive et nécessite d’être transmis à un client ou plusieurs clients.</p>
<p style="text-align: justify;">Dans notre cas de messagerie, lorsque le serveur reçoit un message pour un utilisateur en attente de ses messages non lus, il récupère tout d’abord la requête gelée « server push » du client en attente, il y insère le ou les messages non lus (on remplit le « payload » de la requête). On sérialise la requête, puis on envoie la requête au serveur. Et enfin, on ferme la connexion.</p>
<p style="text-align: justify;">
<h3 style="text-align: justify;">Définition Comet</h3>
<p style="text-align: justify;">Le terme Comet n’a pas de réel définition, pour preuve sur wikipedia personne n’arrive à se mettre d’accord. Il a été inventé par Alex Russell, un des créateurs du framework Cometd (dojo), dans son blog avec l&#8217;article <em>Comet: Low Latency Data for the Browser</em>.<br />
Mais pour sûr, <strong>il désigne avant tout un modèle de patron web (j’insiste pour le web) permettant de transporter, via le protocole HTTP, des événements asynchrone du serveur vers le client en maintenant une latence très faible. </strong>Il s’implémente suivant deux points importants.</p>
<p style="text-align: justify;">Premièrement, il faut absolument éviter le problème de blocage entre le client et le serveur (limitation à deux connexions). C’est pourquoi, au lieu d’utiliser plusieurs requêtes gelées pour un même client dans une application web, on n’instaure qu’un seul service qui ne fait que gérer les événements entre le serveur et les clients. C’est là qu’on utilise le principe du server push au travers des techniques de « long polling » (anciennement appelée « slow polling »).</p>
<p style="text-align: justify;">Deuxièmement, le but est d’établir des connexions HTTP persistantes (« long-lived HTTP connections »). Même si d’un point de vue purement technique, ce n’est pas vraiment du « mode connecté », le comportement final obtenu est quand même semblable. Pour cela, il faut utiliser un serveur web/conteneur de Servlet qui autorise les connexions non bloquantes. Il y en a plusieurs, j’en cite trois des plus connus :</p>
<ul style="text-align: justify;">
<li>Jetty avec Continuations</li>
<li>Tomcat avec CometProcessor</li>
<li style="text-align: justify;">Grizly avec CometHandler</li>
</ul>
<h3>Pourquoi utiliser des API non bloquantes ?</h3>
<p style="text-align: justify;">On peut très bien faire du <em>server push</em> avec un simple serveur tomcat (API bloquante). Pour cela, il suffit de geler le thread de la servlet avec un « wait() » sur un objet, de répondre lorsque le serveur en a besoin en notify() ce dernier.</p>
<p style="text-align: justify;">Le problème se situe au niveau de robustesse de l’application lors de la montée en charge.</p>
<p style="text-align: justify;">2000 utilisateurs avec chacun leur requête server-push gelée par le serveur correspond également à 2000 threads.  Le second problème, c’est qu&#8217;il y a un nombre de thread maximum (config server.xml) pour chaque Servlet. On pourrait, certes, le modifier, mais que ce passe-t-il si un petit malin envoie 2000 requêtes trafiquées d’un coup…Je crains qu’il finisse par faire tomber le serveur.</p>
<p style="text-align: justify;">Alors qu’avec une API non bloquante, nous n’avons qu’une collection de 2000 requêtes. Là est toute la différence.</p>
<h3>Reverse Ajax ?</h3>
<p style="text-align: justify;">Le terme a été lancé par les auteurs du Framework DWR (Direct Web Remoting). Concrètement, le Reverse-Ajax est l’ensemble des techniques plus ou moins proche de comet permettant de faire de la notification sur le web.</p>
<ul>
<li><em>Polling</em> (scrutation)</li>
<li>Comet / <em>Slow polling</em> / <em>Long polling</em> (ou encore l’utilisation des “long-lived HTTP connections”)</li>
<li>PiggyBack</li>
</ul>
<p style="text-align: justify;">Ce dernier consiste à intégrer dans une requête de réponse une notification, de la sorte que la réponse et la notification sont envoyées en même temps.</p>
<p style="text-align: justify;">
<h2>Conclusion</h2>
<p style="text-align: justify;">Le <em>server push</em> permet d’envoyer des données à un client lorsque le serveur le décide (sans que le client ne le demande). C’est le principe de la notification pour le web.<br />
Comet est un patron visant à bien implémenter le principe du <em>server push</em>. Et cela en partie du à l’arrivée des API non bloquantes.<br />
En réalité, le server push est souvent associé au principe de comet, mais techniquement, ça n’a rien à voir.</p>
<p style="text-align: justify;">Romain LAFOND</p>
<p style="text-align: justify;">
<p style="text-align: justify;">
]]></content:encoded>
			<wfw:commentRss>http://www.jdkcodingclub.net/2008/11/definition-comet/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Les mécanismes du Server Push : les problèmes</title>
		<link>http://www.jdkcodingclub.net/2008/11/les-mecanismes-du-server-push-les-problemes/</link>
		<comments>http://www.jdkcodingclub.net/2008/11/les-mecanismes-du-server-push-les-problemes/#comments</comments>
		<pubDate>Wed, 12 Nov 2008 20:57:14 +0000</pubDate>
		<dc:creator>Romain LAFOND</dc:creator>
		
		<category><![CDATA[Comet]]></category>

		<category><![CDATA[Tutorial]]></category>

		<category><![CDATA[HTTP]]></category>

		<category><![CDATA[server push]]></category>

		<category><![CDATA[timeout]]></category>

		<guid isPermaLink="false">http://www.jdkcodingclub.net/?p=88</guid>
		<description><![CDATA[Dans ce billet, nous allons soulever les problèmes liés à la mise en place du mécanisme de Server Push dans une application web.


En reprenant le même exemple abordé dans l&#8217;article (http://www.jdkcodingclub.net/2008/11/definition-principe-polling-scrutation/), notre client envoie une requête pour récupérer sa nouvelle ligne :
http://mon.chat.app/getChatLine?idx=200
Cependant, au lieu de retourner « n’existe pas » (si la ligne n’existe pas), [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">Dans ce billet, nous allons soulever les problèmes liés à la mise en place du mécanisme de <em>Server Push</em> dans une application web.</p>
<p style="text-align: center;"><img class="size-full wp-image-164 aligncenter" title="Les mécanismes du server push" src="http://www.jdkcodingclub.net/wp-content/uploads/2008/11/mecanisme-server-push.jpg" alt="Les mécanismes du server push" width="341" height="140" /></p>
<p style="text-align: justify;"><span id="more-88"></span><br />
En reprenant le même exemple abordé dans l&#8217;article (<a title="http://www.jdkcodingclub.net/2008/11/definition-principe-polling-scrutation/" href="http://www.jdkcodingclub.net/2008/11/definition-principe-polling-scrutation/" target="_blank">http://www.jdkcodingclub.net/2008/11/definition-principe-polling-scrutation/</a>), notre client envoie une requête pour récupérer sa nouvelle ligne :</p>
<p style="text-align: justify;"><span style="color: #339966;"><code>http://mon.chat.app/getChatLine?idx=200</code></span></p>
<p style="text-align: justify;">Cependant, au lieu de retourner « n’existe pas » (si la ligne n’existe pas), le serveur ne répond pas <strong>volontairement</strong>. Cela a pour effet de donner l’impression que le serveur est lent étant donné qu’il ne répond pas. Mais, cela fait parti du mécanisme. Je m&#8217;explique. Lorsque la 200éme ligne est envoyée par son interlocuteur, cela réveille le serveur, il complète la requête (en y insérant le message) et fini par envoyer la 200éme ligne au client.</p>
<p style="text-align: justify;">Avec ce mécanisme, le client n’a pas besoin de continuellement demander à récupérer la dernière ligne. Il la demande 1 fois et il attend que le serveur lui donne.</p>
<p style="text-align: justify;"><strong>L’idée est pourtant simple, mais malheureusement le protocole HTTP n’a pas été pensé de cette manière</strong>. Cela va donc nous poser un certains nombres de problèmes.</p>
<h3 style="text-align: justify;">Flush</h3>
<p style="text-align: justify;">Le protocole HTTP ne supporte pas bien le <em>flush</em>. Inutile donc de vouloir garder la connexion ouverte et de « pousser » les données. Ce n’est pas du <em>streaming,</em> pourtant cela marche, mais pas très bien lorsque le client est derrière un routeur qui passe par un <em>proxy</em> qui lui-même passe par un autre chemin. Bref, HTTP ne supporte pas le <em>flush</em>.</p>
<h3 style="text-align: justify;">Timeout</h3>
<p style="text-align: justify;">Lorsqu’un navigateur attend une ressource d’un serveur et que celle-ci tarde à venir, le navigateur affiche la page du « timeout » au bout d’un certain temps. Pour lui, le serveur ne répond pas (pour diverses raisons).  Mais il n&#8217;y a pas que le client et le serveur&#8230; Entre les deux, les <em>proxy</em>, les routeurs et autres passerelles ne savent pas faire la différence entre une connexion lente (où le <em>timeout</em> est justifié) et une connexion maintenue (gelée ou<em> freezed</em>) volontairement par un serveur (rappelons qu’il ne répond pas intentionnellement). Il faut donc prendre en compte qu&#8217;une connexion gelée ne peut pas l&#8217;être éternellement.</p>
<h3>2 connexions maximum</h3>
<p style="text-align: justify;">La majorité des navigateurs ne peuvent établir que 2 connexions simultanées vers un domaine (exemple : « www.chat.app ». S’il y en a 3, alors la troisième requête est placée en file d’attente jusqu’à ce que le serveur est fini de traiter l’une des 2 premières.</p>
<p style="text-align: justify;">Une requête maintenue en <em>server push</em> consomme déjà la moitié des connexions possibles… Dans l’exemple d’un chat, on utilise à 100% les 2 connexions possibles (une pour le mécanisme de<em> server push</em> et l’autre pour envoyer un message). A noter que s’il y a 2 requêtes gelées simultanées sur le même serveur, le client sera bloqué et ne pourra plus dialoguer avec le serveur. Il devra donc attendre la notification d’un événement ou que le serveur relâche un des 2 requêtes gelés s&#8217;il n&#8217;y en a pas.</p>
<p style="text-align: justify;">Google Maps fonctionne de cette manière pour récupérer plus vite les images d’une carte satellite. Pour pouvoir bénéficier de plus de 2 connexions, il se connecte à khm1.google.com, khm2.google.com, mt1.google.com etc… Il cumule donc les connexions. La limitation est donc un faux problème car des solutions simples existent.</p>
<p style="text-align: justify;">Sur notre application, on pourra donc avoir un sous domaine « serverpush.chat.app » gérant les requêtes de type <em>Server Push</em> afin d&#8217;éviter le blocage de requêtes entre le client et le serveur et d&#8217;assurer ainsi une meilleure performance et robustesse de l&#8217;application.</p>
<h3 style="text-align: justify;">Résumé</h3>
<p style="text-align: justify;">Pour résumer, on peut dire que le protocole HTTP  ne favorise pas vraiment l&#8217;implémentation du mécanisme de <em>server push</em> dans une application web. Bien heureusement, nous verrons que des solutions existent. Cependant, elles se contentent essentiellement de contourner les problèmes (<em>flush,</em> <em>timeout</em> et limitation du nombre de connexions). L&#8217;utilisation du web change, le web change, en attendant une nouvelle version du protocole HTTP, il faudra bien bricoler !</p>
<p style="text-align: justify;">Romain LAFOND</p>
]]></content:encoded>
			<wfw:commentRss>http://www.jdkcodingclub.net/2008/11/les-mecanismes-du-server-push-les-problemes/feed/</wfw:commentRss>
		</item>
	</channel>
</rss>
