<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2frenchfull.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.clever-age.com/~d/styles/itemcontent.css"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:creativeCommons="http://backend.userland.com/creativeCommonsRssModule" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">

<channel xml:lang="fr">
	<title>Clever Garden, Clever Age, Clever Presence - 100% digital</title>
	<link>http://www.clever-age.com/</link>
	<description>1/3 de communication multi-canal
1/3 d'architecture technique
1/3 d'optimisation des dispositifs Web-Mobile
Pour une couverture de vos besoins sur la totalité de la chaîne digitale</description>
	<language>fr</language>
	<generator>SPIP - www.spip.net</generator>
	

	<image>
		<title>Clever Garden, Clever Age, Clever Presence - 100% digital</title>
		<url>http://www.clever-age.com/local/cache-vignettes/L144xH75/siteon0-2b16d.png</url>
		<link>http://www.clever-age.com/</link>
		<height>75</height>
		<width>144</width>
	</image>



<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.clever-age.com/Clever-Age-Blog" /><feedburner:info uri="clever-age-blog" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><creativeCommons:license>http://creativecommons.org/licenses/by-nc-sa/2.0/</creativeCommons:license><feedburner:feedFlare href="http://www.newsgator.com/ngs/subscriber/subext.aspx?url=http%3A%2F%2Ffeeds.clever-age.com%2FClever-Age-Blog" src="http://www.newsgator.com/images/ngsub1.gif">Subscribe with NewsGator</feedburner:feedFlare><feedburner:feedFlare href="http://www.bloglines.com/sub/http://feeds.clever-age.com/Clever-Age-Blog" src="http://www.bloglines.com/images/sub_modern11.gif">Subscribe with Bloglines</feedburner:feedFlare><feedburner:feedFlare href="http://www.netvibes.com/subscribe.php?url=http%3A%2F%2Ffeeds.clever-age.com%2FClever-Age-Blog" src="http://www.netvibes.com/img/add2netvibes.gif">Subscribe with Netvibes</feedburner:feedFlare><feedburner:feedFlare href="http://fusion.google.com/add?feedurl=http%3A%2F%2Ffeeds.clever-age.com%2FClever-Age-Blog" src="http://buttons.googlesyndication.com/fusion/add.gif">Subscribe with Google</feedburner:feedFlare><feedburner:feedFlare href="http://www.pageflakes.com/subscribe.aspx?url=http%3A%2F%2Ffeeds.clever-age.com%2FClever-Age-Blog" src="http://www.pageflakes.com/ImageFile.ashx?instanceId=Static_4&amp;fileName=ATP_blu_91x17.gif">Subscribe with Pageflakes</feedburner:feedFlare><feedburner:feedFlare href="http://add.my.yahoo.com/content?lg=fr&amp;url=http%3A%2F%2Ffeeds.clever-age.com%2FClever-Age-Blog" src="http://us.i1.yimg.com/us.yimg.com/i/us/my/bn/intatm_fr_1.gif">Subscribe with Mon Yahoo!</feedburner:feedFlare><item xml:lang="fr">
		<title>La sécurité au travers de l'OWASP</title>
		<link>http://feeds.clever-age.com/~r/Clever-Age-Blog/~3/O8dQsW2zGaA/la-securite-au-travers-de-l-owasp.html</link>
		<guid isPermaLink="false">http://www.clever-age.com/veille/blog/la-securite-au-travers-de-l-owasp.html</guid>
		<dc:date>2012-05-10T08:57:32Z</dc:date>
		<dc:format>text/html</dc:format>
		<dc:language>fr</dc:language>
		<dc:creator>Mickael Franc</dc:creator>


		<dc:subject>Conseil</dc:subject>
		<dc:subject>Développement spécifique</dc:subject>
		<dc:subject>Développement</dc:subject>
		<dc:subject>Serveurs d'applications</dc:subject>
		<dc:subject>Lyon</dc:subject>
		<dc:subject>Clever Age</dc:subject>
		<dc:subject>Clever Presence</dc:subject>
		<dc:subject>Sécurité des systèmes d'information</dc:subject>
		<dc:subject>Sécurité</dc:subject>
		<dc:subject>OWASP</dc:subject>

		<description>&lt;p&gt;Détails sur le projet OWASP et introduction à la sécurité des systèmes d'informations&lt;/p&gt;

-
&lt;a href="http://www.clever-age.com/veille/blog/" rel="directory"&gt;Notre blog de veille&lt;/a&gt;

/ 
&lt;a href="http://www.clever-age.com/tags/conseil-8" rel="tag"&gt;Conseil&lt;/a&gt;, 
&lt;a href="http://www.clever-age.com/references-integration-reversible/developpement-specifique" rel="tag"&gt;Développement spécifique&lt;/a&gt;, 
&lt;a href="http://www.clever-age.com/tags/developpement" rel="tag"&gt;Développement&lt;/a&gt;, 
&lt;a href="http://www.clever-age.com/tags/serveurs-d-applications" rel="tag"&gt;Serveurs d'applications&lt;/a&gt;, 
&lt;a href="http://www.clever-age.com/agence/lyon-80" rel="tag"&gt;Lyon&lt;/a&gt;, 
&lt;a href="http://www.clever-age.com/les-marques/clever-age,178" rel="tag"&gt;Clever Age&lt;/a&gt;, 
&lt;a href="http://www.clever-age.com/les-marques/clever-presence,179" rel="tag"&gt;Clever Presence&lt;/a&gt;, 
&lt;a href="http://www.clever-age.com/securite/securite-des-systemes-d-information" rel="tag"&gt;Sécurité des systèmes d'information&lt;/a&gt;, 
&lt;a href="http://www.clever-age.com/securite/securite-209" rel="tag"&gt;Sécurité&lt;/a&gt;, 
&lt;a href="http://www.clever-age.com/securite/owasp" rel="tag"&gt;OWASP&lt;/a&gt;

		</description>


 <content:encoded>&lt;div class='rss_chapo'&gt;&lt;p&gt;La qualité d'une application web est intrinsèquement liée à la sécurité de cette dernière, c'est pourquoi nous avons décidé de vous faire une introduction sur l'OWASP et quelques concepts sur la sécurité applicative.&lt;/p&gt;&lt;/div&gt;
		&lt;div class='rss_texte'&gt;&lt;h3 class='h3 spip'&gt;1. Définition&lt;/h3&gt;
&lt;p&gt;	&lt;span class='spip_document_1923 spip_documents spip_documents_left' style='float:left; width:150px;'&gt;
&lt;img src='http://www.clever-age.com/local/cache-vignettes/L150xH150/owasp_logo_150_150-26ad4.jpg' width='150' height='150' alt="Logo officiel du projet OWASP" title="Logo officiel du projet OWASP" style='height:150px;width:150px;' /&gt;&lt;/span&gt;OWASP (Open Web Application Security Project) est un guide de sécurisation des applications web, c'est un "ouvrage" de référence des bonnes/mauvaises pratiques de développement, d'une base sérieuse en termes de statistiques, et d'un ensemble de ressources amenant à une base de réflexion sur la sécurité. Des outils sont aussi proposés pour effectuer un audit de sécurité.&lt;/p&gt; &lt;h3 class='h3 spip'&gt;2. Les projets de l'OWASP&lt;/h3&gt;
&lt;p&gt;De nombreux projets développés en interne sont proposés et disponibles librement sur le site officiel : &lt;a href="https://www.owasp.org/" class='spip_url spip_out' rel='nofollow external'&gt;https://www.owasp.org&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Ces projets permettent aussi bien de faire de la veille, comme le TopTen d'OWASP qui liste annuellement les failles les plus couramment utilisées par des utilisateurs malveillants.
Mais aussi des logiciels puissants, permettant de faire des audits de sécurité avancés sur n'importe quelle plateforme.&lt;/p&gt; &lt;p&gt;Sur le site d'OWASP est disponible un grand nombre d'articles détaillés sur des failles/vulnérabilités. Ces articles expliquent : le principe d'une faille, son impact, une ou plusieurs méthodes d'attaques, et un mécanisme de protection.&lt;/p&gt; &lt;p&gt;Le guide OWASP propose aussi des documents plus méthodologiques encadrant l'univers d'un RSSI (Responsable de la Sécurité des Systèmes d'Informations). Ces documents offrent une bonne pratique pour définir et qualifier les risques auxquels pourrait être confrontée une société, une application, etc... Afin de couvrir l'ensemble de l'environnement (humain et applicatif) pour ensuite manager les équipes sur les projets.&lt;/p&gt; &lt;p&gt;Voici une liste (non exhaustive) de projets populaires, ainsi qu'une description succincte :&lt;/p&gt; &lt;p&gt;&lt;strong&gt;- Top Ten : &lt;/strong&gt; Liste des failles les plus couramment utilisées par des utilisateurs malintentionnés sur internet. Ce document est accompagné d'une qualification des menaces listées et d'une explication sur l'exploitation.&lt;/p&gt; &lt;p&gt;Cf : &lt;a href="https://www.owasp.org/index.php/Category:OWASP_Top_Ten_Project#tab=2010_Translation_Efforts" class='spip_out' rel='external'&gt;https://www.owasp.org/index.php/Category:OWASP_Top_Ten_Project#tab=2010_Translation_Efforts&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Voici le Top Ten de l'année 2010 (vulnérabilités listées de la plus commune à la moins exploitée) :&lt;/p&gt; &lt;ol class="spip"&gt;&lt;li&gt; Injections&lt;/li&gt;&lt;li&gt; Cross-Site Scripting (XSS) =&gt; Script corrompu à travers un site&lt;/li&gt;&lt;li&gt; Broken Authentication and Session Management =&gt; Violation de Gestion d'Authentification et de Session&lt;/li&gt;&lt;li&gt; Insecure Direct Object References =&gt; Références directes non sécurisées à un Objet&lt;/li&gt;&lt;li&gt; Cross-Site Request Forgery (CSRF) =&gt; Falsification de requête intersites&lt;/li&gt;&lt;li&gt; Security Misconfiguration =&gt; Mauvaise configuration de sécurité&lt;/li&gt;&lt;li&gt; Insecure Cryptographic Storage =&gt; Stockage cryptographique non sécurisé&lt;/li&gt;&lt;li&gt; Failure to Restrict URL Access =&gt; Manque de Restriction d'accès au niveau des URLs&lt;/li&gt;&lt;li&gt; Insufficient Transport Layer Protection =&gt; Protection insuffisante de la couche Transport&lt;/li&gt;&lt;li&gt; Unvalidated Redirects and Forwards =&gt; Redirections et Renvois non validés&lt;/li&gt;&lt;/ol&gt;
&lt;p&gt;Ce top 10 évolue dans le temps, certaines failles (comme les problèmes de sécurité dus à une mauvaise configuration) n'étaient plus dans le classement entre 2004 et 2010. Cet exemple montre qu'il y a de nombreux autres points à vérifier, qui ne sont pas listés dans ce classement. Même si vous pensez avoir sécurisé votre application web, vous pouvez déjà être vulnérable face à quelque chose auquel personne n'a jamais pensé auparavant. Certaines vulnérabilités dans les articles d'OWASP sont non-applicables au web, mais peuvent servir de base à une réflexion sur la sécurité et la création d'un référentiel de sécurité.&lt;/p&gt; &lt;p&gt;Il faut voir cette liste comme un référentiel du minimum à sécuriser.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;- Webscarab :&lt;/strong&gt; Un outil d'audit de sécurité. Il s'agit d'un proxy disposant d'une interface graphique qui, une fois relié à un navigateur, intercepte les requêtes/réponses HTTP entre le client et le serveur, ce qui permet de les analyser, de forger des requêtes soi-même, de tenter différentes injections, etc... Le proxy est intercalé entre le client et le serveur à la façon d'une attaque « Man in the middle ». Webscarab dispose de nombreux plugins permettant d'augmenter le nombre de fonctionnalités offert par l'outil (WebServices, Spider, XSS/CRLF, SessionID Analysis, etc...).&lt;/p&gt; &lt;p&gt;Cf : &lt;a href="https://www.owasp.org/index.php/Category:OWASP_WebScarab_Project" class='spip_out' rel='external'&gt;https://www.owasp.org/index.php/Category:OWASP_WebScarab_Project&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Remarque : Par défaut il est livré avec uniquement l'intercepteur de requête, la version "self-contained" est livrée avec tous les plugins. Le gros défaut de cette solution est qu'elle n'est pas régulièrement mise à jour (dernière en date : 04 Mai 2007) et n'intègre pas les dernières vulnérabilités découvertes.&lt;/p&gt; &lt;p&gt;L'intérêt de cette solution : avoir un outil qui facilite un audit applicatif. Ce logiciel ne permettra pas d'avoir une application ayant une sécurité élevée s'il est utilisé seul. D'autres tests seront à faire pour accroitre la sécurité de votre application.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;- Webgoat :&lt;/strong&gt; Il s'agit cette fois d'une application web volontairement non sécurisée. Elle est livrée avec un tutoriel et des exercices pratiques. Une fois de plus, OWASP met en avant l'aspect pédagogique de ces solutions, ayant pour but d'instruire l'intéressé sur les différentes techniques d'exploitation de vulnérabilités. L'intérêt est de former le développeur à produire un code sûr.&lt;/p&gt; &lt;p&gt;Cf : &lt;a href="https://www.owasp.org/index.php/Category:OWASP_WebGoat_Project" class='spip_out' rel='external'&gt;https://www.owasp.org/index.php/Category:OWASP_WebGoat_Project&lt;/a&gt;&lt;/p&gt; &lt;p&gt;D'autres projets intéressants et utiles pour le milieu de l'entreprise existent, mais ils feront sûrement l'objet d'un prochain article plus détaillé.&lt;/p&gt; &lt;h3 class='h3 spip'&gt;3. Orienter les développements vers une démarche défensive&lt;/h3&gt;
&lt;p&gt;	Chaque projet est différent et comporte un seuil de criticité propre à lui. C'est pourquoi il faut qualifier chaque risque associé à ce dernier.&lt;/p&gt; &lt;p&gt;Une méthode consiste à créer un tableau croisé entre les vecteurs d'attaques (XSS, CSRF, etc…) et les risques résultants de ces attaques (défiguration du site, corruption du contenu de la base de données, perte de données confidentielles, interruption totale/partielle de service, etc..).&lt;/p&gt; &lt;p&gt;Chaque projet devrait avoir son propre référentiel de sécurité (Base OWASP + Spécificités du projet + Risque acceptable ou non en fonction du projet).&lt;/p&gt; &lt;p&gt;&lt;span class='spip_document_1920 spip_documents spip_documents_center'&gt;
&lt;img src='http://www.clever-age.com/local/cache-vignettes/L500xH92/tab_qualification_risques-05185.png' width='500' height='92' alt="" style='height:92px;width:500px;' /&gt;&lt;/span&gt;&lt;/p&gt; &lt;p&gt;Une fois les vecteurs d'attaques définis, on est en mesure de prioriser l'implémentation de correctifs de sécurité.&lt;/p&gt; &lt;h3 class='h3 spip'&gt;Conclusion&lt;/h3&gt;
&lt;p&gt;	Le guide OWASP regorge d'informations utiles pour tout niveau de compétence. Le développeur non initié au domaine de la sécurité verra cet univers démystifié, l'expert y verra une base de connaissances sur laquelle il pourra se reposer. Les outils proposés sont efficaces même si certains ne sont pas assez maintenus ou accumulent un retard par rapport à d'autres solutions Open-source.
L'OWASP reste toutefois un référentiel soutenu par le milieu professionnel et amène à une réflexion intellectuelle sur le domaine de la sécurité, auquel chaque développeur devrait être sensibilisé.&lt;/p&gt;&lt;/div&gt;
		
		</content:encoded>


		

	<feedburner:origLink>http://www.clever-age.com/veille/blog/la-securite-au-travers-de-l-owasp.html</feedburner:origLink></item>
<item xml:lang="fr">
		<title>Sud Web 2012 dans un mois : et dire qu'il y en a qui n'ont pas encore pris leur place !</title>
		<link>http://feeds.clever-age.com/~r/Clever-Age-Blog/~3/aI3isnusX3g/sud-web-2012-dans-un-mois-et-dire-qu-il-y-en-a-qui-n-ont-pas-encore-pris-leur-place.html</link>
		<guid isPermaLink="false">http://www.clever-age.com/veille/blog/sud-web-2012-dans-un-mois-et-dire-qu-il-y-en-a-qui-n-ont-pas-encore-pris-leur-place.html</guid>
		<dc:date>2012-04-25T09:48:22Z</dc:date>
		<dc:format>text/html</dc:format>
		<dc:language>fr</dc:language>
		<dc:creator>Nicolas Hoizey</dc:creator>



		<description>&lt;p&gt;Chez Clever Age, nous sommes toujours excités à l'approche de conférences qui défendent la qualité web telle que nous la défendons aussi. Nous serons donc présents à Sud Web 2012, le 25-26 mai à Toulouse, rejoignez-nous !&lt;/p&gt;

-
&lt;a href="http://www.clever-age.com/veille/blog/" rel="directory"&gt;Notre blog de veille&lt;/a&gt;


		</description>


 <content:encoded>&lt;div class='rss_chapo'&gt;&lt;p&gt;Chez Clever Age, nous sommes toujours excités à l'approche de conférences qui défendent la qualité web telle que nous la défendons aussi !&lt;/p&gt;&lt;/div&gt;
		&lt;div class='rss_texte'&gt;&lt;p&gt;&lt;span class='spip_document_1924 spip_documents spip_documents_left' style='float:left; width:170px;'&gt;
