<?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>Marwan KHELIF &#187; Tutoriel</title>
	<atom:link href="http://www.mkhelif.fr/category/tutoriel/feed" rel="self" type="application/rss+xml" />
	<link>http://www.mkhelif.fr</link>
	<description>Le blog d&#039;un développeur</description>
	<lastBuildDate>Sun, 25 Jul 2010 21:30:00 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.4</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Guide d&#8217;optimisation de vos applications Web</title>
		<link>http://www.mkhelif.fr/2009/10/20/guide-doptimisation-de-vos-applications-web.html</link>
		<comments>http://www.mkhelif.fr/2009/10/20/guide-doptimisation-de-vos-applications-web.html#comments</comments>
		<pubDate>Tue, 20 Oct 2009 15:25:00 +0000</pubDate>
		<dc:creator>mkhelif</dc:creator>
				<category><![CDATA[Tutoriel]]></category>
		<category><![CDATA[Web]]></category>

		<guid isPermaLink="false">http://www.mkhelif.fr/?p=347</guid>
		<description><![CDATA[Bon ça fait un moment que je prépare cet article (j’en ai encore en préparation) mais je ne trouvai pas le temps pour finir de le rédiger. Cet article est une liste de conseils&#160; afin d’optimiser vos applications Web.
Optimisation du serveur
La première chose à faire lorsque vous êtes dans une démarche d’optimisation de vos applications [...]]]></description>
			<content:encoded><![CDATA[<p>Bon ça fait un moment que je prépare cet article (j’en ai encore en préparation) mais je ne trouvai pas le temps pour finir de le rédiger. Cet article est une liste de conseils&#160; afin d’optimiser vos applications Web.</p>
<h2>Optimisation du serveur</h2>
<p>La première chose à faire lorsque vous êtes dans une démarche d’optimisation de vos applications Web est d’optimiser au maximum le serveur qui va héberger les applications. Car vous aurez beau passer tout votre temps à optimiser vos applications, si le serveur met du temps à servir les requêtes ça n’aura servi à rien.</p>
<h3>Serveur privé</h3>
<p>Si vous développez une application Web dans un but professionnel il est nécessaire d’avoir un serveur privé avec une adresse IP dédiée et un accès SSH. Cela permet d’avoir un accès complet à l’ensemble de la configuration du serveur et d’installer de nouveaux programmes : comment faites-vous si votre hébergement mutualisé ne contient pas l’extension cURL de PHP et que votre application ne peut être exécuté sans?</p>
<p>Si c’est une application personnelle (un blog par exemple) il est toujours bon d’avoir un accès complet à la configuration du serveur. Aujourd’hui il existe de nombreuses solutions de serveurs dédiés pour 30€ / mois ou moins.</p>
<p><strong>Bénéfices :</strong> configuration, sécurité et stabilité.</p>
<h3>Activer la compression</h3>
<p>Le serveur Web reçoit des requêtes et envoi en réponse des contenus (HTML, CSS, images, …). Le temps de chargement complet d’une page Web représente le temps de chargements de toutes les ressources : le client demande d’abord la page HTML puis charge au fur et à mesure toutes les ressources référencées par la page.</p>
<p>L’objectif est donc de diminuer le temps réseau du téléchargement des ressources en compressant les données envoyées par le serveur avec gZIP. Compresser les données textuelles (HTML, JavaScript, CSS) est extrêmement efficace : environ 50% de gain (donc deux fois moins de temps de téléchargement pour le client).</p>
<p>Pour Apache il faut activer le module “<em>deflate</em>” ou “<em>gzip</em>” pour les anciennes versions (jusqu’à 1.3).</p>
<p><strong>Bénéfices :</strong> gain important sur le temps de téléchargement du client.</p>
<h3>Activer le cache</h3>
<p>Lorsqu’un utilisateur se connecte à un serveur Web il télécharge toutes les ressources associées à la page Web qu’il consulte. Cependant sur la page, très peu de ressources ne sont modifiées au cours du temps : vous ne changez pas le logo de votre site tous les quatre matins. Quel est alors l’intérêt de forcer l’utilisateur à re-télécharger ces ressources?</p>
<p>Pour cela le protocole HTTP propose un système de cache des ressources qui permet au navigateur d’utiliser des ressources dont la version n’a pas changé. Par défaut les serveurs Web sont configurés avec le cache activé et vous n’avez donc rien à faire, mais il vaut mieux rappeler les bons conseils.</p>
<p>Pour Apache, il faut activer le module “<em>expires</em>” qui utilise l’en-tête “<em>Expires</em>” pour donner une date de péremption à la réponse, le client peut dont la mettre en cache et ainsi réduire considérablement le nombre de requêtes au serveur.</p>
<p>Pour ajouter le mode “<em>expires</em>” :</p>
<pre>a2enmod expires</pre>
<p>Ensuite vous devez modifier le fichier “<em>expires.conf</em>” pour référencer les fichiers pour lesquels vous souhaitez ajouter le header.</p>
<p><strong>Bénéfices :</strong> réduction du nombre de requêtes au serveur Web et réduction des accès disques et de temps processeur.</p>
<h3>Améliorer la configuration</h3>
<p>Tous les serveurs Web ont une configuration par défaut : nombre de Threads maximum à démarrer, durée maximum de temps de traitement, mémoire allouée à chaque Thread, …</p>
<p><font color="#ff0000"><font color="#000000">Vous devez modifier la configuration afin que le serveur Web réponde au niveau de qualité souhaité. Parmi toutes les propriétés que vous pouvez configurer, voici les plus courantes :</font></font></p>
<ul>
<li><strong>Désactiver le <em>reverse DNS</em></strong> <strong>:</strong> lorsqu’un client se connecte à votre application Web, sa requête est enregistrée dans les logs du serveur. Le serveur va effectuer une requête DNS afin de récupérer le nom de domaine correspondant à l’adresse IP du client. En désactivant cette option vous économiserez de nombreuses requêtes inutiles. </li>
<li>
<p><strong>Keep-Alive :</strong> cette option permet au serveur Web de ne pas fermer la connexion du client lorsque la requête a été servie. Cela économise de nombreuses ouvertures de connexions au client.</p>
<p>Au niveau de cette option il y a quelques paramètres à modifier : <em>KeepAliveTimeout</em> et <em>Timeout</em>. Le paramètre <em>KeepAliveTimeout</em> représente le temps maximum entre deux requêtes sur la même connexion. Le paramètre <em>Timeout</em> représente le temps maximum entre la connexion et la première requête. Ces deux paramètres étant à modifier en fonction de votre application.</p>
</li>
</ul>
<h2>Optimisation des ressources</h2>
<p>Une fois que votre serveur Web est prêt avec une configuration optimale, vous pouvez optimiser les ressources que vous utilisez dans votre application : CSS, JavaScript, images.</p>
<h3>Sprite CSS</h3>
<p>Lors du chargement d’une page HTML, le navigateur Web va récupérer l’ensemble des ressources : CSS, JavaScript et souvent beaucoup d’images. Pour récupérer toutes les ressources, le navigateur utilise par défaut deux connexions au serveur Web et va attendre que l’une des connexions soit disponible pour récupérer la ressource suivante.</p>
<p>Les sprites CSS permettent de regrouper toutes ou une grande partie des images en une seule image. Il y a deux intérêts à cette technique : beaucoup moins de requêtes faîtes au serveur Web et l’image sera moins volumineuse (les informations de format et de compression ne sont stoquées qu’une seule fois).</p>
<p>Au niveau des feuilles de style CSS, il faut mettre la grande image en arrière-plan du composant et positionner le sprite (la parcelle de l’image) souhaité grâce à l’instruction <em>background-position</em>.</p>
<p>Au niveau du gain de volume de l’image voilà des statistiques :</p>
<div align="center">
<table border="1" cellspacing="0" cellpadding="2" width="494" align="center">
<tbody>
<tr>
<td width="80" align="center"><strong>Format</strong></td>
<td width="145" align="center"><strong>Taille six images</strong></td>
<td width="155" align="center"><strong>Taille image sprite</strong></td>
<td valign="top" width="112"><strong>Différence</strong></td>
</tr>
<tr>
<td valign="top" width="80">GIF</td>
<td width="145">6046 b</td>
<td valign="top" width="155">1894 b</td>
<td valign="top" width="112"><font color="#1db002">-69%</font></td>
</tr>
<tr>
<td valign="top" width="80">JPEG</td>
<td width="145">5916 b</td>
<td valign="top" width="155">2187 b</td>
<td valign="top" width="112"><font color="#1db002">-63%</font></td>
</tr>
<tr>
<td valign="top" width="80">PNG</td>
<td width="145">4479 b</td>
<td valign="top" width="155">3844 b</td>
<td valign="top" width="112"><font color="#1db002">-14%</font></td>
</tr>
</tbody>
</table>
</div>
<h3>&#160;</h3>
<h3>Réduction des CSS</h3>
<p>Les feuilles de styles sont les éléments principaux du design d’une application Web et peuvent rapidement devenir des ressources volumineuses. Le principal problème des feuilles de styles est quelles contiennent énormément de caractères inutiles : espaces, sauts de lignes, commentaires. Le navigateur Web quand il reçoit une feuille de style ignore c&#8217;est caractère, ils ne sont utilisés que par le designer afin de facilement comprendre les instructions.</p>
<p>Afin d’économiser de la bande passante et du temps de téléchargement d’une page Web il est possible de réduire considérablement la taille des feuilles de styles grâce à des services Web comme : <a href="http://www.cssoptimiser.com/">CSS Optimizer</a>, <a href="http://iceyboard.no-ip.org/projects/css_compressor">Icey’s CSS Compressor</a>, <a href="http://flumpcakes.co.uk/css/optimiser/">Flumpcake CSS Optimizer</a>, <a href="http://www.cleancss.com/">Clean CSS</a>.</p>
<p>Si on regarde la différence sur certains sites avec un certain nombre de visiteurs :</p>
<div align="center">
<table border="1" cellspacing="0" cellpadding="2" width="551" align="center">
<tbody>
<tr>
<td valign="top" width="106"><strong>Site Web</strong></td>
<td valign="top" width="125"><strong>Feuille de styles</strong></td>
<td valign="top" width="216"><strong>Feuille de styles optimisée</strong></td>
<td valign="top" width="102"><strong>Différence</strong></td>
</tr>
<tr>
<td valign="top" width="106">Free.fr</td>
<td valign="top" width="125">35.19 Kb</td>
<td valign="top" width="216">19.09 Kb</td>
<td valign="top" width="102"><font color="#1db002">-46%</font></td>
</tr>
<tr>
<td valign="top" width="106">PC Inpact</td>
<td valign="top" width="125">37.14 Kb</td>
<td valign="top" width="216">27.31 Kb</td>
<td valign="top" width="102"><font color="#1db002">-26%</font></td>
</tr>
<tr>
<td valign="top" width="106">Microsoft.com</td>
<td valign="top" width="125">30.7 Kb</td>
<td valign="top" width="216">22.41 Kb</td>
<td valign="top" width="102"><font color="#1db002">-27%</font></td>
</tr>
</tbody>
</table>
</div>
<p>&#160;</p>
<p>Oui Twitter n’est pas présent, leur feuille de styles est déjà optimisée <img src='http://www.mkhelif.fr/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> .</p>
<p>Afin d’économiser en nombre de requêtes, vous pouvez regrouper tous vos styles dans un seul fichier CSS.</p>
<h3>Réduction des JavaScripts</h3>
<p>De la même façon que pour les feuilles de styles, les fichiers JavaScript peuvent être optimisés afin de diminuer le temps de téléchargements de ces fichiers. Voici les services Web qui proposent de réduire vos JavaScripts : <a href="http://shrinksafe.dojotoolkit.org/">Dojo Shrinksafe</a>, <a href="http://javascriptcompressor.com/">JavaScript Compressor</a><font color="#000000">. Il existe de très nombreuses applications qui font le même travaille.</font></p>
<h3>Stockage des ressources</h3>
<p>Lorsqu’un utilisateur arrive sur une page Web, il télécharge le HTML puis il récupère les ressources référencées par la page. Les ressources sont téléchargées en utilisant par défaut deux connexions par serveur. L’idée est donc de séparée le stockage des ressources statiques des données dynamiques : le HTML généré sur un serveur, les CSS et JavaScripts sur un autre serveur.</p>
<p align="center"><a href="http://www.mkhelif.fr/wp-content/uploads/2009/10/server.png"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="server" border="0" alt="server" src="http://www.mkhelif.fr/wp-content/uploads/2009/10/server_thumb.png" width="504" height="281" /></a></p>
<p><font color="#000000"><strong>Bénéfices :</strong> le client va utiliser deux connexions pour récupérer uniquement des ressources statiques et ne va pas surcharger le serveur de traitement avec des requêtes “statiques”.</font></p>
<h2>Optimisation de l’application</h2>
<p>Voilà à partir d’ici vous devez avoir bien amélioré le temps de chargement de votre application. Les conseils suivants sont plus des conseils</p>
<h3>Landing page</h3>
<p>Une “landing page” est une page sur laquelle vous souhaitez que vos visiteurs arrivent depuis les moteurs de recherches et autres. L’objectif de cette page est que l’utilisateur n’arrive pas sur une page d’accueil mais directement sur l’information qu’il cherche. Il faut donc que cette page soit rapide et présente l’information de façon simple et concise.</p>
<p>Pour cela évitez au maximum d’effectuer de long traitement ou d’effectuer des appels à une base de données si ce n’est pas nécessaire. Préférez une version statique d’une landing page qui sera servie très rapidement.</p>
<h3>Éviter les redirections</h3>
<p>Évitez au maximum le nombre de redirections, à chaque fois que le serveur renvoie une redirection (301, 302, …), le client effectue une nouvelle requête. Si en plus vous n’avez pas activé le <em>Keep-Alive</em>, il va faire une nouvelle connexion.</p>
<p>Ne garder les redirections que pour du SEO afin de ne pas perdre le référencement d’une page dont vous changez l’URL.</p>
<h3>Plugin Wordpress</h3>
<p><font color="#000000">Si vous utilisez Wordpress il existe de nombreux plugins qui permettent d’améliorer la vitesse de chargement de votre blog.</font></p>
<h4>WP Super Cache</h4>
<p><font color="#000000"><a href="http://wordpress.org/extend/plugins/wp-super-cache/">WP Super Cache</a> est un plugin qui va générer une version statique de vos pages (billets, pages, …). Ainsi votre blog servira la version statique au lieu de re-générer la page HTML pour chaque visiteur. La version statique est re-générée à chaque nouveaux commentaires, billets ou pages.</font></p>
<h4>Réduire son nombre de plugins</h4>
<p><font color="#000000">À chaque fois qu’un utilisateur effectue une action sur un blog wordpress, le serveur appelle les plugins nécessaires pour servir la page. Si vous avez beaucoup de plugins, cela peut ralentir radicalement votre blog.</font></p>
<p><font color="#000000">Faîtes le ménage dans vos plugins et ne garder que les essentiels.</font></p>
<h2>Outils d’analyse</h2>
<p>Afin de voir les différences de temps de chargement d’une page il faut avoir de bons outils d’analyse. Que ce soit un outils spécialisé ou un module du navigateur Web, il est nécessaire de mesurer les différences entre deux configurations.</p>
<h3>Firebug</h3>
<p>Pour les développeurs Web qui ont l’habitude de tester leurs applications avec Firefox, la plupart utilisent le plugin Firebug qui permet entre autres d’analyser en détail (et de modifier en direct) le contenu HTML, le CSS, le JavaScript et de visualiser les requêtes/réponses avec l’application Web.</p>
<p>De nombreux plugins ont été développés sur Firebug pour fournir des informations sur le chargement de la page.</p>
<h4>Page Speed</h4>
<p align="center"><a href="http://www.mkhelif.fr/wp-content/uploads/2009/10/pagespeed.png"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="pagespeed" border="0" alt="pagespeed" src="http://www.mkhelif.fr/wp-content/uploads/2009/10/pagespeed_thumb.png" width="504" height="202" /></a> </p>
<p><a href="http://code.google.com/intl/fr/speed/page-speed/">Page Speed</a> est une extension pour Firebug, réalisée par Google, qui analyse la page Web qui vient d’être chargée et vous informe des améliorations que vous pouvez apporter à votre serveur / configuration /&#160; application pour diminuer le temps de chargement de votre page.</p>
<h4>YSlow</h4>
<p align="center"><a href="http://www.mkhelif.fr/wp-content/uploads/2009/10/yslow.png"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="yslow" border="0" alt="yslow" src="http://www.mkhelif.fr/wp-content/uploads/2009/10/yslow_thumb.png" width="504" height="221" /></a> </p>
<p><a href="http://developer.yahoo.com/yslow/">YSlow</a> a été développé par Yahoo est analyse aussi les points à améliorer.</p>
<h3>Tests de charge</h3>
<p>Enfin une fois que vous avez optimisé votre application Web il est bon de savoir si elle va tenir la charge face au nombre d’utilisateurs prévus. Pour cela il existe de nombreux outils de test en charge d’application Web, mais je n’en conseillerai qu’un : <a href="http://neotys.fr/test-en-charge/how-it-works.html">NeoLoad</a>, par la société <strike>où je bosse</strike> <a href="http://www.neotys.fr/">Neotys</a>.</p>
<p>L’objectif est de faire simuler par le logiciel un nombre d’utilisateurs virtuels qui vont exécuter un scénario sur l’application et d’analyser les résultats (temps de réponses, erreurs, …) afin de corriger ou d’optimiser l’application. </p>
<h2>Conclusion</h2>
<p>Le secret pour avoir une application Web rapide et efficace est de tester votre configuration, d’analyser les points à améliorer et de les optimiser puis de re-tester, … et ainsi de suite jusqu’à ce que vous atteignez la qualité de service souhaitée.</p>
<p>Et vous comment faîtes vous pour optimiser vos applications Web? Quels outils utilisez-vous?</p>
<h3>Pour suivre votre lecture</h3>
<ul class="related_post">
<li><a href="http://www.mkhelif.fr/2010/01/14/gwt-2-0-les-nouvelles-fonctionnalits.html" title="GWT 2.0 : les nouvelles fonctionnalités">GWT 2.0 : les nouvelles fonctionnalités</a></li>
<li><a href="http://www.mkhelif.fr/2009/12/15/goo-gl-le-raccourcisseur-durl-by-google.html" title="Goo.gl : le raccourcisseur d&rsquo;URL by Google">Goo.gl : le raccourcisseur d&rsquo;URL by Google</a></li>
<li><a href="http://www.mkhelif.fr/2009/11/19/chrome-os-premire-prsentation.html" title="Chrome OS : premi&egrave;re pr&eacute;sentation">Chrome OS : premi&egrave;re pr&eacute;sentation</a></li>
<li><a href="http://www.mkhelif.fr/2009/09/18/twitter-la-voip-disponible-grce-jajah.html" title="Twitter : la VoIP disponible gr&acirc;ce &agrave; Jajah">Twitter : la VoIP disponible gr&acirc;ce &agrave; Jajah</a></li>
<li><a href="http://www.mkhelif.fr/2009/09/12/cinq-moyens-pour-grer-son-identit-virtuelle.html" title="Cinq moyens pour g&eacute;rer son identit&eacute; virtuelle">Cinq moyens pour g&eacute;rer son identit&eacute; virtuelle</a></li>
<li><a href="http://www.mkhelif.fr/2009/09/07/ruby-on-rails-dployer-une-application-sur-tomcat-avec-jruby.html" title="Ruby on Rails : d&eacute;ployer une application sur Tomcat avec JRuby">Ruby on Rails : d&eacute;ployer une application sur Tomcat avec JRuby</a></li>
<li><a href="http://www.mkhelif.fr/2009/08/28/quest-ce-quun-community-manager-le-buzz-job-actuel.html" title="Qu&rsquo;est ce qu&rsquo;un Community Manager, le &ldquo;buzz-job&rdquo; actuel ?">Qu&rsquo;est ce qu&rsquo;un Community Manager, le &ldquo;buzz-job&rdquo; actuel ?</a></li>
</ul>
       ]]></content:encoded>
			<wfw:commentRss>http://www.mkhelif.fr/2009/10/20/guide-doptimisation-de-vos-applications-web.html/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Ruby on Rails : d&#233;ployer une application sur Tomcat avec JRuby</title>
		<link>http://www.mkhelif.fr/2009/09/07/ruby-on-rails-dployer-une-application-sur-tomcat-avec-jruby.html</link>
		<comments>http://www.mkhelif.fr/2009/09/07/ruby-on-rails-dployer-une-application-sur-tomcat-avec-jruby.html#comments</comments>
		<pubDate>Mon, 07 Sep 2009 15:46:18 +0000</pubDate>
		<dc:creator>mkhelif</dc:creator>
				<category><![CDATA[J2EE]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Ruby on Rails]]></category>
		<category><![CDATA[Tutoriel]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[Rails]]></category>

		<guid isPermaLink="false">http://www.mkhelif.fr/?p=350</guid>
		<description><![CDATA[ Ruby on Rails est un framework qui permet de développer très rapidement des applications Web en suivant le modèle MVC.
Le problème de ce framework est qu’il se base sur le langage Ruby et qu’il embarque un serveur Web. Les applications ainsi créées ne peuvent pas être déployées comme des applications Web dans Tomcat ou [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.mkhelif.fr/wp-content/uploads/2009/09/rails.png"><img style="border-right-width: 0px; margin: 0px 10px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="rails" src="http://www.mkhelif.fr/wp-content/uploads/2009/09/rails_thumb.png" border="0" alt="rails" width="87" height="111" align="left" /></a> Ruby on Rails est un framework qui permet de développer très rapidement des applications Web en suivant le modèle MVC.</p>
<p>Le problème de ce framework est qu’il se base sur le langage Ruby et qu’il embarque un serveur Web. Les applications ainsi créées ne peuvent pas être déployées comme des applications Web dans Tomcat ou autres serveurs d’applications.</p>
<p>Le but de ce tutoriel est de vous permettre de déployer les applications Ruby on Rails (RoR) sur un serveur Tomcat en utilisant la librairie <a href="http://jruby.org/" target="_blank">JRuby</a>.</p>
<h3>Installation Tomcat</h3>
<p>On commence par <a href="http://mirror.mkhelif.fr/apache/tomcat/" target="_blank">télécharger la dernière version de Tomcat</a> (en ce moment c’est la version 6.0.20) :</p>

<div class="wp_codebox"><table><tr id="p3509"><td class="line_numbers"><pre>1
2
</pre></td><td class="code" id="p350code9"><pre class="sh" style="font-family:monospace;">wget http://mirror.mkhelif.fr/apache/tomcat/tomcat-6/v6.0.20/bin/apache-tomcat-6.0.20.tar.gz
tar –xzf apache-tomcat-6.0.20.tar.gz</pre></td></tr></table></div>

<p>Voilà Tomcat est installé, je passerai ici la configuration du serveur. Si vous souhaitez, suivez mon <a href="http://www.mkhelif.fr/2008/06/18/passerelle-entre-apache-et-tomcat.html">tutoriel pour connecter Apache avec Tomcat</a>.</p>
<h3>Installation JRuby</h3>
<p><a href="http://jruby.org/download">Télécharger JRuby</a> et placez le là où vous souhaitez :</p>

<div class="wp_codebox"><table><tr id="p35010"><td class="line_numbers"><pre>1
2
3
</pre></td><td class="code" id="p350code10"><pre class="sh" style="font-family:monospace;">wget http://dist.codehaus.org/jruby/1.3.1/jruby-bin-1.3.1.tar.gz
tar –xzf jruby-bin-1.3.1.tar.gz
mv jruby-1.3.1 /usr/local/jruby</pre></td></tr></table></div>

<p>Ajouter ensuite le chemin vers JRuby dans votre environnement en éditant votre fichier <em>~/.profile</em> :</p>

<div class="wp_codebox"><table><tr id="p35011"><td class="line_numbers"><pre>1
</pre></td><td class="code" id="p350code11"><pre class="sh" style="font-family:monospace;">export PATH=$PATH:/usr/local/jruby/bin</pre></td></tr></table></div>

<p>Vous pouvez vérifier l’installation de JRuby en exécutant la commande suivante :</p>

<div class="wp_codebox"><table><tr id="p35012"><td class="line_numbers"><pre>1
2
</pre></td><td class="code" id="p350code12"><pre class="sh" style="font-family:monospace;">$ jruby -v
jruby 1.3.1 (ruby 1.8.6p287) (2009-06-15 2fd6c3d) (Java HotSpot(TM) Client VM 1.5.0_16) [i386-java]</pre></td></tr></table></div>

<h3>Installation de Ruby on Rails</h3>
<p>À partir de là nous allons installer les gems pour : rails (le coeur de ROR), mysql et surtout warbler (qui crée un WAR à partir de l’application rails).</p>

<div class="wp_codebox"><table><tr id="p35013"><td class="line_numbers"><pre>1
2
3
</pre></td><td class="code" id="p350code13"><pre class="sh" style="font-family:monospace;">$ jruby -S gem install rails
$ jruby -S gem install activerecord-jdbcmysql-adapter
$ jruby -S gem install warbler</pre></td></tr></table></div>

<h3>Déploiement de votre application</h3>
<p>Pour déployer votre application dans Tomcat, il faut commencer par la convertir en WAR. Placez vous dans le dossier de votre application et lancez la commande suivante :</p>

<div class="wp_codebox"><table><tr id="p35014"><td class="line_numbers"><pre>1
</pre></td><td class="code" id="p350code14"><pre class="sh" style="font-family:monospace;">$ warble config</pre></td></tr></table></div>

<p>Cela va créer un fichier <em>&lt;application&gt;/config/warble.rb</em> pour configurer votre application pour la convertir en fichier WAR, ouvrez le fichier et dé-commentez la ligne :</p>

<div class="wp_codebox"><table><tr id="p35015"><td class="line_numbers"><pre>1
</pre></td><td class="code" id="p350code15"><pre class="sh" style="font-family:monospace;">config.gems += [&quot;activerecord-jdbcmysql-adapter&quot;]</pre></td></tr></table></div>

<p>Cela pour inclure dans votre fichiers WAR la gem MySQL (ajoutez les gems que votre application utilise ici).</p>
<p>Maintenant nous allons créer le fichier WAR de votre application, lancez simplement la commande :</p>

<div class="wp_codebox"><table><tr id="p35016"><td class="line_numbers"><pre>1
</pre></td><td class="code" id="p350code16"><pre class="sh" style="font-family:monospace;">$ warble</pre></td></tr></table></div>

<p>Et voilà votre fichier WAR est créé, vous pouvez alors le déployer sur Tomcat (je passerai sur cette étape).<br />
<h3>Pour suivre votre lecture</h3>
<ul class="related_post">
<li><a href="http://www.mkhelif.fr/2010/01/14/gwt-2-0-les-nouvelles-fonctionnalits.html" title="GWT 2.0 : les nouvelles fonctionnalités">GWT 2.0 : les nouvelles fonctionnalités</a></li>
<li><a href="http://www.mkhelif.fr/2009/04/08/google-gwt-version-16-et-consorts.html" title="Google : GWT version 1.6 et consorts">Google : GWT version 1.6 et consorts</a></li>
<li><a href="http://www.mkhelif.fr/2008/06/18/passerelle-entre-apache-et-tomcat.html" title="Passerelle entre Apache et Tomcat">Passerelle entre Apache et Tomcat</a></li>
<li><a href="http://www.mkhelif.fr/2009/11/19/chrome-os-premire-prsentation.html" title="Chrome OS : premi&egrave;re pr&eacute;sentation">Chrome OS : premi&egrave;re pr&eacute;sentation</a></li>
<li><a href="http://www.mkhelif.fr/2009/08/21/tests-en-charge-dec2-gae-et-azure.html" title="Tests en charge d&rsquo;EC2, GAE et Azure">Tests en charge d&rsquo;EC2, GAE et Azure</a></li>
<li><a href="http://www.mkhelif.fr/2008/10/21/gwt-16-tomcat-ou-jetty.html" title="GWT 1.6 : Tomcat ou Jetty ?">GWT 1.6 : Tomcat ou Jetty ?</a></li>
<li><a href="http://www.mkhelif.fr/2008/06/23/apache2-systeme-de-blacklist.html" title="Apache2 : système de blacklist">Apache2 : système de blacklist</a></li>
</ul>
       ]]></content:encoded>
			<wfw:commentRss>http://www.mkhelif.fr/2009/09/07/ruby-on-rails-dployer-une-application-sur-tomcat-avec-jruby.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Première utilisation du plugin Eclipse GWT</title>
		<link>http://www.mkhelif.fr/2009/04/10/premire-utilisation-du-plugin-eclipse-gwt.html</link>
		<comments>http://www.mkhelif.fr/2009/04/10/premire-utilisation-du-plugin-eclipse-gwt.html#comments</comments>
		<pubDate>Fri, 10 Apr 2009 15:30:35 +0000</pubDate>
		<dc:creator>mkhelif</dc:creator>
				<category><![CDATA[Actualités]]></category>
		<category><![CDATA[GWT]]></category>
		<category><![CDATA[Google]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[RIA]]></category>
		<category><![CDATA[Tutoriel]]></category>
		<category><![CDATA[Web]]></category>

		<guid isPermaLink="false">http://www.mkhelif.fr/2009/04/10/premire-utilisation-du-plugin-eclipse-gwt.html</guid>
		<description><![CDATA[Suite à mon premier billet qui présentait Google Web Toolkit, je vais maintenant vous présenter la nouvelle version de GWT et comment créer un premier projet en utilisant le plugin Eclipse.
Mise en place de l&#8217;environnement de développement
Pour commencer à développer une application GWT et/ou GAE (Google App Engine), il faut télécharger la dernière version de [...]]]></description>
			<content:encoded><![CDATA[<p>Suite à mon premier billet qui présentait <a href="http://www.mkhelif.fr/2008/07/03/gwt-introduction-au-framework.html" target="_blank">Google Web Toolkit</a>, je vais maintenant vous présenter la nouvelle version de GWT et comment créer un premier projet en utilisant le plugin Eclipse.<span id="more-246"></span></p>
<h2>Mise en place de l&#8217;environnement de développement</h2>
<p>Pour commencer à développer une application GWT et/ou GAE (Google App Engine), il faut <a href="http://www.eclipse.org/downloads/" target="_blank">télécharger la dernière version de Eclipse</a>.</p>
<p>Une fois Eclipse installé et démarré, il faut installer le plugin GWT/GAE de Google. Pour cela allez dans le menu &laquo;&nbsp;<em>Help / Software updates&#8230;</em>&laquo;&nbsp;. Allez dans l&#8217;onglet &laquo;&nbsp;<em>Available Software</em>&nbsp;&raquo; et ajouter un nouveau site (&nbsp;&raquo;<em>Add site&#8230;&nbsp;&raquo;</em>) et entrez l&#8217;URL : http://dl.google.com/eclipse/plugin/3.4.</p>
<p>Sélectionnez alors les éléments <strong>Plugin</strong> et <strong>SDKs</strong>, puis cliquez sur &laquo;&nbsp;<em>Install</em>&laquo;&nbsp;. Une fois l&#8217;installation terminée, vous devez redémarrer Eclipse. Là une nouvelle barre d&#8217;outils est apparue :</p>
<p align="center"><a href="http://www.mkhelif.fr/wp-content/uploads/2009/04/gwt-toolbar.png"><img style="border-right-width: 0px; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" src="http://www.mkhelif.fr/wp-content/uploads/2009/04/gwt-toolbar-thumb.png" border="0" alt="gwt-toolbar" width="104" height="37" /></a></p>
<p>Le premier bouton sert à créer une nouvelle application Web GWT/GAE, le second à compiler une projet GWT et le troisième à déployer une application GAE dans le cloud Google.</p>
<p>Voilà votre environnement de développement est prêt à être utiliser.</p>
<h2>Création de mon premier projet</h2>
<p>Pour créer un nouveau projet cliquez sur le bouton <a href="http://www.mkhelif.fr/wp-content/uploads/2009/04/gwt-button-new.png"><img style="border-right-width: 0px; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" src="http://www.mkhelif.fr/wp-content/uploads/2009/04/gwt-button-new-thumb.png" border="0" alt="gwt-button-new" width="16" height="16" /></a>. Cela va démarrer l&#8217;assistant de création de projet :</p>
<p align="center"><a href="http://www.mkhelif.fr/wp-content/uploads/2009/04/gwt-new-project.png"></a><a href="http://www.mkhelif.fr/wp-content/uploads/2009/04/gwt-new-project1.png"><img style="border-right-width: 0px; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" src="http://www.mkhelif.fr/wp-content/uploads/2009/04/gwt-new-project-thumb.png" border="0" alt="gwt-new-project" width="442" height="569" /></a></p>
<p>Les principaux champs à renseigner sont le nom du projet : <strong>GWTDemo</strong>, et le package racine de l&#8217;application : <strong>fr.mkhelif.gwt.demo</strong>. Pour l&#8217;exemple je n&#8217;ai sélectionné que GWT, je ferais un autre billet sur GAE.</p>
<h2>Structure du projet</h2>
<p>Une fois le projet créé, voilà la structure que l&#8217;on obtient :</p>
<p align="center"><a href="http://www.mkhelif.fr/wp-content/uploads/2009/04/gwt-structure.png"></a><a href="http://www.mkhelif.fr/wp-content/uploads/2009/04/gwt-structure1.png"></a><a href="http://www.mkhelif.fr/wp-content/uploads/2009/04/gwt-structure2.png"><img style="border-right-width: 0px; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" src="http://www.mkhelif.fr/wp-content/uploads/2009/04/gwt-structure-thumb.png" border="0" alt="gwt-structure" width="362" height="319" /></a></p>
<p>On voit donc un nouveau dossier <strong>war</strong>, c&#8217;est celui-ci qui représente l&#8217;archive WAR qui sera exportée/déployée. Lors de la compilation du projet, les fichiers seront créés dans un sous-dossier de celui-là. Le répertoire <strong>lib</strong> du <strong>WEB-INF</strong> contient la librairie nécessaire au fonctionnement des service GWT-RPC sur le serveur.</p>
<p>On peut voir que le dossier <strong>public</strong> du package par défaut à disparu. Maintenant, toutes les ressources (images, css, &#8230;) doivent être placées dans le répertoire war à l&#8217;instar d&#8217;une application Web classique.</p>
<p>Notre nouveau projet contient par défaut deux fichiers : <strong>GWTDemo.html</strong> et <strong>GWTDemo.css</strong>. Le fichier HTML sert à charger l&#8217;application GWT et le fichier css représente le style de l&#8217;application.</p>
<p>Au niveau du répertoire de sources <strong>src</strong>, on retrouve les packages <strong>client</strong> et <strong>server</strong>, et le fichier <strong>GWTDemo.gwt.xml</strong>. Au niveau de ce fichier, il n&#8217;y a pas de changements notables.</p>
<p>Le nouveau projet contient un exemple de service RPC : <strong>GreetingService</strong>. Voilà le code de l&#8217;interface du service :</p>

<div class="wp_codebox"><table><tr id="p24619"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
</pre></td><td class="code" id="p246code19"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">package</span> <span style="color: #006699;">fr.mkhelif.gwt.demo.client</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">com.google.gwt.user.client.rpc.RemoteService</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">com.google.gwt.user.client.rpc.RemoteServiceRelativePath</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #008000; font-style: italic; font-weight: bold;">/**
 * The client side stub for the RPC service.
 */</span>
@RemoteServiceRelativePath<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;greet&quot;</span><span style="color: #009900;">&#41;</span>
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">interface</span> GreetingService <span style="color: #000000; font-weight: bold;">extends</span> RemoteService <span style="color: #009900;">&#123;</span>
    <span style="color: #003399;">String</span> greetServer<span style="color: #009900;">&#40;</span><span style="color: #003399;">String</span> name<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>On remarque que l&#8217;interface étend toujours <strong>RemoteService</strong>, par contre une nouvelle annotation est présente : <em>@RemoveServiceRelativePath(&nbsp;&raquo;greet&nbsp;&raquo;)</em>. Cette annotation permet de s&#8217;affranchir au niveau du code client d&#8217;enregistrer l&#8217;URL de la servlet du service :</p>

<div class="wp_codebox"><table><tr id="p24620"><td class="line_numbers"><pre>1
</pre></td><td class="code" id="p246code20"><pre class="java" style="font-family:monospace;"><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span>ServiceDefTarget<span style="color: #009900;">&#41;</span> service<span style="color: #009900;">&#41;</span>.<span style="color: #006633;">setServiceEntryPoint</span> <span style="color: #009900;">&#40;</span>GWT.<span style="color: #006633;">getModuleBaseURL</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">+</span> <span style="color: #0000ff;">&quot;greet&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p>Par contre il n&#8217;y a aucune différence au niveau de son implémentation et de son clone asynchrone.</p>
<h2>Compilation du projet</h2>
<p>Voilà le projet est créé, il faut maintenant le compiler en cliquant sur le bouton <a href="http://www.mkhelif.fr/wp-content/uploads/2009/04/gwt-button-compile.png"><img style="border-right-width: 0px; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" src="http://www.mkhelif.fr/wp-content/uploads/2009/04/gwt-button-compile-thumb.png" border="0" alt="gwt-button-compile" width="16" height="16" /></a>. Le wizard suivant apparait :</p>
<p align="center"><a href="http://www.mkhelif.fr/wp-content/uploads/2009/04/gwt-compile.png"></a><a href="http://www.mkhelif.fr/wp-content/uploads/2009/04/gwt-compile1.png"><img style="border-right-width: 0px; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" src="http://www.mkhelif.fr/wp-content/uploads/2009/04/gwt-compile-thumb.png" border="0" alt="gwt-compile" width="442" height="536" /></a></p>
<p>Il suffit de sélectionner le projet GWT, le niveau de log du compilateur et le style de sortie du JavaScript compilé. Sélectionnez ensuite les points d&#8217;entrées de votre application GWT, dans notre exemple il n&#8217;y en a qu&#8217;un.</p>
<p>On peut remarquer que grâce au plugin on peut spécifier des arguments de compilation. Le paramètre <em>localWorkers</em> permet de définir le nombre de workers utilisés pour compiler les permutations JavaScript. D&#8217;autres options sont disponibles mais ne concerne que les dossiers de compilation : <em>workDir</em>, <em>war</em> et <em>extra</em>.</p>
<p>Ayant un dual-core, je demande au compilateur d&#8217;utiliser 2 workers pour compiler. Le gain de temps est d&#8217;environ 30% : 28 secondes sans l&#8217;option et 19 secondes avec.</p>
<h2>Utilisation de l&#8217;application</h2>
<p>Une fois l&#8217;application GWT compilée, il faut la tester grâce au hosted mode. Il n&#8217;y a pas de grande différence au niveau du hosted mode, sauf que maintenant il est possible de modifier le serveur utilisé par GWT pour démarrer l&#8217;application.</p>
<p>On remarque un nouveau bouton <strong>Restart Server</strong> dans la fenêtre du hosted mode. Ce bouton permet de redémarrer le serveur, et donc de redéployer le WAR, sans avoir à relancer le hosted mode.</p>
<h2>Conclusion</h2>
<p>C&#8217;est un très beau coup de pub qu&#8217;à fait Google en nous servant en même temps le support de Java par Google App Engine, la version 1.6 de GWT et un plugin Eclipse pour gérer très facilement le tout. Cela va donner un coup de boost aux développeurs qui étaient encore hésitant sur la fiabilité de GWT.<br />
<h3>Pour suivre votre lecture</h3>
<ul class="related_post">
<li><a href="http://www.mkhelif.fr/2010/01/14/gwt-2-0-les-nouvelles-fonctionnalits.html" title="GWT 2.0 : les nouvelles fonctionnalités">GWT 2.0 : les nouvelles fonctionnalités</a></li>
<li><a href="http://www.mkhelif.fr/2009/04/08/google-gwt-version-16-et-consorts.html" title="Google : GWT version 1.6 et consorts">Google : GWT version 1.6 et consorts</a></li>
<li><a href="http://www.mkhelif.fr/2008/12/09/gwt-le-futur-hosted-mode.html" title="GWT : le futur hosted mode">GWT : le futur hosted mode</a></li>
<li><a href="http://www.mkhelif.fr/2008/10/23/gwt-librairie-open-flash-chart.html" title="GWT : librairie Open Flash Chart">GWT : librairie Open Flash Chart</a></li>
<li><a href="http://www.mkhelif.fr/2008/10/03/ria-quel-framework-choisir.html" title="RIA : quel framework choisir?">RIA : quel framework choisir?</a></li>
<li><a href="http://www.mkhelif.fr/2008/09/02/gwt-version-15-disponible.html" title="GWT : version 1.5 disponible">GWT : version 1.5 disponible</a></li>
<li><a href="http://www.mkhelif.fr/2008/07/07/gwt-crer-un-service-rpc.html" title="GWT : Créer un service RPC">GWT : Créer un service RPC</a></li>
</ul>
       ]]></content:encoded>
			<wfw:commentRss>http://www.mkhelif.fr/2009/04/10/premire-utilisation-du-plugin-eclipse-gwt.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Chrome : comment créer une extension ?</title>
		<link>http://www.mkhelif.fr/2009/03/24/chrome-comment-crer-une-extension.html</link>
		<comments>http://www.mkhelif.fr/2009/03/24/chrome-comment-crer-une-extension.html#comments</comments>
		<pubDate>Tue, 24 Mar 2009 09:18:04 +0000</pubDate>
		<dc:creator>mkhelif</dc:creator>
				<category><![CDATA[Actualités]]></category>
		<category><![CDATA[Chrome]]></category>
		<category><![CDATA[Google]]></category>
		<category><![CDATA[Tutoriel]]></category>
		<category><![CDATA[Web]]></category>

		<guid isPermaLink="false">http://www.mkhelif.fr/2009/03/24/chrome-comment-crer-une-extension.html</guid>
		<description><![CDATA[La version 2.0 beta du navigateur Google Chrome est disponible en téléchargement. Une des évolutions majeures de cette version est la possibilité de rajouter des extensions (attention, ne vous attendez pas à la puissance de XUL des produits Mozilla).
Développement
Pour développer une extension pour Chrome, il faut tout d&#8217;abord télécharger la dernière version 2.0 beta. Ensuite [...]]]></description>
			<content:encoded><![CDATA[<p>La version 2.0 beta du navigateur Google Chrome est disponible en téléchargement. Une des évolutions majeures de cette version est la possibilité de rajouter des extensions (attention, ne vous attendez pas à la puissance de XUL des produits Mozilla).<span id="more-220"></span></p>
<p><strong>Développement</strong></p>
<p>Pour développer une extension pour Chrome, il faut tout d&#8217;abord <a href="http://www.google.com/intl/en/landing/chrome/beta/index.html" target="_blank">télécharger la dernière version 2.0 beta</a>. Ensuite créer un répertoire qui va contenir l&#8217;arborescence de l&#8217;extension : <em>C:\MyChromeExtension\</em>. Dans ce répertoire on va créer deux fichiers : <em>manifest.json</em> et <em>MyExtension.js</em>.</p>
<p>Le fichier <em>manifest.json</em> qui décrit l&#8217;extension :</p>

<div class="wp_codebox"><table><tr id="p22024"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
</pre></td><td class="code" id="p220code24"><pre class="javascript" style="font-family:monospace;"><span style="color: #009900;">&#123;</span>
  <span style="color: #3366CC;">&quot;format_version&quot;</span><span style="color: #339933;">:</span> <span style="color: #CC0000;">1</span><span style="color: #339933;">,</span>
  <span style="color: #3366CC;">&quot;id&quot;</span><span style="color: #339933;">:</span> <span style="color: #3366CC;">&quot;00123456789ABCDEF0123456789ABCDEF0123456&quot;</span><span style="color: #339933;">,</span>
  <span style="color: #3366CC;">&quot;version&quot;</span><span style="color: #339933;">:</span> <span style="color: #3366CC;">&quot;1.0&quot;</span><span style="color: #339933;">,</span>
  <span style="color: #3366CC;">&quot;name&quot;</span><span style="color: #339933;">:</span> <span style="color: #3366CC;">&quot;My First Extension&quot;</span><span style="color: #339933;">,</span>
  <span style="color: #3366CC;">&quot;description&quot;</span><span style="color: #339933;">:</span> <span style="color: #3366CC;">&quot;The first extension that I made.&quot;</span><span style="color: #339933;">,</span>
  <span style="color: #3366CC;">&quot;content_scripts&quot;</span><span style="color: #339933;">:</span> <span style="color: #009900;">&#91;</span>
    <span style="color: #009900;">&#123;</span>
      <span style="color: #3366CC;">&quot;matches&quot;</span><span style="color: #339933;">:</span> <span style="color: #009900;">&#91;</span><span style="color: #3366CC;">&quot;http://www.google.fr/&quot;</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span>
      <span style="color: #3366CC;">&quot;js&quot;</span><span style="color: #339933;">:</span> <span style="color: #009900;">&#91;</span><span style="color: #3366CC;">&quot;MyExtension.js&quot;</span><span style="color: #009900;">&#93;</span>
    <span style="color: #009900;">&#125;</span>
  <span style="color: #009900;">&#93;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>Voilà les différents champs :</p>
<ul>
<li><em>format_version</em> : permet de définir quelle version du format du manifest est utilisée. Pour l&#8217;instant il n&#8217;y a que la version 1 de disponible.</li>
<li><em>id</em> : à l&#8217;instar des extensions Mozilla, c&#8217;est un identifiant qui doit être unique pour chaque extension. C&#8217;est une chaîne de 40 caractères.</li>
<li><em>version</em> : version de l&#8217;extension. N&#8217;importe quel numéro de version peut être utilisé à condition que ce soit des nombres séparés par un point : <em>1.0.0.0</em>.</li>
<li><em>name </em>: le nom de l&#8217;extension.</li>
<li><em>description </em>(optionnel)<em> </em>: une description optionnelle de l&#8217;extension.</li>
<li><em>content_scripts</em> : les scripts à exécuter lorsque l&#8217;URL de la page valide le modèle.
<ul>
<li><em>matches </em>: modèle d&#8217;URL qui permet d&#8217;appliquer le script.</li>
<li><em>js </em>: fichier JavaScript qui sera exécuté si l&#8217;URL courante valide le modèle.</li>
</ul>
</li>
</ul>
<p>Ensuite il faut créer le fichier JavaScript qui va être exécuté au chargement de la page de Google. Modifier le fichier <em>MyExtension.js</em> :</p>

<div class="wp_codebox"><table><tr id="p22025"><td class="line_numbers"><pre>1
</pre></td><td class="code" id="p220code25"><pre class="javascript" style="font-family:monospace;"><span style="color: #000066;">alert</span> <span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'Hello World!'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<h3>Utilisation de l&#8217;extension</h3>
<p>Pour utiliser l&#8217;extension que l&#8217;on vient de développer, il faut démarrer Chrome dans un mode permettant de charger les extensions : <em>chrome.exe &#8211;enable-extensions &#8211;load-extension=&nbsp;&raquo;C:\MyChromeExtension&nbsp;&raquo;</em>.</p>
<p>Et naviguer sur votre moteur de recherche favoris pour voir que votre extension fonctionne bien.</p>
<h3>Distribution de l&#8217;extension</h3>
<p>Pour distribuer l&#8217;extension il faut la packager au format CRX. Pour cela il faut que Python 2.6 soit installé sur votre machine et télécharger <a href="http://src.chromium.org/viewvc/chrome/trunk/src/chrome/tools/extensions/chromium_extension.py?content-type=text/plain" target="_blank">ce script</a>. Ensuite lancer la commande suivante :</p>

<div class="wp_codebox"><table><tr id="p22026"><td class="line_numbers"><pre>1
</pre></td><td class="code" id="p220code26"><pre class="sh" style="font-family:monospace;">chromium_extension.py --indir=&quot;C:\MyChromeExtension&quot; --outfile=&quot;MyExtension.crx&quot;</pre></td></tr></table></div>

<p>Pour voir les extensions qui sont installées dans Chrome, il suffit d&#8217;aller à l&#8217;URL suivante : <a href="chrome-ui://extensions/" target="_blank">chrome-ui://extensions/</a>. Cette page liste les extensions chargées et les erreurs qui on été rencontrées dans l&#8217;exécution des extensions.</p>
<h3>Conclusion</h3>
<p>Même si ce n&#8217;est pas du tout du même niveau que celui des produits Mozilla cela permet de mettre en place un système d&#8217;extensions qui, je l&#8217;espère, sera amélioré dans les futures versions.</p>
<p>Sources : <a href="http://dev.chromium.org/developers/design-documents/extensions/howto" target="_blank">Chrome Extension HOWTO ‎(Chromium Developer Documentation)</a>.<br />
<h3>Pour suivre votre lecture</h3>
<ul class="related_post">
<li><a href="http://www.mkhelif.fr/2009/11/19/chrome-os-premire-prsentation.html" title="Chrome OS : premi&egrave;re pr&eacute;sentation">Chrome OS : premi&egrave;re pr&eacute;sentation</a></li>
<li><a href="http://www.mkhelif.fr/2009/08/04/chrome-des-thmes-et-de-la-synchronisation.html" title="Chrome : des thèmes et de la synchronisation">Chrome : des thèmes et de la synchronisation</a></li>
<li><a href="http://www.mkhelif.fr/2010/01/14/gwt-2-0-les-nouvelles-fonctionnalits.html" title="GWT 2.0 : les nouvelles fonctionnalités">GWT 2.0 : les nouvelles fonctionnalités</a></li>
<li><a href="http://www.mkhelif.fr/2009/12/15/goo-gl-le-raccourcisseur-durl-by-google.html" title="Goo.gl : le raccourcisseur d&rsquo;URL by Google">Goo.gl : le raccourcisseur d&rsquo;URL by Google</a></li>
<li><a href="http://www.mkhelif.fr/2009/09/12/cinq-moyens-pour-grer-son-identit-virtuelle.html" title="Cinq moyens pour g&eacute;rer son identit&eacute; virtuelle">Cinq moyens pour g&eacute;rer son identit&eacute; virtuelle</a></li>
<li><a href="http://www.mkhelif.fr/2009/08/21/tests-en-charge-dec2-gae-et-azure.html" title="Tests en charge d&rsquo;EC2, GAE et Azure">Tests en charge d&rsquo;EC2, GAE et Azure</a></li>
<li><a href="http://www.mkhelif.fr/2009/08/11/google-vers-une-nouvelle-version-du-moteur-de-recherche.html" title="Google : vers une nouvelle version du moteur de recherche">Google : vers une nouvelle version du moteur de recherche</a></li>
</ul>
       ]]></content:encoded>
			<wfw:commentRss>http://www.mkhelif.fr/2009/03/24/chrome-comment-crer-une-extension.html/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Authentification SSH par clé privée/clé publique</title>
		<link>http://www.mkhelif.fr/2008/11/24/authentification-ssh-par-cl-privecl-publique.html</link>
		<comments>http://www.mkhelif.fr/2008/11/24/authentification-ssh-par-cl-privecl-publique.html#comments</comments>
		<pubDate>Mon, 24 Nov 2008 14:36:44 +0000</pubDate>
		<dc:creator>mkhelif</dc:creator>
				<category><![CDATA[Cryptographie]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Sécurité]]></category>
		<category><![CDATA[Tutoriel]]></category>

		<guid isPermaLink="false">http://www.mkhelif.fr/2008/11/24/authentification-ssh-par-cl-privecl-publique.html</guid>
		<description><![CDATA[En voyant l&#8217;intérêt que les visiteurs de mon blog porte à l&#8217;installation d&#8217;un serveur de mail multi-domaines, j&#8217;ai décidé d&#8217;écrire un autre tutoriel sur la configuration d&#8217;un serveur SSH pour utiliser une connexion par clé publique/clé privée.

Fonctionnement
L&#8217;objectif d&#8217;une authentification par clés est de supprimer l&#8217;envoi de mots de passe par le réseau. Pour cela il [...]]]></description>
			<content:encoded><![CDATA[<p>En voyant l&#8217;intérêt que les visiteurs de mon blog porte à l&#8217;installation d&#8217;un serveur de mail multi-domaines, j&#8217;ai décidé d&#8217;écrire un autre tutoriel sur la configuration d&#8217;un serveur SSH pour utiliser une connexion par clé publique/clé privée.</p>
<p><span id="more-156"></span></p>
<p><strong>Fonctionnement</strong></p>
<p>L&#8217;objectif d&#8217;une authentification par clés est de supprimer l&#8217;envoi de mots de passe par le réseau. Pour cela il faut deux clés : une clé privée (seul l&#8217;utilisateur doit pouvoir y avoir accès) et une clé publique (doit être déployée sur toutes les machines où l&#8217;on souhaite se connecter).</p>
<p>La clé publique peut crypter les données et seule la clé privée peut les décrypter. Dans l&#8217;autre sens la clé privée <strong>signe</strong> les messages, la clé publique permet alors de s&#8217;assurer que le message vient bien du bon utilisateur. C&#8217;est le cryptage asymétrique.</p>
<p>Pour SSH, c&#8217;est exactement la même chose. Le serveur envoi un <em>challenge</em> au client : message crypté à partir de la clé publique. La connexion ne sera acceptée uniquement si le client répond correctement à ce message (c&#8217;est à dire qu&#8217;il a réussi à décrypter le message).</p>
<h3>Configuration du serveur SSH</h3>
<p>Par défaut le serveur SSH n&#8217;accepte pas les connections par clés mais uniquement par mot de passe. On va donc activer cette méthode d&#8217;authentification :</p>
<blockquote><p><span style="color: #333333;">Dans le fichier : <em>/etc/ssh/sshd_config</em></span></p>
<pre>RSAAuthentication    yes
PubkeyAuthentication yes
AuthorizedKeysFile   %h/.ssh/authorized_keys</pre>
</blockquote>
<p>Pour des questions de sécurité vous pouvez désactiver la connexion avec le login <strong>root</strong> :</p>
<blockquote>
<pre>PermitRootLogin no</pre>
</blockquote>
<p>Il suffit de redémarrer le serveur SSH : <em>/etc/init.d/ssh restart</em></p>
<p>Si vous souhaitez refuser l&#8217;authentification par mot de passe (pour éviter les attaques bruteforce et ainsi que les logs se remplissent pour rien) il faut positionner l&#8217;option suivante :</p>
<blockquote>
<pre>PasswordAuthentication no</pre>
</blockquote>
<h3>Création des clés</h3>
<p>Il y a deux manières pour créer les clés :</p>
<ol>
<li>Sur un poste Linux :
<ol>
<li>Lancer la commande suivante : <em>ssh-keygen -t rsa</em></li>
<li><em>Laisser les noms par défaut et entrer le mot de passe pour la clé privée.</em></li>
</ol>
</li>
<li>Sur un poste Windows :
<ol>
<li>Utiliser <a href="http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html" target="_blank">PuttyGen</a> pour générer les clés.</li>
</ol>
</li>
</ol>
<p>Ensuite il faut copier la clé publique <em>id_rsa.pub</em> sur le serveur auquel on souhaite se connecter et conserver la clé privée sur le poste client.</p>
<p>Dans le répertoire de l&#8217;utilisateur on crée un répertoire <em>.ssh </em>(répertoire par défaut où le serveur SSH va chercher les clés publiques) et on renomme le fichier en <em>authorized_keys</em>.</p>
<p>Ensuite il faut <strong>absolument</strong> que ce fichier ai les droits suivants : <em>chmod 600 authorized_keys.</em></p>
<p>À partir de ce moment toutes les personnes ayant la clé privée et le mot de passe ayant servi à la générer peuvent se connecter au serveur.</p>
<h3>Première connexion</h3>
<p>Afin de se connecter avec <a href="http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html" target="_blank">Putty</a> vous devez spécifier la clé privée : <em>Connection / SSH / Auth</em>.</p>
<p>Si vous avez créé votre paire de clés grâce à <em>ssh-keygen</em>, vous devez convertir votre clé privée au format Putty. Pour cela vous devez utiliser <a href="http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html" target="_blank">PuttyGen</a> : menu <em>Conversions / Import key</em>, entrer alors le mot de passe de la clé, puis <strong>Save private key</strong>.</p>
<p>Lors de chaque connexion Putty vous demande le mot de passe de la clé, quel intérêt alors de se connecter en utilisant une paire de clé si on doit rentrer à chaque fois le mot de passe de la clé privée. C&#8217;est là qu&#8217;intervient <a href="http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html" target="_blank">Pageant</a>, c&#8217;est un outils de la suite Putty qui permet de stocker pour une clé privée son mot de passe. L&#8217;utilisation de ce programme est extrêmement simple, je n&#8217;en parlerai donc pas ici. Pour Linux il suffit d&#8217;installer ssh-agent qui joue exactement le même rôle.<br />
<h3>Pour suivre votre lecture</h3>
<ul class="related_post">
<li><a href="http://www.mkhelif.fr/2008/06/23/apache2-systeme-de-blacklist.html" title="Apache2 : système de blacklist">Apache2 : système de blacklist</a></li>
<li><a href="http://www.mkhelif.fr/2008/05/23/serveur-de-mails-multi-domaines.html" title="Serveur de mails multi-domaines">Serveur de mails multi-domaines</a></li>
<li><a href="http://www.mkhelif.fr/2009/11/19/chrome-os-premire-prsentation.html" title="Chrome OS : premi&egrave;re pr&eacute;sentation">Chrome OS : premi&egrave;re pr&eacute;sentation</a></li>
<li><a href="http://www.mkhelif.fr/2009/09/07/ruby-on-rails-dployer-une-application-sur-tomcat-avec-jruby.html" title="Ruby on Rails : d&eacute;ployer une application sur Tomcat avec JRuby">Ruby on Rails : d&eacute;ployer une application sur Tomcat avec JRuby</a></li>
<li><a href="http://www.mkhelif.fr/2009/07/08/google-annonce-chrome-os.html" title="Google annonce Chrome OS">Google annonce Chrome OS</a></li>
<li><a href="http://www.mkhelif.fr/2008/07/30/oracle-faille-critique-dans-weblogic.html" title="Oracle : faille critique dans WebLogic [corrigé]">Oracle : faille critique dans WebLogic [corrigé]</a></li>
<li><a href="http://www.mkhelif.fr/2008/06/18/passerelle-entre-apache-et-tomcat.html" title="Passerelle entre Apache et Tomcat">Passerelle entre Apache et Tomcat</a></li>
</ul>
       ]]></content:encoded>
			<wfw:commentRss>http://www.mkhelif.fr/2008/11/24/authentification-ssh-par-cl-privecl-publique.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>GWT : &#171;&#160;The Great GWT roundup&#160;&#187;</title>
		<link>http://www.mkhelif.fr/2008/10/02/gwt-the-great-gwt-roundup.html</link>
		<comments>http://www.mkhelif.fr/2008/10/02/gwt-the-great-gwt-roundup.html#comments</comments>
		<pubDate>Thu, 02 Oct 2008 12:32:57 +0000</pubDate>
		<dc:creator>mkhelif</dc:creator>
				<category><![CDATA[Actualités]]></category>
		<category><![CDATA[GWT]]></category>
		<category><![CDATA[Google]]></category>
		<category><![CDATA[Tutoriel]]></category>

		<guid isPermaLink="false">http://www.mkhelif.fr/2008/10/02/gwt-the-great-gwt-roundup.html</guid>
		<description><![CDATA[Il y à quelques jours a été publié un tutoriel pour les débutants sur Google Web Toolkit.
Celui ci présente, en anglais, les grandes fonctionnalités de ce framework et surtout comment les utiliser en tant que développeur.
Voilà le lien : http://css.dzone.com/news/the-great-gwt-roundup
Pour suivre votre lecture

GWT 2.0 : les nouvelles fonctionnalités
GWT 2.0 : le grand nettoyage
Première utilisation du [...]]]></description>
			<content:encoded><![CDATA[<p>Il y à quelques jours a été publié un tutoriel pour les débutants sur Google Web Toolkit.</p>
<p>Celui ci présente, en anglais, les grandes fonctionnalités de ce framework et surtout comment les utiliser en tant que développeur.</p>
<p>Voilà le lien : <a title="http://css.dzone.com/news/the-great-gwt-roundup" href="http://css.dzone.com/news/the-great-gwt-roundup">http://css.dzone.com/news/the-great-gwt-roundup</a></p>
<h3>Pour suivre votre lecture</h3>
<ul class="related_post">
<li><a href="http://www.mkhelif.fr/2010/01/14/gwt-2-0-les-nouvelles-fonctionnalits.html" title="GWT 2.0 : les nouvelles fonctionnalités">GWT 2.0 : les nouvelles fonctionnalités</a></li>
<li><a href="http://www.mkhelif.fr/2009/08/03/gwt-20-le-grand-nettoyage.html" title="GWT 2.0 : le grand nettoyage">GWT 2.0 : le grand nettoyage</a></li>
<li><a href="http://www.mkhelif.fr/2009/04/10/premire-utilisation-du-plugin-eclipse-gwt.html" title="Première utilisation du plugin Eclipse GWT">Première utilisation du plugin Eclipse GWT</a></li>
<li><a href="http://www.mkhelif.fr/2009/04/08/google-gwt-version-16-et-consorts.html" title="Google : GWT version 1.6 et consorts">Google : GWT version 1.6 et consorts</a></li>
<li><a href="http://www.mkhelif.fr/2008/12/11/gwt-16-quoi-de-neuf.html" title="GWT 1.6 : quoi de neuf ?">GWT 1.6 : quoi de neuf ?</a></li>
<li><a href="http://www.mkhelif.fr/2008/12/09/gwt-le-futur-hosted-mode.html" title="GWT : le futur hosted mode">GWT : le futur hosted mode</a></li>
<li><a href="http://www.mkhelif.fr/2008/10/23/gwt-librairie-open-flash-chart.html" title="GWT : librairie Open Flash Chart">GWT : librairie Open Flash Chart</a></li>
</ul>
       ]]></content:encoded>
			<wfw:commentRss>http://www.mkhelif.fr/2008/10/02/gwt-the-great-gwt-roundup.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>GWT : Créer un service RPC</title>
		<link>http://www.mkhelif.fr/2008/07/07/gwt-crer-un-service-rpc.html</link>
		<comments>http://www.mkhelif.fr/2008/07/07/gwt-crer-un-service-rpc.html#comments</comments>
		<pubDate>Mon, 07 Jul 2008 16:05:59 +0000</pubDate>
		<dc:creator>mkhelif</dc:creator>
				<category><![CDATA[GWT]]></category>
		<category><![CDATA[Google]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[RIA]]></category>
		<category><![CDATA[Tutoriel]]></category>

		<guid isPermaLink="false">http://www.mkhelif.fr/2008/07/07/gwt-crer-un-service-rpc.html</guid>
		<description><![CDATA[Le framework GWT permet depuis le client JavaScript de faire des appels RPC (Remote Procedure Call ou appels de procédures distantes) au serveur GWT.
L&#8217;objectif est de permettre au JavaScript client d&#8217;exécuter des méthodes sur le serveur et d&#8217;en récupérer le résultat. Tout cela de façon totalement asynchrone (Ajax). Les échanges entre le client et le [...]]]></description>
			<content:encoded><![CDATA[<p>Le framework GWT permet depuis le client JavaScript de faire des appels RPC (Remote Procedure Call ou appels de procédures distantes) au serveur GWT.</p>
<p>L&#8217;objectif est de permettre au JavaScript client d&#8217;exécuter des méthodes sur le serveur et d&#8217;en récupérer le résultat. Tout cela de façon totalement asynchrone (<strong>A</strong>jax). Les échanges entre le client et le serveur sont faites de façon asynchrone car la plupart des navigateurs n&#8217;accordent qu&#8217;un seul Thread pour exécuter le JavaScript.</p>
<p><span id="more-67"></span></p>
<h3>Infrastructure RPC</h3>
<p>Pour permettre à JavaScript de faire des appels RPC il faut écrire le service côté serveur et la vue qu&#8217;en a le client. Le code d&#8217;un service RPC est séparé en deux packages : <em>fr.mkhelif.gwt.client</em> et <em>fr.mkhelif.gwt.server</em>.</p>
<p>Dans ce tutoriel nous allons créer un service <strong>Hello</strong> qui va tout simplement dire bonjour.</p>
<h5>Package client</h5>
<p>Le package client doit contenir les interfaces décrivant les méthodes du service.</p>

<div class="wp_codebox"><table><tr id="p6733"><td class="line_numbers"><pre>1
2
3
4
5
6
</pre></td><td class="code" id="p67code33"><pre class="java" style="font-family:monospace;"><span style="color: #008000; font-style: italic; font-weight: bold;">/**
 * @author Marwan KHELIF
 */</span>
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">interface</span> HelloService <span style="color: #000000; font-weight: bold;">extends</span> RemoteService <span style="color: #009900;">&#123;</span>
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #003399;">String</span> sayHello <span style="color: #009900;">&#40;</span><span style="color: #003399;">String</span> name<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span> <span style="color: #666666; font-style: italic;">// HelloService</span></pre></td></tr></table></div>

<p>Voilà le code du service côté client qui sera utilisé pour effectuer des appels RPC en JavaScript.</p>
<p>On crée alors une interface qui sera utilisé par GWT pour effectuer les appels asynchrone. Cette interface est identique à celle que l&#8217;on vient d&#8217;écrire sauf que toutes les méthodes doivent retourner <strong>void</strong> et posséder un dernier argument en plus.</p>

<div class="wp_codebox"><table><tr id="p6734"><td class="line_numbers"><pre>1
2
3
4
5
6
</pre></td><td class="code" id="p67code34"><pre class="java" style="font-family:monospace;"><span style="color: #008000; font-style: italic; font-weight: bold;">/**
 * @author Marwan KHELIF
 */</span>
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">interface</span> HelloServiceAsync <span style="color: #009900;">&#123;</span>
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">void</span> sayHello <span style="color: #009900;">&#40;</span><span style="color: #003399;">String</span> name, AsyncCallback callback<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span> <span style="color: #666666; font-style: italic;">// HelloServiceAsync</span></pre></td></tr></table></div>

<p>La classe AsyncCallBack contient deux méthodes qui permettent de gérer le résultat de l&#8217;appel :</p>
<pre>public void onSuccess (Object result)
public void onFailure (Throwable ex)
</pre>
<h5>Package server</h5>
<p>Le package server (peut être nommé différemment) contient le code des services définis dans le package client.</p>
<p>Voilà donc notre implémentation du service <strong>Hello</strong> :</p>

<div class="wp_codebox"><table><tr id="p6735"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
</pre></td><td class="code" id="p67code35"><pre class="java" style="font-family:monospace;"><span style="color: #008000; font-style: italic; font-weight: bold;">/**
 * @author Marwan KHELIF
 */</span>
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> HelloServiceImpl <span style="color: #000000; font-weight: bold;">extends</span> RemoteServiceServlet <span style="color: #000000; font-weight: bold;">implements</span> HelloService <span style="color: #009900;">&#123;</span>
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #003399;">String</span> sayHello <span style="color: #009900;">&#40;</span><span style="color: #003399;">String</span> name<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #000000; font-weight: bold;">return</span> <span style="color: #0000ff;">&quot;Hello &quot;</span> <span style="color: #339933;">+</span> name <span style="color: #339933;">+</span> <span style="color: #0000ff;">&quot;!&quot;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span> <span style="color: #666666; font-style: italic;">// sayHello ()</span>
<span style="color: #009900;">&#125;</span> <span style="color: #666666; font-style: italic;">// HelloService</span></pre></td></tr></table></div>

<p>Voilà notre service est prêt à fonctionner, il faut maintenant le rendre disponible aux clients. Pour cela il faut modifier le fichier de l&#8217;application GWT : <em>MyApplication.gwt.xml</em></p>

<div class="wp_codebox"><table><tr id="p6736"><td class="line_numbers"><pre>1
2
3
4
5
6
7
</pre></td><td class="code" id="p67code36"><pre class="xml" style="font-family:monospace;"><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;module<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
	<span style="color: #808080; font-style: italic;">&lt;!-- Inherit GWT --&gt;</span>
	<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;inherits</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;com.google.gwt.user.User&quot;</span> <span style="color: #000000; font-weight: bold;">/&gt;</span></span>
&nbsp;
	<span style="color: #808080; font-style: italic;">&lt;!-- Available Services --&gt;</span>
	<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;servlet</span> <span style="color: #000066;">path</span>=<span style="color: #ff0000;">&quot;/hello&quot;</span> <span style="color: #000066;">class</span>=<span style="color: #ff0000;">&quot;fr.mkhelif.gwt.server.HelloServiceImpl&quot;</span> <span style="color: #000000; font-weight: bold;">/&gt;</span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/module<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></pre></td></tr></table></div>

<p>Voilà notre service RPC est prêt à l&#8217;emploi.</p>
<h3>Échange de données</h3>
<p>Afin d&#8217;échanger des données entre le client (JavaScript) et le serveur (Java) il faut sérialiser les données pour qu&#8217;elles puissent transiter par le protocole HTTP. La sérialisation fournie avec GWT est différente de celle de Java.</p>
<p>Un type d&#8217;objet peut être utilisé en paramètre ou en retour d&#8217;une méthode de Service si c&#8217;est :</p>
<ol>
<li>
<div>un type primitif : int, char, byte, double, boolean&#8230;</div>
</li>
<li>
<div>un objet de type : String, Date ou un wrapper de type primitif (Double, Long, Integer, Float, Boolean, &#8230;).</div>
</li>
<li>
<div>un tableau d&#8217;objets sérialisables.</div>
</li>
<li>
<div>une classe utilisateur qui implémente <a href="http://google-web-toolkit.googlecode.com/svn/javadoc/1.4/com/google/gwt/user/client/rpc/IsSerializable.html" target="_blank">com.google.gwt.user.client.rpc.IsSerialisable</a> ou <a href="http://java.sun.com/j2se/1.4.2/docs/api/java/io/Serializable.html" target="_blank">java.io.Serialisable</a>.</div>
</li>
</ol>
<p align="justify">Dans notre exemple nous n&#8217;utilisons que le type String, il n&#8217;y a donc aucun problème de sérialisation.</p>
<h3>Appel d&#8217;un service GWT</h3>
<p align="justify">Une fois notre service crée, il faut effectuer des appels a sa méthode <em>sayHello</em>. Pour cela il faut demander à GWT de nous donner une référence vers ce service puis on appelle la méthode.</p>
<h5>Instanciation du service</h5>
<p align="justify">Pour instancier le service il suffit d&#8217;appeler :</p>

<div class="wp_codebox"><table><tr id="p6737"><td class="line_numbers"><pre>1
</pre></td><td class="code" id="p67code37"><pre class="java" style="font-family:monospace;">HelloServiceAsync service <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span>HelloServiceAsync<span style="color: #009900;">&#41;</span> GWT.<span style="color: #006633;">create</span> <span style="color: #009900;">&#40;</span>HelloService.<span style="color: #000000; font-weight: bold;">class</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p align="justify">Le cast de HelloService vers HelloServiceAsync est toujours sûr car l&#8217;objet Proxy créé implémente l&#8217;interface asynchrone.</p>
<h5>Association du service à l&#8217;URL</h5>
<p align="justify">Une fois notre service instancié il faut le lier avec le point d&#8217;entrée du service sur le serveur : <em>/hello</em>. Pour cela on effectue l&#8217;appel suivant :</p>
<pre>((ServiceDefTarget) service).setServiceEntryPoint (GWT.getModuleBaseURL () + "/hello");</pre>
<p align="justify">Voilà le service est mappé avec le serveur, on peut effectuer l&#8217;appel à la méthode.</p>
<h5>Appel d&#8217;une méthode de service</h5>
<p align="justify">Pour appeler la méthode du service :</p>

<div class="wp_codebox"><table><tr id="p6738"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
</pre></td><td class="code" id="p67code38"><pre class="java" style="font-family:monospace;">service.<span style="color: #006633;">sayHello</span> <span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Marwan KHELIF&quot;</span>, <span style="color: #000000; font-weight: bold;">new</span> AsyncCallBack <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">void</span> onFailure <span style="color: #009900;">&#40;</span><span style="color: #003399;">Throwable</span> caught<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #666666; font-style: italic;">// Traitement en cas d'erreur</span>
	<span style="color: #009900;">&#125;</span> <span style="color: #666666; font-style: italic;">// onFailure ()</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">void</span> onSuccess <span style="color: #009900;">&#40;</span><span style="color: #003399;">Object</span> result<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #666666; font-style: italic;">// Traitement en cas de succès</span>
		<span style="color: #003399;">Window</span>.<span style="color: #006633;">alert</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span><span style="color: #003399;">String</span><span style="color: #009900;">&#41;</span> result<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span> <span style="color: #666666; font-style: italic;">// onFailure ()</span>
<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p align="justify">Voilà la méthode a été appelée sur le service RPC.</p>
<h3>Conclusion</h3>
<p>Les services RPC est l&#8217;un des points les plus importants du framework GWT. Ils permettent d&#8217;effectuer très simplement des appels au serveur en JavaScript et ainsi mettre à jour l&#8217;interface graphique grâce aux données.</p>
<h3>Pour suivre votre lecture</h3>
<ul class="related_post">
<li><a href="http://www.mkhelif.fr/2010/01/14/gwt-2-0-les-nouvelles-fonctionnalits.html" title="GWT 2.0 : les nouvelles fonctionnalités">GWT 2.0 : les nouvelles fonctionnalités</a></li>
<li><a href="http://www.mkhelif.fr/2009/04/10/premire-utilisation-du-plugin-eclipse-gwt.html" title="Première utilisation du plugin Eclipse GWT">Première utilisation du plugin Eclipse GWT</a></li>
<li><a href="http://www.mkhelif.fr/2009/04/08/google-gwt-version-16-et-consorts.html" title="Google : GWT version 1.6 et consorts">Google : GWT version 1.6 et consorts</a></li>
<li><a href="http://www.mkhelif.fr/2008/12/09/gwt-le-futur-hosted-mode.html" title="GWT : le futur hosted mode">GWT : le futur hosted mode</a></li>
<li><a href="http://www.mkhelif.fr/2008/10/23/gwt-librairie-open-flash-chart.html" title="GWT : librairie Open Flash Chart">GWT : librairie Open Flash Chart</a></li>
<li><a href="http://www.mkhelif.fr/2008/10/03/ria-quel-framework-choisir.html" title="RIA : quel framework choisir?">RIA : quel framework choisir?</a></li>
<li><a href="http://www.mkhelif.fr/2008/09/02/gwt-version-15-disponible.html" title="GWT : version 1.5 disponible">GWT : version 1.5 disponible</a></li>
</ul>
       ]]></content:encoded>
			<wfw:commentRss>http://www.mkhelif.fr/2008/07/07/gwt-crer-un-service-rpc.html/feed</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
		<item>
		<title>GWT : Introduction au framework</title>
		<link>http://www.mkhelif.fr/2008/07/03/gwt-introduction-au-framework.html</link>
		<comments>http://www.mkhelif.fr/2008/07/03/gwt-introduction-au-framework.html#comments</comments>
		<pubDate>Thu, 03 Jul 2008 14:48:03 +0000</pubDate>
		<dc:creator>mkhelif</dc:creator>
				<category><![CDATA[GWT]]></category>
		<category><![CDATA[Google]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[RIA]]></category>
		<category><![CDATA[Tutoriel]]></category>

		<guid isPermaLink="false">http://www.mkhelif.fr/?p=66</guid>
		<description><![CDATA[Je travaille actuellement sur un plugin pour le logiciel NeoLoad permettant d&#8217;enregistrer des requêtes RPC effectuer par le framework GWT (Google Web Toolkit). Je vais donc en profiter pour présenter ce framework.

Qu&#8217;est ce que GWT?
Google Web Toolkit est un framework qui permet de créer un RIA (Rich Internet Application) sans avoir à écrire des centaines [...]]]></description>
			<content:encoded><![CDATA[<p>Je travaille actuellement sur un plugin pour le logiciel <a href="http://www.neotys.fr/" target="_blank">NeoLoad</a> permettant d&#8217;enregistrer des requêtes RPC effectuer par le framework GWT (<a href="http://code.google.com/webtoolkit/" target="_blank">Google Web Toolkit</a>). Je vais donc en profiter pour présenter ce framework.</p>
<p><span id="more-66"></span></p>
<h3>Qu&#8217;est ce que GWT?</h3>
<p>Google Web Toolkit est un framework qui permet de créer un RIA (Rich Internet Application) sans avoir à écrire des centaines de lignes de JavaScript. GWT est un compilateur qui génére à partir de code source Java des fichiers JavaScript, XML et HTML.</p>
<p>Pour rendre dynamique le site vous pouvez ajouter une couche client-serveur RPC (Remote Protocol Call) entre le JavaScript côté client et le Java côté serveur. Cela permet de faire transiter par HTTP des objets Java entre le client et le serveur et des objets JSON entre le serveur et le client.</p>
<p>Afin de simplifier les étapes de tests et de débug, GWT fourni une JRE permettant d&#8217;exécuter l&#8217;application en local : <strong>Hosted Mode</strong>. Ceci évite la compilation de l&#8217;application et le déploiement sur le serveur.</p>
<p>GWT a donc pour but principal de simplifier et d&#8217;unifier le développement d&#8217;application Web : le développeur crée les classes Java nécessaire à l&#8217;application et GWT s&#8217;occupe du reste.</p>
<h3>Le compilateur GWT</h3>
<p>Dans cet objectif le compilateur GWT génère du code Javascript compatible pour la plupart des navigateurs : Firefox (version 1 à 3), IE (version 6 et 7), Safari (version 2) et Opéra (version 9).</p>
<p>Le code Java écrit par le développeur doit être compatible Java 1.4 minimum. GWT simule le comportement d&#8217;une JRE pour générer le Javascript, mais seulement certaines classes de l&#8217;API sont supportées : <a href="http://code.google.com/webtoolkit/documentation/jre.html" target="_blank">classes supportées par GWT</a>.</p>
<h3>Démarrage de l&#8217;application GWT</h3>
<h5>Chargement des paramètres du navigateur</h5>
<p>Afin d&#8217;avoir une application qui fonctionne peu importe les paramètres de l&#8217;utilisateur (langue, version du navigateur, &#8230;) GWT va générer à la compilation un fichier JavaScript par type de navigateur supporté et par langue de l&#8217;application.</p>
<p>Lorsqu&#8217;un utilisateur accède à la page d&#8217;acceuil de l&#8217;application GWT va charger le fichier JavaScript correspondant à la configuration de l&#8217;utilisateur.</p>
<h5>Page HTML</h5>
<p>La page HTML d&#8217;entrée dans l&#8217;application ne contient qu&#8217;une frame vide qui va charger le JavaScript adéquat selon la configuration de l&#8217;utilisateur.</p>

<div class="wp_codebox"><table><tr id="p6640"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
</pre></td><td class="code" id="p66code40"><pre class="html" style="font-family:monospace;">&lt;html&gt;
	&lt;head&gt;
&nbsp;
		&lt;!-- Chargement du script généré par GWT --&gt;
		&lt;script language='javascript' src='com.mkhelif.gwt.hello.Hello.nocache.js'&gt;&lt;/script&gt;
	&lt;/head&gt;
&nbsp;
	&lt;body&gt;
		&lt;!-- Gestion de l'historique par GWT --&gt;
		&lt;iframe src=&quot;javascript:''&quot; id=&quot;__gwt_historyFrame&quot; style=&quot;width:0;height:0;border:0&quot;&gt;&lt;/iframe&gt;
	&lt;/body&gt;
&lt;/html&gt;</pre></td></tr></table></div>

<p>L&#8217;application démarre en plusieurs étapes :</p>
<ol>
<li>Chargement de la page HTML par le navigateur.</li>
<li>Chargement et exécution du JavaScript <em>.nocache.js</em>.</li>
<li>Le code JavaScript récupère la configuration du navigateur et récupère à partir d&#8217;une table (générée par GWT) le nom du fichier HTML à utiliser.</li>
<li>Le JavaScript crée alors une frame cachée qui est insérée à la fin du <strong>body</strong> de la page.</li>
<li>Lorsque le fichier HTML est chargée l&#8217;application est démarée.</li>
</ol>
<h3>Fichiers générés par le compilateur</h3>
<h5>Fichier JavaScript <em>.nocache.js</em></h5>
<p>Ce fichier permet de chargée une version de l&#8217;application compatible avec le navigateur du client.</p>
<p>Ce fichier contient une table avec en clé la configuration du client et en valeur l&#8217;URL du fichier HTML à charger. Par exemple ce fichier contiendra une entrée avec &#8216;Firefox en français&#8217;, &#8216;IE en anglais&#8217;, &#8216;Opera en allemand&#8217;, &#8230;</p>
<p>Chaque navigateur ayant une interprétation du JavaScript différent, cela permet de tirer parti de toutes les spécificités du navigateur.</p>
<p>Ce fichier <em>nocache</em> doit être re-téléchargé par le navigateur à chaque chargement de la page car il est recréé lorsque l&#8217;on recompile l&#8217;application. Cependant le nom ne change pas.</p>
<h5>Fichier HTML <em>.cache.html</em></h5>
<p>Ces fichiers HTML (il y en à un par navigateur et par langue) contient uniquement le JavaScript compressé de l&#8217;application. Le fichier JavaScript n&#8217;est pas envoyé directement car certains navigateur ne supporte pas le JavaScript compressé. Il est donc inclus dans du HTML afin d&#8217;éviter les problèmes de compatibilité.</p>
<p>Chaque fichier HTML a pour nom la signature MD5 de son contenu afin d&#8217;éviter que plusieurs fichiers HTML aient le même nom. Ainsi si vous modifiez le code de votre application, les fichiers n&#8217;auront pas le même nom.</p>
<p>Ces fichiers étant différents à chaque compilation, ils peuvent être mis en <em>cache</em> par le navigateur. D&#8217;où leurs noms <em>cache.html</em>.</p>
<h5>Fichier <em>.gwt.rpc</em></h5>
<p>Si votre application utilise des appels RPC vers le serveur et que les requêtes utilisent les objets Java que vous avez créé, ces objets doivent être sérialisés pour pouvoir transiter par le protocole HTTP.</p>
<p>Ces fichiers définissent quels objets doivent être sérialisés et leur politique de sérialisation.</p>
<h3>Conclusion</h3>
<p>Voilà une première introduction au framework GWT. Ce framework est très prometteur car il permet de s&#8217;abstraire de tous les problèmes que l&#8217;on rencontre pendant le développement d&#8217;une application AJAX.</p>
<h3>Pour suivre votre lecture</h3>
<ul class="related_post">
<li><a href="http://www.mkhelif.fr/2010/01/14/gwt-2-0-les-nouvelles-fonctionnalits.html" title="GWT 2.0 : les nouvelles fonctionnalités">GWT 2.0 : les nouvelles fonctionnalités</a></li>
<li><a href="http://www.mkhelif.fr/2009/04/10/premire-utilisation-du-plugin-eclipse-gwt.html" title="Première utilisation du plugin Eclipse GWT">Première utilisation du plugin Eclipse GWT</a></li>
<li><a href="http://www.mkhelif.fr/2009/04/08/google-gwt-version-16-et-consorts.html" title="Google : GWT version 1.6 et consorts">Google : GWT version 1.6 et consorts</a></li>
<li><a href="http://www.mkhelif.fr/2008/12/09/gwt-le-futur-hosted-mode.html" title="GWT : le futur hosted mode">GWT : le futur hosted mode</a></li>
<li><a href="http://www.mkhelif.fr/2008/10/23/gwt-librairie-open-flash-chart.html" title="GWT : librairie Open Flash Chart">GWT : librairie Open Flash Chart</a></li>
<li><a href="http://www.mkhelif.fr/2008/10/03/ria-quel-framework-choisir.html" title="RIA : quel framework choisir?">RIA : quel framework choisir?</a></li>
<li><a href="http://www.mkhelif.fr/2008/09/02/gwt-version-15-disponible.html" title="GWT : version 1.5 disponible">GWT : version 1.5 disponible</a></li>
</ul>
       ]]></content:encoded>
			<wfw:commentRss>http://www.mkhelif.fr/2008/07/03/gwt-introduction-au-framework.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Apache2 : système de blacklist</title>
		<link>http://www.mkhelif.fr/2008/06/23/apache2-systeme-de-blacklist.html</link>
		<comments>http://www.mkhelif.fr/2008/06/23/apache2-systeme-de-blacklist.html#comments</comments>
		<pubDate>Mon, 23 Jun 2008 14:43:06 +0000</pubDate>
		<dc:creator>mkhelif</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Sécurité]]></category>
		<category><![CDATA[Tutoriel]]></category>
		<category><![CDATA[Web]]></category>

		<guid isPermaLink="false">http://www.mkhelif.fr/?p=57</guid>
		<description><![CDATA[Après avoir installé mon serveur web (Apache) et un serveur d&#8217;applications J2EE (GlassFish) je me suis vite rendu compte, après une semaine d&#8217;exécution, que les logs du serveur prennaient de plus en plus de place.
En regardant rapidement les fichiers de logs on se rend très vite compte que le serveur se fait &#171;&#160;spammer&#160;&#187; des URL [...]]]></description>
			<content:encoded><![CDATA[<p>Après avoir installé mon serveur web (Apache) et un serveur d&#8217;applications J2EE (GlassFish) je me suis vite rendu compte, après une semaine d&#8217;exécution, que les logs du serveur prennaient de plus en plus de place.</p>
<p>En regardant rapidement les fichiers de logs on se rend très vite compte que le serveur se fait &laquo;&nbsp;spammer&nbsp;&raquo; des URL du type : <strong>phpmyadmin</strong>, <strong>admin</strong>, <strong>mysql</strong>, &#8230;</p>
<p>J&#8217;ai décidé de mettre en place un système de blacklistage instégré à Apache.</p>
<p><span id="more-57"></span></p>
<h3>Configuration de Apache</h3>
<p>Pour cela il faut installer le module mod_rewrite (inclus par défaut avec Apache2).</p>
<p>On ajoute donc les règles dans le fichier de configuration d&#8217;apache (<strong>/etc/apache2/sites-avaible/</strong>)</p>
<blockquote>
<pre>RewriteEngine On

RewriteMap hosts-deny txt:/etc/apache2/hosts.deny
RewriteCond ${hosts-deny:%{REMOTE_HOST}|NOT-FOUND} !=NOT-FOUND [OR]
RewriteCond ${hosts-deny:%{REMOTE_ADDR}|NOT-FOUND} !=NOT-FOUND
RewriteRule ^/.* - [F]</pre>
</blockquote>
<p>Ainsi les adresses IP ou nom de domaine listés dans le fichier <strong>/etc/apache2/hosts.deny</strong> recevront le code réponse : <em>403 Forbidden</em>.</p>
<p>On crée le fichier <strong>/etc/apache2/hosts.deny</strong> :</p>
<blockquote>
<pre>adresse_ip -
nom_de_domaine -</pre>
</blockquote>
<p>Penser à ajouter le tiret &laquo;&nbsp;-&nbsp;&raquo; à la fin de chaque entrée dans ce fichier.</p>
<h3>Page d&#8217;erreur personnalisée</h3>
<p>Si vous voulez rediriger les adresses blacklilstées vers une page personnalisée il faut modifier les règles dans le fichier de configuration de Apache :</p>
<blockquote>
<pre>Remplacez :
RewriteRule ^/.* - [F]

Par :
RewriteRule ^/.* /blacklisted.html [L]</pre>
</blockquote>
<p>Créez alors le fichier <strong>blacklisted.html</strong>.</p>
<p><strong>Source :</strong> <a title="Apache.org" href="http://httpd.apache.org/docs/2.0/misc/rewriteguide.html">http://httpd.apache.org/docs/2.0/misc/rewriteguide.html</a></p>
<h3>Pour suivre votre lecture</h3>
<ul class="related_post">
<li><a href="http://www.mkhelif.fr/2008/05/23/serveur-de-mails-multi-domaines.html" title="Serveur de mails multi-domaines">Serveur de mails multi-domaines</a></li>
<li><a href="http://www.mkhelif.fr/2009/11/19/chrome-os-premire-prsentation.html" title="Chrome OS : premi&egrave;re pr&eacute;sentation">Chrome OS : premi&egrave;re pr&eacute;sentation</a></li>
<li><a href="http://www.mkhelif.fr/2009/09/07/ruby-on-rails-dployer-une-application-sur-tomcat-avec-jruby.html" title="Ruby on Rails : d&eacute;ployer une application sur Tomcat avec JRuby">Ruby on Rails : d&eacute;ployer une application sur Tomcat avec JRuby</a></li>
<li><a href="http://www.mkhelif.fr/2008/11/24/authentification-ssh-par-cl-privecl-publique.html" title="Authentification SSH par clé privée/clé publique">Authentification SSH par clé privée/clé publique</a></li>
<li><a href="http://www.mkhelif.fr/2008/06/18/passerelle-entre-apache-et-tomcat.html" title="Passerelle entre Apache et Tomcat">Passerelle entre Apache et Tomcat</a></li>
<li><a href="http://www.mkhelif.fr/2010/01/14/gwt-2-0-les-nouvelles-fonctionnalits.html" title="GWT 2.0 : les nouvelles fonctionnalités">GWT 2.0 : les nouvelles fonctionnalités</a></li>
<li><a href="http://www.mkhelif.fr/2009/12/15/goo-gl-le-raccourcisseur-durl-by-google.html" title="Goo.gl : le raccourcisseur d&rsquo;URL by Google">Goo.gl : le raccourcisseur d&rsquo;URL by Google</a></li>
</ul>
       ]]></content:encoded>
			<wfw:commentRss>http://www.mkhelif.fr/2008/06/23/apache2-systeme-de-blacklist.html/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Passerelle entre Apache et Tomcat</title>
		<link>http://www.mkhelif.fr/2008/06/18/passerelle-entre-apache-et-tomcat.html</link>
		<comments>http://www.mkhelif.fr/2008/06/18/passerelle-entre-apache-et-tomcat.html#comments</comments>
		<pubDate>Wed, 18 Jun 2008 09:53:04 +0000</pubDate>
		<dc:creator>mkhelif</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Tutoriel]]></category>
		<category><![CDATA[J2EE]]></category>
		<category><![CDATA[Web]]></category>

		<guid isPermaLink="false">http://www.mkhelif.fr/?p=55</guid>
		<description><![CDATA[Dans le but de déployer mes applications J2ee j&#8217;ai installé GlassFish (avec Tomcat). Je souhaitais pouvoir utiliser ce serveur sur le port 80 tout en ayant Apache qui écoute sur ce port.

Apache et Tomcat étant des produits développés par la même équipe il existe une solution très simple pour faire interagir les deux serveurs.
Configuration de [...]]]></description>
			<content:encoded><![CDATA[<p>Dans le but de déployer mes applications J2ee j&#8217;ai installé GlassFish (avec Tomcat). Je souhaitais pouvoir utiliser ce serveur sur le port 80 tout en ayant Apache qui écoute sur ce port.</p>
<p><span id="more-55"></span></p>
<p>Apache et Tomcat étant des produits développés par la même équipe il existe une solution très simple pour faire interagir les deux serveurs.</p>
<h4>Configuration de Apache</h4>
<p>Il faut installer le module <strong>Jk</strong> de Apache :</p>
<blockquote>
<pre>apt-get install libapache2-mod-jk
a2enmod mod_jk</pre>
</blockquote>
<p>On va ensuite créer un VirtualHost dans la configuration de Apache <em>/etc/apache2/sites-available/default</em> :</p>
<blockquote>
<pre>&lt;VirtualHost demo.mkhelif.fr:80&gt;
    ServerName demo.mkhelif.fr
    ServerAdmin webmaster@mkhelif.fr
    JkMount / worker1
    JkMount /* worker1
&lt;/VirtualHost&gt;</pre>
</blockquote>
<p>On configure le module <strong>Jk </strong><em>/etc/apache2/mods-available/jk.load</em> :</p>
<pre>LoadModule jk_module /usr/lib/apache2/modules/mod_jk.so</pre>
<pre>JkWorkersFile /etc/apache2/workers.conf
JkLogFile /var/log/apache2/mod_jk.log
JkLogLevel info
JkLogStampFormat "[%a %b %d %H:%M:%S %Y] "</pre>
<p>On crée alors le fichier <em>/etc/apache2/workers.conf</em> :</p>
<blockquote>
<pre>workers.java_home=/path/to/jre/
ps=/
worker.list=worker1
worker.worker1.port=8009
worker.worker1.host=localhost
worker.worker1.type=ajp13
worker.worker1.lbfactory=1</pre>
</blockquote>
<p>Apache est désormais configuré pour rediriger toutes les requêtes du domaine demo.mkhelif.fr vers Tomcat par AJP. Il faut configurer Tomcat pour écouter sur ce port.</p>
<h4>Tomcat en standalone</h4>
<p>Pour configurer Tomcat en version standalone (sans serveur d&#8217;applications), il suffit de modifier le fichier <em>server.xml</em> pour ajouter le connecteur AJP :</p>
<blockquote>
<pre>&lt;Connector port="8009" enableLookups="false" debug="0" redirectPort="8443"
           protocol="AJP/1.3" serverAdresse="127.0.0.1" /&gt;</pre>
</blockquote>
<p>Il suffit alors de redémarrer Tomcat et Apache. Lorsque vous accédez à la page : http://demo.mkhelif.fr/ vous arrivez sur la page d&#8217;accueil de Tomcat.</p>
<h4>Tomcat inclus dans GlassFish</h4>
<p>Lorsque Tomcat est inclus dans un serveur d&#8217;applications (comme GlassFish) il faut ajouter certaines librairies au serveur :</p>
<blockquote>
<pre>commons-logging.jar
commons-modeler.jar
commons-digester.jar</pre>
</blockquote>
<p>Ces librairies peuvent être téléchargées sur le site de Jakarta.</p>
<p>Il faut ensuite copier la librairie permettant d&#8217;activer le connecteur AJP pour Tomcat. Cette librairie est fournie avec Tomcat&#8230; il faut donc télécharger Tomcat&#8230; la version inclue avec GlassFish ne contient pas cette librairie.</p>
<pre><span style="color: #333333;">Tomcat 5.x et antérieur :</span>
&lt;Tomcat&gt;/server/lib/tomcat-ajp.jar</pre>
<pre><span style="color: #333333;">Tomcat 6.x :</span>
&lt;Tomcat&gt;/lib/tomcat-ajp.jar</pre>
<p>Copier toutes ces librairies dans le répertoire : <em>&lt;GlassFish&gt;/lib/</em></p>
<p>Il faut redémarrer GlassFish et la passerelle entre Apache et GlassFish est activée.</p>
<h3>Pour suivre votre lecture</h3>
<ul class="related_post">
<li><a href="http://www.mkhelif.fr/2009/09/07/ruby-on-rails-dployer-une-application-sur-tomcat-avec-jruby.html" title="Ruby on Rails : d&eacute;ployer une application sur Tomcat avec JRuby">Ruby on Rails : d&eacute;ployer une application sur Tomcat avec JRuby</a></li>
<li><a href="http://www.mkhelif.fr/2010/01/14/gwt-2-0-les-nouvelles-fonctionnalits.html" title="GWT 2.0 : les nouvelles fonctionnalités">GWT 2.0 : les nouvelles fonctionnalités</a></li>
<li><a href="http://www.mkhelif.fr/2009/11/19/chrome-os-premire-prsentation.html" title="Chrome OS : premi&egrave;re pr&eacute;sentation">Chrome OS : premi&egrave;re pr&eacute;sentation</a></li>
<li><a href="http://www.mkhelif.fr/2009/08/21/tests-en-charge-dec2-gae-et-azure.html" title="Tests en charge d&rsquo;EC2, GAE et Azure">Tests en charge d&rsquo;EC2, GAE et Azure</a></li>
<li><a href="http://www.mkhelif.fr/2009/04/08/google-gwt-version-16-et-consorts.html" title="Google : GWT version 1.6 et consorts">Google : GWT version 1.6 et consorts</a></li>
<li><a href="http://www.mkhelif.fr/2008/06/23/apache2-systeme-de-blacklist.html" title="Apache2 : système de blacklist">Apache2 : système de blacklist</a></li>
<li><a href="http://www.mkhelif.fr/2008/05/23/serveur-de-mails-multi-domaines.html" title="Serveur de mails multi-domaines">Serveur de mails multi-domaines</a></li>
</ul>
       ]]></content:encoded>
			<wfw:commentRss>http://www.mkhelif.fr/2008/06/18/passerelle-entre-apache-et-tomcat.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
