<?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; Carnets de Vol IT</title>
	<atom:link href="http://www.aeon-consulting.fr/fr/blog/category/carnets-de-vol-it/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>Cloud Computing : où en est-on ?</title>
		<link>http://www.aeon-consulting.fr/fr/blog/2010/01/16/cloud-computing-ou-en-est-on/</link>
		<comments>http://www.aeon-consulting.fr/fr/blog/2010/01/16/cloud-computing-ou-en-est-on/#comments</comments>
		<pubDate>Sat, 16 Jan 2010 01:44:13 +0000</pubDate>
		<dc:creator>François Goldgewicht</dc:creator>
				<category><![CDATA[Carnets de Vol IT]]></category>
		<category><![CDATA[Cloud]]></category>

		<guid isPermaLink="false">http://www.aeon-consulting.fr/?p=517</guid>
		<description><![CDATA[En quelques mois, le Cloud Computing a bel et bien dépassé l&#8217;état de simple &#171;&#160;buzz&#187;&#160; marketing pour devenir une véritable révolution informatique. En effet, tous les grands acteurs du monde informatique proposent aujourd&#8217;hui leurs solutions &#171;&#160;dans les nuages&#187;&#160; permettant aux entreprises d&#8217;externaliser leurs systèmes informatiques à des fournisseurs spécialisés : Google, Amazon, VMware, Microsoft, SalesForce, [...]]]></description>
			<content:encoded><![CDATA[<p>En quelques mois, le <strong>Cloud Computing a bel et bien dépassé l&#8217;état de simple &laquo;&nbsp;buzz&raquo;&nbsp; marketing pour devenir une véritable révolution informatique</strong>. En effet, tous les grands acteurs du monde informatique proposent aujourd&#8217;hui leurs solutions &laquo;&nbsp;dans les nuages&raquo;&nbsp; permettant aux entreprises d&#8217;externaliser leurs systèmes informatiques à des fournisseurs spécialisés : Google, Amazon, VMware, Microsoft, SalesForce, IBM&#8230;</p>
<p>Dans la lignée du <a href="http://www.aeon-consulting.fr/fr/blog/2010/01/16/interview-dans-01-informatique-dossier-cloud-computing-par-aeon-consulting/">dossier proposé par 01 Informatique</a>, il est donc intéressant de dresser un petit point sur quelques aspects du Cloud Computing.<br />
<span id="more-517"></span></p>
<h2>Sur la maturité des développeurs et architectes Cloud</h2>
<p>Les composants des applications Cloud restent dans l&#8217;ensemble similaires à ceux des applications Web traditionnelles : les développeurs techniques peuvent donc généralement monter en compétences rapidement sur les solutions PaaS. Cet aspect est renforcé par le fait que les plateformes Cloud proposent des services techniques classiques : persistance des données, hébergement de l&#8217;application, authentification et droits des utilisateurs, intégration&#8230;</p>
<p><strong>Le manque de recul concerne en général davantage l&#8217;intégration d&#8217;une application Cloud dans le SI</strong> : par exemple, c&#8217;est une chose d&#8217;envisager l&#8217;externalisation d&#8217;une application, mais il faut également être prêt à externaliser ses données. En pratique, c&#8217;est plus facile à envisager pour des services annexes ou transverses que pour des services au cœur du métier de l&#8217;entreprise. Sans oublier les aspects juridiques largement évoqués dans la presse spécialisée&#8230;</p>
<h2>Sur les difficultés de mise en œuvre</h2>
<h3>Développement</h3>
<p>Cela varie en fonction des solutions. La solution PaaS de Google, App Engine, par exemple, nous affranchit de nombreuses difficultés côté environnements de développement et déploiement puisqu&#8217;on utilise Eclipse et des plugins qui permettent de créer des projets et de les déployer dans l&#8217;environnement de test local ou dans les nuages en quelques clics. Par contre, l&#8217;environnement de test local est très différent de l&#8217;environnement de production, ce qui ne facilite pas les tests et la détection de problèmes en amont.</p>
<p>Et surtout, cette solution implique des <strong>changements dans la façon de concevoir l&#8217;architecture des applications</strong> : par exemple, le datastore nécessite d&#8217;implémenter les relations entre les objets et les transactions différemment de nos applications relationnelles traditionnelles. Sans oublier les restrictions sur l&#8217;utilisation des ressources : délai maximal de 30 secondes par traitement, récupération d&#8217;au plus 1000 entrées par requête dans le datastore&#8230;</p>
<p>L&#8217;offre IaaS d&#8217;Amazon, EC2, à l&#8217;inverse, permet la mise en œuvre d&#8217;architectures plus classiques mais requiert la manipulation de machines virtuelles sur lesquelles sont déployées les applications.</p>
<p>D&#8217;où l&#8217;intérêt de surveiller le nouvel arrivant dans la course, Cloud Foundry, de Spring (récemment acquis par VMware). Cette offre PaaS, reposant à l&#8217;heure actuelle sur Amazon EC2, se veut justement rendre transparente la manipulation des machines virtuelles tout en permettant des développement plus traditionnels que ceux imposés par Google App Engine.</p>
<p>Entre les différentes solutions, IaaS ou PaaS, le match ne fait donc que commencer. Et le <strong>manque de portabilité</strong> entre elles ne va pas faciliter le combat !</p>
<h3>Exploitation</h3>
<p>Le <strong>dimensionnement </strong>est le premier problème majeur. Derrière l&#8217;image de l&#8217;opérateur de service à qui on confie l&#8217;hébergement de l&#8217;application avec la garantie du bon fonctionnement même quand d&#8217;importantes montées en charge sont nécessaires, on occulte souvent la nécessité &#8211; et la difficulté &#8211; de déterminer précisément la quantité de ressources dont on a besoin : en termes de requêtes HTTP entrantes ou sortantes, requêtes en base de données, accès au cache, etc. L&#8217;estimation de ces métriques n&#8217;est pas simple et ne doit pas être négligée : on délègue certaines tâches d&#8217;exploitation, mais celle-ci reste à notre charge.</p>
<p>La seconde problématique majeure (et inhérente) est la <strong>tarification</strong> : de simples tableaux associant des coûts à des quantités de ressources nous sont présentés mais comment les exploiter si on n&#8217;est pas en mesure de dimensionner nos besoins ?</p>
<h2>Sur le Cloud et son écosystème</h2>
<h3>Emergence du Cloud Computing</h3>
<p>Deux types d&#8217;applications ont largement contribué à l&#8217;émergence du Cloud Computing : d&#8217;abord les <strong>RIA </strong>(Rich Internet Applications), applications client/serveur sans déploiement sur les postes client et aux interfaces utilisateurs ergonomiques. Puis les <strong>applications Mobiles</strong>, sur des appareils comme iPhone ou Android. Le succès de l&#8217;App Store d&#8217;Apple, impressionnant et grandissant encore, ouvre la voie à des applications utilisées par des dizaines ou centaines de milliers d&#8217;utilisateurs à travers le monde, il est donc intéressant de pouvoir bénéficier d&#8217;hébergements scalables à moindre coût pour les services métier.</p>
<h3>Cloud Computing et SOA</h3>
<p>A l&#8217;instar de <a href="http://geekandpoke.typepad.com/geekandpoke/2009/12/from-hype-to-hype.html" target="_blank">cette excellente image humoristique</a>, j&#8217;ai lu plusieurs fois que &laquo;&nbsp;le Cloud avait remplacé SOA&raquo;&nbsp;. Au niveau marketing, peut-être&#8230; Mais aux niveaux opérationnel et technique, le Cloud ne remplace pas SOA, il peut au contraire reposer sur la collaboration entre applications et services.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.aeon-consulting.fr/fr/blog/2010/01/16/cloud-computing-ou-en-est-on/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>SOA et la notion de contrat de service</title>
		<link>http://www.aeon-consulting.fr/fr/blog/2010/01/16/soa-et-la-notion-de-contrat-de-service/</link>
		<comments>http://www.aeon-consulting.fr/fr/blog/2010/01/16/soa-et-la-notion-de-contrat-de-service/#comments</comments>
		<pubDate>Sat, 16 Jan 2010 00:23:39 +0000</pubDate>
		<dc:creator>François Goldgewicht</dc:creator>
				<category><![CDATA[Carnets de Vol IT]]></category>
		<category><![CDATA[BPM]]></category>
		<category><![CDATA[ESB]]></category>
		<category><![CDATA[SOA]]></category>

		<guid isPermaLink="false">http://www.aeon-consulting.fr/?p=502</guid>
		<description><![CDATA[L&#8217;objectif de cet article n&#8217;est pas de faire une présentation détaillée de SOA : je rencontrerais quelques difficultés à rester concis ! Dans les projets sur lesquels je travaille, je constate des omissions et confusions récurrentes autour de la notion de contrat de service. L&#8217;objet de cette brève est de lever le doute autour de [...]]]></description>
			<content:encoded><![CDATA[<p>L&#8217;objectif de cet article n&#8217;est pas de faire une présentation détaillée de SOA : je rencontrerais quelques difficultés à rester concis ! Dans les projets sur lesquels je travaille, je constate des omissions et confusions récurrentes autour de la notion de contrat de service. L&#8217;objet de cette brève est de lever le doute autour de cette <strong>notion qui est au cœur des démarches SOA</strong>.<br />
<br/><span id="more-502"></span></p>
<h2>Sur la notion de service</h2>
<p>La définition de la <strong>notion de service fait rarement l&#8217;unanimité</strong> est c&#8217;est là le point de départ des incompréhensions autour de SOA. Je choisirai donc ici une définition que je rencontre souvent :</p>
<blockquote><p><em>&laquo;&nbsp;un service est un ensemble d’opérations mises à disposition par un fournisseur à l’attention d’un consommateur. Ce fournisseur exécute les traitements invoqués par le client consommateur&raquo;&nbsp;</em></p></blockquote>
<p>Cette définition présente plusieurs lacunes. Celle qui m&#8217;intéresse dans le cadre de cet article est l’absence de référence à la notion de contrat de service. En effet, dans le cadre d’une démarche SOA, <strong>la notion de service n&#8217;est pas dissociable de la notion de contrat de service</strong> car il est nécessaire de formaliser le lien entre fournisseur et consommateur pour faciliter la mise en œuvre du service et sa réutilisation.</p>
<p>Soyons plus optimiste, on trouve parfois dans les définitions de la notion de service une référence à cette notion de contrat de service, formulée de la manière suivante :</p>
<blockquote><p><em>&laquo;&nbsp;le contrat de service décrit les opérations invocables du service&raquo;&nbsp;</em></p></blockquote>
<p>Cette définition floue est heureusement parfois complétée par des précisions intéressantes :</p>
<blockquote><p><em><em>&laquo;&nbsp;le contrat de service décrit les opérations invocables du service, </em><em>c&#8217;est-à-dire la signature de ces opérations et les protocoles réseau utilisables&raquo;&nbsp;</em></em></p></blockquote>
<p>Cette dernière définition a beau être plus claire, elle n&#8217;en est pas pour autant complète.</p>
<h2>Sur la notion de contrat de service</h2>
<p><strong>La notion de contrat de service est – et doit être &#8211; bien plus précise</strong>. En fait, la signature des opérations et les protocoles réseau ne sont que deux aspects d’un contrat. J’aime assez la décomposition suivante d’un contrat, en <strong>cinq aspects </strong>:</p>
<ul>
<li><strong>Sémantique</strong> : signification des opérations et de leurs valeurs de retours, pré-conditions, post-conditions&#8230;</li>
<li><strong>Syntaxe </strong>: nom et signature des opérations, c&#8217;est-à-dire format des paramètres en entrée et en sortie</li>
<li><strong>Protocoles réseau </strong>: ensemble des protocoles réseau utilisables pour invoquer les opérations</li>
<li><strong>Protocole de conversation </strong>: ordre dans lequel les opérations doivent être invoquées</li>
<li><strong>Niveau de qualité </strong>: Qualité de Service (QoS) et Service Level Agreement (SLA), c&#8217;est-à-dire garanties en matière de sécurité, fiabilité, disponibilité, performance&#8230;</li>
</ul>
<p>Maintenant que nous avons clarifié la composition d’un contrat de service, qu’en fait-on ?</p>
<h2>Sur la formalisation du contrat de service</h2>
<p><strong>Un contrat de service peut être formalisé</strong>. Un formalisme commun facilite la mise en place et la réutilisation de services. Il existe différentes formes de formalisation et toutes ne sont pas standardisées mais <strong>certaines permettent d&#8217;automatiser la prise en charge d’un ou plusieurs aspects du contrat</strong>. Par exemple :</p>
<ul>
<li>Syntaxe et Protocoles réseau : la formalisation de ces aspects peut être exploitée pour générer les <em>stubs </em>côté client. C’est le cas du <strong>WSDL </strong>pour les Web Services WS-* ou du WADL pour les Web Services REST (enfin, pour ceux qui ne sont pas contre l’utilisation du WADL dans REST, mais ceci est un autre débat !)</li>
<li>Protocole de conversation : le <strong>BPM</strong>, grâce à la formalisation standard BPEL, est un excellent exemple d’exploitation automatisée de cet aspect</li>
</ul>
<p>Notons que les <strong>ESB </strong>permettent d’exploiter de manière automatisée l’ensemble de la formalisation de contrats, même si l&#8217;aspect Niveau de qualité (voir par exemple les couches concernées de la stack WS-*) est plus difficile à exploiter de manière automatisée et l&#8217;aspect Sémantique (voir par exemple UDDI) l&#8217;est encore plus.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.aeon-consulting.fr/fr/blog/2010/01/16/soa-et-la-notion-de-contrat-de-service/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Les entreprises de plus en plus attirées par l&#8217;iPhone</title>
		<link>http://www.aeon-consulting.fr/fr/blog/2009/11/20/les-entreprises-de-plus-en-plus-attirees-par-iphone/</link>
		<comments>http://www.aeon-consulting.fr/fr/blog/2009/11/20/les-entreprises-de-plus-en-plus-attirees-par-iphone/#comments</comments>
		<pubDate>Thu, 19 Nov 2009 22:59:18 +0000</pubDate>
		<dc:creator>François Goldgewicht</dc:creator>
				<category><![CDATA[Carnets de Vol IT]]></category>
		<category><![CDATA[iPhone]]></category>

		<guid isPermaLink="false">http://www.aeon-consulting.fr/?p=337</guid>
		<description><![CDATA[Initialement l&#8217;eldorado des éditeurs, des développeurs indépendants et même des étudiants, l&#8217;App Store propose aujourd&#8217;hui de nombreuses applications de grands comptes. Pour quelle(s) raison(s) ? Un an et demi après le lancement de l&#8217;App Store, essayons de répondre à cette question en cinq points.

Idée n°1 : Pourquoi l’iPhone n’est pas qu’un énième gadget
L’iPhone a avant [...]]]></description>
			<content:encoded><![CDATA[<p>Initialement l&#8217;eldorado des éditeurs, des développeurs indépendants et même des étudiants, l&#8217;App Store propose aujourd&#8217;hui de nombreuses applications de grands comptes. Pour quelle(s) raison(s) ? Un an et demi après le lancement de l&#8217;App Store, essayons de répondre à cette question en cinq points.</p>
<p><span id="more-337"></span></p>
<h2>Idée n°1 : Pourquoi l’iPhone n’est pas qu’un énième gadget</h2>
<p>L’iPhone a avant tout représenté une <em>curiosité technologique</em> : malgré une sortie officielle en juin 2007, il a alimenté toutes sortes de mystères sur Internet dès la fin de l’année 2005.</p>
<p>L’iPhone n’est pas le premier appareil ayant permis une connexion Internet Edge puis 3G. Mais il est l’<strong>initiateur de l’ère des forfaits de données illimités</strong> : ces forfaits ont ouvert la voie à de nouvelles applications réellement <strong>connectées</strong>.</p>
<p>L’iPhone n’est pas non plus le premier appareil ayant proposé un appareil photo/caméra, une puce WiFi, une puce GPS, un accéléromètre et une boussole. Mais l’iPhone est un <em>bijou technologique</em> car <strong>son système d’exploitation, iPhone OS, a défini de nouveaux standards en matière de <em>design</em> et d’<em>ergonomie</em></strong> des applications qui exploitent tous ces composants électroniques. Le Multi-Touch en est l’un des éléments essentiels.</p>
<p>C’est ce qui a fait qu’aujourd’hui, après seulement quelques mois, plusieurs millions de personnes utilisent un iPhone au quotidien.</p>
<h2>Idée n°2 : Pourquoi l’iPhone n’intéresse pas que le grand public</h2>
<p>Au-delà des intérêts techniques que nous venons de mettre en avant, il suffit de jeter un œil aux statistiques pour se rendre compte de l’impact de l’iPhone : <strong>plus de 50 millions d’iPhone, iPhone 3G, iPhone 3GS et iPod Touch ont été vendus</strong> dans le monde. Rappelons au passage que l&#8217;iPod Touch est également équipé de l&#8217;iPhone OS.</p>
<p>Les statistiques de l’App Store, seulement lancé en juin 2008, parlent également d’elles-mêmes :</p>
<ul>
<li>77 pays</li>
<li><strong>90 000 applications</strong></li>
<li>120 000 développeurs</li>
<li>Plus de <strong>2 000 000 000 téléchargements</strong> dont le dernier quart en moins de 3 mois.</li>
</ul>
<p>Ces chiffres sont uniques, les plateformes Android et Blackberry par exemple ne connaissent pas (encore ?) une telle croissance. Et ces chiffres ne font que croître. Fait significatif, l’App Store supporte parfaitement cette croissance. Cette <strong>impressionnante <em>scalabilité </em>de l&#8217;App Store</strong> en fait une plateforme internationale redoutable.</p>
<p>Un autre chiffre est significatif : <strong>75% des applications présentes sur l’App Store sont payantes</strong>. Ce n’est pas le cas sur les plateformes Android et Blackberry, respectivement autour de 25% et 55%.</p>
<p>De là, il n’y a qu’un pas pour qu’une entreprise souhaite distribuer des applications sur l’App Store, pour des raisons marketing et business. Et quand on sait qu’il suffit d&#8217;un seul clic sur l&#8217;iPhone pour télécharger une application ou un contenu/service additionnel, gratuit ou payant…</p>
<h2>Idée n°3 : Comment les entreprises ont fait leur entrée sur l’App Store</h2>
<p>La première année d’existence de l’App Store a vu fleurir des applications de deux types :</p>
<ul>
<li><strong>Applications de tous genres</strong> réalisées par des entreprises ou des particuliers, qui représentent pour la plupart des <strong>adaptations Mobiles d’applications Desktop ou Internet</strong> classiques : gestionnaires de tâches, viewers de fichiers, lecteurs de flux RSS, jeux, etc.</li>
<li><strong>Applications vitrines</strong> : souvent très (trop ?) simples, il s’agit d’applications réalisées par des <strong>entreprises qui ont simplement souhaité être visibles sur l’App Store</strong>. A la manière des sites Web à l’époque de la bulle Internet, où une entreprise se devait d’être présente sur le Web afin d&#8217;être visible et &laquo;&nbsp;dans le coup&raquo;&nbsp;.</li>
</ul>
<p>L’effet vitrine est très important : lors de nos projets, nos clients nous expliquent souvent qu’ils souhaitent être présents sur la plateforme iPhone mais que pour des raisons de coût, ils préfèrent réaliser une application Web customisée pour iPhone pour ensuite voir s’ils passeront à une application native (en cas de succès de cette première étape). La différence de coût est effectivement souvent justifiée car la réalisation d’une application Web nécessite des compétences techniques souvent déjà maîtrisées dans les équipes : il s’agit des compétences Web classiques, HTML, JavaScript et CSS. Alors qu’une application native nécessite des environnements Apple, une connaissance de Cocoa et d’Objective-C, une licence, etc.</p>
<p>Cependant <strong>cette séquence « application Web puis éventuellement application native » n’est pas à considérer de manière logique systématiquement</strong> : les applications natives sont plus rapides, plus simples et plus réactives que les applications Web, dont l’IHM et les comportements sont bien souvent une pâle imitation de ceux des applications natives. En outre, les applications natives peuvent bénéficier de toutes les caractéristiques de l’appareil, ce qui n’est pas le cas des applications Web. Or toutes ces <strong>différences concernent justement l’essentiel des raisons qui font le succès de l’iPhone : le design et l’ergonomie</strong>. Les utilisateurs sont donc très exigeants sur ces domaines. Le choix entre développement d’une application native et d&#8217;une application Web doit donc être considéré sous cet angle et pas uniquement sous l’angle du coût.</p>
<p><strong>Et le temps accentue cette tendance</strong>. Depuis quelques mois, l’App Store voit fleurir des applications qui exploitent pleinement les capacités de l’appareil : <strong>connectivité, géolocalisation, réalité augmentée</strong>… L’iPhone n’est plus une simple prolongation de nos ordinateurs de bureau, mais une vraie plateforme à part entière avec ses propres innovations.</p>
<h2>Idée n°4 : Pourquoi les entreprises ne sont pas obligées de passer par l’App Store pour distribuer des applications</h2>
<p>Il s&#8217;agit là d&#8217;un point essentiel, sur lequel nous sommes souvent questionnés :</p>
<ul>
<li>L&#8217;App Store est publique : est-il possible de distribuer des applications dans un <strong>cadre plus restreint</strong> ?</li>
<li>L&#8217;App Store est soumis à des <strong>règles strictes et des contraintes</strong> : la principale en est la procédure de <em>review </em>par Apple des applications soumises, qui repose sur des critères ergonomiques, fonctionnels et techniques établis mais pas toujours maîtrisables par le non initié, et qui impose des délais légèrement croissants (il faut compter entre une et deux semaines d&#8217;attente pour la validation d&#8217;une nouvelle version d&#8217;une application).</li>
</ul>
<p>En fait, pour développer des applications sur iPhone, il y a deux étapes.</p>
<p>La première consiste à s’enregistrer auprès d’Apple comme <em>Registered iPhone Developer</em>. Cela vous permet de :</p>
<ul>
<li>Accéder à l’<em><a href="http://developer.apple.com/iphone" target="_blank">iPhone Developer Center</a></em>, point d’accès central à toutes les ressources nécessaires : SDK, documentation et ressources</li>
<li>Développer des applications</li>
<li>Les tester sur le simulateur fourni : attention, pas même sur votre propre iPhone !</li>
</ul>
<p>C’est tout mais c’est gratuit ! En particulier : à l&#8217;issue de cette étape, vous ne pouvez pas distribuer d’application.</p>
<p>La seconde étape consiste à devenir <em>iPhone Development Program Member</em>. Cela vous permet de développer, tester et distribuer des applications, via un portail dédié et intégré dans l’iPhone Developer Center. En fonction du type de licence que vous choisissez, trois modes de distribution s’offrent alors à vous :</p>
<ul>
<li>Distribution <strong>App Store</strong> : déploiement sur une plateforme internationale et publique d&#8217;applications gratuites ou payantes</li>
<li>Distribution <strong>Ad-hoc</strong> : déploiement sur une flotte constituée de 100 appareils au maximum, référencés</li>
<li>Distribution <strong>In-house</strong> : déploiement sur une flotte constituée de 500 appareils au minimum, au sein d’une entreprise.</li>
</ul>
<p>Et voici les types de licences :</p>
<ul>
<li>Licence <strong>Standard </strong>: 99$ / an
<ul>
<li>Distribution : App Store ou ad-hoc</li>
<li>Peut concerner un individuel (1 développeur) ou une société (une équipe de développeurs)</li>
</ul>
</li>
<li>Licence <strong>Enterprise </strong>: 299$ / an
<ul>
<li>Distribution : in-house ou ad-hoc</li>
</ul>
</li>
</ul>
<p>Plusieurs modes de distribution s’offrent donc à vous. Attention à bien choisir la licence adéquate !</p>
<h2>Idée n°5 : Attention, réaliser une application iPhone, ce n’est pas « que » faire du développement logiciel</h2>
<p>Les développeurs familiers avec les langages comme C++, C# ou Java arriveront à se familiariser avec l’Objective-C. Mais le développement d’une application iPhone requiert d’autres attentions. L&#8217;<strong>aspect technique est important</strong>, mais les deux aspects suivants le sont tout autant, voire plus :</p>
<ul>
<li>le <strong>marketing </strong>: afin de rendre visible l&#8217;application</li>
<li>l&#8217;<strong>ergonomie </strong>: il y a des règles strictes à respecter afin de passer la phase de validation d&#8217;Apple puis de satisfaire les utilisateurs, devenus exigeants en la matière. <strong>Il ne s&#8217;agit plus seulement de créer une application <em>utilisable</em>, mais de créer une application qui propose une </strong><strong>réelle <em>expérience utilisateur</em></strong>. La maxime d&#8217;Apple <em>&laquo;&nbsp;The &#8217;same old&#8217; is not an option anymore&raquo;&nbsp;</em> est de plus en plus d&#8217;actualité.</li>
</ul>
<p>En effet, nombre d&#8217;applications aux traits fonctionnels et techniques irréprochables n&#8217;ont pas connu le succès escompté tout simplement car les aspects ergonomie et marketing ont été sous-estimés. Notez que j&#8217;entends par &laquo;&nbsp;succès&raquo;&nbsp; le fait <span style="text-decoration: line-through;">de rendre riche les développeurs</span> de rendre heureux les utilisateurs.</p>
<p>Cette idée pourrait faire l&#8217;objet d&#8217;un article à part entière, nous n&#8217;irons donc pas plus loin (pour l&#8217;instant). En attendant, où en êtes-vous de votre côté ?</p>
]]></content:encoded>
			<wfw:commentRss>http://www.aeon-consulting.fr/fr/blog/2009/11/20/les-entreprises-de-plus-en-plus-attirees-par-iphone/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<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>Scala et avenir de Java</title>
		<link>http://www.aeon-consulting.fr/fr/blog/2009/08/17/scala-et-avenir-de-java/</link>
		<comments>http://www.aeon-consulting.fr/fr/blog/2009/08/17/scala-et-avenir-de-java/#comments</comments>
		<pubDate>Mon, 17 Aug 2009 14:47:04 +0000</pubDate>
		<dc:creator>François Goldgewicht</dc:creator>
				<category><![CDATA[Carnets de Vol IT]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Scala]]></category>

		<guid isPermaLink="false">http://www.aeon-consulting.fr/?p=251</guid>
		<description><![CDATA[Depuis son apparition en mai 1995, juste avant l’explosion d’Internet, Java a beaucoup évolué. Il est notamment devenu une référence en matière de développement d’applications professionnelles, Web comme Desktop. Après ces 14 ans il convient de dresser un bilan sur l’adéquation de Java aux objectifs et contraintes actuelles.
On constate deux approches distinctes :

Beaucoup se focalisent [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">Depuis son apparition en mai 1995, juste avant l’explosion d’Internet, <strong>Java </strong>a beaucoup évolué. Il est notamment devenu une référence en matière de développement d’applications professionnelles, Web comme Desktop. Après ces 14 ans il convient de dresser un bilan sur l’adéquation de Java aux objectifs et contraintes actuelles.</p>
<p style="text-align: justify;">On constate deux approches distinctes :</p>
<ul style="text-align: justify;">
<li>Beaucoup se focalisent sur Java 7 : les discussions font rage sur les évolutions qui pourraient composer cette nouvelle version</li>
<li>D’autres considèrent que Java, avec sa spécification de 600 pages, est devenu trop complexe : qu’il ne pourrait donc plus apporter de réelle révolution et qu’il faudrait donc réfléchir à son digne successeur.</li>
</ul>
<p><span id="more-251"></span></p>
<h2>Complexité ?</h2>
<p style="text-align: justify;">Nous sommes bien d’accord, cette notion de complexité est relative : par exemple, tout le monde ne se sent pas obligé de mettre en œuvre et pousser les <em>Generics </em>jusqu’à leurs retranchements !</p>
<p style="text-align: justify;">Tout le monde n’a pas été convaincu par la pertinence des nombreux débats  « langages statiques contre langages dynamiques ». Ces débats ont malgré tout ouvert la voie à de nouveaux paradigmes de développement rapide et flexible.</p>
<p style="text-align: justify;">Certains se sont donc consacrés à la création d’un langage « état de l’art » afin de répondre aux problématiques actuelles avec plus de simplicité et de productivité, tout en conservant les principes qui ont fait le succès de Java. Finalement, comme Java, qui avait en quelques sortes détrôné le roi de l’époque, C++.</p>
<p style="text-align: justify;">Cet article est consacré à <strong>Scala</strong>, l’un de ces langages. Scala a été démarré en 2001 par Martin Odersky, Professeur à l’EPFL qui travaille également pour Sun à la production de l’implémentation de référence de <em>javac</em>. C’est lui qui est à l’origine de l’implémentation des <em>Generics </em>Java.</p>
<p style="text-align: justify;">Je dois avouer que <strong>je fais partie des nombreuses personnes qui ont été impressionnées par ce langage dès le premier contact</strong>. Par exemple, <strong>James Strachan</strong>, le créateur du langage dynamique Groovy, a <strong><a href="http://macstrac.blogspot.com/2009/04/scala-as-long-term-replacement-for.html" target="_blank">lui aussi été séduit par Scala</a></strong> :</p>
<blockquote>
<p style="text-align: justify;"><em>“Though my tip though for the long term replacement of javac is Scala. I&#8217;m very impressed with it! I can honestly say if someone had shown me the Programming in Scala book by Martin Odersky, Lex Spoon &amp; Bill Venners back in 2003 I&#8217;d probably have never created Groovy”</em></p>
</blockquote>
<p style="text-align: justify;">Et InfoQ <a href="http://www.infoq.com/news/2009/07/scala-replace-java" target="_blank">nous présente d’autres « mordus » de Scala</a>.</p>
<h2 style="text-align: justify;">Langage statique ou langage dynamique ?</h2>
<p style="text-align: justify;">On peut lire beaucoup de débats passionnés sur ce sujet. Mais pour le profane, il n’est pas facile d’y participer car la terminologie associée n’est pas si triviale. Commençons donc par quelques éclaircissements.</p>
<h3 style="text-align: justify;">Qu’est-ce qu’un langage statique ?</h3>
<p style="text-align: justify;">Déjà, il faut savoir que « langage statique » est un abus de langage pour «<strong> langage à typage statique</strong> ».</p>
<p style="text-align: justify;">J’aime assez la définition suivante, proposée dans le livre <a href="http://programming-scala.labs.oreilly.com/" target="_blank">Programming Scala</a> de Dean Wampler et Alex Payne (O&#8217;Reilly) :</p>
<blockquote>
<p style="text-align: justify;"><em>“in static typing, a variable is bound to a particular type for its lifetime. Its type can’t be changed and it can only reference type-compatible instances” </em></p>
</blockquote>
<p style="text-align: justify;">Ainsi, une variable de type A ne pourra être réaffectée plus tard qu’à des types compatibles avec le type A (dans un langage orienté objets, les types compatibles avec un type A sont A lui-même et les sous-classes de A). En fait, <strong>la notion de type est rattachée aux variables, non aux valeurs</strong>.</p>
<p style="text-align: justify;">On pourrait compléter cette définition informelle, mais dans notre contexte elle nous suffira amplement.</p>
<p style="text-align: justify;">Java et C++ sont des exemples de langages statiques.</p>
<h3 style="text-align: justify;">Et un langage dynamique ?</h3>
<p style="text-align: justify;">Le même livre nous donne la définition suivante du typage dynamique :</p>
<blockquote>
<p style="text-align: justify;"><em>“In dynamic typing, the type is bound to the value, not the variable” </em></p>
</blockquote>
<p style="text-align: justify;">Ainsi, une variable qui référence une valeur de type A peut très bien être réaffectée plus tard à des valeurs de n’importe quel type, même non compatible avec le type A. Dans ce cas, <strong>la notion de type est rattachée aux valeurs, non aux variables</strong>.</p>
<p style="text-align: justify;">C’est pour cette raison que l’on parle de typage dynamique : le type des variables est évalué lors de l’exécution de l’application, et non lors de la compilation comme c’est le cas du typage statique.</p>
<p style="text-align: justify;">Ruby, Python, Groovy et JavaScript sont des exemples de langages dynamiques.</p>
<h3 style="text-align: justify;">Le débat</h3>
<p style="text-align: justify;">Peut-être qu’en lisant ces définitions, compte tenu de votre expérience personnelle, vous tendez naturellement vers une de ces deux approches.</p>
<p style="text-align: justify;">Ainsi on entend souvent les arguments suivants :</p>
<ul>
<li>&laquo;&nbsp;Les langages dynamiques, plus flexibles, permettent un gain de temps sur le choix des types&raquo;&nbsp;</li>
<li>&laquo;&nbsp;Les langages statiques peuvent davantage exploiter la notion de type, ce qui facilite la création d’outils d’aide au développement comme l’auto-complétion et d’outils d’optimisation du code&raquo;&nbsp;</li>
<li>&laquo;&nbsp;Les langages dynamiques retardent la détection de certaines erreurs à l’exécution alors que les langages statiques permettent de lever ces erreurs dès la compilation&raquo;&nbsp;</li>
<li>&laquo;&nbsp;Une batterie de tests unitaires permet aux langages dynamiques de s’affranchir de la détection d’erreurs par un compilateur&raquo;&nbsp;</li>
</ul>
<p style="text-align: justify;">Et bien d’autres… Ces simples exemples suffisent à vous faire imaginer l’intensité des polémiques, dans un sens comme dans l’autre ! Sans rentrer dans les détails de ces exemples, essayons de dépasser le débat.</p>
<h3 style="text-align: justify;">Un peu de recul…</h3>
<p style="text-align: justify;">On constate deux faits intéressants :</p>
<ul>
<li>Premier constat, <strong>les langages dynamiques séduisent beaucoup de monde de par leur flexibilité et leur souplesse</strong> : le succès des langages Ruby et Python, pour ne citer qu’eux, en témoigne. Les aficionados de ces langages trouvent souvent les <strong>langages statiques trop verbeux</strong> et ils apprécient d’avoir moins de code à écrire</li>
<li>Second constat, beaucoup ne sont pas séduits par ces langages… Car <strong>cette flexibilité et cette souplesse font peur</strong> ! Après tout, <strong>écrire moins de lignes de code n’augmente pas nécessairement la productivité</strong> : il faut également que ce code soit fonctionnel, lisible, maintenable, etc.</li>
</ul>
<p style="text-align: justify;">Il est clair qu’il y a une <strong>réelle demande de langages succincts et flexibles pour gagner en productivité</strong>. Mais diminuer la quantité de code n’est pas un objectif en soi : <strong>il ne s’agit pas simplement d’une histoire de trop grande verbosité ou taille du code, mais de profiter davantage de l’inférence de type</strong>, c’est-à-dire éviter d’écrire ce que le compilateur peut deviner.</p>
<h2>Les grandes lignes de Scala</h2>
<h3>Un langage statique</h3>
<p style="text-align: justify;"><strong>Scala est un langage statique qui permet une syntaxe succincte, flexible et même élégante. Pourtant son système de typage est sophistiqué.</strong></p>
<p style="text-align: justify;">Pour quelles raisons ? J’aime beaucoup la façon dont le <strong>débat habituel est dépassé</strong> dans le livre <a href="http://www.artima.com/shop/programming_in_scala" target="_blank">Programming in Scala</a>, qu’il a co-écrit avec Lex Spoon et Bill Venners (Artima). Il nous rappelle en effet que :</p>
<ul>
<li>Oui, un compilateur ne permet de détecter que de simples erreurs : il ne vous dira pas que certaines fonctions ne se terminent pas ou que votre cahier des charges n’est pas respecté</li>
<li>Oui, des tests unitaires permettent d’avoir une couverture plus poussée</li>
</ul>
<p style="text-align: justify;">Mais il nous invite à envisager le débat sous un autre angle :</p>
<ul>
<li>Un système de typage statique ne peut pas remplacer les tests unitaires, mais il peut en réduire le nombre</li>
<li>L’inverse n’est pas vrai : les tests unitaires ne peuvent remplacer un système de typage statique. En effet, des tests ne peuvent que nous prouver la présence d’erreurs et non leur absence. Alors qu’un typage statique nous donne des garanties simples mais réelles (opérations entre types incompatibles, accès externe à des membres privés, etc.)</li>
<li>Enfin, le typage statique facilite les <em>refactorings </em>de code et la mise à jour des documentations.</li>
</ul>
<h3>Un langage  concis</h3>
<p style="text-align: justify;">Scala est donc un langage statique. Pourtant, James Strachan <a href="http://macstrac.blogspot.com/2009/04/scala-as-long-term-replacement-for.html" target="_blank">nous explique</a> &#8211; à juste titre &#8211; que <strong>Scala est un langage dont la concision rappelle les langages dynamiques</strong> :</p>
<blockquote>
<p style="text-align: justify;"><em>“Scala seems to hit the perfect sweet spot between the consise feel of a dynamic language, while actually being completely statically typed”</em></p>
</blockquote>
<p style="text-align: justify;">En fait, Scala repose sur de nombreuses techniques permettant de minimiser la syntaxe inutile : il s’agit essentiellement de l’<strong>inférence de type </strong>que nous évoquions précédemment. Ces techniques dépassent largement le cadre de cet article, nous nous contenterons d’un exemple très simple.</p>
<p style="text-align: justify;">La ligne suivante de code Java :</p>
<blockquote>
<pre style="text-align: justify;">List&lt;String&gt; list = new ArrayList&lt;String&gt;();</pre>
</blockquote>
<p style="text-align: justify;">Peut être écrite en Scala :</p>
<blockquote>
<pre style="text-align: justify;">val list : List[String] = new List[String]</pre>
</blockquote>
<p style="text-align: justify;">Ou même :</p>
<blockquote>
<pre style="text-align: justify;">val list = new List[String]</pre>
</blockquote>
<p style="text-align: justify;">Cette dernière ligne de code semble provenir de langages dynamiques mais ici le typage est statique : <strong>il est inutile de préciser le type de la variable car le compilateur est capable de le déterminer seul. C’est l’inférence de type</strong>.</p>
<p style="text-align: justify;">L’introduction à Scala sur le <a href="http://www.scala-lang.org/node/25" target="_blank">site officiel</a> évoque ainsi une diminution du volume du code d’un facteur 2 à 3.</p>
<p style="text-align: justify;">Encore une fois, le but n’est pas de produire moins d’effort de typage, mais de produire moins d’effort de lecture et de compréhension donc de réduire le nombre d’erreurs possibles. L’exemple suivant est simple mais il illustre cette idée.</p>
<p style="text-align: justify;">Voici un code classique de création d’une classe en Java :</p>
<blockquote>
<pre style="text-align: justify;">class Point {
   private int x;
   private int y;

   public Point(int x, int y) {
      this.x = x;
      this.y = y;
   }
}</pre>
</blockquote>
<p style="text-align: justify;">Voici l’équivalent Scala :</p>
<blockquote>
<pre style="text-align: justify;">class Point(x : Int, y : Int)</pre>
</blockquote>
<p style="text-align: justify;">Note : en toute rigueur, dans ce code Scala, les variables d’instances seront <em>final</em>. Ceci dit, l’idée de cet exemple est simplement de vous faire prendre conscience de la concision de Scala.</p>
<p style="text-align: justify;">En outre, Scala propose :</p>
<ul>
<li>L’utilisation de caractères non alphanumériques dans les noms des méthodes : cela permet un équivalent de la surcharge d’opérateurs</li>
<li>Les <strong><em>closures</em></strong>, qui manquent souvent aux développeurs Java qui connaissent Ruby et Python.</li>
</ul>
<p style="text-align: justify;">Voici un exemple illustrant la notion de <em>closure </em>et son intérêt. Voici une simple méthode Java qui retourne la liste des items achetés par un utilisateur :</p>
<blockquote>
<pre style="text-align: justify;">public List&lt;Item&gt; getBoughtItems(User user) {
   List&lt;Item&gt; result = new ArrayList();
   for (Item item : items) {
      if (user.bought(item)) {
         result.add(item);
      }
   }
   return result;
}</pre>
</blockquote>
<p style="text-align: justify;">Voici l’équivalent Scala, basé sur une <em>closure </em>:</p>
<blockquote>
<pre style="text-align: justify;">def getBoughtItems(user: User) =
   items.filter(user bought)</pre>
</blockquote>
<p style="text-align: justify;">En fait, l’expression <em>user bought</em> désigne un prédicat. Ce prédicat prend un paramètre en entrée, qui est omis car unique.</p>
<h3>Un langage mixte</h3>
<p style="text-align: justify;">Martin Odersky connaissant bien la Programmation Orientée Objets et la Programmation Fonctionnelle, a créé Scala comme <strong>une synthèse du meilleur de ces deux mondes</strong> :</p>
<ul>
<li>La <strong>Programmation Orientée Objets</strong> permet la <strong>construction de systèmes complexes, structurés et flexibles</strong></li>
<li>La <strong>Programmation Fonctionnelle</strong> permet de <strong>répondre rapidement et de manière concise à certaines problématiques</strong>.</li>
</ul>
<p style="text-align: justify;">Scala est un donc un langage dit « mixte ». Et <strong>c’est ce mélange, avec ses nouveaux design patterns et son style concis, qui le rend « scalable ».</strong> Car oui, le nom « Scala » est issu de la contraction de « scalable language ».</p>
<h3 style="text-align: justify;">Un langage « scalable » ?</h3>
<p style="text-align: justify;">Je vous prie de m’excuser car j’emploierai parfois le terme anglais « scalable » au lieu de son équivalent français « évolutif », car cela rappelle bien les objectifs de ce langage.</p>
<p style="text-align: justify;">Ce langage se veut évolutif car conçu pour évoluer avec la demande des utilisateurs. Comme nous l’a présenté Martin Odersky à la <a href="http://developers.sun.com/learning/javaoneonline/2008/pdf/TS-5165.pdf" target="_blank">conférence JavaOne 2008</a> :</p>
<blockquote>
<p style="text-align: justify;"><em>&laquo;&nbsp;A language is scalable if it is suitable for very small as well as very large programs&raquo;&nbsp;</em></p>
</blockquote>
<p style="text-align: justify;">Le livre <a href="http://www.artima.com/shop/programming_in_scala" target="_blank">Programming in Scala</a> nous explique la démarche derrière Scala : il ne s’agit pas de fournir le langage parfait qui contient &laquo;&nbsp;tout&raquo;&nbsp;, mais de donner des outils que l’on peut étendre et adapter.</p>
<h3 style="text-align: justify;">Un langage pour la machine virtuelle Java</h3>
<p style="text-align: justify;">Scala s’inspire d’un nombre impressionnant de langages (il suffit de lire la page 20 du livre précédent pour s&#8217;en rendre compte).</p>
<p style="text-align: justify;">Mais le compilateur Scala produit du <em>bytecode </em>pour la JVM, ou machine virtuelle Java. En effet, durant ces 14 ans :</p>
<ul>
<li>Beaucoup d’optimisations ont été apportées à la JVM : il est donc intéressant de profiter des performances obtenues d’entrée de jeu</li>
<li>Les développeurs ont acquis beaucoup de compétences et produit de nombreux frameworks et applications : il serait donc dommage de ne pas profiter de toute cette richesse.</li>
</ul>
<p style="text-align: justify;"><strong>Il est ainsi possible d’invoquer du code Java depuis du code Scala, et inversement</strong>.</p>
<h2 style="text-align: justify;">Un langage orienté objets</h2>
<h3 style="text-align: justify;">Un langage orienté objets à 100%</h3>
<p style="text-align: justify;">Scala est un langage orienté objets à 100%, construit autour du slogan <strong>&laquo;&nbsp;everything is an object&raquo;&nbsp;</strong>.</p>
<p style="text-align: justify;">En effet, <strong>chaque valeur est un objet et toute opération est un appel de méthode</strong>. Ainsi, Scala élimine les déviations de Java :</p>
<ul>
<li>Il n’y a pas de type primitif</li>
<li>Il n’y a pas de membre statique (qui rappelons-le, ne sont par définition rattachés à aucune instance) : des singletons sont utilisés à la place</li>
<li>Les tableaux ne sont pas gérés via une syntaxe spéciale : il existe une classe <em>Array </em>comme les autres.</li>
</ul>
<p style="text-align: justify;">Ces déviations ne paraissent pas si gênantes, mais elles compliquent les choses et limitent la « scalabilité » du code.</p>
<h3 style="text-align: justify;">Un système de type sophistiqué</h3>
<p style="text-align: justify;">Scala permet la définition des types classiques : classes, héritage, types abstraits… Mais son système de type est sophistiqué :</p>
<ul>
<li>Il étend celui de Java (même s’il repose beaucoup dessus en interne)</li>
<li>Les <em>Generics </em>sont plus flexibles</li>
<li>Plus de constructions sont possibles grâce à l’<strong>inférence de type</strong></li>
</ul>
<p style="text-align: justify;">On notera en particulier les deux apports suivants :</p>
<ul>
<li>La notion de <strong>traits</strong> : les traits ressemblent aux interfaces Java, sauf qu’on peut en fait y définir des propriétés et y implémenter certaines méthodes. Les traits apportent de nouveaux design patterns que nous pourrons aborder dans un autre article</li>
<li>La notion de <strong>composition mixin</strong>, qui permet de réutiliser des membres spécifiques à une classe fille (par rapport à sa classe mère) lors de la définition d’une nouvelle classe : cette notion, que vous pouvez rapidement découvrir sur le <a href="http://www.scala-lang.org/node/117" target="_blank">site officiel</a>, permet ainsi d’ajouter de l’état et du comportement à des classes (ou même des objets), ce qui était possible en C++ par de l’héritage multiple mais que partiellement en Java via des approches de type AOP (Programmation Orientée Aspects).</li>
</ul>
<p style="text-align: justify;">Voici un exemple simple, proposé sur le site officiel :</p>
<blockquote>
<pre style="text-align: justify;">abstract class AbsIterator {
   type T
   def hasNext : Boolean
   def next : T
}

<span style="color: #008000;">// Ici le mot-clé « trait » indique que cette
// classe pourra être utilisée comme mixin</span>
trait RichIterator extends AbsIterator {
   def foreach(f : T =&gt; Unit) {
      while (hasNext) f(next)
   }
}

class StringIterator(s: String) extends AbsIterator {
   type T = Char
   private var i = 0
   def hasNext = i &lt; s.length()
   def next = { val ch = s charAt i; i += 1; ch }
}

<span style="color: #008000;">// Combinons les fonctionnalités des deux classes par
// composition mixin</span>
object StringIteratorTest {
   def main(args: Array[String]) {
      class Iter extends StringIterator(args(0))
         with RichIterator
      val iter = new Iter
      iter foreach println
   }
}</pre>
</blockquote>
<p style="text-align: justify;">Dans ce cas, on dit que la classe <em>Iter </em>est construite par<em> composition mixin</em> des classes <em>StringIterator </em>et <em>RichIterator</em>. La première est son &laquo;&nbsp;parent&raquo;&nbsp;, la seconde son &laquo;&nbsp;mixin&raquo;&nbsp;.</p>
<p style="text-align: justify;">En fait, cela permet à Scala de proposer une nouvelle approche orientée modules : les composants sont des classes ou des traits, et on peut les composer par mixin.</p>
<h2 style="text-align: justify;">Et&#8230; Un langage fonctionnel !</h2>
<p style="text-align: justify;">Scala est également un langage de programmation fonctionnelle.</p>
<h3 style="text-align: justify;">Une petite présentation de la programmation fonctionnelle</h3>
<p style="text-align: justify;">Pour la petite histoire, ce type de langages est plus ancien que les langages orientés objets, mais ils étaient jusqu’ici cantonnés à des laboratoires de recherche. Si vous souhaitez en savoir plus sur l’histoire de ces langages, consultez par exemple le livre <a href="http://www.artima.com/shop/programming_in_scala" target="_blank">Programming in Scala</a>.</p>
<p style="text-align: justify;">Dans ce type de langages, <strong>les fonctions sont des valeurs de premier ordre</strong> (comme les <em>int</em>, <em>string</em>, etc. dans nos langages habituels) : on peut assigner des fonctions à des variables, passer des fonctions en arguments d’autres fonctions, déclarer des fonctions comme valeur de retour d’autres fonctions, etc. Autrement dit, toujours dans la lignée du « everything is an object », <strong>en Scala les fonctions sont des objets comme les autres</strong>. A titre d’illustration, cela va plus loin que les pointeurs de fonctions du C++ (qui ne sont que des valeurs de second ordre). Nous pourrions là-encore pousser le sujet bien plus loin, mais restons dans le cadre de cet article.</p>
<h3 style="text-align: justify;">L’immutabilité comme principe de base</h3>
<p style="text-align: justify;"><strong>Les fonctions prennent en entrée des valeurs qu’elles ne modifient pas</strong> : ces données sont dites « <strong>immutables </strong>». Les fonctions sont « sans effet de bord », ou « référentiellement transparentes » : dans un fragment de code, on peut remplacer un appel à une fonction par son résultat, c’est-à-dire sa valeur de retour.</p>
<p style="text-align: justify;">Ce principe est fondamental et il peut faire peur puisque la programmation orientée objets ne le respecte pas nécessairement. En fait, cette partie de Scala s’intègre parfaitement avec la partie orientée objets : elles ne s’opposent pas, elles s’améliorent mutuellement.</p>
<h3 style="text-align: justify;">Quel en est l’intérêt ?</h3>
<p style="text-align: justify;">Ce type de langages permet de simplifier plusieurs problèmes de design. Un bon exemple en est la programmation concurrente.</p>
<p style="text-align: justify;">Ce sujet est de plus en plus d’actualité avec la prolifération des processeurs multi-core, qui distribuent les calculs sur différents threads. Or il s’agit souvent d’un vrai casse-tête !</p>
<p style="text-align: justify;"><strong>Le modèle de Java en matière de programmation concurrente repose sur l’accès synchronisé à des ressources mutables et partagées</strong> : il est donc complexe et source d’erreurs. La gestion des <em>locks </em>est difficile, surtout pour des systèmes qui grandissent en taille et en complexité. En effet, comme nous le rappelle judicieusement le livre <a href="http://www.artima.com/shop/programming_in_scala" target="_blank">Programming in Scala</a>, les <em>deadlocks </em>ne se voient souvent qu’une fois en production et non pendant les tests.</p>
<p style="text-align: justify;"><strong>Scala apporte une solution élégante à ce problème</strong> : l’API <strong>Actors</strong>, qui repose sur le modèle du même nom, issu du langage Erlang. Elle repose sur les principes suivants :</p>
<ul>
<li>On appelle « acteurs » des entités logicielles indépendantes</li>
<li>Les acteurs ne partagent pas d’information d’état entre eux, ils communiquent en échangeant des messages asynchrones (chacun dispose d’une <em>queue</em>) : <strong>on n’a donc pas besoin de synchroniser l’accès à des données mutables partagées</strong>.</li>
</ul>
<p style="text-align: justify;">Sur ce sujet, je vous invite à étudier <a href="http://programming-scala.labs.oreilly.com/ch01.html#ATasteOfConcurrency" target="_blank">cet exemple</a> du livre <span style="text-decoration: underline;">Programming Scala</span>, ainsi que <a href="http://www.scala-lang.org/node/242" target="_blank">la page suivante</a> du site officiel.</p>
<p style="text-align: justify;">Les <em>closures</em>, que nous avons présentées précédemment, proviennent directement de la programmation fonctionnelle.</p>
<p style="text-align: justify;">Je vous invite également à jeter un œil au <strong><a href="http://www.scala-lang.org/node/120" target="_blank"><em>Pattern Matching</em></a></strong>, sorte de <em>switch/case</em> avancé. Là encore nous pourrons aborder ce point spécifique dans un article ultérieur, car cela va bien plus loin qu&#8217;un simple <em>switch/case</em> !</p>
<h2 style="text-align: justify;">Scala en pratique</h2>
<p style="text-align: justify;">Nous venons de présenter Scala, sur le papier. Qu’en est-il en pratique ?</p>
<p style="text-align: justify;"><strong>Scala est déjà mis en œuvre </strong>dans des projets en production, <a href="http://www.scala-lang.org/node/1658" target="_blank">comme nous l’indique le site officiel</a>. On y découvre que <strong>Twitter</strong>, <strong>Siemens </strong>et même une filiale d’<strong>EDF </strong>(EDF Trading) ont mis en œuvre Scala de manière plus que significative afin d’améliorer la productivité, la &laquo;&nbsp;scalabilité&raquo;&nbsp; et la fiabilité générale de projets concrets.</p>
<p style="text-align: justify;">Côté <strong>performances</strong>, <a href="http://www.scala-lang.org/node/25" target="_blank">le site officiel se veut catégorique</a> :</p>
<blockquote>
<p style="text-align: justify;"><em>“The Scala compiler is mature and proven highly reliable by years of use in production environments, The compiler was written by Martin Odersky who also wrote the Java reference compiler and co-authored the generics, used by millions of Java programmers today. You can be confident his implementation of the Scala compiler produces byte code that performs every bit as good as comparable Java code”</em></p>
</blockquote>
<p style="text-align: justify;">Côté <strong>outils</strong>, il existe déjà des plugins pour les outils de développement traditionnels (Eclipse, IntelliJ IDEA, NetBeans) et pour les outils de build (Ant, Maven).</p>
<p style="text-align: justify;">Notez enfin que Scala est même disponible pour .NET et sa machine virtuelle (CLR).</p>
<p style="text-align: justify;">Enfin, la <strong>communauté </strong>autour de Scala est déjà organisée : la distribution de Scala est téléchargée 5000 fois par mois, et des frameworks Scala voient déjà le jour. On notera par exemple le framework Web nommé <a href="http://www.scala-lang.org/node/1011" target="_blank">Lift</a>. Une <strong>conférence </strong>dédiée a même déjà été lancée : <a href="http://www.scalaliftoff.com/" target="_blank">http://www.scalaliftoff.com/</a>.</p>
<h2 style="text-align: justify;">Conclusion (temporaire)</h2>
<p style="text-align: justify;">J’espère vous avoir transmis mon intérêt pour Scala ! Scala n’est pas une amélioration de Java : il s’agit d’un langage qui se veut plus simple et plus élégant que Java, tout en produisant du <em>bytecode </em>pour la machine virtuelle Java. Scala pourrait donc bien être un digne successeur de Java. Mais il ne faut pas pour autant jeter aux orties les autres langages comme Ruby, Groovy ou Python : n’oublions pas que chaque situation a ses besoins et ses contraintes, et donc ses solutions. A suivre&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.aeon-consulting.fr/fr/blog/2009/08/17/scala-et-avenir-de-java/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Comprendre REST, partie 3 : Adressabilité</title>
		<link>http://www.aeon-consulting.fr/fr/blog/2009/07/21/comprendre-rest-partie-3-adressabilite/</link>
		<comments>http://www.aeon-consulting.fr/fr/blog/2009/07/21/comprendre-rest-partie-3-adressabilite/#comments</comments>
		<pubDate>Tue, 21 Jul 2009 07:17:30 +0000</pubDate>
		<dc:creator>François Goldgewicht</dc:creator>
				<category><![CDATA[Carnets de Vol IT]]></category>
		<category><![CDATA[REST]]></category>

		<guid isPermaLink="false">http://www.aeon-consulting.fr/?p=164</guid>
		<description><![CDATA[Nous venons tout juste de définir la notion d&#8217;URI et les problématiques inhérentes. Nous pouvons donc dire quelques mots sur la notion d&#8217;Adressabilité.

Notion d&#8217;Adressabilité
Il s&#8217;agit d&#8217;une notion assez simple à appréhender. On peut d&#8217;abord définir l&#8217;Adressabilité de la manière suivante, comme Leonard Richardson et Sam Ruby dans leur excellent ouvrage RESTful Web Services : une [...]]]></description>
			<content:encoded><![CDATA[<p>Nous <a href="http://www.aeon-consulting.fr/blog/2009/07/21/comprendre-rest-partie-2-uri/">venons tout juste</a> de définir la notion d&#8217;URI et les problématiques inhérentes. Nous pouvons donc dire quelques mots sur la notion d&#8217;<strong>Adressabilité</strong>.</p>
<p><span id="more-164"></span></p>
<h2><img title="More..." src="http://www.aeon-consulting.fr/wp-includes/js/tinymce/plugins/wordpress/img/trans.gif" alt="" />Notion d&#8217;Adressabilité</h2>
<p>Il s&#8217;agit d&#8217;une notion assez simple à appréhender. On peut d&#8217;abord définir l&#8217;Adressabilité de la manière suivante, comme Leonard Richardson et Sam Ruby dans leur excellent ouvrage <a href="http://oreilly.com/catalog/9780596529260/" target="_blank">RESTful Web Services</a> : une application adressable est une application qui présente ses informations &laquo;&nbsp;intéressantes&raquo;&nbsp; en tant que Ressources. En effet, alors, chacune de ces informations possède un URI, et cet URI la rend accessible.</p>
<p>On ne le rappellera jamais assez : <strong>peut être une ressource</strong> <strong>tout objet assez important pour être référencé en tant que tel</strong>. La capacité d&#8217;une Ressource à être référencée la rend &laquo;&nbsp;adressable&raquo;&nbsp;. Dans quel but ? Le document <a href="http://www.w3.org/2001/tag/doc/whenToUseGet.html" target="_blank">URIs, Addressability, and the use of HTTP GET and POST</a> du Technical Architecture Group du W3C nous donne une réponse typiquement dans la lignée de la philosophie RESTienne :</p>
<blockquote><p>&laquo;&nbsp;we can refer to things [...], access them, describe them, and share them. Providing a URI for a resource affords many advantages, including: linking, bookmarking, caching&raquo;&nbsp;</p></blockquote>
<p>A force d&#8217;en profiter quotidiennement dans le Web qu&#8217;on connaît &#8211; et parfois, de manière transparente, ces apports peuvent avoir l&#8217;air banal mais ils sont fondamentaux. Plus généralement, référencer des Ressources par de simples identifiants <strong>permet de s&#8217;affranchir des différences entre langages et plateformes</strong>. C&#8217;est là que le &laquo;&nbsp;U&raquo;&nbsp; de &laquo;&nbsp;URI&raquo;&nbsp;, pour &laquo;&nbsp;Uniform&raquo;&nbsp; , prend tout son sens :</p>
<blockquote><p>&laquo;&nbsp;Great multiplicative power of reuse derives from the fact that all languages use URIs as identifiers: This allows things written in one language to refer to things defined in another language. [...] In this finding, the term &#8216;URI addressability&#8217; means that a URI alone is sufficient for an agent to carry out a particular type of interaction.&raquo;&nbsp;</p></blockquote>
<p>Il devient en effet facile de <strong>créer des liens vers ces identifiants afin d&#8217;opérer des actions sur les Ressources</strong> référencées. Cette simplicité est l&#8217;un des facteurs clés du succès du Web que nous connaissons.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.aeon-consulting.fr/fr/blog/2009/07/21/comprendre-rest-partie-3-adressabilite/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Comprendre REST, partie 2 : URI</title>
		<link>http://www.aeon-consulting.fr/fr/blog/2009/07/21/comprendre-rest-partie-2-uri/</link>
		<comments>http://www.aeon-consulting.fr/fr/blog/2009/07/21/comprendre-rest-partie-2-uri/#comments</comments>
		<pubDate>Tue, 21 Jul 2009 00:11:36 +0000</pubDate>
		<dc:creator>François Goldgewicht</dc:creator>
				<category><![CDATA[Carnets de Vol IT]]></category>
		<category><![CDATA[REST]]></category>

		<guid isPermaLink="false">http://www.aeon-consulting.fr/?p=140</guid>
		<description><![CDATA[Les Carnets de Vol continuent ! Le premier post de cette série consacrée à REST nous a permis de définir la notion de Ressource. Ce deuxième post est consacré à la notion d&#8217;URI, ou Uniform Resource Identifier.

Notion d&#8217;URI
On peut définir simplement un URI comme étant à la fois le nom et l&#8217;adresse d&#8217;une Ressource. En effet, [...]]]></description>
			<content:encoded><![CDATA[<p>Les Carnets de Vol continuent ! Le <a href="http://www.aeon-consulting.fr/fr/blog/2009/07/08/comprendre-rest-partie-1-ressource/">premier post</a> de cette série consacrée à REST nous a permis de définir la notion de Ressource. Ce deuxième post est consacré à la notion d&#8217;<strong>URI</strong>, ou <strong>Uniform Resource Identifier</strong>.</p>
<p><span id="more-140"></span></p>
<h2>Notion d&#8217;URI</h2>
<p>On peut définir simplement un <strong>URI </strong>comme étant à la fois <strong>le nom et l&#8217;adresse d&#8217;une Ressource</strong>. En effet, comme nous l&#8217;indique Roy Fielding dans <a href="http://www.ics.uci.edu/~fielding/pubs/dissertation/rest_arch_style.htm" target="_blank">sa thèse où il définit REST</a> :</p>
<blockquote><p>&laquo;&nbsp;Resource identifier [allows] to identify the particular resource involved in an interaction between components&raquo;&nbsp;</p></blockquote>
<p>En effet, rappelons la définition de Ressource que nous avons donnée dans le <a href="http://www.aeon-consulting.fr/fr/blog/2009/07/08/comprendre-rest-partie-1-ressource/">post précédent</a> : peut être une ressource tout objet assez important pour être référencé en tant que tel. Dans cette optique, <strong>l&#8217;URI d&#8217;une Ressource est justement le moyen de référencer cette Ressource</strong>.</p>
<p>Un URI identifie une Ressource donc n&#8217;est rattaché qu&#8217;à cette seule Ressource. Mais une Ressource peut être rattachée à plusieurs URI. En pratique, on essaie tout de même de limiter le nombre d&#8217;URI rattachés à une Ressource afin de ne pas réduire leur valeur.</p>
<p>Et voilà, à ce stade, nous pourrions <em>presque </em>terminer ce post. Mais nous constatons souvent des confusions autour de cette notion qui est bien plus complexe qu&#8217;elle ne paraît, en particulier dans <strong>ce qui caractérise la relation entre un URI et sa Ressource</strong>.</p>
<h2>Persistance des URI</h2>
<p>Voici un premier sujet de confusions. La recommandation <a id="jh27" title="&quot;Architecture of the World Wide Web, Volume One&quot;" href="http://www.w3.org/TR/webarch/">« Architecture of the World Wide Web, Volume One»</a> du W3C, co-rédigée par Roy Fielding, nous explique l&#8217;importance de la notion de <strong>persistance des URI</strong>, dont elle donne une définition :</p>
<blockquote><p><em>&laquo;&nbsp;the term URI persistence is used to describe the desirable property that, once associated with a resource, a URI should continue indefinitely to refer to that resource&raquo;&nbsp;</em></p></blockquote>
<p>Cette règle est simple : <strong>les URI doivent être affectés durablement</strong>.</p>
<p>Ce principe est cependant parfois mal compris. Ainsi, on peut parfois lire ou entendre qu&#8217;il y a un cas intéressant de non respect de cette règle :</p>
<ul>
<li>l&#8217;URI http://www.aeon-consulting.fr/an-application/1.0 pointe vers la Ressource &laquo;&nbsp;Version 1.0 de l&#8217;application &#8216;an application&#8217;&raquo;&nbsp; de manière définitive</li>
<li>l&#8217;URI http://www.aeon-consulting.fr/an-application/last pointe vers la Ressource &laquo;&nbsp;Dernière version de l&#8217;application &#8216;an application&#8217;&raquo;&nbsp;, qui peut correspondre de manière temporaire à la Ressource précédente (tant que la version 1.0 de l&#8217;application est la version la plus récente).</li>
</ul>
<p>Il s&#8217;agirait là d&#8217;une utilisation pertinente d&#8217;un URI non persistant. Cette vision est erronée car la Ressource &laquo;&nbsp;Dernière version de l&#8217;application &#8216;an application&#8217;&raquo;&nbsp; n&#8217;est pas la même que la Ressource &laquo;&nbsp;Version 1.0 de l&#8217;application &#8216;an application&#8217;&raquo;&nbsp; : il s&#8217;agit de deux objets distincts. La confusion vient simplement du fait que temporairement, ces deux URI permettent de récupérer deux représentations identiques.</p>
<p>Notons que si nécessaire, le protocole HTTP fournit les mécanismes de redirection qui permettent d&#8217;indiquer aux agents que l&#8217;URI d&#8217;une Ressource a changé (via les codes 3XX des réponses HTTP).</p>
<h2>Signification des URI</h2>
<h3>Signification des URI et état des Ressources</h3>
<p><span style="text-decoration: underline;"><strong>Utilisation d&#8217;URI significatifs, ou transparents</strong></span></p>
<p>Dans le Web que nous utilisons tous les jours, on trouve fréquemment des URI significatifs : en effet, la connaissance de l&#8217;URI d&#8217;une Ressource parente nous permet (presque !) de retrouver les URI des Ressources filles qui nous intéressent. Il est donc naturel de suggérer pour nos Ressources des URI structurés, significatifs et descriptifs, voire même prévisibles.</p>
<p>Voici à titre d&#8217;exemple l&#8217;URI d&#8217;un article de ce blog, très significatif pusqu&#8217;il porte la date et le titre de l&#8217;article :</p>
<blockquote>
<p style="text-align: center;">http://&#8230;/blog/2009/07/08/comprendre-rest-partie-1-ressource/</p>
</blockquote>
<p><span style="text-decoration: underline;"><strong>Utilisation d&#8217;URI non significatifs, ou opaques</strong></span></p>
<p>La même recommandation du W3C nous indique qu&#8217;un URI n&#8217;est pas nécessairement significatif :</p>
<blockquote><p>&laquo;&nbsp;The choice of syntax for global identifiers is somewhat arbitrary, it is their global scope that is important&raquo;&nbsp;</p></blockquote>
<p>Il s&#8217;agit du <strong>principe d&#8217;opacité des URI</strong> : un URI est un identifiant, <strong>il sert uniquement à identifier une Ressource pour permettre de la référencer</strong>. Il ne doit <strong>pas servir à donner des informations sur l&#8217;état de la Ressource</strong>, ce sont les Représentations de la Ressource qui jouent ce rôle, comme nous l&#8217;indique ce même document :</p>
<blockquote><p>&laquo;&nbsp;It is tempting to guess the nature of a resource by inspection of a URI that identifies it. However, the Web is designed so that agents communicate resource information state through representations, not identifiers&raquo;&nbsp;</p></blockquote>
<p>Nous reviendrons ultérieurement sur la notion de Représentation. Voici à titre d&#8217;exemple une version opaque de l&#8217;URI de notre article de blog :</p>
<blockquote>
<p style="text-align: center;">http://&#8230;/blog/126/</p>
</blockquote>
<p>Cet URI est opaque car il porte un identifiant technique et non plus la date et le titre de l&#8217;article (qui sont des informations sur l&#8217;état de la Ressource article, qui peuvent en outre évoluer et donc violer la règle de persistance énoncée précédemment).</p>
<p><span style="text-decoration: underline;"><strong>Un peu de recul&#8230;</strong></span></p>
<p>Mais alors, que choisir entre URI significatifs et URI opaques ? En fait REST n&#8217;interdit pas l&#8217;utilisation d&#8217;URI significatifs, la contrainte est uniquement dans le fait qu&#8217;une Ressource doit avoir un identifiant. Le choix entre opacité et transparence des URI est et restera un sujet subjectif. Bien souvent, c&#8217;est la sémantique que l&#8217;on souhaite mettre en place dans la construction des URI qui permettra de faire un choix.</p>
<h3>Signification des URI et format de Représentation des Ressources</h3>
<p>Un URI ne doit <strong>pas servir à donner des informations sur le format de représentation de la Ressource</strong> :</p>
<blockquote><p><em>&laquo;&nbsp;In general, one cannot determine the type of a resource representation by inspecting a URI for that resource. For example, the &#8216;.html&#8217; at the end of &#8216;http://example.com/page.html&#8217; provides no guarantee that representations of the identified resource will be served with the Internet media type &#8216;text/html&#8217;. The publisher is free to allocate identifiers and define how they are served&raquo;&nbsp;</em></p></blockquote>
<p>En effet, ce rôle est notamment assuré par la Négociation de contenu, qui fera l&#8217;objet d&#8217;un post ultérieur. Cette règle très importante n&#8217;est pas intuitive car elle n&#8217;est pas respectée par la plupart des URI que l&#8217;on manipule quotidiennement sur le Web.</p>
<h3>Signification des URI et actions opérées sur les Ressources</h3>
<p>De la même manière, un URI ne doit <strong>pas servir à donner des informations sur les actions opérées sur les Ressources</strong> : c&#8217;est la méthode HTTP qui joue ce rôle, comme nous le verrons dans un post ultérieur dédié à la notion d&#8217;Interface uniforme. Là encore, cette règle très importante n&#8217;est pas intuitive car elle non plus n&#8217;est pas respectée par la plupart des URI que l&#8217;on manipule quotidiennement sur le Web.</p>
<h2>Syntaxe des URI</h2>
<p>Sur ce point, REST n&#8217;impose rien explicitement. Cependant, les règles suivantes de syntaxe sont souvent mises en œuvre :</p>
<ul>
<li>utilisation du caractère &#8216;/&#8217; pour aller du niveau le plus général au niveau le plus spécifique : /Dossier1/Fichier2 par exemple</li>
<li>utilisation du caractère &#8216;,&#8217; pour indiquer des éléments ordonnés : /coordonnees/43.55197,1.489613 par exemple</li>
<li>utilisation du caractère &#8216;;&#8217; pour indiquer des éléments non ordonnés : /couleurs/bleu;vert par exemple</li>
<li>utilisation des caractères &#8216;?&#8217; et &#8216;&amp;&#8217; pour indiquer des paramètres, souvent pour des Ressources générées dynamiquement : /search?q=aeon&amp;hl=fr</li>
</ul>
<p>Ajoutons que la limitation de la taille des URI à 256 caractères est loin derrière nous : les serveurs ont aujourd&#8217;hui des limitations de quelques milliers de caractères.</p>
<h2>Mais au fait, quel est le lien entre URI et URL ?</h2>
<p>Le terme URI fait penser à un terme bien connu dans le Web que nous utilisons tous les jours : URL (Uniform Resource Locator).</p>
<p>Quelle est donc la différence entre ces deux termes très proches, souvent amalgamés ? La <a href="http://www.ietf.org/rfc/rfc2396.txt" target="_blank">RFC 2396</a>, qui définit la syntaxe des URI, nous donne une réponse explicite :</p>
<blockquote><p>&laquo;&nbsp;A URI can be further classified as a locator, a name, or both. The term &laquo;&nbsp;Uniform Resource Locator&raquo;&nbsp; (URL) refers to the subset of URI that identify resources via a representation of their primary access mechanism (e.g., their network &laquo;&nbsp;location&raquo;&nbsp;), rather than identifying the resource by name or by some other attribute(s) of that resource&raquo;&nbsp;</p></blockquote>
<p>Les puristes REST auront peut-être repéré que dans cet article, on a davantage évoqué &laquo;&nbsp;REST appliqué à HTTP&raquo;&nbsp; que &laquo;&nbsp;REST tout court&raquo;&nbsp;. Il s&#8217;agit d&#8217;un choix volontaire : d&#8217;une part, rappelons que le Web est une application des principes REST (et non l’inverse). HTTP 1.1 a été conçu afin de permettre cette application. D&#8217;autre part, cela permet de donner un aspect pragmatique à ces explications, dont le but est de clarifier les caractéristiques de REST.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.aeon-consulting.fr/fr/blog/2009/07/21/comprendre-rest-partie-2-uri/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Comprendre REST, partie 1 : Ressource</title>
		<link>http://www.aeon-consulting.fr/fr/blog/2009/07/08/comprendre-rest-partie-1-ressource/</link>
		<comments>http://www.aeon-consulting.fr/fr/blog/2009/07/08/comprendre-rest-partie-1-ressource/#comments</comments>
		<pubDate>Wed, 08 Jul 2009 21:37:57 +0000</pubDate>
		<dc:creator>François Goldgewicht</dc:creator>
				<category><![CDATA[Carnets de Vol IT]]></category>
		<category><![CDATA[REST]]></category>

		<guid isPermaLink="false">http://www.aeon-consulting.fr/?p=126</guid>
		<description><![CDATA[Voici le premier article de nos Carnets de Vol ! Il s&#8217;agit du premier élément d&#8217;une série d&#8217;articles dont l&#8217;objectif est de présenter clairement REST, ou Representational State Transfer.
Depuis son apparition il y a 9 ans, et plus particulièrement ces toutes dernières années, REST en intéresse plus d&#8217;un : beaucoup de monde en parle et [...]]]></description>
			<content:encoded><![CDATA[<p>Voici le premier article de nos <strong>Carnets de Vol</strong> ! Il s&#8217;agit du premier élément d&#8217;une série d&#8217;articles dont l&#8217;objectif est de présenter clairement <strong>REST</strong>, ou <strong>Representational State Transfer</strong>.</p>
<p>Depuis son apparition il y a 9 ans, et plus particulièrement ces toutes dernières années, REST en intéresse plus d&#8217;un : beaucoup de monde en parle et déclare &laquo;&nbsp;en faire&raquo;&nbsp;.  Mais en pratique, beaucoup d&#8217;interrogations demeurent sur ce qu&#8217;est <em>réellement </em>REST et sur ce que ce n&#8217;est pas. Plutôt que de s&#8217;appuyer comme d&#8217;habitude sur un unique article qui deviendrait vite volumineux et difficile à appréhender, j&#8217;ai choisi de vous présenter REST en une dizaine de notions que nous allons aborder de manière incrémentale et pragmatique. Ces articles n&#8217;ont pas vocation à être exhaustifs mais simplement à mettre en lumière de manière structurée les caractéristiques essentielles de REST en essayant de faire disparaître la plupart des incompréhensions.</p>
<p>Ce premier article est consacré à la notion de &laquo;&nbsp;Ressource&raquo;&nbsp;.</p>
<p><span id="more-126"></span></p>
<h2>Notion de Ressource</h2>
<h3>Une Ressource ? Mais tout le monde sait ce que c&#8217;est !</h3>
<p>Peut-être serez-vous surpris de découvrir que le premier article de cette série concerne la notion de Ressource. Après tout, il s&#8217;agit d&#8217;un mot banal, bien ancré dans le jargon quotidien de l&#8217;informaticien. Et bien justement, ce mot est tellement employé qu&#8217;il est devenu difficile de savoir sa définition précise, dans le cadre de REST notamment. Lors de mes missions, on me demande parfois cette définition, ce qui m&#8217;amène à chaque fois à commencer ma réponse par le sondage suivant : &laquo;&nbsp;Comment définiriez-vous une Ressource ?&raquo;&nbsp;</p>
<p>Et cela ne rate jamais, les réponses sont divisées en deux groupes :</p>
<ul>
<li>certains pensent qu&#8217;une Ressource correspond à un objet métier manipulé par l&#8217;application : par exemple, des contrats, des clients, etc. Généralement, l&#8217;idée associée est qu&#8217;un service REST correspond à un simple service de type CRUD sur ces objets métier (je ne m&#8217;attarde pas sur ce point précis qui fera l&#8217;objet d&#8217;un prochain article)</li>
<li>d&#8217;autres pensent à une Ressource comme quelque chose de flou, tournant autour de tout et de rien : naturellement, cette définition peu précise contribue largement aux incompréhensions autour de REST. Cependant, nous allons le voir, elle n&#8217;est paradoxalement pas si loin de la vérité&#8230;</li>
</ul>
<p>Commençons donc par la base : qu&#8217;est-ce qu&#8217;une Ressource (dans le contexte REST) ?</p>
<h3>Définition d&#8217;une Ressource</h3>
<p>Dans sa <a href="http://www.ics.uci.edu/~fielding/pubs/dissertation/rest_arch_style.htm" target="_blank">fameuse thèse</a>, Roy Fielding nous donne une définition large et ouverte :</p>
<blockquote><p><em>&laquo;&nbsp;Any information that can be named can be a resource: a document or image, a temporal service (e.g. &laquo;&nbsp;today&#8217;s weather in Los Angeles&raquo;&nbsp;), a collection of other resources, a non-virtual object (e.g. a person), and so on. In other words, any concept that might be the target of an author&#8217;s hypertext reference must fit within the definition of a resource</em>&laquo;&nbsp;</p></blockquote>
<p>Autrement dit : <strong>peut être une ressource</strong> <strong>tout objet assez important pour être référencé en tant que tel</strong>.</p>
<p>La recommandation <a id="rzy1" title="&quot;Architecture of the World Wide Web, Volume One&quot;" href="http://www.w3.org/TR/webarch/">&laquo;&nbsp;Architecture of the World Wide Web, Volume One&raquo;&nbsp;</a> du W3C, co-rédigée par Roy Fielding, est très explicite sur l&#8217;ouverture volontaire de cette définition :</p>
<blockquote><p><em>&laquo;&nbsp;We do not limit the scope of what might be a resource&raquo;&nbsp;</em></p></blockquote>
<p>Rappelons au passage que le Web est une application des principes REST (et non l&#8217;inverse). Il est donc essentiel de bien comprendre son architecture.</p>
<p>Et voilà, c&#8217;est aussi simple que cela. Vous l&#8217;aurez peut-être deviné, le prochain article de cette série sera consacré à la notion d&#8217;<strong>URI</strong>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.aeon-consulting.fr/fr/blog/2009/07/08/comprendre-rest-partie-1-ressource/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Lancement des Carnets de Vol</title>
		<link>http://www.aeon-consulting.fr/fr/blog/2009/07/08/lancement-carnets-vol/</link>
		<comments>http://www.aeon-consulting.fr/fr/blog/2009/07/08/lancement-carnets-vol/#comments</comments>
		<pubDate>Wed, 08 Jul 2009 20:47:11 +0000</pubDate>
		<dc:creator>François Goldgewicht</dc:creator>
				<category><![CDATA[Carnets de Vol IT]]></category>

		<guid isPermaLink="false">http://www.aeon-consulting.fr/?p=119</guid>
		<description><![CDATA[L&#8217;équipe d&#8217;Aeon Consulting est fière de vous annoncer le lancement de ses Carnets de Vol !
Nos consultants aiment partager leurs découvertes, expériences et savoir-faire : les pages de nos Carnets de Vol seront postées dans ce blog au fur et à mesure et ces articles seront l&#8217;occasion d&#8217;échanger avec vous sur des sujets variés, techniques [...]]]></description>
			<content:encoded><![CDATA[<p>L&#8217;équipe d&#8217;Aeon Consulting est fière de vous annoncer le lancement de ses <strong>Carnets de Vol</strong> !</p>
<p>Nos consultants aiment partager leurs découvertes, expériences et savoir-faire : les pages de nos Carnets de Vol seront postées dans ce blog au fur et à mesure et ces articles seront l&#8217;occasion d&#8217;échanger avec vous sur des sujets variés, techniques ou non.</p>
<p>Bonne lecture !</p>
]]></content:encoded>
			<wfw:commentRss>http://www.aeon-consulting.fr/fr/blog/2009/07/08/lancement-carnets-vol/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