&lt;a href="http://sudweb.fr/2012/" class="spip_out"&gt;&lt;img src='http://www.clever-age.com/local/cache-vignettes/L170xH120/logo-fbb58.png' width='170' height='120' alt="" style='height:120px;width:170px;' /&gt;&lt;/a&gt;&lt;/span&gt;Du coup, &lt;strong&gt;à un mois de la deuxième édition&lt;/strong&gt; de &lt;a href="http://sudweb.fr/2012/" class='spip_out' rel='external'&gt;Sud Web&lt;/a&gt;, dont &lt;a href="http://www.clever-age.com/veille/blog/sud-web-et-webux-le-web-d-aujourd-hui-a-la-portee-du-soleil.html" class='spip_in'&gt;la première&lt;/a&gt; nous avait laissé des étoiles dans les yeux, l'excitation monte aussi chez nous de retrouver nos confrères, d'échanger et de construire tous ensemble sur les bonnes pratiques de la qualité Web.&lt;/p&gt; &lt;p&gt;D'autant plus que cette année, en plus de la traditionnelle journée de conférences du vendredi (dont &lt;a href="http://sudweb.fr/2012/schedule/conferences/" class='spip_out' rel='external'&gt;le programme&lt;/a&gt; est plus qu'alléchant), &lt;strong&gt;les participants se retrouveront le samedi pour un "&lt;a href="http://sudweb.fr/2012/schedule/elaboratoire/" class='spip_out' rel='external'&gt;élaboratoire&lt;/a&gt;" où tout le monde pourra proposer des sujets sur lesquels élaborer des solutions&lt;/strong&gt;, construire ensemble les outils qui améliorent le web de demain. Nulle doute que les Clever Agiens présents prendront une part active dans cette initiative originale et diantrement constructive !&lt;/p&gt; &lt;p&gt;Cette année, nous serons présents &lt;strong&gt;au coeur des participants&lt;/strong&gt;, mais aussi &lt;strong&gt;dans le staff&lt;/strong&gt; comme l'année dernière par l'action bénévole d'un Clever Agien motivé. Mais aussi, fait original : notre &lt;a href="https://twitter.com/jeremiepat" class='spip_out' rel='external'&gt;Jérémie Patonnier&lt;/a&gt; (qui y était orateur l'année dernière) y sera présent &lt;strong&gt;pour présenter les couleurs du sponsor Mozilla&lt;/strong&gt;, dans la communauté duquel il est très actif !&lt;/p&gt; &lt;p&gt;Bref, rejoignez-nous y gaiement &lt;strong&gt;les 25 et 26 mai à Toulouse, et comprenez et construisez le Web de demain&lt;/strong&gt; avec nous et les autres participants de Sud Web 2012 !&lt;/p&gt; &lt;p&gt;Et bien sûr, si par le plus pur des hasards vous n'avez pas encore de ticket, c'est par là ; dépêchez-vous, &lt;strong&gt;ça ferme le 13 mai !&lt;/strong&gt; —&gt; &lt;a href="http://sudweb.fr/2012/inscription/" class='spip_url spip_out' rel='nofollow external'&gt;http://sudweb.fr/2012/inscription/&lt;/a&gt;&lt;/p&gt;&lt;/div&gt;
		
		</content:encoded>


		

	<feedburner:origLink>http://www.clever-age.com/veille/blog/sud-web-2012-dans-un-mois-et-dire-qu-il-y-en-a-qui-n-ont-pas-encore-pris-leur-place.html</feedburner:origLink></item>
<item xml:lang="fr">
		<title>Le mouvement DevOps</title>
		<link>http://feeds.clever-age.com/~r/Clever-Age-Blog/~3/JWJaGMNc-BY/le-mouvement-devops.html</link>
		<guid isPermaLink="false">http://www.clever-age.com/veille/blog/le-mouvement-devops.html</guid>
		<dc:date>2012-04-17T11:11:11Z</dc:date>
		<dc:format>text/html</dc:format>
		<dc:language>fr</dc:language>
		<dc:creator>Gwenael Perier</dc:creator>


		<dc:subject>Développement spécifique</dc:subject>
		<dc:subject>Paris</dc:subject>
		<dc:subject>Architecture de production</dc:subject>

		<description>
&lt;p&gt;De manière générale DevOps est un mouvement ayant pour objectif l'alignement du système d'information sur les besoins de l'entreprise (en se concentrant plus essentiellement sur la partie développement / opérations). "DevOps" est un terme issu de la contraction des mots anglais "development" (développement) et "operations" (exploitation). " . Dans cet article je vais vous présenter ma vision de DevOps. Elle n'est sûrement pas complète mais elle permettra je l'espère de démystifier le terme et d'en (...)&lt;/p&gt;


-
&lt;a href="http://www.clever-age.com/veille/blog/" rel="directory"&gt;Notre blog de veille&lt;/a&gt;

/ 
&lt;a href="http://www.clever-age.com/references-integration-reversible/developpement-specifique" rel="tag"&gt;Développement spécifique&lt;/a&gt;, 
&lt;a href="http://www.clever-age.com/agence/paris,79" rel="tag"&gt;Paris&lt;/a&gt;, 
&lt;a href="http://www.clever-age.com/conseil-conseil-dsi/architecture-de-production" rel="tag"&gt;Architecture de production&lt;/a&gt;

		</description>


 <content:encoded>&lt;div class='rss_chapo'&gt;&lt;p&gt;De manière générale DevOps est un mouvement ayant pour objectif l'alignement du système d'information sur les besoins de l'entreprise (en se concentrant plus essentiellement sur la partie développement / opérations).&lt;/p&gt; &lt;p&gt;"DevOps" est un terme issu de la contraction des mots anglais "development" (développement) et "operations" (exploitation). " [&lt;a href='#nb1' class='spip_note' rel='footnote' title='Citation du site http://devops.fr/' id='nh1'&gt;1&lt;/a&gt;].&lt;/p&gt; &lt;p&gt;Dans cet article je vais vous présenter ma vision de DevOps. Elle n'est sûrement pas complète mais elle permettra je l'espère de démystifier le terme et d'en comprendre le sens principal.&lt;/p&gt;&lt;/div&gt;
		&lt;div class='rss_texte'&gt;&lt;h3 class='h3 spip'&gt;Définition du mouvement DevOps&lt;/h3&gt;
