<?xml version="1.0" encoding="utf-8"?><?xml-stylesheet title="XSL formatting" type="text/xsl" href="http://jeremie.patonnier.net/feed/rss2/xslt" ?><rss version="2.0"
  xmlns:dc="http://purl.org/dc/elements/1.1/"
  xmlns:wfw="http://wellformedweb.org/CommentAPI/"
  xmlns:content="http://purl.org/rss/1.0/modules/content/"
  xmlns:atom="http://www.w3.org/2005/Atom">
<channel>
  <title>Chez Jérémie - Mot-clé - Firefox</title>
  <link>http://jeremie.patonnier.net/</link>
  <atom:link href="http://jeremie.patonnier.net/feed/tag/Firefox/rss2" rel="self" type="application/rss+xml"/>
  <description>Chez Jérémie, parfois c'est sérieux, parfois non !</description>
  <language>fr</language>
  <pubDate>Tue, 04 Jul 2017 19:32:17 +0200</pubDate>
  <copyright>Creative Commons BY-NC-SA 2.0 Fr</copyright>
  <docs>http://blogs.law.harvard.edu/tech/rss</docs>
  <generator>Dotclear</generator>

  
  <item>
    <title>Des effets pour le Web</title>
    <link>http://jeremie.patonnier.net/post/2012/01/12/Des-effets-pour-le-Web</link>
    <guid isPermaLink="false">urn:md5:16a6f2bb353a700e14ca0bed0405a292</guid>
    <pubDate>Thu, 12 Jan 2012 09:00:00 +0100</pubDate>
    <dc:creator>Jeremie</dc:creator>
        <category>Web</category>
        <category>CSS</category><category>Firefox</category><category>Internet Explorer</category><category>SVG</category><category>webdesign</category><category>Webkit</category>
    <description>&lt;p&gt;Cet article est la traduction d&amp;#8217;&lt;a hreflang=&quot;en&quot; href=&quot;http://drublic.de/blog/effects-for-the-web/&quot;&gt;un article de Christian «&amp;#160;Schepp&amp;#160;» Schaefer&lt;/a&gt; à propos des nouvelles propriétés de filtres CSS3 et montre comment commencer à les utiliser tout en proposant des solution de repli basées sur ce que supportent les navigateurs actuels.&lt;/p&gt;    &lt;p&gt;A la fin des années 90, CSS 2.1 nous a fourni un ensemble d&amp;#8217;outils de base pour pouvoir enfin se débarrasser des mises en page en tableaux. Maintenant c&amp;#8217;est le tour de CSS3 qui nous donne de nouveaux outils plus précis pour gérer les détails de mise en forme&amp;#160;: Les fontes embarquées, les coins arrondis, les dégradés, la transparence des éléments et des couleurs, les ombre portées sur le texte et les boites, etc.&lt;/p&gt;
