<?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>La Fabrick &#187; [Dev] Flash / Flex / AIR&#8230;</title>
	<atom:link href="http://www.lafabrick.com/blog/category/as/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.lafabrick.com/blog</link>
	<description>Laboratoire d&#039;interfaces riches (Flex, Flash, Air ...)</description>
	<lastBuildDate>Mon, 28 Nov 2011 22:02:08 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.1.4</generator>
		<item>
		<title>Barcamp Lyon : Mix-IT, Flex, Java, PHP, JS, Cloud&#8230; (et chips)</title>
		<link>http://www.lafabrick.com/blog/2011/07/08/2621-barcamp-lyon-mix-it-flex-java-php-js-cloud-et-chips/</link>
		<comments>http://www.lafabrick.com/blog/2011/07/08/2621-barcamp-lyon-mix-it-flex-java-php-js-cloud-et-chips/#comments</comments>
		<pubDate>Fri, 08 Jul 2011 12:01:34 +0000</pubDate>
		<dc:creator>Hervé</dc:creator>
				<category><![CDATA[Bientôt chez vous]]></category>
		<category><![CDATA[[Dev] Flash / Flex / AIR...]]></category>

		<guid isPermaLink="false">http://www.lafabrick.com/blog/?p=2621</guid>
		<description><![CDATA[Source Ayant eu l&#8217;honneur et l&#8217;avantage de participer au BarCamp Summer Lyon, je vous propose un petit retour d&#8217;expérience sur cette excellente initiative d&#8217;un ensemble d&#8217;assoc&#8217; actives de la région lyonnaise : Mix-IT LyonRB Club Agile Rhône-Alpes de Lyon Flex/Flasheurs MUG Lyon Lyon Java User Group Développeurs PHP de Lyon L&#8217;objectif : donner l&#8217;opportunité à [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: center;"><img class="aligncenter" title="BarCamp Geek" src="http://itmanagement.earthweb.com/img/2010/03/another-geek-bar.jpg" alt="" width="400" height="279" /><a href="http://itmanagement.earthweb.com/cnews/article.php/3873081/Tech-Comics-Another-Geek-in-a-Bar.htm"></a></p>
<p style="text-align: center;"><a href="http://itmanagement.earthweb.com/cnews/article.php/3873081/Tech-Comics-Another-Geek-in-a-Bar.htm">Source</a></p>
<p>Ayant eu l&#8217;honneur et l&#8217;avantage de participer au BarCamp Summer Lyon, je vous propose un petit retour d&#8217;expérience sur cette excellente initiative d&#8217;un ensemble d&#8217;assoc&#8217; actives de la région lyonnaise :</p>
<ul>
<li><a href="http://www.mix-it.fr/">Mix-IT</a></li>
<li><a href="http://lyonrb.fr/">LyonRB </a></li>
<li><a href="http://www.flex-tutorial.fr/2011/05/25/flex-user-group-lyon-rendez-vous-le-mardi-7-juin-avec-lafabrick-concours/"></a><a href="http://lyon.clubagilerhonealpes.org/">Club Agile Rhône-Alpes de Lyon</a></li>
<li><a href="http://lyon.clubagilerhonealpes.org/"></a><a href="http://www.flex-tutorial.fr/2011/05/25/flex-user-group-lyon-rendez-vous-le-mardi-7-juin-avec-lafabrick-concours/">Flex/Flasheurs</a></li>
<li><a href="http://lyon.clubagilerhonealpes.org/"></a><a href="http://twitter.com/#!/muglyon">MUG Lyon</a></li>
<li><a href="http://twitter.com/#!/muglyon"></a><a href="http://www.lyonjug.org/">Lyon Java User Group</a></li>
<li>Développeurs PHP de Lyon</li>
</ul>
<p><strong>L&#8217;objectif</strong> : donner l&#8217;opportunité à chacun de présenter un sujet qu&#8217;il connaît ou sur lequel il souhaite échanger librement. Les choix de sujets étaient proposés sur une base de volontariat, les sujets retenus votés à la gommette comme au bon vieux temps (comme on aime quoi).</p>
<p>Le public était quasi-exclusivement technique (à l&#8217;évidence), issus de SSII / éditeurs, et composé d&#8217;architectes, développeurs web, coach agile, chefs de projets, entrepreneurs&#8230;</p>
<p>En résumé, un bon rythme, des sujets &laquo;&nbsp;en vogue&nbsp;&raquo; avec échanges constructifs sur les intérêts / risques de chaque techno ou méthodo.</p>
<p><span id="more-2621"></span>Voici un rapide retour sur les thématiques auxquelles j&#8217;ai assisté, pour alimenter la discussion et inviter à poursuivre cette initiative !</p>
<h2>DevOps</h2>
<p><!-- p.p1 {margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Arial} p.p2 {margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Arial; min-height: 14.0px} li.li1 {margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Arial} ul.ul1 {list-style-type: disc} ul.ul2 {list-style-type: circle} -->En tant que newbie du sujet, j&#8217;ai cerné DevOps comme consistant en un <strong>ensemble de pratiques et principes d&#8217;échanges pour une meilleure communication entre équipes</strong> infra / support et équipes de développement. Ces principes se déclinant en :</p>
<ul>
<li>organisation projet,</li>
<li>modes de communication,</li>
<li>outils.</li>
</ul>
<p>Une forte composante de cette méthodologie réside dans les deux premiers points : comment <strong>briser les barrières entre équipes de support, administrateurs système et équipes de développement</strong>. Cette cassure visant à impliquer chacun dans le process projet et fluidifier les échanges.</p>
<p>Pour cela, la méthodologie intègre fortement les principes de l&#8217;agilité, suggère une fréquence élevée de livraisons etc. &#8230; Pour plus d&#8217;infos, je vous invite à <a title="DevOps" href="http://en.wikipedia.org/wiki/DevOps">consulter l&#8217;article DevOps sur Wikipedia (anglais)</a>.</p>
<p>Niveau outils, nous avons échangé sur les systèmes d&#8217;intégration continue et de déploiement automatisé (installation et configuration de machine en un clic).</p>
<p>Un retour a été donné sur les outils suivants :</p>
<ul>
<li><a href="http://www.puppetlabs.com/">Puppet</a> (Ruby) : assez simple à prendre en main, grosse communauté</li>
<li><a href="http://cfengine.com/">CFengine</a> : performant mais peu de retours d&#8217;expérience et pas d&#8217;interface graphique</li>
<li><a href="http://wiki.opscode.com/display/chef/Home">chef</a> (beaucoup plus complexe)</li>
</ul>
<p>Une limite signalée à propos de ces outils touche principalement les entreprises &laquo;&nbsp;désossant&nbsp;&raquo; les paquets standards selon leur propre norme, ne laissant donc on ne peut plus utiliser les paquets standards. C&#8217;est toujours bon à savoir <img src='http://www.lafabrick.com/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Les avantages sont en revanche multiples :</p>
<ul>
<li>Le versionnement d&#8217;un script puppet rend extrêmement simple toute <strong>procédure de retour arrière</strong> (rollback) sur le serveur.</li>
<li>La <strong>montée en volume d&#8217;un parc de machines</strong> hébergées en interne devient un jeu d&#8217;enfant</li>
<li>On peut aller jusqu&#8217;à envisager les backups (machine, données, sources)</li>
</ul>
<p>L&#8217;administrateur déporte donc son travail sur l&#8217;outil puppet plus que sur le serveur lui-même, <strong>transformant son métier plutôt que l&#8217;annihilant</strong> (et au passage le rendant plus intéressant ? On aime bien ne faire les choses qu&#8217;une fois en général <img src='http://www.lafabrick.com/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> ).</p>
<p>D&#8217;un point de vue humain, un principe intéressant consiste à intégrer les équipes de support et d&#8217;administration <strong>le plus tôt possible dans les phases de conception</strong> d&#8217;un projet pour intégrer au mieux leur contraintes, et simplifier les échanges ultérieurs. En résumé, comprendre les problèmes des autres permet souvent d&#8217;y apporter une solution simple à laquelle on n&#8217;aurait jamais pensé. Ca paraît évident à dire, moins à faire !</p>
<p>Nous avons enfin échangé sur des problématiques comme :</p>
<ul>
<li>Combien ça coûte ? Quelques tuyaux résident dans le chiffrage :
<ul>
<li><strong>A priori</strong> : estimer le gain sur la maintenance (très difficile)</li>
<li><strong>A posteriori</strong> : estimer le gain en comparaison avec un autre projet (techniquement plus simple, mais souvent négligé voire oublié selon la coutume &laquo;&nbsp;ce qui est fait est fait&nbsp;&raquo;)</li>
</ul>
</li>
<li>Décloisonner demande un état d&#8217;esprit ouvert : lorsque les tensions sont déjà fortes, il y a fort à parier que la mayonnaise ne prenne pas</li>
</ul>
<p>Et vous, êtes-vous DevOps ?</p>
<h2>TDD / BDD</h2>
<p style="text-align: center;"><img class="aligncenter" title="Une représentation donnée par Microsoft" src="http://i.msdn.microsoft.com/gg490346.Satrom_Figure2_hires(en-us,MSDN.10).jpg" alt="" width="400" height="176" /><br />
<a href="http://msdn.microsoft.com/en-us/magazine/gg490346.aspx">Source</a></p>
<p>Sans revenir trop longtemps sur le Test Driven Development et sa clique (JUnit, DBUnit, NUnit, FlexUnit, PHPUnit&#8230;), nous avons abordé un nouvel acronyme pour moi : BDD (<strong>B</strong>ehavior <strong>D</strong>riven <strong>D</strong>evelopment), dont le principe est bien mieux expliqué <a href="http://fr.wikipedia.org/wiki/Behavior_Driven_Development">sur Wikipedia</a> que je ne saurais le faire.</p>
<p>Le retour d&#8217;expérience a été donné principalement sur <a href="http://jbehave.org/">JBehave</a> qui propose de rédiger des <strong>exigences sous forme de fichiers au format texte</strong> comprenant trois mot-clés principaux : GIVEN (définir une situation) WHEN (définir un événement déclencheur) THEN (définir le résultat attendu). Les phrases pouvant être rédigées comme vous le souhaitez.</p>
<p>L&#8217;idée diabolique est donc d&#8217;<strong>obtenir ce fichier d&#8217;un interlocuteur fonctionnel,</strong> que vous pouvez utiliser sans transformation pour développer des routines correspondant à chaque exigence et ainsi valider que votre programme y répond.</p>
<p>Même si (à mon humble avis) cette méthodologie demande un interlocuteur métier motivé – pour ne pas dire un &laquo;&nbsp;consultant AMOA ultra au point&nbsp;&raquo; – et certainement d&#8217;éliminer quelques freins, le principe d&#8217;<strong>alléger vos spécifications</strong> et de retrouver (par un heureux effet de bord) vos exigences dans votre code source est clairement intéressant. Je m&#8217;interroge également sur le glissement vers &laquo;&nbsp;l&#8217;algorithmie masquée&nbsp;&raquo; que peuvent représenter les fameux fichiers textes&#8230; Vaste programme.</p>
<p>Amis flexeurs, quelques early-adopters ont déjà <a href="http://gravityblast.com/2009/08/20/flex-functional-testing-with-funfx-and-cucumber/">expérimenté le principe</a> basé sur <a href="http://cukes.info/">Cucumber</a> (Ruby). Si ça vous dit&#8230; En attendant, si vous faites du FlexMock, FlexMonkey et FlexUnit, c&#8217;est déjà pas mal !</p>
<p>Un petit regret, la difficulté d&#8217;aborder la question du &laquo;&nbsp;où s&#8217;arrêter&nbsp;&raquo; en fonction du projet mené : est-ce toujours rentable d&#8217;avoir une couverture de tests à 100% si votre projet a une durée de vie limitée&#8230; Même si cette question est particulièrement sujette à l&#8217;appréciation de chacun sans réellement connaître de règle.</p>
<h2>Des spaghettis, des marshmallows</h2>
<p style="text-align: center;"><img title="Des marshmallows" src="http://www.igglesblog.com/.a/6a00d8341c248053ef0133f4711ec9970b-800wi" alt="" width="250" height="250" /><br />
<a href="http://www.igglesblog.com/iggles_blog/2010/09/andy-reid-eats-the-michael-vick-marshmallow.html"> </a></p>
<p style="text-align: center;"><a href="http://www.igglesblog.com/iggles_blog/2010/09/andy-reid-eats-the-michael-vick-marshmallow.html">Source</a></p>
<p>Le dernier atelier reprenait le concept du <a href="http://marshmallowchallenge.com/">marshmallow challenge</a>.</p>
<p><strong>Le principe :</strong> 18 minutes pour construire la plus haute tour de spaghettis surmontée d&#8217;un marshmallow avec comme accessoires du scotch et un fil de couture.<br />
<strong>L&#8217;objectif :</strong> souligner la façon dont nous travaillons en équipe, dont nous fonctionnons face à un problème&#8230; Les résultats sont intéressants, je vous invite à tenter le coup si vous en avez l&#8217;occasion.</p>
<p>Je n&#8217;ai pas la photo de notre oeuvre éphémère&#8230; Mais ne regrettez rien <img src='http://www.lafabrick.com/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Merci à tous les organisateurs donc, à quand le prochain <img src='http://www.lafabrick.com/blog/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' />  ?Autres articles sur le même sujet
<ul>
<li><a href="http://www.lafabrick.com/blog/2006/10/22/6-youtube-transforming-a-2d-image-into-3d/" rel="bookmark" title="22 octobre 2006">Le 8ème jour ils créerent le Volume</a></li>
<li><a href="http://www.lafabrick.com/blog/2007/10/01/244-vous-avez-dis-flex3-beta2/" rel="bookmark" title="1 octobre 2007">Vous avez dis Flex3 Beta2 ?</a></li>
<li><a href="http://www.lafabrick.com/blog/2008/03/03/313-l-universit-lyon1-cherche-aussi-2-stagiaires/" rel="bookmark" title="3 mars 2008">L&#8217;université Lyon1 cherche (aussi) 2 stagiaires</a></li>
<li><a href="http://www.lafabrick.com/blog/2011/02/26/2429-orm-hibernate-et-contrarietes/" rel="bookmark" title="26 février 2011">ORM, Hibernate et contrariétés&#8230;</a></li>
</ul>
<p><!-- Similar Posts took 12.062 ms --></p>
]]></content:encoded>
			<wfw:commentRss>http://www.lafabrick.com/blog/2011/07/08/2621-barcamp-lyon-mix-it-flex-java-php-js-cloud-et-chips/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Fireworks + Javascript = Spark Skin Pleasure !</title>
		<link>http://www.lafabrick.com/blog/2011/06/23/2598-fireworks-javascript-spark-skin-pleasure/</link>
		<comments>http://www.lafabrick.com/blog/2011/06/23/2598-fireworks-javascript-spark-skin-pleasure/#comments</comments>
		<pubDate>Thu, 23 Jun 2011 15:02:15 +0000</pubDate>
		<dc:creator>Erick</dc:creator>
				<category><![CDATA[Expériences utilisateur]]></category>
		<category><![CDATA[Logiciels / extensions / plugins...]]></category>
		<category><![CDATA[Nos projets]]></category>
		<category><![CDATA[[Dev] Flash / Flex / AIR...]]></category>

		<guid isPermaLink="false">http://www.lafabrick.com/blog/?p=2598</guid>
		<description><![CDATA[J&#8217;pensais pas faire ça aujourd&#8217;hui&#8230;, mais bon&#8230; moultes skins Spark à tomber : j&#8217;ai décidé de me helper myself et de gagner de l&#8217;argent ( enfin du temps pour commencer ). Du coup est née la petite commande Fireworks copyMXMLSelectionToClipboard, qui comme son nom l&#8217;indique presque, permet de copier une sélection dans Fireworks directement en [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://www.lafabrick.com/blog/images/_erick/fw2mxml_cmd-1-20110623-170349.png"  alt="Copier le MXML / FXG dans le ClipBoard" /></p>
<p>J&#8217;pensais pas faire ça aujourd&#8217;hui&#8230;, mais bon&#8230; moultes skins Spark à tomber : j&#8217;ai décidé de me helper myself et de gagner de l&#8217;argent ( enfin du temps pour commencer ). Du coup est née la petite commande Fireworks <em>copyMXMLSelectionToClipboard</em>, qui comme son nom l&#8217;indique presque, permet de copier une sélection dans Fireworks directement en MXML dans le ClipBoard. Elle est pas belle la vie ?!</p>
<p><span id="more-2598"></span></p>
<p>En gros :<br />
1. tu dessines tes trucs dans Fireworks, tu fais tes jolies dégradés, tes reflets, tes subtils petits floutés&#8230;<br />
2. tu sélectionnes ce que tu veux mettre dans ta skin<br />
3. tu lances la commande &#8216;UIGFx/SelectionToMXMLClipboard&nbsp;&raquo;<br />
4. t&#8217;ouvres ta skinClass et pi t&#8217;y colle </p>
<p><img src="http://www.lafabrick.com/blog/images/_erick/fw2mxml_generatedcode-20110623-165951.png"  alt="Copier le MXML / FXG généré" /></p>
<p>5. et pi&#8230; tu souris !</p>
<p>Cette 1ère version permet d&#8217;exporter les Rect, les Path et des Groups ( de Rect et de Paths ! ),<br />
avec leur SolidColor / SolidColorStroke,  LinearGradient ou RadialGradient,<br />
et même quelques filtres : Blur / DropShadow / InnerShadow.</p>
<p>Les positions sont recalculées avec un sélection placée à l&#8217;origine xy.</p>
<p><a href="http://www.lafabrick.com/labz/uigfx/xtensions/mxmlclip.zip">Télécharger l&#8217;extension Fireworks (CS3 + )</a></p>
<p>Et c&#8217;est déjà çà de fait ! </p>
<p>Edit : et je rappelle qu&#8217;on peut mapper des raccourcis pour n&#8217;importe quel élément de menu&#8230; #jdcjdrAutres articles sur le même sujet
<ul>
<li><a href="http://www.lafabrick.com/blog/2007/11/07/238-digimix-un-air-de-musique/" rel="bookmark" title="7 novembre 2007">Digimix : un Air de musique&#8230;</a></li>
<li><a href="http://www.lafabrick.com/blog/2008/05/10/323-tuto-vido-skiner-un-composant-flex-3-avec-fireworks-cs3/" rel="bookmark" title="10 mai 2008">Skiner un composant Flex 3 avec Fireworks CS3 [Tutoriel Vidéo]</a></li>
<li><a href="http://www.lafabrick.com/blog/2009/12/04/1453-flex4-skin-et-primitives/" rel="bookmark" title="4 décembre 2009">Flex4 : skin et primitives</a></li>
<li><a href="http://www.lafabrick.com/blog/2010/02/09/1964-uigfx-project-flex4-primitives-library-fireworks-extension/" rel="bookmark" title="9 février 2010">uigfx project : Flex4 primitives library / Fireworks extension</a></li>
</ul>
<p><!-- Similar Posts took 12.404 ms --></p>
]]></content:encoded>
			<wfw:commentRss>http://www.lafabrick.com/blog/2011/06/23/2598-fireworks-javascript-spark-skin-pleasure/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Make me Fluid</title>
		<link>http://www.lafabrick.com/blog/2011/05/27/2576-make-me-fluid-2/</link>
		<comments>http://www.lafabrick.com/blog/2011/05/27/2576-make-me-fluid-2/#comments</comments>
		<pubDate>Fri, 27 May 2011 08:36:48 +0000</pubDate>
		<dc:creator>Fabien</dc:creator>
				<category><![CDATA[Expériences utilisateur]]></category>
		<category><![CDATA[La Fabrick]]></category>
		<category><![CDATA[Non classé]]></category>
		<category><![CDATA[Nos projets]]></category>
		<category><![CDATA[Pure Style]]></category>
		<category><![CDATA[[Dev] Flash / Flex / AIR...]]></category>

		<guid isPermaLink="false">http://www.lafabrick.com/blog/?p=2576</guid>
		<description><![CDATA[Vous vous souvenez peut-être de l’ancien site web de Paul Neave ? Autour de 2004 il me semble. Une perle du Web 1.0 ou les bordures du site ce tordaient au moindre passage de la souris. C’est un de ces sites qui, à l’époque, me faisait dire que Flash c’était cool. Il y a quelques [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: center;"></a><a href="http://www.lafabrick.com/blog/wp-content/uploads/2011/05/TheFluidGuy.png"><img class="aligncenter size-full wp-image-2651" title="TheFluidGuy" src="http://www.lafabrick.com/blog/wp-content/uploads/2011/05/TheFluidGuy.png" alt="" width="303" height="272" /><br />
Vous vous souvenez peut-être de<a href="http://web.archive.org/web/20050204015952/http://www.neave.com/games/"> l’ancien site web</a> de <a href="http://twitter.com/#!/neave">Paul Neave</a> ? Autour de 2004 il me semble. Une perle du Web 1.0 ou les bordures du site ce tordaient au moindre passage de la souris. C’est un de ces sites qui, à l’époque, me faisait dire que Flash c’était cool.</p>
<p>Il y a quelques temps, suivant les travaux de <a href="http://philippe.elsass.me/">Philippe Elsass</a> (<a href="http://twitter.com/#!/elsassph">@elsassph</a>) sur les algos de dessin, j’ai entrepris de nouveaux travaux sur le sujet. Dans une librairie de primitives pour Flex4 d’abord, avec <a href="http://code.google.com/p/uigfx/">UIGFX</a>, et puis rapidement pour rendre plus&#8230; &laquo;&nbsp;fluides&nbsp;&raquo; mes skins d’application, façon Neave.<br />
<span id="more-2576"></span></p>
<p><strong>Attention : parcequ&#8217;il y a de nombreux exemples, et parceque ce billet est un voyage dans le monde merveilleux de la gelée; votre ordinateur peu subir quelques changements et râler un peu</strong></p>
<p>Ceux qui <a href="http://twitter.com/#!/fabienbizot">me suivent sur  Twitter</a> auront peut-être vu passer quelques essais.</p>
<table width="100%">
<tbody>
<tr>
<td width="50%"><a href="http://www.lafabrick.com/labz/skins/jellySound/"><img class="aligncenter size-full wp-image-2558" title="jellySound" src="http://www.lafabrick.com/blog/wp-content/uploads/2011/05/jellySound.png" alt="" width="280" height="200" /></a></td>
<td width="50%"><a href="http://www.lafabrick.com/labz/skins/jellySkin/"><img class="aligncenter size-full wp-image-2557" title="jellySkin" src="http://www.lafabrick.com/blog/wp-content/uploads/2011/05/jellySkin.png" alt="" width="280" height="200" /></a></td>
</tr>
</tbody>
</table>
<p><em>(Clic pour ouvrir)</em><br />
Ces tests de skinning flex interactif proviennent d’une extension Fluide de la librairie UIGFX (extension que je n’ai pas encore diffusé, faute de temps&#8230;)</p>
<p>BIGA! <a href="http://en.nicoptere.net/">Nicolas Barradeau</a> (<a href="http://twitter.com/#!/nicoptere">@nicoptere</a>) nous lance une série d’articles impressionnante sur l’art génératif, qui ce termine par une lib d’outils géométrique : <a href="http://code.google.com/p/biga/">Biga</a>. J’ai pas pu me retenir, et repris mes expérimentations.</p>
<h2>Des points&#8230;</h2>
<p>L’idée de l&#8217;interaction «fluide» est basé sur les algo de répulsion. Lorsque qu’un point de souris approche d’une zone d&#8217;interaction de point de vecteur, il faut calculer une «dispersion» du point.</p>
<p>J’utilise 2 facteurs distincts :</p>
<ul>
<li><strong>La viscosité</strong>: un coefficient qui donne, comme son nom l’indique, la viscosité du point. En physique des fluides, la viscosité représente la capacité d’un liquide à s’écouler. Plus le coefficient est faible, plus l’écoulement du fluide est rapide (ex: l’eau). A l’inverse, plus le coefficient est élevé, plus le fluide à des contraintes physiques importantes qui réduisent sont écoulement (ex.: la confiture).</li>
<li><strong>le facteur de gelée</strong>: c’est mon coefficient «maison». Un indicateur qui permet de préciser le degré de déformation d’un fluide. Plus ce facteur est élevé, plus le taux de déformation, et donc le mouvement de la forme, sera important.</li>
</ul>
<p>En AS3, on peut l’écrire comme ceci :</p>
<pre class="brush: js">
public function update(owner:DisplayObject):void
{
offsetx+=(xref - x) / jelly;
offsety+=(yref - y) / jelly;

var dx:Number=0;
var dy:Number=0;
if (owner.stage)
{
dx=x - owner.stage.mouseX;
dy=y - owner.stage.mouseY;
}

if (Math.sqrt((dx * dx) + (dy * dy)) &lt;= approach * 1.1)
{
var divisor:Number=approach / 10;
var a:Number=Math.atan2(dy, dx);

offsetx+=(Math.cos(a) * approach - dx) / divisor;
offsety+=(Math.sin(a) * approach - dy) / divisor;
}

offsetx*=(1 - viscosity);
offsety*=(1 - viscosity);
if (Math.abs(offsetx) &lt; .001)
{
offsetx=0;
}

if (Math.abs(offsety) &lt; .001)
{
offsety=0;
}

x+=offsetx;
y+=offsety;
}
</pre>
<p>Visuellement :<br />

    <object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" id="swfobj_0" width="650" height="300" align="center">
      <param name="movie" value="http://fabien.lafabrick.com/labs/fluid/FluidSpritePointTest.swf" />
      <param name="align" value="center" />
      <!--[if !IE]>-->
      <object type="application/x-shockwave-flash" data="http://fabien.lafabrick.com/labs/fluid/FluidSpritePointTest.swf" width="650" height="300" align="center">
      <!--<![endif]-->
        
      <!--[if !IE]>-->
      </object>
      <!--<![endif]-->
    </object>
</p>
<h2>&#8230;Des lignes&#8230;</h2>
<p>2 points définissent une ligne&#8230; C&#8217;est la règle.<br />

    <object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" id="swfobj_1" width="650" height="300" align="center">
      <param name="movie" value="http://fabien.lafabrick.com/labs/fluid/FluidSimpleLineTest.swf" />
      <param name="align" value="center" />
      <!--[if !IE]>-->
      <object type="application/x-shockwave-flash" data="http://fabien.lafabrick.com/labs/fluid/FluidSimpleLineTest.swf" width="650" height="300" align="center">
      <!--<![endif]-->
        
      <!--[if !IE]>-->
      </object>
      <!--<![endif]-->
    </object>
</p>
<h3>Projection</h3>
<p>Pour obtenir une ligne «fluide», il faut avoir un point de vecteur intermédiaire sur la ligne.<br />
Une méthode simple et efficace est de projeter le point de la souris sur la ligne. Les mathématiciens on depuis longtemps résolu le problème, et l&#8217;implémentation AS3 d’un algo de projection ressemble à ça :</p>
<pre class="brush: js">
public static function projection(p:Point, a:Point, b:Point):Point
{
var len:Number = length(a, b);
var r:Number = (((a.y - p.y) * (a.y - b.y)) - ((a.x - p.x) * (b.x - a.x))) / (len * len);

var px:Number = a.x + r * (b.x - a.x);
var py:Number = a.y + r * (b.y - a.y);

return new Point(px, py);
}
</pre>
<p>Avec les outis géométriques proposés par @nicoptere dans la lib Biga, le point de projection contraint dans la ligne, peut se calculer comme suit :</p>
<pre class="brush: js">
var mousePoint : Point = new Point(mouseX, mouseY);
var projection : Point = GeomUtils.project(mousePoint, point1, point2);
var constraintProjection : Point = GeomUtils.constrain( projection, point, point2);
</pre>
<p>La projection du point de souris sur notre ligne molle nous permet d’obtenir une interaction intéressante :<br />

    <object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" id="swfobj_2" width="650" height="300" align="center">
      <param name="movie" value="http://fabien.lafabrick.com/labs/fluid/FluidLineTest.swf" />
      <param name="align" value="center" />
      <!--[if !IE]>-->
      <object type="application/x-shockwave-flash" data="http://fabien.lafabrick.com/labs/fluid/FluidLineTest.swf" width="650" height="300" align="center">
      <!--<![endif]-->
        
      <!--[if !IE]>-->
      </object>
      <!--<![endif]-->
    </object>
<br />
Si les points d’origine sont fixes, vous obtenez une espèce de corde de guitare. Rigolo.<br />

    <object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" id="swfobj_3" width="650" height="400" align="center">
      <param name="movie" value="http://fabien.lafabrick.com/labs/fluid/FluidRopeTest.swf" />
      <param name="align" value="center" />
      <!--[if !IE]>-->
      <object type="application/x-shockwave-flash" data="http://fabien.lafabrick.com/labs/fluid/FluidRopeTest.swf" width="650" height="400" align="center">
      <!--<![endif]-->
        
      <!--[if !IE]>-->
      </object>
      <!--<![endif]-->
    </object>
</p>
<h2>&#8230;Et des formes</h2>
<p>Avec encore plus de points on commence a avoir des formes, façon gateau anglais :<br />

    <object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" id="swfobj_4" width="650" height="400" align="center">
      <param name="movie" value="http://fabien.lafabrick.com/labs/fluid/FluidRectTest.swf" />
      <param name="align" value="center" />
      <!--[if !IE]>-->
      <object type="application/x-shockwave-flash" data="http://fabien.lafabrick.com/labs/fluid/FluidRectTest.swf" width="650" height="400" align="center">
      <!--<![endif]-->
        
      <!--[if !IE]>-->
      </object>
      <!--<![endif]-->
    </object>
<br />
Un autre exemple intéressant qui reprend la simulation de Philippe Elsass :<br />
<em>(Clic pour ajouter un point, Ctrl/Cmd + click pour supprimer un point)</em><br />

    <object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" id="swfobj_5" width="650" height="500" align="center">
      <param name="movie" value="http://fabien.lafabrick.com/labs/fluid/FluidMouseShapeTest.swf" />
      <param name="align" value="center" />
      <!--[if !IE]>-->
      <object type="application/x-shockwave-flash" data="http://fabien.lafabrick.com/labs/fluid/FluidMouseShapeTest.swf" width="650" height="500" align="center">
      <!--<![endif]-->
        
      <!--[if !IE]>-->
      </object>
      <!--<![endif]-->
    </object>
</p>
<h2>Encore plus de gelée</h2>
<p>Comme je le disais au début de cette article, nous travaillons depuis quelques temps sur une librairie de primitives pour Flex4 : UIGFX. L’idée est de proposer une suite de primitives bien utiles, qui n&#8217;existent en standard dans le SDK Flex4 (lignes pointillées, arc, camembert, &#8230;.).</p>
<p>Dans cette librairie, nous avons mis en place une  primitive de représentation graphique de path SVG, qui, à la différence de la primitive Path standard du SDK Flex, permet de placer les vecteurs dans le modèle de contraintes top, left, bottom, right. Cette primitive permet aussi d’importer un chemin SVG, et de le convertir au format propre à cette primitive.</p>
<p>En modifiant un peu le parseur SVG de UIGFX,  nous pouvons facilement parcourir un path SVG et extraire les points de vecteur clefs de la forme. L’idée, vous vous en doutez est de gélifier la forme <img src='http://www.lafabrick.com/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /><br />

    <object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" id="swfobj_6" width="650" height="500" align="center">
      <param name="movie" value="http://fabien.lafabrick.com/labs/fluid/FluidSvgTest.swf" />
      <param name="align" value="center" />
      <!--[if !IE]>-->
      <object type="application/x-shockwave-flash" data="http://fabien.lafabrick.com/labs/fluid/FluidSvgTest.swf" width="650" height="500" align="center">
      <!--<![endif]-->
        
      <!--[if !IE]>-->
      </object>
      <!--<![endif]-->
    </object>
</p>
<h2>Sources et ressources</h2>
<ul>
<li> Vous trouverez l’ensemble des sources <a href="http://fabien.lafabrick.com/labs/fluid/makeMeFluid-src.zip">dans ce zip</a></li>
<li><a href="http://code.google.com/p/biga/">Biga, geometric tools library</a></li>
<li><a href="http://en.nicoptere.net/?tag=generative-art">La série d&#8217;articles</a> de <a href="http://twitter.com/#!/nicoptere">Nicolas Barradeau</a></li>
<li><a href="http://philippe.elsass.me/2009/06/as3-parametric-path-drawing/">&laquo;&nbsp;Parametric path drawing&nbsp;&raquo;</a> de <a href="http://twitter.com/#!/elsassph">Philippe Elsass</a></li>
<li>Et bien sur <a href="http://neave.com/">le site web </a> de <a href="http://twitter.com/#!/neave">Paul Neave</a>, &#8230; et <a href="http://web.archive.org/web/20050204015952/http://www.neave.com/games/">l&#8217;ancien </a> <img src='http://www.lafabrick.com/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </li>
</ul>
<p>Have fluid&#8217;s fun !Autres articles sur le même sujet
<ul>
<li><a href="http://www.lafabrick.com/blog/2006/10/22/5-dessine-moi-de-la-3d/" rel="bookmark" title="22 octobre 2006">Dessine moi Final Fantaisy&#8230;</a></li>
<li><a href="http://www.lafabrick.com/blog/2006/10/22/10-youtube-soap-how-to-make-a-mouse-work-in-mid-air/" rel="bookmark" title="22 octobre 2006">La manette Wii sur mac / pc&#8230; enfin presque <img src='http://www.lafabrick.com/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </a></li>
<li><a href="http://www.lafabrick.com/blog/2007/12/06/277-librairie/" rel="bookmark" title="6 décembre 2007">Librairie lafabrick : parce que je le vaut bien</a></li>
<li><a href="http://www.lafabrick.com/blog/2007/05/15/96-et-le-9me-jour-il-crerent-le-volume-20/" rel="bookmark" title="15 mai 2007">et le 9ème jour il créerent le volume &#8230; 2.0</a></li>
</ul>
<p><!-- Similar Posts took 11.630 ms --></p>
]]></content:encoded>
			<wfw:commentRss>http://www.lafabrick.com/blog/2011/05/27/2576-make-me-fluid-2/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>ORM, Hibernate et contrariétés&#8230;</title>
		<link>http://www.lafabrick.com/blog/2011/02/26/2429-orm-hibernate-et-contrarietes/</link>
		<comments>http://www.lafabrick.com/blog/2011/02/26/2429-orm-hibernate-et-contrarietes/#comments</comments>
		<pubDate>Sat, 26 Feb 2011 10:30:59 +0000</pubDate>
		<dc:creator>Hervé</dc:creator>
				<category><![CDATA[[Dev] Flash / Flex / AIR...]]></category>
		<category><![CDATA[.NET]]></category>
		<category><![CDATA[hibernate]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[JPA]]></category>
		<category><![CDATA[LINQ]]></category>
		<category><![CDATA[ORM]]></category>

		<guid isPermaLink="false">http://www.lafabrick.com/blog/?p=2429</guid>
		<description><![CDATA[&#160; L’ORM, Object-Relational-Mapping ou, dans la langue de Molière (ou presque), Mapping Objet Relationnel est un concept en vogue depuis longtemps, choisi par les équipes d’architectes techniques de tous poils, préconisé par des consultants de tous horizons.&#160; Après quelques années à développer des « applications d’entreprise », j’ai eu l’occasion d’aboutir un constat : pourquoi [...]]]></description>
			<content:encoded><![CDATA[<p style="float: left; margin-right: 10px;">&nbsp;</p>
<div>L’ORM, Object-Relational-Mapping ou, dans la langue de Molière (ou presque), Mapping Objet Relationnel est un concept en vogue depuis longtemps, choisi par les équipes d’architectes techniques de tous poils, préconisé par des consultants de tous horizons.&nbsp;</p>
<p>Après quelques années à développer des « applications d’entreprise », j’ai eu l’occasion d’aboutir un constat : pourquoi se compliquer la vie avec un ORM quand on peut faire plus simple, plus rapide et au moins aussi maintenable ?</p>
<p>Cet article est une occasion de partager cette analyse avec vous, et (re)déclencher un vieux débat sur lequel je n’ai que rarement eu l’occasion de consulter des discussions en français.</p>
</div>
<p><span id="more-2429"></span></p>
<h2>Rappel : qu’est-ce qu’un ORM ?</h2>
<p>Un ORM fonctionne sur la base d’ajout de méta-données décrivant une correspondances entre des tables et colonnes de base de données et des objets et leurs propriétés.</p>
<p>Concrètement, un utilisateur pourra être modélisé par une classe</p>
<pre class="brush: java">

public class User

{
private int id;
private String nom;
private String prenom;
// Getters et setters
}
</pre>
<p>Les méta-données pouvant ressembler globalement à ça :</p>
<pre class="brush: xml">

&lt;mapping&gt;

&lt;class name=&quot;User&quot; table=&quot;USER_TABLE&quot;&gt;

&lt;property name=&quot;id&quot; column=&quot;USER_ID&quot; /&gt;

&lt;property name=&quot;nom&quot; column=&quot;USER_LASTNAME&quot; /&gt;

&lt;property name=&quot;prenom&quot; column=&quot;USER_FIRSTNAME&quot; /&gt;

&lt;/class&gt;

&lt;/mapping&gt;
</pre>
<p><em>Attention à ne pas considérer cet exemple comme fonctionnel il permet uniquement de se faire une idée du principe.</em></p>
<p>Une fois cette configuration effectuée, vous pouvez ensuite travailler avec un gestionnaire d’entité qui prendra automatiquement en charge la persistance de votre objet au sein de la base de données que vous utilisez.</p>
<p>Concrètement, ce gestionnaire d’entité travaille avec un pool d’objets, souvent appelé «cache de premier niveau», qui contient des objets récupérés de la base de données. Il propose pour cela des fonctions type :</p>
<ul>
<li><strong>save</strong></li>
<li><strong>queryForObject</strong></li>
<li><strong>queryForList</strong></li>
<li><strong>merge</strong></li>
<li>&#8230;</li>
</ul>
<p>pour sauvegarder / récupérer des éléments dont le mapping a été défini, ou intégrer des objets au cache de premier niveau.</p>
<p>L’autre fonctionnalité très prisée d’un ORM concerne la modélisation des relations entre les objets et donc les tables. Vous pouvez effectivement indiquer que votre utilisateur dispose de profils et ce profil de rôles.</p>
<p>Vous aboutirez à un modèle de type :</p>
<p><a href="http://www.lafabrick.com/blog/wp-content/uploads/2011/02/ORM-Modèle.png"><img class="aligncenter size-full wp-image-2434" title="Modele de données pour ORM" src="http://www.lafabrick.com/blog/wp-content/uploads/2011/02/ORM-Modèle.png" alt="Modele de données pour ORM" width="595" height="237" /></a></p>
<p>Il est alors possible de modéliser ces relations dans les méta-données et déclarer des propriétés supplémentaires dans notre classe. Par exemple, la classe User se verra ajouter</p>
<pre class="brush: java">

private List&lt;Profile&gt; profiles;
</pre>
<p>avec ses getter / setter associés.</p>
<p>Grâce au mécanisme de l’ORM, l’appel au getter getProfiles() d’une instance de la classe user récupérée via le gestionnaire d’entité provoquera une requête SQL de type :</p>
<pre class="brush: sql">

SELECT p.*

FROM PROFILE_TABLE p, USER_PROFILES up

WHERE up.PROFILE_CODE = p.PROFILE_CODE AND up.USER_ID = ?
</pre>
<p>le résultat de cette requête permettant de créer la liste d’objets Profile dont je vous laisse imaginer le code.</p>
<h2>Les frameworks ORM</h2>
<p>Le framework Java le plus connu sur ce sujet est Hibernate, qui a notamment introduit ce concept (ou l’a du moins fait connaître), repris ensuite officiellement par la communauté Java sous le doux nom de <a href="http://www.oracle.com/technetwork/articles/javaee/jpa-137156.html" target="_blank">JPA</a> (Java Persistence Annotations). JPA permet notamment de définir les méta-données par l’intermédiaire d’annotations Java de type <strong>@Column</strong>, <strong>@Table</strong>, etc. &#8230;</p>
<p>.NET a vu un portage d’Hibernate appelé <a href="http://community.jboss.org/wiki/NHibernateforNET" target="_blank">NHibernate</a>, lancé dans le cadre de la «dotnetification» des frameworks Java (<a href="http://logging.apache.org/log4j/" target="_blank">log4j</a> devient <a href="http://logging.apache.org/log4net/" target="_blank">log4net</a>, <a href="http://www.junit.org/" target="_blank">JUnit</a> devient <a href="http://www.nunit.org/" target="_blank">NUnit</a>&#8230;). Pourtant la solution de <a href="http://msdn.microsoft.com/en-us/library/8s3saad7(v=vs.71).aspx" target="_blank">DataSet .NET</a> offrait déjà des fonctionnalités assez proches, et particulièrement bien intégrées à l’environnement de développement, mais j’imagine que cette opération a eu le mérite de permettre aux habitués du framework à transiter vers .NET de manière plus rapide et fluide. A noter, vu qu’on parle de .NET que depuis la version 3, on a vu apparaître le framework LINQ, avec notamment <a href="http://msdn.microsoft.com/en-us/library/bb425822.aspx" target="_blank">LINQ to SQL</a> qui se place en concurrent officiel de NHibernate, avec un périmètre bien plus large, notamment sur sa capacité à travailler sur les collections en mémoire à l&#8217;aide de prédicats proches du SQL. Pour le coup, et malgré un plugin <a href="http://www.hibernate.org/subprojects/tools.html" target="_blank">Hibernate Tools</a> proposé par JBoss sur Java, la solution Microsoft se montre particulièrement bien pensée au niveau de son intégration à l’environnement de développement (ce qu’on comprend parfaitement quand on regarde le prix de Visual Studio en face d’un eclipse gracieusement mis à disposition).</p>
<p>Je passe les portages divers et variés ayant pu voir le jour sur d’autres plateformes, n’ayant pas le recul nécessaire, mais je suis certains qu’il en existe.</p>
<h2>Le constat</h2>
<p>Après avoir pris le temps de comprendre le fonctionnement d’un ORM en l’utilisant sur des projets existants ou en tentant de le mettre en place sur des projets partant d’un développement «from scratch», je me suis heurté aux problèmes liés à la persistance et à ce fameux cache de premier niveau. En effet, travailler avec deux versions d’un même objet, l’un existant dans le cache et l’autre non (créé par exemple à l’issue d’une soumission de formulaire, peut facilement poser des problèmes de cohérence, et demandent qu’on tienne compte des particularités du concept d’ORM pour que les exceptions StaleObjectException ou LazyInitializationException soient gérées correctement (ou peut-être devrais-je dire «tant bien que mal»).</p>
<p>Et c’est là que le bât blesse : l’ORM, bien que simplifiant la gestion des accès à une base de données peut très facilement être une source de problèmes de performances ou de stabilité d’une application s’il n’est pas utilisé à bon escient, ou par une personne non encadrée d’un expert du domaine.</p>
<p>Imaginez que l’on cherche à parcourir la liste des rôles d’un utilisateur récupéré au moyen d’un ORM dans notre exemple de tout à l’heure :</p>
<pre class="brush: java">

Iterator&lt;Profile&gt; profilesIter = user.getProfiles().iterator();

while (profilesIter.hasNext())

{

Profile currentProfile = profilesIter.next();

Iterator&lt;Roles&gt; rolesIter = currentProfile.getRoles().iterator();

while (rolesIter.hasNext())

{

Role currentRole = rolesIter.next();

// Faire quelque chose

}

}
</pre>
<p>En pratique, il est tout à fait probable que ce code, presque indolore sur des collections d’objets présents en mémoire, se traduise avec un ORM par une série de requêtes SQL. En considérant que ce code serve à contrôler qu’un utilisateur dispose d’un rôle donné au sein d’une application – étant donc appelé très souvent pour chaque utilisateur de l’application – on peut tout à fait imaginer les problèmes de performances posés.</p>
<h2>« C’est un problème de paramétrage »</h2>
<p>Effectivement, ces problèmes sont souvent liés à la méconnaissance du framework et à des problèmes de paramétrage. Je ne suis moi-même pas expert Hibernate mais le connais assez pour savoir qu’un bon paramétrage peut faire toute la différence et que le code d’une application doit également se conformer au paradigme d’ORM.</p>
<p>J’ai aussi tendance à considérer ce type de travail comme un luxe. En effet, à niveau équivalent, un développeur sera capable de produire une requête SQL relativement efficace alors qu’il restera incapable de proposer un paramétrage Hibernate adéquat.</p>
<p>En conclusion, <strong>bien manipulé, l’ORM peut être très intéressant</strong> et apporter en lisibilité de code. A l’inverse, <strong>mal utilisé, il pose plus de problèmes qu’il n’est sensé en résoudre</strong> (performances, «hacks» divers et variés&#8230;).</p>
<h2>Les alternatives</h2>
<p>Et si je ne veux pas d’ORM sur mon projet ? C’est une question à se poser : les problèmes posés par un ORM, selon l’organisation et l’expérience de l’équipe de développement, peuvent être un frein à la réussite d’un projet.</p>
<p>Vous pouvez globalement recourir à :</p>
<ul>
<li>Un «mappeur de requêtes SQL» permettant d’exécuter des requêtes rédigées par vos soins, et automatiquement «mappées» sur des objets selon la configuration mise en place. Un framework Java assez connu dans ce domaine est <a title="iBatis" href="http://ibatis.apache.org/" target="_blank">iBatis</a> (repris récemment sous le nom <a title="MyBatis" href="http://www.mybatis.org/" target="_blank">MyBatis</a>) qui donne des résultats tout à fait satisfaisants, notamment par rapport à sa facilité de mise en oeuvre et sa proximité de fonctionnement avec des appels standards JDBC.</li>
<li>Des appels JDBC natifs «bruts» qui manquent de classes facilitant les appels et traitements des résultats. En le complétant du framework <a title="Documentation Spring 2 JDBC" href="http://static.springsource.org/spring/docs/2.0.x/reference/jdbc.html" target="_blank">Spring et son JdbcTemplate</a>, vous obtenez une solution très simple à mettre en place et aisément compréhensible par une équipe de développement peu expérimentée.</li>
</ul>
<h2>Que choisir ?</h2>
<p>Aujourd’hui, selon le contexte de la société dans laquelle un projet donné est réalisé, deux grandes catégories d’équipe se distinguent :</p>
<ol>
<li>Une équipe composée de profils similaires, évoluant ensemble sur les développements applicatifs de la société pour laquelle ils travaillent.</li>
<li>Une équipe encadrée par un senior et composée de profils juniors.</li>
</ol>
<p>Dans le premier cas de figure, la capitalisation sur la technologie sera généralement pérenne, l’équipe restant stable et organisée autour d’un socle applicatif donné. Dans ce cadre, les problèmes liés à l’utilisation d’un ORM ne se posent finalement qu’au démarrage et sont gommés par la suite.</p>
<p>Dans la seconde configuration, le cadrage est fait par l’architecte de manière globale, mais souvent difficilement appliqué à tous les aspects du développement. Concrètement, l’expert interviendra à la demande d’un junior coincé sur un problème, et règlera le problème avec lui en tentant de lui apporter les connaissances manquantes. Dans ce schéma, à force, les juniors intégreront les concepts et deviendront seniors à leur tour, encadrant d’autres juniors et l’histoire se répètera.</p>
<h2>Conclusions</h2>
<p>Vous aurez compris que je ne suis personnellement pas friand d’ORM, lui préférant des solutions plus simples, ayant trop souvent eu à gérer des problèmes liés à l’incompréhension du framework, des tentatives de paramétrage a posteriori pour contrer les problèmes de performances&#8230; Mais <strong>tout dépend de votre configuration d’équipe</strong>, cela reste un choix très intéressant dès lorsque qu’il est partagé et que chaque membre de l’équipe maîtrise les tenants et aboutissants de cette technologie.</p>
<p>Et vous, vous êtes ORM ?Autres articles sur le même sujet
<ul>
<li><a href="http://www.lafabrick.com/blog/2007/10/01/244-vous-avez-dis-flex3-beta2/" rel="bookmark" title="1 octobre 2007">Vous avez dis Flex3 Beta2 ?</a></li>
<li><a href="http://www.lafabrick.com/blog/2007/09/06/214-quicksilver-non-action-et-tao-appliqu-l-os-google-talks/" rel="bookmark" title="6 septembre 2007">Quicksilver, non-action et Tao appliqués à MacOS X [@Google Talks]</a></li>
<li><a href="http://www.lafabrick.com/blog/2009/10/09/1349-max-2009-jpa-blazeds-et-livecycle-ds/" rel="bookmark" title="9 octobre 2009">MAX 2009 &#8211; JPA, BlazeDS et LiveCycle DS</a></li>
<li><a href="http://www.lafabrick.com/blog/2010/08/20/2167-air-2-appeler-un-jar-executable-via-un-nativeprocess/" rel="bookmark" title="20 août 2010">AIR 2 : appeler un JAR exécutable via un NativeProcess</a></li>
</ul>
<p><!-- Similar Posts took 12.653 ms --></p>
]]></content:encoded>
			<wfw:commentRss>http://www.lafabrick.com/blog/2011/02/26/2429-orm-hibernate-et-contrarietes/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>MdaME, ma résolution 2011 de génération de code AS3</title>
		<link>http://www.lafabrick.com/blog/2011/01/11/2349-mdame-generateur-code-xsd-as3-flex/</link>
		<comments>http://www.lafabrick.com/blog/2011/01/11/2349-mdame-generateur-code-xsd-as3-flex/#comments</comments>
		<pubDate>Tue, 11 Jan 2011 21:50:00 +0000</pubDate>
		<dc:creator>La Fabrick</dc:creator>
				<category><![CDATA[La Fabrick]]></category>
		<category><![CDATA[Logiciels / extensions / plugins...]]></category>
		<category><![CDATA[Nos projets]]></category>
		<category><![CDATA[[Dev] Flash / Flex / AIR...]]></category>
		<category><![CDATA[AIR]]></category>
		<category><![CDATA[AS3]]></category>
		<category><![CDATA[Flex]]></category>
		<category><![CDATA[generateur de code]]></category>
		<category><![CDATA[InMarket]]></category>
		<category><![CDATA[MDA]]></category>
		<category><![CDATA[XML]]></category>
		<category><![CDATA[xsd]]></category>

		<guid isPermaLink="false">http://www.lafabrick.com/blog/?p=2349</guid>
		<description><![CDATA[Voilà quelques temps que nous nous activions sans donner de nouvelles&#8230;, il est temps de corriger tout ça. Aussi, pour démarrer cette nouvelle année du bon pied, La Fabrick vous propose une petite application de génération de code AS3 à partir d&#8217;un schéma XSD. Ce petit outil nous a été utile pour pas mal de [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: center;">
<p><a href="http://www.lafabrick.com/blog/wp-content/uploads/2011/01/MdaMe.png"><img class="size-full wp-image-2372 alignnone" title="MdaMe" src="http://www.lafabrick.com/blog/wp-content/uploads/2011/01/MdaMe.png" alt="" width="499" height="64" /></a></p>
<p>Voilà quelques temps que nous nous activions sans donner de nouvelles&#8230;, il est temps de corriger tout ça.<br />
Aussi, pour démarrer cette nouvelle année du bon pied, La Fabrick vous propose une petite application de génération de code AS3 à partir d&#8217;un schéma XSD.</p>
<p>Ce petit outil nous a été utile pour pas mal de projets développés pour nos premiers clients, alors pourquoi ne pas vous en faire profiter ? Peut-être deviendrez-vous aussi MdaME-addict ?</p>
<p>Retrouvez toutes les infos sur <a href="http://mdame.lafabrick.com">http://mdame.lafabrick.com</a>Autres articles sur le même sujet
<ul>
<li><a href="http://www.lafabrick.com/blog/2006/12/21/23-api-de-dessin-en-as3/" rel="bookmark" title="21 décembre 2006">API de dessin en AS3</a></li>
<li><a href="http://www.lafabrick.com/blog/2007/03/15/39-cre-ton-navigateur-perso-avec-5-lignes-de-code/" rel="bookmark" title="15 mars 2007">Crée ton navigateur perso avec 5 lignes de code !</a></li>
<li><a href="http://www.lafabrick.com/blog/2008/02/27/309-flex-builder-3-et-le-php/" rel="bookmark" title="27 février 2008">Flex Builder 3 et le PHP ( PDT ) : installation</a></li>
<li><a href="http://www.lafabrick.com/blog/2008/05/10/323-tuto-vido-skiner-un-composant-flex-3-avec-fireworks-cs3/" rel="bookmark" title="10 mai 2008">Skiner un composant Flex 3 avec Fireworks CS3 [Tutoriel Vidéo]</a></li>
</ul>
<p><!-- Similar Posts took 11.587 ms --></p>
]]></content:encoded>
			<wfw:commentRss>http://www.lafabrick.com/blog/2011/01/11/2349-mdame-generateur-code-xsd-as3-flex/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>RollingFileTarget pour AIR 2.0 : let&#8217;s roll !</title>
		<link>http://www.lafabrick.com/blog/2010/10/21/2272-rollingfiletarget-pour-air-2-0-lets-roll/</link>
		<comments>http://www.lafabrick.com/blog/2010/10/21/2272-rollingfiletarget-pour-air-2-0-lets-roll/#comments</comments>
		<pubDate>Thu, 21 Oct 2010 17:35:00 +0000</pubDate>
		<dc:creator>Hervé</dc:creator>
				<category><![CDATA[[Dev] Flash / Flex / AIR...]]></category>
		<category><![CDATA[AIR]]></category>
		<category><![CDATA[Flex]]></category>
		<category><![CDATA[linkedin]]></category>
		<category><![CDATA[log]]></category>

		<guid isPermaLink="false">http://www.lafabrick.com/blog/?p=2272</guid>
		<description><![CDATA[Pour ceux qui utilisent l&#8217;API de logging de Flex, au sein d&#8217;une application AIR ont certainement remarque qu&#8217;il manquait cruellement une Target &#171;&#160;fichier&#160;&#187; pour tracer dans un fichier texte (même si le résultat de la fonction trace se retrouve enfoui quelque part dans les tréfonds du répertoire de données du Flash Player). Pour ceux qui [...]]]></description>
			<content:encoded><![CDATA[<p><img class="aligncenter" src="http://help.adobe.com/en_US/flex/using/images/lg_logger_target_dist_popup.png" alt="Flex Logging API" width="506" height="60" /></p>
<p>Pour ceux qui utilisent l&#8217;<a href="http://help.adobe.com/en_US/flex/using/WS2db454920e96a9e51e63e3d11c0bf69084-7f0f.html">API de logging de Flex</a>, au sein d&#8217;une application AIR ont certainement remarque qu&#8217;il manquait cruellement une Target &laquo;&nbsp;fichier&nbsp;&raquo; pour tracer dans un fichier texte (même si le résultat de la fonction <strong>trace</strong> se retrouve enfoui quelque part dans les tréfonds du répertoire de données du Flash Player).</p>
<p>Pour ceux qui se sont posés cette question, vous êtes sans doute tombés (Ô joie) sur la <a href="http://github.com/mikechambers/as3corelib/blob/master/src/com/adobe/air/logging/FileTarget.as">FileTarget</a> de notre ami <a href="http://twitter.com/#!/mesh">Mike Chambers</a> dans l&#8217;AS3 core lib.</p>
<p>Pour ceux qui se sont demandé s&#8217;il y avait un équivalent du <strong>RollingFileAppender</strong> de <strong>log4j</strong> en Flex (j&#8217;espère qu&#8217;il en reste, sinon restez, c&#8217;est bien quand même !), eh bien vous êtes certainement tombés sur l&#8217;ensemble vide.</p>
<p>N&#8217;y tenant plus, j&#8217;ai craqué sur une extension de la FileTarget pour créer le RollingFileTarget. Vous en voulez ?<br />
<span id="more-2272"></span></p>
<h2>Un rapide point sur l&#8217;API de logging</h2>
<p>Et pourquoi pas un bon vieux <code><strong>trace("qui tâche")</strong></code> ?<br />
Simplement parce que <strong><code>trace()</code></strong> trace tout, tout le temps, sans indication complémentaire sur le moment, ou la criticité de l&#8217;événement tracé. En clair, c&#8217;est très pratique pour en phase de test simple, lab ou autre, mais devient très vite inapproprié dès qu&#8217;on entre dans un développement structuré.</p>
<h2>Comment faire de jolies traces bien propres <span style="font-size: 8pt;">Aïe</span></h2>
<p>C&#8217;est très simple (cf. doc Flex) :</p>
<h3>La target</h3>
<pre class="brush: js">
/* Create a target. */
var logTarget:TraceTarget = new TraceTarget();

/* Log only messages for the classes in the mx.rpc.* and
mx.messaging packages. */
logTarget.filters=[&quot;mx.rpc.*&quot;,&quot;mx.messaging.*&quot;];

/* Log all log levels. */
logTarget.level = LogEventLevel.ALL;

/* Add date, time, category, and log level to the output. */
logTarget.includeDate = true;
logTarget.includeTime = true;
logTarget.includeCategory = true;
logTarget.includeLevel = true;

/* Begin logging. */
Log.addTarget(logTarget);
</pre>
<p>Vous noterez l&#8217;usage de la <strong>TraceTarget</strong> qui va indiquer d&#8217;envoyer les traces vers la console et donc faire comme la fonction <strong>trace()</strong>.<br />
La target permet d&#8217;aller un peu plus loin en indiquant notamment :</p>
<ul>
<li>le niveau de log : toute trace d&#8217;une criticité inférieure au niveau défini sera donc ignorée</li>
<li>des filtres sur les catégories de log : ces filtres vont permettre de n&#8217;envoyer sur la cible que les traces correspondantes</li>
</ul>
<h3>Le logger</h3>
<p>Nous avons donc une cible, maintenant il faut tracer ! Pour cela, il suffit de créer un logger :</p>
<pre class="brush: js">
private static var _logger:ILogger = Log.getLogger(&quot;com.lafabrick.classes.UneClasse&quot;);
</pre>
<p>Il est en général recommandé de créer un logger par classe de façon statique pour limiter le nombre d&#8217;instances en mémoire.<br />
Vous pouvez noter l&#8217;utilisation de la notation sous forme de packages permettant de faire le lien avec les filtres définis au niveau d&#8217;une target.<br />
Pour utiliser le <code>_logger</code>, vous pouvez appeler les méthodes suivantes :</p>
<pre class="brush: js">
_logger.debug(&quot;Trace niveau debug&quot;);
_logger.info(&quot;Trace niveau info&quot;);
_logger.warn(&quot;Trace niveau warning&quot;);
_logger.error(&quot;Trace niveau error&quot;);
_logger.fatal(&quot;Trace niveau fatal&quot;);
</pre>
<p>Les appels provoqueront l&#8217;ajout de votre trace à tout target définie correspondant au paramétrage de votre logger (catégorie et niveau).</p>
<h2>Faire sa target personnalisée</h2>
<p>Il ne reste plus qu&#8217;à écrire une target personnalisée qui va écrire dans un fichier au lieu d&#8217;écrire dans la console.</p>
<p>Vous pouvez pour cela étendre la classe <strong>AbstractTarget</strong> ou <strong>LineFormattedTarget </strong>(cette dernière prendra en charge la mise en forme du message pour vous, donc bien pratique).</p>
<p>C&#8217;est ce qu&#8217;a fait Mike avec sa <strong>FileTarget</strong> que je vous laisserai consulter sur <a href="http://github.com">Github</a>.</p>
<h2>La RollingFileTarget</h2>
<p>C&#8217;est sur ce modèle que j&#8217;ai développé la <strong>RollingFileTarget</strong> dont l&#8217;objectif est de pratiquer une rotation sur un fichier de log selon deux critères :</p>
<ol>
<li><strong>La date</strong><br />
Objectif : un fichier de log par jour, par mois ou par an</li>
<li><strong>Le poids</strong><br />
Objectif : la taille d&#8217;un fichier de log ne doit pas excéder N octets</li>
</ol>
<p><strong>Utilisation</strong></p>
<p>Il s&#8217;agit d&#8217;une target classique, utilisable comme la <strong>TraceTarget</strong> :</p>
<pre class="brush: js">
var fileTarget:RollingFileTarget = new RollingFileTarget(new File(&quot;app-storage:/logs/monappli.log&quot;));
fileTarget.filters = [&quot;*&quot;];
fileTarget.includeDate = true;
fileTarget.level = LogEventLevel.ERROR;
fileTarget.includeTime = true;
fileTarget.includeCategory = true;
fileTarget.includeLevel = true;
fileTarget.rollingInterval = RollingFileTarget.DAY_INTERVAL; // Un fichier de log par jour
fileTarget.maxLogFileWeight = 0; // Pas de limite de taille de fichier
fileTarget.maxLogBackups = 7; // Une semaine de roulement sur les fichiers de log
Log.addTarget(fileTarget);
</pre>
<p>A noter les trois propriétés suivantes :</p>
<ul>
<li><strong>rollingInterval</strong> : le mode de roulement par date. Vous avez le choix entre <strong>RollingFileTarget</strong>.<strong>DAY_INTERVAL</strong>, <strong>RollingFileTarget</strong>.<strong>MONTH_INTERVAL</strong>, <strong>RollingFileTarget</strong>.<strong>YEAR_INTERVAL</strong>, <strong>RollingFileTarget</strong>.<strong>NO_INTERVAL</strong><br />
Je ne traduis pas, j&#8217;imagine que vous comprenez <img src='http://www.lafabrick.com/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </li>
<li><strong>maxLogFileWeight</strong> : la taille maximale d&#8217;un fichier de log, en octets.<br />
Pour limiter la taille d&#8217;un fichier de log à 5Mo par exemple, vous pouvez indiquer maxLogFileWeight = 5000000. Une valeur à zéro désactive la rotation selon la taille du fichier.</li>
<li><strong>maxLogBackups </strong>: le nombre maximum de backups à conserver.<br />
Le principe réside en la conservation d&#8217;un nombre suffisant de logs pour retrouver les éléments importants ayant pu se passer. En général, une semaine de log suffit pour retrouver ses petits pour une application utilisée raisonnablement.</li>
</ul>
<div>Cette target a pour particularité de renommer le fichier de log courant selon le motif suivant :</div>
<div>
<ol>
<li><strong><span style="color: #008000;">AAAA-MM-JJ</span></strong><strong>-nom.log</strong> pour une rotation par date (<strong>année</strong> sur 4 chiffres, <strong>mois </strong>sur deux chiffres, <strong>jour </strong>sur deux chiffres)</li>
<li><strong>nom.log.</strong><strong><span style="color: #008000;">X</span></strong> pour une rotation par taille (X s&#8217;incrémentant de 1 à chaque rotation)</li>
</ol>
</div>
<p>A savoir que ce motif est utilisé par la target pour détecter les backups existants dans le répertoire de stockage de votre fichier de log principal et gérer ainsi proprement les backups entre deux lancements de l&#8217;application (oui, c&#8217;est rare de laisser tourner son appli pendant 2 semaines sans l&#8217;arrêter&#8230;)</p>
<p>Je n&#8217;ai donc pas préféré laisser le choix sur le motif de renommage pour éviter les problématiques pouvant évidemment en découler. En même temps, on a affaire à des fichiers de logs&#8230;</p>
<p><strong>Note importante :</strong> ces deux politiques sont combinables mais il est plus que conseillé de choisir entre un roulement sur le poids OU un roulement selon la date pour conserver des backup dans un ordre cohérent. En effet, si vous choisissez de combiner la rotation sur la taille ET sur le poids, vous aurez <em>maxLogBackups </em>fichiers de log suivant le motif <strong>AAAA-MM-JJ-nom.log</strong> et <em>maxLogBackups </em>fichiers de log suivant le motif <strong>nom.log.X</strong>.</p>
<p>J&#8217;envisage à terme que lors d&#8217;une rotation par date, l&nbsp;&raquo;ensemble des fichiers de backup par taille existants soient préfixés de la date du jour pour grouper correctement l&#8217;ensemble.</p>
<h3>Téléchargement</h3>
<p>Vous pouvez gracieusement télécharger, utiliser, modifier cette classe comme bon vous semble, La Fabrick déclinant toute responsabilité sur un quelconque dommage, problème ou perte d&#8217;information liée à son utilisation, de manière directe ou indirecte. Veillez également à respecter le copyright indiqué en entête du fichier, merci !</p>
<p><a href="http://github.com/hlabas/as3corelib/blob/master/src/com/adobe/air/logging/RollingFileTarget.as"><img class="aligncenter size-full wp-image-2281" title="Download" src="http://www.lafabrick.com/blog/wp-content/uploads/2010/10/deb.png" alt="Télécharger" width="128" height="128" /></a></p>
<p>A noter bien entendu que cette classe utilise l&#8217;API d&#8217;accès au système de fichiers de AIR et ne peut donc être utilisée qu&#8217;au sein d&#8217;application compilées avec ce runtime.</p>
<p>Bons logs&#8230;Autres articles sur le même sujet
<ul>
<li><a href="http://www.lafabrick.com/blog/2008/02/04/299-un-projet-java-flex-avec-maven-2/" rel="bookmark" title="4 février 2008">Un projet Java / Flex avec Maven 2</a></li>
<li><a href="http://www.lafabrick.com/blog/2010/08/20/2167-air-2-appeler-un-jar-executable-via-un-nativeprocess/" rel="bookmark" title="20 août 2010">AIR 2 : appeler un JAR exécutable via un NativeProcess</a></li>
<li><a href="http://www.lafabrick.com/blog/2010/02/19/1609-flashplayer-101-et-multi-toucher-caresse-moi-le-flex/" rel="bookmark" title="19 février 2010">Caresse-toi le flex : FlashPlayer 10.1 et Multi-toucher</a></li>
<li><a href="http://www.lafabrick.com/blog/2010/07/28/2092-zxpackager-application-pour-l%e2%80%99empaquetage-zxp-d%e2%80%99extensions-cs5/" rel="bookmark" title="28 juillet 2010">ZXPackager : application pour l’empaquetage ZXP d’extensions CS5</a></li>
</ul>
<p><!-- Similar Posts took 12.822 ms --></p>
]]></content:encoded>
			<wfw:commentRss>http://www.lafabrick.com/blog/2010/10/21/2272-rollingfiletarget-pour-air-2-0-lets-roll/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>AIR 2 : appeler un JAR exécutable via un NativeProcess</title>
		<link>http://www.lafabrick.com/blog/2010/08/20/2167-air-2-appeler-un-jar-executable-via-un-nativeprocess/</link>
		<comments>http://www.lafabrick.com/blog/2010/08/20/2167-air-2-appeler-un-jar-executable-via-un-nativeprocess/#comments</comments>
		<pubDate>Fri, 20 Aug 2010 00:21:08 +0000</pubDate>
		<dc:creator>Hervé</dc:creator>
				<category><![CDATA[[Dev] Flash / Flex / AIR...]]></category>
		<category><![CDATA[AIR]]></category>
		<category><![CDATA[Flex]]></category>
		<category><![CDATA[JAR]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[linkedin]]></category>
		<category><![CDATA[maven]]></category>
		<category><![CDATA[NativeProcess]]></category>

		<guid isPermaLink="false">http://www.lafabrick.com/blog/?p=2167</guid>
		<description><![CDATA[Vous avez certainement pu remarquer l&#8217;apparition attendue de la fonctionnalité d&#8217;exécution de code natif parmi les nouveautés de AIR 2.0. Les NativeProcess permettent d&#8217;étendre significativement les possibilités offertes par une application AIR. Mais, l&#8217;un des gros atouts d&#8217;Adobe AIR résidant dans sa nature multi-plateforme, il serait dommage de restreindre l&#8217;installation de votre application à un [...]]]></description>
			<content:encoded><![CDATA[<p>Vous avez certainement pu remarquer l&#8217;apparition attendue de la fonctionnalité d&#8217;exécution de code natif parmi les nouveautés de AIR 2.0. Les NativeProcess permettent d&#8217;étendre significativement les possibilités offertes par une application AIR.<br />
Mais, l&#8217;un des gros atouts d&#8217;Adobe AIR résidant dans sa nature multi-plateforme, il serait dommage de restreindre l&#8217;installation de votre application à un seul système d&#8217;exploitation&#8230; ça tombe bien, Java aussi est multi-plateforme (c&#8217;est bien l&#8217;open source) : OK du coup comment j&#8217;appelle du Java depuis mon AIR ?<br />
Explications&#8230;<br />
<span id="more-2167"></span></p>
<h2>Fonctionnement et limites d&#8217;un NativeProcess</h2>
<h3>Packaging de l&#8217;application</h3>
<p>Pour diverses raisons de sécurité, une application AIR utilisant un NativeProcess doit être packagée dans le format de la plateforme cible (exe pour Windows, dmg pour Mac, rpm / deb / &#8230; pour Linux). Fini donc dans ce cas le pratique fichier .air qui marche partout !<br />
Vous devez également indiquer dans le descripteur de l&#8217;application qu&#8217;il s&#8217;agit d&#8217;une application au profil &laquo;&nbsp;extendedDesktop&nbsp;&raquo; lui conférant donc les capacités d&#8217;exécuter un NativeProcess.<br />
Vous devez ouvrir le fichier <strong>monAppli-app.xml</strong> et modifier la balise <code>&lt;supportedProfiles&gt;</code></p>
<pre class="brush: xml">
&lt;supportedProfiles&gt;extendedDesktop&lt;/supportedProfiles&gt;
</pre>
<p>A partir de là, si vous tentez d&#8217;exporter un fichier .air, vous aurez un joli message d&#8217;erreur vous invitant à changer de profil.</p>
<h3>Considérations de sécurité</h3>
<p>Si AIR sans native process dispose de limitations de sécurité, dès lors que vous utilisez un native process, vous ouvrez la porte&#8230; Il est donc bon d&#8217;anticiper et de faire un maximum de vérifications sur vos appels pour éviter un remplacement d&#8217;un exécutable par un autre, moins sympathique, par exemple&#8230;</p>
<h2>Prêt ? On code</h2>
<h3>Paramétrage</h3>
<p>Un native process a besoin d&#8217;un contexte d&#8217;exécution. Ce contexte est défini à l&#8217;aide de l&#8217;objet <code>NativeProcessStartupInfo</code> décrivant notamment les éléments suivants :</p>
<ul>
<li><strong>workingDirectory</strong> : le répertoire d&#8217;exécution</li>
<li><strong>executableFile</strong> : l&#8217;exécutable à lancer</li>
<li><strong>arguments</strong> : la liste des arguments à passer à l&#8217;exécutable (<code>Vector.&lt;String&gt;</code> sous Flash Player 10, ou un bête <code>Array</code> sinon)</li>
</ul>
<p>Vous pourrez alors instancier un objet NativeProcess et lui passer cet objet de paramétrage avant de le lancer.</p>
<h3>Lancement &amp; suivi de l&#8217;exécution</h3>
<p>Le lancement d&#8217;un NativeProcess est asynchrone. Il propose donc un certain nombre d&#8217;événements vous permettant de suivre son exécution une fois lancé, notamment :</p>
<ul>
<li><strong>ProgressEvent.STANDARD_OUTPUT_DATA</strong> : écriture sur la sortie standard</li>
<li><strong>ProgressEvent.STANDARD_ERROR_DATA</strong> : écriture sur la sortie d&#8217;erreur</li>
<li><strong>IOErrorEvent.STANDARD_OUTPUT_IO_ERROR</strong> : déclenché lorsqu&#8217;une erreur apparaît en tentant de lire la sortie standard</li>
<li><strong>IOErrorEvent.STANDARD_ERROR_IO_ERROR</strong> : déclenché lorsqu&#8217;une erreur apparaît en tentant de lire la sortie d&#8217;erreur</li>
<li><strong>NativeProcessExitEvent.EXIT</strong> : déclenché lors que l&#8217;exécution du process est terminée</li>
</ul>
<h3>Lecture de l&#8217;entrée / sortie standard</h3>
<p>Bien que tout à fait possible, la lecture de la sortie standard ou d&#8217;erreur via le listener <code>ProgressEvent.STANDARD_OUTPUT_DATA</code> ou <code>ProgressEvent.STANDARD_ERROR_DATA</code> n&#8217;est pas fiable à 100% concernant le contenu retourné : la sortie étant &laquo;&nbsp;bufferisée&nbsp;&raquo;, vous n&#8217;aurez donc pas systématiquement le même résultat selon la machine exécutant le programme, à chaque appel de votre listener&#8230; N&#8217;utilisez donc la lecture de sortie standard que pour afficher ce qui se passe, ou à la limite récupérer la totalité du contenu écrit une fois le process terminé&#8230;</p>
<h2>Appeler un JAR</h2>
<h3>Rappels</h3>
<p>Pour appeler un JAR en Java, il doit être exécutable (bah oui&#8230;), et appelé en ligne de commande de la manière suivante :<br />
<code><br />
java -jar monJar.jar [-cp jars du classpath]<br />
</code><br />
Nous sommes dans une appli AIR, donc évitons de surcharger la commande à appeler avec un classpath, aussi je vous suggère d&#8217;utiliser les fonctionnalités d&#8217;export complets d&#8217;un JAR (si les licences associées vous l&#8217;autorisent) intégrant au final l&#8217;ensemble des sources dans un groooos JAR contenant tout ce qu&#8217;il lui faut pour fonctionner.<br />
<strong>Notes :</strong></p>
<ul>
<li>Les utilisateurs de Maven peuvent utiliser <a title="Plugin maven assembly et configuration associée" href="http://stackoverflow.com/questions/574594/how-can-i-create-an-executable-jar-with-dependencies-using-maven">le plugin qui va bien pour ça</a>.</li>
<li>L&#8217;export eclipse, c&#8217;est pas mal non plus, il suffit de cocher la &laquo;&nbsp;case qui va bien&nbsp;&raquo; au moment d&#8217;exporter</li>
</ul>
<h3>Depuis un NativeProcess</h3>
<p>On voit mieux ce qui se dessine:</p>
<ol>
<li>Définir l&#8217;exécutable java dans vos &laquo;&nbsp;startup infos&nbsp;&raquo;</li>
<li>Définir les arguments
<ul>
<li>-jar</li>
<li>/chemin/vers/monJar.jar</li>
</ul>
</li>
<li>Ajouter les listeners permettant de savoir lorsque l&#8217;exécution est terminée</li>
<li>Lancer le native process</li>
</ol>
<h3>Restons multi plateforme</h3>
<p>Java est multi plateforme, oui, mais l&#8217;exécutable dépend de la plateforme, aussi il vous faudra récupérer le chemin vers votre JAVA_HOME (contenant le répertoire bin avec l&#8217;exécutable Java).<br />
Vous avez donc deux solutions maintenant:</p>
<ol>
<li><strong>La plus simple</strong> (pour le développeur) : demander à votre gentil utilisateur où est son JAVA_HOME. Ça peut le faire si c&#8217;est un geek velu qui a compris qu&#8217;on ne parlait pas de venir danser chez lui (aïe, elle est rude celle-ci)</li>
<li><strong>La plus compliquée</strong> (mais pratique pour l&#8217;utilisateur) : utiliser un autre exécutable (voire NativeProcess) qui remonte cette information ou permette de pointer directement sur l&#8217;exécutable en question</li>
</ol>
<p>La seconde solution bien que séduisante est un peu plus longue à implémenter.<br />
Pour les développeurs sous Windows, j&#8217;ai noté l&#8217;utilisation par <a href="www.webkitchen.be">Serge Jespers</a> d&#8217;un petit (mais pratique) exécutable &laquo;&nbsp;jexe.exe&nbsp;&raquo; lançant le java.exe présent dans le %JAVA_HOME%\bin de la machine. L&#8217;utiliser vous évitera la première solution, sans vous lancer dans un développement spécifiquement dédié à cela (merci Serge). En revanche, si votre application est diffusée à un public d&#8217;utilisateurs non avertis, ils sont tout à fait susceptibles de ne pas avoir de variable JAVA_HOME définie sur leur machine : pensez donc à déterminer précisément votre cible avant de choisir une solution.</p>
<p>J&#8217;ai également noté en relisant un extrait de la licence du JRE que la redistribution est autorisée sous certaines conditions. Si vous les remplissez, vous pourriez carrément embarquer le runtime java dans votre application AIR, au risque de la faire gonfler en taille&#8230;</p>
<h2>Un exemple ! Un exemple !</h2>
<p>Voici un petit exemple de code permettant de lancer un JAR exécutable depuis une application AIR :</p>
<pre class="brush: java">
package com.lafabrick.nativeprocess
{
import flash.desktop.NativeProcess;
import flash.desktop.NativeProcessStartupInfo;
import flash.events.EventDispatcher;
import flash.events.NativeProcessExitEvent;
import flash.events.ProgressEvent;
import flash.filesystem.File;
import flash.system.Capabilities;

public class JarExec
{
protected var _process:NativeProcess;

public function JarExec()
{
}

public function getDefaultJavaExecutable():File
{
if (Capabilities.os.toLowerCase().indexOf(&quot;win&quot;) &gt; -1)
{
return File.applicationDirectory.resolvePath(&quot;native/jexe.exe&quot;);
}
if (Capabilities.os.toLowerCase().indexOf(&quot;mac&quot;) &gt; -1)
{
// TODO: Changer avec un paramètre de configuration
return new File(&quot;/System/Library/Frameworks/JavaVM.framework/Commands/java&quot;);
}
throw new Error(&quot;Système non pris en charge&quot;);
return null;
}

public function testJava(executablePath:String = null):void
{
// Tester le lancement de l&#039;exécutable &#039;java&#039;
try
{
var nativeProcessStartupInfo:NativeProcessStartupInfo = new NativeProcessStartupInfo();
nativeProcessStartupInfo.workingDirectory = File.applicationDirectory;
nativeProcessStartupInfo.executable = (executablePath == null ? getDefaultJavaExecutable() : new File(executablePath));

var args:Vector.&lt;String&gt; = new Vector.&lt;String&gt;();
args.push(&quot;-version&quot;);
nativeProcessStartupInfo.arguments = args;

_process = new NativeProcess();
_process.addEventListener(NativeProcessExitEvent.EXIT, onJavaTestExit);
_process.addEventListener(ProgressEvent.STANDARD_OUTPUT_DATA, onStandardOut);
_process.addEventListener(ProgressEvent.STANDARD_ERROR_DATA, onErrorOut);
_process.start(nativeProcessStartupInfo);

trace(&quot;-- Début d&#039;exécution&quot;);
}
catch (e:Error)
{
trace(&quot;Impossible de lancer le process\n&quot; + e.message + &quot;\n&quot; + e.getStackTrace());
}
}
protected function onStandardOut(e:ProgressEvent):void
{
trace(&quot;STDOUT: &quot; + _process.standardOutput.readUTFBytes(_process.standardOutput.bytesAvailable));
}
protected function onErrorOut(e:ProgressEvent):void
{
trace(&quot;STDERR: &quot; + _process.standardError.readUTFBytes(_process.standardError.bytesAvailable));
}
protected function onJavaTestExit(e:NativeProcessExitEvent):void
{
trace(&quot;-- Fin d&#039;exécution&quot;);
}
}
}
</pre>
<p>Cet extrait donne un aperçu, mais vous pouvez vous lancer (soyons fous) à installer le package suivant :</p>
<table style="text-align: center;">
<tbody>
<tr>
<td><a href="http://www.lafabrick.com/labz/nativeprocess/NativeJarExec.dmg"><img title="Mac" src="http://www.lafabrick.com/blog/wp-content/uploads/2010/07/mac.gif" alt="" width="50" height="50" /><br />
Pour Mac</a></td>
<td><a href="http://www.lafabrick.com/labz/nativeprocess/NativeJarExec.exe"><img title="Windows" src="http://www.lafabrick.com/blog/wp-content/uploads/2010/07/windows.jpeg" alt="" width="50" height="50" /><br />
Pour Windows</a></td>
</tr>
</tbody>
</table>
<p>Pensez au clic droit &gt; View Source&#8230;</p>
<h2>Packager l&#8217;application</h2>
<p>Comme je le disais au début de ce post, il est nécessaire de packager votre application dans le format natif du système d&#8217;exploitation visé. Vous avez deux solutions pour cela :</p>
<ol>
<li>Passer par la dernière version de Flash Builder 4 qui propose cette fonctionnalité</li>
<li>Utiliser l&#8217;application <a href="http://www.webkitchen.be/package-assistant-pro/">PackageAssistantPro</a> proposée par <a href="http://www.webkitchen.be">Serge Jespers</a> (re merci Serge)</li>
</ol>
<p>Il s&#8217;agit d&#8217;une application AIR utilisant des NativeProcess (et packagée en ligne de commande vu que l&#8217;application n&#8217;existait pas avant&#8230; Remarquez, la version 2 et plus ont probablement été packagées avec la version 1&#8230; Mais je m&#8217;égare)</p>
<h2>Quelques liens</h2>
<ul>
<li>Un petit exemple d&#8217;application utilisant un NativeProcess : <a href="http://www.lafabrick.com/blog/2010/07/28/2092-zxpackager-application-pour-l%e2%80%99empaquetage-zxp-d%e2%80%99extensions-cs5/">ZXPackager</a></li>
<li><a lang="en_US" href="http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/desktop/NativeProcess.html">ASDoc de la classe NativeProcess [EN]</a></li>
<li><a lang="en_US" href="http://www.adobe.com/devnet/air/flex/quickstart/interacting_with_native_process.html">Un bon article pour démarrer [EN]</a></li>
</ul>
<p>Autres articles sur le même sujet
<ul>
<li><a href="http://www.lafabrick.com/blog/2008/02/04/299-un-projet-java-flex-avec-maven-2/" rel="bookmark" title="4 février 2008">Un projet Java / Flex avec Maven 2</a></li>
<li><a href="http://www.lafabrick.com/blog/2010/04/06/1754-arduino-2-flash-socket-et-processing/" rel="bookmark" title="6 avril 2010">Arduino #2 : Flash, socket et Processing</a></li>
<li><a href="http://www.lafabrick.com/blog/2010/07/28/2092-zxpackager-application-pour-l%e2%80%99empaquetage-zxp-d%e2%80%99extensions-cs5/" rel="bookmark" title="28 juillet 2010">ZXPackager : application pour l’empaquetage ZXP d’extensions CS5</a></li>
<li><a href="http://www.lafabrick.com/blog/2010/10/21/2272-rollingfiletarget-pour-air-2-0-lets-roll/" rel="bookmark" title="21 octobre 2010">RollingFileTarget pour AIR 2.0 : let&#8217;s roll !</a></li>
</ul>
<p><!-- Similar Posts took 13.120 ms --></p>
]]></content:encoded>
			<wfw:commentRss>http://www.lafabrick.com/blog/2010/08/20/2167-air-2-appeler-un-jar-executable-via-un-nativeprocess/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Primitive DashedLine : une petite ligne bien utile</title>
		<link>http://www.lafabrick.com/blog/2010/07/23/1989-primitive-dashedline-une-petite-ligne-bien-utile/</link>
		<comments>http://www.lafabrick.com/blog/2010/07/23/1989-primitive-dashedline-une-petite-ligne-bien-utile/#comments</comments>
		<pubDate>Fri, 23 Jul 2010 09:07:22 +0000</pubDate>
		<dc:creator>Fabien</dc:creator>
				<category><![CDATA[Nos projets]]></category>
		<category><![CDATA[[Dev] Flash / Flex / AIR...]]></category>
		<category><![CDATA[flex4]]></category>
		<category><![CDATA[primitives]]></category>
		<category><![CDATA[Spark]]></category>
		<category><![CDATA[uigfx]]></category>

		<guid isPermaLink="false">http://www.lafabrick.com/blog/?p=1989</guid>
		<description><![CDATA[Je viens de rajouter une petite primitive bien utile dans la librairie UIGFX : DashedLine, qui, comme son nom l&#8217;indique (ou pas), permet d&#8217;avoir une ligne pointillée. Basé sur Line, cette primitive propose une propriété dashes, qui vous permet de paramètrer l&#8217;apparence des pointillées. dashes contient un tableau (Array) de nombres. Les emplacements impaires du [...]]]></description>
			<content:encoded><![CDATA[<p><center><img src="http://www.lafabrick.com/blog/wp-content/uploads/2010/07/dashedLine530.png" alt="" title="dashedLine530" width="532" height="59" class="aligncenter size-full wp-image-1997" /></center><br />
Je viens de rajouter une petite primitive bien utile dans <a href="http://uigfx.googlecode.com">la librairie UIGFX</a> : <a href="http://code.google.com/p/uigfx/source/browse/trunk/uigfx/src/com/lafabrick/uigfx/primitives/DashedLine.as">DashedLine</a>, qui, comme son nom l&#8217;indique (ou pas), permet d&#8217;avoir une ligne pointillée.<br />
<span id="more-1989"></span><br />
Basé sur <b>Line</b>, cette primitive propose une propriété dashes, qui vous permet de paramètrer l&#8217;apparence des pointillées.</p>
<p>dashes contient un tableau (Array) de nombres. Les emplacements impaires du tableau définissent la taille (en pixel) des tirets. Les emplacements pair définissent la taille des espacement.</p>
<p>Dans le code : </p>
<pre class="brush: xml">
&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt;
&lt;s:Application xmlns:fx=&quot;http://ns.adobe.com/mxml/2009&quot;
    xmlns:s=&quot;library://ns.adobe.com/flex/spark&quot;
    xmlns:mx=&quot;library://ns.adobe.com/flex/mx&quot;
    minWidth=&quot;200&quot; minHeight=&quot;200&quot;
    xmlns:uigfx=&quot;http://uigfx.lafabrick.com&quot;&gt;

    &lt;uigfx:DashedLine
        dashes=&quot;[80, 10, 10, 20, 40, 30]&quot;
        left=&quot;100&quot; verticalCenter=&quot;0&quot; right=&quot;100&quot;&gt;

        &lt;uigfx:stroke&gt;
            &lt;s:SolidColorStroke color=&quot;#FFFFFF&quot; weight=&quot;4&quot; caps=&quot;round&quot; /&gt;
        &lt;/uigfx:stroke&gt;

        &lt;uigfx:filters&gt;
            &lt;s:GlowFilter blurX=&quot;4&quot; blurY=&quot;4&quot; alpha=&quot;.8&quot; color=&quot;#333333&quot; /&gt;
        &lt;/uigfx:filters&gt;

    &lt;/uigfx:DashedLine&gt;

    &lt;uigfx:DashedLine
        dashes=&quot;[80, 10, 10, 20, 40, 30]&quot;
        left=&quot;101&quot; verticalCenter=&quot;0&quot; right=&quot;100&quot;&gt;

        &lt;uigfx:stroke&gt;
            &lt;s:LinearGradientStroke weight=&quot;2&quot; pixelHinting=&quot;true&quot; caps=&quot;square&quot;&gt;
                &lt;s:GradientEntry color=&quot;#009EE0&quot; /&gt;
                &lt;s:GradientEntry color=&quot;#FF9900&quot; /&gt;
                &lt;s:GradientEntry color=&quot;#009EE0&quot; /&gt;
            &lt;/s:LinearGradientStroke&gt;
        &lt;/uigfx:stroke&gt;

    &lt;/uigfx:DashedLine&gt;

&lt;/s:Application&gt;
</pre>
<p>Résultat :<br />
<center><img src="http://www.lafabrick.com/blog/wp-content/uploads/2010/07/dashedLine650.png" alt="" title="dashedLine630" width="650" height="54" class="aligncenter size-full wp-image-1998" /></center><br />
C&#8217;est beau!!</p>
<p>Disponible bien entendu sur <a href="http://uigfx.googlecode.com">le google code UIGFX</a>.<br />
Autres articles sur le même sujet
<ul>
<li><a href="http://www.lafabrick.com/blog/2010/02/09/1964-uigfx-project-flex4-primitives-library-fireworks-extension/" rel="bookmark" title="9 février 2010">uigfx project : Flex4 primitives library / Fireworks extension</a></li>
<li><a href="http://www.lafabrick.com/blog/2010/07/14/1920-flex-4-layouts-viewstack-pure-spark/" rel="bookmark" title="14 juillet 2010">Flex 4 et les layouts &#8211; Faire une ViewStack &laquo;&nbsp;pure&nbsp;&raquo; Spark</a></li>
<li><a href="http://www.lafabrick.com/blog/2010/05/04/1962-uigfx-practice-a-circularslider-component-2/" rel="bookmark" title="4 mai 2010">UIGFX practice : a CircularSlider component</a></li>
<li><a href="http://www.lafabrick.com/blog/2010/03/05/1675-proches-de-lohio-les-etats-esthetes-de-flex4/" rel="bookmark" title="5 mars 2010">Proches de l&#8217;Ohio??? Les états esthètes de Flex4</a></li>
</ul>
<p><!-- Similar Posts took 12.433 ms --></p>
]]></content:encoded>
			<wfw:commentRss>http://www.lafabrick.com/blog/2010/07/23/1989-primitive-dashedline-une-petite-ligne-bien-utile/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Flex 4 et les layouts &#8211; Faire une ViewStack &#171;&#160;pure&#160;&#187; Spark</title>
		<link>http://www.lafabrick.com/blog/2010/07/14/1920-flex-4-layouts-viewstack-pure-spark/</link>
		<comments>http://www.lafabrick.com/blog/2010/07/14/1920-flex-4-layouts-viewstack-pure-spark/#comments</comments>
		<pubDate>Wed, 14 Jul 2010 16:06:03 +0000</pubDate>
		<dc:creator>Hervé</dc:creator>
				<category><![CDATA[[Dev] Flash / Flex / AIR...]]></category>
		<category><![CDATA[architecture]]></category>
		<category><![CDATA[AS3]]></category>
		<category><![CDATA[Flex]]></category>
		<category><![CDATA[flex4]]></category>
		<category><![CDATA[MVC]]></category>
		<category><![CDATA[Spark]]></category>
		<category><![CDATA[UI Design]]></category>

		<guid isPermaLink="false">http://www.lafabrick.com/blog/?p=1920</guid>
		<description><![CDATA[Pour ceux d&#8217;entre vous qui ont eu la chance de passer à Flex 4, vous avez peut-être la même tendance que moi à chercher à éviter le préfixe &#60;mx:&#62; dans vos skins&#8230; Spark, quand tu nous tiens&#8230; Quoi qu&#8217;il en soit, certains types de composants n&#8217;ont pas été réécris pour Spark. Pourquoi ? Parce l&#8217;architecture [...]]]></description>
			<content:encoded><![CDATA[<p><img class="aligncenter size-medium wp-image-1930" title="layouts" src="http://www.lafabrick.com/blog/wp-content/uploads/2010/07/layouts-300x155.png" alt="layouts" width="300" height="155" /><br />
Pour ceux d&#8217;entre vous qui ont eu la chance de passer à Flex 4, vous avez peut-être la même tendance que moi à chercher à éviter le préfixe &lt;mx:&gt; dans vos skins&#8230; Spark, quand tu nous tiens&#8230; Quoi qu&#8217;il en soit, certains types de composants n&#8217;ont pas été réécris pour Spark. Pourquoi ? Parce l&#8217;architecture Spark propose quelque chose de top : les layouts. Et les layouts, c&#8217;est vaaaachement bien.</p>
<p>Explication&#8230;<br />
<span id="more-1920"></span></p>
<h2>Layouts</h2>
<p>Sans faire un article complet sur les layout (ce qui serait tout à fait possible et intéressant), on peut tout de même rappeler que le Flex 4 se distingue de Flex 3 via Spark par une volonté de mieux séparer le fond de la forme, il amène donc une notion de layout pour, comme son nom le suggère, organiser les composants d&#8217;un conteneur (par exemple un &lt;s:Group&gt;).<br />
Exit donc la <em>VBox</em> ou la <em>HBox</em> (même si le VGroup ou le HGroup permettent de faire une transition en douceur), et bienvenue au <strong>Group</strong> avec layout :</p>
<pre class="brush: xml">
&lt;mx:VBox&gt;
&lt;/mx:VBox&gt;
</pre>
<p>devient donc</p>
<pre class="brush: xml">
&lt;s:Group&gt;
&lt;s:layout&gt;
&lt;s:VerticalLayout /&gt;
&lt;/s:layout&gt;
&lt;/s:Group&gt;
</pre>
<p>Au premier abord on dit : c&#8217;est plus verbeux ! Oui mais&#8230; le layout a cette particularité, en tant que propriété du composant, d&#8217;être modifiable à la volée, contrairement à un composant imposant sa mise en forme. Concrètement, là où la <em>VBox</em> présentera toujours ses enfants verticalement (c&#8217;est son nom !), le <em>Group</em> pourra changer à volonté de layout, donc très facilement passer de <em>HorizontalLayout</em> à <em>VerticalLayout</em> par exemple&#8230; On comprend encore mieux l&#8217;intérêt quand on se met à écrire son propre layout pour faire des choses un peu plus poussées visuellement !</p>
<h2>Créer son layout</h2>
<p>Pour créer un layout, il faut étendre la classe LayoutBase et surcharger a minima la méthode updateDisplayList() et certainement la méthode measure(). Ces méthodes gardent le même rôle qu&#8217;en Flex 3, mais avec l&#8217;adaptation contextuelle au Layout :</p>
<ul>
<li>updateDisplayList : dispose les enfants du conteneur et définit leur taille</li>
<li>measure : donne la taille globale du conteneur</li>
</ul>
<p>Vous pouvez accéder à la propriété &laquo;&nbsp;target&nbsp;&raquo; du layout qui correspond au conteneur auquel est appliqué le layout et travailler sur les enfant via les méthodes getElementAt() ou getVirtualElementAt(). La seconde méthode sert dans le cas où le layout est dit &laquo;&nbsp;virtualisé&nbsp;&raquo;.</p>
<h3>Apparté : virtualisation de layout</h3>
<p>Flex 4 permet, pour des raison de performance, d&#8217;utiliser un layout en mode &laquo;&nbsp;virtualisé&nbsp;&raquo;, c&#8217;est-à-dire ne calculant la disposition des seuls enfants à afficher et non l&#8217;ensemble des enfants. Ce mode de fonctionnement s&#8217;applique particulièrement bien aux composants comprenant une liste de beaucoup d&#8217;enfants, mais ne calculant l&#8217;affichage d&#8217;une poignée à la fois, le reste attendant un scroll ou une action similaire pour être éventuellement affiché.</p>
<h2>Application : création d&#8217;un ViewStackLayout</h2>
<p>Avec les layouts en tête, il est inutile de demander pourquoi le composant ViewStack n&#8217;existe pas dans Spark : il devrait en pratique être un layout applicable à n&#8217;importe quel conteneur ! Même si le <a lang="en" href="http://opensource.adobe.com/wiki/display/flexsdk/Spark+Virtualization">très bon article sur la virtualisation</a> mentionne un prometteur je cite &laquo;&nbsp;(Planned) StackLayout&nbsp;&raquo;, rien ne nous empêche d&#8217;en faire un simple, adapté à l&#8217;architecture Spark, plutôt que d&#8217;attendre (oui on est impatients à la fabrick).</p>
<p>Voici un exemple simple :</p>
<pre class="brush: js">
	import mx.core.IVisualElement;
	import spark.layouts.supportClasses.LayoutBase;

	public class ViewStackLayout extends LayoutBase {
		public function ViewStackLayout() {
			super();
		}

		protected var _index:uint;

		public function get index():Number {
			return _index;
		}

		public function set index(value:Number):void {
			if (_index != value &amp;&amp; target != null &amp;&amp; value &gt;= 0 &amp;&amp; value &lt; target.numElements) {
				_index = value;
				target.invalidateSize();
				target.invalidateDisplayList();
			}
		}

		override public function updateDisplayList(width:Number, height:Number):void {
			var element:IVisualElement = useVirtualLayout ? target.getVirtualElementAt(index) : target.getElementAt(index);

			if (element) {
				element.setLayoutBoundsSize(element.getPreferredBoundsWidth(), element.getPreferredBoundsHeight());
				target.setActualSize(element.getPreferredBoundsWidth(), element.getPreferredBoundsHeight());
				target.setContentSize(element.getPreferredBoundsWidth(), element.getPreferredBoundsHeight());
			}
		}

		override public function measure():void {
			var count:int = target.numElements;

			for (var i:uint = 0; i &lt; count; i++) {
				var element:IVisualElement = useVirtualLayout ? target.getVirtualElementAt(i) : target.getElementAt(i);

				if (i == index) {
					element.visible = true;
					element.includeInLayout = true;
					target.measuredWidth = element.getPreferredBoundsWidth();
					target.measuredHeight = element.getPreferredBoundsHeight();
				} else {
					element.visible = false;
					element.includeInLayout = false;
				}
			}
		}
	}
</pre>
<p>Vous noterez ici l&#8217;usage du getVirtualElementAt, en prévision de la gestion de la virtualisation.<br />
Vous pouvez donc utiliser ce layout dans un DataGroup &laquo;&nbsp;piloté&nbsp;&raquo; par une tabbar par exemple comme ceci :</p>
<pre class="brush: xml">
&lt;s:TabBar id=&quot;tabEditors&quot; /&gt;
&lt;s:DataGroup id=&quot;editors&quot;&gt;
&lt;s:layout&gt;
&lt;mylayouts:ViewStackLayout index=&quot;{tabEditors.selectedIndex}&quot; /&gt;
&lt;/s:layout&gt;
&lt;!-- Enfants... --&gt;
&lt;/s:DataGroup&gt;
</pre>
<p>De cette façon, le jour où vous voudrez présenter ces éléments sous forme de CoverFlow, en mode TimeMachine&#8230; vous n&#8217;aurez pas à modifier le code de votre composant, mais uniquement votre skin.</p>
<p>Alors, on n&#8217;est pas mieux habillé en Spark ?Autres articles sur le même sujet
<ul>
<li><a href="http://www.lafabrick.com/blog/2009/01/13/786-reflex-1-une-micro-architecture-pour-flex-simple/" rel="bookmark" title="13 janvier 2009">Reflex #1: une micro-architecture pour Flex&#8230; simple !</a></li>
<li><a href="http://www.lafabrick.com/blog/2009/11/27/1373-flex4-custom-component-skinnig/" rel="bookmark" title="27 novembre 2009">Flex4 : composant personnalisé et skinning</a></li>
<li><a href="http://www.lafabrick.com/blog/2010/05/04/1962-uigfx-practice-a-circularslider-component-2/" rel="bookmark" title="4 mai 2010">UIGFX practice : a CircularSlider component</a></li>
<li><a href="http://www.lafabrick.com/blog/2010/03/05/1675-proches-de-lohio-les-etats-esthetes-de-flex4/" rel="bookmark" title="5 mars 2010">Proches de l&#8217;Ohio??? Les états esthètes de Flex4</a></li>
</ul>
<p><!-- Similar Posts took 12.573 ms --></p>
]]></content:encoded>
			<wfw:commentRss>http://www.lafabrick.com/blog/2010/07/14/1920-flex-4-layouts-viewstack-pure-spark/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>UIGFX practice : a CircularSlider component</title>
		<link>http://www.lafabrick.com/blog/2010/05/04/1962-uigfx-practice-a-circularslider-component-2/</link>
		<comments>http://www.lafabrick.com/blog/2010/05/04/1962-uigfx-practice-a-circularslider-component-2/#comments</comments>
		<pubDate>Tue, 04 May 2010 21:18:39 +0000</pubDate>
		<dc:creator>Fabien</dc:creator>
				<category><![CDATA[Nos projets]]></category>
		<category><![CDATA[[Dev] Flash / Flex / AIR...]]></category>
		<category><![CDATA[component]]></category>
		<category><![CDATA[FlashBuilder]]></category>
		<category><![CDATA[Flex]]></category>
		<category><![CDATA[flex4]]></category>
		<category><![CDATA[Spark]]></category>
		<category><![CDATA[uigfx]]></category>

		<guid isPermaLink="false">http://www.lafabrick.com/blog/?p=1962</guid>
		<description><![CDATA[If you were luck enough to use a multitouch application, did you ever have the idea that it would be interesting to use some circular interface components? As interface space management is easier to achieve on large multitouch tables, I had the idea to develop a CircularSlider component, using my primitive UIGFX library, including the [...]]]></description>
			<content:encoded><![CDATA[<p>If you were luck enough to use a multitouch application, did you ever have the idea that it would be interesting to use some circular interface components?<br />
As interface space management is easier to achieve on large multitouch tables, I had the idea to develop a CircularSlider component, using my primitive <a href="http://code.google.com/p/uigfx/">UIGFX library</a>, including the <a href="http://code.google.com/p/uigfx/source/browse/trunk/uigfx/src/com/lafabrick/uigfx/primitives/Pie.as">Pie primitive</a>.<br />
Let see how it works&#8230;<br />
<span id="more-1962"></span><br />
<H2>The component</H2></p>
<h3>PieButton</h3>
<p>I needed a button with 2 properties <code>startAngle</code> and <code>angle</code>, to be able to transmit these values to the skin: </p>
<pre class="brush: js">
package com.lafabrick.components
{
    import spark.components.Button;

    public class PieButton extends Button
    {
        public function PieButton()
        {
            super();
        }

        private var _angle : Number;
        private var _startAngle : Number;

        public function get angle():Number
        {
            return _angle;
        }
        [Bindable]public function set angle(value:Number):void
        {
            _angle = value;
            invalidateDisplayList();
        }

        public function get startAngle():Number
        {
            return _startAngle;
        }
        [Bindable]public function set startAngle(value:Number):void
        {
            _startAngle = value;
            invalidateDisplayList();
        }

    }
}
</pre>
<h3>CircularSlider</h3>
<p>This component could not extend directly SliderBase or TrackBase because the SkinPart thumb and track, as Button, are extending the TrackBase class.<br />
I thus used the Range class, inserted the Slider architecture, and added specific geometric codes.<br />
<a href="http://fabien.lafabrick.com/labs/components/circularslider/srcview/source/fxComponentKit/src/com/lafabrick/components/CircularSlider.as.html">Check the component&#8217;s source code</a></p>
<h2>Skin implementation</h2>
<p>The design of the Skin is similar to a skin Slider standard, except that it uses a PieButton instead of a Button: </p>
<pre class="brush: xml">
&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt;
&lt;s:SparkSkin xmlns:fx=&quot;http://ns.adobe.com/mxml/2009&quot;
        xmlns:s=&quot;library://ns.adobe.com/flex/spark&quot;
        xmlns:mx=&quot;library://ns.adobe.com/flex/mx&quot;
        width=&quot;100%&quot; height=&quot;100%&quot;
        xmlns:components=&quot;com.lafabrick.components.*&quot;
        &gt;
    &lt;!-- host component --&gt;
    &lt;fx:Metadata&gt;
        [HostComponent(&quot;com.lafabrick.components.CircularSlider&quot;)]
    &lt;/fx:Metadata&gt;

    &lt;!-- states --&gt;
    &lt;s:states&gt;
        &lt;s:State name=&quot;normal&quot; /&gt;
        &lt;s:State name=&quot;disabled&quot; /&gt;
        &lt;s:State name=&quot;inactive&quot; /&gt;
    &lt;/s:states&gt;

    &lt;!-- SkinParts
    name=track, type=com.lafabrick.uigfx.components.CircularButton
    name=thumb, type=com.lafabrick.uigfx.components.CircularButton
    --&gt;

    &lt;components:PieButton
        id=&quot;track&quot;
        width=&quot;100%&quot; height=&quot;100%&quot;
        top=&quot;0&quot; bottom=&quot;0&quot; left=&quot;0&quot; right=&quot;0&quot;
        skinClass=&quot;skins.CircularTrackButtonSkin&quot;/&gt;

    &lt;components:PieButton
        id=&quot;thumb&quot;
        angle=&quot;20&quot;
        width=&quot;100%&quot; height=&quot;100%&quot;
        top=&quot;0&quot; bottom=&quot;0&quot; left=&quot;0&quot; right=&quot;0&quot;
        skinClass=&quot;skins.CircularThumbButtonSkin&quot;/&gt;

&lt;/s:SparkSkin&gt;
</pre>
<p>Under &laquo;&nbsp;thumb&nbsp;&raquo; and &laquo;&nbsp;track&nbsp;&raquo; Skin, the angular values are a mapped with the PieButton HostComponent. StartAngle and angle properties of the Pie primitive are directly extended from the host component.<br />
Here follows a sample with Track Skin:</p>
<pre class="brush: xml">
&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt;
&lt;s:SparkSkin xmlns:fx=&quot;http://ns.adobe.com/mxml/2009&quot;
             xmlns:s=&quot;library://ns.adobe.com/flex/spark&quot; 

             minWidth=&quot;21&quot; minHeight=&quot;21&quot;
             alpha.disabled=&quot;0.5&quot;
             xmlns:uigfx=&quot;http://uigfx.lafabrick.com&quot;
             xmlns:primitives=&quot;com.lafabrick.uigfx.primitives.*&quot;&gt;

    &lt;fx:Metadata&gt;
        [HostComponent(&quot;com.lafabrick.components.PieButton&quot;)]
    &lt;/fx:Metadata&gt;

    &lt;s:states&gt;
        &lt;s:State name=&quot;up&quot; /&gt;
        &lt;s:State name=&quot;over&quot; /&gt;
        &lt;s:State name=&quot;down&quot; /&gt;
        &lt;s:State name=&quot;disabled&quot; /&gt;
    &lt;/s:states&gt;

    &lt;primitives:Pie
        top=&quot;0&quot; bottom=&quot;0&quot; left=&quot;0&quot; right=&quot;0&quot;
        gap=&quot;2&quot;
        innerOffset=&quot;-2&quot;
        offset=&quot;-2&quot;

        innerRadius=&quot;0.7&quot;
        angle=&quot;{hostComponent.angle}&quot;
        startAngle=&quot;{hostComponent.startAngle}&quot;
        &gt;

        &lt;primitives:fill&gt;
            &lt;s:RadialGradient&gt;
                &lt;s:GradientEntry color=&quot;#006699&quot; /&gt;
                &lt;s:GradientEntry color=&quot;#009EE0&quot; /&gt;
            &lt;/s:RadialGradient&gt;
        &lt;/primitives:fill&gt;

        &lt;primitives:filters&gt;
            &lt;s:GlowFilter inner=&quot;true&quot; color=&quot;#000000&quot;
                blurX=&quot;10&quot; blurY=&quot;10&quot; alpha=&quot;0.4&quot; /&gt;
        &lt;/primitives:filters&gt;

    &lt;/primitives:Pie&gt;

&lt;/s:SparkSkin&gt;
</pre>
<p><H2>Result</H2><br />
Let see:<br />
<object type="application/x-shockwave-flash" data="http://fabien.lafabrick.com/labs/components/circularslider/circularSlider.swf" width="640" height="500"><param name="movie" value="http://fabien.lafabrick.com/labs/components/circularslider/circularSlider.swf" /><param name="bgcolor" value="#ffffff" /><param name="allowScriptAccess" value="sameDomain" /><param name="allowFullScreen" value="true" /></object><br />
Nice huh?</p>
<p>You can check these for more info: <a href="http://fabien.lafabrick.com/labs/components/circularslider/">Link</a>, and <a href="http://fabien.lafabrick.com/labs/components/circularslider/srcview/index.html">source code</a>.</p>
<p>PS: Thanks to Hervé for review and corrections!Autres articles sur le même sujet
<ul>
<li><a href="http://www.lafabrick.com/blog/2009/11/27/1373-flex4-custom-component-skinnig/" rel="bookmark" title="27 novembre 2009">Flex4 : composant personnalisé et skinning</a></li>
<li><a href="http://www.lafabrick.com/blog/2010/02/09/1964-uigfx-project-flex4-primitives-library-fireworks-extension/" rel="bookmark" title="9 février 2010">uigfx project : Flex4 primitives library / Fireworks extension</a></li>
<li><a href="http://www.lafabrick.com/blog/2010/07/14/1920-flex-4-layouts-viewstack-pure-spark/" rel="bookmark" title="14 juillet 2010">Flex 4 et les layouts &#8211; Faire une ViewStack &laquo;&nbsp;pure&nbsp;&raquo; Spark</a></li>
<li><a href="http://www.lafabrick.com/blog/2010/07/23/1989-primitive-dashedline-une-petite-ligne-bien-utile/" rel="bookmark" title="23 juillet 2010">Primitive DashedLine : une petite ligne bien utile</a></li>
</ul>
<p><!-- Similar Posts took 12.851 ms --></p>
]]></content:encoded>
			<wfw:commentRss>http://www.lafabrick.com/blog/2010/05/04/1962-uigfx-practice-a-circularslider-component-2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