&lt;p&gt;&lt;span class='spip_document_1887 spip_documents spip_documents_center'&gt;
&lt;img src='http://www.clever-age.com/local/cache-vignettes/L299xH240/devops-a4ba3.png' width='299' height='240' alt="" style='height:240px;width:299px;' /&gt;&lt;/span&gt;&lt;/p&gt; &lt;p&gt;En regroupant les différents termes de plusieurs définitions données sur le web, voici ce que l'on obtient :&lt;/p&gt; &lt;p&gt;DevOps est :&lt;/p&gt; &lt;ul class="spip"&gt;&lt;li&gt; un mouvement.&lt;/li&gt;&lt;li&gt;  une culture.&lt;/li&gt;&lt;li&gt;  un processus agile sur l'ensemble de la chaîne (du développement à la mise en production).&lt;/li&gt;&lt;li&gt;  une nouvelle approche technique.&lt;/li&gt;&lt;li&gt;  une autre approche humaine.&lt;/li&gt;&lt;li&gt;  une réponse à de nouvelles problématiques comme le  déploiement massif, le  déploiement régulier.&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;Pour résumer on peut dire aussi que le mouvement est également pour 30% une affaire d'outils, de code et de processus métiers et pour le reste
(70%) une affaire de culture et de communication.&lt;/p&gt; &lt;p&gt;Bon, ok. DevOps est un mouvement, une culture, un état d'esprit, voire même une religion pour certains, mais en pratique, qu'est ce que c'est ? Nous y reviendrons plus loin dans cet article. Pour comprendre DevOps, et découvrir ses méthodes, processus, et les différents outils utilisés, il faut tout d'abord s'intéresser à son origine. Pourquoi ce mouvement est-il apparu ?&lt;/p&gt; &lt;h3 class='h3 spip'&gt;Pourquoi DevOps ?&lt;/h3&gt;
&lt;p&gt;De nombreuses entreprises (essentiellement les plus grandes) divisent le développement (ceux qui pensent et écrivent le code) et l'administration système (ceux qui déploient et exploitent les applications) entre différents départements / services. Dans ce type d'organisation, les développeurs ne sont pas souvent préoccupés par l'impact de leur code sur la production mais plus par la livraison fréquente de nouvelles fonctionnalités. À l'inverse, le service des opérations de production est plutôt concentré sur la stabilisation des services et de l'architecture ainsi que sur la performance des instances actuelles.&lt;/p&gt; &lt;p&gt;La mise en production est pour beaucoup d'entreprises une étape lourde, compliquée à cause des différentes procédures établies. Les équipes en charge refusent souvent le changement rapide du code (nombreuses livraisons / déploiements). Mais plus il y a de nouvelles fonctionnalités présentes, plus le temps pour la mise en production peut devenir important, plus il y a de chance d'avoir des remontées de bugs bloquants, plus il faudra de tests post-production, etc .... Potentiellement cela implique du temps d'indisponibilité pour l'application, du stress pour les équipes et bien entendu de l'argent perdu.&lt;/p&gt; &lt;p&gt;A l'inverse des équipes de production, les développeurs développent leur code sans la contrainte d'un environnement dit 'de production' (plusieurs serveurs, gestion de flux réseaux complexes, configurations différentes, systèmes d'exploitation différents). La plupart du temps, un développeur installe son propre serveur web avec sa configuration habituelle, sa base de donnée habituelle sur son système d'exploitation préféré, etc... Que celui qui n'a jamais eu le problème du '&lt;i&gt;ça marche sur ma machine&lt;/i&gt;' (mais bien entendu pas sur le serveur de recette ou de production) me jette le premier pingouin :).&lt;/p&gt; &lt;p&gt;&lt;span class='spip_document_1888 spip_documents spip_documents_right' style='float:right; width:200px;'&gt;
&lt;img src='http://www.clever-age.com/local/cache-vignettes/L200xH193/works-c5402.png' width='200' height='193' alt="" style='height:193px;width:200px;' /&gt;&lt;/span&gt;&lt;/p&gt; &lt;p&gt;Même au sein des équipes de développement le problème peut être rencontré. Installation d'Oracle avec une équipe de développeurs sous Mac OSX, Ubuntu, et Windows. Résultat : même code, mais pas un des développeurs n'a réussi à faire fonctionner l'application complète de la même manière !!!&lt;/p&gt; &lt;p&gt;Le mouvement DevOps tend à essayer de fusionner ces deux mondes que sont l'exploitation et le développement. Chaque monde va apprendre de l'autre et surtout essayer de se comprendre :&lt;/p&gt; &lt;ol class="spip"&gt;&lt;li&gt; En facilitant la communication entre les deux mondes (utilisation de méthodes agiles, intercommunication).&lt;/li&gt;&lt;li&gt; En industrialisant les processus de livraison (intégration continue, déploiement continu, etc ...).&lt;/li&gt;&lt;li&gt; En utilisant des outils (Puppet, Chef, Vagrant , fabric, etc ...) pour l'industrialisation de l'infrastructure.&lt;/li&gt;&lt;/ol&gt;
&lt;h3 class='h3 spip'&gt;Comment être DevOps ;) &lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Communication, processus et méthodes agiles&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;&lt;span class='spip_document_1890 spip_documents spip_documents_center'&gt;
&lt;img src='http://www.clever-age.com/local/cache-vignettes/L320xH201/stockvault-circuit-board115807-d49ae.jpg' width='320' height='201' alt="" style='height:201px;width:320px;' /&gt;&lt;/span&gt;&lt;/p&gt; &lt;p&gt;Les équipes de développement ont besoin de communiquer avec les équipes opérationnelles. Elles doivent pouvoir adapter rapidement leur environnement de développement et les changements d'architecture sur leur code. De la même manière, lorsqu'une nouvelle fonctionnalité demande un changement d'architecture ou l'installation d'un nouvel environnement et/ou serveur, les équipes opérationnelles se doivent d'être de bon conseil sur la configuration et l'installation. Elles auront souvent une vision plus juste que les développeurs.&lt;/p&gt; &lt;p&gt;Les équipes opérationnelles ont besoin de communiquer avec les équipes de développement qui ont des connaissances sur des outils, des processus qui peuvent aider à rendre les environnements plus facile à gérer, plus efficace et plus propre. Elles ont également besoin de comprendre le besoin applicatif et fonctionnel des développeurs pour permettre une meilleure optimisation des ressources, un meilleur monitoring et une meilleure remontée d'erreur.&lt;/p&gt; &lt;p&gt;Les méthodes agiles ne sont pas réservées uniquement aux équipes de développement mais peuvent aussi être appliquées sur toute la chaîne IT. Les méthodologies de développement Agile comme Kanban et Scrum peuvent révolutionner les pratiques opérationnelles de la même manière qu'elles ont changé la façon dont les développements s'opèrent.&lt;/p&gt; &lt;p&gt;Prenons l'exemple de l'analyse des problèmes en production qui nécessite une coopération entre les équipes d'exploitation et celles de développement comme la gestion des logs et des exceptions, des outils de concentration et d'analyse de logs. DevOps permet avec les méthodes agiles de gérer sous forme de points les problèmes rencontrés et le partage des informations, des solutions facilitent la résolution des dits problèmes.&lt;/p&gt; &lt;p&gt;L'organisation, bien qu'étant le point le plus complexe à aborder pour l'adoption d'une culture DevOps, n'est pas impossible à mettre en place, même pour de grandes entreprises : Amazon a adopté ce concept, et une devise en est alors ressortie : &lt;strong&gt;« You build it, you run it »&lt;/strong&gt;. Le point essentiel pour la communication est de s'assurer que les objectifs soient communs aux différentes parties et se dirigent vers une amélioration de la disponibilité, de la performance et de l'évolutivité des applications.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Industrialisation des processus de livraison&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;&lt;span class='spip_document_1889 spip_documents spip_documents_center'&gt;
&lt;img src='http://www.clever-age.com/local/cache-vignettes/L320xH210/stockvault-air-pollution124893-5dc80.jpg' width='320' height='210' alt="" style='height:210px;width:320px;' /&gt;&lt;/span&gt;&lt;/p&gt; &lt;p&gt;Beaucoup trop d'organisations restent encore sur le cycle : Développement long -&gt; Recette longue -&gt; Livraison douloureuse -&gt; Bugs -&gt; Recettes correctives -&gt; Redéploiement de patch (ouf..) soit par méconnaissance , soit par peur du changement ou par le coût de celui-ci. Ce type de projet avec un planning de livraison à plusieurs mois regroupe souvent un lots de fonctionnalités pour éviter une multitude de déploiement (souvent dûe à la frilosité de la mise en production). On se retrouve alors avec des allers retours dans tous les sens et des attentes dans chaque équipe, ce qui peut créer des groupes (eux / nous) et certaines frustrations (exemple : ça fait deux mois qu'on a fini de développer cette fonctionnalité mais elle n'est toujours pas testée ni livrée en production).&lt;/p&gt; &lt;p&gt;Prenons le postulat de base : ''une portion de code qui n'est pas livrée n'apporte aucune valeur ajoutée à l'entreprise ou à l'application''.
Plus les déploiements sont fréquents, plus le processus est maitrisé. Il y a moins de code à livrer, donc moins de risque d'erreur, moins d'impact lors d'un rollback / retour-arrière. De plus, une application avec laquelle on peut rapidement livrer des nouvelles fonctionnalités ou des correctifs de bugs aura un meilleur retour des utilisateurs (plus de réactivité) et donc une meilleure image. C'est là qu'intervient la méthodologie du déploiement continu permettant le déploiement du code de façon rapide et efficace. Pour arriver à une automatisation complète ou quasi-complète de la chaîne de production, plusieurs étapes sont nécessaires :&lt;/p&gt; &lt;p&gt;&lt;strong&gt;« Continuous Integration »&lt;/strong&gt; est le processus d'intégration (génération de code, compilation, exécution des tests unitaires, fonctionnels, ..) à chaque changement d'environnement (source code, os...)&lt;/p&gt; &lt;p&gt;C'est une très bonne pratique de développement qui consiste à utiliser le &lt;strong&gt;« développement piloté par les tests (Test driven Development, TDD) »&lt;/strong&gt; ou à aller encore plus loin en utilisant le ''développement piloté par les comportements'' (Behavior Driven Development, BDD) pour permettre une couverture améliorée du code et du fonctionnement de l'application. Ces tests sont ensuite exécutés par le serveur d'intégration à chaque évolution de code ou changement de périmètre fonctionnel. Le contrôle et la gestion des résultats (tests, fiabilité, analyse du code) sont à la charge du serveur d'intégration.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;« Continuous Delivery »&lt;/strong&gt; est l'étape suivante et caractérise la possibilité de déployer ses applications à tout moment.&lt;/p&gt; &lt;p&gt;Cette étape est très importante et est dépendante des résultats de l'intégration, si toutes les contraintes sont au vert, le déploiement peut se faire de manière automatisée sur l'environnement cible (recette, pré-production, production).&lt;/p&gt; &lt;p&gt;&lt;strong&gt;« Continuous Deployment »&lt;/strong&gt; est l'ensemble de ces processus et méthodologies permettant le déploiement en continu en production.&lt;/p&gt; &lt;p&gt;Malheureusement, la démarche de déploiement continu est loin d'être simple à mettre en œuvre, car dépendante de tous les acteurs du système d'information de l'entreprise.&lt;/p&gt; &lt;h3 class='h3 spip'&gt;Quelques outils DevOps&lt;/h3&gt;
&lt;p&gt;&lt;span class='spip_document_1891 spip_documents spip_documents_center'&gt;
&lt;img src='http://www.clever-age.com/local/cache-vignettes/L320xH213/stockvault-tool-collection100060-c610e.jpg' width='320' height='213' alt="" style='height:213px;width:320px;' /&gt;&lt;/span&gt;&lt;/p&gt; &lt;p&gt;Les outils jouent un rôle majeur pour industrialiser les processus et la gestion des architectures dans le mouvement DevOps. Voici donc quelques outils (la liste est loin d'être exhaustive) qui vous permettront de vous familiariser avec tous les concepts abordés et qui à mon sens représentent bien le mouvement DevOps :&lt;/p&gt; &lt;ul class="spip"&gt;&lt;li&gt; &lt;a href="https://github.com/capistrano/capistrano/wiki/Documentation-v2.x" class='spip_out' rel='external'&gt;Capistrano&lt;/a&gt; : outil open source pour exécuter des scripts sur plusieurs serveurs, son utilisation principale est le déploiement d'applications web. Il automatise le processus de déploiement d'une nouvelle version d'une application sur un ou plusieurs serveurs web. &lt;/li&gt;&lt;li&gt; &lt;a href="http://www.liquibase.org/" class='spip_out' rel='external'&gt;Liquibase&lt;/a&gt; est une librairie open source (Apache 2.0 Licensed) pour versionner et gérer les changements de schéma de base de données.&lt;/li&gt;&lt;li&gt; &lt;a href="http://jenkins-ci.org/" class='spip_out' rel='external'&gt;Jenkins&lt;/a&gt; est une application d'intégration continue qui monitore l'exécution de jobs répétés, comme les builds d'un logiciel ou des tâches automatiques.&lt;/li&gt;&lt;li&gt; &lt;a href="http://www.virtualbox.org/" class='spip_out' rel='external'&gt;VirtualBox&lt;/a&gt; est une solution permettant de monter rapidement des 'Virtuals Machine'.&lt;/li&gt;&lt;li&gt; &lt;a href="http://vagrantup.com/" class='spip_out' rel='external'&gt;Vagrant&lt;/a&gt; est un outil pour construire des VM opérables en VirtualBox via scripting.&lt;/li&gt;&lt;li&gt; &lt;a href="http://puppetlabs.com/" class='spip_out' rel='external'&gt;Puppet&lt;/a&gt;/ &lt;a href="http://www.opscode.com/chef/" class='spip_out' rel='external'&gt;chef&lt;/a&gt; permet la gestion de configurations systèmes dynamiques.&lt;/li&gt;&lt;/ul&gt;
&lt;h3 class='h3 spip'&gt;Conclusion &lt;/h3&gt;
&lt;p&gt;Définir le mouvement DevOps n'est pas chose facile. Par contre, définir ce que n'est pas DevOps l'est davantage.&lt;/p&gt; &lt;p&gt;Voici ce qu'il n'est pas :&lt;/p&gt; &lt;ul class="spip"&gt;&lt;li&gt; un produit ;&lt;/li&gt;&lt;li&gt; une personne ou une équipe ;&lt;/li&gt;&lt;li&gt; une recette miracle ;&lt;/li&gt;&lt;li&gt; une méthodologie stricte, au sens ou il n'y pas de règle prédéfinie mais plus une philosophie de développement.&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;Maintenant, à vous de vous faire votre propre opinion sur ce mouvement et ce qu'il représente pour vous.&lt;/p&gt; &lt;p&gt;Pour de plus amples informations sur le mouvement DevOps :&lt;/p&gt; &lt;ul class="spip"&gt;&lt;li&gt; &lt;a href="http://www.jedi.be/blog/2010/02/12/what-is-this-devops-thing-anyway/" class='spip_url spip_out' rel='nofollow external'&gt;http://www.jedi.be/blog/2010/02/12/...&lt;/a&gt;&lt;/li&gt;&lt;li&gt; &lt;a href="http://dev2ops.org/" class='spip_url spip_out' rel='nofollow external'&gt;http://dev2ops.org/&lt;/a&gt;&lt;/li&gt;&lt;li&gt; &lt;a href="http://agilesysadmin.net/" class='spip_url spip_out' rel='nofollow external'&gt;http://agilesysadmin.net/&lt;/a&gt;&lt;/li&gt;&lt;li&gt; &lt;a href="http://www.planetdevops.net/" class='spip_url spip_out' rel='nofollow external'&gt;http://www.planetdevops.net/&lt;/a&gt;&lt;/li&gt;&lt;li&gt; &lt;a href="http://fr.wikipedia.org/wiki/Devops" class='spip_url spip_out' rel='nofollow external'&gt;http://fr.wikipedia.org/wiki/Devops&lt;/a&gt;&lt;/li&gt;&lt;li&gt; &lt;a href="http://devops.fr/" class='spip_url spip_out' rel='nofollow external'&gt;http://devops.fr/&lt;/a&gt;&lt;/li&gt;&lt;li&gt; &lt;a href="http://parisdevops.fr/blog/" class='spip_url spip_out' rel='nofollow external'&gt;http://parisdevops.fr/blog/&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;
		&lt;hr /&gt;
		&lt;div class='rss_notes'&gt;&lt;p&gt;[&lt;a href='#nh1' id='nb1' class='spip_note' title='Notes 1' rev='footnote'&gt;1&lt;/a&gt;] Citation du site &lt;a href="http://devops.fr/" class='spip_url spip_out' rel='nofollow external'&gt;http://devops.fr/&lt;/a&gt;&lt;/p&gt;&lt;/div&gt;
		
		</content:encoded>


		

	<feedburner:origLink>http://www.clever-age.com/veille/blog/le-mouvement-devops.html</feedburner:origLink></item>
<item xml:lang="fr">
		<title>Dagon, un nouveau media pour le Web</title>
		<link>http://feeds.clever-age.com/~r/Clever-Age-Blog/~3/zWa_wO89uFc/dagon-un-nouveau-media-pour-le-web.html</link>
		<guid isPermaLink="false">http://www.clever-age.com/veille/blog/dagon-un-nouveau-media-pour-le-web.html</guid>
		<dc:date>2012-04-01T07:46:58Z</dc:date>
		<dc:format>text/html</dc:format>
		<dc:language>fr</dc:language>
		<dc:creator>Boris Schapira</dc:creator>



		<description>
&lt;p&gt;Nous avons vu, au cours des dernières années, le Web évoluer pour passer d'un simple répertoire documentaire au compagnon social qu'il est devenu aujourd'hui. Cette révolution n'a été possible que par le biais d'évolutions technologiques et d'un effort certain de standardisation qui ont permis d'ajouter de nombreux média (images, sons, vidéos) à ce qui était uniquement textuel. Aujourd'hui, le Web est prêt pour de nouvelles révolutions. Dagon est de celles-ci. Dagon est un « Grand Ancien », dieu poisson, (...)&lt;/p&gt;


-
&lt;a href="http://www.clever-age.com/veille/blog/" rel="directory"&gt;Notre blog de veille&lt;/a&gt;


		</description>


 <content:encoded>&lt;div class='rss_chapo'&gt;&lt;p&gt;Nous avons vu, au cours des dernières années, le Web évoluer pour passer d'un simple répertoire documentaire au compagnon social qu'il est devenu aujourd'hui. Cette révolution n'a été possible que par le biais d'évolutions technologiques et d'un effort certain de standardisation qui ont permis d'ajouter de nombreux média (images, sons, vidéos) à ce qui était uniquement textuel. Aujourd'hui, le Web est prêt pour de nouvelles révolutions. Dagon est de celles-ci.&lt;/p&gt;&lt;/div&gt;
		&lt;div class='rss_texte'&gt;&lt;p&gt;&lt;span class='spip_document_1911 spip_documents spip_documents_left' style='float:left; width:150px;'&gt;
&lt;img src='http://www.clever-age.com/local/cache-vignettes/L150xH226/hplovecraft2-bc0f1.png' width='150' height='226' alt="" style='height:226px;width:150px;' /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;blockquote class="spip"&gt;
&lt;p&gt;Dagon est un « Grand Ancien », dieu poisson, dans le mythe de Cthulhu de l'écrivain d'horreur américain H. P. Lovecraft.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;
&lt;a href="http://fr.wikipedia.org/wiki/Dagon_(Mythe_de_Cthulhu)" class='spip_out' rel='external'&gt;Wikipedia : Dagon (Mythe de Cthulhu)&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Voir aussi :&lt;/p&gt; &lt;ul class="spip"&gt;&lt;li&gt; William Fries -&gt; &lt;a href="http://www.imdb.fr/title/tt0106965/" class='spip_out' rel='external'&gt;Free Willy&lt;/a&gt;&lt;/li&gt;&lt;li&gt; Wandaleach -&gt; &lt;a href="http://www.imdb.fr/character/ch0008271/" class='spip_out' rel='external'&gt;Archi Leach (A Fish Called Wanda)&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;
&lt;h3 class='h3 spip'&gt;Bon 1er avril !&lt;/h3&gt;
&lt;p&gt;On connaissait déjà les &lt;a href="http://www.hdnumerique.com/actualite/articles/10774-apres-la-3d-les-odeurs-debarquent-dans-votre-home-cinema.html" class='spip_out' rel='external'&gt;enceintes olfactives Odoravision&lt;/a&gt;, qui permettent, moyennant d'importants moyens financiers, d'équiper une infrastructure Home Cinéma. Mais pour le Web, il n'existait pas d'équivalent.&lt;/p&gt; &lt;p&gt;Forte de ce constat, la société française Dagon, basée à Sopoins (34), vient de présenter un premier prototype de périphérique olfactif entièrement interfacé au Web. Le dispositif est pour l'instant assez complexe, puisqu'il impose l'installation de pilotes, d'un service local et d'un plugin disponible uniquement pour Firefox. Mais son potentiel est suffisament grand pour qu'il ait été retenu pour une présentation internationale à la &lt;a href="http://www.seomoz.org/mozcon" class='spip_out' rel='external'&gt;MozCon&lt;/a&gt; de Seattle le 25-27 juillet prochain.&lt;/p&gt; &lt;p&gt;Son inventeur, l'ingénieur William Fries, a tout d'abord imaginé son périphérique comme un pur produit d'accessibilité destiné à des populations privées d'un ou plusieurs sens. Devant l'intérêt suscité par ce qui n'était alors qu'un concept, il a contacté le W3C en septembre 2009 pour entamer avec eux un processus de normalisation (toujours à l'ébauche).&lt;/p&gt; &lt;p&gt;&lt;span class='spip_document_1899 spip_documents spip_documents_center'&gt;
&lt;img src='http://www.clever-age.com/local/cache-vignettes/L480xH360/img2_large-67c37.jpg' width='480' height='360' alt="" style='height:360px;width:480px;' /&gt;&lt;/span&gt;&lt;/p&gt; &lt;p&gt;Dagon se compose pour l'instant de cinq capsules diffusant chacune un parfum particulier sur 16 intensités :&lt;/p&gt; &lt;ul class="spip"&gt;&lt;li&gt; parfum montant, acide, aigu&lt;/li&gt;&lt;li&gt; parfum fruité&lt;/li&gt;&lt;li&gt; parfum boisé&lt;/li&gt;&lt;li&gt; parfum animal (musqué)&lt;/li&gt;&lt;li&gt; parfum terreux&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;Une odeur émise peut ainsi se décliner sur cinq coordonnées, chacune définie sur un encodage hexadécimal. Fort du million de possibilités offert par son périphérique, Eric Wandaleach imagine déjà des odeurs caractéristiques permettant de déterminer avec précision la présence d'un champ de recherche ou d'un formulaire à saisir.&lt;/p&gt; &lt;p&gt;D'autres débouchés sont évidemment bien moins nobles. On pensera immédiatement aux Marques, qui essaieront chacune de créer chez l'internaute une marque olfactive reconnaissable et patentée, ou aux publicitaires qui useront des parfums les plus chargés pour attirer l'attention sur leurs espaces publicitaires. "Nous avons pensé immédiatement aux dérives d'un tel système, c'est pourquoi nous nous sommes rapidement rapproché du W3C pour encourager une normalisation des plus rapides. Il est inconcevable pour nous qu'une marque puisse acheter un parfum et en interdire l'utilisation à d'autres" a confié le directeur de Dagon Eric Wandaleach à Jérémie Patonnier, notre expert en normalisation.&lt;/p&gt; &lt;dl class='spip_document_1900 spip_documents spip_documents_center'&gt;
&lt;dt&gt;&lt;a href="http://chart.apis.google.com/chart?chxl=0:%7CAcide%7CFruit%7CBois%7CAnimal%7CTerre&amp;chxr=0,-5,100%7C1,3.333,100&amp;chxt=x,y&amp;chs=286x300&amp;cht=r&amp;chco=FF0000&amp;chd=t:14,58,40,82,78&amp;chls=2.667,8,0&amp;chm=B,FF000080,0,0,0&amp;chtt=Facebook" title='PNG - 28.7 ko' type="image/png"&gt;&lt;img src='http://www.clever-age.com/local/cache-vignettes/L286xH300/chartchxl07C8217-a694f-05bd7.png' width='286' height='300' alt='PNG - 28.7 ko' style='height:300px;width:286px;' /&gt;&lt;/a&gt;&lt;/dt&gt;
&lt;/dl&gt;
&lt;h3 class='h3 spip'&gt;La spécification W3C&lt;/h3&gt;
&lt;p&gt;Encore à l'état de pré-draft (et donc seulement consultable au sein du bureau de normalisation), la nouvelle propriété CSS qui fait parler d'elle est donc &lt;strong&gt;odor&lt;/strong&gt;. Elle sera bientôt utilisable dans Firefox 13 (&lt;a href="http://ftp.mozilla.org/pub/mozilla.org/firefox/nightly/" class='spip_out' rel='external'&gt;nightly-build&lt;/a&gt;, à compiler soit même) sous cette forme :&lt;/p&gt; &lt;div style='text-align: left;' class='spip_code' dir='ltr'&gt;&lt;code&gt;-moz-odor: #2FA47; &lt;/code&gt;&lt;/div&gt;
&lt;p&gt;&lt;i&gt;(Il s'agit de la première proposition, il est encore fort probable qu'elle évolue, d'où la présence du préfixe -moz)&lt;/i&gt;&lt;/p&gt; &lt;p&gt;Il faut bien sûr être équipé du périphérique de la société Dagon, la bonne nouvelle étant que leur technologie est sous licence MIT et que d'autres constructeurs pourront se lancer dans leur fabrication. &lt;strong&gt;Acer&lt;/strong&gt; s'est déjà manifesté pour équiper ses futurs ordinateurs et tablettes de cette nouvelle interface. Pourtant, Wandaleach ne semble pas inquiet : "Nous ne voyons pas l'intérêt de verrouiller ces brevets, c'est le software permettant les mélanges les plus subtils qui emportera le marché. De ce côté-là, nous avons quelques années d'avance sur nos concurrents".&lt;/p&gt; &lt;p&gt;Nous sommes encore à plusieurs années de la commercialisation au grand public mais en tant que spécialistes du Web, nous ne pouvons que nous féliciter de ce pas en avant vers un nouvel inconnu...&lt;/p&gt;&lt;/div&gt;
		
		</content:encoded>


		

	<feedburner:origLink>http://www.clever-age.com/veille/blog/dagon-un-nouveau-media-pour-le-web.html</feedburner:origLink></item>
<item xml:lang="fr">
		<title>Play Framework 2.0 - Premières impressions</title>
		<link>http://feeds.clever-age.com/~r/Clever-Age-Blog/~3/MR8Orhk9Yn0/play-framework-2-0-premieres-impressions.html</link>
		<guid isPermaLink="false">http://www.clever-age.com/veille/blog/play-framework-2-0-premieres-impressions.html</guid>
		<dc:date>2012-03-23T13:13:21Z</dc:date>
		<dc:format>text/html</dc:format>
		<dc:language>fr</dc:language>
		<dc:creator>Matthieu Guillermin</dc:creator>


		<dc:subject>Framework</dc:subject>
		<dc:subject>Java, JEE</dc:subject>
		<dc:subject>Développement</dc:subject>

		<description>
&lt;p&gt;Play 2.0 est une refonte majeure du framework faisant la part belle à Scala. La version Beta sortie en novembre dernier était assez loin d'être finalisée et nous avait laissé quelque peu sur notre faim. La sortie des premières RC et, depuis peu, de la version finale nous permet enfin de plonger réellement dans l'outil et d'analyser plus en détail cette nouvelle mouture. Rien n'a changé ? Lorsqu'on commence à tester rapidement Play 2.0, on se dit que finalement rien n'a vraiment changé. On télécharge le (...)&lt;/p&gt;


-
&lt;a href="http://www.clever-age.com/veille/blog/" rel="directory"&gt;Notre blog de veille&lt;/a&gt;

/ 
&lt;a href="http://www.clever-age.com/tags/framework" rel="tag"&gt;Framework&lt;/a&gt;, 
&lt;a href="http://www.clever-age.com/tags/java-jee" rel="tag"&gt;Java, JEE&lt;/a&gt;, 
&lt;a href="http://www.clever-age.com/tags/developpement" rel="tag"&gt;Développement&lt;/a&gt;

		</description>


 <content:encoded>&lt;div class='rss_chapo'&gt;&lt;p&gt;Play 2.0 est une refonte majeure du framework faisant la part belle à Scala. La version Beta sortie en novembre dernier était assez loin d'être finalisée et nous avait laissé quelque peu sur notre faim.
La sortie des premières RC et, depuis peu, de la version finale nous permet enfin de plonger réellement dans l'outil et d'analyser plus en détail cette nouvelle mouture.&lt;/p&gt;&lt;/div&gt;
		&lt;div class='rss_texte'&gt;&lt;h3 class='h3 spip'&gt;Rien n'a changé ?&lt;/h3&gt;
&lt;p&gt;Lorsqu'on commence à tester rapidement &lt;a href="http://www.playframework.org/" class='spip_out' rel='external'&gt;Play 2.0&lt;/a&gt;, on se dit que finalement rien n'a vraiment changé. On télécharge le framework, on le dézippe, on l'ajoute à son PATH, on lance un "play new" puis un "play run" et on peut accéder à la page d'accueil de notre nouvelle appli dans notre navigateur en quelques secondes.&lt;/p&gt; &lt;p&gt;La structure du projet est sensiblement la même que pour la version précédente. On retrouve rapidement ces packages habituels : controllers, models, views. Les points forts de Play semblent avoir été conservé :&lt;/p&gt; &lt;ul class="spip"&gt;&lt;li&gt; La documentation est intégrée dans notre appli en mode dev et acccessible avec une "route" spécifique&lt;/li&gt;&lt;li&gt; le code est rechargé "à chaud" sans qu'on ait besoin de s'en occuper&lt;/li&gt;&lt;li&gt; on peut écrire notre code en Java ou en Scala comme on pouvait le faire avec le module play-scala de la version précédente&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;C'est en creusant un peu plus qu'on se rend compte qu'il y a quand même beaucoup de changements.&lt;/p&gt; &lt;h3 class='h3 spip'&gt;Tout a changé&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Accès aux données&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;Tout d'abord, l'accès aux données a été revu. Pour Java, c'est la librairie Ebean qui a été retenue en standard. Plus adaptée au mode de fonctionnement stateless de Play qu'Hibernate, elle est bien intégrée au framework. On retrouve globalement les mêmes automatismes que dans Play 1.&lt;/p&gt; &lt;p&gt;Pour Scala par contre, on change de philosophie avec le librairie Anorm. C'est plutôt un retour aux sources qui est opéré via l'utilisation directe de requêtes SQL mappées "à la main" vers des objets. Des outils sont disponibles pour faciliter la tâche, mais on est quand même loin du côté "magique" de la version Java.&lt;/p&gt; &lt;p&gt;Avec ces 2 possibilités offertes, le développeur est libre de travailler avec la solution la plus adaptée à son contexte (rapidité de développement, performance de l'application...).&lt;/p&gt; &lt;p&gt;Voici un exemple de code d'un Model réalisé avec Ebean :&lt;/p&gt; &lt;script src="https://gist.github.com/2035395.js?file=Company.java"&gt;&lt;/script&gt;
&lt;p&gt;Et voici le code d'un Model Anorm tiré d'une application exemple fournie avec Play :&lt;/p&gt; &lt;script src="https://gist.github.com/2035421.js?file=User.scala"&gt;&lt;/script&gt;
&lt;p&gt;&lt;strong&gt;Routing&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;Le routing n'a pas beaucoup changé en apparence, on retrouve toujours le même fichier de configuration des routes. Par contre, cette fois, la configuration est vérifiée à la compilation. Impossible donc de déclarer une route sans avoir créé le controller associé. Play nous apporte néanmoins une petite astuce pour créer très rapidement un controller "TODO" qui affichera une page spéciale dans le navigateur.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Controllers&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;La logique des controllers reste la même. On crée une classe Controller dans laquelle on déclare des méthodes statiques pour chacune de nos Actions. Il est également possible de créer une classe pour chaque Action. Le code en devient plus verbeux mais cela peut rendre les tests plus faciles.&lt;/p&gt; &lt;p&gt;Les Actions, au lieu d'appeler une méthode render(), doivent maintenant retourner un objet Result. Des helpers sont là pour construire des Result avec différents codes HTTP de retour (ok(), forbidden(), notFound(),…) et différents types de données (texte, json, html, xml,…). On donne ainsi la possibilité au développeur de manipuler finement la couche HTTP.&lt;/p&gt; &lt;p&gt;Les paramètres sont passés automatiquement à l'Action grâce au mapping effectué dans le routing.&lt;/p&gt; &lt;p&gt;Voici un exemple de code d'un Controller :&lt;/p&gt;
&lt;script src="https://gist.github.com/2035314.js?file=Application.java"&gt;&lt;/script&gt;
&lt;p&gt;&lt;strong&gt;Formulaires&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;La gestion des formulaires fait son apparition à travers un système qui permet de structurer son code tout en restant simple. Il est conçu pour s'interfacer facilement avec le Model. Les cas d'utilisations classiques seront donc très faciles à implémenter. Les cas plus complexes nécessiteront un travail spécifique du développeur.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Templates&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;C'est pour moi un des changements les plus importants car il apporte une philosophie très différente du moteur Groovy utilisé dans la version précédente.&lt;/p&gt; &lt;p&gt;Le moteur de template repose entièrement sur Scala, ce qui a permis de le rendre "typé". En clair, chaque template attend des paramètres d'entrée typés (et peut appeler d'autres templates avec également leur définition de paramètres). C'est à la compilation que tout cela va être vérifié, rendant les templates très robustes.&lt;/p&gt; &lt;p&gt;Pour accentuer encore plus cette robustesse, l'appel au routing depuis les templates pour générer des urls (pour les liens, les formulaires,…) est également vérifié à la compilation. Avec ça, Il va devenir très difficile d'avoir un lien mort dans son application.&lt;/p&gt; &lt;p&gt;Il est à noter qu'il existe des solutions pour utiliser le moteur de template Groovy de Play 1 vers Play 2 (voir &lt;a href="https://github.com/manuelbernhardt/play2-groovy-templates" class='spip_out' rel='external'&gt;Groovy templates for Play ! 2&lt;/a&gt; et &lt;a href="http://kjetland.com/blog/2011/11/playframework-new-faster-groovy-template-engine/" class='spip_out' rel='external'&gt;Faster Groovy Template Engine&lt;/a&gt;). Il sera donc envisageable de réutiliser certains éléments lors d'une phase de migration.&lt;/p&gt; &lt;p&gt;Voici par exemple le code d'un template "index" prenant en paramètre un User et une liste de Link et appelant un template "main" :&lt;/p&gt; &lt;script src="https://gist.github.com/2035375.js?file=index.scala.html"&gt;&lt;/script&gt;
&lt;script src="https://gist.github.com/2035375.js?file=main.scala.html"&gt;&lt;/script&gt;
&lt;p&gt;&lt;strong&gt;Assets&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;Play 2.0 suit la tendance actuelle en matière de CSS et javascript en permettant de gérer nativement la compilation du code Less ou CoffeeScript. La gestion d'autres types de fichiers sources peut être ajoutée via des modules de manière assez simple.&lt;/p&gt; &lt;p&gt;Le framework en profite pour gérer également la minification des assets.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Asynchrone&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;Play 1 apportait déjà quelques briques pour le développement de traitements asynchrones. Une étape supplémentaire est franchie avec l'intégration d'&lt;a href="http://akka.io/" class='spip_out' rel='external'&gt;Akka&lt;/a&gt; et son modèle d'Actor. Les traitements pourront désormais être distribués facilement par Akka sur plusieurs instances de l'application.&lt;/p&gt; &lt;h3 class='h3 spip'&gt;Les manques&lt;/h3&gt;
&lt;p&gt;Au delà de toutes ces nouveautés, comme très fréquemment lors d'une refonte, certains détails manquent à l'appel.&lt;/p&gt; &lt;p&gt;Le principal "manque" de cette nouvelle version est l'absence de compatibilité avec les applications développées en utilisant la version précédente. La migration est loin d'être évidente et nombre de projets resteront vraisemblablement en Play 1 pendant un moment.&lt;/p&gt; &lt;p&gt;Il faut noter également l'absence de module CRUD (utilisé pour créer rapidement des interfaces d'administration basiques). Cela est dû à la direction prise avec Anorm de redonner plus la main au développeur sur l'accès aux données en enlevant un peu de "magie".&lt;/p&gt; &lt;p&gt;Même si le code de Play 2.0 repose essentiellement sur Scala, l'utilisation du framework en lui-même ne posera pas de problème à un développeur Java sans réelle connaissance de Scala. En revanche, lorsqu'on veut aller fouiller un peu dans le code source du framework (chose qui arrive forcément à un moment ou à un autre), cela pourra se révéler assez handicapant. D'un autre côté, la simplicité de l'API de Play et la possibilité de pouvoir "mixer" Java et Scala peuvent en faire le framework idéal pour apprendre ce nouveau langage.&lt;/p&gt; &lt;p&gt;Dernier petit détail, le développement en utilisant Scala est gourmand en temps de compilation. Même si celle-ci se fait à la volée en cas de modification, on perd quand même un peu de réactivité lors des rafraîchissements de page.&lt;/p&gt; &lt;h3 class='h3 spip'&gt;Conclusion&lt;/h3&gt;
&lt;p&gt;Les grands principes qui ont fait la réputation de Play 1 sont toujours présents dans cette nouvelle version. L'API reste très simple à utiliser et les nouveautés sont réellement intéressantes. On regrettera l'abscence du module CRUD qui était très pratique dans les premières phases d'un projet à des fins de prototypage ou de test.&lt;/p&gt;&lt;/div&gt;
		
		</content:encoded>


		

	<feedburner:origLink>http://www.clever-age.com/veille/blog/play-framework-2-0-premieres-impressions.html</feedburner:origLink></item>
