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

	public class JarExec
	{
		protected var _process:NativeProcess;

		public function JarExec()
		{
		}

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

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

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

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

				trace(&quot;-- Début d&#039;exécution&quot;);
			}
			catch (e:Error)
			{
				trace(&quot;Impossible de lancer le process\n&quot; + e.message + &quot;\n&quot; + e.getStackTrace());
			}
		}
		protected function onStandardOut(e:ProgressEvent):void
		{
			trace(&quot;STDOUT: &quot; + _process.standardOutput.readUTFBytes(_process.standardOutput.bytesAvailable));
		}
		protected function onErrorOut(e:ProgressEvent):void
		{
			trace(&quot;STDERR: &quot; + _process.standardError.readUTFBytes(_process.standardError.bytesAvailable));
		}
		protected function onJavaTestExit(e:NativeProcessExitEvent):void
		{
			trace(&quot;-- Fin d&#039;exécution&quot;);
		}
	}
}
</pre>
<p>Cet extrait donne un aperçu, mais vous pouvez vous lancer (soyons fous) à installer le package suivant :<br />
<center></p>
<table style="text-align: center">
<tbody>
<tr>
<td><a href="http://www.lafabrick.com/labz/nativeprocess/NativeJarExec.dmg"><img src="http://www.lafabrick.com/blog/wp-content/uploads/2010/07/mac.gif" alt="" title="Mac" width="50" height="50" /><br/>Pour Mac</a></td>
<td><a href="http://www.lafabrick.com/labz/nativeprocess/NativeJarExec.exe"><img src="http://www.lafabrick.com/blog/wp-content/uploads/2010/07/windows.jpeg" alt="" title="Windows" width="50" height="50" /><br/>Pour Windows</a></td>
</tr>
</tbody>
</table>
<p>Pensez au clic droit > View Source&#8230;<br />
</center>
</ul>
<h2>Packager l&#8217;application</h2>
<p>Comme je le disais au début de ce post, il est nécessaire de packager votre application dans le format natif du système d&#8217;exploitation visé. Vous avez deux solutions pour cela : </p>
<ol>
<li>Passer par la dernière version de Flash Builder 4 qui propose cette fonctionnalité</li>
<li>Utiliser l&#8217;application <a href="http://www.webkitchen.be/package-assistant-pro/">PackageAssistantPro</a> proposée par <a href="http://www.webkitchen.be">Serge Jespers</a> (re merci Serge)</li>
</ol>
<p>Il s&#8217;agit d&#8217;une application AIR utilisant des NativeProcess (et packagée en ligne de commande vu que l&#8217;application n&#8217;existait pas avant&#8230; Remarquez, la version 2 et plus ont probablement été packagées avec la version 1&#8230; Mais je m&#8217;égare)</p>
<h2>Quelques liens</h2>
<ul>
<li>Un petit exemple d&#8217;application utilisant un NativeProcess : <a href="http://www.lafabrick.com/blog/2010/07/28/2092-zxpackager-application-pour-l%e2%80%99empaquetage-zxp-d%e2%80%99extensions-cs5/">ZXPackager</a></li>
<li><a href="http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/desktop/NativeProcess.html" lang="en_US">ASDoc de la classe NativeProcess [EN]</a></li>
<li><a href="http://www.adobe.com/devnet/air/flex/quickstart/interacting_with_native_process.html" lang="en_US">Un bon article pour démarrer [EN]</a>
</ul>
<p>Autres articles sur le même sujet
<ul>
<li><a href="http://www.lafabrick.com/blog/2007/11/15/266-debuguer-un-projet-flex-distant-via-flex-builder/" rel="bookmark" title="15 novembre 2007">L&#8217;erreur est humaine&#8230; debuguer un projet Flex distant via Flex Builder</a></li>
<li><a href="http://www.lafabrick.com/blog/2008/02/04/299-un-projet-java-flex-avec-maven-2/" rel="bookmark" title="4 février 2008">Un projet Java / Flex avec Maven 2</a></li>
<li><a href="http://www.lafabrick.com/blog/2008/06/06/327-google-language-api-flex/" rel="bookmark" title="6 juin 2008">Google AJAX Language API&#8230; et ton Flex devient polyglotte !</a></li>
<li><a href="http://www.lafabrick.com/blog/2010/04/06/1754-arduino-2-flash-socket-et-processing/" rel="bookmark" title="6 avril 2010">Arduino #2 : Flash, socket et Processing</a></li>
</ul>
<p><!-- Similar Posts took 13.462 ms --></p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/lafabrick?a=wgMqtUJWGxo:RjKUf-wjrlo:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/lafabrick?i=wgMqtUJWGxo:RjKUf-wjrlo:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/lafabrick?a=wgMqtUJWGxo:RjKUf-wjrlo:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/lafabrick?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/lafabrick?a=wgMqtUJWGxo:RjKUf-wjrlo:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/lafabrick?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/lafabrick?a=wgMqtUJWGxo:RjKUf-wjrlo:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/lafabrick?d=qj6IDK7rITs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/lafabrick?a=wgMqtUJWGxo:RjKUf-wjrlo:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/lafabrick?i=wgMqtUJWGxo:RjKUf-wjrlo:F7zBnMyn0Lo" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/lafabrick/~4/wgMqtUJWGxo" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.lafabrick.com/blog/2010/08/20/2167-air-2-appeler-un-jar-executable-via-un-nativeprocess/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<feedburner:origLink>http://www.lafabrick.com/blog/2010/08/20/2167-air-2-appeler-un-jar-executable-via-un-nativeprocess/</feedburner:origLink></item>
		<item>
		<title>ZXPackager : application pour l’empaquetage ZXP d’extensions CS5</title>
		<link>http://feedproxy.google.com/~r/lafabrick/~3/7dWSXHQW1jQ/</link>
		<comments>http://www.lafabrick.com/blog/2010/07/28/2092-zxpackager-application-pour-l%e2%80%99empaquetage-zxp-d%e2%80%99extensions-cs5/#comments</comments>
		<pubDate>Wed, 28 Jul 2010 21:10:53 +0000</pubDate>
		<dc:creator>Fabien</dc:creator>
				<category><![CDATA[La Fabrick]]></category>
		<category><![CDATA[Nos projets]]></category>
		<category><![CDATA[AIR]]></category>
		<category><![CDATA[Applications]]></category>
		<category><![CDATA[Flex]]></category>
		<category><![CDATA[Lafabrick]]></category>
		<category><![CDATA[zxp]]></category>

		<guid isPermaLink="false">http://www.lafabrick.com/blog/?p=2092</guid>
		<description><![CDATA[Vous l&#8217;aurez peut être remarqué, nous avons ajouté une rubrique Applications au blog. Nous travaillons actuellement sur plusieurs applications AIR orientées &#171;&#160;aide au développeur&#160;&#187;. ZXPackager est la première d&#8217;entre elles. Cette application propose un moyen simple de packager vos extensions CS5 développées avec le nouveau SDK Creative Suite. Les extensions ZXP Depuis la CS5, Adobe [...]]]></description>
			<content:encoded><![CDATA[<table width="100%">
<tr>
<td width="125px"><img src="http://www.lafabrick.com/blog/wp-content/uploads/2010/07/logo128.png"  width="128" height="128" class="aligncenter size-full wp-image-2099" /></td>
<td width="100%">Vous l&#8217;aurez peut être remarqué, nous avons ajouté une rubrique <a href="http://www.lafabrick.com/blog/applications/">Applications</a> au blog. Nous travaillons actuellement sur plusieurs applications AIR orientées &laquo;&nbsp;aide au développeur&nbsp;&raquo;. ZXPackager est la première d&#8217;entre elles.</p>
<p>Cette application propose un moyen simple de packager vos extensions CS5 développées avec le nouveau SDK Creative Suite.</td>
</tr>
</table>
<p><span id="more-2092"></span></p>
<h2>Les extensions ZXP</h2>
<p>Depuis la CS5, Adobe propose un nouveau SDK de développement et un format d&#8217;extension commun a toute la suite logicielle.<br />
Ce SDK, <a href="http://www.adobe.com/devnet/creativesuite/sdk/eula_cs5_toolkit.html">disponible ici</a>, vous permet de développer vos propres panneaux et autres menus CS5. Le premier format de sortie est le MXP, toujours disponible, vous permettant d&#8217;exporter votre extension pour un logiciel cible.<br />
Maintenant, avec la CS5, vous disposez d&#8217;un format commun, le ZXP, qui rend compatible votre extension avec toutes la suites CS. </p>
<p>Un fichier ZXP est défini par un manifeste xml, définissant le fonctionnement de l&#8217;extension (type, portée logiciel, &#8230;), et contient le (les) SWF de l&#8217;extension (une extension est en fait une pseudo application AIR, basée sur le SDK CS). Un fichier ZXP est signé numériquement. Vous devez donc avoir un certificat (PKCS12, PKCS11, JKS). Vous pouvez bien entendu utiliser votre certificat auto-signé préalablement créé avec Flash/Flex Buider. </p>
<p>Pour plus d&#8217;informations :</p>
<ul>
<li><a href="http://www.adobe.com/devnet/creativesuite/sdk/index.html">Creative Suite SDK</a></li>
<li><a href="http://blogs.adobe.com/cssdk/">le blog CSSDK</a></li>
</ul>
<p>Un fichier ZXP doit (habituellement) être compilé en utilisant le packager Java <a href="http://www.adobe.com/devnet/creativesuite/sdk/eula_cs5_toolkit.html">UCF</a>. Et c&#8217;est là l&#8217;idée de cette petite application : ne pas avoir a redéfinir vos certificats et autres options pour chaque package, et vous proposer une interface plus &laquo;&nbsp;user friendly&nbsp;&raquo; que le terminal.</p>
<h2>Fonctionnement</h2>
<h3>Démarrage, et préférences</h3>
<p>Au premier démarrage, l&#8217;application doit obtenir vos préférences de base.<br />
<center><img src="http://www.lafabrick.com/blog/wp-content/uploads/2010/07/Preferences.png" alt="Preferences" title="Preferences" width="500" height="450" class="aligncenter size-full wp-image-2100" /></center></p>
<ul>
<li>
<h4>Java Home</h4>
<p>Vous devez indiquer le chemin vers votre JDK/JRE java, si celui-ci ne correspond pas à celui par défaut (l&#8217;application intègre le packager jar UCF, et elle doit connaître le répertoire racine de Java pour pouvoir le lancer). Les chemins racines par défaut sont:</p>
<ul>
<li>Pour Windows : <strong>&#8216;C:\Program Files\Java\jdk1.6.0&#8242;</strong></li>
<li>Pour Mac : <strong>&#8216;/System/Library/Frameworks/JavaVM.framework/Versions/1.6.0&#8242;</strong></li>
</ul>
</li>
<li>
<h4>Certificat</h4>
<p>Vous devez préciser l&#8217;emplacement de votre certificat (généralement un fichier de type .p12 ou .p11), ainsi que votre mot de passe. Ces informations sont nécessaires pour la signature de l&#8217;extension.
</li>
<h3>Définition de votre extension</h3>
<p>Un package ZXP a besoin de 2 informations : le nom et l&#8217;emplacement de votre extension cible, et l&#8217;endroit où se trouve le répertoire &laquo;&nbsp;bin&nbsp;&raquo; de votre extension.<br />
<center><img src="http://www.lafabrick.com/blog/wp-content/uploads/2010/07/StartProject.png" alt="start package" title="StartProject" width="500" height="450" class="aligncenter size-full wp-image-2102" /></center></p>
<ul>
<li>
<h4>Fichier cible</h4>
<p>Vous devez indiquer le fichier de destination. L&#8217;extension .zxp est ajoutée automatiquement.
</li>
<li>
<h4>Source de l&#8217;extension</h4>
</li>
<p>Les sources de l&#8217;extension, comme défini dans la nomenclature du SDK CS, doivent correspondre à ce schéma:<br />
<center><img src="http://www.lafabrick.com/blog/wp-content/uploads/2010/07/binPackageOverview.png" width="537" height="80" class="aligncenter size-full wp-image-2096" /></center><br />
Ce répertoire est construit préalablement par la tâche ant de compilation, dans votre projet (cf. en fin d&#8217;article, le téléchargement du projet test d&#8217;extension)<br />
Vous devez pointer sur le répertoire &laquo;&nbsp;bin&nbsp;&raquo;.
</li>
</ul>
<p>Une fois le packaging démarré, un message d&#8217;attente s&#8217;affiche.<br />
<center><img src="http://www.lafabrick.com/blog/wp-content/uploads/2010/07/waiting-mini.png" width="467" height="48" class="aligncenter size-full wp-image-2103" /></center></p>
<h3>Finalisation</h3>
<p>Une fois le package créé, l&#8217;application vous propose de :</p>
<ul>
<li>Démarrer un nouveau package;</li>
<li>Ouvrir et installer l&#8217;extension via Extension Manager (vous devez bien entendu avoir préalablement installé Extension Manager CS5)</li>
</ul>
<p><center><img src="http://www.lafabrick.com/blog/wp-content/uploads/2010/07/completed.png" alt="" title="completed" width="500" height="450" class="aligncenter size-full wp-image-2097" /></center></p>
<h2>Téléchargements</h2>
<h3>ZXPackager</h3>
<p><center></p>
<table>
<tr>
<td width="128"><a href="http://www.lafabrick.com/applications/zxpackager/ZXPackager-MAC.zip"><img src="http://www.lafabrick.com/blog/wp-content/uploads/2010/07/macPackageExport.png" alt="" title="macPackageExport" width="128" height="128" class="aligncenter size-full wp-image-2137" /></a></td>
<td width="128"><a href="http://www.lafabrick.com/applications/zxpackager/ZXPackager-WIN.zip"><img src="http://www.lafabrick.com/blog/wp-content/uploads/2010/07/winPackageExport.png" alt="" title="winPackageExport" width="128" height="128" class="aligncenter size-full wp-image-2137" /></a></td>
</tr>
</table>
<p></center></p>
<h3>Extension de test</h3>
<ul>
<li><a href="http://lafabrick.com/applications/zxpackager/extensionTest.fxp">Projet fxp</a></li>
<li><a href="http://lafabrick.com/applications/zxpackager/bin.zip">Archive zip du bin de test</a></li>
</ul>
<p>Autres articles sur le même sujet
<ul>
<li><a href="http://www.lafabrick.com/blog/2007/09/04/206-flex-3-beta-rsolution-de-bug-comment-placer-fichier-d-application/" rel="bookmark" title="4 septembre 2007">[Flex 3 Beta] bug : Application File doesn&#8217;t exist</a></li>
<li><a href="http://www.lafabrick.com/blog/2008/02/04/299-un-projet-java-flex-avec-maven-2/" rel="bookmark" title="4 février 2008">Un projet Java / Flex avec Maven 2</a></li>
<li><a href="http://www.lafabrick.com/blog/2009/01/13/786-reflex-1-une-micro-architecture-pour-flex-simple/" rel="bookmark" title="13 janvier 2009">Reflex #1: une micro-architecture pour Flex&#8230; simple !</a></li>
<li><a href="http://www.lafabrick.com/blog/2010/08/20/2167-air-2-appeler-un-jar-executable-via-un-nativeprocess/" rel="bookmark" title="20 août 2010">AIR 2 : appeler un JAR exécutable via un NativeProcess</a></li>
</ul>
<p><!-- Similar Posts took 13.274 ms --></p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/lafabrick?a=7dWSXHQW1jQ:I6T0i-0cJgQ:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/lafabrick?i=7dWSXHQW1jQ:I6T0i-0cJgQ:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/lafabrick?a=7dWSXHQW1jQ:I6T0i-0cJgQ:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/lafabrick?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/lafabrick?a=7dWSXHQW1jQ:I6T0i-0cJgQ:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/lafabrick?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/lafabrick?a=7dWSXHQW1jQ:I6T0i-0cJgQ:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/lafabrick?d=qj6IDK7rITs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/lafabrick?a=7dWSXHQW1jQ:I6T0i-0cJgQ:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/lafabrick?i=7dWSXHQW1jQ:I6T0i-0cJgQ:F7zBnMyn0Lo" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/lafabrick/~4/7dWSXHQW1jQ" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.lafabrick.com/blog/2010/07/28/2092-zxpackager-application-pour-l%e2%80%99empaquetage-zxp-d%e2%80%99extensions-cs5/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		<feedburner:origLink>http://www.lafabrick.com/blog/2010/07/28/2092-zxpackager-application-pour-l%e2%80%99empaquetage-zxp-d%e2%80%99extensions-cs5/</feedburner:origLink></item>
		<item>
		<title>Ça envoie…</title>
		<link>http://feedproxy.google.com/~r/lafabrick/~3/P5qv9sJqmAw/</link>
		<comments>http://www.lafabrick.com/blog/2010/07/28/2023-ca-envoie/#comments</comments>
		<pubDate>Wed, 28 Jul 2010 16:17:48 +0000</pubDate>
		<dc:creator>laFabrickTeam</dc:creator>
				<category><![CDATA[Nawak]]></category>
		<category><![CDATA[hihihi]]></category>
		<category><![CDATA[Lafabrick]]></category>

		<guid isPermaLink="false">http://www.lafabrick.com/blog/?p=2023</guid>
		<description><![CDATA[(Mais comme) ça envoie !. Vous l&#8217;avez certainement déjà vue, voire vous êtes un expert dans son emploi. Nous vous proposons aujourd&#8217;hui un passage en revue minutieux de l&#8217;expression à la mode du geek qui est en vous ! Ce post traite donc de la fameuse expression &#171;&#160;Ca envoie&#8230;&#160;&#187; et ses dérivés. Un article qui [...]]]></description>
			<content:encoded><![CDATA[<p><strong>(Mais comme) ça envoie !</strong>. Vous l&#8217;avez certainement déjà vue, voire vous êtes un expert dans son emploi. Nous vous proposons aujourd&#8217;hui un passage en revue minutieux de l&#8217;expression à la mode du geek qui est en vous ! Ce post traite donc de la fameuse expression &laquo;&nbsp;Ca envoie&#8230;&nbsp;&raquo; et ses dérivés.<br />
Un article qui envoie du pâté (facile&#8230;)<br />
<span id="more-2023"></span></p>
<h3>Les classiques</h3>
<ul>
<li>
<h4>&laquo;&nbsp;Ça envoie du gras&nbsp;&raquo;</h4>
<p>En vogue dans la communauté Nerd. </li>
<li>
<h4>&laquo;&nbsp;Ça envoie le steak&nbsp;&raquo;</h4>
<p>Remarqué l&#8217;emploi de &laquo;&nbsp;le&nbsp;&raquo;, qui suggère le lancé d&#8217;un steak. Paraîtrait il que c&#8217;est une pratique courante dans les communes  Beauceronnes&#8230; Une enquête est en court&#8230;</li>
<li>
<h4>&laquo;&nbsp;Ça envoie du bois&nbsp;&raquo;</h4>
<p>Le bois, symbole de résistance et de longévité, est très bien employé ici. Attention toutefois à l&#8217;usage du bois dans le temps : il serait dommage que l&#8217;emploi de ce matériaux dans l&#8217;expression donne, à terme, le sentiment de quelque chose de vieillissant.</li>
<li>
<h4>&laquo;&nbsp;Ça envoie du pâté&nbsp;&raquo;</h4>
<p>On peux aussi trouver la variante <strong>&laquo;&nbsp;Ça envoie le pâté&nbsp;&raquo;</strong>, comme si s&#8217;envoyer du pâté dans la figure était &laquo;&nbsp;cool&nbsp;&raquo;&#8230;. restons sérieux tout de même.<br/><cite>Si bien que l&#8217;expression a sa place dans le <a href="http://www.dico-des-mots.com/definitions/envoyer-dule-pate.html">dico du net</a></cite></li>
</ul>
<h3>Spéciales cochonou</h3>
<ul>
<li>
<h4>Le classique &laquo;&nbsp;Ça envoie du salami&nbsp;&raquo;</h4>
</li>
<li>
<h4>&laquo;&nbsp;Ça envoie d&#8217;la ventrèche&nbsp;&raquo;</h4>
<p>La ventrèche, &laquo;&nbsp;Xingar&nbsp;&raquo; en Basque, est de <a href="http://fr.wikipedia.org/wiki/Ventr%C3%A8che">la poitrine de porc séché</a>. grillé au barbec, c&#8217;est un délice.</li>
<li>
<h4>&laquo;&nbsp;Ça envoie d&#8217;la saucisse de morteau&nbsp;&raquo;</h4>
<p>La particularité de celle-ci est son adaptabilité. Vous pouvez a loisir remplacer morteau par Toulouse, Strasbourg, Saint Trivier sur Moignans. (Spéciale dédicasse à Thibault)</li>
<p>(cf. Les Lyonnaises)
</ul>
<h3>Les matériaux</h3>
<ul>
<li>
<h4>&laquo;&nbsp;Ça envoie son parpaing&nbsp;&raquo;</h4>
<p>Variante négative : <strong>Ça envoie son parpaing de merde</strong> (Combo x2).</li>
<li>
<h4>&laquo;&nbsp;Ca envoie de la cabane au fond du jardin&nbsp;&raquo;</h4>
<p>(après une intégrale de Francis Cabrel&#8230;).</li>
</ul>
<h3>Les lyonnaises</h3>
<ul>
<li>
<h4>&laquo;&nbsp;Ça envoie de la rosette&nbsp;&raquo;</h4>
<p>LE symbole lyonnais. Dans la mesure ou la rosette est bonne, vous pouvez l&#8217;utilisé dans n&#8217;importe qu&#8217;elle situation. Aucun risque de saturation (sauf si votre interlocuteur ne supporte pas la rosette&#8230;).</li>
<li>
<h4>&laquo;&nbsp;Ça envoie d&#8217;la quenelle&nbsp;&raquo;</h4>
</li>
<li>
<h4>&laquo;&nbsp;Ça envoie d&#8217;la cervelle des canuts&nbsp;&raquo;</h4>
</li>
<p>Ne prenez pas peur : les Lyonnais ne sont pas antropophages. La cervelle des canuts c&#8217;est <a href="http://www.jedecouvrelafrance.com/f-4694.rhone-cervelle-canuts.html">une préparation de fromage blanc</a>.</p>
<li>
<h4>&laquo;&nbsp;Ça envoie du Jesus&nbsp;&raquo;</h4>
<p>Variante plus classe de la rosette, mais double sens possible : risque de déplaire à Mel Gibson. </li>
</ul>
<h3>Les doubles sens</h3>
<ul>
<li>
<h4>&laquo;&nbsp;Ça envoie du cahier des charges&nbsp;&raquo;</h4>
<p>Suggère l&#8217;attribution d&#8217;un super cahier des charges. Le double sens vient du fait que c&#8217;est quand même rare d&#8217;obtenir un vrai cahier des charges qui ce tient&#8230;</li>
<li>Voir aussi : <strong>&laquo;&nbsp;Ça envoie du chinchilla&nbsp;&raquo;</strong>, <strong>&laquo;&nbsp;Ça envoie d&#8217;la ventrèche ardéchoise&nbsp;&raquo;</strong>, <strong>&laquo;&nbsp;Ça envoie du Jesus&nbsp;&raquo;</strong></li>
</ul>
<h3>Brigitte Bardot style</h3>
<ul>
<li>
<h4>&laquo;&nbsp;Ça envoie du chinchilla&nbsp;&raquo;</h4>
<p>Attention, double sens possible : risque de négation détectable. Très utilisé par la jet-set, et les &laquo;&nbsp;has been&nbsp;&raquo;.</li>
<li>
<h4>&laquo;&nbsp;Ça envoie de la baleine à bosse&nbsp;&raquo;</h4>
<p>Là nous sommes carrément en présence d&#8217;un gros propos qui tâche, ne vous emballez pas!</li>
<li>
<h4>&laquo;&nbsp;Ça envoie du poney&nbsp;&raquo;</h4>
<p>Plagiat direct du fameux <strong><i>&laquo;&nbsp;Ça rox du poney&nbsp;&raquo;</i></strong>. L&#8217;origine reste un mystère, tout comme le sens. Chacun aura donc ça propre interprétation, ce qui ajoute un zeste de rigolitude.</li>
</ul>
<h3>Les combos</h3>
<ul>
<li>
<h4>&laquo;&nbsp;Ça envoie d&#8217;la ventrèche ardéchoise&nbsp;&raquo;</h4>
<p>Vu que la ventrèche n&#8217;existe pas en ardèche (tout du moins sous cette dénomination : il faudrait dire <strong>&laquo;&nbsp;Ça envoie du rillon ardéchois&nbsp;&raquo;</strong>), envoyer de la ventrèche ardéchoise est donc absolument impossible. D&#8217;où les 2 sens suivant :
<ul>
<li><strong>&laquo;&nbsp;Ton truc, c&#8217;est vraiment n&#8217;importe quoi&nbsp;&raquo; / &laquo;&nbsp;C&#8217;est d&#8217;la daube en boite&nbsp;&raquo;</strong></li>
<li><strong>&laquo;&nbsp;C&#8217;est la classe internationale&nbsp;&raquo; / &laquo;&nbsp;C&#8217;est trop super innovant&nbsp;&raquo;</strong></li>
</ul>
</li>
<li>
<h4>&laquo;&nbsp;Ça envoie du salami corse/basque/breton&nbsp;&raquo; <i>(rayer les mentions inutiles)</i></h4>
<p>. Attention! Ne pas dire <strong>&laquo;&nbsp;Ça envoie du corse/basque/breton&nbsp;&raquo;</strong> : risque de représailles. </li>
<li>
<h4>&laquo;&nbsp;Ça envoie de la tartine de bécasse&nbsp;&raquo;</h4>
<p>Graal des chasseurs  français, la bécasse est <a href="http://fr.wikipedia.org/wiki/B%C3%A9casse">un genre de limicoles de la famille des Scolopacidae</a>. Rapide et futé, l&#8217;emploi de la bécasse dans l&#8217;expression fait directement référence à l&#8217;ingéniosité du propos.</li>
<li>
<h4>&laquo;&nbsp;Ça envoie de l&#8217;époisse fondue au feu de bois&nbsp;&raquo;</h4>
<p>Combo x4, +10points.</li>
</ul>
<h3>Les hors-sujet</h3>
<ul>
<li>
<h4>&laquo;&nbsp;(Ça) envoie du Ricard(!)&nbsp;&raquo;</h4>
<p>Utilisable à partir de 17h (voir 8h, mais là on ne peut plus rien pour vous), fait directement référence à une beuverie en cours. Aucun intérêt.</li>
</ul>
<h3>In English</h3>
<h4>&laquo;&nbsp;It throws some&#8230;&nbsp;&raquo;</h4>
<p>Nous entrons là dans les déclinaisons très &laquo;&nbsp;spéciales&nbsp;&raquo;. Une certaine expérience quant à la manipulation des &laquo;&nbsp;envois&nbsp;&raquo; de base est requise. Il est clair que l&#8217;emploi de cette expression devant un auditoire anglophone vous fera passer directement par la case &laquo;&nbsp;débile&nbsp;&raquo;. Attention donc au contexte d&#8217;utilisation. Ce qui en revanche peux être intéressant, c&#8217;est l&#8217;image qui vous dégagerez lors de l&#8217;emploi des variantes anglaise, devant des francophones (français, les autres pays francophone sont tout de même un poil meilleurs en langue que nous). Un atout pour imposer votre maîtrise de la langue de Shakespeare. Quelques exemples :</p>
<ul>
<li>
<h4>&laquo;&nbsp;It throws some wood&nbsp;&raquo;</h4>
</li>
<li>
<h4>&laquo;&nbsp;It throws some pâté&nbsp;&raquo;</h4>
</li>
<li>
<h4>&laquo;&nbsp;It throws some tartine of Bécasse&nbsp;&raquo;</h4>
</li>
</ul>
</li>
</ul>
<p>Et vous ? Vous envoyez quoi ?Autres articles sur le même sujet
<ul>
<li><a href="http://www.lafabrick.com/blog/2007/06/25/169-un-peu-d-air-climatus/" rel="bookmark" title="25 juin 2007">L&#8217;université Lyon 1 a besoin d&#8217;AIR et crée Climatus</a></li>
<li><a href="http://www.lafabrick.com/blog/2008/06/08/328-quelques-raisons-de-se-mettre-ruby-on-rails-ou-au-moins-y-penser/" rel="bookmark" title="8 juin 2008">Quelques raisons de se mettre à Ruby on Rails ( ou au moins y penser &#8230; )</a></li>
<li><a href="http://www.lafabrick.com/blog/2010/07/18/1966-la-fabrick-passe-la-troisieme/" rel="bookmark" title="18 juillet 2010">La Fabrick passe la troisième&#8230;</a></li>
<li><a href="http://www.lafabrick.com/blog/2010/07/28/2092-zxpackager-application-pour-l%e2%80%99empaquetage-zxp-d%e2%80%99extensions-cs5/" rel="bookmark" title="28 juillet 2010">ZXPackager : application pour l’empaquetage ZXP d’extensions CS5</a></li>
</ul>
<p><!-- Similar Posts took 13.301 ms --></p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/lafabrick?a=P5qv9sJqmAw:PWrzpJv2p5Y:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/lafabrick?i=P5qv9sJqmAw:PWrzpJv2p5Y:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/lafabrick?a=P5qv9sJqmAw:PWrzpJv2p5Y:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/lafabrick?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/lafabrick?a=P5qv9sJqmAw:PWrzpJv2p5Y:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/lafabrick?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/lafabrick?a=P5qv9sJqmAw:PWrzpJv2p5Y:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/lafabrick?d=qj6IDK7rITs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/lafabrick?a=P5qv9sJqmAw:PWrzpJv2p5Y:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/lafabrick?i=P5qv9sJqmAw:PWrzpJv2p5Y:F7zBnMyn0Lo" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/lafabrick/~4/P5qv9sJqmAw" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.lafabrick.com/blog/2010/07/28/2023-ca-envoie/feed/</wfw:commentRss>
		<slash:comments>19</slash:comments>
		<feedburner:origLink>http://www.lafabrick.com/blog/2010/07/28/2023-ca-envoie/</feedburner:origLink></item>
		<item>
		<title>Primitive DashedLine : une petite ligne bien utile</title>
		<link>http://feedproxy.google.com/~r/lafabrick/~3/aAUsPmxTYsk/</link>
		<comments>http://www.lafabrick.com/blog/2010/07/23/1989-primitive-dashedline-une-petite-ligne-bien-utile/#comments</comments>
		<pubDate>Fri, 23 Jul 2010 09:07:22 +0000</pubDate>
		<dc:creator>Fabien</dc:creator>
				<category><![CDATA[Nos projets]]></category>
		<category><![CDATA[[Dev] Flash / Flex / AIR...]]></category>
		<category><![CDATA[flex4]]></category>
		<category><![CDATA[primitives]]></category>
		<category><![CDATA[Spark]]></category>
		<category><![CDATA[uigfx]]></category>

		<guid isPermaLink="false">http://www.lafabrick.com/blog/?p=1989</guid>
		<description><![CDATA[Je viens de rajouter une petite primitive bien utile dans la librairie UIGFX : DashedLine, qui, comme son nom l&#8217;indique (ou pas), permet d&#8217;avoir une ligne pointillée. Basé sur Line, cette primitive propose une propriété dashes, qui vous permet de paramètrer l&#8217;apparence des pointillées. dashes contient un tableau (Array) de nombres. Les emplacements impaires du [...]]]></description>
			<content:encoded><![CDATA[<p><center><img src="http://www.lafabrick.com/blog/wp-content/uploads/2010/07/dashedLine530.png" alt="" title="dashedLine530" width="532" height="59" class="aligncenter size-full wp-image-1997" /></center><br />
Je viens de rajouter une petite primitive bien utile dans <a href="http://uigfx.googlecode.com">la librairie UIGFX</a> : <a href="http://code.google.com/p/uigfx/source/browse/trunk/uigfx/src/com/lafabrick/uigfx/primitives/DashedLine.as">DashedLine</a>, qui, comme son nom l&#8217;indique (ou pas), permet d&#8217;avoir une ligne pointillée.<br />
<span id="more-1989"></span><br />
Basé sur <b>Line</b>, cette primitive propose une propriété dashes, qui vous permet de paramètrer l&#8217;apparence des pointillées.</p>
<p>dashes contient un tableau (Array) de nombres. Les emplacements impaires du tableau définissent la taille (en pixel) des tirets. Les emplacements pair définissent la taille des espacement.</p>
<p>Dans le code : </p>
<pre class="brush: xml">
&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt;
&lt;s:Application xmlns:fx=&quot;http://ns.adobe.com/mxml/2009&quot;
    xmlns:s=&quot;library://ns.adobe.com/flex/spark&quot;
    xmlns:mx=&quot;library://ns.adobe.com/flex/mx&quot;
    minWidth=&quot;200&quot; minHeight=&quot;200&quot;
    xmlns:uigfx=&quot;http://uigfx.lafabrick.com&quot;&gt;

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

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

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

    &lt;/uigfx:DashedLine&gt;

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

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

    &lt;/uigfx:DashedLine&gt;

&lt;/s:Application&gt;
</pre>
<p>Résultat :<br />
<center><img src="http://www.lafabrick.com/blog/wp-content/uploads/2010/07/dashedLine650.png" alt="" title="dashedLine630" width="650" height="54" class="aligncenter size-full wp-image-1998" /></center><br />
C&#8217;est beau!!</p>
<p>Disponible bien entendu sur <a href="http://uigfx.googlecode.com">le google code UIGFX</a>.<br />
Autres articles sur le même sujet
<ul>
<li><a href="http://www.lafabrick.com/blog/2010/02/09/1964-uigfx-project-flex4-primitives-library-fireworks-extension/" rel="bookmark" title="9 février 2010">uigfx project : Flex4 primitives library / Fireworks extension</a></li>
<li><a href="http://www.lafabrick.com/blog/2010/07/14/1920-flex-4-layouts-viewstack-pure-spark/" rel="bookmark" title="14 juillet 2010">Flex 4 et les layouts &#8211; Faire une ViewStack &laquo;&nbsp;pure&nbsp;&raquo; Spark</a></li>
<li><a href="http://www.lafabrick.com/blog/2010/05/04/1962-uigfx-practice-a-circularslider-component-2/" rel="bookmark" title="4 mai 2010">UIGFX practice : a CircularSlider component</a></li>
<li><a href="http://www.lafabrick.com/blog/2010/03/05/1675-proches-de-lohio-les-etats-esthetes-de-flex4/" rel="bookmark" title="5 mars 2010">Proches de l&#8217;Ohio??? Les états esthètes de Flex4</a></li>
</ul>
<p><!-- Similar Posts took 12.959 ms --></p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/lafabrick?a=aAUsPmxTYsk:C4Sry-mi_6g:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/lafabrick?i=aAUsPmxTYsk:C4Sry-mi_6g:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/lafabrick?a=aAUsPmxTYsk:C4Sry-mi_6g:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/lafabrick?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/lafabrick?a=aAUsPmxTYsk:C4Sry-mi_6g:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/lafabrick?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/lafabrick?a=aAUsPmxTYsk:C4Sry-mi_6g:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/lafabrick?d=qj6IDK7rITs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/lafabrick?a=aAUsPmxTYsk:C4Sry-mi_6g:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/lafabrick?i=aAUsPmxTYsk:C4Sry-mi_6g:F7zBnMyn0Lo" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/lafabrick/~4/aAUsPmxTYsk" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.lafabrick.com/blog/2010/07/23/1989-primitive-dashedline-une-petite-ligne-bien-utile/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.lafabrick.com/blog/2010/07/23/1989-primitive-dashedline-une-petite-ligne-bien-utile/</feedburner:origLink></item>
		<item>
		<title>La Fabrick passe la troisième…</title>
		<link>http://feedproxy.google.com/~r/lafabrick/~3/2NYIaqMSEk4/</link>
		<comments>http://www.lafabrick.com/blog/2010/07/18/1966-la-fabrick-passe-la-troisieme/#comments</comments>
		<pubDate>Sun, 18 Jul 2010 21:46:56 +0000</pubDate>
		<dc:creator>Hervé</dc:creator>
				<category><![CDATA[La Fabrick]]></category>
		<category><![CDATA[Lafabrick]]></category>

		<guid isPermaLink="false">http://www.lafabrick.com/blog/?p=1966</guid>
		<description><![CDATA[Pas de web 3.0, pas de nouvelle voiture, mais juste la nouvelle version de WordPress&#8230; On a profité de la mise à jour pour, au passage, faire apparaître la version anglaise. C&#8217;est la nouveauté, histoire de faciliter l&#8217;accès à nos amis d&#8217;outre-manche / outre-atlantique&#8230; bref non français ! La partie française restera systématiquement alimentée, et [...]]]></description>
			<content:encoded><![CDATA[<p>Pas de web 3.0, pas de nouvelle voiture, mais juste la nouvelle version de WordPress&#8230; On a profité de la mise à jour pour, au passage, faire apparaître la version anglaise.<br />
C&#8217;est la nouveauté, histoire de faciliter l&#8217;accès à nos amis d&#8217;outre-manche / outre-atlantique&#8230; bref non français !<br />
La partie française restera systématiquement alimentée, et on tentera de traduire dans la mesure du possible.</p>
<p>Let&#8217;s rock n&#8217; roll&#8230;<br />
Autres articles sur le même sujet
<ul>
<li><a href="http://www.lafabrick.com/blog/2006/10/09/4-la-fabrick-ou-quand-fabien-rencontre-erick/" rel="bookmark" title="9 octobre 2006">La Fabrick &#8230; ou quand Fabien rencontre Erick</a></li>
<li><a href="http://www.lafabrick.com/blog/2007/10/01/240-labsadobecom-c-est-nol-avant-l-heure/" rel="bookmark" title="1 octobre 2007">Noël avant l&#8217;heure : la journée de la béta 2 sur Labs.adobe.com</a></li>
<li><a href="http://www.lafabrick.com/blog/2010/07/28/2092-zxpackager-application-pour-l%e2%80%99empaquetage-zxp-d%e2%80%99extensions-cs5/" rel="bookmark" title="28 juillet 2010">ZXPackager : application pour l’empaquetage ZXP d’extensions CS5</a></li>
<li><a href="http://www.lafabrick.com/blog/2010/07/28/2023-ca-envoie/" rel="bookmark" title="28 juillet 2010">Ça envoie&#8230;</a></li>
</ul>
<p><!-- Similar Posts took 12.788 ms --></p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/lafabrick?a=2NYIaqMSEk4:AnNOexL2Ubw:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/lafabrick?i=2NYIaqMSEk4:AnNOexL2Ubw:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/lafabrick?a=2NYIaqMSEk4:AnNOexL2Ubw:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/lafabrick?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/lafabrick?a=2NYIaqMSEk4:AnNOexL2Ubw:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/lafabrick?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/lafabrick?a=2NYIaqMSEk4:AnNOexL2Ubw:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/lafabrick?d=qj6IDK7rITs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/lafabrick?a=2NYIaqMSEk4:AnNOexL2Ubw:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/lafabrick?i=2NYIaqMSEk4:AnNOexL2Ubw:F7zBnMyn0Lo" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/lafabrick/~4/2NYIaqMSEk4" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.lafabrick.com/blog/2010/07/18/1966-la-fabrick-passe-la-troisieme/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<feedburner:origLink>http://www.lafabrick.com/blog/2010/07/18/1966-la-fabrick-passe-la-troisieme/</feedburner:origLink></item>
		<item>
		<title>Flex 4 et les layouts – Faire une ViewStack « pure » Spark</title>
		<link>http://feedproxy.google.com/~r/lafabrick/~3/Fixg_Chvfrs/</link>
		<comments>http://www.lafabrick.com/blog/2010/07/14/1920-flex-4-layouts-viewstack-pure-spark/#comments</comments>
		<pubDate>Wed, 14 Jul 2010 16:06:03 +0000</pubDate>
		<dc:creator>Hervé</dc:creator>
				<category><![CDATA[[Dev] Flash / Flex / AIR...]]></category>
		<category><![CDATA[architecture]]></category>
		<category><![CDATA[AS3]]></category>
		<category><![CDATA[Flex]]></category>
		<category><![CDATA[flex4]]></category>
		<category><![CDATA[MVC]]></category>
		<category><![CDATA[Spark]]></category>
		<category><![CDATA[UI Design]]></category>

		<guid isPermaLink="false">http://www.lafabrick.com/blog/?p=1920</guid>
		<description><![CDATA[Pour ceux d&#8217;entre vous qui ont eu la chance de passer à Flex 4, vous avez peut-être la même tendance que moi à chercher à éviter le préfixe &#60;mx:&#62; dans vos skins&#8230; Spark, quand tu nous tiens&#8230; Quoi qu&#8217;il en soit, certains types de composants n&#8217;ont pas été réécris pour Spark. Pourquoi ? Parce l&#8217;architecture [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://www.lafabrick.com/blog/wp-content/uploads/2010/07/layouts-300x155.png" alt="layouts" title="layouts" width="300" height="155" class="aligncenter size-medium wp-image-1930" /><br />
Pour ceux d&#8217;entre vous qui ont eu la chance de passer à Flex 4, vous avez peut-être la même tendance que moi à chercher à éviter le préfixe &lt;mx:&gt; dans vos skins&#8230; Spark, quand tu nous tiens&#8230; Quoi qu&#8217;il en soit, certains types de composants n&#8217;ont pas été réécris pour Spark. Pourquoi ? Parce l&#8217;architecture Spark propose quelque chose de top : les layouts. Et les layouts, c&#8217;est vaaaachement bien.</p>
<p>Explication&#8230;<br />
<span id="more-1920"></span></p>
<h2>Layouts</h2>
<p>Sans faire un article complet sur les layout (ce qui serait tout à fait possible et intéressant), on peut tout de même rappeler que le Flex 4 se distingue de Flex 3 via Spark par une volonté de mieux séparer le fond de la forme, il amène donc une notion de layout pour, comme son nom le suggère, organiser les composants d&#8217;un conteneur (par exemple un &lt;s:Group&gt;).<br />
Exit donc la <em>VBox</em> ou la <em>HBox</em> (même si le VGroup ou le HGroup permettent de faire une transition en douceur), et bienvenue au <strong>Group</strong> avec layout :</p>
<pre class="brush: xml">
&lt;mx:VBox&gt;
&lt;/mx:VBox&gt;
</pre>
<p>devient donc</p>
<pre class="brush: xml">
&lt;s:Group&gt;
	&lt;s:layout&gt;
		&lt;s:VerticalLayout /&gt;
	&lt;/s:layout&gt;
&lt;/s:Group&gt;
</pre>
<p>Au premier abord on dit : c&#8217;est plus verbeux ! Oui mais&#8230; le layout a cette particularité, en tant que propriété du composant, d&#8217;être modifiable à la volée, contrairement à un composant imposant sa mise en forme. Concrètement, là où la <em>VBox</em> présentera toujours ses enfants verticalement (c&#8217;est son nom !), le <em>Group</em> pourra changer à volonté de layout, donc très facilement passer de <em>HorizontalLayout</em> à <em>VerticalLayout</em> par exemple&#8230; On comprend encore mieux l&#8217;intérêt quand on se met à écrire son propre layout pour faire des choses un peu plus poussées visuellement !</p>
<h2>Créer son layout</h2>
<p>Pour créer un layout, il faut étendre la classe LayoutBase et surcharger a minima la méthode updateDisplayList() et certainement la méthode measure(). Ces méthodes gardent le même rôle qu&#8217;en Flex 3, mais avec l&#8217;adaptation contextuelle au Layout :</p>
<ul>
<li>updateDisplayList : dispose les enfants du conteneur et définit leur taille</li>
<li>measure : donne la taille globale du conteneur</li>
</ul>
<p>Vous pouvez accéder à la propriété &laquo;&nbsp;target&nbsp;&raquo; du layout qui correspond au conteneur auquel est appliqué le layout et travailler sur les enfant via les méthodes getElementAt() ou getVirtualElementAt(). La seconde méthode sert dans le cas où le layout est dit &laquo;&nbsp;virtualisé&nbsp;&raquo;.</p>
<h3>Apparté : virtualisation de layout</h3>
<p>Flex 4 permet, pour des raison de performance, d&#8217;utiliser un layout en mode &laquo;&nbsp;virtualisé&nbsp;&raquo;, c&#8217;est-à-dire ne calculant la disposition des seuls enfants à afficher et non l&#8217;ensemble des enfants. Ce mode de fonctionnement s&#8217;applique particulièrement bien aux composants comprenant une liste de beaucoup d&#8217;enfants, mais ne calculant l&#8217;affichage d&#8217;une poignée à la fois, le reste attendant un scroll ou une action similaire pour être éventuellement affiché.</p>
<h2>Application : création d&#8217;un ViewStackLayout</h2>
<p>Avec les layouts en tête, il est inutile de demander pourquoi le composant ViewStack n&#8217;existe pas dans Spark : il devrait en pratique être un layout applicable à n&#8217;importe quel conteneur ! Même si le <a href="http://opensource.adobe.com/wiki/display/flexsdk/Spark+Virtualization" lang="en">très bon article sur la virtualisation</a> mentionne un prometteur je cite &laquo;&nbsp;(Planned) StackLayout&nbsp;&raquo;, rien ne nous empêche d&#8217;en faire un simple, adapté à l&#8217;architecture Spark, plutôt que d&#8217;attendre (oui on est impatients à la fabrick).</p>
<p>Voici un exemple simple :</p>
<pre class="brush: js">
	import mx.core.ILayoutElement;
	import mx.core.IVisualElement;

	import spark.layouts.supportClasses.LayoutBase;

	public class ViewStackLayout extends LayoutBase
	{
		protected var _index:uint;

		/**
		 * Index de l&#039;enfant à afficher
		 */
		[Bindable]
		public function get index() : Number
		{
			return _index;
		}

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

		}

		public function ViewStackLayout()
		{
			super();
		}

		override public function updateDisplayList(width:Number, height:Number):void
		{
			super.updateDisplayList(width, height);

			var numElements:int = target.numElements;

			for (var i:uint = 0; i &lt; numElements; i++)
			{
				var element:IVisualElement = useVirtualLayout ? target.getVirtualElementAt(i) : target.getElementAt(i);
				if (i == index)
				{
					element.visible = true;
					element.includeInLayout = true;
				}
				else
				{
					element.visible = false;
					element.includeInLayout = false;
				}
			}
		}

		override public function measure():void
		{
			var count:int = target.numElements;
			for (var i:int = 0; i &lt; count; i++)
			{
				var element:ILayoutElement = useVirtualLayout ? target.getVirtualElementAt(i) :
					target.getElementAt(i);

				if (!element)
				{
					// En prévision de la virtualisation
					element = typicalLayoutElement;
				}
				if (element &amp;&amp; element.includeInLayout)
				{
					var elementWidth:Number = element.getPreferredBoundsWidth();
					var elementHeight:Number = element.getPreferredBoundsHeight();
					target.measuredWidth = elementWidth;
					target.measuredHeight = elementHeight;
					break;
				}
			}
		}
	}
</pre>
<p>Vous noterez ici l&#8217;usage du getVirtualElementAt, en prévision de la gestion de la virtualisation.<br />
Vous pouvez donc utiliser ce layout dans un DataGroup &laquo;&nbsp;piloté&nbsp;&raquo; par une tabbar par exemple comme ceci :</p>
<pre class="brush: xml">
	&lt;s:TabBar id=&quot;tabEditors&quot; /&gt;
	&lt;s:DataGroup id=&quot;editors&quot;&gt;
		&lt;s:layout&gt;
			&lt;mylayouts:ViewStackLayout index=&quot;{tabEditors.selectedIndex}&quot; /&gt;
		&lt;/s:layout&gt;
		&lt;!-- Enfants... --&gt;
	&lt;/s:DataGroup&gt;
</pre>
<p>De cette façon, le jour où vous voudrez présenter ces éléments sous forme de CoverFlow, en mode TimeMachine&#8230; vous n&#8217;aurez pas à modifier le code de votre composant, mais uniquement votre skin.</p>
<p>Alors, on n&#8217;est pas mieux habillé en Spark ?</p>
<p>Autres articles sur le même sujet
<ul>
<li><a href="http://www.lafabrick.com/blog/2009/01/13/786-reflex-1-une-micro-architecture-pour-flex-simple/" rel="bookmark" title="13 janvier 2009">Reflex #1: une micro-architecture pour Flex&#8230; simple !</a></li>
<li><a href="http://www.lafabrick.com/blog/2009/11/27/1373-flex4-custom-component-skinnig/" rel="bookmark" title="27 novembre 2009">Flex4 : composant personnalisé et skinning</a></li>
<li><a href="http://www.lafabrick.com/blog/2010/05/04/1962-uigfx-practice-a-circularslider-component-2/" rel="bookmark" title="4 mai 2010">UIGFX practice : a CircularSlider component</a></li>
<li><a href="http://www.lafabrick.com/blog/2010/03/05/1675-proches-de-lohio-les-etats-esthetes-de-flex4/" rel="bookmark" title="5 mars 2010">Proches de l&#8217;Ohio??? Les états esthètes de Flex4</a></li>
</ul>
<p><!-- Similar Posts took 13.925 ms --></p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/lafabrick?a=Fixg_Chvfrs:q7TZqLUZb18:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/lafabrick?i=Fixg_Chvfrs:q7TZqLUZb18:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/lafabrick?a=Fixg_Chvfrs:q7TZqLUZb18:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/lafabrick?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/lafabrick?a=Fixg_Chvfrs:q7TZqLUZb18:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/lafabrick?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/lafabrick?a=Fixg_Chvfrs:q7TZqLUZb18:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/lafabrick?d=qj6IDK7rITs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/lafabrick?a=Fixg_Chvfrs:q7TZqLUZb18:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/lafabrick?i=Fixg_Chvfrs:q7TZqLUZb18:F7zBnMyn0Lo" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/lafabrick/~4/Fixg_Chvfrs" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.lafabrick.com/blog/2010/07/14/1920-flex-4-layouts-viewstack-pure-spark/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		<feedburner:origLink>http://www.lafabrick.com/blog/2010/07/14/1920-flex-4-layouts-viewstack-pure-spark/</feedburner:origLink></item>
		<item>
		<title>BarCamp interfaces riches, Lyon, 23/06</title>
		<link>http://feedproxy.google.com/~r/lafabrick/~3/xsw9jw0DY0s/</link>
		<comments>http://www.lafabrick.com/blog/2010/05/12/1880-barcamp-interfaces-riches-lyon-2306/#comments</comments>
		<pubDate>Wed, 12 May 2010 12:41:59 +0000</pubDate>
		<dc:creator>Fabien</dc:creator>
				<category><![CDATA[Bientôt chez vous]]></category>
		<category><![CDATA[La Fabrick]]></category>
		<category><![CDATA[barcamp]]></category>
		<category><![CDATA[Conférence]]></category>
		<category><![CDATA[interactivité]]></category>
		<category><![CDATA[RIA]]></category>
		<category><![CDATA[UX]]></category>

		<guid isPermaLink="false">http://www.lafabrick.com/blog/?p=1880</guid>
		<description><![CDATA[Depuis 40 ans, l&#8217;informatique est en r-évolution continue. Non seulement les ordinateurs sont de plus en plus puissants, mais leur utilisation prend chaque jour de nouvelles formes. Interfaces riches, tactiles, vocales, ou encore tangibles, il semble qu&#8217;en terme d&#8217;interfaces homme-machine, la réalité rattrape aujourd&#8217;hui la science fiction. Que vous soyez acteurs dans les nouvelles technologies [...]]]></description>
			<content:encoded><![CDATA[<p><center><img src="http://www.lafabrick.com/blog/wp-content/uploads/2010/05/barcampheaderblog.jpg" alt="barcampheaderblog" title="barcampheaderblog" width="520" height="150" class="aligncenter size-full wp-image-1889" /></center><br />
Depuis 40 ans, l&#8217;informatique est en r-évolution continue. Non seulement les ordinateurs sont de plus en plus puissants, mais leur utilisation prend chaque jour de nouvelles formes. Interfaces riches, tactiles, vocales, ou encore tangibles, il semble qu&#8217;en terme d&#8217;interfaces homme-machine,  la réalité rattrape aujourd&#8217;hui la science fiction.</p>
<p>Que vous soyez acteurs dans les nouvelles technologies ou simplement curieux de voir ce que le présent nous réserve, vous êtes conviés à venir participer au 1er BarCamp dédié aux Interfaces Riches, le 23 juin 2010 à partir de 17h, au cyberCafé du campus de la Doua à Villeurbanne.</p>
<p>Au programme : des  conférences, des ateliers et des démonstrations de ces technologies naissantes ou déjà matures et de leurs usages dans différents domaines (commerce, enseignement, divertissement…). Aux côtés des principaux innovateurs de ce secteur, vous pourrez même, si vous le souhaitez, proposer votre propre présentation dans les tribunes libres prévues à cet effet.</p>
<p>Quelques présentations au menu :</p>
<ul>
<li>Nouvelles expériences utilisateurs multi-canal grâce aux RIA (ipTv, bornes interactives);</li>
<li><a href="http://openscales.org/">OpenScales</a>: client cartographique basé sur les technologies ActionScript3 / Flex / AIR;</li>
<li>Comment développer une RIA moderne en Javascript avec <a href="http://bitbucket.org/ilabs/resthub/">RESTHub</a>.</li>
</ul>
<p>Rendez vous, donc, le 23 juin 2010 pour une rencontre conviviale qui vous donnera l&#8217;occasion de découvrir ou de montrer dès aujourd&#8217;hui, les interfaces de demain.<br />
<center><a href="http://barcamp-lyon.eventbrite.com?ref=ebtn" target="_blank"  ><img border="0" src="http://www.eventbrite.com/registerbutton?eid=675667941" alt="Register for Barcamp interfaces riches in Villeurbanne, France  on Eventbrite" /></a></center><br />
<span id="more-1880"></span><br />
Ce rendre au cyber café de l&#8217;université Lyon1 :<br />
<iframe width="640" height="480" frameborder="0" scrolling="no" marginheight="0" marginwidth="0" src="http://maps.google.fr/maps/ms?ie=UTF8&amp;hl=fr&amp;t=h&amp;msa=0&amp;msid=102461965477805714758.000485da8aecb7c6dbce8&amp;ll=45.779945,4.87263&amp;spn=0.007183,0.013733&amp;z=16&amp;output=embed"></iframe><br /><small>Afficher <a href="http://maps.google.fr/maps/ms?ie=UTF8&amp;hl=fr&amp;t=h&amp;msa=0&amp;msid=102461965477805714758.000485da8aecb7c6dbce8&amp;ll=45.779945,4.87263&amp;spn=0.007183,0.013733&amp;z=16&amp;source=embed" style="color:#0000FF;text-align:left">Cyber café, université Lyon1</a> sur une carte plus grande</small><br />
<br />
toutes les infos du barCamp sur <a href="http://www.facebook.com/#!/group.php?gid=119133324776126">le groupe facebook</a><br />
Partenaires :<br />
<center><img src="http://www.lafabrick.com/blog/wp-content/uploads/2010/05/partenaires2.jpg" alt="partenairebig" title="partenairebig" width="520" height="130" class="aligncenter size-full wp-image-1901" /></center><br />
Autres articles sur le même sujet
<ul>
<li><a href="http://www.lafabrick.com/blog/2007/04/06/84-flash-in-the-can-hymne-a-l-as3/" rel="bookmark" title="6 avril 2007">« Flash In The Can » : hymne a l&#8217;AS3</a></li>
<li><a href="http://www.lafabrick.com/blog/2007/07/04/97-virtual-cabinet-ria-rda-pour-l-apprentissage-des-langues/" rel="bookmark" title="4 juillet 2007">Virtual Cabinet, flash et interfaces riches pour l&#8217;apprentissage des langues (1)</a></li>
<li><a href="http://www.lafabrick.com/blog/2007/07/05/181-virtual-cabinet-flash-et-interfaces-riches-pour-l-apprentissage-des-langues-3/" rel="bookmark" title="5 juillet 2007">Virtual Cabinet, flash et interfaces riches pour l&#8217;apprentissage des langues (3)</a></li>
<li><a href="http://www.lafabrick.com/blog/2009/05/04/1130-interfaces-tangibles-le-futur-du-multitouch/" rel="bookmark" title="4 mai 2009">Interfaces tangibles : le futur du multitouch</a></li>
</ul>
<p><!-- Similar Posts took 13.350 ms --></p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/lafabrick?a=xsw9jw0DY0s:REz1HPzLnZg:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/lafabrick?i=xsw9jw0DY0s:REz1HPzLnZg:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/lafabrick?a=xsw9jw0DY0s:REz1HPzLnZg:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/lafabrick?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/lafabrick?a=xsw9jw0DY0s:REz1HPzLnZg:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/lafabrick?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/lafabrick?a=xsw9jw0DY0s:REz1HPzLnZg:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/lafabrick?d=qj6IDK7rITs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/lafabrick?a=xsw9jw0DY0s:REz1HPzLnZg:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/lafabrick?i=xsw9jw0DY0s:REz1HPzLnZg:F7zBnMyn0Lo" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/lafabrick/~4/xsw9jw0DY0s" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.lafabrick.com/blog/2010/05/12/1880-barcamp-interfaces-riches-lyon-2306/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<feedburner:origLink>http://www.lafabrick.com/blog/2010/05/12/1880-barcamp-interfaces-riches-lyon-2306/</feedburner:origLink></item>
		<item>
		<title>UIGFX practice : a CircularSlider component</title>
		<link>http://feedproxy.google.com/~r/lafabrick/~3/un0faeasUs0/</link>
		<comments>http://www.lafabrick.com/blog/2010/05/04/1962-uigfx-practice-a-circularslider-component-2/#comments</comments>
		<pubDate>Tue, 04 May 2010 21:18:39 +0000</pubDate>
		<dc:creator>Fabien</dc:creator>
				<category><![CDATA[Nos projets]]></category>
		<category><![CDATA[[Dev] Flash / Flex / AIR...]]></category>
		<category><![CDATA[component]]></category>
		<category><![CDATA[FlashBuilder]]></category>
		<category><![CDATA[Flex]]></category>
		<category><![CDATA[flex4]]></category>
		<category><![CDATA[Spark]]></category>
		<category><![CDATA[uigfx]]></category>

		<guid isPermaLink="false">http://www.lafabrick.com/blog/?p=1962</guid>
		<description><![CDATA[If you were luck enough to use a multitouch application, did you ever have the idea that it would be interesting to use some circular interface components? As interface space management is easier to achieve on large multitouch tables, I had the idea to develop a CircularSlider component, using my primitive UIGFX library, including the [...]]]></description>
			<content:encoded><![CDATA[<p>If you were luck enough to use a multitouch application, did you ever have the idea that it would be interesting to use some circular interface components?<br />
As interface space management is easier to achieve on large multitouch tables, I had the idea to develop a CircularSlider component, using my primitive <a href="http://code.google.com/p/uigfx/">UIGFX library</a>, including the <a href="http://code.google.com/p/uigfx/source/browse/trunk/uigfx/src/com/lafabrick/uigfx/primitives/Pie.as">Pie primitive</a>.<br />
Let see how it works&#8230;<br />
<span id="more-1962"></span><br />
<H2>The component</H2></p>
<h3>PieButton</h3>
<p>I needed a button with 2 properties <code>startAngle</code> and <code>angle</code>, to be able to transmit these values to the skin: </p>
<pre class="brush: js">
package com.lafabrick.components
{
    import spark.components.Button;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    &lt;/primitives:Pie&gt;

&lt;/s:SparkSkin&gt;
</pre>
<p><H2>Result</H2><br />
Let see:<br />
<object type="application/x-shockwave-flash" data="http://fabien.lafabrick.com/labs/components/circularslider/circularSlider.swf" width="640" height="500"><param name="movie" value="http://fabien.lafabrick.com/labs/components/circularslider/circularSlider.swf" /><param name="bgcolor" value="#ffffff" /><param name="allowScriptAccess" value="sameDomain" /><param name="allowFullScreen" value="true" /></object><br />
Nice huh?</p>
<p>You can check these for more info: <a href="http://fabien.lafabrick.com/labs/components/circularslider/">Link</a>, and <a href="http://fabien.lafabrick.com/labs/components/circularslider/srcview/index.html">source code</a>.</p>
<p>PS: Thanks to Hervé for review and corrections!Autres articles sur le même sujet
<ul>
<li><a href="http://www.lafabrick.com/blog/2009/11/27/1373-flex4-custom-component-skinnig/" rel="bookmark" title="27 novembre 2009">Flex4 : composant personnalisé et skinning</a></li>
<li><a href="http://www.lafabrick.com/blog/2010/02/09/1964-uigfx-project-flex4-primitives-library-fireworks-extension/" rel="bookmark" title="9 février 2010">uigfx project : Flex4 primitives library / Fireworks extension</a></li>
<li><a href="http://www.lafabrick.com/blog/2010/07/14/1920-flex-4-layouts-viewstack-pure-spark/" rel="bookmark" title="14 juillet 2010">Flex 4 et les layouts &#8211; Faire une ViewStack &laquo;&nbsp;pure&nbsp;&raquo; Spark</a></li>
<li><a href="http://www.lafabrick.com/blog/2010/07/23/1989-primitive-dashedline-une-petite-ligne-bien-utile/" rel="bookmark" title="23 juillet 2010">Primitive DashedLine : une petite ligne bien utile</a></li>
</ul>
<p><!-- Similar Posts took 13.784 ms --></p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/lafabrick?a=un0faeasUs0:eXncYznN1Po:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/lafabrick?i=un0faeasUs0:eXncYznN1Po:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/lafabrick?a=un0faeasUs0:eXncYznN1Po:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/lafabrick?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/lafabrick?a=un0faeasUs0:eXncYznN1Po:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/lafabrick?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/lafabrick?a=un0faeasUs0:eXncYznN1Po:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/lafabrick?d=qj6IDK7rITs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/lafabrick?a=un0faeasUs0:eXncYznN1Po:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/lafabrick?i=un0faeasUs0:eXncYznN1Po:F7zBnMyn0Lo" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/lafabrick/~4/un0faeasUs0" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.lafabrick.com/blog/2010/05/04/1962-uigfx-practice-a-circularslider-component-2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.lafabrick.com/blog/2010/05/04/1962-uigfx-practice-a-circularslider-component-2/</feedburner:origLink></item>
		<item>
		<title>Arduino #2 : Flash, socket et Processing</title>
		<link>http://feedproxy.google.com/~r/lafabrick/~3/d0wRLBkcaOc/</link>
		<comments>http://www.lafabrick.com/blog/2010/04/06/1754-arduino-2-flash-socket-et-processing/#comments</comments>
		<pubDate>Tue, 06 Apr 2010 20:11:14 +0000</pubDate>
		<dc:creator>Fabien</dc:creator>
				<category><![CDATA[Nos projets]]></category>
		<category><![CDATA[[Dev] Flash / Flex / AIR...]]></category>
		<category><![CDATA[Arduino]]></category>
		<category><![CDATA[Processing]]></category>

		<guid isPermaLink="false">http://www.lafabrick.com/blog/?p=1754</guid>
		<description><![CDATA[Suite de nos expérimentations! Cette fois on va parler de Flash. Nous allons voir comment faire un petit serveur qui écoute le port série, et qui renvoie les infos sur un socket que nous écouterons avec Flash. C&#8217;est parti! Un serveur série avec Processing Nous allons reprendre le code Processing précédent, et faire quelques modifications. [...]]]></description>
			<content:encoded><![CDATA[<p><center><img src="http://www.lafabrick.com/blog/wp-content/uploads/2010/04/header.jpg" alt="arduino_header" title="arduino_header" width="520" height="130" class="aligncenter size-full wp-image-1793" /></center><br />
Suite de nos expérimentations! Cette fois on va parler de Flash. Nous allons voir comment faire un petit serveur qui écoute le port série, et qui renvoie les infos sur un socket que nous écouterons avec Flash. C&#8217;est parti!<br />
<span id="more-1754"></span><br />
<H2>Un serveur série avec Processing</H2><br />
Nous allons reprendre le code <a href="http://www.lafabrick.com/blog/2010/04/06/1752-arduino-1-fabrique-ta-presque-wiimote">Processing précédent</a>, et faire quelques modifications. Le principe est d&#8217;utiliser la librairie processing.net pour créer et gérer notre serveur. Nous devons modifier légèrement les fonctions setup() et draw() de notre code.<br />
<H3>setup</H3><br />
Dans l&#8217;initialisation, nous devons créer notre serveur. Il suffit tout simplement de définir un port (ici le 10001) :</p>
<pre class="brush: js">
import processing.net.*;
import processing.serial.*;

Serial port;
Server socket;
void setup() {

  println( Serial.list() );

  String usbPort = Serial.list()[0];
  port = new Serial(this, usbPort, 9600);

  socket = new Server( this, 10001 );

  port.bufferUntil(&#039;\n&#039;);

  port.write(65);
}
</pre>
<p><H3>dessine moi un serveur</H3><br />
Nous allons enlevé le code concernant la scène 3D. C&#8217;est une applet serveur que l&#8217;on veut tout de même! Enfin moi je l&#8217;enlève.<br />
Donc, nous allons nous servir de la fonction draw pour pousser les valeurs de l&#8217;accéléromètre au travers du socket. Je n&#8217;envoie que les valeur en X et Y, vue que l&#8217;on n&#8217;a pas (encore) de gyroscope associé à l&#8217;axe Z. On termine l&#8217;écriture sur le serveur par un byte de valeur 0. Histoire de préciser que, oui, c&#8217;est fini et qu&#8217;il peut transmettre. Je conserve le delay de 100 millisecondes, pour ne pas saturer Flash Player par des tonnes de valeurs.</p>
<pre class="brush: js">
void draw() {

  socket.write( xvalue+&quot;,&quot;+yvalue );
  socket.write( zero );

  delay(100);
}
</pre>
<p>Aller hop ! Le code du serveur complet :</p>
<pre class="brush: js">
import processing.net.*;
import processing.serial.*;

Serial port;
Server socket;

byte zero = 0;

float xvalue = 0;
float yvalue = 0;
float zvalue = 0;

void setup() {

  println( Serial.list() );

  String usbPort = Serial.list()[0];
  port = new Serial(this, usbPort, 9600);

  socket = new Server( this, 10001 );

  port.bufferUntil(&#039;\n&#039;);

  port.write(65);
}

void draw() {

  socket.write( xvalue+&quot;,&quot;+yvalue );
  socket.write( zero );

  delay(100);
}

void serialEvent(Serial port) {

  String serialStr = port.readStringUntil(&#039;\n&#039;);
  serialStr = trim(serialStr);

  int values[] = int(split(serialStr, &#039;,&#039;));

  if( values.length == 3 ) { 

    xvalue =calculate( values[0], 512 );
    yvalue = -calculate( values[1], 500 );

  }
}

float calculate( float returnValue, int baseValue ) {

  float diff = returnValue - baseValue;
  returnValue = (diff*90) / 115; 

  // to radian
  returnValue = PI*returnValue/180;

  // trunc value
  returnValue = round( returnValue*100 );
  returnValue = returnValue /100;

  return returnValue;
}
</pre>
<p><H2>Flaaaaaaaaash</H2><br />
Côté Flash, finalement c&#8217;est super simple. Un socket XML, connecté sur le port 10001, avec l&#8217;adresse local (127.0.0.1). A chaque réception de données, nous découpons la valeur reçue pour extraire les valeurs X et Y provenant du serveur Processing :</p>
<pre class="brush: js">
package
{
    import flash.events.DataEvent;
    import flash.events.Event;
    import flash.events.SecurityErrorEvent;
    import flash.net.XMLSocket;

    public class ArduinoSocket
    {
        private var _socket : XMLSocket;

        public function connect() : void
        {
            _socket = new XMLSocket();

            _socket.connect(&quot;127.0.0.1&quot;, 10001);
            _socket.addEventListener(Event.CONNECT, onConnect );
            _socket.addEventListener(DataEvent.DATA, onData);
            _socket.addEventListener(
                        SecurityErrorEvent.SECURITY_ERROR, onSecurityError);

        }

        protected function onConnect( event : Event ) : void
        {
            //connecté;
        }

        protected function onData( event : DataEvent ) : void
        {
            var str : String = event.data;
            var dataAr : Array = str.split(&quot;,&quot;);
            var pitch : Number = Number( dataAr[0] );
            var yaw : Number = Number( dataAr[1] );

            // faites ce que vous voulez ici
        }

        protected function onSecurityError( event : SecurityErrorEvent ) : void
        {
            //y&#039;a une erreur
        }
    }
}
</pre>
<p><H2>Et pour AIR(2)</H2><br />
Processing vous permet de compiler votre code en applet Java, mais aussi en .EXE, .DMG, .RPM. Comme ça on est bien. Le truc cool, c&#8217;est qu&#8217;avec AIR2, vous pouvez, via un packaging natif de votre application, embarquer, et lancer votre serveur directement depuis AIR (via native process, tout çà). Et c&#8217;est bien! du coup vous pouvez avoir un petit serveur qui écoute le port série, directement intégrable dans vos applications. Par extension, vous pouvez prévoir plein de choses avec cette base de petit serveur (un point d&#8217;écoute de vos périphériques bluetooth par exemple?)<br />
<H2>Bonus track</H2><br />
Aller hop ! Je me jette à l&#8217;eau. Une petite séquence pour vous montrer que ce n&#8217;est pas du flan!<br />
<center><br />
<object width="640" height="395"><param name="allowfullscreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="movie" value="http://vimeo.com/moogaloop.swf?clip_id=10727217&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=0&amp;color=00ADEF&amp;fullscreen=1" /><embed src="http://vimeo.com/moogaloop.swf?clip_id=10727217&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=0&amp;color=00ADEF&amp;fullscreen=1" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="640" height="395"></embed></object><br />
</center><br />
(Ouai bon j&#8217;aurais pu faire un gif animé&#8230; Mais la méthode old school marche pas si mal)<br />
<H2>Pour finir</H2><br />
Voilà la fin de cette mise en jambe dans l&#8217;univers Arduino. J&#8217;aurais pu avoir un exemple plus &laquo;&nbsp;graphique&nbsp;&raquo; que le simple cube&#8230; Mais je laisse libre court à votre imagination! Pour la suite, et en fonction de vos retours, je pense aller plus loin dans ce montage analogique : dans un premier temps en ajoutant un gyroscope électronique, et puis j&#8217;aimerai bien vous proposer un tuto sur Arduino et les communications sans fil, notamment via <a href="http://www.arduino.cc/playground/Shields/Xbee01">une interface XBee</a>. A vous!<br />
Autres articles sur le même sujet
<ul>
<li><a href="http://www.lafabrick.com/blog/2007/01/24/26-flash-et-le-streaming-vido/" rel="bookmark" title="24 janvier 2007">Flash et le streaming vidéo</a></li>
<li><a href="http://www.lafabrick.com/blog/2007/03/01/31-une-anne-charge-pour-adobe-et-pour-nous/" rel="bookmark" title="1 mars 2007">Apollo, Blaze, Moxie&#8230; une année chargée pour adobe&#8230; et pour nous !</a></li>
<li><a href="http://www.lafabrick.com/blog/2008/06/06/327-google-language-api-flex/" rel="bookmark" title="6 juin 2008">Google AJAX Language API&#8230; et ton Flex devient polyglotte !</a></li>
<li><a href="http://www.lafabrick.com/blog/2010/04/06/1752-arduino-1-fabrique-ta-presque-wiimote/" rel="bookmark" title="6 avril 2010">Arduino #1 : fabrique ta (presque) wiimote!</a></li>
</ul>
<p><!-- Similar Posts took 14.490 ms --></p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/lafabrick?a=d0wRLBkcaOc:B7agCnqpkio:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/lafabrick?i=d0wRLBkcaOc:B7agCnqpkio:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/lafabrick?a=d0wRLBkcaOc:B7agCnqpkio:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/lafabrick?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/lafabrick?a=d0wRLBkcaOc:B7agCnqpkio:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/lafabrick?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/lafabrick?a=d0wRLBkcaOc:B7agCnqpkio:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/lafabrick?d=qj6IDK7rITs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/lafabrick?a=d0wRLBkcaOc:B7agCnqpkio:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/lafabrick?i=d0wRLBkcaOc:B7agCnqpkio:F7zBnMyn0Lo" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/lafabrick/~4/d0wRLBkcaOc" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.lafabrick.com/blog/2010/04/06/1754-arduino-2-flash-socket-et-processing/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		<feedburner:origLink>http://www.lafabrick.com/blog/2010/04/06/1754-arduino-2-flash-socket-et-processing/</feedburner:origLink></item>
		<item>
		<title>Arduino #1 : fabrique ta (presque) wiimote!</title>
		<link>http://feedproxy.google.com/~r/lafabrick/~3/aH-Lql-XZ2k/</link>
		<comments>http://www.lafabrick.com/blog/2010/04/06/1752-arduino-1-fabrique-ta-presque-wiimote/#comments</comments>
		<pubDate>Tue, 06 Apr 2010 20:10:28 +0000</pubDate>
		<dc:creator>Fabien</dc:creator>
				<category><![CDATA[Nos projets]]></category>
		<category><![CDATA[[Dev] Flash / Flex / AIR...]]></category>
		<category><![CDATA[Arduino]]></category>
		<category><![CDATA[Processing]]></category>

		<guid isPermaLink="false">http://www.lafabrick.com/blog/?p=1752</guid>
		<description><![CDATA[Je vous propose un petit retour sur mes expérimentations autour de Arduino. On va créer une mini wiimote maison. Si si ! (Bon sans les boutons hein !) Pour ce petit tuto nous aurons besoin de : Un microcontrôleur Arduino Un accéléromètre (le &#171;&#160;3 axes&#160;&#187; de Sparkfun est très bien) Un jeu de connecteur mâle. [...]]]></description>
			<content:encoded><![CDATA[<p><center><img src="http://www.lafabrick.com/blog/wp-content/uploads/2010/04/header.jpg" alt="arduino_header" title="arduino_header" width="520" height="130" class="aligncenter size-full wp-image-1793" /></center><br />
Je vous propose un petit retour sur mes expérimentations autour de Arduino. On va créer une mini wiimote maison. Si si ! (Bon sans les boutons hein !)</p>
<p>Pour ce petit tuto  nous aurons besoin de :</p>
<ul>
<li>Un microcontrôleur <a href="http://www.lextronic.fr/P4133-platine-arduino-usb-board.html">Arduino</a></li>
<li><a href="http://www.lextronic.fr/P5722-module-accelerometre-3-axes.html">Un accéléromètre</a> (le &laquo;&nbsp;3 axes&nbsp;&raquo; de Sparkfun est très bien)</li>
<li>Un jeu de <a href="http://www.lextronic.fr/P1321-connecteur-male-simple-rangee-1x20-pour-ci.html">connecteur mâle</a>.</li>
<li>Un peu d&#8217;étain</li>
<li>Un fer a souder pas pourri (ca vous évitera de transpirer pour souder, comme j&#8217;ai pu le faire&#8230;)</li>
</ul>
<p>Compter 26euros pour la platine Arduino USB de base, une 20euros pour l&#8217;accéléromètre, et 35 centimes les 20 connecteurs. L&#8217;étain et le fer à souder ce trouvent chez votre papa/oncle/pote/voisin (sinon chez votre pépé).<br />
<span id="more-1752"></span><br />
Si vous êtes guerrier, des platines Bluetooth existent, et des extensions super fun pour votre board (un <a href="http://www.liquidware.com/shop/show/TSL/TouchShield+Slide">mini écran tactile</a>, <a href="http://www.liquidware.com/shop/show/BP/Lithium+Backpack">un pack batterie lithium</a>,&#8230;.) Mais là on va faire simple pour cette article. Pour le reste, on verra plus tard.</p>
<h2>Un peu d&#8217;électronique</h2>
<p>En premier, nous devons souder les broches sur l&#8217;accéléromètre, histoire de pouvoir le fixer sur le microcontrôleur.<br />
<center><img src="http://www.lafabrick.com/blog/wp-content/uploads/2010/04/adxl.jpg" alt="arduino_adxl" title="arduino_adxl" width="400" height="400" class="aligncenter size-full wp-image-1794" /></center><br />
Noter la qualité incroyable de la soudure.</p>
<p>Ensuite, il faut fixer l&#8217;accéléromètre sur la platine. Arduino a 5 &laquo;&nbsp;pins&nbsp;&raquo; de connexion analogique. Il suffit de placer l&#8217;accéléromètre dessus. Le plus dur est de ne pas se tromper de sens.<br />
<center></p>
<table>
<tr>
<td><img src="http://www.lafabrick.com/blog/wp-content/uploads/2010/04/bien.jpg" alt="arduino_bien" title="arduino_bien" width="250" height="194" class="aligncenter size-full wp-image-1791" /></td>
<td><img src="http://www.lafabrick.com/blog/wp-content/uploads/2010/04/pas_bien.jpg" alt="arduino_pas_bien" title="arduino_pas_bien" width="250" height="194" class="aligncenter size-full wp-image-1792" /></td>
</tr>
<tr>
<td><center>Bien !</center></td>
<td><center>Pas Bien !</center></td>
</tr>
</table>
<p></center></p>
<p>Vous pouvez prendre un café.</p>
<h2>Ardu, I know</h2>
<p>Nous avons donc une magnifique platine, qui ne sait pas encore qu&#8217;elle a plein de talents pour se mouvoir gracieusement. Nous allons y remédier.</p>
<h3>Note préliminaire</h3>
<p>Nous avons fait les bricoleurs du Dimanche, mais je n&#8217;ai pas parlé de ce qu&#8217;est Arduino. C&#8217;est une plateforme de prototypage open source. C&#8217;est à dire un bidule électronique, qui vous sert de base pour tester un assemblage d&#8217;autres bidules électronique, plus ou moins complexe. C&#8217;est utilisé pour tout et n&#8217;importe quoi: la mise au point de carte électronique, la création de robot, l&#8217;utilisation dans l&#8217;univers artistique ou du modélisme (rien a voir, mais c&#8217;est ce que je fait). Donc une platine électronique. Avec une EEPROM que l&#8217;on peut programmer facilement, grâce à un jeu de libraire fourni.</p>
<p>La Programmation Arduino est basé sur Processing. C&#8217;est en fait du Java, version pas chiant, ou tout ce dont vous avez besoin est déjà là. Exit donc les Maven, Nexus et autre repository. On est là pour coder rigolo. (Ce qui ne vous empêche pas d&#8217;utiliser une librairie Java dans Processing, en la collant dans le répertoire des librairies: ça marche) </p>
<p>Les liens qui vont bien : </p>
<ul>
<li>Le site officiel : <a href="http://www.arduino.cc/">http://www.arduino.cc/</a></li>
<li>Getting Started, à lire de préférence, et surtout pour <b>l&#8217;installation du driver pour la Board</b> :
<ul>
<li><a href="http://arduino.cc/en/Guide/MacOSX">Mac</a></li>
<li><a href="http://arduino.cc/en/Guide/Windows">Windows</a></li>
<li><a href="http://www.arduino.cc/playground/Learning/Linux">Linux</a></li>
</ul>
<p></il>
</li>
<li><a href="http://arduino.cc/en/Tutorial/HomePage">Tutos et description des API standards</a></li>
</ul>
<p>Un programme Arduino s&#8217;articule autour de 2 fonctions principales : setup() qui va initialiser des trucs, et loop() qui va exécuter du code en boucle.</p>
<h3>setup</h3>
<p>Comme nous ne voulons pas que la platine fasse l&#8217;autiste, et qu&#8217;elle nous parle, nous allons lui demander d&#8217;envoyer des infos sur le port série.</p>
<pre class="brush: js">
void setup()
{
    // initialize the serial communications:
    Serial.begin(9600);
}
</pre>
<p>9600 est le port sur lequel la platine va balancer ces infos. Vous pouvez choisir n&#8217;importe quelle autre port, ça ne me fait rien.<br />
Il faut ensuite lui indiquer quelle sont les &laquo;&nbsp;pins&nbsp;&raquo; qui vont l&#8217;alimenter (ouai, elle est un peu con con, mais c&#8217;est comme çà).</p>
<pre class="brush: js">
const int groundpin = 18;
const int powerpin = 19;
void setup()
{
    // initialize the serial communications:
    Serial.begin(9600);

    // initialize pins on the board
    pinMode(groundpin, OUTPUT);
    pinMode(powerpin, OUTPUT);
    digitalWrite(groundpin, LOW);
    digitalWrite(powerpin, HIGH);

    delay(10);
}
</pre>
<p>On ajoute à la fin le delay(10); qui lui indique de cadencer la boucle loop toute les 10 millisecondes.</p>
<h3>loop</h3>
<p>Dans cette boucle, nous allons lui demander de lire les infos analogiques via la méthode analogRead( pinNumber );<br />
Nous allons aussi &laquo;&nbsp;lisser&nbsp;&raquo; ces valeurs. Les valeurs analogiques sont exprimées en millivolts: c&#8217;est la variation électrique du circuit qui nous est restituée. Comme le circuit est très précis, les variations sont importantes. Il est donc utile de lisser les nouvelles valeurs par rapport aux anciennes. J&#8217;utilise un algorithme très simple. Pour plus de précision, il serait intéressant d&#8217;intégrer des formules de lissage plus complexes. Si vous avez des électroniciens autour de vous, ils pourront vous en parler.<br />
Enfin, nous envoyons ces valeurs sur le port série.</p>
<p>Le code complet :</p>
<pre class="brush: js">
const int groundpin = 18;                  // analog ground pin
const int powerpin = 19;                   //

const int xpin = 3;                        // x-axis of the accelerometer
const int ypin = 2;                        // y-axis
const int zpin = 1;                        // z-axis (only on 3-axis models)

int sensorx, sensory, sensorz = 0;         // store the values

int smoothedx, smoothedy, smoothedz = 0;  // smoothed results
int precision = 5;                        // amount of precision

void setup()
{
    // initialize the serial communications:
    Serial.begin(9600);

    // initialize pins on the board
    pinMode(groundpin, OUTPUT);
    pinMode(powerpin, OUTPUT);
    digitalWrite(groundpin, LOW);
    digitalWrite(powerpin, HIGH);

    delay(10);
}

void loop()
{
    // read analogic data from input pin
    sensorx = analogRead(xpin);
    sensory = analogRead(ypin);
    sensorz = analogRead(zpin);

    // smothing values
    smoothedx = smoothedx + ((sensorx - smoothedx)/precision);
    smoothedy = smoothedy + ((sensory - smoothedy)/precision);
    smoothedz = smoothedz + ((sensorz - smoothedz)/precision);

    // send values on the Serial port
    Serial.print(smoothedx);
    Serial.print(&quot;,&quot;);
    Serial.print(smoothedy);
    Serial.print(&quot;,&quot;);
    Serial.print(smoothedz);
    Serial.println();
}
</pre>
<p>Il ne vous reste plus qu&#8217;a uploader ce code dans votre platine. <a href="http://arduino.cc/en/Guide/Environment">Toutes les infos sous ce lien.</a></p>
<h2>Un peu de Processing</h2>
<p>Ce qu&#8217;il y a de bien avec Processing, c&#8217;est qu&#8217;on peut faire ce que l&#8217;on veut avec. Du joli graphisme,  à la reprogrammation de votre Micro-Onde pour qu&#8217;il congèle plus vite, vous avez de quoi faire. Là nous allons écouter le port série de notre platine Arduino pour lire les informations analogiques envoyées, et en faire quelque chose.<br />
L&#8217;IDE Processing se <a href=" http://processing.org/">télécharge ici</a>.<br />
Les étapes :</p>
<ul>
<li>Lister les ports série ouverts;</li>
<li>Se connecter sur celui qu&#8217;on veut;</li>
<li>Ecouter les événements provenant du port série;</li>
<li>Faire des trucs avec les données reçues.</li>
</ul>
<p>Processing c&#8217;est comme pour Arduino (normal c&#8217;est la même chose). Vous avez 2 fonctions principales : setup() et draw() (équivalent à loop() chez Arduino).</p>
<h3>RE:setup</h3>
<p>Pour le truc, nous allons initialiser une scène OpenGL (pour au final afficher un cube, et le faire bouger). Super!</p>
<pre class="brush: js">
void setup() {
    size( 800, 800, OPENGL );
}
</pre>
<p>Pour se connecter au port série, c&#8217;est extrêmement simple, Processing dispose d&#8217;une lib faite pour ça : processing.serial. Pour trouver le bon port, nous allons lister les ports série ouverts. Dans mon cas, la platine se connecte sur le port 0. Il suffit de récupérer le nom du port, créer une connexion série, et l&#8217;initialiser :</p>
<pre class="brush: js">
void setup() {
    size( 800, 800, OPENGL );

    println( Serial.list() );

    String usbPort = Serial.list()[0];
    port = new Serial(this, usbPort, 9600);

    port.bufferUntil(&#039;\n&#039;);

    port.write(65);
}
</pre>
<h3>Et je l&#8217;écoute comment le port série?</h3>
<p>Très bonne question ! En fait Processing et la librairie serial expose le port série entrant via la fonction serialEvent(Serial port). Vous n&#8217;avez pas de point d&#8217;écoute à monter. C&#8217;est magique, c&#8217;est pas chiant.<br />
Arduino nous envoie les valeurs sous forme de texte comme ceci : &laquo;&nbsp;valeurX,valeurY,valeurZ&nbsp;&raquo;. Nous devons donc lire le port série, et découper le texte, comme ci-dessous :</p>
<pre class="brush: js">
void serialEvent(Serial port) {

    String serialStr = port.readStringUntil(&#039;\n&#039;);
    serialStr = trim(serialStr);

    int values[] = int(split(serialStr, &#039;,&#039;));
    ...
</pre>
<p>Plus qu&#8217;a lire les infos contenu dans le tableau values[]<br />
(voir plus bas pour le code complet)</p>
<h3>draw (comme loop en fait)</h3>
<p>Pour le cube 3D, il faut placer un point de vue virtuel au centre de la scène, placer une lumière, créer le cube, rotationner le point de vue en fonction des valeurs de l&#8217;accéléromètre, et lui dire de recommencer toutes les 100 millisecondes. Ouf ! ça c&#8217;est de la phrase ! Heureusement en terme de code c&#8217;est moins long :</p>
<pre class="brush: js">
void draw() {

    background(0);
    stroke(255);
    translate(800/2,800/2,0);
    lights();

    rotateX(xvalue);
    rotateY(yvalue);
    box(300,300,300);

    delay(100);
}
</pre>
<h3>super total</h3>
<p>Le code complet pour la partie processing :</p>
<pre class="brush: js">
import processing.net.*;
import processing.opengl.*;
import processing.serial.*;

Serial port;

byte zero = 0;

float xvalue = 0;
float yvalue = 0;
float zvalue = 0;

void setup() {
    size( 800, 800, OPENGL );

    println( Serial.list() );

    String usbPort = Serial.list()[0];
    port = new Serial(this, usbPort, 9600);

    port.bufferUntil(&#039;\n&#039;);

    port.write(65);
}

void draw() {

    background(0);
    stroke(255);
    translate(800/2,800/2,0);
    lights();

    rotateX(xvalue);
    rotateY(yvalue);
    box(300,300,300);

    delay(100);
}

void serialEvent(Serial port) {

    String serialStr = port.readStringUntil(&#039;\n&#039;);
    serialStr = trim(serialStr);

    int values[] = int(split(serialStr, &#039;,&#039;));

    if( values.length == 3 ) {

        xvalue =calculate( values[0], 512 );
        yvalue = -calculate( values[1], 500 );

    }
}

float calculate( float returnValue, int baseValue ) {

    float diff = returnValue - baseValue;
    returnValue = (diff*90) / 115;

    // to radian
    returnValue = PI*returnValue/180;

    // trunc value
    returnValue = round( returnValue*100 );
    returnValue = returnValue /100;

    return returnValue;
}
</pre>
<p>Dans la fonction calculate, qui transforme les valeurs en volt vers des valeurs angulaires, vous verrez un truc bizarre. Je divise par 115 un nombre. Ce n&#8217;est pas du pifomètre ! En fait cette valeur correspond à la moitié de la variation en volt des valeurs. Plus clairement : Les valeurs analogiques varient entre un minimum et un maximum. Sur mon accéléromètre (un ADXL 335), les valeurs X et Y on une variation de 330 millivolts, avec comme valeur médiane 512 millivolts (soit une valeurs comprise entre 397 et 627 millivolts). Tout ceci est fonction de votre accéléromètre. Il vous faudra donc farfouiller dans les spécifications du circuit, qui doivent être disponibles là où vous l&#8217;achetez, pour connaître ces variations.</p>
<h2>Jouons !</h2>
<p>Voilà !<br />
Connectez votre platine, lancez votre programme Processing, et faites bouger le cube avec &laquo;&nbsp;rythm&nbsp;&raquo;.</p>
<p>Vous l&#8217;aurez peut être remarqué : je n&#8217;utilise que 2 axes de l&#8217;accéléromètre (x et y). Pour obtenir une information correcte sur l&#8217;axe z, il s&#8217;avère nécessaire d&#8217;avoir un gyroscope électronique : un DOF (Degree Of Liberty) comme on les appelle. Il en existe plein : 3DOF, 5DOF, &#8230; ils peuvent s&#8217;utiliser couplés à un accéléromètre, en connectant les axes du DOF et ceux de l&#8217;accéléromètre sur les mêmes &laquo;&nbsp;pins&nbsp;&raquo; analogiques de la board Arduino. Les calculateurs des 2 circuits, travaillant ensemble, vous retourneront les bonnes valeurs spatiales de la platine. Je vous ferais un p&#8217;tit article sur le sujet si cela vous intéresse.</p>
<p>2ème remarque, que vous avez forcement remarqué : je n&#8217;ai JAMAIS mis les mots FLASH ou FLEX dans cet article. &laquo;&nbsp;Ouaaa ! Quel exploit!&nbsp;&raquo;, &laquo;&nbsp;merci, merci! Cela m&#8217;a demandé beaucoup d&#8217;entraînement&nbsp;&raquo;. Rassurez vous : le prochain article va vous expliquer comment utiliser tout ce biniou électronique avec votre actionscript préféré, et surtout comment faire VOTRE serveur de port série. Classe ! (et finalement j&#8217;aurais quand même placer ces mots&#8230; Je suis faible)</p>
<p>Je vous invite fortement à lire (et écouter) <a href="http://www.electrofrog.com/">Vincent Maitray</a> dans ces <a href="http://www.flashxpress.net/tag/arduino/">UNBELIEVABLE articles</a> (featuring <a href="http://twitter.com/nicolasgans">Nicolas Gans</a>) concernant Arduino. Ca va loin, et vous aurez absolument toutes les cartes en main pour ajouter des p&#8217;tits boutons et avoir au final une VRAI wiimote &laquo;&nbsp;made by me&nbsp;&raquo;.<br />
Sinon vous avez un autre montage, version poilu, de &laquo;&nbsp;la Grotte du Barbu&nbsp;&raquo; <a href="http://www.lagrottedubarbu.com/2009/12/30/lagrottedubarbu-saison-02-episode-06-horlogeultrabinaire/">sous ce lien</a>.</p>
<p><center><b><a href="http://www.lafabrick.com/blog/2010/04/06/1754-arduino-2-flash-socket-et-processing">Aller! On continue!</a></b></center>Autres articles sur le même sujet
<ul>
<li><a href="http://www.lafabrick.com/blog/2006/10/22/10-youtube-soap-how-to-make-a-mouse-work-in-mid-air/" rel="bookmark" title="22 octobre 2006">La manette Wii sur mac / pc&#8230; enfin presque <img src='http://www.lafabrick.com/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </a></li>
<li><a href="http://www.lafabrick.com/blog/2007/10/01/245-quoi-de-neuf-dans-la-bta-2-de-air/" rel="bookmark" title="1 octobre 2007">Quoi de neuf dans la béta 2 de AIR ?</a></li>
<li><a href="http://www.lafabrick.com/blog/2010/04/06/1754-arduino-2-flash-socket-et-processing/" rel="bookmark" title="6 avril 2010">Arduino #2 : Flash, socket et Processing</a></li>
<li><a href="http://www.lafabrick.com/blog/2010/05/04/1962-uigfx-practice-a-circularslider-component-2/" rel="bookmark" title="4 mai 2010">UIGFX practice : a CircularSlider component</a></li>
</ul>
<p><!-- Similar Posts took 14.846 ms --></p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/lafabrick?a=aH-Lql-XZ2k:Vw7eCoHij64:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/lafabrick?i=aH-Lql-XZ2k:Vw7eCoHij64:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/lafabrick?a=aH-Lql-XZ2k:Vw7eCoHij64:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/lafabrick?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/lafabrick?a=aH-Lql-XZ2k:Vw7eCoHij64:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/lafabrick?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/lafabrick?a=aH-Lql-XZ2k:Vw7eCoHij64:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/lafabrick?d=qj6IDK7rITs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/lafabrick?a=aH-Lql-XZ2k:Vw7eCoHij64:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/lafabrick?i=aH-Lql-XZ2k:Vw7eCoHij64:F7zBnMyn0Lo" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/lafabrick/~4/aH-Lql-XZ2k" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.lafabrick.com/blog/2010/04/06/1752-arduino-1-fabrique-ta-presque-wiimote/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<feedburner:origLink>http://www.lafabrick.com/blog/2010/04/06/1752-arduino-1-fabrique-ta-presque-wiimote/</feedburner:origLink></item>
	</channel>
</rss>
