<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>martian arts</title>
	<atom:link href="http://blog.martian-arts.org/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.martian-arts.org</link>
	<description>AS3 experiments</description>
	<lastBuildDate>Fri, 08 Jan 2010 12:05:17 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.6</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>/!\ Chantier /!\</title>
		<link>http://blog.martian-arts.org/chantier/</link>
		<comments>http://blog.martian-arts.org/chantier/#comments</comments>
		<pubDate>Fri, 08 Jan 2010 12:05:17 +0000</pubDate>
		<dc:creator>y_nk</dc:creator>
				<category><![CDATA[AS3]]></category>

		<guid isPermaLink="false">http://blog.martian-arts.org/?p=222</guid>
		<description><![CDATA[Parce que je n&#8217;ai pas trop le temps de m&#8217;y consacrer vraiment, je déclare cet espace *en cours de rénovation* jusqu&#8217;a nouveau post o/
]]></description>
			<content:encoded><![CDATA[<p>Parce que je n&#8217;ai pas trop le temps de m&#8217;y consacrer vraiment, je déclare cet espace *en cours de rénovation* jusqu&#8217;a nouveau post o/</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.martian-arts.org/chantier/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>CSSFit !</title>
		<link>http://blog.martian-arts.org/cssfit/</link>
		<comments>http://blog.martian-arts.org/cssfit/#comments</comments>
		<pubDate>Tue, 22 Dec 2009 13:24:58 +0000</pubDate>
		<dc:creator>y_nk</dc:creator>
				<category><![CDATA[AS3]]></category>

		<guid isPermaLink="false">http://blog.martian-arts.org/?p=210</guid>
		<description><![CDATA[Most of the full flash website i&#8217;ve to do with bigyouth are meant to be resizable to a certain size.
Before, we were using swffit which is really great most of the time (we also had problems with encoding a long time ago) ; we were bored of adding &#8220;another&#8221; js lib just for a little [...]]]></description>
			<content:encoded><![CDATA[<p>Most of the full flash website i&#8217;ve to do with <a href="http://www.bigyouth.fr/">bigyouth</a> are meant to be resizable to a certain size.</p>
<p>Before, we were using <a href="http://swffit.millermedeiros.com/">swffit</a> which is really great most of the time (we also had problems with encoding a long time ago) ; we were bored of adding &#8220;another&#8221; js lib just for a little trick which can be made with a little css achievement.</p>
<p>So, we created <a href="http://cssfit.googlecode.com/">CSSFit</a>. This is not so different from swffit, and is just for our pleasure to find different solutions <img src='http://blog.martian-arts.org/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> <span id="more-210"></span></p>
<p><strong>What&#8217;s inside ?</strong></p>
<p>Well, not so many files. You&#8217;ve an html/css template which provides the basics to make it work, and an example to see it in action.</p>
<p>The idea is to set some css default rules to swf, html and body dom objects :</p>
<pre class="brush: css;">
html, body
{
width:100%;
height:100%;
min-width:960px;
min-height:600px;
margin:0px;
padding:0px;
overflow:auto;
}

#flash
{
width:100%;
height:100%;
}
</pre>
<p>Easy stuff <img src='http://blog.martian-arts.org/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  But what about IEs ? They dont&#8217; support min-width/height easily since IE4 to 7. We added an other css with some IE specific css tags inside (which are javascript).</p>
<pre class="brush: css;">
html, body
{
overflow-x:expression(document.body.clientWidth &gt; 960 ? &quot;hidden&quot; : &quot;auto&quot;);
overflow-y:expression(document.body.clientHeight &gt; 600 ? &quot;hidden&quot; : &quot;auto&quot;);
}

#flash
{
width:expression(document.body.clientWidth &gt; 960 ? &quot;100%&quot; : &quot;960px&quot; );
height:expression(document.body.clientHeight &gt; 600 ? &quot;100%&quot; : &quot;600px&quot; );
}
</pre>
<p>So, the trick is to load the &#8220;ie specific&#8221; stylesheet when needed to override css definitions. In that way, we use conditionnal commentaries :</p>
<pre class="brush: html;">
&lt;!--[if lte IE 7]&gt;
&lt;link href=&quot;css/ie-fix.css&quot; rel=&quot;stylesheet&quot; type=&quot;text/css&quot; /&gt;
&lt;![endif]--&gt;
</pre>
<p>The last thing to know is you&#8217;ve to add this commentary at the bottom of the page, after the body object&#8217;s closure tag ; as we use javascript inside the &#8220;ie-specific&#8221; css, we&#8217;ve to wait to this object to be fully loaded.</p>
<pre class="brush: html;">
&lt;html&gt;
&lt;head&gt;
&lt;link href=&quot;css/style.css&quot; rel=&quot;stylesheet&quot; type=&quot;text/css&quot; /&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;/body&gt;
&lt;!--[if lte IE 7]&gt;
&lt;link href=&quot;css/ie-fix.css&quot; rel=&quot;stylesheet&quot; type=&quot;text/css&quot; /&gt;
&lt;![endif]--&gt;
&lt;/html&gt;
</pre>
<p><a href="http://www.martian-arts.org/cssfit/" target="_blank">There&#8217;s a demo just here</a> and <a href="http://cssfit.googlecode.com/">the googlecode project is already available and fully free <img src='http://blog.martian-arts.org/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.martian-arts.org/cssfit/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Air 2 (aka Athena) + ServerSocket = crossdomain needed !</title>
		<link>http://blog.martian-arts.org/air-2-aka-athena-serversocket-crossdomain-needed/</link>
		<comments>http://blog.martian-arts.org/air-2-aka-athena-serversocket-crossdomain-needed/#comments</comments>
		<pubDate>Wed, 18 Nov 2009 10:46:05 +0000</pubDate>
		<dc:creator>y_nk</dc:creator>
				<category><![CDATA[AS3]]></category>

		<guid isPermaLink="false">http://blog.martian-arts.org/?p=206</guid>
		<description><![CDATA[Assez impatient de tester les fonctionnalités les plus importantes de Air 2, release hier matin, je suis tombé des nues.
Peut etre est ce le fait de n&#8217;avoir jamais codé de serveur &#8220;public&#8221; (en dehors de localhost) auparavant, mais je me suis heurté a un problème apparement vieux comme le monde, mais qu&#8217;on ne vous dit [...]]]></description>
			<content:encoded><![CDATA[<p>Assez impatient de tester les fonctionnalités les plus importantes de Air 2, release hier matin, je suis tombé des nues.<br />
Peut etre est ce le fait de n&#8217;avoir jamais codé de serveur &#8220;public&#8221; (en dehors de localhost) auparavant, mais je me suis heurté a un problème apparement vieux comme le monde, mais qu&#8217;on ne vous dit pas dans les releases notes.<span id="more-206"></span></p>
<p>Tout bete, le serveur s&#8217;instancie en moins de 2 et on peut faire tourner un client rapidement en local :</p>
<p>Serverside :</p>
<pre class="brush: java;">
server = new ServerSocket();
server.addEventListener(Event.CONNECT, connect);
server.bind(843);
server.listen();

private function connect(e:ServerSocketConnectEvent):void { trace(&quot;client connected&quot;, e.socket); }
</pre>
<p>ClientSide :</p>
<pre class="brush: java;">
me = new Socket(&quot;192.168.0.50&quot;, 843);
me.addEventListener(Event.CONNECT, connect);

private function connect(e:Event):void { trace('connected'); }
</pre>
<p>Ce qu&#8217;on ne vous dit pas (et qui n&#8217;était pas automatique pour moi) c&#8217;est qu&#8217;une fois le client récupéré, on peut écrire dessus comme un bytearray mais pour envoyer les données, il FAUT utiliser la méthode socket.flush(); !</p>
<p>Une fois ce petit désagrément passé, on peut faire dialoguer les 2 facilement&#8230; ou pas !</p>
<p>Testé dans le navigateur, je recois une erreur de sandbox (#2048) entre mon application &#8220;http://mon-ip/client.swf&#8221; et mon serveur. Après des nuits acharnées (aka 3h) de recherches sur le net, il y a plusieurs choses a dire pour amener a la solution :</p>
<p>1. Si on mets le serveur sur le port 843, on peut voir le message du client demandant le crossdomain du serveur. Il envoie la commande <code><file policy request /></code> a laquelle on pourra répondre (voir 3.) ; si on change le port, on ne voit pas la commande et donc impossible d&#8217;envoyer le bon crossdomain (je teste encore pour voir si on peut pas contourner ca).</p>
<p>2. <a href="http://www.adobe.com/devnet/flashplayer/articles/fplayer9_security_05.html">Un fichier de config permet de log des chargements de policy files.</a> Il suffit de trouver le fichier &#8220;mm.cfg&#8221; (situé dans le dossier de session, en l&#8217;occurence pour un vista normal C:\Users\Moi\mm.cfg) et de le modifier pour qu&#8217;apparaisse :</p>
<p><code>PolicyFileLog=1<br />
PolicyFileLogAppend=1</code></p>
<p>La seconde donnée étant pour moi a 0 par défaut. Le fichier de log se trouve ensuite dans (toujours pour moi) C:\Users\Julien\AppData\Roaming\Macromedia\Flash Player\Logs\policyfiles.txt où l&#8217;on peut admirer les différentes étapes de chargement des différents crossdomain du flashplayer.</p>
<p>3. <a href="http://livedocs.adobe.com/flash/9.0/main/wwhelp/wwhimpl/common/html/wwhelp.htm?context=LiveDocs_Parts&#038;file=00001087.html">Dans le cas des sockets xml (et donc notre cas), le client doit charger un crossdomain.xml spécial</a>, avec la commande :</p>
<pre class="brush: java;">
Security.loadPolicyFile(&quot;xmlsocket://mon-ip:843&quot;);
</pre>
<p><del datetime="2009-11-18T10:47:15+00:00">Ce loading spécial ne change rien a la nécéssité de mettre le serveur sur le port 843 (je n&#8217;ai pas encore trouvé pourquoi et comment changer ca).</del> En fait on peut mettre n&#8217;importe quel port sous réserve de bien l&#8217;avoir mis partout (coté serveur, et 2 fois coté client (dans le loadPolicyFile et dans le socket).</p>
<p>Coté serveur, quand le client execute cette commande, on reçoit tout pareil la commande <code><file policy request /></code>. Il faut donc lui répondre un xml de crossdomain viable, où l&#8217;on <b>doit</b> spécifier le port, et où l&#8217;on terminera par un byte nul pour spécifier la fin de la transaction :</p>
<pre class="brush: java;">
server = new ServerSocket();
server.addEventListener(Event.CONNECT, connect);
server.bind(843);
server.listen();

private function connect(e:ServerSocketConnectEvent):void
{
trace(&quot;client connected&quot;, e.socket);
var client:Socket = e.socket;
client.addEventListener(ProgressEvent.SOCKET_DATA, data, false, 0, true);
}

private function data(e:ProgressEvent):void
{
var client:Socket = e.target as Socket;
var cmd:String = client.readUTFBytes(client.bytesAvailable);

switch(cmd)
{
case &quot;&lt;policy-file-request/&gt;&quot;:
var ba = new ByteArray();
ba.writeUTFBytes('&lt;cross-domain-policy&gt;');
ba.writeUTFBytes('&lt;allow-access-from domain=&quot;*&quot; to-ports=&quot;8888&quot; /&gt;');
ba.writeUTFBytes('&lt;/cross-domain-policy&gt;');
ba.writeByte(0);
ba.position = 0;

client.writeBytes(ba, 0, ba.bytesAvailable);
client.flush();
break;
}
}
</pre>
<p>Le plus dur a été de trouver les ressources qui sont bien enfouies au fin fond d&#8217;adobe.com <img src='http://blog.martian-arts.org/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Have fun avec les socket :]</p>
<p><strong>Edit :</strong> Pour ceux (comme moi) qui esperaient pouvoir installer le runtime Air2 sur linux directement en ligne de commande, cela est impossible. Il vous faudra un x11 pour pouvoir accepter les conditions d&#8217;utilisation. Normalement, un formulaire est prévu par Adobe pour pré-accepter ces conditions, renvoyant sur un bin spécial ; Air 2 étant encore en beta, le formulaire n&#8217;existera sans doute pas tant qu&#8217;une version stable ne verra le jour.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.martian-arts.org/air-2-aka-athena-serversocket-crossdomain-needed/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>BitmapData + Graphics = WTF?</title>
		<link>http://blog.martian-arts.org/bitmapdata-graphics-wtf/</link>
		<comments>http://blog.martian-arts.org/bitmapdata-graphics-wtf/#comments</comments>
		<pubDate>Mon, 16 Nov 2009 16:33:15 +0000</pubDate>
		<dc:creator>y_nk</dc:creator>
				<category><![CDATA[AS3]]></category>

		<guid isPermaLink="false">http://blog.martian-arts.org/?p=199</guid>
		<description><![CDATA[Récemment (toujours) j&#8217;ai été confronté a des transitions nécéssitant de découper et mettre a jour des bitmapdatas et où je me suis presque littéralement arraché les cheveux. J&#8217;ai d&#8217;ailleurs utilisé la technique &#8220;a la va vite&#8221; et, ayant un 30mn aujourd&#8217;hui, je reviens dessus, teste le pourquoi du comment.
Pour la petite démo, j&#8217;ai 4 images [...]]]></description>
			<content:encoded><![CDATA[<p>Récemment (toujours) j&#8217;ai été confronté a des transitions nécéssitant de découper et mettre a jour des bitmapdatas et où je me suis presque littéralement <a href="http://djbeltounes.files.wordpress.com/2009/09/sim01.jpg">arraché les cheveux</a>. J&#8217;ai d&#8217;ailleurs utilisé la technique &#8220;a la va vite&#8221; et, ayant un 30mn aujourd&#8217;hui, je reviens dessus, teste le pourquoi du comment.<span id="more-199"></span></p>
<p>Pour la petite démo, j&#8217;ai 4 images embarquées dans un swf, que je stocke dans 4 bitmapDatas différents, bmd1, 2, 3, et 4. J&#8217;ai également pris un &#8220;bmd0&#8243;, reflet de l&#8217;image affichée (un genre de référence au bmd courant). J&#8217;ai enfin un petit script permettant de faire des captures de ce &#8220;current&#8221;, et de dessiner la zone dans un nouveau Sprite.</p>
<p>Pour capturer un morceau d&#8217;image, un simple drag and drop suffit et pour changer d&#8217;image, c&#8217;est avec les touches 1, 2, 3, et 4 du clavier alphabétique que ca se passe.</p>

<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"
			id="fm_BeginBitmapFill_1436260440"
			class="flashmovie"
			width="400"
			height="300">
	<param name="movie" value="http://blog.martian-arts.org/wp-content/uploads/2009/11/BeginBitmapFill.swf" />
	<!--[if !IE]>-->
	<object	type="application/x-shockwave-flash"
			data="http://blog.martian-arts.org/wp-content/uploads/2009/11/BeginBitmapFill.swf"
			name="fm_BeginBitmapFill_1436260440"
			width="400"
			height="300">
	<!--<![endif]-->
		
<p><a href="http://adobe.com/go/getflashplayer"><img src="http://www.adobe.com/images/shared/download_buttons/get_flash_player.gif" alt="Get Adobe Flash player" /></a></p>

	<!--[if !IE]>-->
	</object>
	<!--<![endif]-->
</object>
<p>Quand on teste une premiere fois de capturer une image, tout fonctionne bien, c&#8217;est impec. Vient le moment de changer d&#8217;image et la, stupeur et tremblements, le petit Sprite fraichement capturé, qui n&#8217;utilise que beginBitmapFill et ne stocke jamais de référence au bitmapData est pourtant lui aussi updaté.</p>
<p><strong>Pourquoi ?</strong><br />
Je suppose qu&#8217;implicitement la méthode beginBitmapFill() garde une référence au bitmapData, et si le bitmapData change, elle s&#8217;auto-appelle pour mettre a jour le tout. Concretement je suis plutot décu de cette implémentation pseudo-intelligente. Je m&#8217;attendais a un comportement uniforme de la classe Graphics ; jusqu&#8217;a preuve du contraire &#8220;beginBitmapFill&#8221; devrait juste faire ce que son nom semble dire &#8220;begin bitmap fill&#8221; et pas &#8220;beginBitmapFillAndAutoupdateIfReferenceHasChanged&#8221;.</p>
<p><strong>Workaround</strong><br />
J&#8217;avais testé plusieurs workarounds, et le dernier me semble le plus viable :</p>
<p>1/ D&#8217;abord j&#8217;avais pensé a garder une référence au bmd dans l&#8217;objet. Malheureusement, <a href="http://www.leblogdugeek.com/wp-content/uploads/2008/10/nelson-simpsons-ah-ah-420x261.jpg">ca marche pas</a>.</p>
<p>2/ Ensuite j&#8217;avais pensé a faire un clone du bmd en utilisant clone() mais c&#8217;est pas super optimisé, vu que dans le cas réel je traitais beaucoup de petites captures d&#8217;un très grand bitmapData.</p>
<p>3/ Solution du cas réel, j&#8217;ai créé des clones a la taille de la capture, et du coup ma matrice de transformation s&#8217;est transformée en rectangle au moment du copyPixels. Niveau optimisation, on y est un peu plus, mais franchement, c&#8217;pas encore ca.</p>
<p>Ce qui m&#8217;<a href="http://hidezone.free.fr/orly.jpg">effraie</a> le plus, c&#8217;est d&#8217;être passé a côté du plus simple. Comme pas mal de bugs graphiques, mettre des filtres &#8220;nuls&#8221; suffit. Oui oui, en effet, un simple &#8220;filters = [new BlurFilter(0, 0)]&#8221; et pouf le bug est parti.</p>
<p>Pour illustrer ca, retour a la démo, et appuyons sur Entrée pour switcher entre &#8220;auto update ON&#8221; et &#8220;auto update OFF&#8221;.</p>
<p><a href="http://gil.formosa.free.fr/illustrations-Jeunesse/images/Fele-Lustucru.jpg">Qui l&#8217;eu cru ?</a></p>
<p>Sur ce, <a href="http://blog.martian-arts.org/wp-content/uploads/2009/11/BeginBitmapFill.rar">les sources</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.martian-arts.org/bitmapdata-graphics-wtf/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Away3D + Marilena = Head Tracking ?</title>
		<link>http://blog.martian-arts.org/away3d-marilena-head-tracking/</link>
		<comments>http://blog.martian-arts.org/away3d-marilena-head-tracking/#comments</comments>
		<pubDate>Mon, 20 Jul 2009 13:45:47 +0000</pubDate>
		<dc:creator>y_nk</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://blog.martian-arts.org/?p=191</guid>
		<description><![CDATA[Inspiré de Johnny lee et de son head tracking, voici un petit flash fait en 1h et quelques. Le process aurait pu etre fait a base de motion tracking plus simple et plus rapide pour flash ; c&#8217;était pour moi le moyen le plus sympa de rencontrer Marilena (projet libspark) et d&#8217;utiliser &#8220;un peu&#8221; away3d. [...]]]></description>
			<content:encoded><![CDATA[<p>Inspiré de <a href="http://johnnylee.net/projects/wii/">Johnny lee</a> et de son head tracking, voici un petit flash fait en 1h et quelques. Le process aurait pu etre fait a base de motion tracking plus simple et plus rapide pour flash ; c&#8217;était pour moi le moyen le plus sympa de rencontrer Marilena (projet libspark) et d&#8217;utiliser &#8220;un peu&#8221; away3d. De plus, le motion tracking ne fait pas la différence entre une mouche qui vole, une main et un visage. Là, si ! (Vous pouvez feinter en dessinant un smiley sur du papier quand meme) <span id="more-191"></span><br />

<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"
			id="fm_HeadTracking_1554299052"
			class="flashmovie"
			width="400"
			height="300">
	<param name="movie" value="http://blog.martian-arts.org/wp-content/uploads/2009/07/HeadTracking.swf" />
	<!--[if !IE]>-->
	<object	type="application/x-shockwave-flash"
			data="http://blog.martian-arts.org/wp-content/uploads/2009/07/HeadTracking.swf"
			name="fm_HeadTracking_1554299052"
			width="400"
			height="300">
	<!--<![endif]-->
		
<p><a href="http://adobe.com/go/getflashplayer"><img src="http://www.adobe.com/images/shared/download_buttons/get_flash_player.gif" alt="Get Adobe Flash player" /></a></p>

	<!--[if !IE]>-->
	</object>
	<!--<![endif]-->
</object>
]]></content:encoded>
			<wfw:commentRss>http://blog.martian-arts.org/away3d-marilena-head-tracking/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>AS3, FP10, PatchPanel et SwitchBoard</title>
		<link>http://blog.martian-arts.org/as3-fp10-patchpanel-et-switchboard/</link>
		<comments>http://blog.martian-arts.org/as3-fp10-patchpanel-et-switchboard/#comments</comments>
		<pubDate>Wed, 15 Jul 2009 13:06:30 +0000</pubDate>
		<dc:creator>y_nk</dc:creator>
				<category><![CDATA[AS3]]></category>
		<category><![CDATA[Ai]]></category>

		<guid isPermaLink="false">http://blog.martian-arts.org/?p=189</guid>
		<description><![CDATA[Aujourd&#8217;hui un léger post pour faire le point sur le projet &#8220;offline&#8221; de mon examen. L&#8217;idée était de retaper le process d&#8217;une application qu&#8217;un client avait fabriqué il y a plus de 8 ans, afin de le rendre fluide et exploitable. Au lieu d&#8217;utiliser 5000 technos, je pense a réduire le tout a : flash [...]]]></description>
			<content:encoded><![CDATA[<p>Aujourd&#8217;hui un léger post pour faire le point sur le projet &#8220;offline&#8221; de mon examen. L&#8217;idée était de retaper le process d&#8217;une application qu&#8217;un client avait fabriqué il y a plus de 8 ans, afin de le rendre fluide et exploitable. Au lieu d&#8217;utiliser 5000 technos, je pense a réduire le tout a : flash et illustrator dans une conception simple : Photoshop, Catalyst, Flash Builder.<span id="more-189"></span></p>
<p>Sans dévoiler la mouture perso de l&#8217;application, le process client était celui ci :</p>
<ol>
<li>Envoyer une image a php pour l&#8217;analyser, a la manière d&#8217;un getPixel et renvoyer un fichier texte formaté dans l&#8217;esprit d&#8217;un ByteArray</li>
<li>Balancer le tout dans flash, afin de changer quelques variables, et exporter le tout en jpg</li>
<li>Ouvrir le jpg avec illustrator, utiliser un script pour vectoriser sans pertes le jpg généré</li>
<li>Agrandir et sortir un PDF destiné au print</li>
</ol>
<p>Voici comment je compte résumer le process :</p>
<ol>
<li>Ouvrir Illustrator avec un flash panel</li>
<li>Charger un jpg dans le flash panel et jouer avec les curseurs</li>
<li>Générer l&#8217;illustrator pret a etre agrandi au besoin et enregistré en PDF</li>
</ol>
<p>Je laisse la main a l&#8217;utilisateur sur l&#8217;étape de redimensionnement et d&#8217;enregistrement car ces paramètres dépendent essentiellement de la commande. J&#8217;aurai pu les inclure dans le flash panel, mais mon idée d&#8217;un panneau est un outils destiné aux données du document et il se limite donc a manipuler ces données (et pas à enregistrer, fermer le document, fermer illustrator et allumer la cafetière juste avant d&#8217;éteindre le pc).</p>
<p>On part donc sur un panneau flash utilisant la technologie PatchPanel pour communiquer avec l&#8217;application. Je fais mon design sur Photoshop, l&#8217;importe dans flash Catalyst pour définir les premiers composants qui feront mon application.</p>
<p>Premier constat, si vous utilisez des styles de calques avec transparences, ils seront rasterizés a l&#8217;import et ca rendra très moche. J&#8217;ai donc préféré me taper l&#8217;export de chaque png a la main pour être certain que Catalyst ferait pas de la bouillie de transparence ; pour caler, un screenshot en fond de mon application c&#8217;est le plus simple et le plus efficace.</p>
<p>Je fais quelques boutons avec le mythique &#8220;je click ici et je dis ceci est un bouton et hop c&#8217;est bon&#8221; et quelques transitions histoire de dire &#8220;waaah&#8221; en 5mn, et me voila dans flash builder.</p>
<p>Bon, grâce aux petits conseils fournis à la présentation Flash Platform, j&#8217;avais bien renommé mes classes et la lecture du code généré était&#8230; relativement simple.</p>
<p>Si Catalyst génère du code propre, je pense quand meme qu&#8217;il n&#8217;est pas super lisible. J&#8217;ai passé près de 20mn a retaper les identations, l&#8217;ordre des groupes (<s:Group>) pour avoir un code proche de ce que j&#8217;aurai pu &#8220;générer&#8221; à la mano.</p>
<p>Une fois le cleanage fait, le gros taf était simple, de l&#8217;AS3 (FP10) tout ce qu&#8217;il y a de plus basique. Un loader, <a href="http://blog.martian-arts.org/histogramme-colorimetrique/">un histogramme</a> et la communication avec Illustrator.</p>
<p>Là, la doc de PatchPanel est plus qu&#8217;accessible. Il y a énormément d&#8217;exemples pour bien démarrer. Pour loader mon image direct, j&#8217;utilise FileReference.load() qui permet de charger directement un média dans le player, et là, c&#8217;est le drame. L&#8217;event de loading n&#8217;est pas trigger, et le fait d&#8217;executer le panel dans le player interne d&#8217;illustrator ne permet aucun debug. Je suis donc dans le flou total pour cette piste.</p>
<p>Petit clone de projet, je décide de passer sur &#8220;SwitchBoard&#8221;, une techno similaire qui permet a une appli Air de dialoguer avec la suite Adobe. Cette solution me plait moins car il faut installer un client SwitchBoard et le runtime Air pour enfin installer l&#8217;appli et la faire tourner. C&#8217;est plus fastidieux, et ce n&#8217;est pas tout.</p>
<p>Ayant un runtime Air a jour (1.5), FileReference.load() fonctionne bien. Cela ne fait qu&#8217;appuyer ma théorie &#8220;Illustrator CS4 possède un FP9 interne non updaté&#8221;. J&#8217;arrive facilement à dialoguer avec illustrator. En fait SwitchBoard est beaucoup moins évolué que ce que je pensais. Il faut créér un &#8220;Client&#8221;, qui envoie des &#8220;Message&#8221; qui ne sont ni plus ni moins que des commandes JavaScript. En gros, je perçois l&#8217;appli Switchboard et son framework comme un socket camouflé (alors que PatchPanel à au moins une vraie architecture objet calquant le &#8220;DOM&#8221; d&#8217;illustrator (avec ses défauts)).</p>
<p>N&#8217;ayant pas trop d&#8217;autres choix, je limite le scope de mon appli à la génération de l&#8217;artwork et je squizze pour l&#8217;instant les quelques curseurs. je fais mes petites boucles, et j&#8217;envoie sur enterFrame mes &#8220;Messages&#8221; a Illustrator&#8230;</p>
<p>Pour analyser un jpg de 80&#215;100 (8000px) c&#8217;est rapide, très rapide. Pour envoyer les messages quel déception ! C&#8217;est lent&#8230; très lent&#8230; je compte 3 minutes sur un entreFrame de 30fps. L&#8217;envoi des données semble même trop rapide pour Switchboard car certains éléments sont tout simplement absent de la génération. Il faudra passer sur un Timer pour ralentir la cadence d&#8217;envoi des messages et avoir une génération d&#8217;artwork fiable à 100%&#8230; en 8mn54s !!! C&#8217;est tout simplement abérant <img src='http://blog.martian-arts.org/wp-includes/images/smilies/icon_sad.gif' alt=':(' class='wp-smiley' /> </p>
<p>Alors je vois pas trop bien quelles solutions j&#8217;ai. La meilleure serait de corriger ce problème de Flash Player afin d&#8217;utiliser PatchPanel. Pour l&#8217;avoir déjà utilisé auparavant, je pense que la génération serait plus rapide et plus fiable. Je pourrais en plus de ca, garder des références des objets générés afin de pouvoir optimiser l&#8217;utilisation des curseurs. En utilisant SwitchBoard, je suis contraint de faire une appli plus grande afin d&#8217;insérer une zone de prévisualisation dans laquelle je pourrais manipuler un simple ByteArray et un gros bouton &#8220;Générer (et allez prendre un café)&#8221; pour le process.</p>
<p>Si vous avez des réponses et/ou des solutions, je suis bien évidemment preneur <img src='http://blog.martian-arts.org/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://blog.martian-arts.org/as3-fp10-patchpanel-et-switchboard/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Histogramme colorimétrique</title>
		<link>http://blog.martian-arts.org/histogramme-colorimetrique/</link>
		<comments>http://blog.martian-arts.org/histogramme-colorimetrique/#comments</comments>
		<pubDate>Wed, 01 Jul 2009 01:33:28 +0000</pubDate>
		<dc:creator>y_nk</dc:creator>
				<category><![CDATA[AS3]]></category>

		<guid isPermaLink="false">http://blog.martian-arts.org/?p=141</guid>
		<description><![CDATA[Voici une petites classe qui sera très utile pour ceux et celles qui font de la photo.
J&#8217;avais déjà posté une classe Color ayant plein de conversions ; je remettrai le couvert en optimisant un maximum et en insérant le peu que j&#8217;ai appris sur le polymorphisme. Ce n&#8217;est pas le sujet de ce billet mais [...]]]></description>
			<content:encoded><![CDATA[<p>Voici une petites classe qui sera très utile pour ceux et celles qui font de la photo.</p>
<p>J&#8217;avais déjà posté une classe Color ayant plein de conversions ; je remettrai le couvert en optimisant un maximum et en insérant le peu que j&#8217;ai appris sur le polymorphisme. Ce n&#8217;est pas le sujet de ce billet mais je tease en passant.</p>
<p>Voici donc le topic : une classe générant un histogramme de couleur tel qu&#8217;on pourrait le voir dans Adobe Lightroom et Photoshop. J&#8217;en ai pas eu un besoin vital mais c&#8217;était une petite feature à ajouter à un projet qui fait joli et qui renseigne un peu quand même. Merci encore une fois à <a href="http://fr.nicoptere.net/">nicoptere</a> pour les petits tips d&#8217;optimisation.<span id="more-141"></span></p>
<p>Voici l&#8217;implémentation et un screenshot en situation :</p>
<pre class="brush: java;">
public function Histogram(width:int, height:int):void
public function analyze(source:BitmapData):void
public function refresh():void
</pre>
<p><a href="http://blog.martian-arts.org/wp-content/uploads/2009/07/Image-2.png"><img src="http://blog.martian-arts.org/wp-content/uploads/2009/07/Image-2.png" alt="Image 2" title="Image 2" width="476" height="210" class="aligncenter size-full wp-image-159" /></a></p>
<p>La classe commence a avoir des temps de réponses supérieurs à 1s sur des bitmaps d&#8217;une taille supérieure a 1600&#215;1200px. J&#8217;aurai aimé optimiser d&#8217;avantage en passant sur un modèle &#8220;setPixel&#8221; mais j&#8217;aurai alors perdu l&#8217;aliasing du tracé fourni par Graphics.</p>
<p>Voici <a href='http://blog.martian-arts.org/wp-content/uploads/2009/07/Histogram.as'>le jouet</a> !</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.martian-arts.org/histogramme-colorimetrique/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Flashboard, concepts a la mode</title>
		<link>http://blog.martian-arts.org/flashboard-concepts-a-la-mode/</link>
		<comments>http://blog.martian-arts.org/flashboard-concepts-a-la-mode/#comments</comments>
		<pubDate>Mon, 29 Jun 2009 08:53:17 +0000</pubDate>
		<dc:creator>y_nk</dc:creator>
				<category><![CDATA[AS3]]></category>

		<guid isPermaLink="false">http://blog.martian-arts.org/?p=136</guid>
		<description><![CDATA[Je me rends compte depuis quelques temps que les concepts comme celui que j&#8217;avais imaginé avec Flashboard fleurissent et murissent tout autour du monde. C&#8217;est assez difficile de se dire qu&#8217;on a une idée originale en fait  
Merci a ceux qui m&#8217;ont inspiré et aussi ceux qui développent une idée similaire ; cela me [...]]]></description>
			<content:encoded><![CDATA[<p>Je me rends compte depuis quelques temps que les concepts comme celui que j&#8217;avais imaginé avec Flashboard fleurissent et murissent tout autour du monde. C&#8217;est assez difficile de se dire qu&#8217;on a une idée originale en fait <img src='http://blog.martian-arts.org/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Merci a ceux qui m&#8217;ont inspiré et aussi ceux qui développent une idée similaire ; cela me montre que la compétition est rude, et que mon chemin n&#8217;est pas dénué de sens.<span id="more-136"></span></p>
<p>Voici le projet d&#8217;une team des Gobelins : http://www.projet-kune.fr/</p>
<p>Je n&#8217;ai pas pu tester le travail, mais la vidéo est prometteuse. En parlant de vidéo, les tutos vidéos pour l&#8217;utilisation de flashboard verront le jour d&#8217;ici 15 jours ou ne verront pas. C&#8217;est dit.</p>
<p>Voici le projet maintenant supporté par pecha kucha qui m&#8217;a fait déprimé pendant quelques temps : www.prezi.com</p>
<p>J&#8217;avais a peine fini le cahier des charges et la première alpha quand je suis tombé sur leur site et je me suis rendu compte de l&#8217;avance. Ca a d&#8217;abord été une bonne source de déprime, comme a chaque fois qu&#8217;on commence un truc original et qu&#8217;on se rends compte que &#8220;<a href="http://www.southpark-tv.com/episode.php?id=134">les simpsons l&#8217;ont déjà fait</a>&#8221; et au final, ca a été une source d&#8217;inspiration très utile, car j&#8217;ai pu analyser les problèmes de leur interfaces et ca m&#8217;a permis d&#8217;anticiper quelques bons points sur Flashboard.</p>
<p>J&#8217;en profite pour faire un coucou et merci a ceux qui m&#8217;ont supporté et aidé durant ce long périple qui ne saurait tarder a recommencer : <a href="http://ptitshou.free.fr/blog/">sophie</a>, <a href="http://fr.nicoptere.net/">nicoptere</a>, <a href="http://niko.informatif.org/blog">[NiKo]</a>, <a href="http://developpeur.mediabox.fr/index.php?showuser=11898">dada</a>, <a href="http://soka-tira.net/">smooki</a>, <a href="http://www.kabnot.com/">kabnot</a> et biensur mes collègues <a href="http://www.robin-scherberich.com">robin</a>, <a href="http://www.clementbonin.com/">clément</a>, antoine, et tous les autres; plus largement <a href="http://flash.mediabox.fr">la board flash de mediabox</a> et leur <a href="irc://irc.freenode.net/mediabox">channel irc</a> où on offre des glaces à la fraise !</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.martian-arts.org/flashboard-concepts-a-la-mode/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>GPS, Python, Flex, AS3 et GoogleMaps ou l&#8217;art d&#8217;occuper ses soirées.</title>
		<link>http://blog.martian-arts.org/gps-python-flex-as3-et-googlemaps-ou-lart-doccuper-ses-soirees/</link>
		<comments>http://blog.martian-arts.org/gps-python-flex-as3-et-googlemaps-ou-lart-doccuper-ses-soirees/#comments</comments>
		<pubDate>Wed, 24 Jun 2009 01:57:11 +0000</pubDate>
		<dc:creator>y_nk</dc:creator>
				<category><![CDATA[AS3]]></category>
		<category><![CDATA[Python]]></category>

		<guid isPermaLink="false">http://blog.martian-arts.org/?p=116</guid>
		<description><![CDATA[J&#8217;ai récemment été confronté à la situation où on sait pas faire un truc (ca arrive souvent  ). En l&#8217;occurence, il fallait écouter des données provenant d&#8217;un périphérique et les exploiter dans Flash. Voici mon training  
J&#8217;ai commencé par fouiller les tiroirs à la recherche d&#8217;un périphérique similaire (bluetooth donc) et j&#8217;ai réussi [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: left;">J&#8217;ai récemment été confronté à la situation où on sait pas faire un truc (ca arrive souvent <img src='http://blog.martian-arts.org/wp-includes/images/smilies/icon_sad.gif' alt=':(' class='wp-smiley' /> ). En l&#8217;occurence, il fallait écouter des données provenant d&#8217;un périphérique et les exploiter dans Flash. Voici mon training <img src='http://blog.martian-arts.org/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> <span id="more-116"></span></p>
<p style="text-align: left;">J&#8217;ai commencé par fouiller les tiroirs à la recherche d&#8217;un périphérique similaire (bluetooth donc) et j&#8217;ai réussi a déterrer une vieille balise GPS qui date de quand les tomtoms et autres navigateurs étaient hors de prix et qu&#8217;un petit PDA faisait mieux l&#8217;affaire :</p>
<p style="text-align: center;"><img class="size-full wp-image-117 aligncenter" title="leadtek_bt9553" src="http://blog.martian-arts.org/wp-content/uploads/2009/06/leadtek_bt9553.gif" alt="leadtek_bt9553" width="175" height="190" /></p>
<p style="text-align: left;">L&#8217;idée (assez inutile soit dit en passant) est de récupérer les données de la balise, afin de me localiser dans googlemaps.</p>
<p style="text-align: left;">Etape 1, écouter la balise. N&#8217;étant pas un érudit des OS alcidés, j&#8217;ai glané auprès d&#8217;un ami quelques infos intéressantes. Lorsqu&#8217;on détecte et que l&#8217;on créé une connexion avec un périphérique, une ressource se créé dans le répertoire /dev. Ces ressources sont référencées par &#8220;tty.&#8221; puis le nom du périphérique ou de la connexion (<a href="http://pwet.fr/man/linux/fichiers_speciaux/tty">complément d&#8217;info</a>).</p>
<p style="text-align: left;">Depuis peu, je possède un mac, et c&#8217;est super parce que c&#8217;est basé sur une BSD et donc c&#8217;est pratiquement les mêmes principes architecturaux. On peut donc ouvrir un terminal et regarder ce qu&#8217;on a dans /dev :</p>
<p style="text-align: left;"><img class="aligncenter size-full wp-image-118" title="Image 2" src="http://blog.martian-arts.org/wp-content/uploads/2009/06/Image-2.png" alt="Image 2" width="457" height="59" /></p>
<p style="text-align: left;">La balise est là. N&#8217;ayant strictement aucune idée de comment j&#8217;allais m&#8217;y prendre (ou peut être vaguement), je retourne glaner des infos par ci par la, et j&#8217;ai découvert une commande qui a radicalement changé ma manière de voir les connexions avec des périphériques : screen. Une magnifique commande, qui, en conjonction avec un &#8220;tty&#8221; permet d&#8217;afficher dans le terminal les messages délivrés par la ressource. Une petite démo :</p>
<p style="text-align: left;"><img class="aligncenter size-full wp-image-119" title="Image 3" src="http://blog.martian-arts.org/wp-content/uploads/2009/06/Image-3.png" alt="Image 3" width="427" height="114" /></p>
<p style="text-align: left;">Bon bah voila. On a un paquet de code pourri. En y regardant d&#8217;<a href="http://www.google.fr/search?q=GPGGA">un peu plus près</a> et en faisant appel à de vagues souvenirs de configuration, cette norme de transmission est en fait du &#8220;NMEA&#8221;.Et là, tout de suite, <a href="http://www.gpsinformation.org/dale/nmea.htm#position">tout devient limpide</a>.</p>
<p style="text-align: left;">
<p style="text-align: left;">Etape 2 : Relayer l&#8217;information. Tout le monde le sait, et c&#8217;est pas nouveau, Flash ne peut pas avoir accès a des ressources systèmes, et c&#8217;est bien pour ca que les projets comme <a href="http://wiiflash.bytearray.org/">WiiFlash</a> utilisent des serveurs sockets écrits en Java pour relayer le hardware avec la partie as3. J&#8217;avais entendu <a href="http://xkcd.com/353/">ici et là</a> que Python c&#8217;était génial et qu&#8217;on pouvait presque tout faire avec. J&#8217;ai donc voulu m&#8217;essayer à ce langage, histoire de dire &#8220;j&#8217;en ai fait&#8221; (d&#8217;ailleurs, j&#8217;en ai fait, vraiment <img src='http://blog.martian-arts.org/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> ).</p>
<p style="text-align: left;">Pour celles (lol) et ceux qui ne le sauraient pas déjà, <a href="http://img143.imageshack.us/img143/6525/leopardfanboyis0.jpg">Leopard</a> possède nativement un interpreteur Python 2.5.1. C&#8217;est déjà une bonne chose <img src='http://blog.martian-arts.org/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' />  Ensuite, j&#8217;ai un peu galéré avec, mais heureusement les endroits où parler Python ne manquent pas (j&#8217;en profite pour passer un coucou aux gens de #python-fr@irc.freenode.net) et j&#8217;ai pu rapidement être aiguillé vers les 2 librairies (qu&#8217;on appelle &#8220;<em>module</em>&#8221; chez les Pythonneux) que j&#8217;utiliserai au final : <a href="http://pyserial.wiki.sourceforge.net/pySerial">pyserial</a> et <a href="http://twistedmatrix.com/trac/">twisted</a>. Respectivement, la première est dédiée à la lecture des ports séries, et twisted est un genre d&#8217;usine à gaz qui permet de faire très facilement n&#8217;importe quel serveur socket.</p>
<p style="text-align: left;">On relèvera que Python est un langage interprété, et qu&#8217;on peut lancer l&#8217;interpréteur avec la commande &#8220;python&#8221; dans le terminal, ou bien executer un script en rajoutant simplement le path et le nom du fichier juste après (par convention, les fichiers sont des &#8220;.py&#8221;).</p>
<p style="text-align: left;">On est parti dans l&#8217;install de pyserial. Comme le dit la doc très simplement, il y a un &#8220;egg&#8221; a <a href="http://pypi.python.org/packages/2.5/p/pyserial/pyserial-2.4-py2.5.egg#md5=80f98ec0ef48a22e1527071c8520b6cc">télécharger</a>, et ensuite dans le terminal il suffit de taper &#8220;easy_install pyserial&#8221;. C&#8217;est magique, ca marche, j&#8217;adore <img src='http://blog.martian-arts.org/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p style="text-align: left;">Dans la lancée, au fin fond de la page de pyserial on peut y lire un &#8220;quick start&#8221;. Mise en pratique histoire de faire mon premier hello world évolué :</p>
<p style="text-align: left;"><img class="aligncenter size-full wp-image-120" title="Image 5" src="http://blog.martian-arts.org/wp-content/uploads/2009/06/Image-5.png" alt="Image 5" width="440" height="117" /></p>
<p style="text-align: left;">Bon bah voila c&#8217;était pas si dur <img src='http://blog.martian-arts.org/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p style="text-align: left;">Maintenant, j&#8217;attaque la partie socket, celle qui (au final) m&#8217;a pris le plus de temps car je n&#8217;avais que de très vagues notions de socket, protocole, handshake et autres bidules du réseau. Jusqu&#8217;a ce moment, en gros y avait des ips, et ports et des requètes, le tout très flou (<a href="http://ptitshou.free.fr/blog/?p=103">et maintenant je vois</a> !) :</p>
<p>Voici <a href="http://blog.martian-arts.org/wp-content/uploads/2009/06/server.py">le script</a> en question. Gardons bien en tête que python est un langage interprété, et ca devrait rouler tout seul. Le script fait les imports nécéssaires en premier, puis définit la classe CustomReceiver qui nous sert ici de protocole (si j&#8217;ai rien perdu en route). C&#8217;est cette classe qui va permettre de manager les connexions, entrantes, sortantes et les déconnexions. Le script continue en définissant une classe XMLSocket qui sera en charge de monter le protocole sur le serveur. Une fonction globale Main() est proprement définie, puis appelée. Alors pour info, reactor c&#8217;est la grosse engine qui fait tourner le serveur et listenTCP() permet de brancher un protocole sur un port précis de la machine, tandis que run() le mets en route. Comme quoi, c&#8217;est super simple.</p>
<p>L&#8217;envoi de donnée se fait (a priori) toujours sur la requète d&#8217;un client, et donc a cet effet, une méthode &#8220;lineReceived&#8221; est prévue dans le protocole ayant pour argument &#8220;line&#8221;. J&#8217;ai mis ici l&#8217;envoi du crossdomain histoire de dire que j&#8217;envoie quelquechose de plus intelligent que helloworld, parce qu&#8217;au final ca me sert pas tant que ca.</p>
<p>Là où ça s&#8217;est corsé pour moi, c&#8217;est que je voulais envoyer en boucle les infos de la balise. Comme il n&#8217;existe pas d&#8217;enterFrame en Python, un bon vieux while true fera l&#8217;affaire. Bah non en fait, ou sinon super difficilement. Sans trop rentrer dans les détails, le reactor.run() EST un while True (avec une majuscule <a href="http://www.forum-auto.com/uploads/200408/oufwid_1092312693_capello_small.jpg">siouplait</a>) et donc si j&#8217;avais voulu insérer du code dedans, j&#8217;aurai du taper dedans OU créér un nouveau thread avec <span style="text-decoration: line-through;">la lib</span> le module éponyme. Les gens de #twisted@irc.freenode.net sont un peu moins chaleureux que ceux de #python-fr, et après avoir demandé dans le vent, un gentil bonhomme de #python-fr m&#8217;a finalement dirigé vers LoopingCall qui est ni plus ni moins qu&#8217;un objet référencé dans le reactor et qui est appelé à intervalles régulières (aka Timer mais pas vraiment). J&#8217;ai donc placé mon bout de pyserial dans le protocole (bien qu&#8217;il aurait été plus propre de le mettre en dehors) et défini une méthode &#8220;tick&#8221; qui a pour but d&#8217;envoyer le paquet de données lues par pyserial a intervalle régulière (1/30, car 30fps dans mon swf).</p>
<p>Etape 3 (la dernière) : Exploiter les données dans Flash. C&#8217;est assez banal finalement, et il n&#8217;y a pas besoin d&#8217;énormément d&#8217;explication. Si vous n&#8217;êtes pas familiers de Googlemaps API, je vous renvoie sur la <a href="http://code.google.com/intl/fr/apis/maps/documentation/flash/basics.html">page dédiée au projet</a> qui expliquera 100 fois mieux que moi les basics ; je me sers toujours de ma <a href="http://blog.martian-arts.org/wp-content/uploads/2009/06/GoogleMap.as">classe perso</a>, super basique mais fonctionnelle (J&#8217;ai retiré la clé). J&#8217;avais mis le source en dur dans la page mais vu l&#8217;indentation ca servait a rien. En revanche, le mxml est <a href="http://blog.martian-arts.org/wp-content/uploads/2009/06/GPS.mxml">dispo</a> <img src='http://blog.martian-arts.org/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Le flash appelle en premier la fonction launch() qui instancie la GoogleMap et qui la place dans le container &#8220;canvas&#8221; prévu pour ca. J&#8217;ai ajouté une petite console et un bouton pour gérer la connexion. Quand on clicque sur le bouton connect, on instancie un nouveau socket XML, et on lui fait écouter le bon port (sinon <a href="http://pierrotlezygo.m6blog.fr/images/medium_suicid2.jpg">ca marche pas</a>) ; il réponds (ou pas) et ajoute un écouteur d&#8217;évènement sur la réception de donnée. Je ne me suis pas trop cassé la tête pour la partie de traitement (parce qu&#8217;au final tout ça sert à rien) et je me suis contenter d&#8217;éclater la chaîne de donnée en tableau, et de rechercher ces 2 messages bien particuliers : GPGSA qui renseigne notamment un entier égal à 1, 2, ou 3 permettant de définir le fix de la balise (none, 2D, 3D), et <a href="http://www.rmc.fr/">GPRMC </a>qui peut éventuellement être considéré comme un résumé de localisation (mais il sert pas trop à ça en vrai).</p>
<p>Le petit point tricky, pour finir, c&#8217;est la conversion entre le format délivré par la balise et les valeurs entrantes pour la GoogleMap : La balise donne des infos au format DDMM.mmmm (avec D comme degré, et M comme minutes à virgule) alors que les objets LatLng nécéssitent des décimaux.</p>
<p>La petite formule, c&#8217;est DD + MM.mmmm / 60 et c&#8217;est tout. Sur ma balise, ou peut être est ce lié à ma localisation, la longitude avait un 0 supplémentaire devant les degré (ce qui explique le 3 dans les substr()).</p>
<p>Et donc, est ce que ca marche ?</p>
<p><a href="http://blog.martian-arts.org/wp-content/uploads/2009/06/Image-1.png"><img class="aligncenter size-full wp-image-132" title="Image 1" src="http://blog.martian-arts.org/wp-content/uploads/2009/06/Image-1.png" alt="Image 1" width="517" height="413" /></a></p>
<p><img src="http://tinyurl.com/n6ym8a" class="aligncenter" /></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.martian-arts.org/gps-python-flex-as3-et-googlemaps-ou-lart-doccuper-ses-soirees/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Flashboard v1 released</title>
		<link>http://blog.martian-arts.org/flashboard-v1-released/</link>
		<comments>http://blog.martian-arts.org/flashboard-v1-released/#comments</comments>
		<pubDate>Mon, 08 Jun 2009 12:26:51 +0000</pubDate>
		<dc:creator>y_nk</dc:creator>
				<category><![CDATA[AS3]]></category>

		<guid isPermaLink="false">http://blog.martian-arts.org/?p=106</guid>
		<description><![CDATA[En fait j&#8217;avais prévu de release une distribution stable dans laquelle chacun pourrait s&#8217;y retrouver, simple d&#8217;utilisation et tout et tout ; le fait est que &#8211; comme de par hasard &#8211; une montagne de taf s&#8217;abat sur moi déchainant haine et ennui.
Ceci étant dit, et pour ne pas vous tenir en haleine plus longtemps [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: left;">En fait j&#8217;avais prévu de release une distribution stable dans laquelle chacun pourrait s&#8217;y retrouver, simple d&#8217;utilisation et tout et tout ; le fait est que &#8211; comme de par hasard &#8211; une montagne de taf s&#8217;abat sur moi déchainant haine et ennui.</p>
<p style="text-align: left;">Ceci étant dit, et pour ne pas vous tenir en haleine plus longtemps ( <img src='http://blog.martian-arts.org/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' />  ), j&#8217;ai installé sur mon petit domaine 2 flashboards distinctes, dont une publique <img src='http://blog.martian-arts.org/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> </p>
<p><span id="more-106"></span></p>
<p style="text-align: left;">Voici donc la petite url qui va bien :</p>
<p style="text-align: left;"><strong><a href="http://flashboard.martian-arts.org/">http://flashboard.martian-arts.org/</a> </strong>(<em>la deuxième étant : http://whois.martian-arts.org/</em>)<strong><br />
</strong></p>
<p style="text-align: left;">Pour l&#8217;instant la board est encore assez vide (la faute a qui ?) mais je compte bien y ajouter quelques vidéos tutorial sur les manipulations possibles.</p>
<p style="text-align: left;">
<p style="text-align: left;"><strong>Voici quand même un léger mode d&#8217;emploi pour pas vous lâcher dans la nature :</strong></p>
<ul>
<li>On se logge en cliquant sur le cadenas en haut a droite. <strong>Les logins/pass sont &#8220;public&#8221; et &#8220;public&#8221;</strong> <img src='http://blog.martian-arts.org/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> </li>
<li>Quand on est loggé, on peut <em>doublecliquer</em> sur le fond pour faire apparaitre le menu de création, sur la gauche. Les 3 premiers menus sont alloués a la <em>création</em>, tandis que les 3 derniers sont des boites de <em>stylisation</em>.</li>
<li>Pour créér un objet (et ce quelquesoit l&#8217;objet), faites a peu pres les mêmes interactions que ce que vous attenderiez d&#8217;illustrator. Les processus de créations sont a peu de chose près identiques.</li>
<li>Pour <strong>placer</strong> un objet, c&#8217;est assez simple : <strong>Drag&#8217;n'drop</strong>. Besoin de le <strong>tourner</strong> ou de le grossir ? Ajoutez <strong>Shift</strong> a votre <strong>drag&#8217;n'drop</strong> <img src='http://blog.martian-arts.org/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' />  !</li>
<li>Il y a très peu ou pas d&#8217;indications sur la sélection. C&#8217;est a vous de savoir ce que vous avez sélectionné ; <strong>comment on sélectionne ? en cliquant sur un objet, tout simplement</strong>.</li>
<li>Parlons clavier : par choix, les raccourcis se font avec la touche shift. <strong>Shift B pour passer en arriere plan, Shift G pour dégrouper, Shift L pour bloquer un objet, Shift S pour sauvegarder,</strong> <strong>backspace pour supprimer</strong>.</li>
<li>Pour grouper, le mouvement est un peu trivial au début &#8211; surtout dans l&#8217;explication en fait &#8211; et on s&#8217;y fait vite ; pour beaucoup, il est déjà acquis mais ne corresponds a aucune interaction connue dans le monde de l&#8217;informatique. Faites un doubleclic, et étirer un cadre de sélection lors du second clic.</li>
<li>Pour le reste, il vous faudra revêtir le chapeau d&#8217;indiana jones <img src='http://blog.martian-arts.org/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://blog.martian-arts.org/flashboard-v1-released/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