<item xml:lang="fr">
		<title>De l'importance de gérer les pages d'erreur</title>
		<link>http://feeds.clever-age.com/~r/Clever-Age-Blog/~3/QpVrSv4WrUY/de-l-importance-de-gerer-les-pages-d-erreur.html</link>
		<guid isPermaLink="false">http://www.clever-age.com/veille/blog/de-l-importance-de-gerer-les-pages-d-erreur.html</guid>
		<dc:date>2012-03-16T09:01:54Z</dc:date>
		<dc:format>text/html</dc:format>
		<dc:language>fr</dc:language>
		<dc:creator>Guillaume Marty, Margaux Lespagne</dc:creator>



		<description>&lt;p&gt;Découvrez tous nos conseils pour des pages d'erreur ne perturbant pas l'expérience utilisateur.&lt;/p&gt;

-
&lt;a href="http://www.clever-age.com/veille/blog/" rel="directory"&gt;Notre blog de veille&lt;/a&gt;


		</description>


 <content:encoded>&lt;div class='rss_chapo'&gt;&lt;p&gt;Parmi les erreurs HTTP, celle ayant le code 404 est la plus fréquente sur le Web. Comment les repérer, les réparer et pourquoi pas faire le buzz autour des pages non existantes ?!&lt;/p&gt;&lt;/div&gt;
		&lt;div class='rss_texte'&gt;&lt;h3 class='h3 spip'&gt;Qu'est-ce que c'est ?&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Définition&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;En HTTP, chaque requête est accompagnée d'un en-tête spécifiant son code. Ces codes du protocole HTTP donnent au client une information relative à la requête. En cas de succès, le serveur envoie un en-tête 200 pour signifier que la ressource sera transmise sans problème au client.
