<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Aeon Consulting : Together, let&#039;s cross the sky &#187; Flex</title>
	<atom:link href="http://www.aeon-consulting.fr/fr/blog/tag/flex/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.aeon-consulting.fr</link>
	<description></description>
	<lastBuildDate>Fri, 30 Apr 2010 00:32:05 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8</generator>
	<language>fr</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>HTML 5 : simple évolution de HTML ou véritable technologie RIA ?</title>
		<link>http://www.aeon-consulting.fr/fr/blog/2009/11/01/html-5-simple-evolution-de-html-ou-veritable-technologie-ria/</link>
		<comments>http://www.aeon-consulting.fr/fr/blog/2009/11/01/html-5-simple-evolution-de-html-ou-veritable-technologie-ria/#comments</comments>
		<pubDate>Sun, 01 Nov 2009 14:23:07 +0000</pubDate>
		<dc:creator>François Goldgewicht</dc:creator>
				<category><![CDATA[Carnets de Vol IT]]></category>
		<category><![CDATA[AJAX]]></category>
		<category><![CDATA[Flex]]></category>
		<category><![CDATA[HTML5]]></category>
		<category><![CDATA[RIA]]></category>
		<category><![CDATA[Silverlight]]></category>

		<guid isPermaLink="false">http://www.aeon-consulting.fr/?p=309</guid>
		<description><![CDATA[Adaptation de l&#8217;article publié dans le numéro 123 du magazine &#171;&#160;Programmez !&#187;&#160; paru le 30 septembre 2009.

Principes de base de HTML 5
 
Jusqu’ici, les langages HTML et XHTML étaient deux langages distincts et définis par leur syntaxe.
La spécification HTML 5 définit un langage unique nommé HTML 5. Ce langage :

est défini par sa structure DOM (Document [...]]]></description>
			<content:encoded><![CDATA[<p><em>Adaptation de l&#8217;article publié dans le <a href="http://www.aeon-consulting.fr/fr/blog/2009/10/19/article-dans-programmez-presentation-de-html-5-par-aeon-consulting/" target="_blank">numéro 123 du magazine &laquo;&nbsp;Programmez !&raquo;&nbsp; paru le 30 septembre 2009</a>.<br />
</em></p>
<h2>Principes de base de HTML 5</h2>
<p><strong><span style="text-decoration: underline;"> </span></strong></p>
<p>Jusqu’ici, les langages HTML et XHTML étaient deux langages distincts et définis par leur syntaxe.</p>
<p>La spécification HTML 5 définit un langage unique nommé HTML 5. Ce langage :</p>
<ul>
<li>est défini par sa structure DOM (Document Object Model, qui permet de représenter un document par une structure arborescente) et donc indépendamment de la syntaxe ;</li>
<li>peut être écrit par une syntaxe HTML ou une syntaxe XML : il ne s’agit donc que de deux sérialisations possibles parmi d’autres.</li>
</ul>
<p>Cette spécification définit de nouveaux éléments, attributs et API plus adaptés aux applications Web, ainsi que des consignes afin d’encourager des implémentations interopérables.</p>
<p>Notez que HTML 5 est conçu pour être compatible avec ses anciennes versions : les navigateurs qui implémenteront la spécification HTML 5 devront toujours être capables d’interpréter les documents HTML plus anciens.</p>
<h2><span id="more-309"></span>Apports « basiques » de HTML 5</h2>
<h3>Sémantique</h3>
<p>Des éléments ont été ajoutés afin de donner plus de structure aux documents : <code>section</code>, <code>article</code>, <code>aside</code>, <code>header</code>, <code>footer</code> et <code>nav</code>, notamment. Leur nom est explicite quant à leur utilisation.</p>
<p>Ainsi, on utilisera ces éléments natifs plutôt que de donner de la sémantique à des <code>div</code> (par exemple) en leur attribuant des identifiants ou classes CSS particuliers :</p>
<blockquote><p><code>&lt;div id="header"&gt;</code></p></blockquote>
<p>devient :</p>
<blockquote><p><code>&lt;header&gt;</code></p></blockquote>
<p>L’article <a href="http://www.alistapart.com/articles/previewofhtml5">http://www.alistapart.com/articles/previewofhtml5</a> vous fait une excellente présentation de ces éléments.</p>
<p>HTML 5 fournit également un élément <code>dialog</code> pour représenter une discussion, ainsi qu’un élément figure permettant d’ajouter un titre à un élément donné (une image, par exemple).</p>
<h3>Contrôles</h3>
<p>Plusieurs nouveaux contrôles sont prévus.</p>
<p><span style="text-decoration: underline;">Champs de saisie</span></p>
<p>L’élément <code>input</code> est doté de nouvelles valeurs pour sa propriété <code>type</code>. Essentiellement :</p>
<ul>
<li><code>datetime</code></li>
<li><code>date</code></li>
<li><code>month</code></li>
<li><code>week</code></li>
<li><code>time</code></li>
<li><code>number</code></li>
<li><code>range</code></li>
<li><code>email</code></li>
<li><code>url</code></li>
<li><code>search</code></li>
<li><code>color</code></li>
</ul>
<p>Ainsi les navigateurs pourront proposer nativement l’interface utilisateur adéquate comme par exemple, un sélecteur de dates.</p>
<p>Les navigateurs prendront également en charge l’envoi au serveur non pas de la valeur saisie, mais d’une valeur formatée. On retrouve ici un principe largement mis en œuvre dans la plupart des frameworks : si on reprend notre exemple du sélecteur de dates, l’utilisateur pourra choisir des dates qui lui seront présentées au format local (JJ/MM/AAAA pour la France) mais les données envoyées au serveur pourront être toujours de la forme AAAA/MM/JJ, après avoir été validées.</p>
<p>Justement, l’attribut <code>required</code> permettra nativement de valider qu’un champ a bien été renseigné.</p>
<p>La page <a href="http://html5doctor.com/designing-a-blog-with-html5/">http://html5doctor.com/designing-a-blog-with-html5/</a> vous donne quelques exemples.</p>
<p><span style="text-decoration: underline;">Combo-boxes</span></p>
<p>La combo-box fait son apparition dans le langage HTML ! L’élément datalist permet en effet de bénéficier d’une combo-box native, et donc de s’affranchir des frameworks qui nous le fournissaient, sous le nom « auto-complete » ou « suggest » :</p>
<blockquote>
<pre>Langue :</pre>
<pre>&lt;input list="langues"&gt;</pre>
<pre>&lt;datalist&gt;</pre>
<pre>   &lt;option&gt;Francais&lt;/option&gt;</pre>
<pre>   &lt;option&gt;English&lt;/option&gt;</pre>
<pre>   &lt;option&gt;Deutsch&lt;/option&gt;</pre>
<pre>&lt;/datalist&gt;</pre>
</blockquote>
<p><span style="text-decoration: underline;">Datagrids</span></p>
<p><span style="text-decoration: underline;"> </span></p>
<p>La <em>datagrid</em> fait également son apparition dans le langage HTML. Elle permet de représenter et manipuler des arbres, des listes et des tableaux.</p>
<p>Une datagrid est initialisée à partir d’un élément HTML :</p>
<blockquote>
<pre>&lt;datagrid&gt;</pre>
<pre>   &lt;table&gt;</pre>
<pre>      &lt;tr&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;Item 1&lt;/td&gt;&lt;/tr&gt;</pre>
<pre>      &lt;tr&gt;&lt;td&gt;2&lt;/td&gt;&lt;td&gt;Item 2&lt;/td&gt;&lt;/tr&gt;</pre>
<pre>      &lt;tr&gt;&lt;td&gt;3&lt;/td&gt;&lt;td&gt;Item 3&lt;/td&gt;&lt;/tr&gt;</pre>
<pre>   &lt;/table&gt;</pre>
<pre>&lt;/datagrid&gt;</pre>
</blockquote>
<p>Dans cet exemple, la datagrid est peuplée à partir d’un tableau. Mais on aurait également pu utiliser un élément <code>select</code> afin de peupler la datagrid à partir d’une liste. Et même un ensemble d’éléments HTML, chacun représentant une ligne de la datagrid.</p>
<p>Il faut bien comprendre l’intérêt de la datagrid par rapport aux éléments HTML traditionnels : les éléments <code>table</code> et <code>select</code> ne sont pas manipulables par l’utilisateur, ils ne servent qu’à présenter des informations. La datagrid permet à l’utilisateur de les manipuler : sélectionner des lignes, des colonnes, des cellules, éditer des cellules, supprimer des lignes, des colonnes, trier les données, etc. Elle propose également une API qui permet de la manipuler programmatiquement. Là encore, le but est de fournir nativement ce que les frameworks nous apportent.</p>
<p><span style="text-decoration: underline;">Menus</span></p>
<p>HTML définit un élément menu qui permet de définir des menus et des barres d’outils.</p>
<p>Voici un exemple de barre d’outils :</p>
<blockquote>
<pre>&lt;menu&gt;</pre>
<pre>   &lt;li&gt;</pre>
<pre>      &lt;menu label="File"&gt;</pre>
<pre>         &lt;button&gt;New...&lt;/button&gt;</pre>
<pre>         &lt;button&gt;Open...&lt;/button&gt;</pre>
<pre>         &lt;button&gt;Save&lt;/button&gt;</pre>
<pre>         &lt;button&gt;Save as...&lt;/button&gt;</pre>
<pre>      &lt;/menu&gt;</pre>
<pre>   &lt;/li&gt;</pre>
<pre>   &lt;li&gt;</pre>
<pre>      &lt;menu label="Edit"&gt;</pre>
<pre>         &lt;button&gt;Copy&lt;/button&gt;</pre>
<pre>         &lt;button&gt;Cut&lt;/button&gt;</pre>
<pre>         &lt;button&gt;Paste&lt;/button&gt;</pre>
<pre>      &lt;/menu&gt;</pre>
<pre>   &lt;/li&gt;</pre>
<pre>&lt;/menu&gt;</pre>
</blockquote>
<p>Pour créer un menu contextuel il suffirait de modifier l’attribut <code>type</code> du menu de <code>toolbar</code> à <code>context</code>. Les éléments peuvent alors référencer ce menu contextuel grâce à un nouvel attribut <code>contextmenu</code>.</p>
<p>Les éléments de ce menu peuvent être d’autres éléments <code>menu</code> (comme dans l’exemple ci-dessus), des séparateurs ou des commandes : une commande peut être représentée par un élément <code>a</code>, <code>button</code>, <code>input</code>, <code>option</code>, ou <code>command</code>.</p>
<p>Ce dernier élément <code>command</code> est apparu avec HTML 5. Il permet une sémantique plus fine :</p>
<blockquote>
<pre>&lt;command label="Undo" /&gt;</pre>
</blockquote>
<p><span style="text-decoration: underline;">Barres de progression</span></p>
<p>L’élément <code>progress</code> permet de présenter la progression d’une tâche :</p>
<blockquote>
<pre>Progress: &lt;progress&gt;&lt;span&gt;0&lt;/span&gt;%&lt;/progress&gt;&lt;/p&gt;</pre>
<pre>&lt;script&gt;</pre>
<pre>   var progressBar = document.getElementById('p');</pre>
<pre>   function updateProgress(newValue) {</pre>
<pre>      progressBar.textContent = newValue;</pre>
<pre>   }</pre>
<pre>&lt;/script&gt;</pre>
</blockquote>
<p>Notez que l’appel à cette fonction <code>updateProgress()</code> devra être fait manuellement.</p>
<p>Dans le même esprit, un élément <code>meter</code> est également prévu, pour afficher des mesures : pourcentages de votes, utilisation d’espace disque…</p>
<h3>Multimédia</h3>
<p>Vu la pauvreté du HTML 4 en la matière, le Flash Player est la référence de facto dans le domaine de la diffusion audio/vidéo embarquée dans les pages Web, avec sa compatibilité multi-navigateurs et ses API de manipulation.</p>
<p>HTML 5 fournit deux éléments <code>video</code> et <code>audio</code> dont l’objectif est de supporter nativement l’intégration et le contrôle des médias dans les pages Web :</p>
<blockquote>
<pre>&lt;video src="video.mp4"&gt;&lt;/video&gt;</pre>
<pre>&lt;script&gt;</pre>
<pre>   var video = document.getElementById("video");</pre>
<pre>&lt;/script&gt;</pre>
<pre>&lt;button&gt;Play&lt;/button&gt;</pre>
<pre>&lt;button&gt;Pause&lt;/button&gt;</pre>
<pre>&lt;button&gt;Rewind&lt;/button&gt;</pre>
</blockquote>
<p>Il sera donc possible de personnaliser l’interface utilisateur de manipulation des médias. Si ce n’est pas souhaité, l’attribut <code>controls</code> permettra d’indiquer au navigateur que c’est à lui de fournir cette interface.</p>
<p>Ce sera aux navigateurs de choisir les bons <em>codecs</em>. Il sera possible de spécifier différents formats via l’élément source :</p>
<blockquote>
<pre>&lt;video&gt;</pre>
<pre>   &lt;source src="video.ogv"&gt;</pre>
<pre>   &lt;source src="video.mp4"&gt;</pre>
<pre>&lt;/video&gt;</pre>
</blockquote>
<p>L’élément <code>audio</code> est prévu pour fonctionner d’une manière similaire :</p>
<blockquote>
<pre>&lt;audio&gt;</pre>
<pre>  &lt;source src="audio.oga"&gt;</pre>
<pre>  &lt;source src="audio.mp3"&gt;</pre>
<pre>&lt;/audio&gt;</pre>
</blockquote>
<p>Là encore, l’objectif est donc de fournir nativement ce que les solutions RIA nous ont proposé via des frameworks ou plugins.</p>
<h3>Compléments</h3>
<p>Les <em>frames</em> disparaissent ! Les éléments <code>frame</code>, <code>frameset</code> et <code>noframes</code> ne sont pas dans la spécification HTML 5 car leur utilisation a rendu difficiles l’expérience utilisateur et l’accessibilité.</p>
<p>Beaucoup d’attributs de présentation ont également été retirés afin d’inciter l’utilisation des équivalents CSS, bien plus adéquate : <code>align</code>, <code>bgcolor</code>, <code>border</code>, <code>cellpadding</code>, <code>cellspacing</code>, <code>width</code>, <code>height</code>…</p>
<h2>Apports « avancés » de HTML 5</h2>
<h3>Drag and drop et copier/coller</h3>
<p>Le « <em>drag and drop</em> », ou « glisser/déposer », est aujourd’hui un besoin courant dans les applications Web riches. Il est donc aujourd’hui largement proposé par la plupart des frameworks RIA. Il semblerait donc presque banal qu’il soit défini dans la spécification HTML 5.</p>
<p>Cependant, il faut savoir que dans les navigateurs actuels, qui implémentent HTML 4, les opérations « drag » sont limitées : vous ne pouvez lâcher des éléments qu’à l’intérieur de la fenêtre du navigateur. Si cela n’est pas gênant dans beaucoup de cas, il s’agit là d’une limitation importante, qui vous empêche de partager des données d’une application Web à une autre d’une manière conviviale.</p>
<p>HTLML 5 a pour objectif de casser cette limitation en proposant des interfaces <code>DragEvent</code> et <code>DataTransfer</code> :</p>
<blockquote>
<pre>interface <em>DragEvent</em> : MouseEvent {</pre>
<pre>   readonly attribute DataTransfer dataTransfer;</pre>
<pre>}</pre>
</blockquote>
<p>De manière assez traditionnelle pour ce genre de problématiques, les événements suivants sont gérés au fur et à mesure du drag and drop : <code>dragstart</code>, <code>drag</code>, <code>dragenter</code>, <code>dragleave</code>, <code>dragover</code>, <code>drop</code>, <code>dragend</code>. Lors de l’événement <code>dragstart</code>, l’objet <code>DataTransfer</code> est initialisé à une valeur qui pourra être récupérée lors de l’événement <code>drop</code>. Cette valeur pourra contenir des informations concernant l’objet déplacé. Cet objet doit être marqué comme étant déplaçable (attribut <code>draggable</code>).</p>
<p>Voici un exemple très simple permettant de déplacer un élément <code>div</code> d’un conteneur à un autre :</p>
<blockquote>
<pre>&lt;div&gt;</pre>
<pre>   &lt;div</pre>
<pre>        draggable="true"</pre>
<pre>        ondragstart="return dragStart(event)"</pre>
<pre>        ondragend="return dragEnd(event)"&gt;</pre>
<pre>      Item ‘draggable’</pre>
<pre>   &lt;/div&gt;</pre>
<pre>&lt;/div&gt;</pre>
<pre>&lt;div</pre>
<pre>     ondrop="return dragDrop(event)"</pre>
<pre>     ondragover="return dragOver(event)"&gt;</pre>
<pre>&lt;/div&gt;</pre>
</blockquote>
<p>On notera l’utilisation de nouveaux attributs dont le rôle est assez explicite. Voici le code des fonctions JavaScript qui traitent les événements générés :</p>
<blockquote>
<pre>&lt;script&gt;</pre>
<pre>   function dragStart(event) {</pre>
<pre>      ev.dataTransfer.setData(
         "ElemId",
         event.target.getAttribute('id')
      );</pre>
<pre>      return true;</pre>
<pre>   }</pre>
<pre>   function dragOver(event) {</pre>
<pre>      // Ici on peut aussi retourner ‘true’
      // si on souhaite empêcher le dépôt
      // sur l’élément survolé</pre>
<pre>      return false;</pre>
<pre>   }</pre>
<pre>   function dragEnd(event) {</pre>
<pre>      ev.dataTransfer.clearData("ElemId");</pre>
<pre>      return true;</pre>
<pre>   }</pre>
<pre>   function dragDrop(event) {</pre>
<pre>      var elemId = ev.dataTransfer.getData("ElemId");</pre>
<pre>      event.target.appendChild(
         document.getElementById(elemId)
      );</pre>
<pre>      // On empêche la propagation de l’événement</pre>
<pre>      ev.stopPropagation();</pre>
<pre>      return false;</pre>
<pre>   }</pre>
<pre>&lt;/script&gt;</pre>
</blockquote>
<p>Petite particularité : la notion de drag and drop n’est pas définie explicitement dans la spécification, elle reste ouverte. Cela ouvre la voie à de nombreuses possibilités, comme celle d’effectuer des « copier/coller ».</p>
<p>Le site <a href="http://html5demos.com/drag">http://html5demos.com/drag</a> vous propose quelques démonstrations.</p>
<h3>Géolocalisation</h3>
<p>Cet aspect n’est pas directement inclus dans la spécification HTML 5 mais il y est souvent lié. Une API de Géolocalisation est également en cours de spécifications : <a href="http://www.w3.org/TR/geolocation-API/">http://www.w3.org/TR/geolocation-API/</a>.</p>
<p>Son objectif est de permettre l’accès à la latitude et la longitude du périphérique sur lequel est exécuté le navigateur. Ces informations sont déterminées par analyse de diverses sources d’information : GPS, adresse IP, RFID, WiFi, Bluetooth, GSM…</p>
<p>Voici un exemple d’utilisation de cette API :</p>
<blockquote>
<pre>function traiterPosition(position) {</pre>
<pre>   // Utilisation des coordonnées
   // (ex : affichage d’une carte)</pre>
<pre>   // position.coords.latitude,
   // position.coords.longitude</pre>
<pre>}</pre>
</blockquote>
<blockquote>
<pre>navigator.geolocation.getCurrentPosition(
   traiterPosition
);</pre>
</blockquote>
<p>Cet exemple montre un appel unique à l’API : celle-ci propose un mécanisme de cache configurable en cas de besoin d’appels répétés.</p>
<p>Là encore vous pourrez effectuer des tests vous-mêmes sur le site <a href="http://html5demos.com/geo">http://html5demos.com/geo</a>. Les plus inquiets pourront constater que le navigateur vous demande votre permission avant de récupérer vos coordonnées.</p>
<h3>Graphisme 2D</h3>
<p>HTML 5 définit un élément <code>canvas</code> qui permet de faire du dessin en JavaScript : formes, graphes, retouches photographiques, et même animations.</p>
<blockquote>
<pre>&lt;canvas width="150" height="150"&gt;&lt;/canvas&gt;</pre>
</blockquote>
<p>Les dessins se font en travaillant sur des <em>rendering</em> <em>contexts</em>. Nous resterons ici dans le cadre du contexte 2D, mais il existe également un contexte 3D (en cours de spécification, basé sur Open GL ES).  Voici le code permettant de dessiner un rectangle bleu :</p>
<blockquote>
<pre>&lt;script&gt;</pre>
<pre>   var canvas = document.getElementById("monCanvas");</pre>
<pre>   if (canvas.getContext) {</pre>
<pre>      var ctx = canvas.getContext("2d");</pre>
<pre>      ctx.fillStyle = "rgb(0,0,255)";</pre>
<pre>      ctx.fillRect (10, 10, 50, 50);</pre>
<pre>   }</pre>
<pre>&lt;/script&gt;</pre>
</blockquote>
<p>Cet exemple est très simple mais cette API propose de nombreuses possibilités : rectangles, lignes droites, arcs de cercle, courbes cubiques et quadratiques, intégration d’images, translations, homothéties, rotations, gestion de la transparence, dégradés, ombres, animations, interactions avec la souris&#8230;</p>
<p>Pour en savoir plus, vous pouvez par exemple consulter le site de Mozilla : <a href="https://developer.mozilla.org/en/Canvas_tutorial">https://developer.mozilla.org/en/Canvas_tutorial</a>.</p>
<h3>Gestion du Content-Type et de l’encodage des caractères</h3>
<p>HTML 5 définit de nouveaux algorithmes de détection du <em>Content-Type</em> et de l’encodage des caractères. Du côté des développeurs, spécifier l’encodage utilisé devrait être bien plus simple. On retiendra les deux méthodes suivantes :</p>
<ul>
<li>Renseigner l’entête <code>Content-Type</code> des requêtes HTTP</li>
<li>Renseigner un élément <code>meta</code> de la page avec l’attribut <code>charset</code> comme suit :</li>
</ul>
<blockquote>
<pre>&lt;meta charset="UTF-8"&gt;</pre>
</blockquote>
<p>Plus besoin, donc, de la traditionnelle syntaxe verbeuse suivante :</p>
<blockquote>
<pre>&lt;meta http-equiv="Content-Type"
   content="text/html; charset=UTF-8"&gt;</pre>
</blockquote>
<p>Cette syntaxe sera cependant toujours supportée, toujours dans un souci de rétro-compatibilité.</p>
<h3>Gestion de l’historique et du bouton « Back »</h3>
<p>HTML 5 définit la notion de <em>browsing contexts</em> : il s’agit d’environnements dans lesquels les objets Document sont présentés aux utilisateurs. Ainsi, une fenêtre possède un browsing context, tout comme un onglet, une iframe ou une frame…</p>
<p>L’ensemble des documents d’un browsing context est nommé <em>session history</em>. Des objets <code>History</code> sont ainsi constitués, empilant les URL (ou des objets représentant un état) associées aux documents.</p>
<p>Cet historique est manipulable via une API dédiée :</p>
<blockquote>
<pre>interface History {</pre>
<pre>  readonly attribute long length;</pre>
<pre>  void go(optional in long delta);</pre>
<pre>  void back();</pre>
<pre>  void forward();</pre>
<pre>  void pushState(
     in any data,
     in DOMString title,
     optional in DOMString url
  );</pre>
<pre>  void clearState();</pre>
<pre>};</pre>
</blockquote>
<p>Ainsi l’appel suivant suffit à revenir à l’état précédent de l’historique :</p>
<blockquote>
<pre>window.history.back();</pre>
</blockquote>
<p>Cette API ressemble fortement à celle qui existait auparavant. Elle devrait cependant être plus poussée grâce à cette notion d’état, qui facilitera la gestion de l’historique dans les applications AJAX, de la même manière que l’ont proposé les frameworks.</p>
<p><strong><span style="text-decoration: underline;"> </span></strong></p>
<h3>Historique d’annulations</h3>
<p>Il s’agit là d’une nouveauté qui n’est pas encore prête : la spécification nous indique que plusieurs points pourraient bien être à revoir, nous allons donc en rester à une présentation brève.</p>
<p>L’idée de cette API nommée <code>UndoManager</code> est d’associer un historique d’annulations à chaque document. Cet historique sera manipulable et composé d’une liste d’éléments, pouvant être de deux types :</p>
<ul>
<li><em>DOM changes</em> : il s’agit d’objets représentant des modifications de la structure DOM opérés suite à une manipulation utilisateur (changement du contenu d’un nœud ou de la valeur d’un de ses attributs) ;</li>
<li><em>Undo objects</em> : il s’agit d’objets représentant des informations de plus haut niveau (état avant une action utilisateur ou l’envoi d’une requête au serveur, par exemple).</li>
</ul>
<h3>Mode offline</h3>
<p>HTML 5 est accompagné de la spécification Offline Web Applications : <a href="http://www.w3.org/TR/offline-webapps/">http://www.w3.org/TR/offline-webapps/</a>.</p>
<p>Cette spécification a pour objectif de permettre le développement d’applications Web utilisables en mode déconnecté, ou <em>offline</em>. Pour ce faire, elle apporte deux éléments :</p>
<ul>
<li>une base de données embarquée dans le navigateur et manipulable via une API reposant sur des requêtes SQL ;</li>
<li>un cache applicatif permettant de stocker dans le navigateur les réponses des requêtes HTTP effectuées.</li>
</ul>
<p><span style="text-decoration: underline;">Base de données</span></p>
<p>La base de données locale supporte les transactions. Elle sera manipulable de la manière suivante :</p>
<blockquote>
<pre>var db = openDatabase(
   "notes", "", "The Example Notes App!", 1048576);</pre>
<pre>function renderNotes() {</pre>
<pre>   db.transaction(</pre>
<pre>      function(tx) {</pre>
<pre>         tx.executeSql(</pre>
<pre>            'CREATE TABLE IF NOT EXISTS Notes(
               title TEXT, body TEXT
            )',</pre>
<pre>            []</pre>
<pre>         );</pre>
<pre>         tx.executeSql(‘SELECT * FROM Notes’, [],
            function(tx, rs) {</pre>
<pre>               for(var i=0; i&lt;rs.rows.length; i++) {</pre>
<pre>                  // Traitement de la note :
                  // rs.rows[i]</pre>
<pre>               }</pre>
<pre>            }
         );</pre>
<pre>      }</pre>
<pre>   );</pre>
<pre>}</pre>
<pre>function insertNote(title, text) {</pre>
<pre>   db.transaction(</pre>
<pre>      function(tx) {</pre>
<pre>         tx.executeSql(</pre>
<pre>            'INSERT INTO Notes VALUES(?, ?)', 

            [ title, text ],</pre>
<pre>            function(tx, rs) {</pre>
<pre>               // …</pre>
<pre>            },</pre>
<pre>            function(tx, error) {</pre>
<pre>               // Traitement</pre>
<pre>            }</pre>
<pre>         );</pre>
<pre>      }</pre>
<pre>   );</pre>
<pre>}</pre>
</blockquote>
<p>Cette API s’inspire donc très fortement du plugin Google Gears. Sauf qu’au lieu d’un plugin, cette base de données sera fournie nativement par les navigateurs.</p>
<p><span style="text-decoration: underline;">Cache applicatif</span></p>
<p>Ce cache reposera sur l’attribut <code>manifest</code> de l’élément <code>html</code>, qui pointe vers l’URI d’un fichier nommé « manifest ».</p>
<p>Ce fichier indique simplement la liste des fichiers à mettre en cache (section <code>CACHE MANIFEST</code>), ainsi que ceux qui ne doivent pas être mis en cache (section <code>NETWORK</code>) :</p>
<blockquote>
<pre>CACHE MANIFEST</pre>
<pre>index.html</pre>
<pre>help.html</pre>
<pre>style/default.css</pre>
<pre>images/logo.png</pre>
<pre>images/backgound.png</pre>
<pre>NETWORK:</pre>
<pre>server.cgi</pre>
</blockquote>
<p>La spécification prévoit d’autres moyens de définir le cache, via un préfixe par exemple. Elle prévoit également une API permettant aux scripts d’ajouter et retirer dynamiquement des fichiers du cache.</p>
<p><span style="text-decoration: underline;">Aspects communs</span></p>
<p>Pour déterminer si le client est connecté ou non, il suffira d’invoquer :</p>
<blockquote>
<pre>var isOnline = navigator.onLine;</pre>
</blockquote>
<h3>Web workers</h3>
<p>Cet aspect non plus n’est pas directement inclus dans la spécification HTML 5 mais souvent lié. Une API est également en cours de spécifications : <a href="http://www.whatwg.org/specs/web-workers/current-work/">http://www.whatwg.org/specs/web-workers/current-work/</a>.</p>
<p>Cette spécification définit une API pour exécuter des scripts en tâche de fond, donc indépendamment des scripts de l’interface utilisateur.</p>
<p>Elle permet ainsi l’exécution de scripts « longs » :</p>
<ul>
<li>sans interruption par des scripts de traitement d’actions utilisateur (clics par exemple) ;</li>
<li>sans besoin de mécanisme permettant de conserver une page réactive.</li>
</ul>
<p>Mais cette API est très claire : les <em>Workers</em> sont lourds et sont à utiliser avec parcimonie, et uniquement si réel besoin.</p>
<p>Voici un exemple très simple issu de la spécification : la tâche de fond est ici un algorithme naïf de recherche de nombres premiers :</p>
<blockquote>
<pre>The highest prime number discovered so far is:</pre>
<pre>&lt;output&gt;&lt;/output&gt;</pre>
<pre>&lt;script&gt;</pre>
<pre>   var worker = new Worker('worker.js');</pre>
<pre>   worker.onmessage = function (event) {</pre>
<pre>      var result = document.getElementById('result');
      result.textContent = event.data;</pre>
<pre>   };</pre>
<pre>&lt;/script&gt;</pre>
</blockquote>
<p>Voici le contenu du fichier worker.js :</p>
<blockquote>
<pre>var n = 1;</pre>
<pre>search: while (true) {</pre>
<pre>  n += 1;</pre>
<pre>  for (var i = 2; i &lt;= Math.sqrt(n); i += 1)</pre>
<pre>    if (n % i == 0)</pre>
<pre>     continue search;</pre>
<pre>  // found a prime!</pre>
<pre>  postMessage(n);</pre>
<pre>}</pre>
</blockquote>
<p>La spécification regorge d’exemples variés, à complexité et intérêt croissants.</p>
<h3>Web sockets</h3>
<p>HTML 5 introduit l’API Web Sockets, qui permettra de communiquer avec le serveur de manière bi-directionnelle à la manière de Comet et AJAX, mais avec les deux avantages suivants :</p>
<ul>
<li>cette API sera native ;</li>
<li>elle ne nécessitera qu’une seule connexion avec le serveur, au lieu de deux dans le cas de Comet et AJAX.</li>
</ul>
<p>En effet, Comet et AJAX reposent sur le protocole HTTP donc nécessitent une connexion pour envoyer des données et une autre pour en récupérer du serveur.</p>
<p>Cette API n’est pas encore détaillée dans la spécification HTML 5.</p>
<h3>Cross-document messaging</h3>
<p>Un des grands soucis avec AJAX était jusqu’ici l’impossibilité d’interactions entre des scripts de documents situés sur des domaines différents, pour des raisons de sécurité. Même si cette sécurité est justifiée, cela empêche des pages de communiquer même si elles ne sont pas dangereuses.</p>
<p>La spécification HTML 5 définit un système de communication entre documents à base de messages. Ce, quelque soit leur domaine, tout en conservant un niveau de sécurité optimal.</p>
<p>Voici un cas concret provenant de la spécification :</p>
<ul>
<li>un document A contient une <em>iframe</em> contenant un document B ;</li>
<li>un script du document A invoque une certaine fonction window.postMessage() sur le document B ;</li>
<li>Un événement <em>message</em> est alors déclenché sur le document B : ce message est marqué comme provenant de l’objet Window du document A.</li>
</ul>
<p>Voici le code qui correspond à cet exemple (script du document A) :</p>
<blockquote>
<pre>var docB = document.getElementsByTagName('iframe')[0];</pre>
<pre>docB.contentWindow.postMessage(
   'Hello world',
   'http://url/'
);</pre>
</blockquote>
<p>Et voici le script nécessaire dans le document B afin de surveiller l’arrivée de tels messages :</p>
<blockquote>
<pre>window.addEventListener('message', receiver, false);</pre>
<pre>function receiver(e) {</pre>
<pre>   if (e.origin == 'http://url/') {</pre>
<pre>      if (e.data == 'Hello world') {</pre>
<pre>         e.source.postMessage('Hello', e.origin);</pre>
<pre>      }</pre>
<pre>      else {</pre>
<pre>         alert(e.data);</pre>
<pre>      }</pre>
<pre>   }</pre>
<pre>}</pre>
</blockquote>
<p>Comme en AJAX, il est essentiel de vérifier que le domaine d’origine est celui attendu.</p>
<h2>Petit bilan</h2>
<p>Nous venons de dresser une synthèse des apports essentiels de la spécification HTML 5. Ces apports sont nombreux et ont pour objectifs de :</p>
<ul>
<li>rendre HTML plus adapté aux problématiques actuelles des applications Web ;</li>
<li>casser la dépendance du Web vis-à-vis des frameworks propriétaires, comme Flash, Flex, ou Silverlight.</li>
</ul>
<h3>Où en est HTML 5 aujourd’hui ?</h3>
<p>Les éléments que nous avons abordés dans cet article ne sont pas figés puisque la spécification est une version de travail. Certains exemples ne sont même peut-être plus d’actualité !</p>
<p>Les navigateurs ont déjà commencé à implémenter HTML 5, mais deux problèmes se posent :</p>
<ul>
<li>les implémentations dans les différents navigateurs sont hétérogènes et n’avancent pas à la même vitesse ;</li>
<li>il est en outre très difficile de savoir où en sont les navigateurs dans cette implémentation : les sites Web des éditeurs des navigateurs ne sont guère bavards sur le sujet, et si le Web regorge de pages de qui traitent le sujet, les informations qu’on trouve sont parfois contradictoires.</li>
</ul>
<p>En résumé, pour celui qui souhaite savoir si la version X du navigateur Y implémente déjà la caractéristique Z de HTML 5, il vaut mieux jeter un œil sur le Web et surtout effectuer des tests !</p>
<p>Côté outils de développement et de débogage, rien de particulier pour le moment : gardez sous le coude vos outils HTML habituels !</p>
<p>Cette spécification précise qu’elle ne sera finalisée que lorsqu’au moins deux implémentations complètes en auront été réalisées, afin de s’assurer de son adéquation avec les besoins des développeurs d’applications Web et les contraintes des éditeurs de navigateurs. Ian Hickson, co-rédacteur de la spécification, nous précise dans une interview (<a href="http://blogs.techrepublic.com.com/programming-and-development/?p=718">http://blogs.techrepublic.com.com/programming-and-development/?p=718</a>) que cela arrivera en … 2022 ! Le planning est donc long, à cause de l’historique et des objectifs à atteindre.</p>
<p>En effet, le travail est considérable : la spécification en est consciente et tente de ne pas reproduire les erreurs du passé. Ainsi, elle sépare clairement les <em>requirements</em> à destination des développeurs de ceux à destination des éditeurs de navigateurs. De même, au lieu de donner des définitions abstraites comme dans les versions précédentes, elle donne des définitions impératives afin de favoriser l’interopérabilité entre les implémentations. La « bataille » entre navigateurs ayant repris de plus belle, il s’agit là d’une problématique très importante. Ce planning ne serait-il pas trop long, tout de même ?</p>
<h3>HTML 5, « killer » de Flex et Silverlight ?</h3>
<p>Ce titre vous surprendra peut-être, mais on peut lire plusieurs articles sur Internet qui présentent HTML 5 comme le langage qui va conquérir le monde des RIA. Pourquoi ? Parce que les apports de HTML 5 comblent plusieurs manques de HTML vis-à-vis de ces technologies : vidéo, audio, mode offline, drag and drop…</p>
<p>Sauf que ces technologies sont déjà disponibles, plus évoluées et largement mises en œuvre pour certaines. Le Flash Player, après plus de 10 ans, est présent sur 99% des navigateurs. HTML 5 est « plus RIA » que HTML 4, oui. Rattrape-t-il son retard sur Flex ou Silverlight ? Non. D’autant plus que lorsque HTML 5 sera finalisé en 2022, le monde des RIA aura largement eu le temps d’évoluer ! Le planning semble donc trop long. Mais il est primordial que le W3C définisse des normes adéquates aux problématiques actuelles afin de limiter le recours à des technologies non natives et propriétaires.</p>
<p>Cette comparaison entre HTML 5 et les autres technologies RIA a été mise en avant lors de l’annonce officielle de Google Wave : l’application Web de Google Wave, impressionnante, repose sur certains apports de HTML 5 et Google a largement communiqué sur ce sujet.</p>
<h2>Quelques liens pour approfondir</h2>
<p>Sites officiels de la spécification :</p>
<p><a href="http://www.w3.org/TR/html5/">http://www.w3.org/TR/html5/</a></p>
<p><a href="http://www.w3.org/TR/html5-diff/">http://www.w3.org/TR/html5-diff/</a></p>
<p>Deux pages qui synthétisent l’état d’avancement de l’implémentation par les navigateurs :</p>
<p><a href="http://a.deveria.com/caniuse/">http://a.deveria.com/caniuse/</a></p>
<p><a href="http://en.wikipedia.org/wiki/Comparison_of_layout_engines_%28HTML_5%29#Web_Applications_1.0">http://en.wikipedia.org/wiki/Comparison_of_layout_engines_%28HTML_5%29#Web_Applications_1.0</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.aeon-consulting.fr/fr/blog/2009/11/01/html-5-simple-evolution-de-html-ou-veritable-technologie-ria/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Article dans &#171;&#160;Programmez !&#187;&#160; : présentation de HTML 5 par Aeon Consulting</title>
		<link>http://www.aeon-consulting.fr/fr/blog/2009/10/19/article-dans-programmez-presentation-de-html-5-par-aeon-consulting/</link>
		<comments>http://www.aeon-consulting.fr/fr/blog/2009/10/19/article-dans-programmez-presentation-de-html-5-par-aeon-consulting/#comments</comments>
		<pubDate>Mon, 19 Oct 2009 16:19:07 +0000</pubDate>
		<dc:creator>Aeon Consulting</dc:creator>
				<category><![CDATA[Revue de Presse]]></category>
		<category><![CDATA[AJAX]]></category>
		<category><![CDATA[Flex]]></category>
		<category><![CDATA[HTML5]]></category>
		<category><![CDATA[RIA]]></category>
		<category><![CDATA[Silverlight]]></category>

		<guid isPermaLink="false">http://www.aeon-consulting.fr/?p=293</guid>
		<description><![CDATA[La célèbre magazine &#171;&#160;Programmez !&#187;&#160;, dédié au développement logiciel, vient de publier son numéro 123 du mois d&#8217;octobre 2009. Vous y trouverez en pages 14 à 20 un article de présentation de HTML 5 rédigé par deux de nos consultants, François Goldgewicht et Nicolas Franchet :

Le site Web de la revue vous propose un résumé [...]]]></description>
			<content:encoded><![CDATA[<p>La célèbre magazine <strong><a href="http://www.programmez.com" target="_blank">&laquo;&nbsp;Programmez !&raquo;&nbsp;</a></strong>, dédié au développement logiciel, vient de publier son numéro 123 du mois d&#8217;octobre 2009. Vous y trouverez en pages 14 à 20 <strong>un article de présentation de HTML 5 rédigé par deux de nos consultants, François Goldgewicht et Nicolas Franchet</strong> :</p>
<p style="text-align: center;"><a style="margin-right:25px" href="http://www.aeon-consulting.fr/wp-content/uploads/2009/10/Press-2009-10-Programmez-HTML5-Cover.jpg"><img title="Article HTML 5 Programmez !" src="http://www.aeon-consulting.fr/wp-content/uploads/2009/10/Press-2009-10-Programmez-HTML5-Cover.jpg" alt="" width="175" /></a><a style="margin-left:25px" href="http://www.aeon-consulting.fr/wp-content/uploads/2009/10/Press-2009-10-Programmez-HTML5-Article.jpg"><img title="Article HTML 5 Programmez !" src="http://www.aeon-consulting.fr/wp-content/uploads/2009/10/Press-2009-10-Programmez-HTML5-Article.jpg" alt="" width="175" /></a></p>
<p>Le site Web de la revue vous propose <a href="http://www.programmez.com/magazine_articles.php?titre=HTML-5--la-revolution-&amp;id_article=1271&amp;magazine=123">un résumé de cet article</a> :</p>
<blockquote><p><em>La spécification HTML 5 fait de plus en plus parler d’elle : au cours de ces 10 ans de HTML 4, le Web a évolué et de nouveaux besoins sont apparus. En particulier, concernant la notion d’application Web : les lacunes de HTML 4 en la matière ont été comblées de diverses façons par les différents frameworks apparus mais ce manque de solutions natives a grandement complexifié la programmation Web. HTML 5 apporte de nombreuses améliorations au langage HTML, en termes de flexibilité, d’interopérabilité et de richesse de l’expérience utilisateur. A un tel point qu’il est souvent élevé au rang de technologie RIA « killer de Flex, Silverlight et JavaFX ».</em></p></blockquote>
<p>Nous vous souhaitons une bonne lecture en espérant que cet article vous aidera à mieux cerner HTML 5 et ses réels apports.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.aeon-consulting.fr/fr/blog/2009/10/19/article-dans-programmez-presentation-de-html-5-par-aeon-consulting/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Aeon Consulting publie les tarifs de toutes ses formations</title>
		<link>http://www.aeon-consulting.fr/fr/blog/2009/09/23/aeon-consulting-publishes-prices-all-training-sessions/</link>
		<comments>http://www.aeon-consulting.fr/fr/blog/2009/09/23/aeon-consulting-publishes-prices-all-training-sessions/#comments</comments>
		<pubDate>Wed, 23 Sep 2009 16:16:28 +0000</pubDate>
		<dc:creator>Aeon Consulting</dc:creator>
				<category><![CDATA[Training]]></category>
		<category><![CDATA[.NET]]></category>
		<category><![CDATA[Agile]]></category>
		<category><![CDATA[AJAX]]></category>
		<category><![CDATA[Android]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[Cloud]]></category>
		<category><![CDATA[EJB]]></category>
		<category><![CDATA[Flex]]></category>
		<category><![CDATA[GWT]]></category>
		<category><![CDATA[iPhone]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[JEE]]></category>
		<category><![CDATA[RDA]]></category>
		<category><![CDATA[REST]]></category>
		<category><![CDATA[RIA]]></category>
		<category><![CDATA[RMA]]></category>
		<category><![CDATA[Silverlight]]></category>
		<category><![CDATA[Spring]]></category>
		<category><![CDATA[WS-*]]></category>
		<category><![CDATA[XML]]></category>
		<category><![CDATA[XSL]]></category>

		<guid isPermaLink="false">http://www.aeon-consulting.fr/?p=290</guid>
		<description><![CDATA[Nous avons mis en ligne les tarifs de toutes nos formations : voir notre catalogue.
Dans un souci d&#8217;être toujours plus compétitifs tout en répondant à vos attentes, vous pourrez constater que nous vous avons réservé des promotions sur certaines formations.
N’hésitez pas à nous contacter pour tout complément : sur votre demande, nous pouvons mettre sur [...]]]></description>
			<content:encoded><![CDATA[<p>Nous avons mis en ligne les tarifs de toutes nos formations : voir <a href="http://www.aeon-consulting.fr/fr/training/">notre catalogue</a>.</p>
<p>Dans un souci d&#8217;être toujours plus compétitifs tout en répondant à vos attentes, vous pourrez constater que nous vous avons réservé des promotions sur certaines formations.</p>
<p>N’hésitez pas à <a href="/fr/contact/">nous contacter</a> pour tout complément : sur votre demande, nous pouvons mettre sur pied tous types de formations.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.aeon-consulting.fr/fr/blog/2009/09/23/aeon-consulting-publishes-prices-all-training-sessions/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Lancement des Formations Aeon Consulting</title>
		<link>http://www.aeon-consulting.fr/fr/blog/2009/07/28/aeon-consulting-launches-training-activities/</link>
		<comments>http://www.aeon-consulting.fr/fr/blog/2009/07/28/aeon-consulting-launches-training-activities/#comments</comments>
		<pubDate>Tue, 28 Jul 2009 14:25:22 +0000</pubDate>
		<dc:creator>Aeon Consulting</dc:creator>
				<category><![CDATA[Training]]></category>
		<category><![CDATA[.NET]]></category>
		<category><![CDATA[Agile]]></category>
		<category><![CDATA[AJAX]]></category>
		<category><![CDATA[Android]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[Cloud]]></category>
		<category><![CDATA[EJB]]></category>
		<category><![CDATA[Flex]]></category>
		<category><![CDATA[GWT]]></category>
		<category><![CDATA[iPhone]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[JEE]]></category>
		<category><![CDATA[RDA]]></category>
		<category><![CDATA[REST]]></category>
		<category><![CDATA[RIA]]></category>
		<category><![CDATA[RMA]]></category>
		<category><![CDATA[Silverlight]]></category>
		<category><![CDATA[Spring]]></category>
		<category><![CDATA[WS-*]]></category>
		<category><![CDATA[XML]]></category>
		<category><![CDATA[XSL]]></category>

		<guid isPermaLink="false">http://www.aeon-consulting.fr/?p=208</guid>
		<description><![CDATA[Nous avons le plaisir de vous annoncer le lancement des formations Aeon Consulting.
Nous animons nos formations dans des contextes inter-entreprises et intra-entreprises et notre catalogue est réparti selon nos thèmes clés :

Thème &#171;&#160;Applications Riches&#187;&#160;

Rich Internet Applications (RIA)
Rich Desktop Applications (RDA)
Rich Mobile Applications (RMA)


Thème &#171;&#160;Architectures Applicatives&#187;&#160;

Développement Java/JEE
Développement C#/.NET
Sujets transverses


Thème &#171;&#160;Méthodes et Outils&#187;&#160;

Conception et modélisation
Méthodologies



Voici les dates [...]]]></description>
			<content:encoded><![CDATA[<p>Nous avons le plaisir de vous annoncer le lancement des <a href="/fr/training/">formations Aeon Consulting</a>.</p>
<p>Nous animons nos formations dans des contextes inter-entreprises et intra-entreprises et notre <a href="/fr/training/">catalogue</a> est réparti selon nos thèmes clés :</p>
<ul>
<li><strong>Thème &laquo;&nbsp;Applications Riches&raquo;&nbsp;</strong>
<ul>
<li>Rich Internet Applications (RIA)</li>
<li>Rich Desktop Applications (RDA)</li>
<li>Rich Mobile Applications (RMA)</li>
</ul>
</li>
<li><strong>Thème &laquo;&nbsp;Architectures Applicatives&raquo;&nbsp;</strong>
<ul>
<li>Développement Java/JEE</li>
<li>Développement C#/.NET</li>
<li>Sujets transverses</li>
</ul>
</li>
<li><strong>Thème &laquo;&nbsp;Méthodes et Outils&raquo;&nbsp;</strong>
<ul>
<li>Conception et modélisation</li>
<li>Méthodologies</li>
</ul>
</li>
</ul>
<p>Voici les dates des premières formations planifiées :</p>
<p><span id="more-208"></span></p>
<ul>
<li>21 septembre 2009 : <a href="/fr/training/r-iph/">Développement iPhone et iPod Touch [R-IPH]</a>
<ul>
<li><span style="color: #ff0000;">Formation animée par François GOLDGEWICHT, Consultant Senior et Directeur Technique d&#8217;Aeon Consulting, qui a développé et distribué plusieurs applications iPhone à succès</span></li>
<li><span style="color: #ff0000;">Un iPod Touch offert à chaque participant à l&#8217;issue de cette formation !</span></li>
</ul>
</li>
<li>05 octobre 2009 : <a href="/fr/training/a-spr/">Développement Spring 3.0 [A-SPR]</a></li>
<li>19 octobre 2009 : <a href="/fr/training/r-iphi/">Introduction au développement iPhone et iPod Touch [R-IPHI]</a></li>
<li>09 novembre 2009 : <a href="/fr/training/a-rsti/">Introduction à REST [A-RSTI]</a></li>
<li>16 novembre 2009 : <a href="/fr/training/r-pan/">Panorama des styles et technologies RIA [R-PAN]</a></li>
<li>23 novembre 2009 : <a href="/fr/training/a-cldi/">Introduction au Cloud Computing [A-CLDI]</a></li>
<li>30 novembre 2009 : <a href="/fr/training/r-iph/">Développement iPhone et iPod Touch [R-IPH]</a>
<ul>
<li><span style="color: #ff0000;">Voir session du 21 septembre 2009</span></li>
</ul>
</li>
<li>07 décembre 2009 : <a href="/fr/training/a-spr/">Développement Spring 3.0 [A-SPR]</a></li>
<li>04 janvier 2010 : <a href="/fr/training/r-iphi/">Introduction au développement iPhone et iPod Touch [R-IPHI]</a></li>
<li>11 janvier 2010 : <a href="/fr/training/a-rsti/">Introduction à REST [A-RSTI]</a></li>
<li>18 janvier 2010 : <a href="/fr/training/r-pan/">Panorama des styles et technologies RIA [R-PAN]</a></li>
<li>25 janvier 2010 : <a href="/fr/training/a-cldi/">Introduction au Cloud Computing [A-CLDI]</a></li>
</ul>
<p>Vous pouvez découvrir la description de nos formations, notre catalogue ainsi que les modalités d&#8217;inscription sur la page dédiée : <a href="/fr/training/">Formations</a>.</p>
<p>N’hésitez pas à <a href="/fr/contact/">nous contacter</a> pour tout complément : sur votre demande, nous pouvons mettre sur pied tous types de formations.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.aeon-consulting.fr/fr/blog/2009/07/28/aeon-consulting-launches-training-activities/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