&lt;p&gt;Évidement, lorsqu&amp;#8217;on compare notre outillage à celui de logiciels comme Photoshop, on se dit qu&amp;#8217;on pourrait rêver mieux. Ce genre de logiciel permet, par exemple, de désaturer une image ou bien de la rendre plus nette ou plus floue. Pourquoi aurions-nous besoin de ce genre d&amp;#8217;outil pour le Web&amp;#160;? Et bien, désaturer ou flouter une partie de page Web peut être un moyen de guider le regard de vos visiteurs sur des zones choisies. Ça pourrais aussi aider vos visiteurs à concentrer leur attention sur les zones qui n&amp;#8217;ont pas été modifiées. Par exemple, on peut utiliser ce genre d&amp;#8217;effets pour mettre en scène une galerie d&amp;#8217;images&amp;#160;:&lt;/p&gt;
&lt;p&gt;&lt;a hreflang=&quot;en&quot; href=&quot;http://mikematas.com/#%21g9/2nLk/photos/one_week_in_japan_-_3_of_5&quot;&gt;&lt;img title=&quot;Mike Matas - One Week In Japan&quot; alt=&quot;Mike Matas - One Week In Japan&quot; src=&quot;http://jeremie.patonnier.net/public/web-effect/Mike-Matas-One-Week-In-Japan.png&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;D&amp;#8217;un autre coté, un effet de netteté peut être utile lorsque vous réduisez une image dans le navigateur. Sans lui, vous allez perdre un certain nombre de détails sur cette image.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&quot;sharpen.jpg&quot; src=&quot;http://jeremie.patonnier.net/public/web-effect/sharpen.jpg&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Voila, ce serait génial si nous pouvions avoir ce genre d&amp;#8217;effets à notre disposition, un peu comme la propriété CSS &lt;code&gt;opacity&lt;/code&gt; qui nous permet de rendre un élément transparent. Malheureusement, ce n&amp;#8217;est pas le cas.&lt;/p&gt;
&lt;h2&gt;Le &lt;em&gt;status quo&lt;/em&gt; actuel&lt;/h2&gt;
&lt;p&gt;Au lieu de cela, pour simuler un effet de désaturation/niveau de gris nous sommes actuellement obligés de passer en revue «&amp;#160;à la main&amp;#160;», via Javascript, toutes les propriétés utilisant de la couleur sur un éléments donnée pour leur attribuer la valeur de gris que l&amp;#8217;on veut. Dès que l&amp;#8217;on doit faire face à des images ou de la vidéo, c&amp;#8217;est encore plus compliqué&amp;#160;: Dans ce cas-là, nous avons besoin de nous appuyer sur la balise &lt;a hreflang=&quot;en&quot; href=&quot;http://spyrestudios.com/html5-canvas-image-effects-black-white/&quot;&gt;Canvas de HTML5 pour pouvoir changer leur couleur pixel par pixel&lt;/a&gt; puis pour remplacer l&amp;#8217;élément d&amp;#8217;origine. Même si nous nous appuyons sur des bibliothèques tel que &lt;a hreflang=&quot;en&quot; href=&quot;http://camanjs.com/examples&quot;&gt;CamanJS&lt;/a&gt; ou &lt;a hreflang=&quot;en&quot; href=&quot;http://www.iliasiovis.com/hoverizr/&quot;&gt;Hoverizr&lt;/a&gt;, ça reste quand même un truc assez sale.&lt;/p&gt;
&lt;p&gt;Un effet de flou peut également être simulé à l&amp;#8217;aide des propriétés &lt;a hreflang=&quot;de&quot; href=&quot;http://webstandard.kulando.de/post/2011/12/09/css3-text-shadow-erzeugt-blur-effekt-tag-10-im-css3-adventskalender-2011&quot;&gt;text-shadow&lt;/a&gt; et &lt;a hreflang=&quot;en&quot; href=&quot;http://tympanus.net/codrops/2011/12/14/item-blur-effect-with-css3-and-jquery/&quot;&gt;box-shadow&lt;/a&gt; en leur appliquant la même couleur que le texte ou l&amp;#8217;arrière-plan auquel elles se rapportent. Le problème, c&amp;#8217;est que cette illusion ne fonctionnera pas avec les boîtes multicolores non plus qu&amp;#8217;avec les images ou les vidéos comme précédemment. Une fois de plus, il faudra se reposer sur des manipulation à base de Canvas HTML5. Arf!&lt;/p&gt;
&lt;p&gt;&lt;a hreflang=&quot;en&quot; href=&quot;http://tympanus.net/codrops/2011/12/14/item-blur-effect-with-css3-and-jquery/&quot;&gt;&lt;img alt=&quot;Item Blur Effect with CSS3 and jQuery&quot; src=&quot;http://jeremie.patonnier.net/public/web-effect/Item-Blur-Effect-with-CSS3-and-jQuery-Google-Chrome_2011-12-18_11-37-58.png&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Á propos de la balise Canvas: La bibliothèque &lt;a hreflang=&quot;en&quot; href=&quot;https://github.com/pmura/blurry.js&quot;&gt;blurry.js&lt;/a&gt; propose une solution particulièrement brutale à cette histoire de flou. Elle va extraire tout le contenu à flouter, va le recréer dans une balise Canvas (en utilisant partiellement Cufón), va le flouter et enfin va réinjecter le tout à l&amp;#8217;emplacement de l’original.&lt;/p&gt;
&lt;p&gt;En ce qui concerne la netteté, il n&amp;#8217;existe actuellement aucun truc basé sur CSS pour réaliser un tel effet, ce qui nous laisse une fois de plus seul face à la balise Canvas.&lt;/p&gt;
&lt;h2&gt;SVG à la rescousse&lt;/h2&gt;
&lt;p&gt;Il est intéressant de noter que SVG connaît la notion de &lt;a hreflang=&quot;en&quot; href=&quot;http://electricbeach.org/?p=950&quot;&gt;filtres&lt;/a&gt; depuis des lustres avec, entre autre, les mélanges de couleurs, l&amp;#8217;ajustement de la luminosité et du contraste, les effets d&amp;#8217;éclairage, le «&amp;#160;&lt;em lang=&quot;en&quot;&gt;displacement mapping&lt;/em&gt;&amp;#160;», les flous gaussien et de déplacement, le bruit, la netteté, etc.&lt;/p&gt;
&lt;p&gt;Ainsi, maintenant que SVG est de plus en plus largement supporté, nous pourrions essayer de placer nos contenus, non plus dans du HTML, mais plutôt dans du SVG que l&amp;#8217;on placerait dans du HTML. Nous serions alors capables d&amp;#8217;&lt;a hreflang=&quot;en&quot; href=&quot;http://dev.opera.com/articles/view/how-to-do-photoshop-like-effects-in-svg/&quot;&gt;appliquer n&amp;#8217;importe quel effet à notre contenu&lt;/a&gt;. Le problème, c&amp;#8217;est que la plupart des intégrateurs HTML risquent de ne pas être très chauds pour se mettre à produire du balisage SVG de ce genre&amp;#160;:&lt;/p&gt;
&lt;pre class=&quot;sh_xml&quot;&gt;&amp;lt;text font-family=&quot;Arial&quot; font-weight=&quot;900&quot; font-size=&quot;40&quot; x=&quot;20&quot; y=&quot;55%&quot;&amp;gt;SVG Example&amp;lt;/text&amp;gt;&lt;/pre&gt;&lt;p&gt;Il existe un truc un peu plus sympa en SVG, c&amp;#8217;est la balise &lt;code&gt;foreignObject&lt;/code&gt;. &lt;a hreflang=&quot;en&quot; href=&quot;http://ajaxian.com/archives/foreignobject-hey-youve-got-html-in-my-svg&quot;&gt;Elle nous permet d&amp;#8217;inclure n&amp;#8217;importe quel type de balisage à l’intérieur d&amp;#8217;un contenu SVG&lt;/a&gt;. C&amp;#8217;est un peu comme mettre du SVG directement dans un document HTML5, mais dans l&amp;#8217;autre sens. Dès que vous avez inclus vos trucs dans du SVG, vous pouvez y appliquer des filtres comme vous le feriez pour n&amp;#8217;importe qu&amp;#8217;elle autre partis de votre contenu SVG. &lt;a hreflang=&quot;en&quot; href=&quot;http://dev.opera.com/articles/view/applying-color-tints-to-web-pages-with-s/&quot;&gt;Vous pouvez embarquer une page HTML entière et lui appliquer des filtres&lt;/a&gt;, ou &lt;a href=&quot;http://www.flother.com/examples/canvas-blur/v4/blur.svg&quot;&gt;vous restreindre à une simple image bitmap&lt;/a&gt;. Bien sûr, vous devez mettre votre contenu SVG lui-même dans une page HTML, ce qui peut conduire à quelques migraines (du HTML embarqué dans du SVG embarqué dans du HTML). Le support navigateur pour la balise &lt;code&gt;foreignObject&lt;/code&gt; est &lt;a hreflang=&quot;en&quot; href=&quot;http://caniuse.com/#feat=svg-html&quot;&gt;plutôt bon&lt;/a&gt;. Seul Internet Explorer reste à la traine. Heureusement, Internet Explorer 10 va rattraper le coup en supportant à la fois les filtres SVG et la balise &lt;code&gt;foreignObject&lt;/code&gt;.&lt;/p&gt;
&lt;h2&gt;Les filtres SVG sur du contenu HTML via CSS&lt;/h2&gt;
&lt;p&gt;Depuis sa version 3.5, Firefox va encore plus loin. Il vous permet d&amp;#8217;appliquer un filtre SVG, défini dans un document externe, à n&amp;#8217;importe quel contenu HTML en passant simplement par une feuille de style. Nous pouvons, par exemple, définir dans un document SVG un filtre de flou gaussien (feGaussianBlur) ayant un rayon de 2 pixels et lui donner l&amp;#8217;identifiant &lt;code&gt;gaussian_blur&lt;/code&gt;&amp;#160;:&lt;/p&gt;
&lt;pre class=&quot;sh_xml&quot;&gt;&amp;lt;?xml version=&quot;1.0&quot; standalone=&quot;no&quot;?&amp;gt;&lt;br /&gt;&amp;lt;!DOCTYPE svg PUBLIC &quot;-//W3C//DTD SVG 1.1//EN&quot; &lt;br /&gt;&quot;http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd&quot;&amp;gt;&lt;br /&gt;&amp;lt;svg width=&quot;1&quot; height=&quot;1&quot; version=&quot;1.1&quot; &lt;br /&gt;xmlns=&quot;http://www.w3.org/2000/svg&quot; &lt;br /&gt;xmlns:xlink=&quot;http://www.w3.org/1999/xlink&quot;&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;defs&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;filter id=&quot;gaussian_blur&quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;feGaussianBlur in=&quot;SourceGraphic&quot; stdDeviation=&quot;2&quot; /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/filter&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;/defs&amp;gt;&lt;br /&gt;&amp;lt;/svg&amp;gt;&lt;/pre&gt;&lt;p&gt;On peut alors référencer ce filtre à l&amp;#8217;aide du nom du fichier SVG et de son l&amp;#8217;identifiant au sein de notre feuille de style pour l&amp;#8217;appliquer à toutes les images&amp;#160;:&lt;/p&gt;
&lt;pre class=&quot;sh_css&quot;&gt;img {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; filter: url(blur.svg#gaussian_blur);&lt;br /&gt;}&lt;/pre&gt;&lt;p&gt;&lt;img alt=&quot;&quot; src=&quot;http://jeremie.patonnier.net/public/web-effect/Unscha_rfe-via-CSS-Filter-SVG-Mozilla-Firefox_2011-12-18_21-18-59.png&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Vous pouvez voir cette &lt;a hreflang=&quot;en&quot; href=&quot;http://jeremie.patonnier.net/public/web-effect/blur/blur.html&quot;&gt;démo en &lt;em lang=&quot;en&quot;&gt;live&lt;/em&gt; ici&lt;/a&gt;. Hélas, comme je vous le disais, ça ne fonctionne qu&amp;#8217;avec Firefox.&lt;/p&gt;
&lt;p&gt;Bien heureusement, ce n&amp;#8217;est pas la fin de l&amp;#8217;histoire. Internet Explorer connaît lui aussi les filtres. Ceux-ci ne sont pas basés sur SVG, mais sur des mécanismes propres à la bibliothèque graphique de Windows&amp;#160;: DirectX. Parmi ces filtres certains sont bien connus pour nous aider à résoudre certains bugs (le filtre alpha pour les image PNG) ou pour imiter certaines fonctionnalités de CSS3 (le filtre des dégradé). Néanmoins, il en existes d&amp;#8217;autres très similaires aux filtres SVG&amp;#160;:&lt;/p&gt;
&lt;pre class=&quot;sh_css&quot;&gt;/* Flou de 2 pixels de rayon */&lt;br /&gt;filter: progid:DXImageTransform.Microsoft.Blur(pixelradius=2);&lt;br /&gt;/* Flou de mouvement de 13 pixel avec un angle de 310° */&lt;br /&gt;filter: progid:DXImageTransform.Microsoft.MotionBlur(strength=13, direction=310);&lt;br /&gt;/* niveau de gris / désaturation */&lt;br /&gt;filter: gray;&lt;br /&gt;/* Effet « Rayon X » (inversion des niveaux de gris) */&lt;br /&gt;filter: xray;&lt;br /&gt;/* cône de lumière */&lt;br /&gt;filter: light();&lt;br /&gt;/* Extrusion */&lt;br /&gt;filter: progid:DXImageTransform.Microsoft.emboss();&lt;/pre&gt;&lt;p&gt;Vous trouverez une liste complète de ces filtres ici&amp;#160;: &lt;a hreflang=&quot;en&quot; href=&quot;http://msdn.microsoft.com/en-us/library/ms673539%28v=VS.85%29.aspx&quot;&gt;http://msdn.microsoft.com/en-us/library/ms673539(v=VS.85).aspx&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Ainsi, à l&amp;#8217;aide de commentaires conditionnels, nous pouvons désormais proposer un certain nombre d&amp;#8217;effets à deux familles de navigateurs qui à elles deux représente une part non négligeable du marché&amp;#160;:&lt;/p&gt;
&lt;pre class=&quot;sh_html&quot;&gt;&amp;lt;!DOCTYPE HTML&amp;gt;&lt;br /&gt;&amp;lt;!--[if lte IE 9]&amp;gt; &amp;lt;html class=&quot;ie&quot; lang=&quot;en&quot;&amp;gt; &amp;lt;![endif]--&amp;gt;&lt;br /&gt;&amp;lt;!--[if gt IE 9]&amp;gt;&amp;lt;!--&amp;gt; &amp;lt;html lang=&quot;en&quot;&amp;gt; &amp;lt;!--&amp;lt;![endif]--&amp;gt;&lt;br /&gt;&amp;lt;head&amp;gt;&lt;br /&gt;&amp;lt;meta charset=&quot;utf-8&quot;&amp;gt;&lt;br /&gt;&amp;lt;title&amp;gt;Blur via CSS&amp;lt;/title&amp;gt;&lt;br /&gt;&amp;lt;style&amp;gt;&lt;br /&gt;img {&lt;br /&gt;&amp;nbsp; filter: url(blur.svg#gaussian_blur);&lt;br /&gt;}&lt;br /&gt;.ie img {&lt;br /&gt;&amp;nbsp; margin: -2px;&lt;br /&gt;&amp;nbsp; filter: progid:DXImageTransform.Microsoft.blur(pixelradius=2);&lt;br /&gt;&amp;nbsp; zoom: 1;&lt;br /&gt;}&lt;br /&gt;&amp;lt;/style&amp;gt;&lt;br /&gt;&amp;lt;/head&amp;gt;&lt;br /&gt;&amp;lt;body&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;img src=&quot;http://jeremie.patonnier.net/post/2012/01/12/stadt.jpg&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp; alt=&quot;Some rights reserved by zigazou76&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp; width=&quot;500&quot; height=&quot;333&quot;&amp;gt;&lt;br /&gt;&amp;lt;/body&amp;gt;&lt;br /&gt;&amp;lt;/html&amp;gt;&lt;/pre&gt;&lt;p&gt;&lt;em&gt;&lt;code&gt;margin: -2px&lt;/code&gt; permet de contre balancer le changement de dimension de l&amp;#8217;image provoqué par le filtre. &lt;code&gt;zoom: 1&lt;/code&gt; est necessaire pour que la plupart des filtres fonctionnent avec in IE6/7. Malheureusement, IE10 ne supporte plus les filtres propriétaires de Microsoft et n&amp;#8217;autorise pas encore les filtres SVG sur du contenu HTML &lt;img src=&quot;/themes/default/smilies/sad.png&quot; alt=&quot;:(&quot; class=&quot;smiley&quot; /&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;a hreflang=&quot;en&quot; href=&quot;http://jeremie.patonnier.net/public/web-effect/blur/blur2.html&quot;&gt;Vous trouverez ici la version modifié de l&amp;#8217;exemple&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Un certain nombre de personnes ont apprécié l&amp;#8217;idée de Firefox d&amp;#8217;ouvrir les filtres SVG au contenu HTML. Ils ont donc formé un nouveau groupe au W3C appelé &lt;em lang=&quot;en&quot;&gt;W3C FX Task Force&lt;/em&gt; dont l&amp;#8217;objectif est de standardiser et simplifier l&amp;#8217;usage des filtres SVG dans tous les navigateurs. Puisque Firefox avait défriché le terrain des filtres d&amp;#8217;effets, le premier brouillon de spécification est vite arrivé sous le nom de &lt;a style=&quot;font-style: italic;&quot; href=&quot;https://dvcs.w3.org/hg/FXTF/raw-file/tip/filters/index.html&quot; target=&quot;_blank&quot;&gt;W3C Filter Effects 1.0&lt;/a&gt;. Les mécanismes proposés dans ce brouillon fonctionnent à peu près comme dans Firefox tout en offrant en plus un certain nombre de raccourcis vers les effets les plus intéressants. Les filtres bénéficiant d&amp;#8217;un raccourci fonctionnent sans l&amp;#8217;aide d&amp;#8217;un fichier SVG externe. Ils sont directement codés au cœur du navigateur. Les raccourcis en question sont&amp;#160;:&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;grayscale&lt;/li&gt;
&lt;li&gt;sepia&lt;/li&gt;
&lt;li&gt;saturate&lt;/li&gt;
&lt;li&gt;hue-rotate&lt;/li&gt;
&lt;li&gt;invert&lt;/li&gt;
&lt;li&gt;opacity&lt;/li&gt;
&lt;li&gt;brightness&lt;/li&gt;
&lt;li&gt;contrast&lt;/li&gt;
&lt;li&gt;blur&lt;/li&gt;
&lt;li&gt;drop-shadow&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Un autre avantage de ces raccourcis, c&amp;#8217;est qu&amp;#8217;ils peuvent être animés via les transformations et les animations CSS&amp;#160;:&lt;/p&gt;
&lt;pre class=&quot;sh_css&quot;&gt;.foo {&lt;br /&gt;&amp;nbsp; filter: blur(2px);&lt;br /&gt;&amp;nbsp; transition: filter 1s ease-in-out;&lt;br /&gt;}&lt;br /&gt;&amp;nbsp;&lt;br /&gt;.foo:hover {&lt;br /&gt;&amp;nbsp; filter: blur(0);&lt;br /&gt;}&lt;/pre&gt;&lt;p&gt;Ce serait plus difficile et moins efficace de réaliser cela dans un document SVG.&lt;/p&gt;
&lt;p&gt;Pour finir, les effets de filtre prévois d&amp;#8217;être enrichie à l&amp;#8217;aide des &lt;a hreflang=&quot;en&quot; href=&quot;http://www.adobe.com/devnet/html5/articles/css-shaders.html&quot;&gt;&lt;em lang=&quot;en&quot;&gt;vertex shaders&lt;/em&gt; et &lt;em lang=&quot;en&quot;&gt;fragment shaders&lt;/em&gt; d&amp;#8217;OpenGL/WebGL&lt;/a&gt;. Les &lt;em lang=&quot;en&quot;&gt;vertex shaders&lt;/em&gt; permettront d&amp;#8217;appliquer un maillage 2D sur un élément que vous pourrez alors déformer en déplaçant tous les points du maillage selon une formule mathématique de votre choix. Les &lt;em lang=&quot;en&quot;&gt;fragment shaders&lt;/em&gt; d&amp;#8217;un autre côté permettront de réaliser ces transformations mathématiques sur les couleurs de chacun des pixels de cet élément. Ces deux types de filtres bénéficieront en plus de l’accélération matérielle de votre carte graphique.&lt;/p&gt;
&lt;p&gt;&lt;a hreflang=&quot;en&quot; href=&quot;http://www.adobe.com/devnet/html5/articles/css-shaders.html&quot;&gt;&lt;img alt=&quot;CSS shaders Cinematic effects for the web&quot; src=&quot;http://jeremie.patonnier.net/public/web-effect/CSS-shaders-Cinematic-effects-for-the-web-Adobe-Developer-Connection-Google_2011-12-18_19-31-01.png&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Par un heureux hasard, il y a quelques semaines les premières implémentations de ces filtres sont apparues dans les &lt;a hreflang=&quot;en&quot; href=&quot;http://nightly.webkit.org/&quot;&gt;compilations nocturnes de Webkit&lt;/a&gt; et sont à présent disponibles dans &lt;a hreflang=&quot;en&quot; href=&quot;http://tools.google.com/dlpage/chromesxs&quot;&gt;Chrome Canary&lt;/a&gt;. Ça veut dire que d&amp;#8217;ici 3 mois les filtres CSS seront disponibles dans la version stable de Chrome et à brève échéance dans Safari. Ça veut également dire que nous ne sommes pas loin de pouvoir commencer à utiliser des filtres CSS sur 90 à 95% du marché des navigateurs&amp;#160;!&lt;/p&gt;
&lt;p&gt;Si l&amp;#8217;on en revient à notre exemple, tout ce que nous avons à faire pour supporter Webkit est de rajouter un simple &lt;code&gt;-webkit-filter: blur(2px);&lt;/code&gt;. Néanmoins, il faudra faire attention de le placer &lt;strong&gt;après&lt;/strong&gt; la propriété &lt;code&gt;filter&lt;/code&gt; non-préfixée. La raison étant que lorsque Webkit supportera la version non-prefixée de la propriété &lt;code&gt;filter&lt;/code&gt;, la syntaxe propre à Firefox créra des problèmes avec la transition CSS que nous allons appliquer pour passer doucement entre la version flou et nette de l&amp;#8217;image via &lt;code&gt;-webkit-transition: -webkit-filter 1s ease-in-out;&lt;/code&gt;.&lt;/p&gt;
&lt;pre class=&quot;sh_html&quot;&gt;&amp;lt;!DOCTYPE HTML&amp;gt;&lt;br /&gt;&amp;lt;!--[if lte IE 9]&amp;gt; &amp;lt;html class=&quot;ie&quot;&amp;gt; &amp;lt;![endif]--&amp;gt;&lt;br /&gt;&amp;lt;!--[if gt IE 9]&amp;gt;&amp;lt;!--&amp;gt; &amp;lt;html&amp;gt; &amp;lt;!--&amp;lt;![endif]--&amp;gt;&lt;br /&gt;&amp;lt;head&amp;gt;&lt;br /&gt;&amp;lt;meta charset=&quot;utf-8&quot;&amp;gt;&lt;br /&gt;&amp;lt;title&amp;gt;Blur via CSS&amp;lt;/title&amp;gt;&lt;br /&gt;&amp;lt;style&amp;gt;&lt;br /&gt;img {&lt;br /&gt;&amp;nbsp; filter: url(blur.svg#gaussian_blur);&lt;br /&gt;&amp;nbsp; -webkit-filter: blur(2px);&lt;br /&gt;&amp;nbsp; -webkit-transition: -webkit-filter 1s ease-in-out;&lt;br /&gt;}&lt;br /&gt;img:hover {&lt;br /&gt;&amp;nbsp; filter: none;&lt;br /&gt;&amp;nbsp; -webkit-filter: blur(0);&lt;br /&gt;}&lt;br /&gt;.ie img {&lt;br /&gt;&amp;nbsp; margin: -2px;&lt;br /&gt;&amp;nbsp; filter: progid:DXImageTransform.Microsoft.blur(pixelradius=2);&lt;br /&gt;&amp;nbsp; zoom: 1;&lt;br /&gt;}&lt;br /&gt;.ie img:hover {&lt;br /&gt;&amp;nbsp; margin: 0;&lt;br /&gt;&amp;nbsp; filter: none;&lt;br /&gt;}&lt;br /&gt;&amp;lt;/style&amp;gt;&lt;br /&gt;&amp;lt;/head&amp;gt;&lt;br /&gt;&amp;lt;body&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;img src=&quot;http://jeremie.patonnier.net/post/2012/01/12/stadt.jpg&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp; alt=&quot;Some rights reserved by zigazou76&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp; width=&quot;500&quot; height=&quot;333&quot;&amp;gt;&lt;br /&gt;&amp;lt;/body&amp;gt;&lt;br /&gt;&amp;lt;/html&amp;gt;&lt;/pre&gt;
&lt;p&gt;&lt;a hreflang=&quot;en&quot; href=&quot;http://jeremie.patonnier.net/public/web-effect/blur/blur3.html&quot;&gt;La dernière version de l&amp;#8217;exemple&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Et voila, des effets de filtres pour tout le monde&amp;#160;! Faisons de 2012 l&amp;#8217;année des filtres CSS et &lt;a hreflang=&quot;en&quot; href=&quot;http://davidwalsh.name/dw-content/css-filters.php&quot;&gt;amusez-vous bien avec&lt;/a&gt;.&lt;/p&gt;</description>

    

      </item>
  
  <item>
    <title>SVG et HTML5 font bon ménage avec Firefox</title>
    <link>http://jeremie.patonnier.net/post/2010/07/26/SVG-et-HTML5-font-bon-menage-avec-Firefox</link>
    <guid isPermaLink="false">urn:md5:c2f6de0769d7956db1c380cc1171e867</guid>
    <pubDate>Mon, 26 Jul 2010 15:00:00 +0200</pubDate>
    <dc:creator>Jeremie</dc:creator>
        <category>Web</category>
        <category>Firefox</category><category>HTML</category><category>Mozilla</category><category>SVG</category><category>webdesign</category>
    <description>&lt;p&gt;Pour faire suite à mon précédent article sur SVG, je vous propose de partir explorer la révolution technique que représente la possibilité d'inclure du SVG directement dans un document HTML. Cette possibilité fait partie du futur standard HTML 5. C'est une fonctionnalité qui sera disponible dans Firefox 4 et Internet Explorer 9 dès leur sortie. Alors comment ça marche et qu'est-ce qu'on peut en faire&amp;nbsp;?&lt;/p&gt;    &lt;h2&gt;Les premiers seront les derniers&lt;/h2&gt;
&lt;p&gt;Une fois n'est pas coutume, on va commencer par la fin. Dans cette article je vais vous détailler comment j'ai réalisé la démo suivante qui permet de transformer n'importe quelle image ou vidéo disponible en ligne en un Puzzle jouable&amp;nbsp;:&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;http://jeremie.patonnier.net/experiences/svg/inline/puzzle.html&quot; hreflang=&quot;fr&quot;&gt;http://jeremie.patonnier.net/experiences/svg/inline/puzzle.html&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Pour pouvoir voir et utiliser cette démonstration, vous avez besoin d'un navigateur qui supporte les fonctionnalités suivantes&amp;nbsp;:&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;Le support de SVG directement au sein des documents HTML5&lt;/li&gt;
&lt;li&gt;Le support de la balise &lt;code&gt;canvas&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Le support des filtres SVG&lt;/li&gt;
&lt;li&gt;Le support des balises &lt;code&gt;clipPath&lt;/code&gt; et &lt;code&gt;foreignObject&lt;/code&gt; de la norme SVG&lt;/li&gt;
&lt;li&gt;Le support de l'API localStorage et de JSON (ça, c'est un peu la cerise sur le gâteau)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Au moment où j'écris ces lignes, le seul navigateur qui réunisse ces conditions nativement est Firefox 4 beta 2. C'est avec lui que j'ai fait tous mes tests.&lt;/p&gt;
&lt;p&gt;Vous pouvez aussi tester cette démo avec Firefox 3.6. Néanmoins, pour cela, vous devez activer le support du parser HTML5. C'est possible en vous rendant à l'adresse &lt;code&gt;about:config&lt;/code&gt;, en y cherchant le paramètre &lt;code&gt;html5.enable&lt;/code&gt; et en lui donnant la valeur &lt;code&gt;true&lt;/code&gt;. Attention, il s'agit d'une version expérimentale du parser HTML5 qui n'est pas nécessairement très stable. Pensez à le désactiver une fois que vous aurez finit de jouer &lt;img src=&quot;/themes/default/smilies/wink.png&quot; alt=&quot;;)&quot; class=&quot;smiley&quot; /&gt; (Ceci dit, personnellement, je n'ai jamais eu de problème avec)&lt;/p&gt;
&lt;p&gt;A terme, IE9 supportera toutes ces fonctionnalités. Malheureusement, la Plateform Preview 3 ne supporte pas correctement les filtres et comme je n'ai pas de machine tournant sous Windows 7, je n'ai pas pu tester pour voir ce que ça donnait en l'état. &lt;/p&gt;
&lt;p&gt; Concernant &lt;a href=&quot;https://bugs.webkit.org/show_bug.cgi?id=30388&quot; hreflang=&quot;en&quot;&gt;Safari, Chrome&lt;/a&gt; et Opera, je n'ai pas entendu parler d'un support à court terme de SVG directement au sein des documents HTML5.&lt;/p&gt;
&lt;h2&gt;Mais pourquoi, John&amp;nbsp;? Pourquoi&amp;nbsp;?&lt;/h2&gt;
&lt;p&gt;Avant de détailler comment j'ai utilisé chacune des technologies mise en œuvre, voyons d'abord les raisons des choix techniques fait ici.&lt;/p&gt;
&lt;ol&gt;&lt;li&gt;&lt;strong&gt;SVG directement utilisé dans un document HTML5&lt;/strong&gt;&lt;br /&gt;D'un coté, SVG va permettre de dessiner assez facilement les formes tarabiscotées des pièces du puzzle. D'un autre coté, HTML est plus facile à manipuler dès qu'il s'agit de mettre en œuvre une interface utilisateur. Le plus simple est donc d'inclure l'un dans l'autre. Techniquement parlant, il est plus facile d'intégrer du SVG dans HTML que l'inverse car on n'a (presque) pas à se soucier de la gestion des espaces de nom XML de SVG et de XHTML, le parser HTML5 s'en occupe tout seul.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Le support de la balise &lt;code&gt;canvas&lt;/code&gt;&lt;/strong&gt;&lt;br /&gt;Prendre une source graphique pour en faire un puzzle requière de la manipuler, à minima pour la découper en morceau représentant les pièces. Dès lors qu'on parle de réaliser des opérations de cette nature, c'est &lt;code&gt;canvas&lt;/code&gt; qui est le plus indiqué. En outre, cela permet également de traiter n'importe quelle source graphique supportée par le navigateur en entrée et d'en obtenir une sortie unifiée et manipulable de la même façon, peut importe qu'il s'agisse d'une image ou d'une vidéo (ou même d'&lt;a href=&quot;https://developer.mozilla.org/en/Code_snippets/Canvas#section_2&quot; hreflang=&quot;en&quot;&gt;une page web quelconque&lt;/a&gt;... mais je ne suis pas allé aussi loin ici).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Les filtres SVG&lt;/strong&gt;&lt;br /&gt;Les filtres SVG permettent d'appliquer très simplement des effets spéciaux sur n'importe quel élément SVG, et, dans le cas de Firefox, sur n'importe quel élément HTML. En outre, les filtres étant déclaratifs (matérialisé sous forme de balises SVG) il est très facile de les modifier et de les ajuster sans avoir à recourir à de complexes artifices de programmation.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Les balises SVG &lt;code&gt;clipPath&lt;/code&gt; et &lt;/strong&gt;&lt;code&gt;&lt;strong&gt;foreignObject&lt;/strong&gt;&lt;/code&gt;&lt;br /&gt;La balise &lt;code&gt;clipPath&lt;/code&gt; permet de créer des formes de découpes applicables à un objet. Par exemple, si vous voulez &quot;percer un trou&quot; dans une image, c'est exactement ce qu'il vous faut. Si vous vouliez faire la même chose avec &lt;code&gt;canvas&lt;/code&gt;, ce serait possible, mais au prix d'un intense effort de programmation sans la souplesse de pouvoir changer simplement la forme de votre découpe. La balise &lt;code&gt;foreignObject&lt;/code&gt; permet quand à elle d'embarquer n'importe quoi dans du SVG. En effet, si au sein d'un document HTML5 il est possible de mettre des îlots de SVG, ça ne veux pas dire que vous pouvez mettre du HTML n'importe comment au milieu des balises SVG.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;L'API localStorage et JSON&lt;/strong&gt;&lt;br /&gt;Pas indispensable, mais c'est un moyen simple de pouvoir sauvegarder automatiquement la progression de votre Puzzle.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;Bouger ou ne pas bouger, tel est la question&lt;/h2&gt;
&lt;p&gt;La première chose que j'ai faite c'est de prendre la source graphique qui servira de puzzle et de la redessiner dans un élément &lt;code&gt;canvas&lt;/code&gt;. J'utilise cela comme une couche d'abstraction. En effet, une fois la source graphique convertis en un élément &lt;code&gt;canvas&lt;/code&gt;, je n'ai plus à m'en soucier et quelques soit les opérations que je ferais par la suite, je me contenterai de manipuler un &lt;code&gt;canvas&lt;/code&gt;. Accessoirement, l'opération est d'une trivialité absolue&amp;nbsp;:&lt;/p&gt;
&lt;pre class=&quot;sh_javascript&quot;&gt;monCanvas.getContext('2d').drawImage(maSourceGraphique, 0, 0, maSourceGraphique.width, maSourceGraphique.height);&lt;/pre&gt;
&lt;p&gt;Néanmoins, ce n'est pas tout à fait suffisant pour gérer les vidéos. En effet, pour que l'élément &lt;code&gt;canvas&lt;/code&gt; donne l'impression d'être animé comme la vidéo, il faut redessiner le &lt;code&gt;canvas&lt;/code&gt; à intervalle régulière au fur est à mesure de la lecture de la vidéo. Pour cela, il suffit d'utiliser la fonction &lt;code&gt;setInterval&lt;/code&gt; pour que la méthode &lt;code&gt;drawImage&lt;/code&gt; soit appelée régulièrement.&lt;/p&gt;
&lt;p&gt;Une fois que ce premier élément &lt;code&gt;canvas&lt;/code&gt; est réalisé, chaque pièce du puzzle comprendra son propre élément &lt;code&gt;canvas&lt;/code&gt; dans lequel on dessinera la portion du premier &lt;code&gt;canvas&lt;/code&gt; qui lui correspond. Cette double utilisation de l'élément &lt;code&gt;canvas&lt;/code&gt; est nécessaire pour 2 raisons&amp;nbsp;:&lt;/p&gt;
&lt;ol&gt;&lt;li&gt;Question de performance&amp;nbsp;: Sean Christmann a montré dans &lt;a href=&quot;http://www.craftymind.com/2010/04/20/blowing-up-html5-video-and-mapping-it-into-3d-space/&quot; hreflang=&quot;en&quot;&gt;un article sur l'utilisation des balises &lt;code&gt;video&lt;/code&gt; et &lt;code&gt;canvas&lt;/code&gt;&lt;/a&gt; que l'usage de deux &lt;code&gt;canvas&lt;/code&gt; successifs pour réaliser des effets spéciaux sur les vidéos apporte un gain non négligeable vis à vis des performances.&lt;/li&gt;
&lt;li&gt;Les limites de l'implémentation de SVG&amp;nbsp;: En théorie, il serait possible de définir un élément &lt;code&gt;canvas&lt;/code&gt; réutilisable au sein de SVG. Malheureusement les tests que j'ai pu réaliser mon montrés que &lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=579853&quot; hreflang=&quot;en&quot;&gt;ce n'était pas possible&lt;/a&gt;. Il faut donc créer un élément &lt;code&gt;canvas&lt;/code&gt; distinct pour chacune des pièces.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 lang=&quot;en&quot;&gt;One piece to rule them all&lt;/h2&gt;
&lt;p&gt;Chaque pièce du puzzle sera un élément &lt;code&gt;svg&lt;/code&gt; à part entière créé sur le même modèle. Cela a plusieurs avantages&amp;nbsp;:&lt;/p&gt;
&lt;ol&gt;&lt;li&gt;Lors du déplacement des pièces, celles-ci pourront êtres déplacées sur l'intégralité de la surface du document HTML. Si elles avaient été une sous-partie d'un seul élément &lt;code&gt;svg&lt;/code&gt;, le déplacement aurait été contraint à la zone visible du document SVG correspondant.&lt;/li&gt;
&lt;li&gt;Toutes les pièces reposant sur la même arborescence DOM, il est possible de créer une arborescence générique qui sera clonée autant de fois que nécessaire pour créer toutes les pièces.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;L'arborescence DOM d'une pièce de puzzle ressemble à ça&amp;nbsp;:&lt;/p&gt;
&lt;pre class=&quot;sh_xml&quot;&gt;&amp;lt;svg class=&quot;piece&quot; width=&quot;155&quot; height=&quot;155&quot; x=&quot;0&quot; y=&quot;0&quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;defs&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;path id=&quot;p1_1&quot; d=&quot;M10 10 h100 v26 a23,23 0 1,0 0,48 v26 h-25 a25,25 0 1,1 -50,0 h-25 Z&quot;/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/defs&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;clippath id=&quot;c1_1&quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;use xlink:href=&quot;http://jeremie.patonnier.net/post/2010/07/26/SVG-et-HTML5-font-bon-menage-avec-Firefox#p1_1&quot;/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/clippath&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;g&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;g clip-path=&quot;url(#c1_1)&quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;foreignobject x=&quot;10&quot; y=&quot;10&quot; width=&quot;125&quot; height=&quot;125&quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;canvas width=&quot;125&quot; height=&quot;125&quot;&amp;gt;&amp;lt;/canvas&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/foreignobject&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;use xlink:href=&quot;http://jeremie.patonnier.net/post/2010/07/26/SVG-et-HTML5-font-bon-menage-avec-Firefox#p1_1&quot;/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/g&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/g&amp;gt;&lt;br /&gt;&amp;lt;/svg&amp;gt;&lt;/pre&gt;
&lt;p&gt;Quelques explications sur cette arborescence&amp;nbsp;:&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;La balise &lt;code&gt;path&lt;/code&gt; est encapsulée dans une balise &lt;code&gt;defs&lt;/code&gt;. Grâce à cela la forme de la pièce est masquée et pourra être réutilisée à plusieurs endroit via la balise &lt;code&gt;use&lt;/code&gt;. Elle est utilisée une première fois dans la balise &lt;code&gt;clipPath&lt;/code&gt; pour définir la forme de découpe de la pièce qui sera appliquée à l'élément &lt;code&gt;canvas&lt;/code&gt;. Elle est utilisée une deuxième fois après la balise &lt;code&gt;foreignObject&lt;/code&gt; pour pouvoir dessiner un contour autour de la pièce tant que la pièce n'est pas à sa place définitive (pour donner un petit effet de lueur interne sans recourir à un filtre).&lt;/li&gt;
&lt;li&gt;La balise &lt;code&gt;foreignObject&lt;/code&gt; est entourée de deux balises &lt;code&gt;g&lt;/code&gt;. La première (le parent direct de la balise foreignObject) permet d'appliquer la forme de découpe en même temps à l'élément &lt;code&gt;canvas&lt;/code&gt; et à l'élément &lt;code&gt;use&lt;/code&gt;. La deuxième balise &lt;code&gt;g&lt;/code&gt; permet d'appliquer un éventuel filtre d'ombre porté. Si vous appliquez le filtre et la découpe sur le même élément &lt;code&gt;g&lt;/code&gt;, le filtre sera appliqué avant la découpe. Si comme ici, vous voulez que le filtre s'applique à la forme résultante de la découpe, vous êtes contraint de sur-baliser votre code SVG pour forcer l'ordre d'application des effets.&lt;/li&gt;
&lt;li&gt;Notez l'espace de nom &quot;&lt;em&gt;xlink&lt;/em&gt;&quot; sur l'attribut &lt;code&gt;href&lt;/code&gt; de la balise &lt;code&gt;use&lt;/code&gt;. L'inclusion direct de SVG dans un document HTML5 simplifie drastiquement l'usage des espaces de nom XML mais ne nous en dispense pas totalement. En effet, même dans ce cas d'utilisation, SVG reste du XML et SVG utilisant le langage XLINK pour définir cet attribut &lt;code&gt;href&lt;/code&gt;, il est obligatoire de bien spécifier cet espace de nom. Pour éviter d'avoir à faire des manipulations complexes à ce niveau, HTML5 fournis par défaut le raccourcis &quot;&lt;em&gt;xlink&lt;/em&gt;&quot; pour gérer cet espace de nom.&lt;/li&gt;
&lt;li&gt;Vous noterez que la taille de l'élément &lt;code&gt;svg&lt;/code&gt; est plus grande que celle de l'élément &lt;code&gt;canvas&lt;/code&gt;. C'est nécessaire car la zone visible de l'élément &lt;code&gt;svg&lt;/code&gt; correspond à la portion de la source graphique représentée par l'élément &lt;code&gt;canvas&lt;/code&gt; ET les éventuels filtres qui s'y appliqueront pour générer les ombres portées.&lt;/li&gt;
&lt;li&gt;La valeur de l'attribut &lt;code&gt;d&lt;/code&gt; de la balise &lt;code&gt;path&lt;/code&gt; peut faire peur. Je ne vais pas vous détailler ici le pourquoi du comment (ça mériterai un article à part entière) mais sachez juste que c'est cette simple ligne qui fait qu'on a un tracé de pièce de puzzle (ici le coin haut-gauche). Si vous regardez la source du puzzle, vous verrez que j'ai regroupé toute l'intelligence de la construction de ce chemin dans une fonction dédiée. N'hésitez pas à vous amuser à la décortiquer.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;T'as d'beaux yeux tu sais&amp;nbsp;!&lt;/h2&gt;
&lt;p&gt;
Pour rendre l'expérience de jeux un peu plus fun, on va rajouter quelques effet spéciaux et fonctionnalités qui vont permettre de lui donner un aspect un peu plus &quot;fini&quot;.&lt;/p&gt;
&lt;h3 lang=&quot;en&quot;&gt;Pimp my mouse&lt;/h3&gt;
&lt;p&gt;L'idée quand on créer des pièces de puzzle qu'on peut manipuler à la souris, c'est de pouvoir gérer la sélection de la pièce selon la forme de celle-ci. Le problème, c'est que si on ne fait rien, la souris régis à une zone rectangulaire, même sur les zones transparentes. Heureusement, de ce point de vue, SVG est bien fichue et sait gérer ça sans avoir à recourir à des dizaines de lignes de code. En fait, ça se résume à un peu de CSS&amp;nbsp;:&lt;/p&gt;
&lt;pre class=&quot;sh_css&quot;&gt;svg{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; pointer-events : none;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;svg canvas{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; pointer-events : auto;&lt;br /&gt;}&lt;/pre&gt;
&lt;p&gt;La propriété &lt;code&gt;pointer-events&lt;/code&gt; permet de définir comment la souris va réagir lors de ses interactions avec un élément. Ici on dit que la souris ne doit pas déclencher d'évènement lorsqu'elle interagit avec un élément &lt;code&gt;svg&lt;/code&gt; mais par contre elle doit réagir normalement avec les éléments &lt;code&gt;canvas&lt;/code&gt; présent dans nos éléments &lt;code&gt;svg&lt;/code&gt;. Comme les éléments canvas sont découpés par un &lt;code&gt;clipPath&lt;/code&gt;, seul les parties visibles de l'élément &lt;code&gt;canvas&lt;/code&gt; réagiront à la souris (ce comportement est sans doute la principale différence entre les balises &lt;code&gt;clipPath&lt;/code&gt; et &lt;code&gt;mask&lt;/code&gt; de SVG). Notez que d'un point de vu Javascript, même si la souris ne renvoie pas d'évènement lorsqu'elle interagit avec les éléments &lt;code&gt;svg&lt;/code&gt;, les évènements renvoyés par la souris sur l'élément &lt;code&gt;canvas&lt;/code&gt; remontent normalement vers l'élément &lt;code&gt;svg&lt;/code&gt; est peuvent être interceptés à ce niveau là. La propriété &lt;code&gt;pointer-event&lt;/code&gt; ne fait que bloquer l'émission des évènements, elle ne bloque pas leur diffusion ni leur exploitation dans le DOM.&lt;/p&gt;
&lt;h3&gt;Ombrage, ô désespoirs&amp;nbsp;!&lt;/h3&gt;
&lt;p&gt;Pour donner un peu de relief au puzzle, je me suis amusé à rajouter des ombres portés sur les pièces&amp;nbsp;: une petite ombre porté quand une pièce est posée n'importe où, une grande ombre porté quand la pièce est &quot;soulevée&quot; et transportée et enfin, pas d'ombre du tout une fois que la pièce est à sa place définitive. Chacune des ombres (la petite est la grande) est définie à l'aide d'un filtre SVG distinct pour chacune. Par exemple, la petite ombre est définie comme cela&amp;nbsp;:&lt;/p&gt;
&lt;pre class=&quot;sh_xml&quot;&gt;&amp;lt;filter id=&quot;smallShadow&quot; filterUnits=&quot;userSpaceOnUse&quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;feColorMatrix type=&quot;matrix&quot; in=&quot;SourceAlpha&quot; result=&quot;greySource&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; values=&quot;0 0 0 0 0&amp;nbsp; 0 0 0 0 0&amp;nbsp; 0 0 0 0 0&amp;nbsp; .6 .6 .6 .6 0&quot;/&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;feGaussianBlur in=&quot;greySource&quot; stdDeviation=&quot;2&quot; result=&quot;flou&quot;/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;feOffset in=&quot;flou&quot; dx=&quot;1&quot; dy=&quot;1&quot; result=&quot;Ombre&quot;/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;feMerge&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;feMergeNode in=&quot;Ombre&quot;/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;feMergeNode in=&quot;SourceGraphic&quot;/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/feMerge&amp;gt;&lt;br /&gt;&amp;lt;/filter&amp;gt;&lt;/pre&gt;
&lt;p&gt;Pour faire simple, ce filtre prend la source alpha (la transparence) de l'élément auquel va s'appliquer le filtre, lui applique une matrice de couleur (&lt;code&gt;feColorMatrix&lt;/code&gt;) pour quelle soit noir et légèrement transparente, va la flouter (&lt;code&gt;feGaussianBlur&lt;/code&gt;), la décaler (&lt;code&gt;feOffset&lt;/code&gt;) vers le bas et la droite et va recombiner le tout (&lt;code&gt;feMerge&lt;/code&gt;, &lt;code&gt;feMergeNode&lt;/code&gt;) avec la source graphique de l'élément. Je ne vous détail pas plus précisément que ça l'usage des primitives de filtres car cela mériterai un article à lui seul, mais c'est tout ça qui fait qu'on a une ombre de forme arbitraire (contrairement à la propriété CSS &lt;code&gt;box-shadow&lt;/code&gt; qui ne produit que des ombres rectangulaires... éventuellement avec des coins arrondis, mais c'est tout).&lt;/p&gt;
&lt;p&gt;L'application des filtres se fait très facilement directement via CSS&lt;/p&gt;
&lt;pre class=&quot;sh_css&quot;&gt;.shadow &amp;gt; g{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; filter:url(#smallShadow);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;#drag.shadow &amp;gt; g{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; filter:url(#bigShadow);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;.lock.shadow &amp;gt; g{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; filter:none;&lt;br /&gt;}&lt;/pre&gt;
&lt;p&gt;Vous n'avez alors plus qu'à jouer sur les classes est les ID de vos éléments avec Javascript pour appliquer ou non un filtre. Notez que Firefox permet également d'appliquer un filtre SVG à n'importe quel élément HTML. C'est ce que j'utilise pour griser l'aide du puzzle qui n'est qu'un simple élément &lt;code&gt;canvas&lt;/code&gt; affiché sur l'aire de jeu auquel j'applique un filtre de matrice de couleur.&lt;/p&gt;
&lt;h3&gt;Allo&amp;nbsp;! Caroline&amp;nbsp;! C'est Roger.&lt;/h3&gt;
&lt;p&gt;Dernière fonctionnalité, la sauvegarde automatique du puzzle en arrière plan. A chaque fois que vous déplacez une pièce, il y a un appel à l'API localStorage de HTML5 pour enregistrer la position de la pièce. De cette manière, si pour une raison ou une autre vous devez interrompre votre partie, vous pouvez la reprendre plus tard exactement là ou vous vous étiez arrêté. &lt;/p&gt;
&lt;p&gt;Pour simplifier les traitements, je stocke toutes les données représentant l'état du puzzle dans un objet spécifique. L'API localStorage stocke les données sous la forme clé/valeur. La norme est assez flou sur le type de donnée qui peuvent être stockées mais Firefox n'accepte que les chaines de caractère comme valeur à stocker donc, pour enregistrer mon objet, je le transforme en chaine en utilisant le support natif de JSON tel que définie dans la norme ECMAScript 5&amp;nbsp;:&lt;/p&gt;
&lt;pre class=&quot;sh_javascript&quot;&gt;var data = JSON.stringify(this.savedData);&lt;br /&gt;&lt;br /&gt;window.localStorage.setItem('currentPuzzle', data);&lt;/pre&gt;&lt;p&gt;La récupération des données est tout aussi simple&amp;nbsp;:&lt;/p&gt;
&lt;pre class=&quot;sh_javascript&quot;&gt;var data = window.localStorage.getItem('currentPuzzle');&lt;br /&gt;&lt;br /&gt;data = JSON.parse(data);&lt;/pre&gt;
&lt;h2&gt;Parfois, c'est le vil coyote qui gagne&lt;/h2&gt;
&lt;p&gt;
Lorsqu'on manipule des technologies nouvellement implémentées dans des navigateurs qui en sont encore au stade des versions Alpha/Beta, il n'est pas rare que l'on soit confronté à des problèmes. Dans ce cas précis, j'ai travaillé avec Minefield qui est la version non-stable de Firefox (et qui représente au moment ou j'écris ces lignes la version de développement du future Firefox 4) et j'ai été confronté à trois types de problèmes différents.&lt;strong&gt;&lt;br /&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;h3 lang=&quot;en&quot;&gt;Is there a Road Runner over here?&lt;/h3&gt;
&lt;p&gt;Les développeurs de Firefox 4 travaillent actuellement comme des malades sur les performances du navigateur et si l'on peut déjà percevoir une amélioration globale des performances, le travail n'est pas terminé et de nombreuses améliorations sont encore attendues dans les semaines à venir. Malheureusement, tout n'est pas parfait...&lt;/p&gt;
&lt;p&gt;Dans le cas qui nous occupe ici, le principal problème de performance provient de l'usage des filtres SVG. Les filtres sont actuellement ultra consommateur de ressources pour pouvoir être calculés. Ils sont tellement gourmands que j'ai très vite mis la possibilité de désactiver les ombres portées sur les pièces. En effet, si vous activez les ombres portées et que vous construisez un puzzle basé sur une vidéo, la lecture de celle-ci sera saccadée et le déplacement des pièces ne sera pas fluide. Le problème sera d'autant plus perceptible si vous créez un puzzle avec de nombreuses pièces (plus de 50) car au problème des filtres vient s'ajouter l'augmentation du nombre de nœuds DOM à gérer ce qui peut très vite plomber l'utilisation du jeu (en particulier lorsque vous déplacez les pièces).&lt;/p&gt;
&lt;p&gt;Autre point qui peut vite affecter les performances, l'utilisation de l'API localStorage. L'accès en lecture et en écriture via cette API est prohibitif au niveau performance (un peu moins de 100 milliseconde pour une simple opération d'écriture de chaine de caractère sur ma machine... iiirk&amp;nbsp;!). Ainsi si j'avais voulut enregistrer séparément la position de chaque pièces, il aurait fallut près de 10 secondes pour enregistrer l'état d'un puzzle de 100 pièces&amp;nbsp;! Soyez donc très prudent si vous utilisez cette API car sinon cela peut vite se voir. Si vous prévoyez de faire beaucoup d'opération via celle-ci, je ne saurait trop vous conseiller soit de les traiter en tache de fond asynchrone via l'utilisation de l'&lt;a href=&quot;http://dev.w3.org/html5/workers/&quot; hreflang=&quot;en&quot;&gt;API Web Workers&lt;/a&gt;, soit de travailler avec un objet contenant vos données que &lt;a href=&quot;https://developer.mozilla.org/en/Using_JSON_in_Firefox&quot; hreflang=&quot;en&quot;&gt;vous transformerez en chaine JSON&lt;/a&gt; avant de l'enregistrer intégralement en une seule fois (c'est cette dernière stratégie que j'ai choisie). Si vous n'y faite pas attention, vous pouvez vous retrouver avec un gel complet de votre page&amp;nbsp;!&lt;/p&gt;
&lt;h3&gt;Robert&amp;nbsp;! Il y a un cafard dans la machine.&lt;/h3&gt;
&lt;p&gt;L'intérêt de réaliser ce genre de démo avec une version de développement d'un navigateur, c'est que ça permet de découvrir des bugs qu'il est possible de faire corriger avant la sortie de la version final du navigateur. Les bugs les plus faciles à corriger sont liés à l'implémentation de la balise SVG &lt;code&gt;foreignObject&lt;/code&gt;&amp;nbsp;:&lt;/p&gt;
&lt;ol&gt;&lt;li&gt;&lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=576986&quot; hreflang=&quot;en&quot;&gt;Bug 576986&lt;/a&gt;&amp;nbsp;: la balise &lt;code&gt;foreignObject&lt;/code&gt; ne respectait pas les règles d'application des évènements de la souris lorsqu'on lui appliquait une forme de découpe. La correction a été apportée dans les heures qui ont suivit. Waow&amp;nbsp;!&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=578309&quot; hreflang=&quot;en&quot;&gt;Bug 578309&lt;/a&gt;&amp;nbsp;: La balise &lt;code&gt;foreignObject&lt;/code&gt; redéfinissait son propre espace de coordonnées, comme si on y avait appliquée une transformation. La encore, il n'aura fallut que quelques jours pour que ce soit corrigé. J'en profite ici pour adresser un grand merci à &lt;a href=&quot;http://longsonr.wordpress.com/&quot; hreflang=&quot;en&quot;&gt;Robert Longson&lt;/a&gt; qui a travaillé sur ces bugs en particulier et qui fait un énorme travail en ce qui concerne le support de SVG dans Firefox.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Mais il y a aussi quelques bugs plus durs qui vont sans doute être assez délicat à résoudre&amp;nbsp;:&lt;/p&gt;
&lt;ol&gt;&lt;li&gt;&lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=577824&quot; hreflang=&quot;en&quot;&gt;Bug 577824&lt;/a&gt;&amp;nbsp;: Quand on attache un élément HTML à l'arbre DOM du document via Javascript et qu'un filtre s'applique sur cet élément, l'élément n'est pas affiché.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=577464&quot; hreflang=&quot;en&quot;&gt;Bug 577464&lt;/a&gt;&amp;nbsp;: Celui là, c'est le plus bizarre de tous, et sans doute le plus difficile à résoudre. Dans certain cas de figure, le rendu des éléments auquel est appliquée une forme de découpe n'est pas correctement réalisé. Il est tellement difficile de produire un cas d'utilisation unitaire que son simple diagnostique risque de prendre du temps. Une des pistes actuellement exploré serait un bug lié à la bibliothèque graphique Cairo qui est utilisée par Firefox pour rendre les éléments visuels.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;Allo&amp;nbsp;! Tonton&amp;nbsp;? Pourquoi tu tousses&amp;nbsp;?&lt;/h3&gt;
&lt;p&gt;Après, au delà des éventuels problèmes d'implémentation, il y a aussi les problèmes liés aux spécifications elles-mêmes. Les spécifications qui tournent autour de HTML5 ne sont pas encore finalisées ou pas forcément adapté à certains cas d'utilisation et l'on tombe parfois sur des perles qui peuvent plonger un web designer dans des affres d'incompréhension. J'en ai découvert deux dans ce gout là. Une dans la spécification de l'API Canvas 2D et une dans la spécification de SVG 1.1.&lt;/p&gt;
&lt;h4&gt;Canvas pas aller ça monsieur.&lt;/h4&gt;
&lt;p&gt;En l'état de la spécification, avec la méthode &lt;code&gt;drawImage&lt;/code&gt; de &lt;code&gt;canvas&lt;/code&gt;, il est possible de dessiner soit une image, soit une vidéo. Quand vous dessinez une image, pas de problème, vous dessinez l'image elle-même. Quand vous dessinez une vidéo, ce qui est dessiné, c'est l'image qui est lut par le lecteur vidéo au moment ou on appel la fonction de dessin. Maintenant, que ce passe-t-il si vous voulez dessiner une image animé (aGIF, APNG, MNG, SVG, etc.)&amp;nbsp;? Moi, assez naïvement, je me suis dit que ça allait dessiner l'image courante de l'animation au moment ou on appel la fonction de dessin... bref que ça allait ce comporter comme avec une vidéo et c'est d'ailleurs comme cela que se comporte Firefox 3.6. Mais que nenni jeune Padawan&amp;nbsp;! La spécification dit que dans le cas d'une image animé, ce qui est dessiné, c'est la première image de l'animation et puis c'est tout&amp;nbsp;!&lt;/p&gt;
&lt;blockquote lang=&quot;en&quot;&gt;&lt;p&gt;&lt;a href=&quot;http://www.w3.org/TR/2dcontext/#images&quot; hreflang=&quot;en&quot;&gt;http://www.w3.org/TR/2dcontext/#images&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;q&gt;When the drawImage() method is passed an animated image as its image argument, the user agent must use the poster frame of the animation, or, if there is no poster frame, the first frame of the animation.&lt;/q&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Et chez Mozilla, ils se sont dit que ce serai une bonne idée de suivre la spécification dans Firefox 4. Résultat des courses, &lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=578514&quot; hreflang=&quot;en&quot;&gt;j'ai ouvert un bug en pensant à une régression&lt;/a&gt;, mais non, c'est juste qu'ils on fait en sorte d'être respectueux de la spécification.&lt;/p&gt;
&lt;p&gt;Alors, là, j'ai envie de dire&amp;nbsp;: &quot;Bravo, c'est bien&quot;. Mais d'un autre coté, maintenant, on fait comment pour accéder aux autres images qui composent une image animée&amp;nbsp;? On est typiquement dans un cas ou la spécification est difficile à comprendre et elle reflète sans doute les capacités des fabriquant de navigateur à gérer ce cas d'utilisation. Mozilla sait comment gérer les images animées dans ce cas de figure, mais se bride du fait de la faiblesse de la spécification sur ce point. C'est dommage. &lt;/p&gt;
&lt;p&gt;La spécification n'est pas encore définitive et si vous pensez que ce cas d'utilisation est important, faite le savoir. Pour cela, vous pouvez soit faire du lobbying auprès du HTML Worging Group (bon courage&amp;nbsp;!) soit auprès des fabricants de navigateur qui sont directement parti prenante. &lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=578514&quot; hreflang=&quot;en&quot;&gt;La discussion est ouverte chez Mozilla&lt;/a&gt; et si, par exemple, vous prenez simplement le temps de voter pour le bug que j'ai ouvert, peut-être que Mozilla considèrera qu'il y a matière à pousser le sujet.&lt;/p&gt;
&lt;h4&gt;SVG, ou l'art de Se Vautrer la Gueule&amp;nbsp;?&lt;/h4&gt;
&lt;p&gt;A la base, &lt;a href=&quot;https://bugzilla.mozilla.org/show_bug.cgi?id=579550&quot; hreflang=&quot;en&quot;&gt;j'ai fait une mauvaise interprétation de la spécification SVG&lt;/a&gt; alors que je voulais réutiliser un élément &lt;code&gt;foreigObject&lt;/code&gt; avec la balise &lt;code&gt;use&lt;/code&gt;. J'ai naïvement crus que n'importe quelle enfant légitime de la balise &lt;code&gt;g&lt;/code&gt; pouvait être réutilisé via la balise &lt;code&gt;use&lt;/code&gt;. Malheureusement, ce n'est pas le cas. La balise &lt;code&gt;use&lt;/code&gt; ne peut être utilisée que pour dupliquer des éléments explicitement graphique (ce qui n'est pas le cas de &lt;code&gt;foreignObject&lt;/code&gt;) ou certains conteneurs (&lt;code&gt;g&lt;/code&gt;, &lt;code&gt;symbol&lt;/code&gt; et &lt;code&gt;svg&lt;/code&gt;). Néanmoins, comme &lt;code&gt;g&lt;/code&gt; est un élément valide pour &lt;code&gt;use&lt;/code&gt;, il suffit d'envelopper un élément &lt;code&gt;foreignObject&lt;/code&gt; avec un élément &lt;code&gt;g&lt;/code&gt; est le tour et joué.&lt;/p&gt;
&lt;p&gt;Et là de se poser la question&amp;nbsp;: &quot;Mais pourquoi la norme ne permet pas d'utiliser directement tous les enfants légitimes de &lt;code&gt;g&lt;/code&gt;&amp;nbsp;? Pourquoi faut-il rajouter une balise supplémentaire qui a le gout et l'odeur de l'inutile&amp;nbsp;?&quot;. Bien évidement, il s'agit de questions de web designer, pas d'implémenteur. En effet, il y a fort à parier que lorsque la norme a commencé à être écrite (il y a plus de 10 ans, rappelons-le), les développeurs en charge de sa mise en œuvre ont du rencontrer un problème à ce niveau et faire un arbitrage dans ce sens. Ou bien il y a eu un débat philosophique quelconque a propos de ce qu'est la balise &lt;code&gt;use&lt;/code&gt; et personne n'a réussie à challenger cette vision. Franchement, je n'en sais rien mais avec le recul que l'on a désormais, la question aurait le mérite d'être à nouveau posée.&lt;/p&gt;
&lt;p&gt;De manière général, ce genre de collision malheureuse entre SVG et HTML5 risque de se représenter ailleurs (essayez de contrôler à l'aide de Javascript une balise HTML &lt;code&gt;video&lt;/code&gt; que vous avez cloné via la balise SVG &lt;code&gt;use&lt;/code&gt;... vous ne pouvez pas&amp;nbsp;!). En effet, on a d'un coté une norme vieillissante (SVG) et de l'autre une norme toute neuve en construction (HTML5). A bien des égards, SVG a été conçus pour vivre dans un univers statique. A l'inverse, HTML5 redéfinis énormément d'éléments dynamiques au travers de nouvelles API Javascript. De ce point de vue, je ne serais pas surpris que HTML5 redonne un coup de fouet à SVG et il n'est pas exclus que dans les années a venir on voit arriver une norme SVG 2 pour résoudre tous ces nouveaux cas d'utilisation... mais bon, ne soyez pas trop pressé. C'est aussi ça qui fait que Flash à encore de beau jours devant lui.&lt;/p&gt;
&lt;h2&gt;Le mot de la fin (des haricots)&lt;/h2&gt;
&lt;p&gt;Voila, je viens de vous arroser avec un article copieusement long et en même temps extrêmement raccourcis. Si vous voulez comprendre plus précisément comme marche quoi, je vous encourage à regarder le code source que j'ai essayé de commenter le plus possible. Ce qu'il faut retenir, c'est que le support de SVG dans HTML est encore quelque chose de très expérimental mais cela donne déjà une bonne idée de ce que peut faire chaque technologie respective et ce que l'on gagne à les mixer.&lt;/p&gt;
&lt;p&gt;Si vous voulez aller plus loin, n'hésitez pas à lire les spécifications. Elles peuvent parfois s'avérer très utile. La spécification SVG par exemple comporte de nombreux exemples de code très utile à la compréhension. D'autres ressources très utile également sont les documentations techniques des fabricants de navigateurs. En particulier dans le cas de cette démo, le &lt;a href=&quot;https://developer.mozilla.org/En&quot;&gt;Mozilla Developper Center&lt;/a&gt;, mais aussi &lt;a href=&quot;http://msdn.microsoft.com/en-us/ie/aa740473.aspx&quot; hreflang=&quot;en&quot;&gt;MSDN&lt;/a&gt;, &lt;a href=&quot;http://dev.opera.com/&quot; hreflang=&quot;en&quot;&gt;Opera Dev&lt;/a&gt; et &lt;a href=&quot;http://trac.webkit.org/wiki&quot; hreflang=&quot;en&quot;&gt;le wiki de Webkit&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Quoi qu'il en soit, expérimentez vous même et faite vous votre propre idée. Ces technologies sont toutes assez nouvelles, les implémentations évoluent constamment et le processus de standardisation n'est pas linéaire...mais amusez vous, c'est comme ça que vous apprendrez de nouvelles choses &lt;img src=&quot;/themes/default/smilies/wink.png&quot; alt=&quot;;)&quot; class=&quot;smiley&quot; /&gt;&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;La spécification SVG : &lt;a href=&quot;http://www.w3.org/TR/SVG/&quot; hreflang=&quot;en&quot;&gt;http://www.w3.org/TR/SVG/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;La spécification HTML 5 : &lt;a href=&quot;http://www.w3.org/TR/html5/&quot; hreflang=&quot;en&quot;&gt;http://www.w3.org/TR/html5/&lt;/a&gt;
&lt;ul&gt;&lt;li&gt;L'API Canvas 2D : &lt;a href=&quot;http://www.w3.org/TR/2dcontext/&quot; hreflang=&quot;en&quot;&gt;http://www.w3.org/TR/2dcontext/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;L'API Storage : &lt;a href=&quot;http://www.w3.org/TR/webstorage/&quot; hreflang=&quot;en&quot;&gt;http://www.w3.org/TR/webstorage/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;L'API Web Workers : &lt;a href=&quot;http://www.w3.org/TR/workers/&quot; hreflang=&quot;en&quot;&gt;http://www.w3.org/TR/workers/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;ECMAScript 5 (PDF) : &lt;a href=&quot;http://www.ecma-international.org/publications/files/ECMA-ST/ECMA-262.pdf&quot; hreflang=&quot;en&quot;&gt;http://www.ecma-international.org/publications/files/ECMA-ST/ECMA-262.pdf&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description>

    

      </item>
  
  <item>
    <title>Devenir beta-testeur de Firefox sous Ubuntu/Linux</title>
    <link>http://jeremie.patonnier.net/post/2010/03/19/Devenir-beta-testeur-de-Firefox-sous-Ubuntu-Linux</link>
    <guid isPermaLink="false">urn:md5:a6fa5ab3f6c4431d9f5142cda07cc5fd</guid>
    <pubDate>Fri, 19 Mar 2010 09:30:00 +0100</pubDate>
    <dc:creator>Jeremie</dc:creator>
        <category>Élucubrations</category>
        <category>Firefox</category><category>linux</category><category>Mozilla</category><category>Navigateurs</category><category>ubuntu</category>
    <description>&lt;p&gt;Suite à &lt;a hreflang=&quot;fr&quot; href=&quot;http://www.chevrel.org/fr/carnet/?post/2010/01/09/Retour-sur-mes-bugs-en-cours-mes-2-nouveaux-bugs-de-d%C3%A9but-janvier&quot;&gt;un article de Pascal Chevrez&lt;/a&gt;, qui soulignait qu'il n'y avait paradoxalement pas assez de beta-testeur de Firefox pour Linux, j'ai eu envie de me pencher sur la question de l'installation des beta de Firefox sous Linux (enfin sous ma Ubuntu surtout &lt;img src=&quot;/themes/default/smilies/wink.png&quot; alt=&quot;;)&quot; class=&quot;smiley&quot; /&gt; ). En temps que noob de Linux, ça a été assez intéressant de voir ça. &lt;/p&gt;
&lt;p&gt;L'idée de cette article est de fournir un &quot;How-to&quot; pour devenir beta-testeur de Firefox sous Ubuntu (mais ça marche aussi pour les utilisateurs de Windows et Mac OSX, hein !) tout en étant volontairement orienté pour un public peu technique (j'assume le fait que vous sachiez tout de même ce qu'est un répertoire et que vous sachiez au moins ouvrir une fenêtre de ligne de commande, même si vous ne savez pas trop quoi en faire).&lt;/p&gt;    &lt;p&gt;Petit préambule technique à destination des utilisateurs non techniques : le raccourci &lt;code&gt;~/&lt;/code&gt; fait référence à votre répertoire de travail personnel. Le chemin d'accès &quot;long&quot; vers ce répertoire sous Ubuntu est &lt;code&gt;/home/&lt;em&gt;nom-d-utilisateur&lt;/em&gt;/&lt;/code&gt;.&lt;/p&gt;
&lt;h2&gt;Télécharger Firefox&lt;/h2&gt;
&lt;p&gt;La première chose à faire, c'est de télécharger la version de Firefox que vous voulez utiliser. Pour cela, vous trouverez tous ce qu'il vous faut sur les sites de Mozilla. Néanmoins, plusieurs choix s'offrent à vous selon ce à quoi vous vous intéressez :&lt;/p&gt;
&lt;ol&gt;&lt;li&gt;Vous voulez la dernière version stable de Firefox, rendez-vous ici :&lt;br /&gt;&lt;a hreflang=&quot;fr&quot; href=&quot;http://www.mozilla.com/en-US/firefox/all.html&quot;&gt;http://www.mozilla.com/en-US/firefox/all.html&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Vous voulez tester la dernière beta &quot;public&quot;, rendez-vous ici :&lt;br /&gt;&lt;a hreflang=&quot;en&quot; href=&quot;http://www.mozilla.com/en-US/firefox/all-beta.html&quot;&gt;http://www.mozilla.com/en-US/firefox/all-beta.html&lt;/a&gt; (actif uniquement en période de beta-test des versions majeurs, ce qui n'est pas le cas au moment ou j'écris ces lignes)&lt;/li&gt;
&lt;li&gt;Vous êtes un aventurier et vous voulez tester une &quot;nightly build&quot;, c'est ici que ça ce passe :&lt;br /&gt;&lt;a hreflang=&quot;en&quot; href=&quot;http://ftp.mozilla.org/pub/mozilla.org/firefox/nightly/latest-trunk/&quot;&gt;http://ftp.mozilla.org/pub/mozilla.org/firefox/nightly/latest-trunk/&lt;/a&gt; (notez qu'il s'agit de l'accès direct au &quot;trunk&quot;, mais si vous remontez l'arborescence d'un niveau, vous pouvez accéder à d'autres branches de développements... ah ben oui, là, vous êtes vraiment en mode aventure hein)&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Attention pour les utilisateur de Linux 64 bits. En effet, Mozilla ne fournis des versions compilées que pour les systèmes 32 bits. Ça ne vous empêchera pas d'utiliser Firefox, mais cela a deux conséquences : D'une part la stabilité de Firefox n'est pas garantis et d'autre part les plugins ne seront pas utilisables (en tout cas, pas facilement).&lt;/p&gt;
&lt;p&gt;Vous pouvez également utiliser les dépôts PPA pour faire l'installation (ce qui vous permettra de trouver des compilations 64 bits !)... je ne vais pas trop m'appesantir la dessus vu que je fait une allergie complète à ce système (j'y comprend rien et je n'ai pas envie d'y comprendre quoi que ce soit... je sais, c'est génial et je ne sais pas de quoi je me prive, mais ça me gonfle et je trouve ça beaucoup trop nerd pour moi)&lt;/p&gt;
&lt;h2&gt;Installer Firefox&lt;/h2&gt;
&lt;p&gt;L'installation en tant que tel est assez trivial : décompactez l'archive que vous avez téléchargée, et voila, c'est installé. Bon, ok, soyons un peu sérieux. La version de Firefox que vous avez téléchargée est effectivement directement exécutable (sous Ubuntu, vous n'avez aucune question de dépendance à gérer, c'est assez confortable mais je ne sais pas si c'est aussi simple avec d'autres distributions) mais elle est loin d'être intégré au système.&lt;/p&gt;
&lt;p&gt;Je ne vais pas vous harasser d'une explication fastidieuse alors que tout est extrêmement bien documenté en français ici : &lt;a hreflang=&quot;fr&quot; href=&quot;http://doc.ubuntu-fr.org/firefox&quot;&gt;http://doc.ubuntu-fr.org/firefox&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Ça y est ? Vous avez installé une autre version de Firefox ? Vous êtes près à double-cliquer sur l'icône de lancement ? Alors là, vous arrêtez tout, vous respirez un grand coup et vous vous posez la question de votre profil utilisateur !&lt;/p&gt;
&lt;p&gt;On ne le dira jamais assez, mais avant toute chose, &lt;strong&gt;sauvegardez votre profil Firefox habituel !&lt;/strong&gt; J'insiste, un accident malheureux est si vite arrivé. &lt;/p&gt;
&lt;p&gt;Sous Ubuntu 9.10, tous vos profils utilisateur se trouve dans &lt;code&gt;~/.mozilla/firefox&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;C'est particulièrement critique si vous voulez jouer le mode aventure extrême avec les nightly de Firefox. De manière général, je vous invite à vous créer plusieurs profils dédiés à vos tests. Pour créer de nouveau profil ou pour choisir un profil spécifique, il suffit de lacer Firefox avec l'option &lt;code&gt;-p&lt;/code&gt;. Vous pouvez rajouter cette options dans les lanceurs d'application d'Ubuntu (clique droit, &quot;propriété&quot;) ou bien lancer Firefox depuis la ligne de commande :&lt;/p&gt;
&lt;pre&gt;firefox -p&lt;/pre&gt;&lt;p&gt;Selon les tests que vous voulez réaliser, il peut aussi être utile de créer un profil temporaire pour la seul durée de ces tests. &lt;a hreflang=&quot;fr&quot; href=&quot;http://www.chevrel.org/fr/carnet/?post/2010/01/14/Tester-Firefox-avec-un-profil-klinex&quot;&gt;Pascal documente très bien la façon de faire cela sur son site&lt;/a&gt;. &lt;/p&gt;
&lt;p&gt;De même, vous pouvez avoir besoin de lancer plusieurs instances de Firefox en parallèle (par exemple si vous avez une version stable pour votre navigation quotidienne et que vous voulez réaliser un test sur une version instable). Pour cela, il vous suffit de lancer Firefox avec l'option &lt;code&gt;--no-remote&lt;/code&gt; :&lt;/p&gt;
&lt;pre&gt;firefox --no-remote&lt;/pre&gt;
&lt;h2&gt;La phase de tests&lt;/h2&gt;
&lt;p&gt;Voila vous êtes près, vous pouvez commencer vos tests. Soyons bien claire, vous êtes libre de tester ce que vous voulez : Le support des standards du Web, les performances du navigateur, la qualité de l'interface utilisateur, la gestion des extensions... c'est vous qui voyez ce qui vous intéresse. Personnellement, lors des phases de beta-test publique, je me contente de surfer &quot;comme d'habitude&quot; et de relever les éventuels problèmes que je rencontre.&lt;/p&gt;
&lt;h3&gt;Automatisez vos tests&lt;/h3&gt;
&lt;p&gt;Quoi qu'il en soit, dans une démarche de beta-tests (ou pire, d'alpha-tests), vous risquez d'être amener à reproduire plusieurs fois les mêmes actions. En effet, que ce soit pour vous assurer qu'il n'y a pas de régression d'une version à l'autre ou bien qu'une dysfonction a été corrigée, il va vous falloir refaire plusieurs fois les mêmes actions. En soit, c'est déjà quelque chose de fastidieux, mais en plus, il peut se passer plusieurs mois entre la réalisation de vos différents tests (ça peut prendre du temps de corriger un bug) et se souvenir de ce qu'on a fait il y a plusieurs jours/semaines/mois est loin d'être évident. Il est donc vivement conseillé d'automatiser vos tests pour éviter d'avoir à vous prendre la tête avec ça. Cette phase d'automatisation peut également vous faciliter la vie lorsque vous aurez des bugs à signaler (j'y reviens plus loin).&lt;/p&gt;
&lt;p&gt;Pour réaliser cette automatisation, vous avez le choix des armes. cela dépendra de vos connaissances techniques et de vos besoins de test. Ça peut aller de la réalisation d'une page HTML qui recouvre un certain nombre de cas de test à la réalisation d'un script bash complet. Il existe néanmoins une extensions de Firefox qui peut vous être utile : &lt;a hreflang=&quot;fr&quot; href=&quot;https://addons.mozilla.org/fr/firefox/addon/3863&quot;&gt;iMacros pour Firefox&lt;/a&gt;. Cette extension permet d'enregistrer et rejouer toutes les taches que vous pouvez faire avec Firefox (pas seulement ce que vous faite dans un page web mais vraiment tout, y compris les interactions avec l'interface utilisateur).&lt;/p&gt;
&lt;h3&gt; L'équipe Assurance Qualité de Mozilla&lt;/h3&gt;
&lt;p&gt;Si vous êtes vraiment motivé, vous pouvez également aider (pour ne pas dire rejoindre &lt;img src=&quot;/themes/default/smilies/wink.png&quot; alt=&quot;;)&quot; class=&quot;smiley&quot; /&gt; ) l'équipe d'assurance qualité de Mozilla. Elle fédère l'effort de test des produits Mozilla. Elle propose &lt;a hreflang=&quot;en&quot; href=&quot;http://quality.mozilla.org/tools&quot;&gt;un certains nombre d'outils&lt;/a&gt;, organise &lt;a hreflang=&quot;en&quot; href=&quot;http://quality.mozilla.org/events&quot;&gt;des évènements spécifiques&lt;/a&gt; et met en œuvre un catalogue de cas de tests. Vous trouverez plus d'informations sur &lt;a hreflang=&quot;en&quot; href=&quot;http://quality.mozilla.org/&quot;&gt;le site de Mozilla dédié à l'Assurance Qualité&lt;/a&gt; (en anglais).&lt;/p&gt;
&lt;p&gt;Cette équipe propose même une extension spécifique pour vous accompagner dans vos démarches de test : le &lt;a hreflang=&quot;fr&quot; href=&quot;https://addons.mozilla.org/fr/firefox/addon/5428&quot;&gt;Mozilla QA Companion&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Signaler un bug&lt;/h2&gt;
&lt;p&gt;Ça y est, là vous êtes chaud. Vous utilisez votre Firefox tout nouveau tout beau, et là... Paf ! C'est le drame ! Vous êtes confronté à un bug. Comme vous êtes quelqu'un de bien, vous allez le signaler à Mozilla. Je ne vais pas vous le cacher, en général, c'est là que ça se corse. Ça se corse parce que le reporting de bug se fait exclusivement en anglais. Là, il n'y a pas vraiment le choix, l'anglais étant la langue partagée par quasiment tous les développeurs de la planète, c'est ce qui est le plus facile pour tout le monde... mais pas forcément pour vous. Détendez vous quand même, il n'y a pas besoin d'être bac+5 d'anglais. Au pire du pire, si vraiment c'est un obstacle insurmontable pour vous, vous pouvez gentiment aller en discuter avec les différentes communautés Mozilla françaises. Que ce soit les traducteurs de &lt;a hreflang=&quot;fr&quot; href=&quot;http://www.frenchmozilla.fr/&quot;&gt;FrenchMozilla&lt;/a&gt; (D'ailleurs, si votre bug est un bug de traduction, c'est eux qu'il faut aller voir) ou les administrateurs de &lt;a hreflang=&quot;fr&quot; href=&quot;http://www.geckozone.org/&quot;&gt;GeckoZone&lt;/a&gt;, si vous leur demandez poliment de l'aide, vous ne devriez pas être bombardé de cailloux, au contraire &lt;img src=&quot;/themes/default/smilies/wink.png&quot; alt=&quot;;)&quot; class=&quot;smiley&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Pour signaler un bug, ça se passe sur &lt;a hreflang=&quot;en&quot; href=&quot;https://bugzilla.mozilla.org/&quot;&gt;le site Bugzilla de Mozilla&lt;/a&gt;. Mais ne nous précipitons pas, faisons cela dans les règles de l'art (il sera bien temps de faire ça n'importe comment le moment venu &lt;img src=&quot;/themes/default/smilies/smile.png&quot; alt=&quot;:)&quot; class=&quot;smiley&quot; /&gt; ).&lt;/p&gt;
&lt;h3&gt;Vérifier si ce bug n'a pas déjà été signalé&lt;/h3&gt;
&lt;p&gt;Alors avant de s'énerver, la première chose à faire est de vérifier
si le bug que vous avez repéré n'a pas déjà été signalé par quelqu'un
d'autre. En effet, ce n'est pas la peine de signaler un bug qui a déjà été pris en charge par les développeurs et qui sera donc corrigé dans la prochaine version stable/beta/nightly. De même, il est plus constructif de compléter un bug existant que de faire un doublon.&lt;/p&gt;
&lt;p&gt;Bon, ne nous le cachons pas, l'interface de bugzilla est cauchemardesque d'un point de vue ergonomique. C'est un outils fait pour les développeurs de Mozilla. Si vous êtes un contributeur occasionnel, abandonnez ici tout espoirs ! Faire une recherche de bug si vous n'avez pas l'habitude des arcanes de l'organisation des développements chez mozilla, c'est l'horreur. Alors si malgré vos effort vous ouvrez un bug qui en doublonne un autre, ne vous inquiétez pas, Mozilla dispose d'une équipe de triage des bugs qui assure grave ! Ne soyez donc pas surpris si vous voyez que votre bug est marqué comme étant un doublon, ça vous arrivera régulièrement, surtout au début &lt;img src=&quot;/themes/default/smilies/wink.png&quot; alt=&quot;;)&quot; class=&quot;smiley&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;Qualifier votre bug&lt;/h3&gt;
&lt;p&gt;Maintenant que vous savez (ou croyez savoir, ou n'avez pas envie de savoir) que personne n'a déjà signalé votre bug, vous pouvez vous lancer dans votre rapport de bug. Oui, mais pas de précipitation. Avant de vous jeter sur Bugzilla, prenez le temps de préparer un rapport complet. En effet, il n'y a rien de plus inutile qu'un rapport de bug sous la forme de &quot;Y'a tel machin qui marche pas&quot;. En effet, les personnes qui vont traiter le bug ne sont pas à votre place, il faut donc leur donner un minimum de contexte pour qu'ils puissent travailler efficacement.&lt;/p&gt;
&lt;p&gt;Un rapport de bug exploitable contiens un certain nombre d'informations clés :&lt;/p&gt;
&lt;ol&gt;&lt;li&gt;Commencez par dire quel est la version de Firefox que vous utilisez et votre système d'exploitation. Le plus simple est de coller purement et simplement la &quot;User Agent String&quot; de votre navigateur dans votre rapport de bug. Vous la trouverez en vous rendant dans le menu : &lt;em&gt;Aide &amp;gt; A propos de Mozilla Firefox&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;Décrivez toutes les étapes qui permettent de reproduire le bug (idéalement sous forme d'une liste ordonnée). Si vous avez pensé à automatiser vos tests, vous pouvez en plus joindre le script d'automatisation, les développeurs pourront alors reproduire assez simplement le problème (et donc potentiellement traiter votre bug plus vite &lt;img src=&quot;/themes/default/smilies/wink.png&quot; alt=&quot;;)&quot; class=&quot;smiley&quot; /&gt; ). Si ce bug ne peut pas être reproduit systématiquement, précisez le bien et essayez de qualifier sa fréquence d'apparition.&lt;/li&gt;
&lt;li&gt;Précisez le résultat normalement attendu par votre test et le résultat réel constaté de votre test. Encore une fois plus vous serez précis sur ces deux points, plus le bug sera facile à identifier et à corriger.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;Ouvrir un bug&lt;/h3&gt;
&lt;p&gt;Bon, ben nous y voila, c'est le grand moment. Si ce n'est déjà fait, commencez par vous &lt;a hreflang=&quot;en&quot; href=&quot;https://bugzilla.mozilla.org/createaccount.cgi&quot;&gt;ouvrir un compte sur Bugzilla&lt;/a&gt; et faites l'effort de survoler &lt;a hreflang=&quot;en&quot; href=&quot;https://bugzilla.mozilla.org/page.cgi?id=etiquette.html&quot;&gt;le guide de bonne conduite de Bugzilla&lt;/a&gt; (c'est court et pas prise de tête, mais on y retrouve quelque points important pour une bonne vie en communauté). Une fois identifié, vous n'avez plus qu'à &lt;a hreflang=&quot;en&quot; href=&quot;https://bugzilla.mozilla.org/enter_bug.cgi&quot;&gt;remplir votre rapport de bug&lt;/a&gt; et voila... vous faites désormais partis de la grande famille des contributeurs au projet Mozilla. Bravo &lt;img src=&quot;/themes/default/smilies/smile.png&quot; alt=&quot;:)&quot; class=&quot;smiley&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;Comme vous pouvez le voir, il n'y a rien de vraiment compliqué. Il n'est même pas nécessaire que vous ayez des connaissances techniques particulières. C'est tout l'intérêt du mode de développement ouvert de Mozilla : tout le monde peu participer dans la mesure de ses moyens, connaissances, disponibilités. En fait, le seul problème que j'ai avec Mozilla, c'est la difficulté à trouver comment participer. En effet, Mozilla communique assez mal sur comment il est possible de participer. Mozilla dispose de tout un tas d'outils et il est parfois difficile de savoir ou commencer dans la profusion des possibilité qui sont offerte. En dehors du développement, il existe des tas d'autres choses à faire avec Mozilla : du &lt;a hreflang=&quot;en&quot; href=&quot;http://www.spreadfirefox.com/&quot;&gt;marketing&lt;/a&gt;, de la &lt;a hreflang=&quot;en&quot; href=&quot;http://mozillalabs.com/&quot;&gt;R&amp;amp;D&lt;/a&gt;, de &lt;a hreflang=&quot;en&quot; href=&quot;http://design-challenge.mozillalabs.com/&quot;&gt;l'ergonomie&lt;/a&gt;, et &lt;a hreflang=&quot;en&quot; href=&quot;http://www.drumbeat.org/&quot;&gt;bien plus&lt;/a&gt;. C'est parce qu'il est difficile de savoir ou commencer que j'ai écris cet article. J'essayerai de vous parler de toutes ces autre opportunités pour les non-développeur au seins du projet Mozilla car ce n'est pas toujours claire pour s'y retrouver. N'hésitez pas à vous renseigner sur les forums de discutions francophone, les gens sont sympas et n'hésiteront pas à vous aider à démarrer. Bienvenu !&lt;/p&gt;</description>

    

      </item>
  
</channel>
</rss>