Un code commençant par un 4 signifie une erreur survenue du coté du client. Il en existe de plusieurs types, mais les plus courants sont :&lt;/p&gt; &lt;ul class="spip"&gt;&lt;li&gt; Erreur 400 : mauvaise requête/page non trouvée. Cette page apparaît principalement lorsque le nom de domaine demandé n'existe pas.&lt;/li&gt;&lt;li&gt; Erreur 401 : Accès non autorisé. Ce type d'erreur survient lorsque la page demandée se situe dans un répertoire protégé pour des raisons diverses (travaux, sections privées ou autre).&lt;/li&gt;&lt;li&gt; Erreur 403 : répertoire interdit. Ici c'est votre adresse IP qui ne vous permet pas d'accéder à l'adresse.&lt;/li&gt;&lt;li&gt; Erreur 404 : fichier non trouvé. Elle apparaît lorsque la page demandée a été retirée, déplacée ou renommée.&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Les erreurs 404&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;&lt;span class='spip_document_1883 spip_documents spip_documents_center'&gt;
&lt;img src='http://www.clever-age.com/local/cache-vignettes/L500xH375/common-404-92f4a.png' width='500' height='375' alt="" style='height:375px;width:500px;' /&gt;&lt;/span&gt;
Un exemple de page d'erreur standard sous Apache.&lt;/p&gt; &lt;p&gt;Parmi ces erreurs, celle ayant le code 404 est la plus fréquente sur le Web. Petite explication sur ce chiffre :&lt;/p&gt; &lt;ul class="spip"&gt;&lt;li&gt; Nous avons vu que le premier “4” indique une erreur provenant du client. Le serveur web vous indique que vous avez fait une mauvaise opération.&lt;/li&gt;&lt;li&gt; Le 0 représente une erreur générale de syntaxe (faute de frappe par exemple)&lt;/li&gt;&lt;li&gt; Le dernier chiffre 4 pointe vers l'erreur spécifique du groupe 40x, ici 404 : “fichier non trouvé” (Not Found)&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;Pour la petite histoire, une légende circule sur le choix du numéro 404. Il semblerait qu'« au CERN, en Suisse, les chercheurs, excédés d'aller sans cesse relancer un ­serveur défaillant installé dans le bureau n°404, aient attribué ce numéro d'erreur au défaut de connexion, en ­souvenir de cette pièce maudite. » (via &lt;a href="http://fr.wikipedia.org/wiki/Erreur_HTTP_404" class='spip_out' rel='external'&gt;Wikipédia&lt;/a&gt;)&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Comment des liens vers des pages inexistantes apparaissent-ils ?&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;Cette erreur peut avoir de multiples causes. Soit le fichier a tout simplement été supprimé, ce qui est fréquent si le site a connu plusieurs refontes, soit l'url est erronée à cause d'une faute de frappe lors de la saisie de l'adresse. Une faute de frappe peut également être introduite par le webmaster en créant des liens vers ses propres pages ou les pages d'un site externe.
L'apparition de ce type d'erreur peut désorienter les internautes. Ceux-ci peuvent être tentés de corriger manuellement l'URL, de cliquer sur le bouton "Page précédente", voire de quitter votre site.&lt;/p&gt; &lt;h3 class='h3 spip'&gt;Les bonnes pratiques ergonomiques&lt;/h3&gt;
&lt;p&gt;Bien entendu, il est important d'éviter les pages 404. Mais le long de la vie d'un site, il arrivera probablement qu'un utilisateur se rende sur une page non existante à un moment ou un autre. Il faut donc redoubler d'effort sur cette page pour expliquer à l'internaute ce qui a pu se passer. Il est essentiel de limiter sa frustration. Il existe de bonnes pratiques d'optimisation et de personnalisation d'un point de vue ergonomique, graphique et éditorial à mettre en place, en voici une liste :&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Respecter la charte graphique&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;Rien de plus perturbant pour un utilisateur que de se trouver face à une page d'erreur par défaut.
Il est donc important de garder la charte graphique pour rester cohérent avec l'ensemble du site web et ne pas perdre le visiteur. Celui-ci doit identifier clairement et rapidement qu'il est bien resté sur le bon site, et ainsi éviter qu'il ne le quitte.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Expliquer brièvement et clairement le problème&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;Il faut créer un contenu concis, permettant à l'internaute de se situer rapidement, avec un message simple expliquant que la page n'existe pas ou bien n'est plus disponible. Une formule d'excuse simple est appropriée : "Désolé, la page demandée est introuvable." Il faut considérer cette page comme une page d'accroche.
Il est important de ne pas rendre l'internaute responsable de cette erreur, il doit être conscient que le problème provient uniquement du site.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Proposer des solutions&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;Une fois que l'internaute a identifié l'erreur, il convient de l'inviter à faire une action.
Il est possible d'inclure un moteur de recherche interne pour que l'internaute précise sa demande. Dans de nombreux cas, la page recherchée existe toujours, mais a été déplacée ailleurs dans le site web.
Cependant, dans la plupart du temps l'internaute déçu ne fera pas de requête de son propre gré (peur d'être déçu une deuxième fois peut-être). Il faut alors lui proposer des solutions intelligentes, comme pré-renseigner le champ de recherche avec des mots-clés tirés de l'URL.&lt;/p&gt; &lt;p&gt;On peut également épargner une étape à l'utilisateur en se servant de ces mots clés pour afficher les liens du site qui correspondent le mieux à la requête.&lt;/p&gt; &lt;p&gt;Proposer des liens utiles vers des pages clés de votre site :&lt;/p&gt; &lt;ul class="spip"&gt;&lt;li&gt; lien vers le plan du site&lt;/li&gt;&lt;li&gt; navigation ou rubrique principale du site&lt;/li&gt;&lt;li&gt; liens vers les pages les plus “populaires” particulièrement avantageux sur un blog, car il n'y a pas de but spécifique à la visite d'un internaute mis à part la lecture d'articles intéressants.&lt;/li&gt;&lt;li&gt; lien vers la page de contact/formulaire, lui donnant la possibilité d'alerter le webmaster de cette erreur ou bien tout simplement, poser une question directement. &lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;Une autre alternative consiste à prévenir l'internaute que la page demandée n'est pas existante puis le rediriger sur une page à forte influence : en général la page d'accueil du site&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Ne pas indexer les pages d'erreur&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;D'un point de vue &lt;a href="http://fr.wikipedia.org/wiki/Optimisation_pour_les_moteurs_de_recherche" class='spip_out' rel='external'&gt;SEO&lt;/a&gt;, il est important que les pages d'erreur ne soient pas indexées par Google et les autres moteurs de recherche. Il faut donc bien vérifier que le serveur Web renvoie un code HTTP 404 lorsqu'une page inexistante est demandée.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Étude de cas&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;D'après &lt;a href="https://whichtestwon.com/archives/2254" class='spip_out' rel='external'&gt;L'étude de cas sur les pages 404&lt;/a&gt; réalisée par Mountain Equipment Co-op de &lt;a href="http://whichtestwon.com/" class='spip_out' rel='external'&gt;Which Test Won&lt;/a&gt; la mise en page semble également importante. Il convient d'adopter une page aérée et d'y ajouter une grande image pour illustrer et capter l'attention du visiteur.&lt;/p&gt; &lt;p&gt;&lt;span class='spip_document_1880 spip_documents spip_documents_center'&gt;
&lt;img src='http://www.clever-age.com/local/cache-vignettes/L500xH349/ab_testing-2-aecc1.png' width='500' height='349' alt="" style='height:349px;width:500px;' /&gt;&lt;/span&gt;&lt;/p&gt; &lt;p&gt;“La meilleure version obtient un taux de conversion de 38.32% et une amélioration du taux de conversion de 3.56%. En parallèle, cette version présente une amélioration de 73.2% du chiffre d'affaires par visite.”
“La meilleure version fournit aux lecteurs des excuses pour l'erreur, ainsi que des images plus attrayantes et les couleurs qui conviennent mieux aux attentes des clients (...). Cette version a également fourni un champ de recherche et une liste déroulante qui a simplifié le processus de re-navigation pour les utilisateurs - un moyen efficace de renouer le dialogue.”&lt;/p&gt; &lt;p&gt;Source : &lt;a href="http://whichtestwon.com/archives/2254" class='spip_url spip_out' rel='nofollow external'&gt;http://whichtestwon.com/archives/2254&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Les erreurs à ne pas commettre&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;Il existe des pratiques anti-ergonomiques que l'on rencontre encore trop souvent sur le web. En voici quelques unes :&lt;/p&gt; &lt;ul class="spip"&gt;&lt;li&gt; Certains sites utilisent la “redirection automatique vers la page d'accueil” n'expliquant pas à l'internaute ce qu'il s'est passé et pourquoi il n'a pas atterri sur la page qu'il avait demandé.&lt;/li&gt;&lt;li&gt; Afficher une page de type “Warning” (attention). La discrétion est de rigueur sur ce genre de page, rien ne sert d'apeurer l'internaute.&lt;/li&gt;&lt;/ul&gt;
&lt;h3 class='h3 spip'&gt;Les meilleurs moyens d'éviter les erreurs 404&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Créer une page d'erreur fonctionnelle sous Apache&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;Le fichier .htaccess est utilisé pour de nombreuses choses : bloquer l'accès à un répertoire, demander un mot de passe, réécrire les url d'un site, etc. C'est bien entendu à la dernière utilité que nous allons nous intéresser ici.
Tout d'abord, créez un fichier .htaccess que vous déposez à la racine de votre site.
Puis à l'intérieur même de ce fichier, placez la ligne de commande suivante (exemple pour une page de type erreur 404) :&lt;/p&gt; &lt;p&gt;ErrorDocument 404 &lt;a href="http://www.mon-site.com/404.html" class='spip_url spip_out' rel='nofollow external'&gt;http://www.mon-site.com/404.html&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Ensuite créez un fichier 404.html à la racine du site et placez-y le message d'erreur personnalisé.&lt;/p&gt; &lt;p&gt;Si vous êtes en manque d'inspiration pour cette page, il existe des scripts déjà prêts pour la personnaliser rapidement.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Créer une page d'erreur fonctionnelle en ajoutant le Widget 404&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;Google propose un service pour faciliter la création de pages d'erreur personnalisée :
&lt;a href="http://www.google.com/support/webmasters/bin/answer.py?answer=136085" class='spip_url spip_out' rel='nofollow external'&gt;http://www.google.com/support/webma...&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Le widget 404 remplace automatiquement les messages d'erreur par des suggestions utiles pour l'internaute. Cela permet aux internautes de trouver plus facilement l'information dont ils ont besoin, réduisant ainsi la probabilité qu'ils quittent votre site pour chercher ailleurs.&lt;/p&gt; &lt;p&gt;D'après tout ce que l'on a pu voir précédemment dans cet article, il convient de suivre l'augmentation du nombre de pages 404 présentes sur votre site et mesurer si les changements ont un impact sur votre trafic. Voici une liste de quelques outils pour tracker les pages d'erreurs 404.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Repérer les liens morts grâce à Google Analytics&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;il est possible de savoir combien de visites il y a eu sur votre page d'erreur 404. Si vous utilisez le code asynchrone, il suffit de placer le code JavaScript suivant dans le modèle de votre page 404 :&lt;/p&gt; &lt;p&gt;pageTracker._trackPageview(“/404.html ?page=” + document.location.pathname + document.location.search + “&amp;from=” + document.referrer) ;&lt;/p&gt; &lt;p&gt;Vous pouvez également recevoir une alerte par email lorsqu'une page d'erreur est visitée trop fréquemment.&lt;/p&gt; &lt;p&gt;&lt;span class='spip_document_1878 spip_documents spip_documents_center'&gt;
&lt;img src='http://www.clever-age.com/local/cache-vignettes/L500xH384/google-analytic-alerts-3200c.png' width='500' height='384' alt="" style='height:384px;width:500px;' /&gt;&lt;/span&gt;&lt;/p&gt; &lt;p&gt;source : &lt;a href="http://www.smashingmagazine.com/2011/05/18/optimizing-error-pages-creating-opportunities-out-of-mistakes/" class='spip_url spip_out' rel='nofollow external'&gt;http://www.smashingmagazine.com/201...&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Repérer les liens morts grâce aux outils pour les webmasters de Google&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;Vous pouvez lister les erreurs rencontrées par le robot d'indexation de Google et surtout les pages d'origine. Dans les outils pour les webmasters de Google, rendez-vous sur la page Diagnostic &gt; Erreurs d'exploration.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Rediriger les anciennes pages&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;Si vous changez le nom de domaine de votre site, n'oubliez pas d'utiliser l'outil "changement d'adresse" des outils pour les webmasters de Google. Il vous permettra d'informer Google de votre nouveau domaine.&lt;/p&gt; &lt;h3 class='h3 spip'&gt;Créer le buzz !&lt;/h3&gt;
&lt;p&gt;Mettre en place des pages d'erreur personnalisées permet même de faire parler de vous. Certains sites l'ont bien compris !&lt;/p&gt; &lt;p&gt;&lt;span class='spip_document_1882 spip_documents spip_documents_center'&gt;
&lt;img src='http://www.clever-age.com/local/cache-vignettes/L500xH380/github-404-d4e3a.png' width='500' height='380' alt="" style='height:380px;width:500px;' /&gt;&lt;/span&gt;
&lt;a href="https://github.com/404" class='spip_url spip_out' rel='nofollow external'&gt;https://github.com/404&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;span class='spip_document_1881 spip_documents spip_documents_center'&gt;
&lt;img src='http://www.clever-age.com/local/cache-vignettes/L500xH380/github-500-17b63.png' width='500' height='380' alt="" style='height:380px;width:500px;' /&gt;&lt;/span&gt;
&lt;a href="https://github.com/500" class='spip_url spip_out' rel='nofollow external'&gt;https://github.com/500&lt;/a&gt; (Notez l'interactivité avec la souris sur les deux pages ci-dessus)&lt;/p&gt; &lt;p&gt;Exemples de pages d'erreur qui font parler d'elles :&lt;/p&gt; &lt;ul class="spip"&gt;&lt;li&gt; &lt;a href="http://www.bonjour404.fr/" class='spip_url spip_out' rel='nofollow external'&gt;http://www.bonjour404.fr/&lt;/a&gt;&lt;/li&gt;&lt;li&gt; &lt;a href="http://iplanwebsites.com/404" class='spip_url spip_out' rel='nofollow external'&gt;http://iplanwebsites.com/404&lt;/a&gt;&lt;/li&gt;&lt;li&gt; &lt;a href="http://www.netmagazine.com/404" class='spip_url spip_out' rel='nofollow external'&gt;http://www.netmagazine.com/404&lt;/a&gt;&lt;/li&gt;&lt;li&gt; &lt;a href="http://www.fryewiles.com/templates/errors/404.html" class='spip_url spip_out' rel='nofollow external'&gt;http://www.fryewiles.com/templates/...&lt;/a&gt;&lt;/li&gt;&lt;li&gt; &lt;a href="http://www.incan.co.uk/404.html" class='spip_url spip_out' rel='nofollow external'&gt;http://www.incan.co.uk/404.html&lt;/a&gt; (de quoi vous occuper et oublier l'erreur, à voir si une fois le jeu énervant et terminé, l'internaute quitte le site)&lt;/li&gt;&lt;li&gt; &lt;a href="http://www.cubancouncil.com/404" class='spip_url spip_out' rel='nofollow external'&gt;http://www.cubancouncil.com/404&lt;/a&gt;&lt;/li&gt;&lt;li&gt; &lt;a href="http://www.homestarrunner.com/toons.html" class='spip_url spip_out' rel='nofollow external'&gt;http://www.homestarrunner.com/toons.html&lt;/a&gt;&lt;/li&gt;&lt;li&gt; &lt;a href="http://proteys.info/404/" class='spip_url spip_out' rel='nofollow external'&gt;http://proteys.info/404/&lt;/a&gt;&lt;/li&gt;&lt;li&gt; &lt;a href="http://www.404notfound.fr/" class='spip_url spip_out' rel='nofollow external'&gt;http://www.404notfound.fr/&lt;/a&gt;&lt;/li&gt;&lt;li&gt; &lt;a href="http://www.flickr.com/photos/pioupioum/sets/72157604297580408/" class='spip_url spip_out' rel='nofollow external'&gt;http://www.flickr.com/photos/pioupi...&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;
		
		</content:encoded>


		

	<feedburner:origLink>http://www.clever-age.com/veille/blog/de-l-importance-de-gerer-les-pages-d-erreur.html</feedburner:origLink></item>
<item xml:lang="fr">
		<title>Le nouveau M de LAMP : MariaDB</title>
		<link>http://feeds.clever-age.com/~r/Clever-Age-Blog/~3/lqY-TV00--A/le-nouveau-m-de-lamp-mariadb.html</link>
		<guid isPermaLink="false">http://www.clever-age.com/veille/blog/le-nouveau-m-de-lamp-mariadb.html</guid>
		<dc:date>2012-02-29T11:03:26Z</dc:date>
		<dc:format>text/html</dc:format>
		<dc:language>fr</dc:language>
		<dc:creator>Benjamin Clay, Damien Alexandre</dc:creator>


		<dc:subject>Bases de données</dc:subject>
		<dc:subject>Clever Age</dc:subject>
		<dc:subject>MySQL</dc:subject>
		<dc:subject>MariaDB</dc:subject>

		<description>
&lt;p&gt;Nous étions jeudi 1er février au meetup MySQL organisé par LeMug.fr et SkySQL. Nous avons pu y approfondir nos connaissances sur MariaDB, le remplaçant libre de MySQL. MariaDB : Un nouveau SGBD ? MySQL est un Système de Gestion de Base de Données apparu en 1995 qui est devenu en quelques années un des plus utilisés dans le monde. En 2008, l'entreprise MySQL AB éditrice de MySQL est rachetée par Sun Microsystems, qui se fait racheter un an plus tard par Oracle. Michael Widenius, aussi connu sous le (...)&lt;/p&gt;


-
&lt;a href="http://www.clever-age.com/veille/blog/" rel="directory"&gt;Notre blog de veille&lt;/a&gt;

/ 
&lt;a href="http://www.clever-age.com/tags/bases-de-donnees" rel="tag"&gt;Bases de données&lt;/a&gt;, 
&lt;a href="http://www.clever-age.com/les-marques/clever-age,178" rel="tag"&gt;Clever Age&lt;/a&gt;, 
&lt;a href="http://www.clever-age.com/tags/mysql" rel="tag"&gt;MySQL&lt;/a&gt;, 
&lt;a href="http://www.clever-age.com/tags/mariadb" rel="tag"&gt;MariaDB&lt;/a&gt;

		</description>


 <content:encoded>&lt;div class='rss_chapo'&gt;&lt;p&gt;Nous étions jeudi 1er février au meetup MySQL organisé par &lt;a href="http://www.lemug.fr/" class='spip_out' rel='external'&gt;LeMug.fr&lt;/a&gt; et &lt;a href="http://www.skysql.com/" class='spip_out' rel='external'&gt;SkySQL&lt;/a&gt;. Nous avons pu y approfondir nos connaissances sur &lt;a href="http://mariadb.org/" class='spip_out' rel='external'&gt;MariaDB&lt;/a&gt;, le remplaçant libre de MySQL.&lt;/p&gt;&lt;/div&gt;
		&lt;div class='rss_texte'&gt;&lt;h3 class='h3 spip'&gt;MariaDB : Un nouveau SGBD ?&lt;/h3&gt;
&lt;p&gt;MySQL est un Système de Gestion de Base de Données apparu en 1995 qui est devenu en quelques années un des plus utilisés dans le monde. En 2008, l'entreprise MySQL AB éditrice de MySQL est rachetée par Sun Microsystems, qui se fait racheter un an plus tard par Oracle. &lt;br /&gt;&lt;a href="http://monty-says.blogspot.com/" class='spip_out' rel='external'&gt;Michael Widenius&lt;/a&gt;, aussi connu sous le pseudonyme de &lt;i&gt;Monty&lt;/i&gt;, est le principal auteur de la première version de MySQL, et est le fondateur de MySQL AB. Il a quitté Sun Microsystems afin d'assurer la disponibilité d'une version gratuite et stable de son bébé.
&lt;br /&gt;C'est ainsi qu'est né MariaDB, un projet sous licence GPLv2 se basant sur MySQL, qui se veut être très stable, plus robuste, plus performant, et surtout 100% compatible avec ce dernier.&lt;/p&gt; &lt;p&gt;&lt;span class='spip_document_1884 spip_documents spip_documents_center'&gt;
&lt;img src='http://www.clever-age.com/local/cache-vignettes/L413xH129/mariadb-seal-shaded-browntext-3224c.png' width='413' height='129' alt="" style='height:129px;width:413px;' /&gt;&lt;/span&gt;&lt;/p&gt; &lt;p&gt;MariaDB se place donc dans la continuité de MySQL : nous y retrouvons toutes les fonctionnalités de ce dernier, avec, si possible, des corrections de bugs et des améliorations de performances. La compatibilité reste totale et les binaires de l'un sont échangeables avec ceux de l'autre, à condition de rester sur des versions mineures compatibles :&lt;/p&gt; &lt;ul class="spip"&gt;&lt;li&gt; les données et les définitions de table (.frm) sont identiques ;&lt;/li&gt;&lt;li&gt; toutes les structures et les APIs clientes, ainsi que tous les protocoles sont identiques ;&lt;/li&gt;&lt;li&gt; tous les noms de fichiers, binaires, chemins, ports, sockets... devraient être les mêmes ;&lt;/li&gt;&lt;li&gt; tous les connecteurs (PHP, Perl, Python, Java, .NET, MyODBC, Ruby, MySQL C connector...) fonctionnent sans changement ;&lt;/li&gt;&lt;li&gt; le paquet &lt;strong&gt;mysql-client&lt;/strong&gt; fonctionne aussi avec un serveur MariaDB.&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;Parmi les différences, nous pouvons noter l'apparition de plusieurs moteurs de stockage tels que &lt;a href="http://www.percona.com/docs/wiki/Percona-XtraDB:start" class='spip_out' rel='external'&gt;XtraDB&lt;/a&gt;, et &lt;a href="http://kb.askmonty.org/en/aria" class='spip_out' rel='external'&gt;Aria&lt;/a&gt;, une sorte de MyISAM transactionnel, ou encore &lt;a href="http://kb.askmonty.org/en/federatedx" class='spip_out' rel='external'&gt;FederatedX&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;XtraDB est une version améliorée d'InnoDB, le moteur de stockage le plus souvent utilisé actuellement sur les projets PHP/MySQL. En effet, XtraDB est conçu pour être plus performant, notamment en exploitant plus efficacement les processeurs multi-cores et la mémoire.&lt;/p&gt; &lt;h3 class='h3 spip'&gt;Retours d'expérience&lt;/h3&gt;
&lt;p&gt;Le 1er février, &lt;a href="https://twitter.com/#!/bytebot" class='spip_out' rel='external'&gt;Colin Charles&lt;/a&gt;, actuellement développeur chez Monty Program AB, le plus gros sponsor de MariaDB, a fait une présentation du projet dans un pub parisien.&lt;/p&gt; &lt;div style="width:425px" id="__ss_9879624"&gt; &lt;strong style="display:block;margin:12px 0 4px"&gt;&lt;a href="http://www.slideshare.net/bytebot/why-mariadb" title="Why MariaDB?" target="_blank"&gt;Why MariaDB?&lt;/a&gt;&lt;/strong&gt; &lt;iframe src="http://www.slideshare.net/slideshow/embed_code/9879624?rel=0" width="425" height="355" frameborder="0" marginwidth="0" marginheight="0" scrolling="no"&gt;&lt;/iframe&gt; &lt;div style="padding:5px 0 12px"&gt; View more &lt;a href="http://www.slideshare.net/" target="_blank"&gt;presentations&lt;/a&gt; from &lt;a href="http://www.slideshare.net/bytebot" target="_blank"&gt;Colin Charles&lt;/a&gt; &lt;/div&gt; &lt;/div&gt;
&lt;p&gt;La présentation et les discussions lors de cette soirée nous ont appris que des sites à fort trafic utilisent d'ores et déjà MariaDB en production : pap.fr, Pixmania, Paybox, … et d'autres entreprises tels que Viadeo l'utilisent pour leur &lt;abbr title="Business Intelligence"&gt;BI&lt;/abbr&gt;.
&lt;br /&gt;Toutes ces applications qui ont migré de MySQL vers MariaDB ont gagné en performance. Pixmania serait passé de 50 serveurs MySQL à seulement 10 MariaDB, avec très certainement d'autres optimisations, mais nous n'avons pas pu avoir plus d'informations.&lt;/p&gt; &lt;h3 class='h3 spip'&gt;Benchmark sur une application existante&lt;/h3&gt;
&lt;p&gt;Après avoir eu écho de ces informations et de ces chiffres plutôt impressionnants, nous avons décidé de réaliser un benchmark rapide des serveurs MySQL 5.1 et 5.5, et de MariaDB 5.2. Pour cela, nous avons utilisé une page d'un projet existant qui contient de nombreuses requêtes SQL. Nous avons choisi une page ayant des requêtes de complexités différentes, certaines très simple, d'autres avec de nombreuses jointures.
Le benchmark a été fait en effectuant 5 000 requêtes sur la page en question, et en utilisant les mêmes configurations pour tous les serveurs, les étapes ont été :&lt;/p&gt; &lt;ul class="spip"&gt;&lt;li&gt; Lancement de MySQL 5.1&lt;/li&gt;&lt;li&gt; Lancement de Apache Benchmark sur la page Web&lt;/li&gt;&lt;li&gt; Arrêt de MySQL 5.1&lt;/li&gt;&lt;li&gt; Lancement de MySQL 5.5&lt;/li&gt;&lt;li&gt; Lancement de Apache Benchmark sur la page Web&lt;/li&gt;&lt;li&gt; Arrêt de MySQL 5.5&lt;/li&gt;&lt;li&gt; Lancement de MariaDB 5.2&lt;/li&gt;&lt;li&gt; Lancement de Apache Benchmark sur la page Web&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;Voici les résultats obtenus :&lt;/p&gt; &lt;p&gt;&lt;span class='spip_document_1892 spip_documents spip_documents_center'&gt;
&lt;img src='http://www.clever-age.com/local/cache-vignettes/L500xH293/bench-bc354.png' width='500' height='293' alt="" style='height:293px;width:500px;' /&gt;&lt;/span&gt;&lt;/p&gt; &lt;p&gt;Nous remarquons qu'il y a une nette progression des performances entre les 2 versions de MySQL testées, et que MariaDB, bien qu'en version 5.2, est tout de même au-dessus de MySQL 5.5.&lt;/p&gt; &lt;p&gt;MySQL 5.5 est actuellement la version la plus avancée du SGBD et bénéficie de gains très importants sur ses prédécesseurs. La fusion de cette version dans MariaDB est actuellement en cours, MariaDB 5.3 est d'ores et déjà en release candidate, la version 5.5 suivra rapidement. Cette future version du SGBD disposant des dernières améliorations d'Oracle devrait donc surpasser les mesures effectuées avec MariaDB 5.2.&lt;/p&gt; &lt;h3 class='h3 spip'&gt;Conclusion&lt;/h3&gt;
&lt;p&gt;&lt;span class='spip_document_1885 spip_documents spip_documents_center'&gt;
&lt;img src='http://www.clever-age.com/local/cache-vignettes/L500xH281/2012-02-01_20-23-06_233_paris-7d7f0.jpg' width='500' height='281' alt="" style='height:281px;width:500px;' /&gt;&lt;/span&gt;&lt;/p&gt; &lt;p&gt;Si vous n'êtes pas encore prêt à passer à MariaDB en production, il est tout de même grand temps de vous y intéresser :&lt;/p&gt; &lt;ul class="spip"&gt;&lt;li&gt; performances accrues ;&lt;/li&gt;&lt;li&gt; licence libre ;&lt;/li&gt;&lt;li&gt; support pour entreprises (via l'entreprise SkySQL par exemple) ;&lt;/li&gt;&lt;li&gt; parfaitement compatible, aucune migration de données nécessaire.&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;Petite anecdote : "MySQL", tout comme le moteur de stockage MyISAM, vient du prénom de la fille de Monty "My", MariaDB vient bien évidemment du prénom de sa plus jeune fille.
Merci à SkySQL et LeMug.fr pour l'accueil, les bières et l'organisation de la conférence !&lt;/p&gt;&lt;/div&gt;
		
		</content:encoded>


		

	<feedburner:origLink>http://www.clever-age.com/veille/blog/le-nouveau-m-de-lamp-mariadb.html</feedburner:origLink></item>
