<?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; La Fabrick</title>
	<atom:link href="http://www.lafabrick.com/blog/category/general/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>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 21.026 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>(Re) naissance</title>
		<link>http://www.lafabrick.com/blog/2011/02/17/2404-re-naissance/</link>
		<comments>http://www.lafabrick.com/blog/2011/02/17/2404-re-naissance/#comments</comments>
		<pubDate>Thu, 17 Feb 2011 16:53:10 +0000</pubDate>
		<dc:creator>La Fabrick</dc:creator>
				<category><![CDATA[La Fabrick]]></category>

		<guid isPermaLink="false">http://www.lafabrick.com/blog/?p=2404</guid>
		<description><![CDATA[Nous avons le plaisir de vous annoncer que la Fabrick SARL est née aujourd&#8217;hui 17 février 2011, à 15 heures ! L&#8217;accouchement s&#8217;est bien passé, et les 3 papas sont en pleine forme. Autres articles sur le même sujet Les blogs c&#8217;est bien!&#8230; mais y a mieux !!! Virtual Cabinet, flash et interfaces riches pour [...]]]></description>
			<content:encoded><![CDATA[<table width="100%">
<tbody>
<tr>
<td width="150px"><img src="http://www.lafabrick.com/blog/wp-content/uploads/2011/02/logoFbk.png" alt="" title="logoFbk" height="152" class="aligncenter size-full wp-image-2412" /></td>
<td width="100%">Nous avons le plaisir de vous annoncer que <b>la Fabrick SARL</b> est née aujourd&#8217;hui 17 février 2011, à 15 heures !</p>
<p>L&#8217;accouchement s&#8217;est bien passé, et les 3 papas sont en pleine forme.</td>
</tr>
</tbody>
</table>
<p>Autres articles sur le même sujet
<ul>
<li><a href="http://www.lafabrick.com/blog/2007/07/20/193-les-blogs-c-est-bien-mais-y-a-mieux/" rel="bookmark" title="20 juillet 2007">Les blogs c&#8217;est bien!&#8230; mais y a mieux !!!</a></li>
<li><a href="http://www.lafabrick.com/blog/2007/07/04/97-virtual-cabinet-ria-rda-pour-l-apprentissage-des-langues/" rel="bookmark" title="4 juillet 2007">Virtual Cabinet, flash et interfaces riches pour l&#8217;apprentissage des langues (1)</a></li>
<li><a href="http://www.lafabrick.com/blog/2008/05/23/318-thanks-adobe-you-certified-me/" rel="bookmark" title="23 mai 2008">Thanks Adobe, U certified me !!! <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/2009/03/02/1079-fitc09-twiidee-wiiflash-and-rock-n-roll/" rel="bookmark" title="2 mars 2009">FITC#09 : TwiiDee, WiiFlash and Rock &#8216;n&#8217; Roll</a></li>
</ul>
<p><!-- Similar Posts took 12.317 ms --></p>
]]></content:encoded>
			<wfw:commentRss>http://www.lafabrick.com/blog/2011/02/17/2404-re-naissance/feed/</wfw:commentRss>
		<slash:comments>8</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.638 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>ZXPackager : application pour l’empaquetage ZXP d’extensions CS5</title>
		<link>http://www.lafabrick.com/blog/2010/07/28/2092-zxpackager-application-pour-l%e2%80%99empaquetage-zxp-d%e2%80%99extensions-cs5/</link>
		<comments>http://www.lafabrick.com/blog/2010/07/28/2092-zxpackager-application-pour-l%e2%80%99empaquetage-zxp-d%e2%80%99extensions-cs5/#comments</comments>
		<pubDate>Wed, 28 Jul 2010 21:10:53 +0000</pubDate>
		<dc:creator>Fabien</dc:creator>
				<category><![CDATA[La Fabrick]]></category>
		<category><![CDATA[Nos projets]]></category>
		<category><![CDATA[AIR]]></category>
		<category><![CDATA[Applications]]></category>
		<category><![CDATA[Flex]]></category>
		<category><![CDATA[Lafabrick]]></category>
		<category><![CDATA[linkedin]]></category>
		<category><![CDATA[zxp]]></category>

		<guid isPermaLink="false">http://www.lafabrick.com/blog/?p=2092</guid>
		<description><![CDATA[Vous l&#8217;aurez peut être remarqué, nous avons ajouté une rubrique Applications au blog. Nous travaillons actuellement sur plusieurs applications AIR orientées &#171;&#160;aide au développeur&#160;&#187;. ZXPackager est la première d&#8217;entre elles. Cette application propose un moyen simple de packager vos extensions CS5 développées avec le nouveau SDK Creative Suite. Les extensions ZXP Depuis la CS5, Adobe [...]]]></description>
			<content:encoded><![CDATA[<table width="100%">
<tbody>
<tr>
<td width="125px"><img class="aligncenter size-full wp-image-2099" src="http://www.lafabrick.com/blog/wp-content/uploads/2010/07/logo128.png" alt="" width="128" height="128" /></td>
<td width="100%">Vous l&#8217;aurez peut être remarqué, nous avons ajouté une rubrique <a href="http://www.lafabrick.com/blog/applications/">Applications</a> au blog. Nous travaillons actuellement sur plusieurs applications AIR orientées &laquo;&nbsp;aide au développeur&nbsp;&raquo;. ZXPackager est la première d&#8217;entre elles.</p>
<p>Cette application propose un moyen simple de packager vos extensions CS5 développées avec le nouveau SDK Creative Suite.</td>
</tr>
</tbody>
</table>
<p><span id="more-2092"></span></p>
<h2>Les extensions ZXP</h2>
<p>Depuis la CS5, Adobe propose un nouveau SDK de développement et un format d&#8217;extension commun a toute la suite logicielle.<br />
Ce SDK, <a href="http://www.adobe.com/devnet/creativesuite/sdk/eula_cs5_toolkit.html">disponible ici</a>, vous permet de développer vos propres panneaux et autres menus CS5. Le premier format de sortie est le MXP, toujours disponible, vous permettant d&#8217;exporter votre extension pour un logiciel cible.<br />
Maintenant, avec la CS5, vous disposez d&#8217;un format commun, le ZXP, qui rend compatible votre extension avec toutes la suites CS.</p>
<p>Un fichier ZXP est défini par un manifeste xml, définissant le fonctionnement de l&#8217;extension (type, portée logiciel, &#8230;), et contient le (les) SWF de l&#8217;extension (une extension est en fait une pseudo application AIR, basée sur le SDK CS). Un fichier ZXP est signé numériquement. Vous devez donc avoir un certificat (PKCS12, PKCS11, JKS). Vous pouvez bien entendu utiliser votre certificat auto-signé préalablement créé avec Flash/Flex Buider.</p>
<p>Pour plus d&#8217;informations :</p>
<ul>
<li><a href="http://www.adobe.com/devnet/creativesuite/sdk/index.html">Creative Suite SDK</a></li>
<li><a href="http://blogs.adobe.com/cssdk/">le blog CSSDK</a></li>
</ul>
<p>Un fichier ZXP doit (habituellement) être compilé en utilisant le packager Java <a href="http://www.adobe.com/devnet/creativesuite/sdk/eula_cs5_toolkit.html">UCF</a>. Et c&#8217;est là l&#8217;idée de cette petite application : ne pas avoir a redéfinir vos certificats et autres options pour chaque package, et vous proposer une interface plus &laquo;&nbsp;user friendly&nbsp;&raquo; que le terminal.</p>
<h2>Fonctionnement</h2>
<h3>Démarrage, et préférences</h3>
<p>Au premier démarrage, l&#8217;application doit obtenir vos préférences de base.</p>
<p><img class="aligncenter size-full wp-image-2100" title="Preferences" src="http://www.lafabrick.com/blog/wp-content/uploads/2010/07/Preferences.png" alt="Preferences" width="500" height="450" /></p>
<ul>
<li>
<h4>Java Home</h4>
<p>Vous devez indiquer le chemin vers votre JDK/JRE java, si celui-ci ne correspond pas à celui par défaut (l&#8217;application intègre le packager jar UCF, et elle doit connaître le répertoire racine de Java pour pouvoir le lancer). Les chemins racines par défaut sont:</p>
<ul>
<li>Pour Windows : <strong>&#8216;C:\Program Files\Java\jdk1.6.0&#8242;</strong></li>
<li>Pour Mac : <strong>&#8216;/System/Library/Frameworks/JavaVM.framework/Versions/1.6.0&#8242;</strong></li>
</ul>
</li>
<li>
<h4>Certificat</h4>
<p>Vous devez préciser l&#8217;emplacement de votre certificat (généralement un fichier de type .p12 ou .p11), ainsi que votre mot de passe. Ces informations sont nécessaires pour la signature de l&#8217;extension.</p>
<ul>
<li>
<h4>Fichier cible</h4>
<p>Vous devez indiquer le fichier de destination. L&#8217;extension .zxp est ajoutée automatiquement.</li>
<li>
<h4>Source de l&#8217;extension</h4>
</li>
<p>Les sources de l&#8217;extension, comme défini dans la nomenclature du SDK CS, doivent correspondre à ce schéma:</p>
<p><img class="aligncenter size-full wp-image-2096" src="http://www.lafabrick.com/blog/wp-content/uploads/2010/07/binPackageOverview.png" alt="" width="537" height="80" /><br />
Ce répertoire est construit préalablement par la tâche ant de compilation, dans votre projet (cf. en fin d&#8217;article, le téléchargement du projet test d&#8217;extension)<br />
Vous devez pointer sur le répertoire &laquo;&nbsp;bin&nbsp;&raquo;.</ul>
<ul>
<li>Démarrer un nouveau package;</li>
<li>Ouvrir et installer l&#8217;extension via Extension Manager (vous devez bien entendu avoir préalablement installé Extension Manager CS5)</li>
</ul>
<ul>
<li><a href="http://lafabrick.com/applications/zxpackager/extensionTest.fxp">Projet fxp</a></li>
<li><a href="http://lafabrick.com/applications/zxpackager/bin.zip">Archive zip du bin de test</a></li>
</ul>
</li>
<h3>Définition de votre extension</h3>
<p>Un package ZXP a besoin de 2 informations : le nom et l&#8217;emplacement de votre extension cible, et l&#8217;endroit où se trouve le répertoire &laquo;&nbsp;bin&nbsp;&raquo; de votre extension.</p>
<p><img class="aligncenter size-full wp-image-2102" title="StartProject" src="http://www.lafabrick.com/blog/wp-content/uploads/2010/07/StartProject.png" alt="start package" width="500" height="450" /></p>
<p>Une fois le packaging démarré, un message d&#8217;attente s&#8217;affiche.</p>
<p><img class="aligncenter size-full wp-image-2103" src="http://www.lafabrick.com/blog/wp-content/uploads/2010/07/waiting-mini.png" alt="" width="467" height="48" /></p>
<h3>Finalisation</h3>
<p>Une fois le package créé, l&#8217;application vous propose de :</p>
<p><img class="aligncenter size-full wp-image-2097" title="completed" src="http://www.lafabrick.com/blog/wp-content/uploads/2010/07/completed.png" alt="" width="500" height="450" /></p>
<h2>Téléchargements</h2>
<h3>ZXPackager</h3>
<table>
<tbody>
<tr>
<td width="128"><a href="http://www.lafabrick.com/applications/zxpackager/ZXPackager-MAC.zip"><img class="aligncenter size-full wp-image-2137" title="macPackageExport" src="http://www.lafabrick.com/blog/wp-content/uploads/2010/07/macPackageExport.png" alt="" width="128" height="128" /></a></td>
<td width="128"><a href="http://www.lafabrick.com/applications/zxpackager/ZXPackager-WIN.zip"><img class="aligncenter size-full wp-image-2137" title="winPackageExport" src="http://www.lafabrick.com/blog/wp-content/uploads/2010/07/winPackageExport.png" alt="" width="128" height="128" /></a></td>
</tr>
</tbody>
</table>
<h3>Extension de test</h3>
</ul>
<p>Autres articles sur le même sujet
<ul>
<li><a href="http://www.lafabrick.com/blog/2007/09/04/206-flex-3-beta-rsolution-de-bug-comment-placer-fichier-d-application/" rel="bookmark" title="4 septembre 2007">[Flex 3 Beta] bug : Application File doesn&#8217;t exist</a></li>
<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/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 12.027 ms --></p>
]]></content:encoded>
			<wfw:commentRss>http://www.lafabrick.com/blog/2010/07/28/2092-zxpackager-application-pour-l%e2%80%99empaquetage-zxp-d%e2%80%99extensions-cs5/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>La Fabrick passe la troisième&#8230;</title>
		<link>http://www.lafabrick.com/blog/2010/07/18/1966-la-fabrick-passe-la-troisieme/</link>
		<comments>http://www.lafabrick.com/blog/2010/07/18/1966-la-fabrick-passe-la-troisieme/#comments</comments>
		<pubDate>Sun, 18 Jul 2010 21:46:56 +0000</pubDate>
		<dc:creator>Hervé</dc:creator>
				<category><![CDATA[La Fabrick]]></category>
		<category><![CDATA[Lafabrick]]></category>

		<guid isPermaLink="false">http://www.lafabrick.com/blog/?p=1966</guid>
		<description><![CDATA[Pas de web 3.0, pas de nouvelle voiture, mais juste la nouvelle version de WordPress&#8230; On a profité de la mise à jour pour, au passage, faire apparaître la version anglaise. C&#8217;est la nouveauté, histoire de faciliter l&#8217;accès à nos amis d&#8217;outre-manche / outre-atlantique&#8230; bref non français ! La partie française restera systématiquement alimentée, et [...]]]></description>
			<content:encoded><![CDATA[<p>Pas de web 3.0, pas de nouvelle voiture, mais juste la nouvelle version de WordPress&#8230; On a profité de la mise à jour pour, au passage, faire apparaître la version anglaise.<br />
C&#8217;est la nouveauté, histoire de faciliter l&#8217;accès à nos amis d&#8217;outre-manche / outre-atlantique&#8230; bref non français !<br />
La partie française restera systématiquement alimentée, et on tentera de traduire dans la mesure du possible.</p>
<p>Let&#8217;s rock n&#8217; roll&#8230;<br />
Autres articles sur le même sujet
<ul>
<li><a href="http://www.lafabrick.com/blog/2006/10/09/4-la-fabrick-ou-quand-fabien-rencontre-erick/" rel="bookmark" title="9 octobre 2006">La Fabrick &#8230; ou quand Fabien rencontre Erick</a></li>
<li><a href="http://www.lafabrick.com/blog/2007/10/01/240-labsadobecom-c-est-nol-avant-l-heure/" rel="bookmark" title="1 octobre 2007">Noël avant l&#8217;heure : la journée de la béta 2 sur Labs.adobe.com</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/07/28/2023-ca-envoie/" rel="bookmark" title="28 juillet 2010">Ça envoie&#8230;</a></li>
</ul>
<p><!-- Similar Posts took 11.960 ms --></p>
]]></content:encoded>
			<wfw:commentRss>http://www.lafabrick.com/blog/2010/07/18/1966-la-fabrick-passe-la-troisieme/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>BarCamp interfaces riches, Lyon, 23/06</title>
		<link>http://www.lafabrick.com/blog/2010/05/12/1880-barcamp-interfaces-riches-lyon-2306/</link>
		<comments>http://www.lafabrick.com/blog/2010/05/12/1880-barcamp-interfaces-riches-lyon-2306/#comments</comments>
		<pubDate>Wed, 12 May 2010 12:41:59 +0000</pubDate>
		<dc:creator>Fabien</dc:creator>
				<category><![CDATA[Bientôt chez vous]]></category>
		<category><![CDATA[La Fabrick]]></category>
		<category><![CDATA[barcamp]]></category>
		<category><![CDATA[Conférence]]></category>
		<category><![CDATA[interactivité]]></category>
		<category><![CDATA[RIA]]></category>
		<category><![CDATA[UX]]></category>

		<guid isPermaLink="false">http://www.lafabrick.com/blog/?p=1880</guid>
		<description><![CDATA[Depuis 40 ans, l&#8217;informatique est en r-évolution continue. Non seulement les ordinateurs sont de plus en plus puissants, mais leur utilisation prend chaque jour de nouvelles formes. Interfaces riches, tactiles, vocales, ou encore tangibles, il semble qu&#8217;en terme d&#8217;interfaces homme-machine, la réalité rattrape aujourd&#8217;hui la science fiction. Que vous soyez acteurs dans les nouvelles technologies [...]]]></description>
			<content:encoded><![CDATA[<p><center><img src="http://www.lafabrick.com/blog/wp-content/uploads/2010/05/barcampheaderblog.jpg" alt="barcampheaderblog" title="barcampheaderblog" width="520" height="150" class="aligncenter size-full wp-image-1889" /></center><br />
Depuis 40 ans, l&#8217;informatique est en r-évolution continue. Non seulement les ordinateurs sont de plus en plus puissants, mais leur utilisation prend chaque jour de nouvelles formes. Interfaces riches, tactiles, vocales, ou encore tangibles, il semble qu&#8217;en terme d&#8217;interfaces homme-machine,  la réalité rattrape aujourd&#8217;hui la science fiction.</p>
<p>Que vous soyez acteurs dans les nouvelles technologies ou simplement curieux de voir ce que le présent nous réserve, vous êtes conviés à venir participer au 1er BarCamp dédié aux Interfaces Riches, le 23 juin 2010 à partir de 17h, au cyberCafé du campus de la Doua à Villeurbanne.</p>
<p>Au programme : des  conférences, des ateliers et des démonstrations de ces technologies naissantes ou déjà matures et de leurs usages dans différents domaines (commerce, enseignement, divertissement…). Aux côtés des principaux innovateurs de ce secteur, vous pourrez même, si vous le souhaitez, proposer votre propre présentation dans les tribunes libres prévues à cet effet.</p>
<p>Quelques présentations au menu :</p>
<ul>
<li>Nouvelles expériences utilisateurs multi-canal grâce aux RIA (ipTv, bornes interactives);</li>
<li><a href="http://openscales.org/">OpenScales</a>: client cartographique basé sur les technologies ActionScript3 / Flex / AIR;</li>
<li>Comment développer une RIA moderne en Javascript avec <a href="http://bitbucket.org/ilabs/resthub/">RESTHub</a>.</li>
</ul>
<p>Rendez vous, donc, le 23 juin 2010 pour une rencontre conviviale qui vous donnera l&#8217;occasion de découvrir ou de montrer dès aujourd&#8217;hui, les interfaces de demain.<br />
<center><a href="http://barcamp-lyon.eventbrite.com?ref=ebtn" target="_blank"  ><img border="0" src="http://www.eventbrite.com/registerbutton?eid=675667941" alt="Register for Barcamp interfaces riches in Villeurbanne, France  on Eventbrite" /></a></center><br />
<span id="more-1880"></span><br />
Ce rendre au cyber café de l&#8217;université Lyon1 :<br />
<iframe width="640" height="480" frameborder="0" scrolling="no" marginheight="0" marginwidth="0" src="http://maps.google.fr/maps/ms?ie=UTF8&amp;hl=fr&amp;t=h&amp;msa=0&amp;msid=102461965477805714758.000485da8aecb7c6dbce8&amp;ll=45.779945,4.87263&amp;spn=0.007183,0.013733&amp;z=16&amp;output=embed"></iframe><br /><small>Afficher <a href="http://maps.google.fr/maps/ms?ie=UTF8&amp;hl=fr&amp;t=h&amp;msa=0&amp;msid=102461965477805714758.000485da8aecb7c6dbce8&amp;ll=45.779945,4.87263&amp;spn=0.007183,0.013733&amp;z=16&amp;source=embed" style="color:#0000FF;text-align:left">Cyber café, université Lyon1</a> sur une carte plus grande</small><br />
<br />
toutes les infos du barCamp sur <a href="http://www.facebook.com/#!/group.php?gid=119133324776126">le groupe facebook</a><br />
Partenaires :<br />
<center><img src="http://www.lafabrick.com/blog/wp-content/uploads/2010/05/partenaires2.jpg" alt="partenairebig" title="partenairebig" width="520" height="130" class="aligncenter size-full wp-image-1901" /></center><br />
Autres articles sur le même sujet
<ul>
<li><a href="http://www.lafabrick.com/blog/2007/04/06/84-flash-in-the-can-hymne-a-l-as3/" rel="bookmark" title="6 avril 2007">« Flash In The Can » : hymne a l&#8217;AS3</a></li>
<li><a href="http://www.lafabrick.com/blog/2007/07/05/181-virtual-cabinet-flash-et-interfaces-riches-pour-l-apprentissage-des-langues-3/" rel="bookmark" title="5 juillet 2007">Virtual Cabinet, flash et interfaces riches pour l&#8217;apprentissage des langues (3)</a></li>
<li><a href="http://www.lafabrick.com/blog/2009/05/04/1130-interfaces-tangibles-le-futur-du-multitouch/" rel="bookmark" title="4 mai 2009">Interfaces tangibles : le futur du multitouch</a></li>
<li><a href="http://www.lafabrick.com/blog/2011/07/08/2621-barcamp-lyon-mix-it-flex-java-php-js-cloud-et-chips/" rel="bookmark" title="8 juillet 2011">Barcamp Lyon : Mix-IT, Flex, Java, PHP, JS, Cloud&#8230; (et chips)</a></li>
</ul>
<p><!-- Similar Posts took 12.248 ms --></p>
]]></content:encoded>
			<wfw:commentRss>http://www.lafabrick.com/blog/2010/05/12/1880-barcamp-interfaces-riches-lyon-2306/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Prenez vous au serious : Serious Drink Party vol. 05</title>
		<link>http://www.lafabrick.com/blog/2009/04/20/1120-prenez-vous-au-serious-serious-drink-party-vol-05/</link>
		<comments>http://www.lafabrick.com/blog/2009/04/20/1120-prenez-vous-au-serious-serious-drink-party-vol-05/#comments</comments>
		<pubDate>Mon, 20 Apr 2009 21:59:41 +0000</pubDate>
		<dc:creator>Erick</dc:creator>
				<category><![CDATA[La Fabrick]]></category>
		<category><![CDATA[Nawak]]></category>

		<guid isPermaLink="false">http://www.lafabrick.com/blog/?p=1120</guid>
		<description><![CDATA[Bien le bonsoir, on avait imaginé une cinquième édition des Serious Drink complétement serious pour le coup&#8230; annoncée plusieurs semaines à l&#8217;avance&#8230; avec un videoproj, des beaux thèmes PowerPoint, des chips, des olives, et quelques rythmes neojazzy en interlude entre chaque présentations&#8230; la sseuclaaa ! mais bon le temps a passé, tout était bien parti&#8230; [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://forestnet.blogit.fr/photos/c64f993bd6fd054c.jpg" alt="Bière et F." /><br />
<span id="more-1120"></span></p>
<p>Bien le bonsoir,<br />
on avait imaginé une cinquième édition des Serious Drink complétement serious pour le coup&#8230; annoncée plusieurs semaines à l&#8217;avance&#8230; avec un videoproj, des beaux thèmes PowerPoint, des chips, des olives, et quelques rythmes neojazzy en interlude entre chaque présentations&#8230; la sseuclaaa !<br />
mais bon le temps a passé, tout était bien parti&#8230; sauf les &laquo;&nbsp;invitations&nbsp;&raquo;&#8230; toujours pas parties elles&#8230; tanpis <img src='http://www.lafabrick.com/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  , on a quand même soif !!!<br />
Du coup on a une petite salle réservée, mais trève de sérieux, on garde le thème classique :</p>
<p>Soirée Bière et fleeex donc au 1er étage du Café Cousu Jeudi le 23 d&#8217;avril à partir de 19h30 !!!<br />
Viendez y !!!</p>
<p>Passage Thiaffait<br />
19,rue René Leynaud<br />
69001 Lyon<br />
Tel: 04 72 98 83 38</p>
<p><a href="http://maps.google.fr/maps?f=q&#038;source=s_q&#038;hl=fr&#038;geocode=&#038;q=passage+thiaffait+lyon&#038;sll=47.15984,2.988281&#038;sspn=24.227066,39.902344&#038;ie=UTF8&#038;z=16&#038;iwloc=A">Voir où que c&#8217;est sur une carte</a>Autres articles sur le même sujet
<ul>
<li><a href="http://www.lafabrick.com/blog/2007/12/03/275-climatus-et-lafabrick-sur-le-petit-cran/" rel="bookmark" title="3 décembre 2007">Climatus et lafabrick sur le petit écran&#8230;.</a></li>
<li><a href="http://www.lafabrick.com/blog/2007/09/13/220-3-minutes-pour-sauver-vos-futurs-prsentations/" rel="bookmark" title="13 septembre 2007">3 minutes pour sauver vos futurs présentations&#8230;</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/2009/01/06/647-serious-drink-0090108/" rel="bookmark" title="6 janvier 2009">Serious Drink 0.09.01.08&#8230;</a></li>
</ul>
<p><!-- Similar Posts took 16.203 ms --></p>
]]></content:encoded>
			<wfw:commentRss>http://www.lafabrick.com/blog/2009/04/20/1120-prenez-vous-au-serious-serious-drink-party-vol-05/feed/</wfw:commentRss>
		<slash:comments>18</slash:comments>
		</item>
		<item>
		<title>FITC#09 : TwiiDee, WiiFlash and Rock &#8216;n&#8217; Roll</title>
		<link>http://www.lafabrick.com/blog/2009/03/02/1079-fitc09-twiidee-wiiflash-and-rock-n-roll/</link>
		<comments>http://www.lafabrick.com/blog/2009/03/02/1079-fitc09-twiidee-wiiflash-and-rock-n-roll/#comments</comments>
		<pubDate>Mon, 02 Mar 2009 13:32:04 +0000</pubDate>
		<dc:creator>Fabien</dc:creator>
				<category><![CDATA[Bientôt chez vous]]></category>
		<category><![CDATA[La Fabrick]]></category>
		<category><![CDATA[Nos projets]]></category>
		<category><![CDATA[FITC]]></category>
		<category><![CDATA[Twiidee]]></category>
		<category><![CDATA[wiiFlash]]></category>

		<guid isPermaLink="false">http://www.lafabrick.com/blog/?p=1079</guid>
		<description><![CDATA[La semaine dernière s&#8217;est déroulé le FITC à Amsterdam. Au cours de la session &#171;&#160;Cool Shit!&#160;&#187;, Thibault a lâché en avant première une démo de la nouvelle monture de WiiFlash : vous allez voir ça envoie ! Il a aussi présenté TwiiDee, mon application pour manipuler des objets 3D à l&#8217;aide de wiimote. Malgré quelques [...]]]></description>
			<content:encoded><![CDATA[<p>La semaine dernière s&#8217;est déroulé le <a href="http://www.fitc.ca/">FITC</a> à Amsterdam. Au cours de la session &laquo;&nbsp;Cool Shit!&nbsp;&raquo;, <a href="http://www.bytearray.org/">Thibault</a> a lâché en avant première une démo de la nouvelle monture de <a href="http://wiiflash.bytearray.org/">WiiFlash</a> : vous allez voir ça envoie ! Il a aussi présenté TwiiDee, mon application pour manipuler des objets 3D à l&#8217;aide de wiimote. Malgré quelques heures de débug Vista / Air / Javascript, l&#8217;effet démo n&#8217;a pas manqué le rendez-vous <img src='http://www.lafabrick.com/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> . A noter pour la prochaine fois Thibault, toujours utiliser des piles neuves en présentation <img src='http://www.lafabrick.com/blog/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> . Mais bon avec un peu de patience et de sang froid&#8230; ça a fini par rouler !!!  Je vous laisse voir tout ça !</p>
<p><object width="425" height="344"><param name="movie" value="http://www.youtube.com/v/imjzIiHa3fw&#038;hl=fr&#038;fs=1"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/imjzIiHa3fw&#038;hl=fr&#038;fs=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="344"></embed></object></p>
<p>Autres articles sur le même sujet
<ul>
<li><a href="http://www.lafabrick.com/blog/2008/12/03/466-buzz-a-max/" rel="bookmark" title="3 décembre 2008">Buzz à Max&#8230;</a></li>
<li><a href="http://www.lafabrick.com/blog/2008/12/10/472-retour-sur-lafabrick-max/" rel="bookmark" title="10 décembre 2008">retour sur Lafabrick @ max</a></li>
<li><a href="http://www.lafabrick.com/blog/2008/02/04/298-wiiflash-et-3d-l-universit/" rel="bookmark" title="4 février 2008">wiiFlash et 3d à l&#8217;université</a></li>
<li><a href="http://www.lafabrick.com/blog/2008/02/07/302-wiiflash-l-universit-acte-2/" rel="bookmark" title="7 février 2008">wiiFlash à l&#8217;université : acte 2</a></li>
</ul>
<p><!-- Similar Posts took 13.663 ms --></p>
]]></content:encoded>
			<wfw:commentRss>http://www.lafabrick.com/blog/2009/03/02/1079-fitc09-twiidee-wiiflash-and-rock-n-roll/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Reflex #2 : vous reprendrez bien un peu de IOC ?</title>
		<link>http://www.lafabrick.com/blog/2009/01/15/819-reflex-2-vous-reprendez-bien-un-peu-de-ioc/</link>
		<comments>http://www.lafabrick.com/blog/2009/01/15/819-reflex-2-vous-reprendez-bien-un-peu-de-ioc/#comments</comments>
		<pubDate>Wed, 14 Jan 2009 22:16:49 +0000</pubDate>
		<dc:creator>Fabien</dc:creator>
				<category><![CDATA[Bientôt chez vous]]></category>
		<category><![CDATA[La Fabrick]]></category>
		<category><![CDATA[Nos projets]]></category>
		<category><![CDATA[[Dev] Flash / Flex / AIR...]]></category>
		<category><![CDATA[architecture]]></category>
		<category><![CDATA[Flex]]></category>
		<category><![CDATA[IOC]]></category>
		<category><![CDATA[MVC]]></category>
		<category><![CDATA[Tutoriels]]></category>

		<guid isPermaLink="false">http://www.lafabrick.com/blog/?p=819</guid>
		<description><![CDATA[Reflex intègre un système d’Injection de contenu, qui est l’une des représentations de l’IOC. Nous allons voir ici à quoi cela sert, et comment le mettre en œuvre dans Reflex. Si ce n’est déjà fait, je vous laisse jeter un œil sur la première partie de cette architecture, et de récupérer le swc avant de [...]]]></description>
			<content:encoded><![CDATA[<p><img class="aligncenter" title="reflex image tuto 2" src="http://www.lafabrick.com/labz/reflex/images/reflexImgTuto2.jpg" alt="" width="520" height="230" /><br />
Reflex intègre un système d’Injection de contenu, qui est l’une des représentations de l’IOC.<br />
Nous allons voir ici à quoi cela sert, et comment le mettre en œuvre dans Reflex.</p>
<p>Si ce n’est déjà fait, je vous laisse jeter un œil sur <a href="http://www.lafabrick.com/blog/2009/01/13/786-reflex-1-une-micro-architecture-pour-flex-simple/">la première partie de cette architecture</a>, et de <a href="http://www.lafabrick.com/blog/reflex/">récupérer le swc</a> avant de lire la suite.<br />
<span id="more-819"></span></p>
<h3><strong>A quoi ça sert l’IOC ?</strong></h3>
<p>L’IOC ( Inversion Of Control ) est un patron d’architecture, possédant plusieurs représentations ( inversion de contrôle, injection de dépendance, &#8230;).  Je ne vais pas faire un cours sur l’Injection de contenu : je vous laisse <a href="http://fr.wikipedia.org/wiki/Inversion_de_contr%C3%B4le">voir ici </a>pour plus d’informations.</p>
<p>Dans Reflex, le but du package IOC est de décentraliser les objets de configurations de l’application. En gros, mettre les services d’accès aux données dans un fichier de configuration XML au lieu de les coder en dur dans l&#8217;application Flex.</p>
<p>Certains spécialistes me diront certainement que l’Injection de contenu n’est pas forcement une représentation de l’IOC, et donc un abus de langage pour Reflex : je répondrais par “traduisez ici IOC par Injection Of Content, et laissons tomber les patrons d’architecture !”.</p>
<h3><strong>Au commencement, le ServicesLocator</strong></h3>
<p>Nous avons vu dans la première partie comment réaliser simplement un appel à une méthode distante. Avoir un point d’accès global aux différents services est pratique lorsque l’on commence à avoir plusieurs services, ou si des vues différentes utilisent un service identique. Voyons comment procéder avec le premier exemple.</p>
<p>Reprenons l’exemple du <a href="http://www.lafabrick.com/blog/2009/01/13/786-reflex-1-une-micro-architecture-pour-flex-simple/">tuto #1</a> :  il faut charger <strong>les services</strong> dans le <strong>ServicesLocator</strong>. Nous allons donc modifier notre vue :</p>
<pre class="brush: xml">
&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt;
&lt;mx:Application
	xmlns:mx=&quot;http://www.adobe.com/2006/mxml&quot;
	layout=&quot;absolute&quot;

	creationComplete=&quot;init()&quot;

	xmlns:controller=&quot;controller.*&quot;
	xmlns:model=&quot;model.*&quot;&gt;

	&lt;mx:Script&gt;
		&lt;![CDATA[
			import com.lafabrick.reflex.service.ServicesLocator;

			public static const SERVICE_USER:String = &quot;userService&quot;;
			public static const SERVICE_OTHER:String = &quot;otherService&quot;;

			private function init() : void
			{
				ServicesLocator.addService( SERVICE_USER, remoteUser );
				ServicesLocator.addService( SERVICE_OTHER, remoteOther );

				userControl.service = ServicesLocator.getService( SERVICE_USER );
			}

		]]&gt;
	&lt;/mx:Script&gt;

	&lt;mx:RemoteObject id=&quot;remoteUser&quot;
		destination=&quot;javaFacadeUser&quot; showBusyCursor=&quot;true&quot; /&gt;

	&lt;mx:RemoteObject id=&quot;remoteOther&quot;
		destination=&quot;javaFacadeOther&quot; showBusyCursor=&quot;true&quot; /&gt;

	&lt;controller:UserController id=&quot;userControl&quot; /&gt;

	&lt;model:UserModel id=&quot;userModel&quot; /&gt;

	&lt;mx:VBox&gt;
		&lt;mx:TextInput id=&quot;login&quot; /&gt;
		&lt;mx:TextInput id=&quot;password&quot; displayAsPassword=&quot;true&quot; /&gt;

		&lt;mx:Button label=&quot;connect&quot;
			click=&quot;{userControl.login(login.text, password.text)}&quot; /&gt;

		&lt;mx:Label x=&quot;208&quot; y=&quot;44&quot;
			text=&quot;User Name : {userModel.userLogged.name}&quot;/&gt;
	&lt;/mx:VBox&gt;

&lt;/mx:Application&gt;
</pre>
<ul>
<li>À la création de l’application ( <em>creationComplete</em> ), nous déclenchons la fonction<strong> init();</strong>.</li>
<li>Nous ajoutons les services <strong>RemoteObject</strong> dans le <a href="http://www.lafabrick.com/labz/reflex/apidoc/com/lafabrick/reflex/service/ServicesLocator.html">ServicesLocator</a>. La signature de cette méthode est la suivante :
<pre class="brush: js">
ServicesLocator.addService( serviceName:String, serviceObject:AbstractService )
</pre>
<p> </p>
<ul>
<li>  <strong><em>  serviceName:String</em></strong> est le nom de référence utilisé pour indexer, et plus tard retrouver le bon service.</li>
<li><strong><em>serviceObject:AbstractService</em></strong> est l’identifiant (id) de l’object service (le RemoteObject). </li>
</ul>
</li>
<li>Nous supprimons la propriété <strong><em>service</em></strong> dans la déclaration mxml de <strong>UserController</strong>, pour la déclarer en ActionScript dans la fonction<strong> init()</strong>.   ServicesLocator.getService( serviceName:String ) renvoie l’instance du service défini par serviceName, référencée dans le locator.</li>
</ul>
<p><strong>Note</strong> : Au niveau de l’appel du service, nous pourrions appeler la méthode <strong>getController</strong> de <a href="http://www.lafabrick.com/labz/reflex/apidoc/com/lafabrick/reflex/controller/ControllerLocator.html">ControllerLocator</a>.</p>
<pre class="brush: js">
userControl.login(login.text, password.text); 
</pre>
<p>devient :</p>
<pre class="brush: js">
( ControllerLocator.getController( MonApplication.SERVICE_USER )
	as UserController ).login(login.text, password.text);
</pre>
<p>Dans ce cas, nous devons &laquo;&nbsp;caster&nbsp;&raquo; le retour de <strong>getController(&#8230;)</strong> en <strong>UserController</strong> ( sinon erreur ! Flex ne connaîtrait pas la méthode login )</p>
<h3><strong>Un composant pour la vue</strong></h3>
<p>Histoire de mettre en pratique un peu plus l’utilisation des “locators” de Reflex, nous allons créer un composant MXML étendant <strong>Canvas</strong>, qui va contenir la représentation visuelle de notre application. Nous allons utiliser <strong>ControllerLocator</strong> dans ce fichier pour récupérer le <strong>UserController</strong>.</p>
<pre class="brush: xml">
&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt;
&lt;mx:Canvas
	xmlns:mx=&quot;http://www.adobe.com/2006/mxml&quot;
	width=&quot;100%&quot;
	height=&quot;100%&quot;&gt;

	&lt;mx:Script&gt;
		&lt;![CDATA[
			import model.UserModel;
			import controller.UserController;
			import com.lafabrick.reflex.controller.ControllerLocator;
			import com.lafabrick.reflex.model.ModelLocator;

			[Bindable]
			private var userDataModel:UserModel =
				( ModelLocator.getModel( UserModel ) as UserModel);

		]]&gt;
	&lt;/mx:Script&gt;

	&lt;mx:VBox horizontalCenter=&quot;0&quot; verticalCenter=&quot;0&quot;&gt;
		&lt;mx:TextInput id=&quot;login&quot; /&gt;
		&lt;mx:TextInput id=&quot;password&quot; displayAsPassword=&quot;true&quot; /&gt;

		&lt;mx:Button
			label=&quot;connect&quot;
			click=&quot;{ ( ControllerLocator.getController( UserController )
				as UserController ).login( login.text, password.text )}&quot; /&gt;

		&lt;mx:Label x=&quot;208&quot; y=&quot;44&quot;
			text=&quot;User Name : {userDataModel.userLogged.name}&quot;/&gt;
	&lt;/mx:VBox&gt;

&lt;/mx:Canvas&gt;
</pre>
<p>Pour que le “<strong>Binding</strong>” fonctionne correctement entre la vue et le modèle, nous devons utiliser des pointeurs vers les modèles à utiliser.</p>
<h3><strong>Le fichier de configuration XML (IOC)</strong></h3>
<p>Nous venons de voir comment utiliser le <a href="http://www.lafabrick.com/labz/reflex/apidoc/com/lafabrick/reflex/service/ServicesLocator.html">ServiceLocator</a>. Intégrons maintenant le système <strong>IOC</strong> pour ne plus avoir à le gérer  !</p>
<p>Ce fichier vous permet de décrire des objets, pour ensuite les récupérer et les instancier dans votre application ( via <a href="http://www.lafabrick.com/labz/reflex/apidoc/com/lafabrick/reflex/ioc/ApplicationContext.html">ApplicationContext</a> ). Ce fichier s’inspire fortement des fichiers de configuration de Spring, un framework puissant pour Java.</p>
<p>Ci-dessous le fichier représentant 2 services <strong>RemoteObject</strong> :</p>
<pre class="brush: xml">
&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
&lt;objects&gt;

	&lt;object id=&quot;remotingUser&quot; className=&quot;mx.rpc.remoting.mxml.RemoteObject&quot;&gt;
		&lt;property name=&quot;destination&quot; className=&quot;String&quot;&gt;javaFacadeUser&lt;/property&gt;
		&lt;property name=&quot;showBusyCursor&quot; className=&quot;Boolean&quot;&gt;true&lt;/property&gt;
	&lt;/object&gt;

	&lt;object id=&quot;remotingOther&quot; className=&quot;mx.rpc.remoting.mxml.RemoteObject&quot;&gt;
		&lt;property name=&quot;destination&quot; className=&quot;String&quot;&gt;javaFacadeOther&lt;/property&gt;
		&lt;property name=&quot;showBusyCursor&quot; className=&quot;Boolean&quot;&gt;true&lt;/property&gt;
	&lt;/object&gt;

&lt;/objects&gt;
</pre>
<ul>
<li>Le tag <strong>&lt;objects&gt;</strong> englobe les différents objets définis dans le fichier. Il est défini par :</li>
<li>Un objet <strong>&lt;object&gt;</strong> est défini par :
<ul>
<li>un identifiant <strong><em>id</em></strong>. Cet id est celui que nous utiliserons plus tard dans l’application Flex pour retrouver et instancier l’objet.</li>
<li> un nom de classe <strong><em>className</em></strong> : la classe de référence.</li>
</ul>
</li>
<li>Les propriétés des objets sont définies par :
<ul>
<li>leur nom <strong><em>name</em></strong></li>
<li>leur classe <strong><em>className</em></strong> de référence.</li>
</ul>
</li>
</ul>
<p>Ici, un <a href="http://livedocs.adobe.com/flex/3/langref/mx/rpc/remoting/mxml/RemoteObject.html">RemoteObject</a> a besoin de 2 propriétés : la <em>destination</em> du type String, et éventuellement <em>showBusyCursor</em> du type Boolean.</p>
<h3><strong>Régler le problème d’inclusion de classe</strong></h3>
<p>Le “petit” problème de ce système est que la déclaration externe des objets fait que les classes ne sont pas intégrées dans le projet Flex. Le compilateur Flex ne trouve pas de référence aux classes, et ne les intègre donc pas dans la compilation. Un façon très simple de régler ce problème est de créer un petit fichier actionScript, et d’ajouter des objets bidons du même type que ceux définis dans votre fichier de config.</p>
<p>Exemple avec les services : (fichier includeService.as)</p>
<pre class="brush: js">
import mx.rpc.http.mxml.HTTPService;
import mx.rpc.remoting.mxml.RemoteObject;
import mx.rpc.soap.mxml.WebService;

private var ser1:RemoteObject;
private var ser2:HTTPService;
private var ser3:WebService;
</pre>
<p>Ce fichier sera intégré dans votre application.</p>
<h3><strong>Chargement et gestion du contexte XML</strong></h3>
<p>Vous allez voir : simple comme bonjour !<br />
Nous allons ajouter le chargement du fichier via <a href="http://www.lafabrick.com/labz/reflex/apidoc/com/lafabrick/reflex/ioc/ApplicationContext.html">ApplicationContext</a>. <strong>ApplicationContext</strong> permet de charger automatiquement le contexte cible, et de retrouver, instancier, et<strong> enregistrer automatiquement tous les service</strong>s qui se trouvent dans votre fichier de configuration XML dans le <strong>ServicesLocator</strong>.</p>
<p>Votre application finale :</p>
<pre class="brush: xml">
&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt;
&lt;mx:Application
	xmlns:mx=&quot;http://www.adobe.com/2006/mxml&quot;
	layout=&quot;absolute&quot;

	creationComplete=&quot;init()&quot;

	xmlns:model=&quot;model.*&quot;
	xmlns:view=&quot;view.*&quot;
	xmlns:controller=&quot;controller.*&quot;
	xmlns:service=&quot;service.*&quot;&gt;

	&lt;mx:Script&gt;
		&lt;![CDATA[
			import com.lafabrick.reflex.ioc.event.ContextEvent;
			import com.lafabrick.reflex.ioc.ApplicationContext;
			import com.lafabrick.reflex.controller.ControllerLocator;
			import com.lafabrick.reflex.service.ServicesLocator;

			include &quot;includeService.as&quot;

			private function init() : void
			{
				ApplicationContext.addEventListener(
					ContextEvent.CONTEXT_LOADED, onLoaded );

				ApplicationContext.load( &quot;ioc/application-config.xml&quot; );
			}

			private function onLoaded( event:ContextEvent ) :void
			{
				// Contexte chargé
				// ...
			}

		]]&gt;
	&lt;/mx:Script&gt;

	&lt;controller:UserController id=&quot;userControl&quot; /&gt;

	&lt;model:UserModel id=&quot;userModel&quot; /&gt;

	&lt;view:LoginView id=&quot;view&quot; /&gt;

&lt;/mx:Application&gt;
</pre>
<ul>
<li>Nous continuons à utiliser le “<strong>creationComplete</strong>” pour déclencher la fonction<strong> init()</strong> qui chargera le fichier de configuration.</li>
<li>Il ne faut pas oublier d’inclure au besoin les classes contenues dans notre fichier de config !
<pre class="brush: js">
include &quot;includeService.as&quot;
</pre>
</li>
<li>Dans la fonction<strong> init()</strong>, nous ajoutons un écouteur sur <strong>ApplicationContext</strong> (<a href="http://www.lafabrick.com/labz/reflex/apidoc/com/lafabrick/reflex/ioc/event/ContextEvent.html#CONTEXT_LOADED">ContextEvent.CONTEXT_LOADED</a>), qui déclenchera la fonction <strong>onLoaded</strong> quand le fichier de configuration sera chargé. Puis nous lançons le chargement du fichier de config (<strong> ioc/application-config.xml</strong> ).</li>
<li>&#8230; Et nous incluons la vue LoginView.</li>
</ul>
<h3><strong>Modification de notre UserController</strong></h3>
<p>Dans un soucis de clarté, nous allons créer 2 classes contenants les constantes référençants les noms des services (contenus dans le fichier de configuration), et les noms des méthodes de ces services.</p>
<p>MethodConstant (dans notre exemple uniquement la méthode login)</p>
<pre class="brush: js">
package service
{
	public class MethodConstant
	{
		public static const LOGIN:String = &quot;login&quot;;
	}
}
</pre>
<p>ServiceConstant (les identifiants des objets contenus dans le fichier de configuration)</p>
<pre class="brush: js">
package service
{
	public class ServiceConstant
	{
		public static const SERVICE_USER:String = &quot;remotingUser&quot;;
		public static const SERVICE_OTHER:String = &quot;remotingOther&quot;;
	}
}
</pre>
<p>Nous venons de charger notre fichier de configuration au niveau de notre Application. Nous devons maintenant modifier notre contrôleur pour qu&#8217;il <strong>écoute le chargement du fichier</strong> (événement ContextEvent.CONTEXT_LOADED), et <strong>mette à jour sa propriété service</strong>.</p>
<pre class="brush: js">
package controller
{
	import com.lafabrick.reflex.controller.BaseController;
	import com.lafabrick.reflex.ioc.ApplicationContext;
	import com.lafabrick.reflex.ioc.event.ContextEvent;
	import com.lafabrick.reflex.model.ModelLocator;
	import com.lafabrick.reflex.service.ServicesLocator;

	import dataObject.UserDo;

	import model.UserModel;

	import mx.rpc.events.FaultEvent;
	import mx.rpc.events.ResultEvent;

	import service.MethodConstant;
	import service.ServiceConstant;

	public class UserController extends BaseController
	{

		public function UserController() : void
		{
			ApplicationContext.addEventListener(ContextEvent.CONTEXT_LOADED, onLoaded);
		}

		private function onLoaded( event:ContextEvent ) :void
		{
			// Contexte chargé
			this.service = ServicesLocator.getService( ServiceConstant.SERVICE_USER );
		}

		public function login( log:String, pass:String ) : void
		{
			executeMethod(MethodConstant.LOGIN, onLoginResult, onLoginFault, log, pass);
		}

		public function onLoginResult( event:ResultEvent ) : void
		{
			(ModelLocator.getModel( UserModel ) as UserModel).userLogged =
				event.result as UserDo;

			trace((ModelLocator.getModel( UserModel ) as UserModel).userLogged.name);
		}
		public function onLoginFault( event:FaultEvent ) : void
		{
			trace(&quot;resultat pourri ...&quot;+event.fault);
		}

	}
}
</pre>
<p><strong><a href="http://www.lafabrick.com/labz/reflex/tuto/reflexTuto2.zip">Les sources de cette exemple</a></strong></p>
<p>Et voilà ! Je vais préparer d&#8217;autres articles, notemment l&#8217;intégration de Reflex dans un projet Gumbo/Flex4. N&#8217;hésitez pas à poster vos retours, c&#8217;est en flexant qu&#8217;on devient flexeron.Autres articles sur le même sujet
<ul>
<li><a href="http://www.lafabrick.com/blog/2007/10/03/256-titre/" rel="bookmark" title="3 octobre 2007">Utiliser Cairngorm dans un projet Flex / AMFPHP</a></li>
<li><a href="http://www.lafabrick.com/blog/2008/06/06/327-google-language-api-flex/" rel="bookmark" title="6 juin 2008">Google AJAX Language API&#8230; et ton Flex devient polyglotte !</a></li>
<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/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>
</ul>
<p><!-- Similar Posts took 13.739 ms --></p>
]]></content:encoded>
			<wfw:commentRss>http://www.lafabrick.com/blog/2009/01/15/819-reflex-2-vous-reprendez-bien-un-peu-de-ioc/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Reflex #1: une micro-architecture pour Flex&#8230; simple !</title>
		<link>http://www.lafabrick.com/blog/2009/01/13/786-reflex-1-une-micro-architecture-pour-flex-simple/</link>
		<comments>http://www.lafabrick.com/blog/2009/01/13/786-reflex-1-une-micro-architecture-pour-flex-simple/#comments</comments>
		<pubDate>Mon, 12 Jan 2009 23:05:01 +0000</pubDate>
		<dc:creator>Fabien</dc:creator>
				<category><![CDATA[La Fabrick]]></category>
		<category><![CDATA[Nos projets]]></category>
		<category><![CDATA[[Dev] Flash / Flex / AIR...]]></category>
		<category><![CDATA[architecture]]></category>
		<category><![CDATA[Flex]]></category>
		<category><![CDATA[MVC]]></category>
		<category><![CDATA[Tutoriels]]></category>

		<guid isPermaLink="false">http://www.lafabrick.com/blog/?p=786</guid>
		<description><![CDATA[Après un temps de test, de mise en place et re-factorisation en tout genre, j’ai décidé de partager la petite micro-architecture que j’ai mis en place à l’université, et que j’utilise dans mes projets. Let&#8217;s gamble ! Encore un MVC ? Oui. Plus sérieusement, l’écriture de cette micro-architecture est partie d’un besoin de simplicité et [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://www.lafabrick.com/labz/reflex/images/reflexImgTuto1.jpg" alt="reflex image tut 1" title="reflex image tut 1" width="520" height="220" class="aligncenter size-full wp-image-915" /><br />
Après un temps de test, de mise en place et re-factorisation en tout genre, j’ai décidé de partager la petite micro-architecture que j’ai mis en place à l’université, et que j’utilise dans mes projets.</p>
<p><strong>Let&#8217;s gamble !</strong><br />
<span id="more-786"></span></p>
<h3><strong>Encore un MVC ?</strong></h3>
<p>Oui.<br />
Plus sérieusement, l’écriture de cette micro-architecture est partie d’un besoin de simplicité et de robustesse.</p>
<p>Souvent dans le monde de Flex, les équipes ne sont pas forcement homogènes. Certains sont habitués à la rigueur de Java, d’autres sont plus “devsigners freestyle” venant du monde Flash. Les premiers aiment les grosses mécaniques comme <a href="http://puremvc.org/">PureMVC</a>, ou <a href="http://www.pranaframework.org/">Prana Framework</a> “Spring like”. Les seconds connaissent au mieux <a href="http://opensource.adobe.com/wiki/display/cairngorm/Cairngorm">Cairngorm</a>, au pire confondent <a href="http://en.wikipedia.org/wiki/Model-view-controller">MVC</a> et <a href="http://fr.wikipedia.org/wiki/Ventilation_m%C3%A9canique_contr%C3%B4l%C3%A9e">VMC</a> &#8211; ce qui n’a rien a voir, sauf si vous faites une application riche sur le thème de la ventilation.<br />
Il fallait donc trouver la solution la plus efficace pour avoir un flux de production  le plus optimal.</p>
<p>Bon vous me direz “ba Cairngorm c’est pas mal” ! Oui mais voilà. Cairngorm est plus une ligne de conduite qu’une micro-architecture. Il suffit en gros de suivre les interfaces et d’écrire son MVC. C’est simple, mais pourquoi diable utiliser ces #?~! d’événements synchrones pour déclencher des commandes ! Et il devient assez pénible de dupliquer le travail déjà fait côté serveur&#8230; sans compter le temps de compilation à rallonge. C’est rigolo pour se faire les dents, mais au bout d’un moment faut être sérieux.</p>
<p>Donc Reflex.</p>
<h3><strong>Le MVC en 2 mots</strong></h3>
<p>MVC, pour Model View Controller, est le design pattern le plus connu. Le but de ce pattern est de décomposer la représentation graphique (la vue), la couche métier et le modèle de données.</p>
<p>Le modèle MVC de Reflex peut se visualiser comme suit :</p>
<p><img src="http://www.lafabrick.com/labz/reflex/images/MVCReflex.png" alt="MVC architecture" /></p>
<ul>
<li>La vue demande au contrôleur la récupération de données.</li>
<li>Le contrôleur lance la méthode avec les arguments associés, et capte les retours du serveur.</li>
<li>À la réception des données, le contrôleur met à jour le modèle de données.</li>
<li>Le modèle notifie à la vue son changement et la met à jour.</li>
</ul>
<h3><strong>Préparation de votre projet d’exemple</strong></h3>
<p><b><a href="http://www.lafabrick.com/blog/reflex/">Une page de ressources pour Reflex</a> est disponible sur le Blog.</b></p>
<p>Commencez par récupérer <a href=" http://www.lafabrick.com/labz/reflex/bin/reflex.swc">le swc reflex</a>.<br />
<a href="http://www.lafabrick.com/labz/reflex/source/reflex-src.zip">Les sources</a>, et <a href="http://www.lafabrick.com/labz/reflex/apidoc/">la documentation</a> sont aussi disponibles en lignes. </p>
<p>Pour cette exemple, nous allons utiliser un petit service Java. Je vous laisse <a href="http://www.lafabrick.com/labz/reflex/tuto/reflexTuto1.zip">télécharger le projet d’exemple “reflexTuto1”</a>, et regarder :</p>
<ul>
<li>le répertoire “java” : les sources Java ( UserDo : l’object de donnée, UserDs : la couche métier ).</li>
<li>Les fichiers de configuration dans le répertoire <strong>WebContent/WEB-INF/flex/remoting-config.xml</strong> : la configuration des services distants.</li>
</ul>
<p>Pour cette exemple vous aurez besoin d&#8217;un environnement Flex avec les WTP installés ainsi qu&#8217;un serveur Tomcat (pour lancer les exemples).</p>
<p>Petit rappel : </p>
<ul>
<li>
<strong>Pour installer les WPT</strong> ( qui vous donne accès à la perspective J2EE et à la vue server) :</p>
<ul>
<li>Ouvrez le menu <strong>Help > Software updates > Find and install…</strong></li>
<li>Faites “<strong>Search new features to install</strong>”</li>
<li>Dans la fenêtre qui apparaît, cochez “<strong>Europa Discovery Site</strong>”</li>
<li>Cliquez sur “<strong>Finish</strong>”</li>
<li>La recherche de plugins commence. Vous devrez choisir votre miroir. La fenêtre de résultats s’affiche. Déployez “<strong>Europa Update Site</strong>” et cochez “<strong>Web and J2EE Development</strong>”</li>
<li>Cliquez sur le bouton “<strong>Select Required</strong>”</li>
<li>Faites “<strong>Next</strong>”</li>
<li>Cochez <strong>“I accept…</strong>”</li>
<li>Faites “<strong>Next</strong>” de nouveau</li>
<li>Faites “<strong>Finish</strong>”</li>
</ul>
</li>
<li>
<strong>Pour installer un serveur TOMCAT</strong></p>
<ul>
<li>Téléchargez un <a href="http://apache.cict.fr/tomcat/tomcat-6/v6.0.18/bin/apache-tomcat-6.0.18.zip">Tomcat 6</a></li>
<li>Décompressez l&#8217;archive dans le répertoire de votre choix</li>
<li>Vous devez configurer votre serveur dans Flex à partir de la vue Server : &laquo;&nbsp;<strong>Windows > Other View&#8230;</strong>&nbsp;&raquo; puis &laquo;&nbsp;<strong>Servers</strong>&laquo;&nbsp;</li>
<li>Un fois configuré (clic droit dans la vue servers et &laquo;&nbsp;<strong>New&#8230;</strong>&laquo;&nbsp;), n&#8217;oubliez pas d&#8217;ajouter votre projet sur votre serveur ! (clic droit dans la vue servers et &laquo;&nbsp;<strong>Add and remove projects&#8230;</strong>&laquo;&nbsp;)</li>
</ul>
</li>
</ul>
<h3><strong>Au départ : un service et un objet de données</strong></h3>
<p>Tout d’abord nous devons représenter l’objet de données du serveur dans votre projet.</p>
<p>L’objectif est d’avoir une image identique des données côté serveur et côté Flex, afin que les 2 parties “parlent la même langue” : cette classe contient une référence vers son “image” côté serveur.</p>
<pre class="brush: js">
package dataObject
{

	[Bindable]
	[RemoteClass(alias=&quot;User.UserDo&quot;)]
	public class UserDo
	{
		public function UserDo()
		{
		}

		public var login:String;
		public var name:String;

	}
}
</pre>
<p>Nous voulons discuter avec la couche server : nous allons donc utiliser un service de type <strong><a href="http://livedocs.adobe.com/flex/3/langref/mx/rpc/remoting/mxml/RemoteObject.html">RemoteObject</a></strong>, faisant référence à notre couche serveur, défini dans le fichier <strong>remoting-config.xml</strong>.</p>
<pre class="brush: xml">
&lt;mx:RemoteObject
	id=&quot;remoteUser&quot;
	destination=&quot;javaFacadeUser&quot;
	showBusyCursor=&quot;true&quot; /&gt;;
</pre>
<h3><strong>Le Modèle</strong></h3>
<p>Le modèle est notre réceptacle de données.<br />
Cette classe étend <a href="http://www.lafabrick.com/labz/reflex/apidoc/com/lafabrick/reflex/model/BaseModel.html">BaseModel</a>, qui permet l’enregistrement automatique du modèle dans le <a href="http://www.lafabrick.com/labz/reflex/apidoc/com/lafabrick/reflex/model/ModelLocator.html">ModelLocator</a>.<br />
C’est lui qui sera mis à jour par le <strong>contrôleur</strong>, et qui, via le tag <strong>[Bindable]</strong>, mettra a jour là vue. Dans notre exemple nous allons stocker le UserDo, résultant de la requête serveur login().</p>
<pre class="brush: js">
package model
{
	import com.lafabrick.reflex.model.BaseModel;

	import dataObject.UserDo;

	public class UserModel extends BaseModel
	{
		[Bindable]
		public var userLogged:UserDo;

	}
}
</pre>
<h3><strong>Le Contrôleur</strong></h3>
<p>C’est l’intelligence du système. C’est lui qui invoque le service, récupère et met à jour les données.</p>
<pre class="brush: js">
package controller
{
	import com.lafabrick.reflex.controller.BaseController;
	import com.lafabrick.reflex.model.ModelLocator;

	import dataObject.UserDo;

	import model.UserModel;

	import mx.rpc.events.FaultEvent;
	import mx.rpc.events.ResultEvent;

	public class UserController extends BaseController
	{

		public function login( log:String, pass:String ) : void
		{
			executeMethod( &quot;login&quot;, onLoginResult, onLoginFault, log, pass);
		}

		public function onLoginResult( event:ResultEvent ) : void
		{
			(ModelLocator.getModel( UserModel ) as UserModel).userLogged =
				event.result as UserDo;
		}

		public function onLoginFault( event:FaultEvent ) : void
		{
			trace(&quot;Bad result ...&quot;+event.fault);
		}
	}
}
</pre>
<ul>
<li>Cette classe étend <a href="http://www.lafabrick.com/labz/reflex/apidoc/com/lafabrick/reflex/controller/BaseController.html">BaseController</a>, qui permet l’enregistrement automatique du contrôleur dans le <a href="http://www.lafabrick.com/labz/reflex/apidoc/com/lafabrick/reflex/controller/ControllerLocator.html">ControllerLocator</a>.</li>
<li> La méthode <strong>login()</strong> contient la mécanique de déclenchement du <strong>service</strong> (méthode de BaseController). La méthode <strong>executeMethod</strong> est définie par les propriétés suivantes :
<ul>
<li><strong><em>method:String</em></strong> : le nom de la méthode ( “login” ),</li>
<li><strong><em>resultFunction:Function</em></strong> : la fonction déclenchée lorsque le serveur renvoie un résultat (onLoginResult)</li>
<li><strong><em>faultFunction:Function = null</em></strong> : la fonction déclenchée lorsque le serveur renvoie une faute (onLoginFault)</li>
<li><strong><em>&#8230; args</em></strong> : tous les arguments à passer à la méthode distante&#8230;</li>
</ul>
</li>
<li>Le modèle est mis à jour dans le fonction de résultat. Pour récupérer l’instance du modèle, il suffit d’utiliser le <a href="http://www.lafabrick.com/labz/reflex/apidoc/com/lafabrick/reflex/model/ModelLocator.html">ModelLocator</a> :
<pre class="brush: xml">
// Renvoie l&#039;instance UserModel enregistré dans ModelLocator
trace( ( ModelLocator.getModel( UserModel ) as UserModel ) );
</pre>
</li>
</ul>
<p><span style="color: #800000;"><br />
<b>NOTE</b> : les “locator” <b>ModelLocator</b> et <b>ControllerLocator</b> n’enregistrent qu’une et une seul instance d’un même modèle / contrôleur. Si deux instances d’un même modèle / contrôleur sont déclarées, une erreur <a href="http://www.lafabrick.com/labz/reflex/apidoc/com/lafabrick/reflex/ReflexError.html">ReflexError</a> est levée. Les classes étendant <b>BaseController</b> et <b>BaseModel</b> sont automatiquement référencées dans <b>ModelLocator</b> et <b>ControllerLocator</b>.<br />
</span></p>
<h3><strong>La Vue</strong></h3>
<p>Construisons maintenant notre vue.</p>
<pre class="brush: xml">
&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;&gt;
&lt;mx:Application
	xmlns:mx=&quot;http://www.adobe.com/2006/mxml&quot;
	layout=&quot;absolute&quot;
	xmlns:controller=&quot;controller.*&quot;
	xmlns:model=&quot;model.*&quot;&gt;

&lt;mx:RemoteObject
	id=&quot;remoteUser&quot;;
	destination=&quot;javaFacadeUser&quot;;
	showBusyCursor=&quot;true&quot; /&gt;

	&lt;controller:UserController id=&quot;userControl&quot; service=&quot;{remoteUser}&quot; /&gt;

	&lt;model:UserModel id=&quot;userModel&quot; /&gt;

	&lt;mx:VBox&gt;
		&lt;mx:TextInput id=&quot;login&quot; /&gt;
		&lt;mx:TextInput id=&quot;password&quot; displayAsPassword=&quot;true&quot; /&gt;

		&lt;mx:Button label=&quot;connect&quot;
			click=&quot;{userControl.login( login.text, password.text )}&quot; /&gt;

		&lt;mx:Label x=&quot;208&quot; y=&quot;44&quot;
			text=&quot;User Name : {userModel.userLogged.name}&quot;/&gt;;
	&lt;/mx:VBox&gt;

&lt;/mx:Application&gt;
</pre>
<ul>
<li>Nous créons une instance RemoteObject permettant de pointer sur le service côté serveur. La propriété <em>destination</em> est l’identifiant du service dans le fichier <strong>remoting-config.xml</strong>.</li>
<li>Nous créons une instance de <b>UserController</b>, avec comme propriété <em>service</em> l’identifiant du RemoteObject “<strong>remoteUser</strong>”.</li>
<li>De la même manière, nous créons l’instance du modèle UserModel.</li>
<li>Au final, la vue appel la méthode <strong>login()</strong> du contrôleur, qui se charge d’envoyer et de réceptionner les données au serveur. Au retour, le contrôleur met à jour le modèle, en “poussant” le UserDo provenant du serveur. La vue est automatiquement mise à jour via le principe de Binding des données.</li>
</ul>
<p><b><a href="http://www.lafabrick.com/labz/reflex/tuto/reflexTuto1.zip">Les sources de cette exemple</a></b></p>
<h3><strong>Conclusion</strong></h3>
<p>Reflex n’a pas la prétention de concurrencer des architectures reconnues comme <a href="http://puremvc.org/">PureMVC</a> ou <a href="http://mate.asfusion.com/">MATE</a>. L’objectif, vous l’aurez compris, est d’aller à l’essentiel, sans se perdre dans la forêt des Design Pattern,  pour une productivité la plus efficace possible. A vous d’implémenter cette architecture selon vos besoins.</p>
<p>Le prochain tutoriel ira un peu plus loin dans cette micro-architecture : comment mieux découper son projet, et comment associer un fichier de configuration XML externe (<a href="http://www.lafabrick.com/labz/reflex/apidoc/com/lafabrick/reflex/ioc/package-detail.html">package IOC</a>).</p>
<p>J’attends vos retours !Autres articles sur le même sujet
<ul>
<li><a href="http://www.lafabrick.com/blog/2007/10/03/256-titre/" rel="bookmark" title="3 octobre 2007">Utiliser Cairngorm dans un projet Flex / AMFPHP</a></li>
<li><a href="http://www.lafabrick.com/blog/2008/06/06/327-google-language-api-flex/" rel="bookmark" title="6 juin 2008">Google AJAX Language API&#8230; et ton Flex devient polyglotte !</a></li>
<li><a href="http://www.lafabrick.com/blog/2009/01/15/819-reflex-2-vous-reprendez-bien-un-peu-de-ioc/" rel="bookmark" title="15 janvier 2009">Reflex #2 : vous reprendrez bien un peu de IOC ?</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>
</ul>
<p><!-- Similar Posts took 14.335 ms --></p>
]]></content:encoded>
			<wfw:commentRss>http://www.lafabrick.com/blog/2009/01/13/786-reflex-1-une-micro-architecture-pour-flex-simple/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
	</channel>
</rss>

