<?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>DEJA-VUE.NET &#187; Pixlib</title>
	<atom:link href="http://www.deja-vue.net/blog/category/pixlib/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.deja-vue.net/blog</link>
	<description>Michael Barbero - Application Architect (Web/ Desktop/ Mobile), Adobe Flash/ AIR Expert, ActionScript, Java, Haxe, JavaScript...</description>
	<lastBuildDate>Sat, 24 Sep 2011 06:43:41 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.1</generator>
		<item>
		<title>CD On Demand &#8211; Adobe Site of the Day Award !</title>
		<link>http://www.deja-vue.net/blog/2010/05/04/cd-on-demand-adobe-site-of-the-day-award-winner/</link>
		<comments>http://www.deja-vue.net/blog/2010/05/04/cd-on-demand-adobe-site-of-the-day-award-winner/#comments</comments>
		<pubDate>Tue, 04 May 2010 08:01:13 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Palmer]]></category>
		<category><![CDATA[Pixlib]]></category>
		<category><![CDATA[RIA]]></category>
		<category><![CDATA[Adobe]]></category>
		<category><![CDATA[Award]]></category>

		<guid isPermaLink="false">http://www.deja-vue.net/blog/fr/?p=500</guid>
		<description><![CDATA[<p>Posted in <a href="http://www.deja-vue.net/blog/category/palmer/" title="Palmer">Palmer</a><a href="http://www.deja-vue.net/blog/category/pixlib/" title="Pixlib">Pixlib</a><a href="http://www.deja-vue.net/blog/category/ria/" title="RIA">RIA</a></p>La plate-forme OnDemand de David Guetta (projet co développé avec Romain Ecarnot pour la partie Actionscript 3 pour BB&#038;PP), vient de se voir décerner le « Adobe Site of the Day Award » ! C’est pas qu’on serait content… mais presque A noter… c’est le premier Adobe Award made with Pixlib… et c’est pas fini [...]]]></description>
			<content:encoded><![CDATA[<blockquote><p>
La plate-forme OnDemand de David Guetta (projet co développé avec <a href="http://blog.customactions.net/2010/05/adobe-site-of-the-day-award-winner">Romain Ecarnot</a> pour la partie Actionscript 3 pour <a href="http://www.bb-pp.fr/">BB&#038;PP</a>), vient de se voir décerner le « <a href="http://www.adobe.com/cfusion/showcase/index.cfm?event=sotdarchive&#038;year=2010&#038;month=5&#038;loc=en_us">Adobe Site of the Day Award</a> » !<br />
C’est pas qu’on serait content… mais presque<br />
A noter… c’est le premier Adobe Award made with Pixlib… et c’est pas fini </p></blockquote>
<p><strong></strong></p>
<p style="text-align: center;"><object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="500" height="387" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="data" value="http://www.vimeo.com/moogaloop.swf?clip_id=11547136&amp;server=www.vimeo.com&amp;fullscreen=1&amp;show_title=1&amp;show_byline=1&amp;show_portrait=1&amp;color=00adef" /><param name="quality" value="best" /><param name="scale" value="showAll" /><param name="allowfullscreen" value="true" /><param name="wmode" value="transparent" /><param name="src" value="http://www.vimeo.com/moogaloop.swf?clip_id=11547136&amp;server=www.vimeo.com&amp;fullscreen=1&amp;show_title=1&amp;show_byline=1&amp;show_portrait=1&amp;color=00adef" /><embed type="application/x-shockwave-flash" width="500" height="387" src="http://www.vimeo.com/moogaloop.swf?clip_id=11547136&amp;server=www.vimeo.com&amp;fullscreen=1&amp;show_title=1&amp;show_byline=1&amp;show_portrait=1&amp;color=00adef" wmode="transparent" allowfullscreen="true" scale="showAll" quality="best" data="http://www.vimeo.com/moogaloop.swf?clip_id=11547136&amp;server=www.vimeo.com&amp;fullscreen=1&amp;show_title=1&amp;show_byline=1&amp;show_portrait=1&amp;color=00adef"></embed></object></p>
<p><strong></strong></p>
<div style="text-align: center;">
<a href="http://www.adobe.com/cfusion/showcase/index.cfm?event=sotdarchive&#038;year=2010&#038;month=5&#038;loc=en_us"><img src="http://www.deja-vue.net/blog/wp-content/uploads/2010/05/site_of_the_day_guetta.jpg" alt="" title="" width="480" height="350" class="aligncenter size-full wp-image-554" style="border-width: 0px;"/></a></div>
<p><strong></strong></p>
<p><strong></strong></p>
<p><strong></strong></p>
<p><a href="http://www.deja-vue.net/blog/fr/2010/02/19/cd-on-demand-on-demand-business-ria-made-in-palmer/">>> CD On Demand – On Demand Business RIA made in Pixlib (PalmER Edition)</a><br />
<a href="http://www.deja-vue.net/blog/2008/08/04/invasion-by-joachim-garraud-make-your-own-cd-flash-ria-made-in-pixlib/">>> Invasion by Joachim Garraud: E-Business Flash RIA made in Pixlib</a></p>
<p><strong></strong></p>
]]></content:encoded>
			<wfw:commentRss>http://www.deja-vue.net/blog/2010/05/04/cd-on-demand-adobe-site-of-the-day-award-winner/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Workshops – Méthodologie de développement IoC made in Pixlib, de LowRA à PalmER</title>
		<link>http://www.deja-vue.net/blog/2010/03/17/workshops-methodologie-de-developpement-ioc-made-in-pixlib-de-lowra-a-palmer/</link>
		<comments>http://www.deja-vue.net/blog/2010/03/17/workshops-methodologie-de-developpement-ioc-made-in-pixlib-de-lowra-a-palmer/#comments</comments>
		<pubDate>Wed, 17 Mar 2010 13:28:29 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Application Architecture]]></category>
		<category><![CDATA[AS3]]></category>
		<category><![CDATA[Design Patterns]]></category>
		<category><![CDATA[FDT]]></category>
		<category><![CDATA[Framework]]></category>
		<category><![CDATA[IoC]]></category>
		<category><![CDATA[LowRA]]></category>
		<category><![CDATA[Palmer]]></category>
		<category><![CDATA[Pixlib]]></category>
		<category><![CDATA[architecture]]></category>
		<category><![CDATA[workflow]]></category>
		<category><![CDATA[Workshop]]></category>

		<guid isPermaLink="false">http://www.deja-vue.net/blog/?p=325</guid>
		<description><![CDATA[<p>Posted in <a href="http://www.deja-vue.net/blog/category/application-architecture/" title="Application Architecture">Application Architecture</a><a href="http://www.deja-vue.net/blog/category/as3/" title="AS3">AS3</a><a href="http://www.deja-vue.net/blog/category/design-patterns/" title="Design Patterns">Design Patterns</a><a href="http://www.deja-vue.net/blog/category/fdt/" title="FDT">FDT</a><a href="http://www.deja-vue.net/blog/category/framework/" title="Framework">Framework</a><a href="http://www.deja-vue.net/blog/category/ioc/" title="IoC">IoC</a><a href="http://www.deja-vue.net/blog/category/lowra/" title="LowRA">LowRA</a><a href="http://www.deja-vue.net/blog/category/palmer/" title="Palmer">Palmer</a><a href="http://www.deja-vue.net/blog/category/pixlib/" title="Pixlib">Pixlib</a></p>Je vous annonce une série de Workshop (de programme identique) consacrée à la méthodologie du développement IoC made in pixlib *. Les sessions auront lieu les Samedis 1, 8, 15 et 29 du mois de Mai. Ces sessions de travail sont destinées aux développeurs AS3 débutants ou déjà familiarisés avec LowRA ou PalmER souhaitant maitriser [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">Je vous annonce une série de Workshop (de programme identique) consacrée à la méthodologie du développement IoC made in pixlib *. Les sessions auront lieu les Samedis 1, 8, 15 et 29 du mois de Mai.</p>
<p style="text-align: justify;">Ces sessions de travail sont destinées aux développeurs AS3 débutants ou déjà familiarisés avec <a href="http://code.google.com/p/lowra/">LowRA</a> ou <a href="http://code.google.com/p/palmer/">PalmER</a> souhaitant maitriser le développement IoC.</p>
<p style="text-align: justify;">Ce workshop se veut agnostique quant aux branches existantes (<a href="http://code.google.com/p/lowra/">LowRA</a> AS3/FP9 et <a href="http://code.google.com/p/palmer/">Palmer</a> AS3/FP10). J’insiste bien sur ce point, le workshop ne portera pas sur l’étude de telle ou telle partie concrète de l’API. Il s&#8217;agira de vivre la construction d’une application Pixlib et d&#8217;assimiler la technique du développement IoC.</p>
<p><span id="more-325"></span>Les thèmes abordés seront les suivants:</p>
<blockquote><p>- système événementiel et architecture MVC/ IoC<br />
- structure d&#8217;une application IoC et communication entre les plugins<br />
- création et déploiement de plugins (tâches Ant et compilations MXMLC)<br />
- point de montage IoC avec le(s) context.xml (structure et principes de configuration)</p></blockquote>
<p style="padding-left: 180px; text-align: justify;">
<p style="text-align: justify;">A l’issue de cette journée vous aurez appris à systématiser la création de projets pixlib et serez à même de développer une application IoC. Vous aurez acquis la méthodologie et les techniques qui vous permettront de vous engager dans des créations évolutives et des développements collaboratifs.</p>
<blockquote><p>Tarif/personne: 400€ HT<br />
Horaires : 10h30 -13H00, 14h-18h00 (horaires permettant un aller-retour dans la journée)<br />
Date : 1, 8, 15 et 29 du mois de Mai<br />
Lieu : Nantes<br />
Nombre de participants : 2>5<br />
Niveau requis: pratique de l&#8217;AS3, expérience en POO/ MVC</p></blockquote>
<p>Si vous êtes intéressé, merci de retourner ce <a href="http://www.deja-vue.net/blog_uploads/doc/formulaire_workshop_LP.doc">formulaire d&#8217;inscription</a> rempli.</p>
<p>* pixlib est le domaine qui rassemblera prochainement les différentes branches du Framework</p>
]]></content:encoded>
			<wfw:commentRss>http://www.deja-vue.net/blog/2010/03/17/workshops-methodologie-de-developpement-ioc-made-in-pixlib-de-lowra-a-palmer/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>CD On Demand &#8211; On Demand Business RIA made in Pixlib (PalmER Edition)</title>
		<link>http://www.deja-vue.net/blog/2010/02/19/cd-on-demand-on-demand-business-ria-made-in-palmer/</link>
		<comments>http://www.deja-vue.net/blog/2010/02/19/cd-on-demand-on-demand-business-ria-made-in-palmer/#comments</comments>
		<pubDate>Fri, 19 Feb 2010 16:00:39 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[IoC]]></category>
		<category><![CDATA[Palmer]]></category>
		<category><![CDATA[Pixlib]]></category>
		<category><![CDATA[RIA]]></category>
		<category><![CDATA[Business RIA]]></category>

		<guid isPermaLink="false">http://www.deja-vue.net/blog/?p=68</guid>
		<description><![CDATA[<p>Posted in <a href="http://www.deja-vue.net/blog/category/ioc/" title="IoC">IoC</a><a href="http://www.deja-vue.net/blog/category/palmer/" title="Palmer">Palmer</a><a href="http://www.deja-vue.net/blog/category/pixlib/" title="Pixlib">Pixlib</a><a href="http://www.deja-vue.net/blog/category/ria/" title="RIA">RIA</a></p>L’offre CD On Demand La plateforme CD On Demand est un projet pionner initié par Joachim Garraud où « L’artiste invite ses fans à découvrir sur son site une offre de CD à la demande. A partir d’une playlist non exhaustive le client choisie ses chansons préférées et peut créer sa propre compilation qui lui [...]]]></description>
			<content:encoded><![CDATA[<div style="text-align: center;"></div>
<p style="text-align: center;"><object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="500" height="387" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="data" value="http://www.vimeo.com/moogaloop.swf?clip_id=9933211&amp;server=www.vimeo.com&amp;fullscreen=1&amp;show_title=1&amp;show_byline=1&amp;show_portrait=1&amp;color=00adef" /><param name="quality" value="best" /><param name="scale" value="showAll" /><param name="allowfullscreen" value="true" /><param name="wmode" value="transparent" /><param name="src" value="http://www.vimeo.com/moogaloop.swf?clip_id=9933211&amp;server=www.vimeo.com&amp;fullscreen=1&amp;show_title=1&amp;show_byline=1&amp;show_portrait=1&amp;color=00adef" /><embed type="application/x-shockwave-flash" width="500" height="387" src="http://www.vimeo.com/moogaloop.swf?clip_id=9933211&amp;server=www.vimeo.com&amp;fullscreen=1&amp;show_title=1&amp;show_byline=1&amp;show_portrait=1&amp;color=00adef" wmode="transparent" allowfullscreen="true" scale="showAll" quality="best" data="http://www.vimeo.com/moogaloop.swf?clip_id=9933211&amp;server=www.vimeo.com&amp;fullscreen=1&amp;show_title=1&amp;show_byline=1&amp;show_portrait=1&amp;color=00adef"></embed></object></p>
<p><!--[vimeo 9933211]--></p>
<p><strong>L’offre CD On Demand</strong></p>
<p style="text-align: justify;">La plateforme CD On Demand est un <a href="http://www.deja-vue.net/blog/2008/08/04/invasion-by-joachim-garraud-make-your-own-cd-flash-ria-made-in-pixlib/">projet pionner</a> initié par <a href="http://www.joachimgarraud.com/">Joachim Garraud</a> où « L’artiste invite ses fans à découvrir sur son site une offre de CD à la demande. A partir d’une playlist non exhaustive le client choisie ses chansons préférées et peut créer sa propre compilation qui lui est envoyé chez lui. La compilation est complètement personnalisable, depuis le matériaux du CD au packaging en passant par la sélection du artwork et du livret. Les CD sont pressés, imprimés, packagés et envoyés en moins de 72 heures. »</p>
<p style="text-align: justify;">Mon employeur <a href="http://www.bb-pp.fr/fr/">BB&amp;PP</a>, créateur de solution professionnelle de vente de musique en ligne, toujours en partenariat avec <a href="http://www.mpo-international.com/">MPO international</a>, spécialiste de la distribution de contenus via des supports physiques et numériques, décida l’an dernier d’aller encore plus loin dans la démarche en proposant une plateforme vraiment générique, dédiée non seulement aux artistes mais aussi aux labels et permettant de s’adapter à l’univers et aux spécificités de chaque client à partir de l’offre de base que constituent la conception d’un CD et le download de Digital.</p>
<p><span id="more-68"></span></p>
<p><strong>Palmer, IoC, Ant &amp; Co</strong></p>
<p style="text-align: justify;">Avec un roadmap très riche et s&#8217;étalant sur plusieurs années il était très clair dès le départ que parmi les objectifs primordiaux figurait le développement d’une architecture pérenne et évolutive et la mise en place d’une solide solution de déploiement.</p>
<p style="text-align: justify;">L’applicatif a donc été complètement réécrit avec « <a href="http://code.google.com/p/palmer/">Palmer</a> » le dernier né des frameworks de la famille Pixlib. Un développement bicéphale assuré par <a href="http://blog.customactions.net/2010/04/joachim-garraud-ondemand-2/">Romain Ecarnot</a> et <a href="http://www.deja-vue.net">moi-même</a>.</p>
<p style="text-align: justify;">Grâce à son architecture-workflow <a href="http://fr.wikipedia.org/wiki/Inversion_de_controle">IoC</a> made in <a href="http://code.google.com/p/palmer/">Palmer</a>, CD On Demand est en mesure d’offrir des possibilités de personnalisation par client vraiment très poussées allant de la sélection des modules (produit CD, produit Digital, panier d&#8217;achat, profil utilisateur&#8230;) à la configuration de l&#8217;intégration (polices de caractères, bitmaps, CSS) jusqu&#8217;à la définition-inclusion des états de l&#8217;application (<a href="http://en.wikipedia.org/wiki/Strategy_pattern">Strategy pattern</a>).</p>
<p style="text-align: justify;">Plus globalement l’implémentation <a href="http://fr.wikipedia.org/wiki/Inversion_de_controle">IoC</a> de <a href="http://code.google.com/p/palmer/">Palmer</a> nous aura permis d’aller vraiment extrêmement loin (aussi loin que le développeur puisse aller dans sa réflexion finalement) et à titre d&#8217;illustration je pourrai citer la possibilité de générer dynamiquement des formulaires ou encore de mettre en place un système de localisation double à la fois commun à l&#8217;application mais aussi propre à chaque modules.</p>
<p><strong>Optimisation et Performance</strong></p>
<p style="text-align: justify;">Plus que jamais, et surtout par les temps qui courent, il est vital d’offrir la meilleure expérience utilisateur possible, entendons une <a href="http://en.wikipedia.org/wiki/Rich_Internet_application">RIA</a> qualitativement performante. Un intérêt tout particulier (et somme toute bien normal) a donc été porté aux problématiques de performance et d’optimisation.</p>
<p style="text-align: justify;">Concernant la programmation proprement dite nous avons été très attentif aux coûts de consommation des ressources processeur et mémoire. Soit dit en passant la considération de la performance « va normalement de soi » car elle jalonne tous les aspects ou phases d’un développement &#8211; de la conception (architecture), à l’implémentation (maîtrise de l’api, choix des librairies) jusqu’au debuggage (logging, profiling).</p>
<p style="text-align: justify;">Parmi les bonnes pratiques de programmation à retenir nous avons eu recours au mécanisme de l’object pooling afin de stabiliser la consommation mémoire fortement sollicitée par des objets qui normalement sont très fréquemment détruits et recrées (des cellRenderers majoritairement)</p>
<p style="text-align: justify;">Je ne peux m’empêcher de saisir l’occasion afin évoquer mon vif intérêt pour l’alternative de gestion évènementielle proposée par <a href="http://www.robertpenner.com/flashblog/">Robert Penner</a> (<a href="http://code.google.com/p/as3-signals/">as3-signals</a>). Une solution dont les taux de performance m’amène sérieusement à reconsidérer la microarchitecture <a href="http://en.wikipedia.org/wiki/MVC">MVC</a> de certains modules&#8230;</p>
<p style="text-align: justify;">Mais l&#8217;optimisation ne se cantonne pas seulement au champ du développement. L’application se doit d&#8217; être accessible en un temps record. Nous nous sommes donc attachés à assurer un chargement initial optimum allant de l&#8217;exclusion des classes communes aux modules jusqu&#8217;au merging de requêtes <a href="http://en.wikipedia.org/wiki/Action_Message_Format">AMF</a>. Passé ce premier chargement l’application puise ensuite dans le cache du navigateur (sauf cas de mise à jour).</p>
<p><strong>Un mot sur le modèle économique du CD on Demand</strong></p>
<p style="text-align: justify;">A l’ère de l&#8217;économie numérique la fidélisation du client est une exigence de premier plan. Toute réussite est véritablement fonction de la qualité des échanges noués avec sa clientèle. Les décisions d&#8217;achat se prennent il est vrai plus facilement lorsque l’acheteur parvient à trouver rapidement un compromis entre coûts et gamme de produits. Il est donc primordial de lui offrir le plus de flexibilité et de choix possible.</p>
<p style="text-align: justify;">Le  cœur du concept du CD On demand est d’offrir à l’artiste ou au label un accès à un inventaire de produit physique virtuellement illimité et vendu à la demande. Un tel système présente des avantages évidents et exclusifs allant de la revalorisation de l’objet, au flux tendu et à la suppression des stocks et plus globalement donne accès à un service évolutif. La réussite d’un tel modèle économique provient finalement et assez logiquement du nouveau partage des revenus qu’il génère. Les artistes et labels peuvent vendre directement, sans passer par la lourde chaine de distribution qui enlève aux records une sérieuse marge sur les bénéfices. Ce faisant, voici un modèle où l’artiste peut s&#8217;il le souhaite se permettre de proposer des prix beaucoup plus concurrentiel.</p>
<p style="text-align: center;"><strong>Extrait de clients CD On Demand</strong></p>
<div style="text-align: center;">
<p><a href="http://shop.davidguetta.com/"><img class="aligncenter size-full wp-image-82" title="DAVID GUETTA" src="http://www.deja-vue.net/blog/wp-content/uploads/2010/02/david_guetta.jpg" alt="DAVID GUETTA" width="500" height="229" border=0/></a></p>
</div>
<div style="text-align: center;">
<p><a href="http://invasion.joachimgarraud.com/"><img class="aligncenter size-full wp-image-82" title="JOACHIM GARRAUD" src="http://www.deja-vue.net/blog/wp-content/uploads/2010/02/joachim_garraud.jpg" alt="JOACHIM GARRAUD" width="500" height="229" border=0/></a></p>
</div>
<div style="text-align: center;">
<p><a href="http://shop.twistmydj.com/"><img class="aligncenter size-full wp-image-82" title="Twist my Dj" src="http://www.deja-vue.net/blog/wp-content/uploads/2010/02/twistmydj.jpg" alt="Twist my Dj" width="500" height="229" border=0/></a></p>
</div>
<div style="text-align: center;">
<p><a href="http://shop.smooth.fr/"><img class="aligncenter size-full wp-image-80" title="Smooth" src="http://www.deja-vue.net/blog/wp-content/uploads/2010/02/smooth.jpg" alt="Smooth" width="500" height="229" border=0/></a></p>
</div>
<div style="text-align: center;">
<p><a href="http://boutique.gkoot.com/"><img class="aligncenter size-full wp-image-82" title="GKOOT ELECTRONIC" src="http://www.deja-vue.net/blog/wp-content/uploads/2010/02/gkoot.jpg" alt="GKOOT ELECTRONIC" width="500" height="229" border=0/></a></p>
</div>
<div style="text-align: center;">
<p><a href="http://www.timid-records.com/"><img class="aligncenter size-full wp-image-84" title="TIMID RECORDS" src="http://www.deja-vue.net/blog/wp-content/uploads/2010/02/timid-records.jpg" alt="TIMID RECORDS" width="500" height="229" border=0/></a></p>
</div>
<p><strong></strong></p>
<p><strong></strong></p>
]]></content:encoded>
			<wfw:commentRss>http://www.deja-vue.net/blog/2010/02/19/cd-on-demand-on-demand-business-ria-made-in-palmer/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>Invasion by Joachim Garraud: E-Business Flash RIA made in Pixlib</title>
		<link>http://www.deja-vue.net/blog/2008/08/04/invasion-by-joachim-garraud-make-your-own-cd-flash-ria-made-in-pixlib/</link>
		<comments>http://www.deja-vue.net/blog/2008/08/04/invasion-by-joachim-garraud-make-your-own-cd-flash-ria-made-in-pixlib/#comments</comments>
		<pubDate>Mon, 04 Aug 2008 09:37:45 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Featured]]></category>
		<category><![CDATA[Pixlib]]></category>
		<category><![CDATA[RIA]]></category>
		<category><![CDATA[Business RIA]]></category>

		<guid isPermaLink="false">http://www.deja-vue.net/blog/?p=40</guid>
		<description><![CDATA[<p>Posted in <a href="http://www.deja-vue.net/blog/category/featured/" title="Featured">Featured</a><a href="http://www.deja-vue.net/blog/category/pixlib/" title="Pixlib">Pixlib</a><a href="http://www.deja-vue.net/blog/category/ria/" title="RIA">RIA</a></p>[lang_fr] Permettez moi je vous présenter le dernier né des productions Flydesigners/ BB&#038;PP. La première plateforme offrant à l&#8217;internaute la possibilité de constituer sur mesure son propre album CD Joachim Garraud. http://invasion.joachimgarraud.com En effet, à l&#8217;occasion de la sortie de son premier album solo, Joachim Garraud a pris le parti d&#8217;assurer une distribution directe de [...]]]></description>
			<content:encoded><![CDATA[<p>[lang_fr]</p>
<p style="text-align: justify;">
Permettez moi je vous présenter le dernier né des productions <a href="http://www.flydesigners.com">Flydesigners</a>/ <a href="http://bb-pp.fr">BB&#038;PP.</a> La première plateforme offrant à l&#8217;internaute la possibilité de constituer sur mesure son propre album CD <a href="http://www.joachimgarraud.com/">Joachim Garraud</a>.</p>
<p><strong></strong></p>
<p style="text-align: center;"><a href="http://invasion.joachimgarraud.com"><img class="alignnone size-full wp-image-44 aligncenter" title="invasion2008" src="http://www.deja-vue.net/blog/wp-content/uploads/2008/08/invasion2008.jpg" alt="" width="480" height="285" /></a></p>
<p style="text-align: center;"><a href="http://invasion.joachimgarraud.com">http://invasion.joachimgarraud.com</a></p>
<p><strong></strong></p>
<p style="text-align: justify;">En effet, à l&#8217;occasion de la sortie de son premier album solo, Joachim Garraud a pris le parti d&#8217;assurer une distribution directe de plus 60 tracks éligibles à l&#8217;achat en format cd audio personnalisé et/ou téléchargement via une interface full-flash.</p>
<p>[/lang_fr]</p>
<p>[lang_en]</p>
<p style="text-align: justify;">Let me introduce the last born of Flydesigners Productions. The first online platform offering the user, better say the  fan, the possibility to personalize its own album from the original release.</p>
<p style="text-align: center;"><a href="http://invasion.joachimgarraud.com"><img class="alignnone size-full wp-image-44" title="invasion2008" src="http://www.deja-vue.net/blog/wp-content/uploads/2008/08/invasion2008.jpg" alt="" width="500" height="294" /></a></p>
<p>Indeed, on the release date of it&#8217;s first solo album, Joachim Garraud &#8211; french DJ &#8211; has decided to let the user choose the tracks he wants but also how the cd looks. A unique object delivered as desired. Also the user can buy and download the tracks recorded and produced in 96 Khz/ 24 bits at the same price as a MP3. <a href="http://invasion.joachimgarraud.com">http://invasion.joachimgarraud.com</a></p>
<p>[/lang_en]</p>
<p>[lang_es]</p>
<p style="text-align: justify;">Dejenme presentarles el ultimo nacido de las producciones flydesigners. La primera plataforma Internet que ofrece al usuario, mejor dicho al fan, la posibilidad de crear su propia version del ultimo album de Joachim Garraud.</p>
<p style="text-align: center;"><a href="http://invasion.joachimgarraud.com"><img class="alignnone size-full wp-image-44" title="invasion2008" src="http://www.deja-vue.net/blog/wp-content/uploads/2008/08/invasion2008.jpg" alt="" width="500" height="294" /></a></p>
<p>De hecho, a la salida de su primer album solo, joachim garraud &#8211; dj frances &#8211; ha apostado por asegurar una distribucion directa de mas de unas 60 pistas audio que se pueden eligir a la compra mediante una creacion personalizada del cd fisico y/o para descarga digital. <a href="http://invasion.joachimgarraud.com">http://invasion.joachimgarraud.com</a></p>
<p>[/lang_es]</p>
<p><span id="more-40"></span></p>
<p>[lang_fr]</p>
<p style="text-align: center;">
<object width="480" height="384"><param name="movie" value="http://www.dailymotion.com/swf/video/x6wtiq"></param><param name="allowFullScreen" value="true"></param><param name="allowScriptAccess" value="always"></param><embed type="application/x-shockwave-flash" src="http://www.dailymotion.com/swf/video/x6wtiq" width="480" height="384" allowfullscreen="true" allowscriptaccess="always"></embed></object><br /><b><a href="http://www.dailymotion.com/video/x6wtiq_joachim-garraud-cd-on-demand_music">Joachim Garraud CD on Demand</a></b><br /><i>envoy&eacute; par <a href="http://www.dailymotion.com/viva-musica">viva-musica</a>. &#8211; <a href="http://www.dailymotion.com/fr/channel/music">Regardez la derni&egrave;re s&eacute;lection musicale.</a></i>
</p>
<p style="text-align: center;">La genèse du concept de vente inédit imaginé et expliqué par Joachim Garraud</p>
<p style="text-align: justify;">Le cycle de vie de l&#8217;album Invasion 2008 s&#8217; affranchie complètement du modèle économique classique. La sortie et la disponibilité de l&#8217;oeuvre sont assurés par l&#8217;applicatif Flash, qui offre en outre, en exclusivité, des possibilités de personnalisation inédite. Un produit sur mesure, qui peut être acheté et expédié depuis n&#8217;importe quel pays dans le monde. L&#8217;application est accessible en Français, Espagnol et Anglais et fournie des tutoriaux vidéos disponibles en chacune de ses langues.</p>
<h5><strong><br />
</strong></h5>
<h3>Compétences et rôle de Flydesigners</h3>
<h5><strong><br />
</strong></h5>
<p style="text-align: justify;">Un concept novateur, un défi que nous avons choisi de relever et une aventure humaine à laquelle nous sommes heureux et fiers d&#8217;avoir participé! La tache était rude et le délai de livraison juste à point ^^.</p>
<p style="text-align: justify;">Notre rôle a été global. Réalisation de la maquette graphique, création du client Flash, création de l&#8217;applicatif serveur et back-office, mise en relation et coordination technique des prestataires tiers (banque, pressage cd), Communication avec des évenements qui n&#8217;ont pas manqué de scander le rythme du développement (conférences de presse, soirée Unighted au Stade de france&#8230;).</p>
<p style="text-align: justify;">En ce qui me concerne, ma plus grande satifaction provient de la collaboration étroite et soudée entre tous les membres de l&#8217;équipe Flydesigners. Je soulignerai en particulier la disponibilité extrêmement généreuse de mon comparse Benoit Guchet, développeur de <a href="http://www.bubblebeat.com">Bubblebeat.com</a>, première plateforme française de sélections electro pour professionnels et grand public.</p>
<h5><strong><br />
</strong></h5>
<h3>Programmation ActionScript</h3>
<h5><strong><br />
</strong></h5>
<p style="text-align: justify;">Nous avions 2 impératifs majeurs: livrer l&#8217;application à temps dans les bacs ^^ et assurer des déclinaisons potentielles compatibles avec la plateforme mobile. Le développement a donc été réalisé en ActionScript 2.0, s&#8217;appuyant sur le framework applicatif Pixlib et le framework de composants Adobe.</p>
<p style="text-align: justify;">Un seul composant a été utilisé. Le composant List doté de fonctionnalités Drag and Drop. Réutilisé en de multiples endroits (Tracklisting, Sélection CD, Sélection Digitals, Menus de préselections, Formulaires), il a tout naturellement été exploité comme librairie partagée afin de réduire les coûts de chargement. 2 skins visuels ont été utilisé.</p>
<p style="text-align: justify;">A noter également l&#8217;utilisation de Papervision en charge de la présentation 3D (Stack et Coverflow)</p>
<p style="text-align: justify;">Si vous ne connaissez pas encore Joachim Garraud, vous avez donc l&#8217;occasion d&#8217;écouter, télécharger et achetez la version qui vous correspond de son dernier album. <a href="http://invasion.joachimgarraud.com">http://invasion.joachimgarraud.com</a></p>
<p>[/lang_fr]</p>
<p>[lang_en]</p>
<h5><strong><br />
</strong></h5>
<p></strong></h5>
<p style="text-align: center;">
<object width="480" height="384"><param name="movie" value="http://www.dailymotion.com/swf/video/x6wtiq"></param><param name="allowFullScreen" value="true"></param><param name="allowScriptAccess" value="always"></param><embed type="application/x-shockwave-flash" src="http://www.dailymotion.com/swf/video/x6wtiq" width="480" height="384" allowfullscreen="true" allowscriptaccess="always"></embed></object><br /><b><a href="http://www.dailymotion.com/video/x6wtiq_joachim-garraud-cd-on-demand_music">Joachim Garraud CD on Demand</a></b><br /><i>envoy&eacute; par <a href="http://www.dailymotion.com/viva-musica">viva-musica</a>. &#8211; <a href="http://www.dailymotion.com/fr/channel/music">Regardez la derni&egrave;re s&eacute;lection musicale.</a></i>
</p>
<p style="text-align: center;">Genesis of this new online store concept imagined and explained by Joachim Garraud (english subtitled)</p>
</p>
<h5><strong><br />
</strong></h5>
<p>Invasion 2008 is itself its own music distribution system. Stock availability and release date of the album are only accessible through the Flash client Front-End.</p>
<p>The client comes into 3 language flavours : English, French and Spanish. Step by step video tutorials are availables for each of thoses languages</p>
<h5><strong><br />
</strong></h5>
<h3>Competences and role of Flydesigners</h3>
<p>A unique and great concept. A challenge, a human journey we are very proud to be part of.</p>
<p>We faced a huge task within a 6-weeks deadline. Our role was global. Making of all graphics and videos, making of the Flash RIA, making of the server-side and back-end applications, technical coordination of third party participants ( bank, cd creation ), Events communication (Press conference, Unighted by Cathy Guetta at Stade de france&#8230;).</p>
<p>Personally, my greatest satisfaction comes from the high quality collaboration among Flyd staff all along those 6 weeks. Particulary I would like to thank Benoit Guchet for its kindness. Benoit Guchet known as the key master behind <a href="http://www.bubblebeat.com">Bubblebeat.com</a>, first french digital platform of electronic music selections for professionals and all publics.</p>
<h5><strong><br />
</strong></h5>
<p>For those of you asking for the technical credits of Invasion 2008, here it is.</p>
<p>Development responsabilities and tasks were shared between Benoit Guchet and myself.</p>
<p>- Benoit was in charge of Php server-side and back-end development, plus the technical coordination with third party participants.<br />
- I was in charge of the ActionScript development, graphics and video intégration and the overall RIA design choices and solutions.</p>
<h5><strong><br />
</strong></h5>
<h3>ActionScript engineering</h3>
<p>I&#8217;ll be brief about the ActionScript programatic review.</p>
<p>We had 2 major imperatives. To respect the deadline and ensure the compatibility for the mobile platform. As a consequence, the development is based on AS2 and its corresponding mx framework (about which I unfortunately and hopefully know almost everything about quirks and goodness).</p>
<p>I used only one component. An extended version of the List component, with Drag and Drop functionalities. Multiples instances of the component were requiered across the application (tracklisting, CD1/ CD2 selections, Digitals selections, Guests/ Preselections Menu, register/ checkout forms). I naturally shared the component as a library across the application so as to reduce bandwith costs. Graphically we have 2 visuals skins, a grey one for all forms and a black one for all others cases.</p>
<p>Papervision was chosen as 3D solution to speed up conversion process between AS2 and the upcoming AS3 version. The tracklisting (a stack) and the Artworks selection step (a coverflow) were done using Papervision AS2.</p>
<p>Finally its no surprise if I tell you the application structure is made with Pixlib <img src='http://www.deja-vue.net/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> .</p>
<p>If you don&#8217;t know Joachim Garraud yet, you have the opportunity to listen, download and buy your own cd version of its last album release. <a href="http://invasion.joachimgarraud.com">http://invasion.joachimgarraud.com</a><br />
[/lang_en]</p>
<p>[lang_es]</p>
<h5><strong><br />
</strong></h5>
<p></strong></h5>
<p style="text-align: center;">
<object width="480" height="384"><param name="movie" value="http://www.dailymotion.com/swf/video/x6wtiq"></param><param name="allowFullScreen" value="true"></param><param name="allowScriptAccess" value="always"></param><embed type="application/x-shockwave-flash" src="http://www.dailymotion.com/swf/video/x6wtiq" width="480" height="384" allowfullscreen="true" allowscriptaccess="always"></embed></object><br /><b><a href="http://www.dailymotion.com/video/x6wtiq_joachim-garraud-cd-on-demand_music">Joachim Garraud CD on Demand</a></b><br /><i>envoy&eacute; par <a href="http://www.dailymotion.com/viva-musica">viva-musica</a>. &#8211; <a href="http://www.dailymotion.com/fr/channel/music">Regardez la derni&egrave;re s&eacute;lection musicale.</a></i>
</p>
<p style="text-align: center;">Genesis del concepto de venta inedito imaginado y explicado por Joachim Garraud (subtitulado ingles)</p>
</p>
<h5><strong><br />
</strong></h5>
<p>El ciclo de vida del album Invasion 2008 se libra por completo del modelo economico clasico. El aplicativo Flash asegura la salida y la disponibilidad de la obra que ademas ofrece, por primera vez, posibilidades de personalizacion ineditas. Un producto hecho a medidas, que se puede comprar y recibir desde cualquier pais del mundo.</p>
<p>Se puede acceder al aplicativo en castellano, frances e ingles. Se ofrece tutoriales videos que estan traducidas en cada una de esos idiomas.</p>
<h5><strong><br />
</strong></h5>
<h3>Competencias y papel de Flydesigners</h3>
<p>Un concepto novedoso, un desafio que aceptamos y una aventura humana de la cual estamos muy contentos y orgullosos.</p>
<p>La tarea fue ardua y el plazo de entrega, como muy a menudo, justito ^^.</p>
<p>Nuestro papel fue global. Realizacion de la maqueta grafica, creacion del cliente Flash, creacion del aplicado servidor y back-office, puesta en relacion y coordinacion tecnica de los prestatarios de tercera parte (bancos, concepcion CD), comunicacion durante los eventos que participaron al ritmo del desarollo ^^(conferencia de prensa, encuentros de DJs durante el &#8216;Unighted by Cathy Guetta&#8217; al &#8220;Stade de france&#8221; &#8230;).</p>
<p>Por mi parte, mi mayor satisfaccion proviene una vez mas de la estrecha y unida colaboracion que nos unio todos en Flyd durante mas de un mes y medio. Aprovecho para agradecer a Benoit Guchet que tuvo una disponobilidad muy generosa. Benoit Guchet, mas conocido en el circuito profesional por ser el desarollador de <a href="http://www.bubblebeat.com">Bubblebeat.com</a>, primera plataforma francesa de descarga de musica electronica selecionadas por profesionales para profesionales y el publico en general.</p>
<h5><strong><br />
</strong></h5>
<p>Para aquellos que quisieran el fichaje de la plantilla responsable del desarollo de invasion 2008, aqui esta.</p>
<p>Benoit y yo hemos compartido las responsabilidades y competencias del desarollo.</p>
<p>- Benoit  estaba en carga del aplicado y del back-office Php, asimismo que de la coordinacion con las entidades terceras (banco y creacion cd).<br />
- A mi me tocaba el desarollo ActionScript, la coordinacion de la integracion Flash, las elecciones y soluciones en cuanto a la ergonomia del aplicativo.</p>
<h5><strong><br />
</strong></h5>
<h3>Programacion ActionScript</h3>
<p>Seré breve. Teniamos 2 imperativos principales. Librar el aplicativo con tiempo ^^ y asegurar declinaciones para la plataforma movil.</p>
<p>El desarollo es entonces de tipo AS2 basado en el framework mx (del cual conozco fortuna y desafortunadamente los defectos y las cualidades)</p>
<p>Se utilizo un solo componente. El componente List, dotado de funcionalidades de Drag and Drop. El componente fue reutilizado en varios lugares (tracklisting, selecciones CD1 y CD2, selecciones Digitals, Menu Guests y Preselecciones, formularios de inscripciones y de validacion de compra) y logicamente explotado como libreria compartida. Se uso 2 skins visuales, un gris para los formularios y un negro para los otros casos.</p>
<p>Elije Papervision comme solucion de presentacion 3D con el fin de asegurar una transicion rapida hacia la version AS3 que tenemos previsto en Septiembre (una version mas avanzada aun, en particular con una gestion tiempo real de la disponibilidad a la compra o rebajas de los tracks). Asi pues, se realizaron el tracklisting (de tipo stack) y los artworks (de tipo coverflow) con Papervision AS2.</p>
<p>Por ultimo, nadie estara sorprendido si les digo que el aplicativo se contruyo con Pixlib <img src='http://www.deja-vue.net/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> .</p>
<p>Si no conocen todavia a Joachim Garraud, tienen entonces ahora la oportunidad de escuchar, descargar y comprar la version que mejor les coresponde de su ultimo album. <a href="http://invasion.joachimgarraud.com">http://invasion.joachimgarraud.com</a><br />
[/lang_es]</p>
<h5><strong><br />
</strong></h5>
<p>Press articles (french):</p>
<p><a href="http://www.clubic.com/actualite-145232-joachim-garraud-instaurer-cd-demande.html">http://www.clubic.com/actualite-145232-joachim-garraud-instaurer-cd-demande.html</a><br />
<a href="http://www.infos-du-net.com/actualite/13836-album-joachim-garraud.html">http://www.infos-du-net.com/actualite/13836-album-joachim-garraud.html</a><br />
<a href="http://www.journaldunet.com/breve/28322/le-dj-joachim-garraud-vend-son-cd-a-la-carte-sur-internet.shtml">http://www.journaldunet.com/breve/28322/le-dj-joachim-garraud-vend-son-cd-a-la-carte-sur-internet.shtml</a><br />
<a href="http://www.numerama.com/magazine/9948-Personnalisez-votre-album-de-Joachim-Garraud.html">http://www.numerama.com/magazine/9948-Personnalisez-votre-album-de-Joachim-Garraud.html</a><br />
<a href="http://www.lemondenumerique.com/?p=2865">http://www.lemondenumerique.com/?p=2865</a><br />
<a href="http://www.simonrobic.com/blog/2008/06/14/joachim-garraud-invasion-joachim-rinvente-la-vente-de-musique-en-ligne/">http://www.simonrobic.com/blog/2008/06/14/joachim-garraud-invasion-joachim-rinvente-la-vente-de-musique-en-ligne/</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.deja-vue.net/blog/2008/08/04/invasion-by-joachim-garraud-make-your-own-cd-flash-ria-made-in-pixlib/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>AS2 SharedFonts</title>
		<link>http://www.deja-vue.net/blog/2006/05/26/as2-sharedfonts/</link>
		<comments>http://www.deja-vue.net/blog/2006/05/26/as2-sharedfonts/#comments</comments>
		<pubDate>Fri, 26 May 2006 11:05:46 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Pixlib]]></category>
		<category><![CDATA[Shared Font]]></category>
		<category><![CDATA[Swfmill]]></category>
		<category><![CDATA[AS2]]></category>

		<guid isPermaLink="false">http://www.deja-vue.net/blog/2006/05/26/as2-sharedfonts-datagrid-example-the-last-stand/</guid>
		<description><![CDATA[<p>Posted in <a href="http://www.deja-vue.net/blog/category/pixlib/" title="Pixlib">Pixlib</a><a href="http://www.deja-vue.net/blog/category/shared-font/" title="Shared Font">Shared Font</a><a href="http://www.deja-vue.net/blog/category/swfmill/" title="Swfmill">Swfmill</a></p>Let’s sum up the many faces of sharedfonts with swfmill. 
<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"
			id="fm_Loader_105435617"
			class="flashmovie"
			width="400"
			height="305">
	<param name="movie" value="http://www.deja-vue.net/test/sharedfonts/last_stand/Loader.swf" />
	<param name="flashvars" value="appUrl=Application.swf&amp;soPath=sf_last_stand&amp;versionUrl=version.txt" />
	<param name="base" value="http://www.deja-vue.net/test/sharedfonts/last_stand/" />
	<!--[if !IE]>-->
	<object	type="application/x-shockwave-flash"
			data="http://www.deja-vue.net/test/sharedfonts/last_stand/Loader.swf"
			name="fm_Loader_105435617"
			width="400"
			height="305">
		<param name="flashvars" value="appUrl=Application.swf&amp;soPath=sf_last_stand&amp;versionUrl=version.txt" />
		<param name="base" value="http://www.deja-vue.net/test/sharedfonts/last_stand/" />
	<!--<![endif]-->
		 Sharing one font per swf: [xml] [/xml]  CommandLine : swfmill simple &#8220;src/georgia.xml&#8221; &#8220;deploy/Georgia Gras.swf&#8221; if we do so, we access the font by its default name: [as] var fmt:TextFormat = [...]]]></description>
			<content:encoded><![CDATA[<p>Let’s sum up the many faces of sharedfonts with <a href="http://iterative.org/swfmill/">swfmill</a>.</p>
<p><span id="more-9"></span></p>
<div style="text-align: center;">
[kml_flashembed movie="http://www.deja-vue.net/test/sharedfonts/last_stand/Loader.swf" width="400" height="305"  FVERSION="6" fvars=" appUrl= Application.swf ; soPath=sf_last_stand ; versionUrl= version.txt"  BASE="http://www.deja-vue.net/test/sharedfonts/last_stand/" /]
</div>
<a class="downloadlink" href="http://www.deja-vue.net/blog/wp-content/plugins/download-monitor/download.php?id=1" title=" downloaded 506 times" >as2sharedfonts.zip (506)</a>
<p>Sharing one font per swf:</p>
<p>[xml]<br />
<?xml version="1.0" encoding="iso-8859-1" ?><br />
<movie width="1" height="1" framerate="12"><br />
    <frame></p>
<library>
            <font import="src/ttf/georgia.ttf"/>
        </library>
        <import url="http://www.deja-vue.net/test/shared/swf/fonts/Georgia Gras.swf"></import><br />
    </frame><br />
</movie><br />
[/xml] </p>
<p>CommandLine :<br />
<strong>swfmill simple &#8220;src/georgia.xml&#8221; &#8220;deploy/Georgia Gras.swf&#8221;</strong></p>
<p>if we do so, we access the font by its default name:</p>
<p>[as]<br />
var fmt:TextFormat = new TextFormat();<br />
fmt.font = &#8220;Georgia&#8221;;<br />
[/as]</p>
<p>Because we didn’t give the font any name in particular in the configuration file, the embedded font is identified by its Digital Signature.</p>
<p>In case we want to specify a name:<br />
[xml]<br />
<?xml version="1.0" encoding="iso-8859-1" ?><br />
<movie width="1" height="1" framerate="12"><br />
    <frame></p>
<library>
            <font name="dragon" import="src/ttf/Lisas Dragons.ttf" glyphs="My little dragon"/>
        </library>
        <import url="http://www.deja-vue.net/shared/swf/font/lisasDragons.swf"></import><br />
    </frame><br />
</movie><br />
[/xml] </p>
<p>We then refer the font as follow:</p>
<p>[as]<br />
fmt.font = &#8220;dragon&#8221;;<br />
[/as]</p>
<p>There are advantages to specify a custom name.</p>
<p>- to import various styles in one go:</p>
<p>[xml]</p>
<p><?xml version="1.0" encoding="iso-8859-1" ?><br />
<movie width="1" height="1" framerate="12"><br />
    <frame></p>
<library>
            <font name="Charter" import="src/ct.ttf"/><br />
            <font name="Charter" import="src/ct__Italic.ttf"/><br />
            <font name="Charter" import="src/ct__Bold.ttf"/><br />
            <font name="Charter" import="src/ct__BoldItalic.ttf"/>
        </library>
        <import url="http://www.deja-vue.net/test/charters.swf"></import><br />
    </frame><br />
</movie></p>
<p>[/xml] </p>
<p>We have then free hand to use the style we want:</p>
<p>[as]<br />
var fmt:TextFormat = new TextFormat();<br />
fmt.font = &#8220;Charter&#8221;;</p>
<p>// Italic<br />
fmt.italic = true;</p>
<p>// Italic and Bold<br />
fmt.italic = true;<br />
fmt.bold = true;<br />
[/as]</p>
<p>- It&#8217;s very handy if we deal with differents weights by classifying them semantically:</p>
<p>[xml]<br />
<movie width="1" height="1" framerate="12"><br />
    <frame></p>
<library>
            <font name="Charter Regular" import="src/charterRegular.ttf"/><br />
            <font name="Charter Medium" import="src/charterMed.ttf"/><br />
            <font name="Charter Extended" import="src/charterExtended.ttf"/>
        </library>
        <import url="http://www.deja-vue.net/test/charters.swf"></import><br />
    </frame><br />
</movie><br />
[/xml] </p>
<p>Finally it&#8217;s up to you to decide how to handle the build:</p>
<p>Personally, I use a batch process, like so:</p>
<p>[xml]<br />
//buildFonts.bat<br />
swfmill simple &#8220;src/dejavue/cactus.xml&#8221; &#8220;build/dejavue/cactus.swf&#8221;<br />
swfmill simple &#8220;src/dejavue/benegraphic.xml&#8221; &#8220;build/dejavue/Benegraphic.swf&#8221;<br />
swfmill simple &#8220;src/dejavue/The Dark Crystal.xml&#8221; &#8220;build/dejavue/The Dark Crystal.swf&#8221;<br />
swfmill simple &#8220;src/dejavue/Lisas Dragons.xml&#8221; &#8220;build/dejavue/gs.swf&#8221;<br />
swfmill simple &#8220;src/dejavue/KingArthurSpecial.xml&#8221; &#8220;build/dejavue/King Arthur Special.swf&#8221;<br />
[/xml]</p>
<p>Okay, that&#8217;s all folks!<br />
You will learn more from the source files where you&#8217;ll find:</p>
<p>- the TTF/ XML assets&#8217; directory structure inside sharedfontBuilder;) folder.<br />
- the source .as files (Application and TextFormatCellRenderer classes).</p>
<p>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;</p>
<p>A few words about the application example</p>
<p>- Datagrid instantiation and cellRenderer linkage were all done in Fla. ActionScript was injected later with <a href="http://tech.motion-twin.com/mtasc.html">MTASC</a>.</p>
<p>- I used <a href="http://osflash.org/doku.php?id=pixlib">Pixlib</a>&#8216;s <strong>XMLToObject </strong>and <strong>Libstack/GraphicLib </strong>to handle the fonts loading process (I LOVE Pixlib, everybody should know from now ^^).</p>
<p>Enjoy!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.deja-vue.net/blog/2006/05/26/as2-sharedfonts/feed/</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
		<item>
		<title>ActionStep (plugin View) / Pixlib (MVC FrontController + Remoting) SUSHI Service</title>
		<link>http://www.deja-vue.net/blog/2006/05/25/actionstep-plugin-view-pixlib-mvc-frontcontroller-remoting-sushi-service/</link>
		<comments>http://www.deja-vue.net/blog/2006/05/25/actionstep-plugin-view-pixlib-mvc-frontcontroller-remoting-sushi-service/#comments</comments>
		<pubDate>Thu, 25 May 2006 10:06:58 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[ActionStep]]></category>
		<category><![CDATA[Application Architecture]]></category>
		<category><![CDATA[AS2]]></category>
		<category><![CDATA[MVC]]></category>
		<category><![CDATA[Pixlib]]></category>

		<guid isPermaLink="false">http://www.deja-vue.net/blog/2006/05/25/actionstep-plugin-view-pixlib-mvc-frontcontroller-remoting-sushi-service/</guid>
		<description><![CDATA[<p>Posted in <a href="http://www.deja-vue.net/blog/category/actionstep/" title="ActionStep">ActionStep</a><a href="http://www.deja-vue.net/blog/category/application-architecture/" title="Application Architecture">Application Architecture</a><a href="http://www.deja-vue.net/blog/category/as2/" title="AS2">AS2</a><a href="http://www.deja-vue.net/blog/category/mvc/" title="MVC">MVC</a><a href="http://www.deja-vue.net/blog/category/pixlib/" title="Pixlib">Pixlib</a></p>Le chef est de retour ^^. Au menu Sushis et MVC &#8220;on steroids&#8221;. Montez votre application en MVC. Une fois que le MVC a bien pris, truffez-le d&#8217;un FrontController. Parsemez avec quelques MovieClipHelpers. Arrosez finalement le tout avec, selon le choix et l&#8217;humeur, un ModelLocator et/ou un ServiceLocator&#8230; Pixlib Remoting SUSHI service ? J&#8217;en entends [...]]]></description>
			<content:encoded><![CDATA[<p>Le chef est de retour ^^. Au menu Sushis et MVC &#8220;on steroids&#8221;.</p>
<p>Montez votre application en MVC. Une fois que le MVC a bien pris, truffez-le d&#8217;un FrontController. Parsemez avec quelques MovieClipHelpers. Arrosez finalement le tout avec, selon le choix et l&#8217;humeur, un ModelLocator et/ou un ServiceLocator&#8230;</p>
<p>Pixlib Remoting SUSHI service ? J&#8217;en entends déjà certains dire: il fait dans le recyclage intensif le gars&#8230;</p>
<p><span id="more-8"></span></p>
<p>Dans cet article je vais vous introduire à un joyau de <a href="http://osflash.org/pixlib">Pixlib</a> (il y en tellement&#8230;c&#8217;est une vraie caverne d&#8217;Ali Baba !).<br />
SUSHI service repose sur une recette applicative incroyablement puissante et polyvalente basée sur le pattern MVC. &#8220;Recette&#8221; car ce sont bien des ingrédients qui sont mis à notre disposition. Selon ces ingrédients et l&#8217;inspiration on pourra, par exemple, faire gonfler notre MVC traditionnel en MVC à multiples Models (ModelLocator) ou bien comme c&#8217;est ici le cas, faire lever le tout en &#8220;Super MVC&#8221; (FrontController et ServiceLocator).</p>
<div style="text-align: center;">
[kml_flashembed publishmethod="static" fversion="9.0.0" useexpressinstall="true" movie="http://www.deja-vue.net/test/pixlib/sushiservice/Loader.swf" width="390" height="270" BASE="http://www.deja-vue.net/test/pixlib/sushiservice/" targetclass="flashmovie" fvars="appUrl=http://www.deja-vue.net/test/pixlib/sushiservice/Application.swf;soPath=ASPizzaService;versionUrl=version.txt"]</p>
<p><a href="http://adobe.com/go/getflashplayer"><img src="http://www.adobe.com/images/shared/download_buttons/get_flash_player.gif" alt="Get Adobe Flash player" /></a></p>

	<!--[if !IE]>-->
	</object>
	<!--<![endif]-->
</object></div>
<a class="downloadlink" href="http://www.deja-vue.net/blog/wp-content/plugins/download-monitor/download.php?id=3" title=" downloaded 375 times" >sushiService.zip (375)</a>
<p>- <strong>L&#8217; User Interface</strong></p>
<p>C&#8217;est toujours du <a href="http://osflash.org/actionstep">ActionStep</a> (j&#8217; aurai bien voulu tester <a href="http://www.aswing.org/display/AsWing/Home">ASWing</a> but no time):<br />
Cette fois-ci, les &#8220;forms&#8221; ou &#8220;states&#8221; sont regroupés dans un module swf autonome chargé au runtime dans l&#8217;application principale. Adopter ce design a supposé une nouvelle stratégie d&#8217;instantiation.</p>
<p>- <strong>&#8220;Un système totalement générique&#8221;</strong></p>
<p>L&#8217;addition du FrontController, du MovieClipHelpers et d&#8217;un ModelLocator (classe core.Model) au pattern MVC confère à notre application un degré de modularité exemplaire. L&#8217;essentiel de cet article sera consacré à la description de ce &#8220;Super MVC&#8221;. J&#8217; évoquerai les points qui, d&#8217;un point de vue personnel, m&#8217;ont semblé les plus pertinents.</p>
<p>- <strong>Le service Remoting</strong></p>
<p>Il repose sur la version alpha du package remoting Pixlib. Il est déployé avec souplesse depuis un Singleton ServiceLocator.</p>
<p>Note:<br />
le terme &#8220;state&#8221; à été employé pour désigner les différentes views contenues dans views.swf. Il n&#8217;est donc pas à prendre ici dans son sens premier &#8220;d&#8217;état&#8221; de l&#8217;application (généralement stocké dans un SharedObject, ValueObject, instance de Memento ou autre solution)</p>
<p>Commençons en images afin de prendre rapidemment des repères:</p>
<p>La structure du projet</p>
<p><img id="image21" src="http://www.deja-vue.net/blog/wp-content/uploads/2006/05/sushi_flp.gif" alt="Sushi service flp" /></p>
<p>Diagramme (maison) de la relation FrontController, MovieClipHelper, ServiceLocator &amp; ModelLocator</p>
<p><img id="image23" src="http://www.deja-vue.net/blog/wp-content/uploads/2006/05/sushi%20diagram.gif" alt="Sushi Diagram" /></p>
<p>L&#8217;user Interface en standalone</p>
<p>Désolidariser de la structure de leur précédent hôte (ARP), les différents &#8220;states&#8221; de l&#8217;application (order, viewOrders et navigation) sont de nouveau de banales sous-classes de MovieClip dépourvues de toute fonctionnalité d&#8217; eventdispatching.</p>
<p>Ce nouveau profil de &#8220;plugin&#8221; a supposé changer la façon d&#8217;instancier le container des différents &#8220;states&#8221; de l&#8217;interface. Importée au runtime dans un MovieClip (via GraphicLib), l&#8217;UI doit déjà être instanciée sans dépendance de _root si nous souhaitons pouvoir le connecter à chaud tel un plugin.</p>
<p>L&#8217;astuce ? packager les classes et procéder à  l&#8217; instantiation avec SWFMILL.</p>
<p>La première étape donc: compiler la view<br />
[as]<br />
/**<br />
* @mtasc -version 8 -swf &#8220;classes.swf&#8221; -header 390:270:60:FCFCFC -trust<br />
*/</p>
<p>// Imports&#8230;</p>
<p>class org.actionstep.view.sushi.Application extends MovieClip<br />
{<br />
	// MovieClip linkage<br />
	static var id = (id=&#8221;__Packages.org.actionstep.view.sushi.Application&#8221;)+(Object.registerClass(id,Application)?&#8221;":&#8221;");</p>
<p>	private var navigation : MovieClip;<br />
	private var order : MovieClip;<br />
	private var viewOrders : MovieClip;<br />
	private var dataPreloader : MovieClip;</p>
<p>	function onLoad()<br />
	{<br />
		// ActionStep theming<br />
		org.actionstep.ASTheme.setCurrent(new<br />
		org.actionstep.themes.plastic.ASPlasticTheme());</p>
<p>		// Set the initial display state of the application<br />
		setInitialDisplayState();</p>
<p>		// Views Instantiation (no FLA here)<br />
		navigation = attachMovie(Navigation.id,&#8221;navigation&#8221;, 1);<br />
		viewOrders = attachMovie(ViewOrders.id,&#8221;viewOrders&#8221;, 2);<br />
		order = attachMovie(Order.id,&#8221;order&#8221;, 3);<br />
	}<br />
	// &#8230;<br />
}<br />
[/as]</p>
<p>La deuxième étape: instancier avec SWFMILL</p>
<p>[xml]</p>
<p><?xml version="1.0" encoding="iso-8859-1"?><br />
<movie version="8" width="390" height="270" framerate="60"><br />
    <background color="#ffffff"/><br />
    <frame></p>
<library>
            <clip id="Application" class="org.actionstep.view.sushi.Application" import="classes/classes.swf" />
        </library>
<place id="Application" name="app" x="0" y="0" depth="1" />
    </frame><br />
</movie></p>
<p>[/xml]</p>
<p>L&#8217;initialisation MVC</p>
<p>L&#8217;application principale (Application.as) est lancée de façon conventionnelle avec main().<br />
Le Model est d&#8217;abord instancié. Notre unique vue, une sous-classe MovieClipHelper, s&#8217;abonne à l&#8217; écoute du Model. Le controller, un Singleton et sous-classe de FrontController est finalement initialisé. Le controller est le ciment de l&#8217;application. C&#8217;est lui qui va associer évènements typés et instances de commandes.</p>
<p>[as]<br />
private function _init() : Void<br />
{<br />
	var model : Model = new SUSHIExpert();<br />
	model.addListener( new SUSHIListUI() );<br />
	Controller.getInstance().init();<br />
}<br />
[/as]</p>
<p><strong>I. LES VIEWS</strong></p>
<p>Chargement de la View standalone</p>
<p>GraphicLib et Libstack, du chargement et multichargement intelligent.<br />
Au travers de ces 2 implementations concrètes d&#8217;AbstractLib, nos assets sont chargés et stockés avec un identifiant de type String. En l&#8217;occurence, ces identifiants sont prédéfinis sous formes de constantes accessibles en static depuis sushi.uis.UIList. Ceci permet une meilleure traçabilité du couplage entre les assets et leurs &#8216;accesseurs&#8217;.</p>
<p>[as]<br />
var gl : GraphicLib = new GraphicLib( this, 20 );<br />
gl.setName( UIList.SUSHI_List );<br />
gl.addEventListener( GraphicLib.onLoadInitEVENT, this, _init );<br />
gl.load( &#8220;deploy/views.swf&#8221; );<br />
[/as]</p>
<p>ou</p>
<p>[as]<br />
var libs = new LibStack();<br />
libs.enqueue(new GraphicLib(this, 20, false), UIList.SUSHI_List, &#8220;deploy/views.swf&#8221;);<br />
libs.addEventListener( LibStack.onLoadCompleteEVENT, this, _init );<br />
libs.execute();<br />
[/as]</p>
<p>Les éléments sont ensuite accessibles globalement de plusieurs façons:</p>
<p>- <strong>Depuis le Singleton GraphicLibLocator</strong>:</p>
<p>[as]<br />
var myView:MovieClip = GraphicLibLocator.getInstance().getGraphicLib( UIList.SUSHI_List ).getView();<br />
[/as]</p>
<p>- <strong>Depuis une sous-classe MovieClipHelper</strong>:</p>
<p>[as]<br />
// SUSHIListUI.as</p>
<p>class sushi.uis.SUSHIListUI<br />
	extends MovieClipHelper<br />
{<br />
	public function SUSHIListUI ()<br />
	{<br />
		super( UIList.SUSHI_List );<br />
	}<br />
}<br />
[/as]</p>
<p>- <strong>Depuis une sous-classe ViewHelper</strong><br />
[as]<br />
import com.bourre.data.libs.GraphicLib;<br />
import com.bourre.visual.ViewHelper;<br />
import sushi.uis.UIList;</p>
<p>class sushi.uis.SUSHIListUI<br />
	extends ViewHelper<br />
{<br />
	public function SUSHIListUI ( gl : GraphicLib )<br />
	{<br />
		super( gl.getView(), UIList.SUSHI_List );</p>
<p>		view.app.showDataPreloader();<br />
		gl.show();<br />
	}<br />
}<br />
[/as]</p>
<p>C&#8217;est vraiment très pratique d&#8217;avoir un accès global sur les views:<br />
Par exemple, si je souhaite déclencher une action sur une view depuis une Command:</p>
<p>Avec GraphicLibLocator:<br />
[as]<br />
import com.bourre.data.libs.GraphicLibLocator<br />
import sushi.uis.UIList;</p>
<p>class sushi.commands.PlaceOrder<br />
	implements Command<br />
{<br />
	public function execute( e : IEvent ) : Void<br />
	{<br />
		var myView:MovieClip = GraphicLibLocator.getInstance().getGraphicLib( UIList.SUSHI_List ).getView();<br />
		myView.app.orderProcessed();<br />
	}<br />
}<br />
[/as]<br />
avec MovieClipHelper<br />
[as]<br />
import com.bourre.visual.MovieClipHelper<br />
import sushi.uis.UIList;</p>
<p>class sushi.commands.PlaceOrder<br />
	implements Command<br />
{<br />
	public function execute( e : IEvent ) : Void<br />
	{<br />
		var myView = MovieClipHelper.getMovieClipHelper(UIList.SUSHI_List);<br />
		myView.view.app.showDataPreloader();<br />
		myView.traceTest(); // calling a method on SUSHIListUI<br />
	}<br />
}<br />
[/as]</p>
<p>Ici, en ce qui nous concerne, Sushi service n&#8217;a qu&#8217;une seule View de type MovieClipHelper</p>
<p>Sur une instance de MovieClipHelper on va, typiquement:</p>
<p>- définir le comportement des objets (TextField, MovieClips, v2 components&#8230;) présents dans la View au moyen de leurs noms d&#8217;instances.</p>
<p>Dans le cas de Sushi service, l&#8217;UI ActionStep n&#8217;est pas qu&#8217;une coque vide.</p>
<p>La view externe possède déjà des méthodes:</p>
<p>hideDataPreloader();<br />
showDataPreloader();<br />
orderFormSelect();<br />
viewOrdersFormSelect();</p>
<p>Ensuite, dans chaque &#8220;state&#8221; ( Navigation, Order, ViewOrders ), les event handlers des boutons sont déjà  définis, ex.:</p>
<p>[as]<br />
// NSButton<br />
placeOrderButton = (new NSButton()).initWithFrame(new NSRect(300, 205, 80, 22));<br />
placeOrderButton.setStringValue(&#8220;Place order&#8221;);<br />
placeOrderButton.setTarget(this);<br />
placeOrderButton.setAction(&#8220;placeOrder&#8221;);<br />
view.addSubview(placeOrderButton);<br />
[/as]</p>
<p>C&#8217;est pas grave du tout ^^. On va piloter et arranger le scope depuis notre sous-classe MovieClipHelper <img src='http://www.deja-vue.net/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>[as]<br />
class sushi.uis.SUSHIListUI<br />
	extends MovieClipHelper<br />
{<br />
	private function _initBehaviors() : Void<br />
	{<br />
		_pbCancelOrder.setTarget(this);<br />
		_pbCancelOrder.setAction(&#8220;cancelOrder&#8221;);</p>
<p>		_dSelectViewOrders = new Delegate(view.app, view.app.viewOrdersFormSelect);<br />
		_dShowPreloader = new Delegate(view.app, view.app.showDataPreloader);<br />
	}</p>
<p>	private function _gotoViewOrders() : Void<br />
	{<br />
		_dSelectViewOrders.execute();<br />
		_dShowPreloader.execute();<br />
	}</p>
<p>	private function cancelOrder() : Void<br />
	{<br />
		_dShowPreloader.execute();<br />
		_fireEvent(new BasicEvent(EventList.cancelOrderEVENT, view.app.viewOrders.getOrder() ));<br />
	}<br />
}<br />
[/as]</p>
<p>Une &#8220;architecture de legos&#8221; où nous avons un contrôle total sur chaque pièce autonome pluggée.</p>
<p>Reprenons un peu le fil.<br />
Sur une instance de MovieClipHelper, on va aussi:</p>
<p>- définir les callbacks du ou des Models.<br />
- diffuser (avec notre EventBroadcaster global) des messages de type BasicEvent ou customs (sous-classe BasicEvent) vers les commandes correspondantes.</p>
<p><strong>N&#8217;hésitez pas à étendre BasicEvent afin de créer vos propres event objects. C&#8217;est une autre pierre angulaire de Pixlib</strong>.</p>
<p>Jetez un oeil à la méthode placeOrder(). Vous verrez qu&#8217;elle broadcaste un événement de type OrderEvent.<br />
[as]<br />
private function placeOrder() : Void<br />
{<br />
	_gotoViewOrders();<br />
	_fireEvent(new OrderEvent(EventList.placeOrderEVENT, view.app.order.orderName, view.app.order.orderTicket));<br />
}<br />
[/as]</p>
<p>Attention, la comparaison est malheureuse, mais c&#8217;est juste pour faire capter rapidement l&#8217;idée à ceux qui sont d&#8217;un background ARP:<br />
Voyez OrderEvent comme un Value Object (VO) passant les informations à la commande.<br />
Voilà , vous pouvez vous lacher et crier hérésie haut et fort ^^.</p>
<p><strong>II. Le FrontController</strong></p>
<p>C&#8217;est dans sushi.commands.Controller (sous-classe de FrontController) que sont associés et stockés Events et Commands. A la différence du ControllerTemplate d&#8217;ARP, le FrontController n&#8217;impose aucune référence directe sur les views. Less coupling!</p>
<p>FrontController:<br />
[as]<br />
public function init() : Void<br />
{<br />
	push ( EventList.placeOrderEVENT, new PlaceOrder() );<br />
	push ( EventList.getOrdersEVENT, new GetOrders() );<br />
	push ( EventList.cancelOrderEVENT, new CancelOrder() );<br />
}<br />
[/as]</p>
<p>ControllerTemplate:<br />
[as]</p>
<p>private function addEventListeners ()<br />
{<br />
	app.orderForm.addEventListener ( &#8220;orderPizza&#8221;, this );<br />
	app.viewOrdersForm.addEventListener ( &#8220;getOrderList&#8221;, this );<br />
	app.viewOrdersForm.addEventListener ( &#8220;cancelOrder&#8221;, this );<br />
}</p>
<p>private function addCommands ()<br />
{<br />
	addCommand ( &#8220;orderPizzaCommand&#8221;, OrderPizzaCommand );<br />
	addCommand ( &#8220;getOrderListCommand&#8221;, GetOrderListCommand );<br />
	addCommand ( &#8220;cancelOrderCommand&#8221;, CancelOrderCommand );<br />
}<br />
[/as]</p>
<p><strong>III. ServiceLocator et Commands</strong></p>
<p>Dans le Singleton ServiceLocator nous définissons et stockons un ou plusieurs services remoting (selon nos besoins). Le nom d&#8217;alias de chaque service est défini en static.</p>
<p>- <em>La définition du service remoting</em>:</p>
<p>[as]<br />
// sushi.service.ServiceLocator<br />
public static var SUSHISERVICE:String = &#8220;dejavue_net.sushi.sushiService&#8221;;</p>
<p>public function init( remotingURL : String ) : Void<br />
{<br />
	gatewayURL = &#8220;http://www.deja-vue.net/amfphp/gateway.php&#8221;;<br />
	push( ServiceLocator.SUSHISERVICE, ServiceLocator.SUSHISERVICE );<br />
}<br />
[/as]</p>
<p>- <em>Configuration type d&#8217;une commande</em>:</p>
<p>1. Localisation du service remoting et appel et de la remote method</p>
<p>Attention, à l&#8217;heure où cet article est écrit, le package remoting est toujours en version alpha et non disponible depuis le svn. Je ne m&#8217; étendrai donc pas sur l&#8217;implémentation du responder ni sur l&#8217;API.</p>
<p>[as]<br />
// class sushi.commands.PlaceOrder</p>
<p>public function PlaceOrder()<br />
{<br />
	_service = ServiceLocator.getInstance().getService( ServiceLocator.SUSHISERVICE );<br />
}</p>
<p>public function execute( e : OrderEvent ) : Void<br />
{<br />
	_service.order( new ServiceResponder(this), e.getName(), e.getTicket() );<br />
}</p>
<p>public function onResult( e : BasicResultEvent ) : Void<br />
{</p>
<p>}</p>
<p>public function onFault(e : BasicFaultEvent) : Void<br />
{</p>
<p>}<br />
[/as]</p>
<p>2. Tous les chemins mènent à Rome:</p>
<p>Là , c&#8217;est GRANDIOSE. Depuis une commande (pas seulement d&#8217;ailleurs) nous pouvons:</p>
<p>- appeler la view de notre choix (rappelez-vous de GraphicLibLocator, MovieClipHelper et ViewHelper).<br />
- broadcaster un event typé et déclencher une nouvelle commande.<br />
[as]<br />
EventBroadcaster.getInstance().broadcastEvent( new BasicEvent(EventList.getOrdersEVENT) );<br />
[/as]<br />
- appeler le model de notre choix.<br />
[as]<br />
SUSHIExpert(Model.getModel( ModelList.SUSHI_EXPERT )).onUpdate( e.getResult() );<br />
[/as]</p>
<p>Epoustouflant d&#8217;avoir autant de contrôle  <img src='http://www.deja-vue.net/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Le mot de la fin (il est temps! ^^):</p>
<p>Il y a 2 jours, j&#8217; étais parti bille en tête avec l&#8217;idée de faire un papier sur le package MVC de Pixlib. En même temps, je me disais que c&#8217; était un peu léger comme sujet. C&#8217;est en approfondissant les packages events et visual que j&#8217;en suis arrivé au FrontController + MovieClipHelper et à approfondir. Pixlib n&#8217;avait pas fini de m&#8217; étonner&#8230;<br />
Je reste bluffé. Je ne m&#8217;attendais vraiment pas ça. Devinez avec quoi je vais boulonner mon prochain projet <img src='http://www.deja-vue.net/blog/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> .</p>
<p>Chapeau bas à Francis.</p>
<p>Liens de Référence:</p>
<p>-MVC et FrontController<br />
<a href="http://www.tweenpix.net/blog/index.php?2004/09/22/460-whiteboard-10">http://www.tweenpix.net/blog/index.php?2004/09/22/460-whiteboard-10</a><br />
<a href="http://osflash.org/pipermail/pixlib_osflash.org/2006-March/000257.html">Discussion about models in mvc and front controller patterns on Pixlib list </a></p>
<p>GraphicLib, LibStack et MovieClipHelper<br />
<a href="http://www.get-url.net/blog/?47--pixlib-libstack-ou-le-multi-chargement">http://www.get-url.net/blog/?47&#8211;pixlib-libstack-ou-le-multi-chargement</a><br />
<a href="http://www.get-url.net/blog/?48--pixlib-graphiclib-et-moviecliphelper-vs-movieclip-parti">http://www.get-url.net/blog/?48&#8211;pixlib-graphiclib-et-moviecliphelper-vs-movieclip-parti</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.deja-vue.net/blog/2006/05/25/actionstep-plugin-view-pixlib-mvc-frontcontroller-remoting-sushi-service/feed/</wfw:commentRss>
		<slash:comments>26</slash:comments>
		</item>
		<item>
		<title>Open Source Flash Pizza for everyone ! follow-up &#8211; Shared Fonts</title>
		<link>http://www.deja-vue.net/blog/2006/05/16/open-source-flash-pizza-for-everyone-follow-up-shared-fonts/</link>
		<comments>http://www.deja-vue.net/blog/2006/05/16/open-source-flash-pizza-for-everyone-follow-up-shared-fonts/#comments</comments>
		<pubDate>Tue, 16 May 2006 19:58:55 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Application Architecture]]></category>
		<category><![CDATA[AS2]]></category>
		<category><![CDATA[MVC]]></category>
		<category><![CDATA[Pixlib]]></category>

		<guid isPermaLink="false">http://www.deja-vue.net/blog/2006/05/16/open-source-flash-pizza-for-everyone-follow-up-shared-fonts/</guid>
		<description><![CDATA[<p>Posted in <a href="http://www.deja-vue.net/blog/category/application-architecture/" title="Application Architecture">Application Architecture</a><a href="http://www.deja-vue.net/blog/category/as2/" title="AS2">AS2</a><a href="http://www.deja-vue.net/blog/category/mvc/" title="MVC">MVC</a><a href="http://www.deja-vue.net/blog/category/pixlib/" title="Pixlib">Pixlib</a></p>[lang_fr] On m&#8217;a demandé des précisions sur la technique des &#8220;polices partagées&#8221; utilisée dans OSFlash Pizza. En voici le secret&#8230; [/lang_fr] [lang_es] Me han pedido que precise sobre la técnica de las &#8220;fuentes compartidas&#8221; utilizada en OSFlash Pizza. He aquí el secreto&#8230; [/lang_es] Structure de georgia.xml [xml]                 [...]]]></description>
			<content:encoded><![CDATA[<p>[lang_fr]<br />
On m&#8217;a demandé des précisions sur la technique des &#8220;polices partagées&#8221; utilisée dans <a href="http://www.deja-vue.net/blog/2006/05/15/open-source-flash-pizza-for-everyone/">OSFlash Pizza</a>. En voici le secret&#8230;<br />
[/lang_fr]</p>
<p>[lang_es]<br />
Me han pedido que precise sobre la técnica de las &#8220;fuentes compartidas&#8221; utilizada en <a href="http://www.deja-vue.net/blog/2006/05/15/open-source-flash-pizza-for-everyone/">OSFlash Pizza</a>. He aquí el secreto&#8230;<br />
[/lang_es]<br />
<span id="more-7"></span></p>
<p>Structure de georgia.xml</p>
<p>[xml]<br />
<?xml version="1.0" encoding="iso-8859-1" ?><br />
<movie width="1" height="1" framerate="12"><br />
    <frame><br />
       
<library>
            <font import="src/ttf/georgia.ttf"/><br />
        </library>
        <import url="http://www.deja-vue.net/test/shared/swf/fonts/Georgia Gras.swf"></import><br />
    </frame><br />
</movie><br />
[/xml] </p>
<p>On compile avec la ligne de commande suivante:</p>
<p>[xml]<br />
swfmill simple &#8220;src/georgia.xml&#8221; &#8220;deploy/Georgia Gras.swf&#8221;<br />
[/xml]</p>
<p>Voilà !</p>
<p>Ensuite, libre à vous de choisir la façon de charger la police.</p>
<p>Dans le cas d&#8217; OSFlash Pizza j&#8217; ai choisi la voie du MovieClipLoader. Très pratique mais que je déconseille pour la production. Sa gestion des timeout est inéxistante et l&#8217; utilisation de la méthode onLoadError conduit à des catastrophes.</p>
<p>Sur mes projets j&#8217; utilise la classe LibStack de Pixlib. Si vous ne savez toujours pas ce qu&#8217;est Pixlib, rendez-vous <a href="http://osflash.org/pixlib">ici</a>. Attention, dernière fois que je répète !.</p>
<p><strong>UPDATE:</strong></p>
<p>NOM DE LA FONTE ET RISQUE DE CONFUSION.</p>
<p>Attention à utiliser le &#8220;vrai&#8221; nom de la fonte au moment du format coté Flash.</p>
<p>La fonte Georgia Gras illustre parfaitement ce cas. En effet, bien qu&#8217;il s&#8217;agisse d&#8217;une variante de Georgia, son nom réel est pourtant &#8220;Georgia&#8221;.<br />
Ou trouver cette référence ? Dans le fichier TTF lui-même, après indication de la signature numérique.</p>
<p>Un bemol</p>
<p>Je n&#8217;ai pas encore pu cerner la raison exacte, mais il semblerait qu &#8216;un délai soit parfois nécessaire afin d&#8217;assurer la disponibilité de la fonte dans la librairie.</p>
<p>Pour OSFlash pizza, l&#8217;instantiation de l&#8217;application a été retardée avec un setTimeout:</p>
<p>[as]<br />
public function Main(target)<br />
{<br />
	target.__proto__ = this.__proto__;<br />
	target.__constructor__ = Main;<br />
	this = target;</p>
<p>	XrayLoader.loadConnector(&#8220;main_xray_v1.3.4.swf&#8221;, _level1);</p>
<p>	setTimeout(this, &#8220;init&#8221;, 500);<br />
}</p>
<p>private function init()<br />
{<br />
	var pizza = Application( attachMovie(Application.id, &#8220;pizzaService&#8221;, 1) );<br />
}<br />
[/as]</p>
<p>Je remercie <a href="http://www.v-i-a.net/blog/ ">erixtekila </a>qui m&#8217; a indiqué comment simplifier (de moitié!) la configuration xml. En fin de compte si vous lisez son <a href="http://www.v-i-a.net/blog/archives/000043.html">article</a> qui traite le même sujet, on s&#8217;aperçoit que les techniques sont bel et bien identiques. A une nuance près, celle exposée ci tient en un seul xml.</p>
<p>Liens d&#8217; intérêt sur Libstack<br />
<a href="http://www.get-url.net/blog/?47--pixlib-libstack-ou-le-multi-chargement">http://www.get-url.net/blog/?47&#8211;pixlib-libstack-ou-le-multi-chargement</a><br />
<a href="http://www.rosyflower.net/dotclear/index.php?2005/12/22/17-preloader-pixlib-">http://www.rosyflower.net/dotclear/index.php?2005/12/22/17-preloader-pixlib-</a></p>
<p>[lang_es]<br />
Estructura de georgia.xml<br />
[xml]<br />
<?xml version="1.0" encoding="iso-8859-1" ?><br />
<movie width="1" height="1" framerate="12"><br />
    <frame><br />
       
<library>
            <font import="src/ttf/georgia.ttf"/><br />
        </library>
        <import url="http://www.deja-vue.net/test/shared/swf/fonts/Georgia Gras.swf"></import><br />
    </frame><br />
</movie><br />
[/xml] </p>
<p>Compilamos con la siguiente línea de comandos:</p>
<p>[xml]<br />
swfmill simple &#8220;src/georgia.xml&#8221; &#8220;deploy/Georgia Gras.swf&#8221;<br />
[/xml]</p>
<p>VoilÃ !</p>
<p>Luego, sois libres de escoger la forma de cargar la fuente.</p>
<p>En el caso de OSFlash Pizza, he escogido el MovieClipLoader. Muy práctico, pero que  desaconsejo para la producción. Su gestión de los timeout es inexistente y el uso del método onLoadError conduce a catástrofes.</p>
<p>En mis proyectos, uso la clase LibStack de Pixlib. Si ne sabáis aún lo que es Pixlib, id <a href="http://osflash.org/pixlib">aquí</a>. Atención, es la última vez que repito <img src='http://www.deja-vue.net/blog/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> .</p>
<p><strong>ACTUALIZACIÓN:</strong></p>
<p>NOMBRE DE LA FUENTE Y RIESGO DE CONFUSIÓN.</p>
<p>Cuidado con utilizar el &#8220;verdadero&#8221; nombre de la fuente en el momento de dar formato en Flash.</p>
<p>La fuente Georgia Gras ilustra perfectamente este caso. En efecto, a pesar de que se trata de una variante de Georgia, su nombre real es sin embargo &#8220;Georgia&#8221;.<br />
¿Dónde encontrar esa referencia? En el fichero TTF mismo, trás la indicación de la firma digital.</p>
<p>Un bemol</p>
<p>Aún no he podido encontrar la razón exacta pero parece que un intervalo es a veces necesario para asegurar la disponibilidad de la fuente en la librería.</p>
<p>Para OSFlash pizza, la instanciación de la aplicación ha sido retardada con un setTimeout:</p>
<p>[as]<br />
public function Main(target)<br />
{<br />
	target.__proto__ = this.__proto__;<br />
	target.__constructor__ = Main;<br />
	this = target;</p>
<p>	XrayLoader.loadConnector(&#8220;main_xray_v1.3.4.swf&#8221;, _level1);</p>
<p>	setTimeout(this, &#8220;init&#8221;, 500);<br />
}</p>
<p>private function init()<br />
{<br />
	var pizza = Application( attachMovie(Application.id, &#8220;pizzaService&#8221;, 1) );<br />
}<br />
[/as]</p>
<p>Doy las gracias a <a href="http://www.v-i-a.net/blog/ ">erixtekila </a>que me indicó cómo simplificar (a la mitad!) la configuracíon xml. A fin de cuentas, si leáis su <a href="http://www.v-i-a.net/blog/archives/000043.html">artículo</a> que trata del mismo tema, os daráis cuenta de que las técnicas son perfectamente identicas. Salvo alguna excepción, la de este artículo cabe en un solo xml.</p>
<p>Vínculos de interés en Libstack<br />
<a href="http://www.get-url.net/blog/?47--pixlib-libstack-ou-le-multi-chargement">http://www.get-url.net/blog/?47&#8211;pixlib-libstack-ou-le-multi-chargement</a><br />
<a href="http://www.rosyflower.net/dotclear/index.php?2005/12/22/17-preloader-pixlib-">http://www.rosyflower.net/dotclear/index.php?2005/12/22/17-preloader-pixlib-</a><br />
[/lang_es] </p>
]]></content:encoded>
			<wfw:commentRss>http://www.deja-vue.net/blog/2006/05/16/open-source-flash-pizza-for-everyone-follow-up-shared-fonts/feed/</wfw:commentRss>
		<slash:comments>12</slash:comments>
		</item>
		<item>
		<title>Open Source Flash Pizza for everyone !</title>
		<link>http://www.deja-vue.net/blog/2006/05/15/open-source-flash-pizza-for-everyone/</link>
		<comments>http://www.deja-vue.net/blog/2006/05/15/open-source-flash-pizza-for-everyone/#comments</comments>
		<pubDate>Mon, 15 May 2006 21:26:38 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[ActionStep]]></category>
		<category><![CDATA[Pixlib]]></category>
		<category><![CDATA[Swfmill]]></category>

		<guid isPermaLink="false">http://www.deja-vue.net/blog/2006/05/15/open-source-flash-pizza-for-everyone/</guid>
		<description><![CDATA[<p>Posted in <a href="http://www.deja-vue.net/blog/category/actionstep/" title="ActionStep">ActionStep</a><a href="http://www.deja-vue.net/blog/category/pixlib/" title="Pixlib">Pixlib</a><a href="http://www.deja-vue.net/blog/category/swfmill/" title="Swfmill">Swfmill</a></p>[lang_fr] Ouvrir ce blog est un bon prétexte pour déballer et ranger mes vieux cartons. Il y a quelques mois, bien loin d&#8217;imaginer l&#8217;arrivée du Free Flex SDK, trouver une alternative sérieuse au framework as2 mx était d&#8217;un réel enjeu. C&#8217;est à ce titre que je me suis intéressé à ActionStep. [/lang_fr] [lang_en] Starting a weblog is [...]]]></description>
			<content:encoded><![CDATA[<p>[lang_fr]<br />
Ouvrir ce blog est un bon prétexte pour déballer et ranger mes vieux cartons.<br />
Il y a quelques mois, bien loin d&#8217;imaginer l&#8217;arrivée du <a href="http://labs.adobe.com/technologies/flexframework2/">Free Flex SDK</a>, trouver une alternative sérieuse au framework as2 mx était d&#8217;un réel enjeu. C&#8217;est à ce titre que je me suis intéressé à <a href="http://osflash.org/actionstep">ActionStep</a>.<br />
[/lang_fr]</p>
<p>[lang_en]<br />
Starting a weblog is a good reason for some tidying up ^^.<br />
A few months ago, far from imagine the arrival of the Free Flex SDK, finding an alternative for the as2 mx framework was still a true preoccupation. It is the reason why I took interest in ActionStep.<br />
[/lang_en]</p>
<p>[lang_es]<br />
Abrir este blog es un buen pretexto para revisar y ordenar mis viejas cajas ^^.<br />
Hace algunos meses, lejos de imaginar la llegada del <a href="http://labs.adobe.com/technologies/flexframework2/">Free Flex SDK</a>, encontrar una alternativa al framework as2 mx era realmente una apuesta vital. Es en relación a esto que me interesé en <a href="http://osflash.org/actionstep">ActionStep</a>.<br />
[/lang_es]</p>
<p><span id="more-6"></span></p>
<p>[lang_en]<br />
What I have to say?</p>
<p>Frankly, Actionstep is a very robust framework, but at this date, one can only question oneself about its place and future. The <a href="http://osflash.org/actionstep/roadmap">Roadmap</a> blew up and the announce a few months ago of a free Flex framework let an <a href="http://sourceforge.net/mailarchive/forum.php?thread_id=9613282&amp;forum_id=44945">interrogation</a>.</p>
<p>UPDATE (17.05.06):<br />
Hopefully my fears were only fears. ActionStep stays on the rails !</p>
<p>As of alpha 1 version, I immediately started to test.<br />
Flash Remoting adept since the first days, I was looking, in addition, for an Open Source Remoting API alternative. Thanks to great exchanges with <a href="http://spaces.msn.com/rctay/">Ray Chuan</a> I was able to use ASRemoting in production very early (the package is available as a standalone library). As most of my projects are ARP-based, the first obvious test was to port Pizzaservice to ActionStep.</p>
<div style="text-align: center;">

<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"
			id="fm_Loader_1344639494"
			class="flashmovie"
			width="390"
			height="270">
	<param name="movie" value="http://www.deja-vue.net/test/actionstep/pizzaservice/Loader.swf" />
	<param name="flashvars" value="appUrl=PizzaService.swf&amp;soPath=ASPizzaService" />
	<param name="base" value="http://www.deja-vue.net/test/actionstep/pizzaservice/" />
	<!--[if !IE]>-->
	<object	type="application/x-shockwave-flash"
			data="http://www.deja-vue.net/test/actionstep/pizzaservice/Loader.swf"
			name="fm_Loader_1344639494"
			width="390"
			height="270">
		<param name="flashvars" value="appUrl=PizzaService.swf&amp;soPath=ASPizzaService" />
		<param name="base" value="http://www.deja-vue.net/test/actionstep/pizzaservice/" />
	<!--<![endif]-->
		
	<!--[if !IE]>-->
	</object>
	<!--<![endif]-->
</object>
</div>
<a class="downloadlink" href="http://www.deja-vue.net/blog/wp-content/plugins/download-monitor/download.php?id=2" title=" downloaded 348 times" >pizzaService.zip (348)</a>
<p>I will not speak about the ActionStep API in details, it is not my point.<br />
I will discuss, nevertheless, about a fundamental specificity of its internal workings which led me to use a legitimate hack to make it compatible with ARP.</p>
<p>The expression &#8220;legitimate hack&#8221; is not hazardous:</p>
<p>- Hack, because ActionStep is itself a structural framework.<br />
- Legitimate, because ActionStep is very well-designed and offers a lot of possibilities.</p>
<p>An &#8220;ActionStep/ARP combo&#8221; looks a rather absurd idea whose realization seems compromised enough. In particular, for the following reasons:</p>
<p>- ActionStep prevents us from dealing directly with MovieClips, encapsulating this management in a hierarchy of View relations.<br />
- The views depend on a super view (instantiated by NSWindow) hardwired to  _root.<br />
- Like above-mentioned, Actionstep is also an application framework conceived to initialize at the base of the project (NSapplication).</p>
<p>[as]<br />
public function init()<br />
{<br />
	var app:NSApplication = NSApplication.sharedApplication();</p>
<p>	var window:NSWindow = (new NSWindow()).initWithContentRect(<br />
	new NSRect(0,0,500,400));<br />
	var view1:NSView = (new NSView()).initWithFrame(<br />
	new NSRect(50,50,400,300));</p>
<p>	window.setContentView(view1);</p>
<p>	// Some UI instantiation later&#8230;<br />
	view1.addSubview(ASLabel);<br />
	view1.addSubview(NSStepper);</p>
<p>	// Start the mug&#8230;<br />
	app.run();<br />
}<br />
[/as]</p>
<p>So, how we make it? It&#8217;s not that complicated.</p>
<p>The NSWindow class allows to load different types of super View. If I simplify, the super view can be:</p>
<p>- an external SWF<br />
- instances of window.ASRootWindowView</p>
<p>You surely got it, the solution consists in subclassing ASRootWindowView and give our custom super view a method to reparent the MovieClip target.</p>
<p>[as]<br />
class org.actionstep.window.ASClipWindowView<br />
	extends org.actionstep.window.ASRootWindowView<br />
{<br />
	public function ASClipWindowView() {<br />
		super();<br />
	}</p>
<p>	public function changeRoot(target:MovieClip) {<br />
		WINDOW_CLIP = target<br />
	}<br />
}<br />
[/as]</p>
<p>[as]<br />
// org.osflash.pizza.view.NavigationForm</p>
<p>import org.actionstep.window.ASClipWindowView;<br />
import org.actionstep.*;</p>
<p>// &#8230;</p>
<p>public function initialize()<br />
{<br />
	var app:NSApplication = NSApplication.sharedApplication();</p>
<p>	var window:NSWindow = (new NSWindow()).initWithContentRectViewClass(<br />
		new NSRect(0,0,165,25), ASClipWindowView );</p>
<p>	ASClipWindowView(window.rootView()).changeRoot(this);</p>
<p>	var view:NSView = NSView((new NSView()).initWithFrame(<br />
		new NSRect(0, 0, 165, 25)));</p>
<p>	window.setContentView(view);</p>
<p>	// &#8230;</p>
<p>	// Start the mug&#8230;<br />
	app.run()<br />
}<br />
[/as]</p>
<p>Its a kind of composition where each form instantiates its own NSApplication.</p>
<p>Put aside the gradient header and the transitions, all is work of ActionStep.</p>
<p>There is still a lot to say, especially about ASRemoting. In a next post I will describe how ASResponse &#038; ASRecordset handle remoting results and underline the difference of implementation in ServiceLocator and the CommandTemplate subclasses.</p>
<p>Let&#8217;s speak about what is not ActionStep in this version.</p>
<p>Building pizzaService without the support of any FLA was a condition and did not suppose any major challenge. Font embedding wasn&#8217;t an issue either. The difficulty rised when I choose the option to dynamically load the fonts. I had to face the plague of sharedfonts.<br />
The solution comes from a <a href="http://osflash.org/pipermail/swfmill_osflash.org/2005-November/000291.html">suggestion from Chris Bare</a> on the SWFMILL mailing-list. A solution that consists in what himself would name an &#8220;educational analysis&#8221;. A big thank to him for its invaluable tip.</p>
<p>Here thus, the navigation of our OSFlash pizzaService with NSButton dynamically stylized.</p>
<p>For the Tween effects I preferred the transitions package of <a href="http://osflash.org/pixlib">Pixlib</a>.<br />
If you do not know this fantastic generic framework, then go discover it. It is a swiss army knife. I cannot live without it anymore !.<br />
For example, with modest applications, ARP seems sometimes too heavy for me, in such cases I use Pixlib&#8217;s MVC.</p>
<p>Let&#8217; s return to the transitions:</p>
<p>Changes are very simple :</p>
<p>[as]<br />
import mx.transitions.*<br />
var t:Tween = new Tween(target, &#8220;prop&#8221;, pennerEasing, begin, finish, duration, useSeconds);<br />
[/as]</p>
<p>with  Pixlib<br />
[as]<br />
import com.bourre.transitions.*;<br />
var t:BasicTweenFPS = (new BasicTweenFPS(<br />
	target, &#8220;prop&#8221;, finish, duration, begin, pennerEasing)).execute();<br />
or<br />
var t:BasicTweenMS = (new BasicTweenMS(<br />
	target, &#8220;prop&#8221;, finish, duration, begin, pennerEasing)).execute();<br />
[/as]</p>
<p>Do not forget to download and place in your classPath the <a href="http://www.robertpenner.com/easing/">Penner&#8217;s equations</a> if you do not have them already.</p>
<p>EventDispatching</p>
<p>Finally, our pizzaService needs one last thing to deserve its OSFlash label: to free itself from EventDispatcher.<br />
Pixlib &#8216;s EventBroadcaster thus comes to replace it (in a completely polymorphic way).</p>
<p>I will stop there. You will learn more by yourself examining the sources.<br />
Note that you can also start exploring the online demo with <a href="http://osflash.org/xray">Xray</a> (the pizza is delivered with its connector ^^).</p>
<p>Once again it was only a laboratory experiment. Not very polished. Moreover the revision I used is outdated (February, if I remember), so careful if you try to compile with the latest sources from the <a href="http://svn1.cvsdude.com/osflash/actionstep/trunk/">svn</a>. It could may not work.</p>
<p>The project was developed using <a href="http://www.flashdevelop.org/community/">FlashDevelop</a>. Grateful thanks to the FD team for their amazing work!</p>
<p>Thank you to read this first ticket.<br />
[/lang_en]</p>
<p>[lang_fr]<br />
Que puis-j&#8217;en dire ?</p>
<p>Franchement, ce n&#8217;est pas sa robustesse qui lui fait défaut, mais au jour d&#8217;aujourd&#8217;hui, on ne peut que se questionner sur sa place et son devenir.<br />
Le <a href="http://osflash.org/actionstep/roadmap">Roadmap</a> a complètement explosé et l&#8217;annonce il y a quelques mois du Flex framework posa l&#8217; <a href="http://sourceforge.net/mailarchive/forum.php?thread_id=9613282&amp;forum_id=44945">intérrogation</a></p>
<p>Dès la sortie de la version alpha, j&#8217;avais donc commencé à experimenter un peu.<br />
Flash Remotien convaincu, je cherchais par ailleurs une alternative à l&#8217; implémentation remoting d&#8217; Adobe.<br />
De fructueux échanges avec <a href="http://spaces.msn.com/rctay/blog/">Ray Chuan</a> m&#8217; ont permis d&#8217;utiliser l&#8217; ASRemoting très tôt en production car la librarie est disponible de façon autonome, chargeable ala DLL.</p>
<p>La majorité de mes projets reposant sur ARP, un premier test tout indiqué était le portage de Pizzaservice.</p>
<div style="text-align: center;">

<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"
			id="fm_Loader_1740112154"
			class="flashmovie"
			width="390"
			height="270">
	<param name="movie" value="http://www.deja-vue.net/test/actionstep/pizzaservice/Loader.swf" />
	<param name="flashvars" value="appUrl=PizzaService.swf&amp;soPath=ASPizzaService" />
	<param name="base" value="http://www.deja-vue.net/test/actionstep/pizzaservice/" />
	<!--[if !IE]>-->
	<object	type="application/x-shockwave-flash"
			data="http://www.deja-vue.net/test/actionstep/pizzaservice/Loader.swf"
			name="fm_Loader_1740112154"
			width="390"
			height="270">
		<param name="flashvars" value="appUrl=PizzaService.swf&amp;soPath=ASPizzaService" />
		<param name="base" value="http://www.deja-vue.net/test/actionstep/pizzaservice/" />
	<!--<![endif]-->
		
	<!--[if !IE]>-->
	</object>
	<!--<![endif]-->
</object>
</div>
<a class="downloadlink" href="http://www.deja-vue.net/blog/wp-content/plugins/download-monitor/download.php?id=2" title=" downloaded 348 times" >pizzaService.zip (348)</a>
<p>Je ne vais pas rentrer dans le détail de l&#8217;API, ce n&#8217;est pas mon propos.</p>
<p>Je parlerai néanmoins d&#8217;une spécificité fondamentale des rouages d&#8217; ActionStep qui m&#8217;a conduit à employer un hack (tout à fait legitime) pour le rendre compatible ARP.</p>
<p>L&#8217; expression &#8220;hack legitime&#8221; n&#8217;est pas hasardeuse:</p>
<p>- Hack, car ActionStep est déjà  en soi un framework structurel.<br />
- Légitime, car ses auteurs ont pensé à laisser des portes ouvertes.</p>
<p>Intégrer ActionStep et ARP est une idée plutôt saugrenue dont la réalisation semble assez compromise. En particulier, pour les raisons suivantes:</p>
<p>- ActionStep nous protège de la manipulation directe des Movieclips, encapsulant cette gestion dans une hiérarchie de type View.<br />
- Les views dépendent d&#8217;une view principale (instanciée par NSWindow) dont la référence MovieClip de base a été codée en dur et n&#8217;est autre que _root.<br />
- Comme sus-mentionné, Actionstep est aussi un framework de type applicatif, et à priori conçu pour s&#8217;initialiser à la racine de votre project (NSapplication).</p>
<p>[as]<br />
public function init()<br />
{<br />
	var app:NSApplication = NSApplication.sharedApplication();</p>
<p>	var window:NSWindow = (new NSWindow()).initWithContentRect(<br />
		new NSRect(0,0,500,400));<br />
	var view1:NSView = (new NSView()).initWithFrame(<br />
		new NSRect(50,50,400,300));</p>
<p>	window.setContentView(view1);</p>
<p>	// Some UI instantiation later&#8230;<br />
	view1.addSubview(ASLabel);<br />
	view1.addSubview(NSStepper);</p>
<p>	// Start the mug&#8230;<br />
	app.run();<br />
}<br />
[/as]<br />
Comment faire? C&#8217;est plus simple qu&#8217;il n&#8217;y paraît&#8230;</p>
<p>La classe NSWindow contemple la possibilité de charger différents types de view principale. Si je simplifie, la view principale est:</p>
<p>- soit issue d&#8217;une source externe (chargement SWF).<br />
- soit la view par défaut, de type ASRootWindowView.</p>
<p>De type ? <img src='http://www.deja-vue.net/blog/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> . Eh oui ^^. Vous l&#8217;aurez compris, la solution consiste à offrir à NSWindow une view custom où la cible MovieClip sur laquelle s&#8217;initie l&#8217;application sera de notre choix.</p>
<p>[as]<br />
class org.actionstep.window.ASClipWindowView<br />
	extends org.actionstep.window.ASRootWindowView<br />
{<br />
	public function ASClipWindowView() {<br />
		super();<br />
	}</p>
<p>	public function changeRoot(target:MovieClip) {<br />
		WINDOW_CLIP = target<br />
	}<br />
}<br />
[/as]</p>
<p>[as]<br />
// org.osflash.pizza.view.NavigationForm</p>
<p>import org.actionstep.window.ASClipWindowView;<br />
import org.actionstep.*;</p>
<p>// &#8230;</p>
<p>public function initialize()<br />
{<br />
	var app:NSApplication = NSApplication.sharedApplication();</p>
<p>	var window:NSWindow = (new NSWindow()).initWithContentRectViewClass(<br />
		new NSRect(0,0,165,25), ASClipWindowView );</p>
<p>	ASClipWindowView(window.rootView()).changeRoot(this);</p>
<p>	var view:NSView = NSView((new NSView()).initWithFrame(<br />
		new NSRect(0, 0, 165, 25)));</p>
<p>	window.setContentView(view);</p>
<p>	// &#8230;</p>
<p>	// Start the mug&#8230;<br />
	app.run()<br />
}<br />
[/as]</p>
<p>On peut voir ça comme une composition où chaque ArpForm va instancier une NSApplication depuis la méthode initialize().</p>
<p>Mis à part le gradient header et les transitions, tout est oeuvre d&#8217;ActionStep.</p>
<p>J&#8217;aurais encore beaucoup à dire, notamment concernant sa librairie Remoting.<br />
Ce sera le sujet d&#8217;un prochain post où je compte présenter différentes façons de charger en DLL, décortiquer l&#8217;ASResponse (equivalent du ResultEvent) et l&#8217; ASRecordSet, et souligner la différence d&#8217;implémentation dans le ServiceLocator et les sous-classes CommandTemplate.</p>
<p>Parlons maintenant de ce qui n&#8217;est pas ActionStep.</p>
<p>Reconstruire pizzaService sans support de fichier FLA était pour moi une condition et ne supposait aucun défi majeur. Embarquer des polices ne présentait pas plus de difficulté. La problématique se posa néanmoins à l&#8217;heure d&#8217;opter pour le chargement des polices en externe. Là, je me retrouvais de nouveau confronté au supplice des librairies partagées.<br />
La solution vînt d&#8217;une <a href="http://osflash.org/pipermail/swfmill_osflash.org/2005-November/000291.html">suggestion que me fit Chris Bare</a> sur la mailing-list de SWFMILL.<br />
Une solution passant par ce que lui même n&#8217; hésite pas à nommer une &#8220;analyse éducative&#8221;. Big thank to him for this invaluable tip.</p>
<p>Voici donc la navigation de notre open source pizzaService pourvu de NSButton dynamiquement stylisé.</p>
<p>Pour les effets de Tween j&#8217;ai préféré le package transitions de <a href="http://osflash.org/pixlib">Pixlib</a>.<br />
Si vous ne connaissez pas encore ce fantastique framework polyvalent, allez tout de suite le découvrir. C&#8217;est un vrai couteau-suisse. C&#8217;est simple, je ne peux plus m&#8217;en passer ^^.</p>
<p>Petite parenthèse à propos de Pixlib (Je lui consacrerai plusieurs tickets).<br />
Personnellement, quand ARP me semble parfois surchargé pour certains types d&#8217;applications, je lui préfère généralement le package MVC de Pixlib.</p>
<p>Revenons aux transitions&#8230;<br />
Le portage est vraiment très simple:</p>
<p>[as]<br />
import mx.transitions.*;<br />
var t:Tween = new Tween(<br />
	target, &#8220;prop&#8221;, pennerEasing, begin, finish, duration, useSeconds);<br />
[/as]<br />
avec Pixlib<br />
[as]<br />
import com.bourre.transitions.*<br />
var t:BasicTweenFPS = (new BasicTweenFPS(<br />
	target, &#8220;prop&#8221;, finish, duration, begin, pennerEasing)).execute();<br />
or<br />
var t:BasicTweenMS = (new BasicTweenMS(<br />
	target, &#8220;prop&#8221;, finish, duration, begin, pennerEasing)).execute();<br />
[/as]</p>
<p>N&#8217;oubliez pas de télécharger et placer dans votre classPath les <a href="http://www.robertpenner.com/easing/">équations de Penner</a> si vous ne les avez pas déjà .</p>
<p>EventDispatching</p>
<p>Finalement, il ne manque qu&#8217;une seule chose à notre service de pizza pour meriter son label OSFlash: s&#8217; affranchir de l&#8217; EventDispatcher.<br />
La classe EventBroadcaster de Pixlib vient donc le remplacer (de façon totalement polymorphique). Quand je vous dis que Pixlib couvre tous les besoins&#8230;</p>
<p>Je vais m&#8217;arreter là. Vous en apprendrez davantage par vous mêmes en examinant les sources.<br />
A noter que vous pouvez aussi commencer par explorer l&#8217;application en ligne avec <a href="http://osflash.org/xray">Xray</a> (la pizza est livrée avec son connector ^^).</p>
<p>Encore une fois ce n&#8217; était qu&#8217;une expérience de laboratoire. De plus la révision qui m&#8217;a servi est relativement ancienne. Ne soyez donc pas étonnés si la compilation échoue avec la dernière <a href="http://svn1.cvsdude.com/osflash/actionstep/trunk/">révision</a>.</p>
<p>Le projet à été developpé avec <a href="http://www.flashdevelop.org/community/">FlashDevelop</a>. J&#8217;en profite pour saluer l&#8217;equipe de FD et féliciter leur formidable travail!</p>
<p>Merci d&#8217;avoir lu ce premier vrai billet <img src='http://www.deja-vue.net/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> .</p>
<p>[lang_es]<br />
¿Que puedo decir de ello?</p>
<p>Francamente, no es que le falte robustez, pero a día de hoy, tan sólo podemos preguntarnos sobre su lugar y su futuro.<br />
El <a href="http://osflash.org/actionstep/roadmap">Roadmap</a> ha reventado completamente y el anuncio hace algunos meses del Flex framework ha puesto la <a href="http://sourceforge.net/mailarchive/forum.php?thread_id=9613282&amp;forum_id=44945">cuestión</a></p>
<p>Desde la salida de la versión alfa, había comenzado a experimentar un poco.<br />
Flash Remotero de toda la vida, buscaba además una versión alternativa al paquete remoting de Adobe.<br />
Mis fructíferos intercambios con <a href="http://spaces.msn.com/rctay/blog/">Ray Chuan</a> me han pertimido usar muy pronto el ASRemoting para la producción dado que la librería está disponible de manera independiente cargable ala DLL.</p>
<p>Estando apoyados la mayoría de mis proyectos en ARP, un primer test obvio era llevar Pizzaservice a ActionStep.</p>
<div style="text-align: center;">

<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"
			id="fm_Loader_800114137"
			class="flashmovie"
			width="390"
			height="270">
	<param name="movie" value="http://www.deja-vue.net/test/actionstep/pizzaservice/Loader.swf" />
	<param name="flashvars" value="appUrl=PizzaService.swf&amp;soPath=ASPizzaService" />
	<param name="base" value="http://www.deja-vue.net/test/actionstep/pizzaservice/" />
	<!--[if !IE]>-->
	<object	type="application/x-shockwave-flash"
			data="http://www.deja-vue.net/test/actionstep/pizzaservice/Loader.swf"
			name="fm_Loader_800114137"
			width="390"
			height="270">
		<param name="flashvars" value="appUrl=PizzaService.swf&amp;soPath=ASPizzaService" />
		<param name="base" value="http://www.deja-vue.net/test/actionstep/pizzaservice/" />
	<!--<![endif]-->
		
	<!--[if !IE]>-->
	</object>
	<!--<![endif]-->
</object>
</div>
<a class="downloadlink" href="http://www.deja-vue.net/blog/wp-content/plugins/download-monitor/download.php?id=2" title=" downloaded 348 times" >pizzaService.zip (348)</a>
<p>No entraré en el detalle del API, no es mi intención.</p>
<p>Hablaré sin embargo de una especificidad fundamental en el funcionamiento interno de ActionStep que me condujo a emplear un hack (totalmente legítimo) para hacerlo compatible con ARP.<br />
El término &#8220;hack legítimo&#8221; no es casual:</p>
<p>- &#8220;Hack&#8221; porque ActionStep es ya, por sí mismo, un framework estructural.<br />
- &#8220;Legítimo&#8221;, ya que sus autores han pensando en dejar las puertas abiertas.</p>
<p>Integrar ActionStep y ARP es pues una idea más bien descabellada cuya realización parece bastante comprometida. En particular, por las razones siguientes:</p>
<p>- ActionStep nos protege de la manipulación directa de los MovieClips, encapsulando esta gestión en una jeraquía de tipo view.<br />
- Los views dependen de una view principal (instanciada por NSWindow) cuya referencia MovieClip de base ha sido &#8220;hardcoded&#8221; y no es otra que _root.<br />
- Como ya he dicho antes, Actionstep es tambíen un framework de tipo aplicativo y a priori concebido para inicializarse en la raíz del proyecto (NSapplication).</p>
<p>[as]<br />
public function init()<br />
{<br />
	var app:NSApplication = NSApplication.sharedApplication();</p>
<p>	var window:NSWindow = (new NSWindow()).initWithContentRect(<br />
	new NSRect(0,0,500,400));<br />
	var view1:NSView = (new NSView()).initWithFrame(<br />
	new NSRect(50,50,400,300));</p>
<p>	window.setContentView(view1);</p>
<p>	// Some UI instantiation later&#8230;<br />
	view1.addSubview(ASLabel);<br />
	view1.addSubview(NSStepper);</p>
<p>	// Start the mug&#8230;<br />
	app.run();<br />
}<br />
[/as]<br />
¿Cómo hacer, pues? Es más simple de lo que parece.</p>
<p>La clase NSWindow contempla la posibilidad de cargar diferentes tipos de view principal. Simplificando, la view principal es:</p>
<p>- o bien de origen externo (cargando un SWF)<br />
- o bien la view por defecto, de tipo ASRootWindowView.</p>
<p>¿&#8221;de tipo&#8221; ? <img src='http://www.deja-vue.net/blog/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> . Pues sí^^. Como ya habráis comprendido, la solución consiste en dar a NSWindow una view customizada donde el MovieClip en el cual se inicia la aplicación será de nuestra elección.</p>
<p>[as]<br />
class org.actionstep.window.ASClipWindowView<br />
	extends org.actionstep.window.ASRootWindowView<br />
{<br />
	public function ASClipWindowView() {<br />
		super();<br />
	}</p>
<p>	public function changeRoot(target:MovieClip) {<br />
		WINDOW_CLIP = target<br />
	}<br />
}<br />
[/as]</p>
<p>[as]<br />
// org.osflash.pizza.view.NavigationForm</p>
<p>import org.actionstep.window.ASClipWindowView;<br />
import org.actionstep.*;</p>
<p>// &#8230;</p>
<p>public function initialize()<br />
{<br />
	var app:NSApplication = NSApplication.sharedApplication();</p>
<p>	var window:NSWindow = (new NSWindow()).initWithContentRectViewClass(<br />
	new NSRect(0,0,165,25), ASClipWindowView );</p>
<p>	ASClipWindowView(window.rootView()).changeRoot(this);</p>
<p>	var view:NSView = NSView((new NSView()).initWithFrame(<br />
	new NSRect(0, 0, 165, 25)));</p>
<p>	window.setContentView(view);</p>
<p>	// &#8230;</p>
<p>	// Start the mug&#8230;<br />
	app.run()<br />
}<br />
[/as]</p>
<p>Podemos ver esto como una &#8220;composición&#8221; donde cada ArpForm va a instanciar una NSApplication desde el metodo initialize().</p>
<p>Aparte del &#8220;gradient header&#8221; y de las &#8220;transiciones&#8221;, todo es obra de ActionStep.</p>
<p>Tendría mucho que decir aún, sobre todo concerniente a su librería Remoting.<br />
Será el tema de un próximo artículo donde cuento con presentar diferentes maneras de cargar en DLL, desmenuzar el ASResponse (equivalente del ResultEvent) y el ASRecordSet, y subrayar la diferencia de implementación en el ServiceLocator y las subclases CommandTemplate.</p>
<p>Hablemos ahora de lo que no es ActionStep.</p>
<p>Reconstruir pizzaService sin soporte de un fichero FLA era para mí una condición y no suponía ningún desafío mayor. Importar fuentes no presentaba tampoco más dificultad.<br />
La problemática surgió sin embargo a la hora de optar por cargar dinámicamente las fuentes. Ahí me encontré confrontado de nuevo al suplicio de las librerías compartidas.</p>
<p>La solución vino de una <a href="http://osflash.org/pipermail/swfmill_osflash.org/2005-November/000291.html">sugerencia que me hizo Chris Bare</a> en la mailing-list de SWFMILL.<br />
Una solución que pasa por lo que el mismo no duda en llamar un &#8220;analisis educativo&#8221;. Big thank to him for this invaluable tip.</p>
<p>He aquí, pues, la navegación de nuestro open source pizzaService con NSButtons de estilo determinado dinámicamente.</p>
<p>Para los efectos &#8220;Tween&#8221;, he preferido el paquete transitions de <a href="http://osflash.org/pixlib">Pixlib</a>.<br />
Si no conocáis aún este fantástico framework polivalente, id enseguida a descubrirlo. Es una verdadera navaja suiza. Simplemente, ya no puedo pasarme sin ella ^^.</p>
<p>Pequeño paréntesis sobre Pixlib.<br />
Le dedicaré varios tópicos, incluso puede que el siguiente.<br />
Personalmente, cuando ARP me parece a veces sobrecargado para ciertos tipos de aplicaciones, generalmente prefiero en su lugar el paquete MVC de Pixlib.</p>
<p>Volvamos a las &#8220;transiciones&#8221;&#8230;<br />
El cambio es realmente muy simple:</p>
<p>[as]<br />
import mx.transitions.*<br />
var t:Tween = new Tween(<br />
	target, &#8220;prop&#8221;, pennerEasing, begin, finish, duration, useSeconds);<br />
[/as]</p>
<p>avec Pixlib<br />
[as]<br />
import com.bourre.transitions.*;<br />
var t:BasicTweenFPS = (new BasicTweenFPS(<br />
	target, &#8220;prop&#8221;, finish, duration, begin, pennerEasing)).execute();<br />
or<br />
var t:BasicTweenMS = (new BasicTweenMS(<br />
	target, &#8220;prop&#8221;, finish, duration, begin, pennerEasing)).execute();<br />
[/as]</p>
<p>No olvidáis descargar y poner en su classPath las <a href="http://www.robertpenner.com/easing/">ecuaciones de Penner</a> si no las tenéis ya.</p>
<p>EventDispatching</p>
<p>Finalmente, tan sólo falta una cosa a nuestro servicio de pizza para merecer su sello OSFlash: liberarse del EventDispatcher.<br />
La clase EventBroadcaster de Pixlib viene pues a reemplazarlo (de manera totalmente polimorfica). Cuando os digo que Pixlib cubre todas las necesidades&#8230;</p>
<p>Voy a dejarlo aquí. Aprenderéis más por vosotros mismos examinando las fuentes.<br />
Notad que podéis también empezar por explorar la aplicación aquí con <a href="http://osflash.org/xray">Xray</a> (la pizza se entrega con su conector ^^)</p>
<p>Una vez más, tan sólo era un experimento de laboratorio. Además la revisión que usé es relativamente antigua (mes de Febrero, creo). No os sorprendáis, pues, si vuestra compilación falla con la ultima <a href="http://svn1.cvsdude.com/osflash/actionstep/trunk/">revisión</a>.</p>
<p>El proyecto ha sido desarollado con <a href="http://www.flashdevelop.org/community/">FlashDevelop</a>. Aprovecho para saludar al equipo de FD y felicitar su formidable labor!</p>
<p>Gracias por haber leído este primer post de verdad <img src='http://www.deja-vue.net/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> .<br />
[/lang_es] </p>
]]></content:encoded>
			<wfw:commentRss>http://www.deja-vue.net/blog/2006/05/15/open-source-flash-pizza-for-everyone/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
	</channel>
</rss>