<item xml:lang="fr">
		<title>Utiliser, optimiser et servir des fichiers SVG</title>
		<link>http://feeds.clever-age.com/~r/Clever-Age-Blog/~3/eGv0iMccc-U/utiliser-optimiser-et-servir-des-fichiers-svg.html</link>
		<guid isPermaLink="false">http://www.clever-age.com/veille/blog/utiliser-optimiser-et-servir-des-fichiers-svg.html</guid>
		<dc:date>2012-02-15T13:53:59Z</dc:date>
		<dc:format>text/html</dc:format>
		<dc:language>fr</dc:language>
		<dc:creator>Jérémie Patonnier</dc:creator>


		<dc:subject>XML</dc:subject>
		<dc:subject>Webdesign</dc:subject>

		<description>
&lt;p&gt;SVG est un format d'images vectorielles qui repose sur une syntaxe XML. Il est actuellement supporté par tous les navigateurs du marché, y compris Internet Explorer depuis sa version 9. Le support de ce format s'améliorant rapidement, il devient de plus en plus utilisé. Ceci dit, le fait que ce format repose sur XML nécessite de prendre quelques précautions en termes de performance. Rappel : Inclure du SVG dans du HTML Si SVG peut se suffire à lui-même, le Web design moderne en fait une utilisation (...)&lt;/p&gt;


-
&lt;a href="http://www.clever-age.com/veille/blog/" rel="directory"&gt;Notre blog de veille&lt;/a&gt;

/ 
&lt;a href="http://www.clever-age.com/tags/xml" rel="tag"&gt;XML&lt;/a&gt;, 
&lt;a href="http://www.clever-age.com/tags/webdesign" rel="tag"&gt;Webdesign&lt;/a&gt;

		</description>


 <content:encoded>&lt;div class='rss_chapo'&gt;&lt;p&gt;&lt;abbr&gt;SVG&lt;/abbr&gt; est un format d'images vectorielles qui repose sur une syntaxe &lt;abbr&gt;XML&lt;/abbr&gt;. Il est actuellement supporté par tous les navigateurs du marché, y compris Internet Explorer depuis sa version 9. Le support de ce format s'améliorant rapidement, il devient de plus en plus utilisé. Ceci dit, le fait que ce format repose sur &lt;abbr&gt;XML&lt;/abbr&gt; nécessite de prendre quelques précautions en termes de performance.&lt;/p&gt;&lt;/div&gt;
		&lt;div class='rss_texte'&gt;&lt;h3 class='h3 spip'&gt;Rappel : Inclure du SVG dans du HTML&lt;/h3&gt;
&lt;p&gt;Si &lt;abbr&gt;SVG&lt;/abbr&gt; peut se suffire à lui-même, le Web design moderne en fait une utilisation importante en conjonction avec les autres technologies Web que sont &lt;abbr&gt;HTML&lt;/abbr&gt;, &lt;abbr&gt;CSS&lt;/abbr&gt; et Javascript (à titre d'exemple, jetez donc un coup d'œil au site &lt;a href="http://vlog.it/" class='spip_out' rel='external'&gt;Vlog.it&lt;/a&gt;). Ainsi, avant de voir comment on optimise SVG, faisons d'abord un petit rappel sur les différentes façons d'inclure du SVG dans un document HTML.&lt;/p&gt; &lt;p&gt;Avec HTML, vous disposez de 4 techniques pour inclure du SVG dans le document :&lt;/p&gt; &lt;ol class="spip"&gt;&lt;li&gt; la balise &lt;code class='spip_code' dir='ltr'&gt;iframe&lt;/code&gt;, &lt;/li&gt;&lt;li&gt; la balise &lt;code class='spip_code' dir='ltr'&gt;object&lt;/code&gt;, &lt;/li&gt;&lt;li&gt; la balise &lt;code class='spip_code' dir='ltr'&gt;img&lt;/code&gt; &lt;/li&gt;&lt;li&gt; et, avec l'arrivée de HTML5, vous pouvez aussi mettre des balises &lt;code class='spip_code' dir='ltr'&gt;svg&lt;/code&gt; directement dans du HTML. &lt;/li&gt;&lt;/ol&gt;
&lt;p&gt;Historiquement et techniquement, c'est la balise &lt;code class='spip_code' dir='ltr'&gt;object&lt;/code&gt; qui est la plus sûre et la plus appropriée pour inclure du SVG. Elle vous permet d'éviter tous les effets de bord liés aux &lt;code class='spip_code' dir='ltr'&gt;iframe&lt;/code&gt; (performances, accessibilité, etc.) tout en autorisant la propagation des événements DOM (ce que ne permet pas la balise &lt;code class='spip_code' dir='ltr'&gt;img&lt;/code&gt;). Cerise sur le gâteau, elle vous permet de gérer élégamment les solutions de repli pour l'accessibilité ou, plus trivialement, de gérer les vieilles versions d'Internet Explorer. En effet, pour mémoire, si l'objet référencé par la balise &lt;code class='spip_code' dir='ltr'&gt;object&lt;/code&gt; n'est pas compris par le navigateur, il affichera le contenu HTML présent à l'intérieur de la balise.&lt;/p&gt; &lt;p&gt;Du côté de CSS, il est possible d'inclure du SVG via :&lt;/p&gt; &lt;ol class="spip"&gt;&lt;li&gt; la propriété &lt;code class='spip_code' dir='ltr'&gt;background-image&lt;/code&gt; (extrêmement utile en conjonction avec la nouvelle propriété CSS 3 &lt;a href="https://developer.mozilla.org/en/CSS/background-size" class='spip_out' rel='external'&gt;&lt;code class='spip_code' dir='ltr'&gt;background-size&lt;/code&gt;&lt;/a&gt;) &lt;/li&gt;&lt;li&gt; la propriété &lt;code class='spip_code' dir='ltr'&gt;content&lt;/code&gt; utilisée avec les pseudo-éléments &lt;code class='spip_code' dir='ltr'&gt;::before&lt;/code&gt; et &lt;code class='spip_code' dir='ltr'&gt;::after&lt;/code&gt;. &lt;/li&gt;&lt;/ol&gt;
&lt;p&gt;Il sera également possible à terme de l'utiliser avec la propriété CSS 3 &lt;code class='spip_code' dir='ltr'&gt;border-image&lt;/code&gt;. Malheureusement, à ce jour, aucun navigateur ne supporte cette propriété correctement, en particulier avec SVG.&lt;/p&gt; &lt;p&gt;En résumé, navigateur par navigateur [&lt;a href='#nb2-1' class='spip_note' rel='footnote' title='Notez que je ne cite pas Safari, mais c'est la même chose que Chrome. En ce (...)' id='nh2-1'&gt;1&lt;/a&gt;], ça va donner ça :&lt;/p&gt; &lt;table class="spip"&gt;
&lt;thead&gt;&lt;tr class='row_first'&gt;&lt;th scope='col'&gt; Intégration &lt;/th&gt;&lt;th scope='col'&gt; IE &lt;/th&gt;&lt;th scope='col'&gt; Firefox &lt;/th&gt;&lt;th scope='col'&gt; Chrome &lt;/th&gt;&lt;th scope='col'&gt; Opera &lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr class='row_even'&gt;
&lt;td&gt; iframe &lt;/td&gt;
&lt;td&gt; ok &lt;/td&gt;
&lt;td&gt; ok &lt;/td&gt;
&lt;td&gt; ok &lt;/td&gt;
&lt;td&gt; ok &lt;/td&gt;&lt;/tr&gt;
&lt;tr class='row_odd'&gt;
&lt;td&gt; object &lt;/td&gt;
&lt;td&gt; ok &lt;/td&gt;
&lt;td&gt; ok &lt;/td&gt;
&lt;td&gt; ok &lt;/td&gt;
&lt;td&gt; ok &lt;/td&gt;&lt;/tr&gt;
&lt;tr class='row_even'&gt;
&lt;td&gt; img &lt;/td&gt;
&lt;td&gt; ok &lt;/td&gt;
&lt;td&gt; ok &lt;/td&gt;
&lt;td&gt; ok &lt;/td&gt;
&lt;td&gt; ok &lt;/td&gt;&lt;/tr&gt;
&lt;tr class='row_odd'&gt;
&lt;td&gt; svg &lt;/td&gt;
&lt;td&gt; ok &lt;/td&gt;
&lt;td&gt; ok &lt;/td&gt;
&lt;td&gt; ok &lt;/td&gt;
&lt;td&gt; ok &lt;/td&gt;&lt;/tr&gt;
&lt;tr class='row_even'&gt;
&lt;td&gt; background-image &lt;/td&gt;
&lt;td&gt; ok &lt;/td&gt;
&lt;td&gt; ok &lt;/td&gt;
&lt;td&gt; ok &lt;/td&gt;
&lt;td&gt; ok &lt;/td&gt;&lt;/tr&gt;
&lt;tr class='row_odd'&gt;
&lt;td&gt; content &lt;/td&gt;
&lt;td&gt; ok &lt;/td&gt;
&lt;td&gt; ok &lt;/td&gt;
&lt;td&gt; ok &lt;/td&gt;
&lt;td&gt; ok &lt;/td&gt;&lt;/tr&gt;
&lt;tr class='row_even'&gt;
&lt;td&gt; border-image &lt;/td&gt;
&lt;td&gt; non &lt;/td&gt;
&lt;td&gt; bug &lt;/td&gt;
&lt;td&gt; bug &lt;/td&gt;
&lt;td&gt; bug &lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;On notera un petit bug dans Firefox qui parfois pixelise les images SVG intégrées via CSS ou la balise &lt;code class='spip_code' dir='ltr'&gt;img&lt;/code&gt;.&lt;/p&gt; &lt;h3 class='h3 spip'&gt;SVG et performance, les principaux écueils&lt;/h3&gt;
&lt;p&gt;En terme de performances, SVG souffre de deux écueils qui sont liés au fait que SVG est un format XML.&lt;/p&gt; &lt;p&gt;Premièrement, qui dit XML dit &lt;abbr&gt;DOM&lt;/abbr&gt;. En effet, tous les navigateurs qui vont interpréter une image SVG vont d'abord construire un arbre DOM des éléments qui constituent cette image. Or, &lt;abbr&gt;DOM&lt;/abbr&gt; est une &lt;abbr&gt;API&lt;/abbr&gt; extrêmement lente qui peut consommer beaucoup de mémoire si l'on n'y prend pas garde. Ainsi, plus vous avez d'éléments dans votre image, plus son interprétation aura un impact sur les performances. Dans la mesure du possible, essayez toujours de réduire le nombre d'éléments nécessaires pour construire votre image.&lt;/p&gt; &lt;p&gt;Vous pouvez bien sûr toujours vous amuser à faire cette optimisation à la main, mais de vous à moi, ce n'est pas vraiment super &lt;i&gt;folichon&lt;/i&gt; à faire. De ce point de vue, les logiciels de dessin vectoriel comme Adobe Illustrator ou &lt;a href="http://inkscape.org/" class='spip_out' rel='external'&gt;Inkscape&lt;/a&gt; peuvent vous aider de manière assez efficace via les fonctions de « &lt;i&gt;pathfinder&lt;/i&gt; » pour fusionner des formes entre elles ou via les fonctions de simplification des courbes qui vont vous permettre de réduire le nombre de vecteurs d'une image. L'aspect délicat étant alors de trouver le bon point d'équilibre entre le respect du dessin original et la version optimisée.&lt;/p&gt; &lt;p&gt;Deuxièmement, le format XML est un format texte assez verbeux. Concrètement, cela signifie qu'une image SVG est facilement plus lourde qu'une image bitmap du seul fait de son format natif.&lt;/p&gt; &lt;p&gt;Pour éviter ce problème, il vous faut compresser vos images. SVG supporte très bien la compression avec des résultats parfois spectaculaires (il n'est pas rare de voir des taux de compression de l'ordre de 70% à 80% avec une simple compression GZip). Pour cela, vous avez deux options :&lt;/p&gt; &lt;ul class="spip"&gt;&lt;li&gt; produire du SVG compressé via GZip (qu'on identifie souvent avec l'extension .svgz au lieu de .svg)&lt;/li&gt;&lt;li&gt; demander à votre serveur Web de compresser le SVG à la volée lorsqu'il le sert.&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;La première option a l'avantage de réduire la consommation de CPU de votre serveur, tout en permettant de compresser le SVG au maximum, car les calculs de compression sont fait avant même la mise en production de vos fichiers.&lt;/p&gt; &lt;p&gt;De son côté, la deuxième option permet de gérer dynamiquement la compression en se basant sur de la négociation de contenu HTTP, afin de toujours servir aux navigateurs un format de compression qu'ils sont capables de gérer (GZip, Deflate, etc.).&lt;/p&gt; &lt;p&gt;En creux, les avantages de la première méthode sont les inconvénients de la seconde, et vice et versa.&lt;/p&gt; &lt;h3 class='h3 spip'&gt;Configurez votre serveur&lt;/h3&gt;
&lt;p&gt;Point essentiel quand on sert des fichiers SVG, vérifiez toujours que votre serveur Web envoie les en-têtes HTTP qui vont bien. En particulier, vérifiez toujours que le type MIME envoyé est bien &lt;code class='spip_code' dir='ltr'&gt;image/svg+xml&lt;/code&gt;. Sans ça, certains navigateurs refuseront tous simplement d'afficher l'image, et les plus taquins vous afficheront un bel arbre XML lambda !&lt;/p&gt; &lt;p&gt;Si vous servez des fichiers compressés avec GZip, pensez bien à envoyer l'en-tête HTTP qui le signale, sinon, là encore, les navigateurs n'afficheront rien et les plus joueurs vous proposeront de télécharger le fichier.&lt;/p&gt; &lt;p&gt;Si vous utilisez le serveur Apache, il suffit d'ajouter ces deux lignes dans la configuration du &lt;code class='spip_code' dir='ltr'&gt;VirtualHost&lt;/code&gt; (ou dans un fichier &lt;code class='spip_code' dir='ltr'&gt;.htaccess&lt;/code&gt;) :&lt;/p&gt; &lt;pre&gt;&lt;div style='text-align: left;' class='spip_code' dir='ltr'&gt;&lt;code&gt;AddType image/svg+xml svg svgz&lt;br /&gt; AddEncoding gzip svgz&lt;/code&gt;&lt;/div&gt;
&lt;/pre&gt;
&lt;h3 class='h3 spip'&gt;Optimiser SVG lui-même&lt;/h3&gt;
&lt;p&gt;Au niveau du document SVG, il est également possible de réaliser un certain nombre d'optimisations qui peuvent en améliorer les performances.&lt;/p&gt; &lt;p&gt;Un petit avertissement avant de rentrer dans les détails : ces optimisations nécessitent du temps et ne sont pas toujours automatisables. Elles sont donc coûteuses en ressources, or, on sait tous ce que cela implique dans un projet. Prenez donc le temps de peser le pour et le contre avant d'entamer une optimisation du code. Dans la mesure du possible, je vous indiquerai le coût de chacune de ces optimisations.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Réduisez les décimales&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;Les outils de dessins génèrent souvent des fichiers avec une précision trop importante (parfois plus de 6 chiffres après la virgule pour les valeurs chiffrées). Il est assez facile de réduire cette précision sans perte visuelle (2 à 3 chiffres après la virgule).&lt;/p&gt; &lt;p&gt;&lt;i&gt;Coût de l'optimisation&lt;/i&gt; : Faible car facilement automatisable&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Supprimez les balises inutiles&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;Les outils qui génèrent du SVG ont vite tendance à abuser des métadonnées (les balises &lt;code class='spip_code' dir='ltr'&gt;title&lt;/code&gt;, &lt;code class='spip_code' dir='ltr'&gt;desc&lt;/code&gt;, &lt;code class='spip_code' dir='ltr'&gt;metaData&lt;/code&gt;). À moins qu'elles ne soient indispensables pour des questions d'accessibilité ou de référencement, vous pouvez les supprimer sans risque. Le cas des balises &lt;code class='spip_code' dir='ltr'&gt;g&lt;/code&gt; ou &lt;code class='spip_code' dir='ltr'&gt;svg&lt;/code&gt;, qui sont des conteneurs génériques, est un peu plus délicat car leur usage est parfois nécessaire. Il faut donc voir au cas par cas.&lt;/p&gt; &lt;p&gt;&lt;i&gt;Coût de l'optimisation&lt;/i&gt; : Moyen, car même si c'est facilement automatisable, une part de travail manuel peut être nécessaire.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Préférez la balise &lt;code class='spip_code' dir='ltr'&gt;path&lt;/code&gt; aux formes de base&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;La syntaxe de l'attribut &lt;code class='spip_code' dir='ltr'&gt;d&lt;/code&gt; de la balise &lt;code class='spip_code' dir='ltr'&gt;path&lt;/code&gt; est très compacte et s'optimise facilement (en particulier en utilisant les notation de coordonnées relatives), il est donc conseillé de préférer cette balise aux balises des formes de base qui sont souvent plus verbeuses.&lt;/p&gt; &lt;p&gt;&lt;i&gt;Coût de l'optimisation&lt;/i&gt; : Élevé, car elle dépend fortement de votre outillage, de votre savoir-faire et du degrés d'optimisation que vous souhaitez atteindre.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Externalisez les attributs de présentation dans des feuilles de style&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;Certains attributs SVG peuvent s'utiliser &lt;a href="https://developer.mozilla.org/en/SVG/Attribute/#Presentation_attributes" class='spip_out' rel='external'&gt;comme des propriétés CSS&lt;/a&gt;. Ainsi, ils peuvent être facilement externalisés dans des feuilles de styles externes qui seront mises en cache par les navigateurs. Les sélecteurs CSS permettent également de mutualiser facilement les propriétés communes à certains éléments, ce qui limitera la verbosité de SVG.&lt;/p&gt; &lt;p&gt;&lt;i&gt;Coût de l'optimisation&lt;/i&gt; : Moyen, car il repose sur le même outillage et le même savoir faire que pour les pages HTML. Cependant, il nécessite d'être bien pris en amont, surtout si vos fichiers SVG sont volumineux ou générés par des éditeurs d'images qui ne connaissent pas CSS.&lt;/p&gt; &lt;h3 class='h3 spip'&gt;Conclusion&lt;/h3&gt;
&lt;p&gt;Comme toute technologie Web, SVG nécessite un savoir-faire qui lui est propre. Ceci étant, en vous reposant sur vos connaissances en HTML/CSS et en suivant les quelques conseil de cet article, vous pourrez rapidement utiliser SVG dans un contexte de production sans avoir à vous soucier des performances. Amusez-vous bien !&lt;/p&gt;&lt;/div&gt;
		&lt;hr /&gt;
		&lt;div class='rss_notes'&gt;&lt;p&gt;[&lt;a href='#nh2-1' id='nb2-1' class='spip_note' title='Notes 2-1' rev='footnote'&gt;1&lt;/a&gt;] Notez que je ne cite pas Safari, mais c'est la même chose que Chrome. En ce qui concerne IE, il s'agit bien sûr de IE9 ;)&lt;/p&gt;&lt;/div&gt;
		
		</content:encoded>


		

	<feedburner:origLink>http://www.clever-age.com/veille/blog/utiliser-optimiser-et-servir-des-fichiers-svg.html</feedburner:origLink></item>
<item xml:lang="fr">
		<title>PostGIS et son utilisation avec un framework moderne</title>
		<link>http://feeds.clever-age.com/~r/Clever-Age-Blog/~3/p7R2IaLpwb8/postgis-play-framework.html</link>
		<guid isPermaLink="false">http://www.clever-age.com/veille/blog/postgis-play-framework.html</guid>
		<dc:date>2012-02-02T13:07:29Z</dc:date>
		<dc:format>text/html</dc:format>
		<dc:language>fr</dc:language>
		<dc:creator>Paul Mallet</dc:creator>


		<dc:subject>Bases de données</dc:subject>
		<dc:subject>Développement</dc:subject>
		<dc:subject>Géolocalisation</dc:subject>

		<description>
&lt;p&gt;Pour rappel, PostGIS est une extension ajoutant des fonctionnalités géospatiales au systeme de gestion de base de données PostgreSQL, en se basant sur la spécification OpenGIS. Si votre application manipule des repères ou zones géographiques, des objets géométriques ou des distances, c'est donc un outil à ne pas négliger. Malgré ses 10 ans d'existence (dont 6 en version stable), PostGIS reste très peu utilisé dans les projets Web, souvent à cause de son intégration compliquée au sein des différents (...)&lt;/p&gt;


-
&lt;a href="http://www.clever-age.com/veille/blog/" rel="directory"&gt;Notre blog de veille&lt;/a&gt;

/ 
&lt;a href="http://www.clever-age.com/tags/bases-de-donnees" rel="tag"&gt;Bases de données&lt;/a&gt;, 
&lt;a href="http://www.clever-age.com/tags/developpement" rel="tag"&gt;Développement&lt;/a&gt;, 
&lt;a href="http://www.clever-age.com/tags/geolocalisation" rel="tag"&gt;Géolocalisation&lt;/a&gt;

		</description>


 <content:encoded>&lt;div class='rss_chapo'&gt;&lt;p&gt;Pour rappel, PostGIS est une extension ajoutant des fonctionnalités géospatiales au systeme de gestion de base de données PostgreSQL, en se basant sur la spécification &lt;a href="http://www.opengeospatial.org/standards/is" class='spip_out' rel='external'&gt;OpenGIS&lt;/a&gt;. Si votre application manipule des repères ou zones géographiques, des objets géométriques ou des distances, c'est donc un outil à ne pas négliger.&lt;/p&gt;&lt;/div&gt;
		&lt;div class='rss_texte'&gt;&lt;p&gt;Malgré ses 10 ans d'existence (dont 6 en version stable), PostGIS reste très peu utilisé dans les projets Web, souvent à cause de son intégration compliquée au sein des différents frameworks. Nous allons voir ici que ce n'est pourtant pas toujours le cas, en décrivant son installation et son utilisation au sein d'un projet &lt;a href="http://www.playframework.org/" class='spip_out' rel='external'&gt;Play ! Framework&lt;/a&gt;&lt;/p&gt; &lt;h3 class='h3 spip'&gt;Installation &amp; Configuration&lt;/h3&gt;
&lt;p&gt;Les consignes ci-dessous se basent sur la distribution Ubuntu 10.04 et sur la version 8.4 de PostgreSQL, mais l'installation varie assez peu pour les autres distributions et/ou versions, des paquets étant disponibles soit nativement, soit sur internet (voir &lt;a href="http://trac.osgeo.org/postgis/wiki/UsersWikiMain#CompilationandInstallationGuides" class='spip_url spip_out' rel='nofollow external'&gt;http://trac.osgeo.org/postgis/wiki/...&lt;/a&gt; pour plus d'informations).&lt;/p&gt; &lt;p&gt;L'installation se fait grâce à deux paquets :&lt;/p&gt; &lt;p&gt;&lt;code class='spip_code' dir='ltr'&gt;sudo apt-get install postgis&lt;/code&gt;&lt;/p&gt; &lt;p&gt;&lt;code class='spip_code' dir='ltr'&gt;sudo apt-get install postgresql-8.4-postgis&lt;/code&gt;&lt;/p&gt; &lt;p&gt;Une fois ces deux paquets téléchargés, l'installation de PostGIS sur votre machine est terminée. Néanmoins, vous ne pouvez pas encore utiliser ses fonctionnalités avec votre base de données : pour cela, quelques manipulations supplémentaires sont encore nécessaires :&lt;/p&gt; &lt;p&gt;1.Connexion en tant qu'administrateur de serveur PostgreSQL&lt;/p&gt; &lt;p&gt;&lt;code class='spip_code' dir='ltr'&gt;sudo su postgres&lt;/code&gt;&lt;/p&gt; &lt;p&gt;2. Activation du langage PL/SQL sur votre base de données :&lt;/p&gt; &lt;p&gt;&lt;code class='spip_code' dir='ltr'&gt;createlang plpgsql my_geo_database&lt;/code&gt;&lt;/p&gt; &lt;p&gt;3. Ajout des fonctions PostGIS dans la base de données :&lt;/p&gt; &lt;p&gt;&lt;code class='spip_code' dir='ltr'&gt;psql -d my_geo_database -f /usr/share/postgresql/8.4/contrib/postgis-1.5/postgis.sql&lt;/code&gt;&lt;/p&gt; &lt;p&gt;&lt;code class='spip_code' dir='ltr'&gt;psql -d my_geo_database -f /usr/share/postgresql/8.4/contrib/postgis-1.5/spatial_ref_sys.sql&lt;/code&gt;&lt;/p&gt; &lt;p&gt;4. Changer le propriétaire des tables créées (et ainsi les rendre accessibles depuis vos applications)&lt;/p&gt; &lt;p&gt;&lt;code class='spip_code' dir='ltr'&gt;psql my_geo_database -c "ALTER TABLE geometry_columns OWNER TO my_user"&lt;/code&gt;&lt;/p&gt; &lt;p&gt;&lt;code class='spip_code' dir='ltr'&gt;psql my_geo_database -c "ALTER TABLE spatial_ref_sys OWNER TO my_user"&lt;/code&gt;&lt;/p&gt; &lt;p&gt;Ça y est, votre base de donnée est prête ! Voyons maintenant comment l'utiliser dans un projet Play !&lt;/p&gt; &lt;h3 class='h3 spip'&gt;Utilisation dans Play ! Framework&lt;/h3&gt;
&lt;p&gt;Imaginons une application Web répertoriant les célèbres cabines téléphoniques anglaises(lien), et fournissant un certain nombre de services au visiteur, notamment basés sur la géolocalisation.&lt;/p&gt; &lt;p&gt;Une fois le projet Play initialisé, la première étape est de télécharger les quelques librairies (JAR) nécessaires à l'utilisation de PostGIS :&lt;/p&gt; &lt;ul class="spip"&gt;&lt;li&gt; Le &lt;a href="http://repo1.maven.org/maven2/org/postgis/postgis-jdbc/1.3.3/postgis-jdbc-1.3.3.jar" class='spip_out' rel='external'&gt;JAR PostGIS&lt;/a&gt;, fournissant le connecteur JDBC ainsi que les classes utilisables dans l'application.&lt;/li&gt;&lt;/ul&gt;
&lt;ul class="spip"&gt;&lt;li&gt; &lt;a href="http://www.hibernatespatial.org/repository/org/hibernatespatial/hibernate-spatial/1.1/hibernate-spatial-1.1.jar" class='spip_out' rel='external'&gt;Hybernate spatial&lt;/a&gt; et &lt;a href="http://www.hibernatespatial.org/repository/org/hibernatespatial/hibernate-spatial-postgis/1.1/hibernate-spatial-postgis-1.1.jar" class='spip_out' rel='external'&gt;Hybernate spatial postgis&lt;/a&gt;
qui fournissent le dialecte JPA permettant d'utiliser PostGIS conjointement à Hibernate.&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;Une fois les &lt;code class='spip_code' dir='ltr'&gt;JAR&lt;/code&gt; ajoutés au répertoire &lt;code class='spip_code' dir='ltr'&gt;lib/&lt;/code&gt;, réfléchissons à la conception du modèle de l'application. Commençons simplement en créant une classe &lt;code class='spip_code' dir='ltr'&gt;PhoneBox&lt;/code&gt;, avec comme attributs un label, une latitude et une longitude :&lt;/p&gt; &lt;div style='text-align: left;' class='spip_code' dir='ltr'&gt;&lt;code class="java"&gt;public class PhoneBox extends Model {&lt;br /&gt; &lt;br /&gt; public String label;&lt;br /&gt; public double latitude;&lt;br /&gt; public double longitude&lt;br /&gt; &lt;br /&gt; public PhoneBox(String label, double latitude, double longitude) {&lt;br /&gt; this.label = label;&lt;br /&gt; this.latitude = latitude;&lt;br /&gt; this.longitude = longitude;&lt;br /&gt; }&lt;br /&gt; }&lt;/code&gt;&lt;/div&gt;
&lt;p&gt;Une cabine téléphonique est un élément assez petit (sur une carte du moins) pour être considéré comme un point (par opposition aux polygones). Ca tombe bien, PostGIS utilise justement cette notion de Point :&lt;/p&gt; &lt;div style='text-align: left;' class='spip_code' dir='ltr'&gt;&lt;code class="java"&gt;import org.postgis.Point;&lt;br /&gt; &lt;br /&gt; public class PhoneBox extends Model {&lt;br /&gt; &lt;br /&gt; public String label;&lt;br /&gt; public Point location;&lt;br /&gt; &lt;br /&gt; public PhoneBox(String label, double latitude, double longitude) {&lt;br /&gt; this.label = label;&lt;br /&gt; this.location = new Point(longitude, latitude);&lt;br /&gt; }&lt;br /&gt; }&lt;/code&gt;&lt;/div&gt;
&lt;p&gt;Nous avons donc remplacé le couple latitude / longitude par un seul attribut de la classe Point et modifié le constructeur afin d'instancier cet attribut à partir de ces mêmes latitudes et longitudes.&lt;/p&gt; &lt;p&gt;Comme beaucoup d'autres frameworks Java, Play ! se base sur &lt;a href="http://www.hibernate.org/" class='spip_out' rel='external'&gt;Hibernate&lt;/a&gt; pour gérer la persistence des objets en base de données. Malheureusement, Hibernate ne reconnait pas nativement les types utilisés par PostGIS : C'est là que va intervenir la bibliothèque Hibernate Spatial, installée précédemment.&lt;/p&gt; &lt;div style='text-align: left;' class='spip_code' dir='ltr'&gt;&lt;code class="java"&gt;import org.postgis.Point;&lt;br /&gt; &lt;br /&gt; @Entity&lt;br /&gt; @Table(name = "phonebox")&lt;br /&gt; public class PhoneBox extends Model {&lt;br /&gt; &lt;br /&gt; @Column(name = "label", length = 100, nullable = false)&lt;br /&gt; public String label;&lt;br /&gt; &lt;br /&gt; @Column(name = "position", columnDefinition = "GEOMETRY")&lt;br /&gt; @Type(type = "org.hibernatespatial.GeometryUserType")&lt;br /&gt; public Point location;&lt;br /&gt; &lt;br /&gt; // pas de changement au niveau du constructeur&lt;br /&gt; }&lt;/code&gt;&lt;/div&gt;
&lt;p&gt;En plus des annotations usuelles, l'attribut &lt;code class='spip_code' dir='ltr'&gt;columnDefinition&lt;/code&gt; de l'annotation &lt;code class='spip_code' dir='ltr'&gt;@Column&lt;/code&gt; détermine le type du champ en base de données, et l'annotation &lt;code class='spip_code' dir='ltr'&gt;@Type&lt;/code&gt; détermine quand à elle la classe à laquelle Hibernate doit se référer pour gérer la persistance de l'attribut, ainsi que les requêtes HQL le concernant.&lt;/p&gt; &lt;p&gt;Après avoir relancé l'application, on peut voir que la table &lt;code class='spip_code' dir='ltr'&gt;phonebox&lt;/code&gt; a bien été créée dans notre base de données, avec les champs correspondants.&lt;/p&gt; &lt;p&gt;&lt;span class='spip_document_1873 spip_documents spip_documents_center'&gt;
&lt;img src='http://www.clever-age.com/local/cache-vignettes/L468xH69/phonebox_table-2-4310a.png' width='468' height='69' alt="" style='height:69px;width:468px;' /&gt;&lt;/span&gt;&lt;/p&gt; &lt;p&gt;Ajoutons rapidement quelques cabines téléphoniques pour voir leur représentation dans la base de données :&lt;/p&gt; &lt;p&gt;&lt;span class='spip_document_1874 spip_documents spip_documents_center'&gt;
&lt;img src='http://www.clever-age.com/local/cache-vignettes/L468xH162/phonebox_records-7c1e0.png' width='468' height='162' alt="" style='height:162px;width:468px;' /&gt;&lt;/span&gt;&lt;/p&gt; &lt;p&gt;Les objets sont donc correctement enregistrés avec leurs données. On peut remarquer que le champ &lt;code class='spip_code' dir='ltr'&gt;location&lt;/code&gt; est représenté par une chaîne de caractère peu lisible, c'est le cas avec PostGIS pour tous les champs de type &lt;code class='spip_code' dir='ltr'&gt;geometry&lt;/code&gt;.&lt;/p&gt; &lt;p&gt;Une fois nos cabines téléphoniques disponibles, voyons ce que PostGIS nous offre comme possibilités d'utilisations. Une fonctionnalité pourrait par exemple consister à récupérer les &lt;i&gt;n&lt;/i&gt; cabines téléphoniques les plus proches d'une position donnée. Pour cela, nous allons utiliser une requête SQL utilisant les fonctions PL/SQL ajoutées plus tôt :&lt;/p&gt; &lt;div style='text-align: left;' class='spip_code' dir='ltr'&gt;&lt;code class="java"&gt;public static List&lt;PhoneBox&gt; closest(double latitude, double longitude, int nb)&lt;br /&gt; {&lt;br /&gt; TypedQuery&lt;PhoneBox&gt; q = JPA.em().createQuery("SELECT p FROM PhoneBox p ORDER BY ST_DISTANCE(ST_MAKEPOINT(:longitude:latitude,), position)", PhoneBox.class);&lt;br /&gt; &lt;br /&gt; List&lt;PhoneBox&gt; list = q&lt;br /&gt; .setParameter("latitude", latitude)&lt;br /&gt; .setParameter("longitude", longitude)&lt;br /&gt; .setMaxResults(nb)&lt;br /&gt; .getResultList();&lt;br /&gt; &lt;br /&gt; return list;&lt;br /&gt; }&lt;/code&gt;&lt;/div&gt;
&lt;ul class="spip"&gt;&lt;li&gt; La fonction &lt;code class='spip_code' dir='ltr'&gt;ST_MAKEPOINT&lt;/code&gt; sert, comme son nom l'indique, à créer un point à partir des latitude et longitude fournies en arguments ;&lt;/li&gt;&lt;li&gt; la fonction &lt;code class='spip_code' dir='ltr'&gt;ST_DISTANCE&lt;/code&gt;, quant à elle, récupère la distance entre deux objets géométriques (quels qu'ils soient).&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;En ordonnant les résultats de la requête en fonction de cette distance, on obtient bien les cabines attendues. En les affichant sur une carte Google Maps (les latitudes et longitudes sont directement récupérées depuis l'objet Point) :&lt;/p&gt; &lt;p&gt;&lt;span class='spip_document_1872 spip_documents spip_documents_center'&gt;
&lt;img src='http://www.clever-age.com/local/cache-vignettes/L468xH397/phonebox_map-a6854.png' width='468' height='397' alt="" style='height:397px;width:468px;' /&gt;&lt;/span&gt;&lt;/p&gt; &lt;p&gt;Mais PostGIS ne se limite pas seulement au calcul de distances ! Le nombre de fonctions à disposition est assez impressionnant, et couvre énormément de cas d'usages. Pour s'en rendre compte, il suffit de regarder quelques projets où PostGIS a été mis à l'ouvrage :&lt;/p&gt; &lt;ul class="spip"&gt;&lt;li&gt; La &lt;a href="http://hubmaps1.cityofboston.gov/datahub/" class='spip_out' rel='external'&gt;ville de Boston&lt;/a&gt; utilise PostGIS pour stocker ses données "ouvertes" et les rendre disponibles à la consultation :&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;&lt;span class='spip_document_1875 spip_documents spip_documents_center'&gt;
&lt;a href="http://hubmaps1.cityofboston.gov/datahub" class="spip_out"&gt;&lt;img src='http://www.clever-age.com/local/cache-vignettes/L468xH305/boston-4a2ad.png' width='468' height='305' alt="" style='height:305px;width:468px;' /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/p&gt; &lt;ul class="spip"&gt;&lt;li&gt; L'&lt;a href="http://www.ign.fr/" class='spip_out' rel='external'&gt;IGN&lt;/a&gt;, stocke également une partie de son immense base de données sur PostgreSQL/PostGIS, avec des interfaces Web et natives à destination de ses chercheurs :&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;&lt;span class='spip_document_1876 spip_documents spip_documents_center'&gt;
&lt;a href="http://www.postgis.org/documentation/casestudies/ign/" class="spip_out"&gt;&lt;img src='http://www.clever-age.com/local/cache-vignettes/L468xH308/postgis-ign-fd2ee.png' width='468' height='308' alt="" style='height:308px;width:468px;' /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/p&gt; &lt;p&gt;Mais attention, malgré toutes ses qualités, PostGIS n'est pas bon à utiliser dans tous vos projets géospatiaux : dans la plupart des cas (et souvent pour les plus basiques), passer par une API tierce (Google, Bing, OSM...) apportera une simplicité et un découplage bienvenus.&lt;/p&gt; &lt;h3 class='h3 spip'&gt; Futures perspectives &lt;/h3&gt;
&lt;p&gt;Actuellement, la version stable de PostGIS est la 1.5. La version 2 est sur les rails, et apportera son lot de nouveautés, notamment au niveau de la topologie et du support de la 3D, ainsi qu'un nettoyage de rigueur des fonctions dépréciées.&lt;/p&gt; &lt;p&gt;Pour plus d'informations sur cette seconde version, je vous renvoie vers les présentations suivantes ayant eu lieu lors lors de la dernière session PostgreSQL en Juin dernier :&lt;/p&gt; &lt;ul class="spip"&gt;&lt;li&gt; &lt;a href="http://www.postgresql-sessions.org/2/sandro_santilli_-_topology_with_postgis_2.0" class='spip_out' rel='external'&gt;Topology with PostGIS 2.0&lt;/a&gt;&lt;/li&gt;&lt;li&gt; &lt;a href="http://www.postgresql-sessions.org/2/olivier_courtin_et_jonathan_derrough_-_support_3d_de_postgis_2.0" class='spip_out' rel='external'&gt;Support 3D de PostGIS 2.0&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;
		
		</content:encoded>


		

	<feedburner:origLink>http://www.clever-age.com/veille/blog/postgis-play-framework.html</feedburner:origLink></item>
<item xml:lang="fr">
		<title>Web Storage, le stockage de données côté client</title>
		<link>http://feeds.clever-age.com/~r/Clever-Age-Blog/~3/PhDh6tlx88w/web-storage-le-stockage-de-donnees-cote-client.html</link>
		<guid isPermaLink="false">http://www.clever-age.com/veille/blog/web-storage-le-stockage-de-donnees-cote-client.html</guid>
		<dc:date>2012-01-17T13:24:31Z</dc:date>
		<dc:format>text/html</dc:format>
		<dc:language>fr</dc:language>
		<dc:creator>Damien Alexandre</dc:creator>


		<dc:subject>Logiciels libres, Open Source</dc:subject>
		<dc:subject>Javascript</dc:subject>
		<dc:subject>HTML</dc:subject>
		<dc:subject>Clever Age</dc:subject>

		<description>
&lt;p&gt;Les applications Web sont de plus en plus complexes, et utilisent de plus en plus Javascript. Un des points faibles du développement de ces applications est le stockage de données sur le poste du client. Ce problème est résolu avec l'API HTML5 Web Storage. HTML5 change la donne en terme de stockage de données. Alors qu'à une époque, tout ce qui devait être stocké passait par le serveur Web, il est maintenant possible de s'en passer intégralement. Nous faisons déjà du stockage côté client avec les (...)&lt;/p&gt;


-
&lt;a href="http://www.clever-age.com/veille/blog/" rel="directory"&gt;Notre blog de veille&lt;/a&gt;

/ 
&lt;a href="http://www.clever-age.com/tags/logiciels-libres-open-source" rel="tag"&gt;Logiciels libres, Open Source&lt;/a&gt;, 
&lt;a href="http://www.clever-age.com/tags/javascript" rel="tag"&gt;Javascript&lt;/a&gt;, 
&lt;a href="http://www.clever-age.com/tags/html" rel="tag"&gt;HTML&lt;/a&gt;, 
&lt;a href="http://www.clever-age.com/les-marques/clever-age,178" rel="tag"&gt;Clever Age&lt;/a&gt;

		</description>


 <content:encoded>&lt;div class='rss_chapo'&gt;&lt;p&gt;Les applications Web sont de plus en plus complexes, et utilisent de plus en plus Javascript. Un des points faibles du développement de ces applications est le stockage de données sur le poste du client. Ce problème est résolu avec l'API HTML5 Web Storage.&lt;/p&gt;&lt;/div&gt;
		&lt;div class='rss_texte'&gt;&lt;dl class='spip_document_1864 spip_documents spip_documents_left' style='float:left;'&gt;
&lt;dt&gt;&lt;img src='http://www.clever-age.com/local/cache-vignettes/L256xH256/html5_offiline_storage_256-4ea87.png' width='256' height='256' alt='PNG - 3.1 ko' style='height:256px;width:256px;' /&gt;&lt;/dt&gt;
&lt;dt class='crayon document-titre-1864 spip_doc_titre' style='width:256px;'&gt;&lt;strong&gt;Logo Web Storage&lt;/strong&gt;&lt;/dt&gt;
&lt;/dl&gt;
&lt;p&gt; HTML5 change la donne en terme de stockage de données. Alors qu'à une époque, tout ce qui devait être stocké passait par le serveur Web, il est maintenant possible de s'en passer intégralement.&lt;/p&gt; &lt;p&gt;Nous faisons déjà du stockage côté client avec les cookies, mais ils sont limités à 4Ko et ont quelques défauts (sécurité, difficultés à gérer le multi-tab...). Web Storage est bien plus puissant et facile à manipuler.&lt;/p&gt; &lt;h3 class='h3 spip'&gt;Les différentes technologies de stockage&lt;/h3&gt;
&lt;p&gt;Le Web Storage a déjà fait couler beaucoup d'encre et 3 standards sont apparus :&lt;/p&gt; &lt;ul class="spip"&gt;&lt;li&gt; &lt;a href="http://dev.w3.org/html5/webstorage/" class='spip_out' rel='external'&gt;Web Storage&lt;/a&gt; qui nous intéresse aujourd'hui, il permet de stocker des chaînes de caractères sous une clé alphanumérique ;&lt;/li&gt;&lt;li&gt; &lt;a href="http://dev.w3.org/html5/webdatabase/" class='spip_out' rel='external'&gt;Web SQL Database&lt;/a&gt; qui porte une vraie base de donnée relationnelle dans le navigateur (mais qui a été abandonné par le W3C) ;&lt;/li&gt;&lt;li&gt; &lt;a href="http://www.w3.org/TR/IndexedDB/" class='spip_out' rel='external'&gt;Indexed Database&lt;/a&gt; qui est un peu entre les deux. Il permet aussi le stockage de clé / valeurs mais est indéxé comme une base de donnée et rend donc possible des recherches sur valeur (sans devoir itérer sur tous les enregistrements comme avec Web Storage).&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;Web Storage est la seule des trois à être déjà disponible relativement partout :&lt;/p&gt; &lt;p&gt;&lt;iframe width="500" height="410" src="http://caniuse.com/namevalue-storage/embed/stats=none"&gt;&lt;/iframe&gt;&lt;/p&gt; &lt;p&gt;Vous pouvez &lt;a href="http://html5demos.com/storage" class='spip_out' rel='external'&gt;faire le test sur cette petit démo&lt;/a&gt;.&lt;/p&gt; &lt;h3 class='h3 spip'&gt;Web Storage, comment ça marche&lt;/h3&gt;
&lt;p&gt;Le principe est vraiment très simple : c'est un stockage sous la forme clé / valeur. Il y en a deux différents :&lt;/p&gt; &lt;ul class="spip"&gt;&lt;li&gt; stockage uniquement pour la durée de la session (et uniquement pour cette instance du site, &lt;strong&gt;un autre onglet sur la même page n'est pas affecté&lt;/strong&gt;) ;&lt;/li&gt;&lt;li&gt; stockage permanent.&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;Pour chacun de ces stockages, on a un objet manipulable, respectivement &lt;strong&gt;sessionStorage&lt;/strong&gt; et &lt;strong&gt;localStorage&lt;/strong&gt;. Les deux objets exposent la même API.&lt;/p&gt; &lt;script src="https://gist.github.com/1507857.js?file=gistfile1.js"&gt;&lt;/script&gt;
&lt;p&gt;C'est tout ce dont vous avez besoin pour utiliser le stockage côté client.&lt;/p&gt; &lt;p&gt;Les navigateurs les plus récents ont déjà ajouté à leurs outils d'inspection de quoi manipuler les données stockées avec Web Storage :&lt;/p&gt; &lt;dl class='spip_document_1867 spip_documents spip_documents_center'&gt;
&lt;dt&gt;&lt;img src='http://www.clever-age.com/local/cache-vignettes/L402xH196/chrome-8736d.png' width='402' height='196' alt='PNG - 19.8 ko' style='height:196px;width:402px;' /&gt;&lt;/dt&gt;
&lt;dt class='crayon document-titre-1867 spip_doc_titre' style='width:350px;'&gt;&lt;strong&gt;L'inspecteur de Chrome&lt;/strong&gt;&lt;/dt&gt;
&lt;/dl&gt;
&lt;dl class='spip_document_1868 spip_documents spip_documents_center'&gt;
&lt;dt&gt;&lt;img src='http://www.clever-age.com/local/cache-vignettes/L489xH132/firefox-ea362.png' width='489' height='132' alt='PNG - 13.9 ko' style='height:132px;width:489px;' /&gt;&lt;/dt&gt;
&lt;dt class='crayon document-titre-1868 spip_doc_titre' style='width:350px;'&gt;&lt;strong&gt;Firebug dans Firefox&lt;/strong&gt;&lt;/dt&gt;
&lt;/dl&gt;
&lt;h3 class='h3 spip'&gt;Nous pouvons l'utiliser alors ?&lt;/h3&gt;
&lt;p&gt;Comme nous avons pu vous le montrer en introduction, certains navigateurs encore très présents (IE7) ne supportent pas &lt;strong&gt;localStorage&lt;/strong&gt;. Heureusement pour nous &lt;a href="https://github.com/TrippingTheBits/webStorage" class='spip_out' rel='external'&gt;un plugin jQuery existe&lt;/a&gt; ! Il utilise alors &lt;a href="http://www.clever-age.com/veille/publications/fiches-produits/gears.html" class='spip_out'&gt;Gears&lt;/a&gt;, &lt;a href="http://msdn.microsoft.com/en-us/library/ms531424(v=vs.85).aspx" class='spip_out' rel='external'&gt;userData&lt;/a&gt; (sous IE) ou en dernier recours, les cookies. C'est une solution complète qui doit encore faire ses preuves mais qui pose déjà une bonne base. Comme toute nouvelle technologie, c'est en fonction de vos besoins et de vos visiteurs que le choix doit se faire - si comme Facebook vous décidez de ne plus supporter IE7 [&lt;a href='#nb1' class='spip_note' rel='footnote' title='La Timeline de Facebook n'est pas compatible avec le navigateur de (...)' id='nh1'&gt;1&lt;/a&gt;], ou si vous développez un site mobile uniquement, vous êtes alors prêt à utiliser Web Storage !&lt;/p&gt; &lt;p&gt;Voici quelques raisons justifiant l'utilisation de Web Storage dans le développement d'applications :&lt;/p&gt; &lt;ul class="spip"&gt;&lt;li&gt; permettre à l'application de fonctionner en mode hors-ligne (stocker les données saisies en local et les synchroniser avec le serveur une fois connecté) ;&lt;/li&gt;&lt;li&gt; améliorer les performances (mettre en cache des données) ;&lt;/li&gt;&lt;li&gt; se passer d'un développement serveur ;&lt;/li&gt;&lt;li&gt; stocker par instance et non par domaine (contrairement aux cookies) ;&lt;/li&gt;&lt;li&gt; ne pas transmettre les données sur le réseau (contrairement aux cookies encore une fois) ;&lt;/li&gt;&lt;li&gt; disposer d'un espace de stockage important (5 Mo).&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;Certains points négatifs sont aussi à prendre en compte :&lt;/p&gt; &lt;ul class="spip"&gt;&lt;li&gt; les données stockées sont vulnérables (visibles et modifiables par le client) ;&lt;/li&gt;&lt;li&gt; elles sont stockées dans un seul navigateur et il n'est donc pas possible d'y accéder depuis un autre ordinateur ou navigateur.&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;Quoi qu'il en soit, nous avons &lt;strong&gt;un nouveau jouet&lt;/strong&gt; qui marche déjà un peu partout - il est temps de repenser notre approche du stockage côté client en prenant sérieusement en compte cette nouvelle fonctionnalité des navigateurs.&lt;/p&gt;&lt;/div&gt;
		&lt;hr /&gt;
		&lt;div class='rss_notes'&gt;&lt;p&gt;[&lt;a href='#nh1' id='nb1' class='spip_note' title='Notes 1' rev='footnote'&gt;1&lt;/a&gt;] La Timeline de Facebook &lt;a href="http://thenextweb.com/facebook/2011/12/30/not-a-fan-of-timeline-on-facebook-use-ie7-facebook-stopped-supporting-it/" class='spip_out' rel='external'&gt;n'est pas compatible&lt;/a&gt; avec le navigateur de Microsoft.&lt;/p&gt;&lt;/div&gt;
		
		</content:encoded>


		

	<feedburner:origLink>http://www.clever-age.com/veille/blog/web-storage-le-stockage-de-donnees-cote-client.html</feedburner:origLink></item>



</channel>

</rss>

