<?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</title>
	
	<link>http://www.lafabrick.com/blog</link>
	<description>Laboratoire d'interfaces riches (Flex, Flash, Air ...)</description>
	<lastBuildDate>Mon, 28 Nov 2011 22:02:08 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.1.4</generator>
		<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>Barcamp Lyon : Mix-IT, Flex, Java, PHP, JS, Cloud… (et chips)</title>
		<link>http://feedproxy.google.com/~r/lafabrick/~3/L9O6dLixoDo/</link>
		<comments>http://www.lafabrick.com/blog/2011/07/08/2621-barcamp-lyon-mix-it-flex-java-php-js-cloud-et-chips/#comments</comments>
		<pubDate>Fri, 08 Jul 2011 12:01:34 +0000</pubDate>
		<dc:creator>Hervé</dc:creator>
				<category><![CDATA[Bientôt chez vous]]></category>
		<category><![CDATA[[Dev] Flash / Flex / AIR...]]></category>

		<guid isPermaLink="false">http://www.lafabrick.com/blog/?p=2621</guid>
		<description><![CDATA[Source Ayant eu l&#8217;honneur et l&#8217;avantage de participer au BarCamp Summer Lyon, je vous propose un petit retour d&#8217;expérience sur cette excellente initiative d&#8217;un ensemble d&#8217;assoc&#8217; actives de la région lyonnaise : Mix-IT LyonRB Club Agile Rhône-Alpes de Lyon Flex/Flasheurs MUG Lyon Lyon Java User Group Développeurs PHP de Lyon L&#8217;objectif : donner l&#8217;opportunité à [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: center;"><img class="aligncenter" title="BarCamp Geek" src="http://itmanagement.earthweb.com/img/2010/03/another-geek-bar.jpg" alt="" width="400" height="279" /><a href="http://itmanagement.earthweb.com/cnews/article.php/3873081/Tech-Comics-Another-Geek-in-a-Bar.htm"></a></p>
<p style="text-align: center;"><a href="http://itmanagement.earthweb.com/cnews/article.php/3873081/Tech-Comics-Another-Geek-in-a-Bar.htm">Source</a></p>
<p>Ayant eu l&#8217;honneur et l&#8217;avantage de participer au BarCamp Summer Lyon, je vous propose un petit retour d&#8217;expérience sur cette excellente initiative d&#8217;un ensemble d&#8217;assoc&#8217; actives de la région lyonnaise :</p>
<ul>
<li><a href="http://www.mix-it.fr/">Mix-IT</a></li>
<li><a href="http://lyonrb.fr/">LyonRB </a></li>
<li><a href="http://www.flex-tutorial.fr/2011/05/25/flex-user-group-lyon-rendez-vous-le-mardi-7-juin-avec-lafabrick-concours/"></a><a href="http://lyon.clubagilerhonealpes.org/">Club Agile Rhône-Alpes de Lyon</a></li>
<li><a href="http://lyon.clubagilerhonealpes.org/"></a><a href="http://www.flex-tutorial.fr/2011/05/25/flex-user-group-lyon-rendez-vous-le-mardi-7-juin-avec-lafabrick-concours/">Flex/Flasheurs</a></li>
<li><a href="http://lyon.clubagilerhonealpes.org/"></a><a href="http://twitter.com/#!/muglyon">MUG Lyon</a></li>
<li><a href="http://twitter.com/#!/muglyon"></a><a href="http://www.lyonjug.org/">Lyon Java User Group</a></li>
<li>Développeurs PHP de Lyon</li>
</ul>
<p><strong>L&#8217;objectif</strong> : donner l&#8217;opportunité à chacun de présenter un sujet qu&#8217;il connaît ou sur lequel il souhaite échanger librement. Les choix de sujets étaient proposés sur une base de volontariat, les sujets retenus votés à la gommette comme au bon vieux temps (comme on aime quoi).</p>
<p>Le public était quasi-exclusivement technique (à l&#8217;évidence), issus de SSII / éditeurs, et composé d&#8217;architectes, développeurs web, coach agile, chefs de projets, entrepreneurs&#8230;</p>
<p>En résumé, un bon rythme, des sujets &laquo;&nbsp;en vogue&nbsp;&raquo; avec échanges constructifs sur les intérêts / risques de chaque techno ou méthodo.</p>
<p><span id="more-2621"></span>Voici un rapide retour sur les thématiques auxquelles j&#8217;ai assisté, pour alimenter la discussion et inviter à poursuivre cette initiative !</p>
<h2>DevOps</h2>
<p><!-- p.p1 {margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Arial} p.p2 {margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Arial; min-height: 14.0px} li.li1 {margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Arial} ul.ul1 {list-style-type: disc} ul.ul2 {list-style-type: circle} -->En tant que newbie du sujet, j&#8217;ai cerné DevOps comme consistant en un <strong>ensemble de pratiques et principes d&#8217;échanges pour une meilleure communication entre équipes</strong> infra / support et équipes de développement. Ces principes se déclinant en :</p>
<ul>
<li>organisation projet,</li>
<li>modes de communication,</li>
<li>outils.</li>
</ul>
<p>Une forte composante de cette méthodologie réside dans les deux premiers points : comment <strong>briser les barrières entre équipes de support, administrateurs système et équipes de développement</strong>. Cette cassure visant à impliquer chacun dans le process projet et fluidifier les échanges.</p>
<p>Pour cela, la méthodologie intègre fortement les principes de l&#8217;agilité, suggère une fréquence élevée de livraisons etc. &#8230; Pour plus d&#8217;infos, je vous invite à <a title="DevOps" href="http://en.wikipedia.org/wiki/DevOps">consulter l&#8217;article DevOps sur Wikipedia (anglais)</a>.</p>
<p>Niveau outils, nous avons échangé sur les systèmes d&#8217;intégration continue et de déploiement automatisé (installation et configuration de machine en un clic).</p>
<p>Un retour a été donné sur les outils suivants :</p>
<ul>
<li><a href="http://www.puppetlabs.com/">Puppet</a> (Ruby) : assez simple à prendre en main, grosse communauté</li>
<li><a href="http://cfengine.com/">CFengine</a> : performant mais peu de retours d&#8217;expérience et pas d&#8217;interface graphique</li>
<li><a href="http://wiki.opscode.com/display/chef/Home">chef</a> (beaucoup plus complexe)</li>
</ul>
<p>Une limite signalée à propos de ces outils touche principalement les entreprises &laquo;&nbsp;désossant&nbsp;&raquo; les paquets standards selon leur propre norme, ne laissant donc on ne peut plus utiliser les paquets standards. C&#8217;est toujours bon à savoir <img src='http://www.lafabrick.com/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Les avantages sont en revanche multiples :</p>
<ul>
<li>Le versionnement d&#8217;un script puppet rend extrêmement simple toute <strong>procédure de retour arrière</strong> (rollback) sur le serveur.</li>
<li>La <strong>montée en volume d&#8217;un parc de machines</strong> hébergées en interne devient un jeu d&#8217;enfant</li>
<li>On peut aller jusqu&#8217;à envisager les backups (machine, données, sources)</li>
</ul>
<p>L&#8217;administrateur déporte donc son travail sur l&#8217;outil puppet plus que sur le serveur lui-même, <strong>transformant son métier plutôt que l&#8217;annihilant</strong> (et au passage le rendant plus intéressant ? On aime bien ne faire les choses qu&#8217;une fois en général <img src='http://www.lafabrick.com/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> ).</p>
<p>D&#8217;un point de vue humain, un principe intéressant consiste à intégrer les équipes de support et d&#8217;administration <strong>le plus tôt possible dans les phases de conception</strong> d&#8217;un projet pour intégrer au mieux leur contraintes, et simplifier les échanges ultérieurs. En résumé, comprendre les problèmes des autres permet souvent d&#8217;y apporter une solution simple à laquelle on n&#8217;aurait jamais pensé. Ca paraît évident à dire, moins à faire !</p>
<p>Nous avons enfin échangé sur des problématiques comme :</p>
<ul>
<li>Combien ça coûte ? Quelques tuyaux résident dans le chiffrage :
<ul>
<li><strong>A priori</strong> : estimer le gain sur la maintenance (très difficile)</li>
<li><strong>A posteriori</strong> : estimer le gain en comparaison avec un autre projet (techniquement plus simple, mais souvent négligé voire oublié selon la coutume &laquo;&nbsp;ce qui est fait est fait&nbsp;&raquo;)</li>
</ul>
</li>
<li>Décloisonner demande un état d&#8217;esprit ouvert : lorsque les tensions sont déjà fortes, il y a fort à parier que la mayonnaise ne prenne pas</li>
</ul>
<p>Et vous, êtes-vous DevOps ?</p>
<h2>TDD / BDD</h2>
<p style="text-align: center;"><img class="aligncenter" title="Une représentation donnée par Microsoft" src="http://i.msdn.microsoft.com/gg490346.Satrom_Figure2_hires(en-us,MSDN.10).jpg" alt="" width="400" height="176" /><br />
<a href="http://msdn.microsoft.com/en-us/magazine/gg490346.aspx">Source</a></p>
<p>Sans revenir trop longtemps sur le Test Driven Development et sa clique (JUnit, DBUnit, NUnit, FlexUnit, PHPUnit&#8230;), nous avons abordé un nouvel acronyme pour moi : BDD (<strong>B</strong>ehavior <strong>D</strong>riven <strong>D</strong>evelopment), dont le principe est bien mieux expliqué <a href="http://fr.wikipedia.org/wiki/Behavior_Driven_Development">sur Wikipedia</a> que je ne saurais le faire.</p>
<p>Le retour d&#8217;expérience a été donné principalement sur <a href="http://jbehave.org/">JBehave</a> qui propose de rédiger des <strong>exigences sous forme de fichiers au format texte</strong> comprenant trois mot-clés principaux : GIVEN (définir une situation) WHEN (définir un événement déclencheur) THEN (définir le résultat attendu). Les phrases pouvant être rédigées comme vous le souhaitez.</p>
<p>L&#8217;idée diabolique est donc d&#8217;<strong>obtenir ce fichier d&#8217;un interlocuteur fonctionnel,</strong> que vous pouvez utiliser sans transformation pour développer des routines correspondant à chaque exigence et ainsi valider que votre programme y répond.</p>
<p>Même si (à mon humble avis) cette méthodologie demande un interlocuteur métier motivé – pour ne pas dire un &laquo;&nbsp;consultant AMOA ultra au point&nbsp;&raquo; – et certainement d&#8217;éliminer quelques freins, le principe d&#8217;<strong>alléger vos spécifications</strong> et de retrouver (par un heureux effet de bord) vos exigences dans votre code source est clairement intéressant. Je m&#8217;interroge également sur le glissement vers &laquo;&nbsp;l&#8217;algorithmie masquée&nbsp;&raquo; que peuvent représenter les fameux fichiers textes&#8230; Vaste programme.</p>
<p>Amis flexeurs, quelques early-adopters ont déjà <a href="http://gravityblast.com/2009/08/20/flex-functional-testing-with-funfx-and-cucumber/">expérimenté le principe</a> basé sur <a href="http://cukes.info/">Cucumber</a> (Ruby). Si ça vous dit&#8230; En attendant, si vous faites du FlexMock, FlexMonkey et FlexUnit, c&#8217;est déjà pas mal !</p>
<p>Un petit regret, la difficulté d&#8217;aborder la question du &laquo;&nbsp;où s&#8217;arrêter&nbsp;&raquo; en fonction du projet mené : est-ce toujours rentable d&#8217;avoir une couverture de tests à 100% si votre projet a une durée de vie limitée&#8230; Même si cette question est particulièrement sujette à l&#8217;appréciation de chacun sans réellement connaître de règle.</p>
<h2>Des spaghettis, des marshmallows</h2>
<p style="text-align: center;"><img title="Des marshmallows" src="http://www.igglesblog.com/.a/6a00d8341c248053ef0133f4711ec9970b-800wi" alt="" width="250" height="250" /><br />
<a href="http://www.igglesblog.com/iggles_blog/2010/09/andy-reid-eats-the-michael-vick-marshmallow.html"> </a></p>
<p style="text-align: center;"><a href="http://www.igglesblog.com/iggles_blog/2010/09/andy-reid-eats-the-michael-vick-marshmallow.html">Source</a></p>
<p>Le dernier atelier reprenait le concept du <a href="http://marshmallowchallenge.com/">marshmallow challenge</a>.</p>
<p><strong>Le principe :</strong> 18 minutes pour construire la plus haute tour de spaghettis surmontée d&#8217;un marshmallow avec comme accessoires du scotch et un fil de couture.<br />
<strong>L&#8217;objectif :</strong> souligner la façon dont nous travaillons en équipe, dont nous fonctionnons face à un problème&#8230; Les résultats sont intéressants, je vous invite à tenter le coup si vous en avez l&#8217;occasion.</p>
<p>Je n&#8217;ai pas la photo de notre oeuvre éphémère&#8230; Mais ne regrettez rien <img src='http://www.lafabrick.com/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Merci à tous les organisateurs donc, à quand le prochain <img src='http://www.lafabrick.com/blog/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' />  ?Autres articles sur le même sujet
<ul>
<li><a href="http://www.lafabrick.com/blog/2006/10/22/6-youtube-transforming-a-2d-image-into-3d/" rel="bookmark" title="22 octobre 2006">Le 8ème jour ils créerent le Volume</a></li>
<li><a href="http://www.lafabrick.com/blog/2007/10/01/244-vous-avez-dis-flex3-beta2/" rel="bookmark" title="1 octobre 2007">Vous avez dis Flex3 Beta2 ?</a></li>
<li><a href="http://www.lafabrick.com/blog/2008/03/03/313-l-universit-lyon1-cherche-aussi-2-stagiaires/" rel="bookmark" title="3 mars 2008">L&#8217;université Lyon1 cherche (aussi) 2 stagiaires</a></li>
<li><a href="http://www.lafabrick.com/blog/2011/02/26/2429-orm-hibernate-et-contrarietes/" rel="bookmark" title="26 février 2011">ORM, Hibernate et contrariétés&#8230;</a></li>
</ul>
<p><!-- Similar Posts took 12.404 ms --></p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/lafabrick?a=L9O6dLixoDo:FU7tORkC-A8:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/lafabrick?i=L9O6dLixoDo:FU7tORkC-A8:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/lafabrick?a=L9O6dLixoDo:FU7tORkC-A8:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/lafabrick?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/lafabrick?a=L9O6dLixoDo:FU7tORkC-A8:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/lafabrick?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/lafabrick?a=L9O6dLixoDo:FU7tORkC-A8:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/lafabrick?d=qj6IDK7rITs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/lafabrick?a=L9O6dLixoDo:FU7tORkC-A8:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/lafabrick?i=L9O6dLixoDo:FU7tORkC-A8:F7zBnMyn0Lo" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/lafabrick/~4/L9O6dLixoDo" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.lafabrick.com/blog/2011/07/08/2621-barcamp-lyon-mix-it-flex-java-php-js-cloud-et-chips/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		<feedburner:origLink>http://www.lafabrick.com/blog/2011/07/08/2621-barcamp-lyon-mix-it-flex-java-php-js-cloud-et-chips/</feedburner:origLink></item>
		<item>
		<title>Fireworks + Javascript = Spark Skin Pleasure !</title>
		<link>http://feedproxy.google.com/~r/lafabrick/~3/xtI8lV6yU_w/</link>
		<comments>http://www.lafabrick.com/blog/2011/06/23/2598-fireworks-javascript-spark-skin-pleasure/#comments</comments>
		<pubDate>Thu, 23 Jun 2011 15:02:15 +0000</pubDate>
		<dc:creator>Erick</dc:creator>
				<category><![CDATA[Expériences utilisateur]]></category>
		<category><![CDATA[Logiciels / extensions / plugins...]]></category>
		<category><![CDATA[Nos projets]]></category>
		<category><![CDATA[[Dev] Flash / Flex / AIR...]]></category>

		<guid isPermaLink="false">http://www.lafabrick.com/blog/?p=2598</guid>
		<description><![CDATA[J&#8217;pensais pas faire ça aujourd&#8217;hui&#8230;, mais bon&#8230; moultes skins Spark à tomber : j&#8217;ai décidé de me helper myself et de gagner de l&#8217;argent ( enfin du temps pour commencer ). Du coup est née la petite commande Fireworks copyMXMLSelectionToClipboard, qui comme son nom l&#8217;indique presque, permet de copier une sélection dans Fireworks directement en [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://www.lafabrick.com/blog/images/_erick/fw2mxml_cmd-1-20110623-170349.png"  alt="Copier le MXML / FXG dans le ClipBoard" /></p>
<p>J&#8217;pensais pas faire ça aujourd&#8217;hui&#8230;, mais bon&#8230; moultes skins Spark à tomber : j&#8217;ai décidé de me helper myself et de gagner de l&#8217;argent ( enfin du temps pour commencer ). Du coup est née la petite commande Fireworks <em>copyMXMLSelectionToClipboard</em>, qui comme son nom l&#8217;indique presque, permet de copier une sélection dans Fireworks directement en MXML dans le ClipBoard. Elle est pas belle la vie ?!</p>
<p><span id="more-2598"></span></p>
<p>En gros :<br />
1. tu dessines tes trucs dans Fireworks, tu fais tes jolies dégradés, tes reflets, tes subtils petits floutés&#8230;<br />
2. tu sélectionnes ce que tu veux mettre dans ta skin<br />
3. tu lances la commande &#8216;UIGFx/SelectionToMXMLClipboard&nbsp;&raquo;<br />
4. t&#8217;ouvres ta skinClass et pi t&#8217;y colle </p>
<p><img src="http://www.lafabrick.com/blog/images/_erick/fw2mxml_generatedcode-20110623-165951.png"  alt="Copier le MXML / FXG généré" /></p>
<p>5. et pi&#8230; tu souris !</p>
<p>Cette 1ère version permet d&#8217;exporter les Rect, les Path et des Groups ( de Rect et de Paths ! ),<br />
avec leur SolidColor / SolidColorStroke,  LinearGradient ou RadialGradient,<br />
et même quelques filtres : Blur / DropShadow / InnerShadow.</p>
<p>Les positions sont recalculées avec un sélection placée à l&#8217;origine xy.</p>
<p><a href="http://www.lafabrick.com/labz/uigfx/xtensions/mxmlclip.zip">Télécharger l&#8217;extension Fireworks (CS3 + )</a></p>
<p>Et c&#8217;est déjà çà de fait ! </p>
<p>Edit : et je rappelle qu&#8217;on peut mapper des raccourcis pour n&#8217;importe quel élément de menu&#8230; #jdcjdrAutres articles sur le même sujet
<ul>
<li><a href="http://www.lafabrick.com/blog/2007/11/07/238-digimix-un-air-de-musique/" rel="bookmark" title="7 novembre 2007">Digimix : un Air de musique&#8230;</a></li>
<li><a href="http://www.lafabrick.com/blog/2008/05/10/323-tuto-vido-skiner-un-composant-flex-3-avec-fireworks-cs3/" rel="bookmark" title="10 mai 2008">Skiner un composant Flex 3 avec Fireworks CS3 [Tutoriel Vidéo]</a></li>
<li><a href="http://www.lafabrick.com/blog/2009/12/04/1453-flex4-skin-et-primitives/" rel="bookmark" title="4 décembre 2009">Flex4 : skin et primitives</a></li>
<li><a href="http://www.lafabrick.com/blog/2010/02/09/1964-uigfx-project-flex4-primitives-library-fireworks-extension/" rel="bookmark" title="9 février 2010">uigfx project : Flex4 primitives library / Fireworks extension</a></li>
</ul>
<p><!-- Similar Posts took 12.547 ms --></p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/lafabrick?a=xtI8lV6yU_w:hLFWyf5YvOI:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/lafabrick?i=xtI8lV6yU_w:hLFWyf5YvOI:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/lafabrick?a=xtI8lV6yU_w:hLFWyf5YvOI:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/lafabrick?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/lafabrick?a=xtI8lV6yU_w:hLFWyf5YvOI:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/lafabrick?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/lafabrick?a=xtI8lV6yU_w:hLFWyf5YvOI:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/lafabrick?d=qj6IDK7rITs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/lafabrick?a=xtI8lV6yU_w:hLFWyf5YvOI:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/lafabrick?i=xtI8lV6yU_w:hLFWyf5YvOI:F7zBnMyn0Lo" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/lafabrick/~4/xtI8lV6yU_w" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.lafabrick.com/blog/2011/06/23/2598-fireworks-javascript-spark-skin-pleasure/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.lafabrick.com/blog/2011/06/23/2598-fireworks-javascript-spark-skin-pleasure/</feedburner:origLink></item>
		<item>
		<title>Make me Fluid</title>
		<link>http://feedproxy.google.com/~r/lafabrick/~3/VlZ5yy7ShF4/</link>
		<comments>http://www.lafabrick.com/blog/2011/05/27/2576-make-me-fluid-2/#comments</comments>
		<pubDate>Fri, 27 May 2011 08:36:48 +0000</pubDate>
		<dc:creator>Fabien</dc:creator>
				<category><![CDATA[Expériences utilisateur]]></category>
		<category><![CDATA[La Fabrick]]></category>
		<category><![CDATA[Non classé]]></category>
		<category><![CDATA[Nos projets]]></category>
		<category><![CDATA[Pure Style]]></category>
		<category><![CDATA[[Dev] Flash / Flex / AIR...]]></category>

		<guid isPermaLink="false">http://www.lafabrick.com/blog/?p=2576</guid>
		<description><![CDATA[Vous vous souvenez peut-être de l’ancien site web de Paul Neave ? Autour de 2004 il me semble. Une perle du Web 1.0 ou les bordures du site ce tordaient au moindre passage de la souris. C’est un de ces sites qui, à l’époque, me faisait dire que Flash c’était cool. Il y a quelques [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: center;"></a><a href="http://www.lafabrick.com/blog/wp-content/uploads/2011/05/TheFluidGuy.png"><img class="aligncenter size-full wp-image-2651" title="TheFluidGuy" src="http://www.lafabrick.com/blog/wp-content/uploads/2011/05/TheFluidGuy.png" alt="" width="303" height="272" /><br />
Vous vous souvenez peut-être de<a href="http://web.archive.org/web/20050204015952/http://www.neave.com/games/"> l’ancien site web</a> de <a href="http://twitter.com/#!/neave">Paul Neave</a> ? Autour de 2004 il me semble. Une perle du Web 1.0 ou les bordures du site ce tordaient au moindre passage de la souris. C’est un de ces sites qui, à l’époque, me faisait dire que Flash c’était cool.</p>
<p>Il y a quelques temps, suivant les travaux de <a href="http://philippe.elsass.me/">Philippe Elsass</a> (<a href="http://twitter.com/#!/elsassph">@elsassph</a>) sur les algos de dessin, j’ai entrepris de nouveaux travaux sur le sujet. Dans une librairie de primitives pour Flex4 d’abord, avec <a href="http://code.google.com/p/uigfx/">UIGFX</a>, et puis rapidement pour rendre plus&#8230; &laquo;&nbsp;fluides&nbsp;&raquo; mes skins d’application, façon Neave.<br />
<span id="more-2576"></span></p>
<p><strong>Attention : parcequ&#8217;il y a de nombreux exemples, et parceque ce billet est un voyage dans le monde merveilleux de la gelée; votre ordinateur peu subir quelques changements et râler un peu</strong></p>
<p>Ceux qui <a href="http://twitter.com/#!/fabienbizot">me suivent sur  Twitter</a> auront peut-être vu passer quelques essais.</p>
<table width="100%">
<tbody>
<tr>
<td width="50%"><a href="http://www.lafabrick.com/labz/skins/jellySound/"><img class="aligncenter size-full wp-image-2558" title="jellySound" src="http://www.lafabrick.com/blog/wp-content/uploads/2011/05/jellySound.png" alt="" width="280" height="200" /></a></td>
<td width="50%"><a href="http://www.lafabrick.com/labz/skins/jellySkin/"><img class="aligncenter size-full wp-image-2557" title="jellySkin" src="http://www.lafabrick.com/blog/wp-content/uploads/2011/05/jellySkin.png" alt="" width="280" height="200" /></a></td>
</tr>
</tbody>
</table>
<p><em>(Clic pour ouvrir)</em><br />
Ces tests de skinning flex interactif proviennent d’une extension Fluide de la librairie UIGFX (extension que je n’ai pas encore diffusé, faute de temps&#8230;)</p>
<p>BIGA! <a href="http://en.nicoptere.net/">Nicolas Barradeau</a> (<a href="http://twitter.com/#!/nicoptere">@nicoptere</a>) nous lance une série d’articles impressionnante sur l’art génératif, qui ce termine par une lib d’outils géométrique : <a href="http://code.google.com/p/biga/">Biga</a>. J’ai pas pu me retenir, et repris mes expérimentations.</p>
<h2>Des points&#8230;</h2>
<p>L’idée de l&#8217;interaction «fluide» est basé sur les algo de répulsion. Lorsque qu’un point de souris approche d’une zone d&#8217;interaction de point de vecteur, il faut calculer une «dispersion» du point.</p>
<p>J’utilise 2 facteurs distincts :</p>
<ul>
<li><strong>La viscosité</strong>: un coefficient qui donne, comme son nom l’indique, la viscosité du point. En physique des fluides, la viscosité représente la capacité d’un liquide à s’écouler. Plus le coefficient est faible, plus l’écoulement du fluide est rapide (ex: l’eau). A l’inverse, plus le coefficient est élevé, plus le fluide à des contraintes physiques importantes qui réduisent sont écoulement (ex.: la confiture).</li>
<li><strong>le facteur de gelée</strong>: c’est mon coefficient «maison». Un indicateur qui permet de préciser le degré de déformation d’un fluide. Plus ce facteur est élevé, plus le taux de déformation, et donc le mouvement de la forme, sera important.</li>
</ul>
<p>En AS3, on peut l’écrire comme ceci :</p>
<pre class="brush: js">
public function update(owner:DisplayObject):void
{
offsetx+=(xref - x) / jelly;
offsety+=(yref - y) / jelly;

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

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

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

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

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

x+=offsetx;
y+=offsety;
}
</pre>
<p>Visuellement :<br />

    <object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" id="swfobj_0" width="650" height="300" align="center">
      <param name="movie" value="http://fabien.lafabrick.com/labs/fluid/FluidSpritePointTest.swf" />
      <param name="align" value="center" />
      <!--[if !IE]>-->
      <object type="application/x-shockwave-flash" data="http://fabien.lafabrick.com/labs/fluid/FluidSpritePointTest.swf" width="650" height="300" align="center">
      <!--<![endif]-->
        
      <!--[if !IE]>-->
      </object>
      <!--<![endif]-->
    </object>
</p>
<h2>&#8230;Des lignes&#8230;</h2>
<p>2 points définissent une ligne&#8230; C&#8217;est la règle.<br />

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

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

return new Point(px, py);
}
</pre>
<p>Avec les outis géométriques proposés par @nicoptere dans la lib Biga, le point de projection contraint dans la ligne, peut se calculer comme suit :</p>
<pre class="brush: js">
var mousePoint : Point = new Point(mouseX, mouseY);
var projection : Point = GeomUtils.project(mousePoint, point1, point2);
var constraintProjection : Point = GeomUtils.constrain( projection, point, point2);
</pre>
<p>La projection du point de souris sur notre ligne molle nous permet d’obtenir une interaction intéressante :<br />

    <object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" id="swfobj_2" width="650" height="300" align="center">
      <param name="movie" value="http://fabien.lafabrick.com/labs/fluid/FluidLineTest.swf" />
      <param name="align" value="center" />
      <!--[if !IE]>-->
      <object type="application/x-shockwave-flash" data="http://fabien.lafabrick.com/labs/fluid/FluidLineTest.swf" width="650" height="300" align="center">
      <!--<![endif]-->
        
      <!--[if !IE]>-->
      </object>
      <!--<![endif]-->
    </object>
<br />
Si les points d’origine sont fixes, vous obtenez une espèce de corde de guitare. Rigolo.<br />

    <object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" id="swfobj_3" width="650" height="400" align="center">
      <param name="movie" value="http://fabien.lafabrick.com/labs/fluid/FluidRopeTest.swf" />
      <param name="align" value="center" />
      <!--[if !IE]>-->
      <object type="application/x-shockwave-flash" data="http://fabien.lafabrick.com/labs/fluid/FluidRopeTest.swf" width="650" height="400" align="center">
      <!--<![endif]-->
        
      <!--[if !IE]>-->
      </object>
      <!--<![endif]-->
    </object>
</p>
<h2>&#8230;Et des formes</h2>
<p>Avec encore plus de points on commence a avoir des formes, façon gateau anglais :<br />

    <object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" id="swfobj_4" width="650" height="400" align="center">
      <param name="movie" value="http://fabien.lafabrick.com/labs/fluid/FluidRectTest.swf" />
      <param name="align" value="center" />
      <!--[if !IE]>-->
      <object type="application/x-shockwave-flash" data="http://fabien.lafabrick.com/labs/fluid/FluidRectTest.swf" width="650" height="400" align="center">
      <!--<![endif]-->
        
      <!--[if !IE]>-->
      </object>
      <!--<![endif]-->
    </object>
<br />
Un autre exemple intéressant qui reprend la simulation de Philippe Elsass :<br />
<em>(Clic pour ajouter un point, Ctrl/Cmd + click pour supprimer un point)</em><br />

    <object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" id="swfobj_5" width="650" height="500" align="center">
      <param name="movie" value="http://fabien.lafabrick.com/labs/fluid/FluidMouseShapeTest.swf" />
      <param name="align" value="center" />
      <!--[if !IE]>-->
      <object type="application/x-shockwave-flash" data="http://fabien.lafabrick.com/labs/fluid/FluidMouseShapeTest.swf" width="650" height="500" align="center">
      <!--<![endif]-->
        
      <!--[if !IE]>-->
      </object>
      <!--<![endif]-->
    </object>
</p>
<h2>Encore plus de gelée</h2>
<p>Comme je le disais au début de cette article, nous travaillons depuis quelques temps sur une librairie de primitives pour Flex4 : UIGFX. L’idée est de proposer une suite de primitives bien utiles, qui n&#8217;existent en standard dans le SDK Flex4 (lignes pointillées, arc, camembert, &#8230;.).</p>
<p>Dans cette librairie, nous avons mis en place une  primitive de représentation graphique de path SVG, qui, à la différence de la primitive Path standard du SDK Flex, permet de placer les vecteurs dans le modèle de contraintes top, left, bottom, right. Cette primitive permet aussi d’importer un chemin SVG, et de le convertir au format propre à cette primitive.</p>
<p>En modifiant un peu le parseur SVG de UIGFX,  nous pouvons facilement parcourir un path SVG et extraire les points de vecteur clefs de la forme. L’idée, vous vous en doutez est de gélifier la forme <img src='http://www.lafabrick.com/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /><br />

    <object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" id="swfobj_6" width="650" height="500" align="center">
      <param name="movie" value="http://fabien.lafabrick.com/labs/fluid/FluidSvgTest.swf" />
      <param name="align" value="center" />
      <!--[if !IE]>-->
      <object type="application/x-shockwave-flash" data="http://fabien.lafabrick.com/labs/fluid/FluidSvgTest.swf" width="650" height="500" align="center">
      <!--<![endif]-->
        
      <!--[if !IE]>-->
      </object>
      <!--<![endif]-->
    </object>
</p>
<h2>Sources et ressources</h2>
<ul>
<li> Vous trouverez l’ensemble des sources <a href="http://fabien.lafabrick.com/labs/fluid/makeMeFluid-src.zip">dans ce zip</a></li>
<li><a href="http://code.google.com/p/biga/">Biga, geometric tools library</a></li>
<li><a href="http://en.nicoptere.net/?tag=generative-art">La série d&#8217;articles</a> de <a href="http://twitter.com/#!/nicoptere">Nicolas Barradeau</a></li>
<li><a href="http://philippe.elsass.me/2009/06/as3-parametric-path-drawing/">&laquo;&nbsp;Parametric path drawing&nbsp;&raquo;</a> de <a href="http://twitter.com/#!/elsassph">Philippe Elsass</a></li>
<li>Et bien sur <a href="http://neave.com/">le site web </a> de <a href="http://twitter.com/#!/neave">Paul Neave</a>, &#8230; et <a href="http://web.archive.org/web/20050204015952/http://www.neave.com/games/">l&#8217;ancien </a> <img src='http://www.lafabrick.com/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </li>
</ul>
<p>Have fluid&#8217;s fun !Autres articles sur le même sujet
<ul>
<li><a href="http://www.lafabrick.com/blog/2006/10/22/5-dessine-moi-de-la-3d/" rel="bookmark" title="22 octobre 2006">Dessine moi Final Fantaisy&#8230;</a></li>
<li><a href="http://www.lafabrick.com/blog/2006/10/22/10-youtube-soap-how-to-make-a-mouse-work-in-mid-air/" rel="bookmark" title="22 octobre 2006">La manette Wii sur mac / pc&#8230; enfin presque <img src='http://www.lafabrick.com/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </a></li>
<li><a href="http://www.lafabrick.com/blog/2007/12/06/277-librairie/" rel="bookmark" title="6 décembre 2007">Librairie lafabrick : parce que je le vaut bien</a></li>
<li><a href="http://www.lafabrick.com/blog/2007/05/15/96-et-le-9me-jour-il-crerent-le-volume-20/" rel="bookmark" title="15 mai 2007">et le 9ème jour il créerent le volume &#8230; 2.0</a></li>
</ul>
<p><!-- Similar Posts took 12.630 ms --></p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/lafabrick?a=VlZ5yy7ShF4:IoZ2l9y6Wko:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/lafabrick?i=VlZ5yy7ShF4:IoZ2l9y6Wko:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/lafabrick?a=VlZ5yy7ShF4:IoZ2l9y6Wko:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/lafabrick?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/lafabrick?a=VlZ5yy7ShF4:IoZ2l9y6Wko:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/lafabrick?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/lafabrick?a=VlZ5yy7ShF4:IoZ2l9y6Wko:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/lafabrick?d=qj6IDK7rITs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/lafabrick?a=VlZ5yy7ShF4:IoZ2l9y6Wko:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/lafabrick?i=VlZ5yy7ShF4:IoZ2l9y6Wko:F7zBnMyn0Lo" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/lafabrick/~4/VlZ5yy7ShF4" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.lafabrick.com/blog/2011/05/27/2576-make-me-fluid-2/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		<feedburner:origLink>http://www.lafabrick.com/blog/2011/05/27/2576-make-me-fluid-2/</feedburner:origLink></item>
		<item>
		<title>ORM, Hibernate et contrariétés…</title>
		<link>http://feedproxy.google.com/~r/lafabrick/~3/Euke04-7XaI/</link>
		<comments>http://www.lafabrick.com/blog/2011/02/26/2429-orm-hibernate-et-contrarietes/#comments</comments>
		<pubDate>Sat, 26 Feb 2011 10:30:59 +0000</pubDate>
		<dc:creator>Hervé</dc:creator>
				<category><![CDATA[[Dev] Flash / Flex / AIR...]]></category>
		<category><![CDATA[.NET]]></category>
		<category><![CDATA[hibernate]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[JPA]]></category>
		<category><![CDATA[LINQ]]></category>
		<category><![CDATA[ORM]]></category>

		<guid isPermaLink="false">http://www.lafabrick.com/blog/?p=2429</guid>
		<description><![CDATA[&#160; L’ORM, Object-Relational-Mapping ou, dans la langue de Molière (ou presque), Mapping Objet Relationnel est un concept en vogue depuis longtemps, choisi par les équipes d’architectes techniques de tous poils, préconisé par des consultants de tous horizons.&#160; Après quelques années à développer des « applications d’entreprise », j’ai eu l’occasion d’aboutir un constat : pourquoi [...]]]></description>
			<content:encoded><![CDATA[<p style="float: left; margin-right: 10px;">&nbsp;</p>
<div>L’ORM, Object-Relational-Mapping ou, dans la langue de Molière (ou presque), Mapping Objet Relationnel est un concept en vogue depuis longtemps, choisi par les équipes d’architectes techniques de tous poils, préconisé par des consultants de tous horizons.&nbsp;</p>
<p>Après quelques années à développer des « applications d’entreprise », j’ai eu l’occasion d’aboutir un constat : pourquoi se compliquer la vie avec un ORM quand on peut faire plus simple, plus rapide et au moins aussi maintenable ?</p>
<p>Cet article est une occasion de partager cette analyse avec vous, et (re)déclencher un vieux débat sur lequel je n’ai que rarement eu l’occasion de consulter des discussions en français.</p>
</div>
<p><span id="more-2429"></span></p>
<h2>Rappel : qu’est-ce qu’un ORM ?</h2>
<p>Un ORM fonctionne sur la base d’ajout de méta-données décrivant une correspondances entre des tables et colonnes de base de données et des objets et leurs propriétés.</p>
<p>Concrètement, un utilisateur pourra être modélisé par une classe</p>
<pre class="brush: java">

public class User

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

&lt;mapping&gt;

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

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

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

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

&lt;/class&gt;

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

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

SELECT p.*

FROM PROFILE_TABLE p, USER_PROFILES up

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

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

while (profilesIter.hasNext())

{

Profile currentProfile = profilesIter.next();

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

while (rolesIter.hasNext())

{

Role currentRole = rolesIter.next();

// Faire quelque chose

}

}
</pre>
<p>En pratique, il est tout à fait probable que ce code, presque indolore sur des collections d’objets présents en mémoire, se traduise avec un ORM par une série de requêtes SQL. En considérant que ce code serve à contrôler qu’un utilisateur dispose d’un rôle donné au sein d’une application – étant donc appelé très souvent pour chaque utilisateur de l’application – on peut tout à fait imaginer les problèmes de performances posés.</p>
<h2>« C’est un problème de paramétrage »</h2>
<p>Effectivement, ces problèmes sont souvent liés à la méconnaissance du framework et à des problèmes de paramétrage. Je ne suis moi-même pas expert Hibernate mais le connais assez pour savoir qu’un bon paramétrage peut faire toute la différence et que le code d’une application doit également se conformer au paradigme d’ORM.</p>
<p>J’ai aussi tendance à considérer ce type de travail comme un luxe. En effet, à niveau équivalent, un développeur sera capable de produire une requête SQL relativement efficace alors qu’il restera incapable de proposer un paramétrage Hibernate adéquat.</p>
<p>En conclusion, <strong>bien manipulé, l’ORM peut être très intéressant</strong> et apporter en lisibilité de code. A l’inverse, <strong>mal utilisé, il pose plus de problèmes qu’il n’est sensé en résoudre</strong> (performances, «hacks» divers et variés&#8230;).</p>
<h2>Les alternatives</h2>
<p>Et si je ne veux pas d’ORM sur mon projet ? C’est une question à se poser : les problèmes posés par un ORM, selon l’organisation et l’expérience de l’équipe de développement, peuvent être un frein à la réussite d’un projet.</p>
<p>Vous pouvez globalement recourir à :</p>
<ul>
<li>Un «mappeur de requêtes SQL» permettant d’exécuter des requêtes rédigées par vos soins, et automatiquement «mappées» sur des objets selon la configuration mise en place. Un framework Java assez connu dans ce domaine est <a title="iBatis" href="http://ibatis.apache.org/" target="_blank">iBatis</a> (repris récemment sous le nom <a title="MyBatis" href="http://www.mybatis.org/" target="_blank">MyBatis</a>) qui donne des résultats tout à fait satisfaisants, notamment par rapport à sa facilité de mise en oeuvre et sa proximité de fonctionnement avec des appels standards JDBC.</li>
<li>Des appels JDBC natifs «bruts» qui manquent de classes facilitant les appels et traitements des résultats. En le complétant du framework <a title="Documentation Spring 2 JDBC" href="http://static.springsource.org/spring/docs/2.0.x/reference/jdbc.html" target="_blank">Spring et son JdbcTemplate</a>, vous obtenez une solution très simple à mettre en place et aisément compréhensible par une équipe de développement peu expérimentée.</li>
</ul>
<h2>Que choisir ?</h2>
<p>Aujourd’hui, selon le contexte de la société dans laquelle un projet donné est réalisé, deux grandes catégories d’équipe se distinguent :</p>
<ol>
<li>Une équipe composée de profils similaires, évoluant ensemble sur les développements applicatifs de la société pour laquelle ils travaillent.</li>
<li>Une équipe encadrée par un senior et composée de profils juniors.</li>
</ol>
<p>Dans le premier cas de figure, la capitalisation sur la technologie sera généralement pérenne, l’équipe restant stable et organisée autour d’un socle applicatif donné. Dans ce cadre, les problèmes liés à l’utilisation d’un ORM ne se posent finalement qu’au démarrage et sont gommés par la suite.</p>
<p>Dans la seconde configuration, le cadrage est fait par l’architecte de manière globale, mais souvent difficilement appliqué à tous les aspects du développement. Concrètement, l’expert interviendra à la demande d’un junior coincé sur un problème, et règlera le problème avec lui en tentant de lui apporter les connaissances manquantes. Dans ce schéma, à force, les juniors intégreront les concepts et deviendront seniors à leur tour, encadrant d’autres juniors et l’histoire se répètera.</p>
<h2>Conclusions</h2>
<p>Vous aurez compris que je ne suis personnellement pas friand d’ORM, lui préférant des solutions plus simples, ayant trop souvent eu à gérer des problèmes liés à l’incompréhension du framework, des tentatives de paramétrage a posteriori pour contrer les problèmes de performances&#8230; Mais <strong>tout dépend de votre configuration d’équipe</strong>, cela reste un choix très intéressant dès lorsque qu’il est partagé et que chaque membre de l’équipe maîtrise les tenants et aboutissants de cette technologie.</p>
<p>Et vous, vous êtes ORM ?Autres articles sur le même sujet
<ul>
<li><a href="http://www.lafabrick.com/blog/2007/10/01/244-vous-avez-dis-flex3-beta2/" rel="bookmark" title="1 octobre 2007">Vous avez dis Flex3 Beta2 ?</a></li>
<li><a href="http://www.lafabrick.com/blog/2007/09/06/214-quicksilver-non-action-et-tao-appliqu-l-os-google-talks/" rel="bookmark" title="6 septembre 2007">Quicksilver, non-action et Tao appliqués à MacOS X [@Google Talks]</a></li>
<li><a href="http://www.lafabrick.com/blog/2009/10/09/1349-max-2009-jpa-blazeds-et-livecycle-ds/" rel="bookmark" title="9 octobre 2009">MAX 2009 &#8211; JPA, BlazeDS et LiveCycle DS</a></li>
<li><a href="http://www.lafabrick.com/blog/2010/08/20/2167-air-2-appeler-un-jar-executable-via-un-nativeprocess/" rel="bookmark" title="20 août 2010">AIR 2 : appeler un JAR exécutable via un NativeProcess</a></li>
</ul>
<p><!-- Similar Posts took 14.986 ms --></p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/lafabrick?a=Euke04-7XaI:UOji_20vf0w:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/lafabrick?i=Euke04-7XaI:UOji_20vf0w:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/lafabrick?a=Euke04-7XaI:UOji_20vf0w:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/lafabrick?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/lafabrick?a=Euke04-7XaI:UOji_20vf0w:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/lafabrick?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/lafabrick?a=Euke04-7XaI:UOji_20vf0w:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/lafabrick?d=qj6IDK7rITs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/lafabrick?a=Euke04-7XaI:UOji_20vf0w:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/lafabrick?i=Euke04-7XaI:UOji_20vf0w:F7zBnMyn0Lo" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/lafabrick/~4/Euke04-7XaI" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.lafabrick.com/blog/2011/02/26/2429-orm-hibernate-et-contrarietes/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		<feedburner:origLink>http://www.lafabrick.com/blog/2011/02/26/2429-orm-hibernate-et-contrarietes/</feedburner:origLink></item>
		<item>
		<title>(Re) naissance</title>
		<link>http://feedproxy.google.com/~r/lafabrick/~3/beI4xVyySAE/</link>
		<comments>http://www.lafabrick.com/blog/2011/02/17/2404-re-naissance/#comments</comments>
		<pubDate>Thu, 17 Feb 2011 16:53:10 +0000</pubDate>
		<dc:creator>La Fabrick</dc:creator>
				<category><![CDATA[La Fabrick]]></category>

		<guid isPermaLink="false">http://www.lafabrick.com/blog/?p=2404</guid>
		<description><![CDATA[Nous avons le plaisir de vous annoncer que la Fabrick SARL est née aujourd&#8217;hui 17 février 2011, à 15 heures ! L&#8217;accouchement s&#8217;est bien passé, et les 3 papas sont en pleine forme. Autres articles sur le même sujet Les blogs c&#8217;est bien!&#8230; mais y a mieux !!! Virtual Cabinet, flash et interfaces riches pour [...]]]></description>
			<content:encoded><![CDATA[<table width="100%">
<tbody>
<tr>
<td width="150px"><img src="http://www.lafabrick.com/blog/wp-content/uploads/2011/02/logoFbk.png" alt="" title="logoFbk" height="152" class="aligncenter size-full wp-image-2412" /></td>
<td width="100%">Nous avons le plaisir de vous annoncer que <b>la Fabrick SARL</b> est née aujourd&#8217;hui 17 février 2011, à 15 heures !</p>
<p>L&#8217;accouchement s&#8217;est bien passé, et les 3 papas sont en pleine forme.</td>
</tr>
</tbody>
</table>
<p>Autres articles sur le même sujet
<ul>
<li><a href="http://www.lafabrick.com/blog/2007/07/20/193-les-blogs-c-est-bien-mais-y-a-mieux/" rel="bookmark" title="20 juillet 2007">Les blogs c&#8217;est bien!&#8230; mais y a mieux !!!</a></li>
<li><a href="http://www.lafabrick.com/blog/2007/07/04/97-virtual-cabinet-ria-rda-pour-l-apprentissage-des-langues/" rel="bookmark" title="4 juillet 2007">Virtual Cabinet, flash et interfaces riches pour l&#8217;apprentissage des langues (1)</a></li>
<li><a href="http://www.lafabrick.com/blog/2008/05/23/318-thanks-adobe-you-certified-me/" rel="bookmark" title="23 mai 2008">Thanks Adobe, U certified me !!! <img src='http://www.lafabrick.com/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </a></li>
<li><a href="http://www.lafabrick.com/blog/2009/03/02/1079-fitc09-twiidee-wiiflash-and-rock-n-roll/" rel="bookmark" title="2 mars 2009">FITC#09 : TwiiDee, WiiFlash and Rock &#8216;n&#8217; Roll</a></li>
</ul>
<p><!-- Similar Posts took 12.389 ms --></p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/lafabrick?a=beI4xVyySAE:yWDGgCDOiFo:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/lafabrick?i=beI4xVyySAE:yWDGgCDOiFo:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/lafabrick?a=beI4xVyySAE:yWDGgCDOiFo:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/lafabrick?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/lafabrick?a=beI4xVyySAE:yWDGgCDOiFo:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/lafabrick?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/lafabrick?a=beI4xVyySAE:yWDGgCDOiFo:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/lafabrick?d=qj6IDK7rITs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/lafabrick?a=beI4xVyySAE:yWDGgCDOiFo:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/lafabrick?i=beI4xVyySAE:yWDGgCDOiFo:F7zBnMyn0Lo" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/lafabrick/~4/beI4xVyySAE" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.lafabrick.com/blog/2011/02/17/2404-re-naissance/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		<feedburner:origLink>http://www.lafabrick.com/blog/2011/02/17/2404-re-naissance/</feedburner:origLink></item>
		<item>
		<title>MdaME, ma résolution 2011 de génération de code AS3</title>
		<link>http://feedproxy.google.com/~r/lafabrick/~3/dMiTio8SiTo/</link>
		<comments>http://www.lafabrick.com/blog/2011/01/11/2349-mdame-generateur-code-xsd-as3-flex/#comments</comments>
		<pubDate>Tue, 11 Jan 2011 21:50:00 +0000</pubDate>
		<dc:creator>La Fabrick</dc:creator>
				<category><![CDATA[La Fabrick]]></category>
		<category><![CDATA[Logiciels / extensions / plugins...]]></category>
		<category><![CDATA[Nos projets]]></category>
		<category><![CDATA[[Dev] Flash / Flex / AIR...]]></category>
		<category><![CDATA[AIR]]></category>
		<category><![CDATA[AS3]]></category>
		<category><![CDATA[Flex]]></category>
		<category><![CDATA[generateur de code]]></category>
		<category><![CDATA[InMarket]]></category>
		<category><![CDATA[MDA]]></category>
		<category><![CDATA[XML]]></category>
		<category><![CDATA[xsd]]></category>

		<guid isPermaLink="false">http://www.lafabrick.com/blog/?p=2349</guid>
		<description><![CDATA[Voilà quelques temps que nous nous activions sans donner de nouvelles&#8230;, il est temps de corriger tout ça. Aussi, pour démarrer cette nouvelle année du bon pied, La Fabrick vous propose une petite application de génération de code AS3 à partir d&#8217;un schéma XSD. Ce petit outil nous a été utile pour pas mal de [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: center;">
<p><a href="http://www.lafabrick.com/blog/wp-content/uploads/2011/01/MdaMe.png"><img class="size-full wp-image-2372 alignnone" title="MdaMe" src="http://www.lafabrick.com/blog/wp-content/uploads/2011/01/MdaMe.png" alt="" width="499" height="64" /></a></p>
<p>Voilà quelques temps que nous nous activions sans donner de nouvelles&#8230;, il est temps de corriger tout ça.<br />
Aussi, pour démarrer cette nouvelle année du bon pied, La Fabrick vous propose une petite application de génération de code AS3 à partir d&#8217;un schéma XSD.</p>
<p>Ce petit outil nous a été utile pour pas mal de projets développés pour nos premiers clients, alors pourquoi ne pas vous en faire profiter ? Peut-être deviendrez-vous aussi MdaME-addict ?</p>
<p>Retrouvez toutes les infos sur <a href="http://mdame.lafabrick.com">http://mdame.lafabrick.com</a>Autres articles sur le même sujet
<ul>
<li><a href="http://www.lafabrick.com/blog/2006/12/21/23-api-de-dessin-en-as3/" rel="bookmark" title="21 décembre 2006">API de dessin en AS3</a></li>
<li><a href="http://www.lafabrick.com/blog/2007/03/15/39-cre-ton-navigateur-perso-avec-5-lignes-de-code/" rel="bookmark" title="15 mars 2007">Crée ton navigateur perso avec 5 lignes de code !</a></li>
<li><a href="http://www.lafabrick.com/blog/2008/02/27/309-flex-builder-3-et-le-php/" rel="bookmark" title="27 février 2008">Flex Builder 3 et le PHP ( PDT ) : installation</a></li>
<li><a href="http://www.lafabrick.com/blog/2008/05/10/323-tuto-vido-skiner-un-composant-flex-3-avec-fireworks-cs3/" rel="bookmark" title="10 mai 2008">Skiner un composant Flex 3 avec Fireworks CS3 [Tutoriel Vidéo]</a></li>
</ul>
<p><!-- Similar Posts took 11.771 ms --></p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/lafabrick?a=dMiTio8SiTo:R-zi7HLpKNc:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/lafabrick?i=dMiTio8SiTo:R-zi7HLpKNc:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/lafabrick?a=dMiTio8SiTo:R-zi7HLpKNc:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/lafabrick?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/lafabrick?a=dMiTio8SiTo:R-zi7HLpKNc:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/lafabrick?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/lafabrick?a=dMiTio8SiTo:R-zi7HLpKNc:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/lafabrick?d=qj6IDK7rITs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/lafabrick?a=dMiTio8SiTo:R-zi7HLpKNc:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/lafabrick?i=dMiTio8SiTo:R-zi7HLpKNc:F7zBnMyn0Lo" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/lafabrick/~4/dMiTio8SiTo" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.lafabrick.com/blog/2011/01/11/2349-mdame-generateur-code-xsd-as3-flex/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.lafabrick.com/blog/2011/01/11/2349-mdame-generateur-code-xsd-as3-flex/</feedburner:origLink></item>
		<item>
		<title>RollingFileTarget pour AIR 2.0 : let’s roll !</title>
		<link>http://feedproxy.google.com/~r/lafabrick/~3/GDikWfSgqL4/</link>
		<comments>http://www.lafabrick.com/blog/2010/10/21/2272-rollingfiletarget-pour-air-2-0-lets-roll/#comments</comments>
		<pubDate>Thu, 21 Oct 2010 17:35:00 +0000</pubDate>
		<dc:creator>Hervé</dc:creator>
				<category><![CDATA[[Dev] Flash / Flex / AIR...]]></category>
		<category><![CDATA[AIR]]></category>
		<category><![CDATA[Flex]]></category>
		<category><![CDATA[linkedin]]></category>
		<category><![CDATA[log]]></category>

		<guid isPermaLink="false">http://www.lafabrick.com/blog/?p=2272</guid>
		<description><![CDATA[Pour ceux qui utilisent l&#8217;API de logging de Flex, au sein d&#8217;une application AIR ont certainement remarque qu&#8217;il manquait cruellement une Target &#171;&#160;fichier&#160;&#187; pour tracer dans un fichier texte (même si le résultat de la fonction trace se retrouve enfoui quelque part dans les tréfonds du répertoire de données du Flash Player). Pour ceux qui [...]]]></description>
			<content:encoded><![CDATA[<p><img class="aligncenter" src="http://help.adobe.com/en_US/flex/using/images/lg_logger_target_dist_popup.png" alt="Flex Logging API" width="506" height="60" /></p>
<p>Pour ceux qui utilisent l&#8217;<a href="http://help.adobe.com/en_US/flex/using/WS2db454920e96a9e51e63e3d11c0bf69084-7f0f.html">API de logging de Flex</a>, au sein d&#8217;une application AIR ont certainement remarque qu&#8217;il manquait cruellement une Target &laquo;&nbsp;fichier&nbsp;&raquo; pour tracer dans un fichier texte (même si le résultat de la fonction <strong>trace</strong> se retrouve enfoui quelque part dans les tréfonds du répertoire de données du Flash Player).</p>
<p>Pour ceux qui se sont posés cette question, vous êtes sans doute tombés (Ô joie) sur la <a href="http://github.com/mikechambers/as3corelib/blob/master/src/com/adobe/air/logging/FileTarget.as">FileTarget</a> de notre ami <a href="http://twitter.com/#!/mesh">Mike Chambers</a> dans l&#8217;AS3 core lib.</p>
<p>Pour ceux qui se sont demandé s&#8217;il y avait un équivalent du <strong>RollingFileAppender</strong> de <strong>log4j</strong> en Flex (j&#8217;espère qu&#8217;il en reste, sinon restez, c&#8217;est bien quand même !), eh bien vous êtes certainement tombés sur l&#8217;ensemble vide.</p>
<p>N&#8217;y tenant plus, j&#8217;ai craqué sur une extension de la FileTarget pour créer le RollingFileTarget. Vous en voulez ?<br />
<span id="more-2272"></span></p>
<h2>Un rapide point sur l&#8217;API de logging</h2>
<p>Et pourquoi pas un bon vieux <code><strong>trace("qui tâche")</strong></code> ?<br />
Simplement parce que <strong><code>trace()</code></strong> trace tout, tout le temps, sans indication complémentaire sur le moment, ou la criticité de l&#8217;événement tracé. En clair, c&#8217;est très pratique pour en phase de test simple, lab ou autre, mais devient très vite inapproprié dès qu&#8217;on entre dans un développement structuré.</p>
<h2>Comment faire de jolies traces bien propres <span style="font-size: 8pt;">Aïe</span></h2>
<p>C&#8217;est très simple (cf. doc Flex) :</p>
<h3>La target</h3>
<pre class="brush: js">
/* Create a target. */
var logTarget:TraceTarget = new TraceTarget();

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

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

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

/* Begin logging. */
Log.addTarget(logTarget);
</pre>
<p>Vous noterez l&#8217;usage de la <strong>TraceTarget</strong> qui va indiquer d&#8217;envoyer les traces vers la console et donc faire comme la fonction <strong>trace()</strong>.<br />
La target permet d&#8217;aller un peu plus loin en indiquant notamment :</p>
<ul>
<li>le niveau de log : toute trace d&#8217;une criticité inférieure au niveau défini sera donc ignorée</li>
<li>des filtres sur les catégories de log : ces filtres vont permettre de n&#8217;envoyer sur la cible que les traces correspondantes</li>
</ul>
<h3>Le logger</h3>
<p>Nous avons donc une cible, maintenant il faut tracer ! Pour cela, il suffit de créer un logger :</p>
<pre class="brush: js">
private static var _logger:ILogger = Log.getLogger(&quot;com.lafabrick.classes.UneClasse&quot;);
</pre>
<p>Il est en général recommandé de créer un logger par classe de façon statique pour limiter le nombre d&#8217;instances en mémoire.<br />
Vous pouvez noter l&#8217;utilisation de la notation sous forme de packages permettant de faire le lien avec les filtres définis au niveau d&#8217;une target.<br />
Pour utiliser le <code>_logger</code>, vous pouvez appeler les méthodes suivantes :</p>
<pre class="brush: js">
_logger.debug(&quot;Trace niveau debug&quot;);
_logger.info(&quot;Trace niveau info&quot;);
_logger.warn(&quot;Trace niveau warning&quot;);
_logger.error(&quot;Trace niveau error&quot;);
_logger.fatal(&quot;Trace niveau fatal&quot;);
</pre>
<p>Les appels provoqueront l&#8217;ajout de votre trace à tout target définie correspondant au paramétrage de votre logger (catégorie et niveau).</p>
<h2>Faire sa target personnalisée</h2>
<p>Il ne reste plus qu&#8217;à écrire une target personnalisée qui va écrire dans un fichier au lieu d&#8217;écrire dans la console.</p>
<p>Vous pouvez pour cela étendre la classe <strong>AbstractTarget</strong> ou <strong>LineFormattedTarget </strong>(cette dernière prendra en charge la mise en forme du message pour vous, donc bien pratique).</p>
<p>C&#8217;est ce qu&#8217;a fait Mike avec sa <strong>FileTarget</strong> que je vous laisserai consulter sur <a href="http://github.com">Github</a>.</p>
<h2>La RollingFileTarget</h2>
<p>C&#8217;est sur ce modèle que j&#8217;ai développé la <strong>RollingFileTarget</strong> dont l&#8217;objectif est de pratiquer une rotation sur un fichier de log selon deux critères :</p>
<ol>
<li><strong>La date</strong><br />
Objectif : un fichier de log par jour, par mois ou par an</li>
<li><strong>Le poids</strong><br />
Objectif : la taille d&#8217;un fichier de log ne doit pas excéder N octets</li>
</ol>
<p><strong>Utilisation</strong></p>
<p>Il s&#8217;agit d&#8217;une target classique, utilisable comme la <strong>TraceTarget</strong> :</p>
<pre class="brush: js">
var fileTarget:RollingFileTarget = new RollingFileTarget(new File(&quot;app-storage:/logs/monappli.log&quot;));
fileTarget.filters = [&quot;*&quot;];
fileTarget.includeDate = true;
fileTarget.level = LogEventLevel.ERROR;
fileTarget.includeTime = true;
fileTarget.includeCategory = true;
fileTarget.includeLevel = true;
fileTarget.rollingInterval = RollingFileTarget.DAY_INTERVAL; // Un fichier de log par jour
fileTarget.maxLogFileWeight = 0; // Pas de limite de taille de fichier
fileTarget.maxLogBackups = 7; // Une semaine de roulement sur les fichiers de log
Log.addTarget(fileTarget);
</pre>
<p>A noter les trois propriétés suivantes :</p>
<ul>
<li><strong>rollingInterval</strong> : le mode de roulement par date. Vous avez le choix entre <strong>RollingFileTarget</strong>.<strong>DAY_INTERVAL</strong>, <strong>RollingFileTarget</strong>.<strong>MONTH_INTERVAL</strong>, <strong>RollingFileTarget</strong>.<strong>YEAR_INTERVAL</strong>, <strong>RollingFileTarget</strong>.<strong>NO_INTERVAL</strong><br />
Je ne traduis pas, j&#8217;imagine que vous comprenez <img src='http://www.lafabrick.com/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </li>
<li><strong>maxLogFileWeight</strong> : la taille maximale d&#8217;un fichier de log, en octets.<br />
Pour limiter la taille d&#8217;un fichier de log à 5Mo par exemple, vous pouvez indiquer maxLogFileWeight = 5000000. Une valeur à zéro désactive la rotation selon la taille du fichier.</li>
<li><strong>maxLogBackups </strong>: le nombre maximum de backups à conserver.<br />
Le principe réside en la conservation d&#8217;un nombre suffisant de logs pour retrouver les éléments importants ayant pu se passer. En général, une semaine de log suffit pour retrouver ses petits pour une application utilisée raisonnablement.</li>
</ul>
<div>Cette target a pour particularité de renommer le fichier de log courant selon le motif suivant :</div>
<div>
<ol>
<li><strong><span style="color: #008000;">AAAA-MM-JJ</span></strong><strong>-nom.log</strong> pour une rotation par date (<strong>année</strong> sur 4 chiffres, <strong>mois </strong>sur deux chiffres, <strong>jour </strong>sur deux chiffres)</li>
<li><strong>nom.log.</strong><strong><span style="color: #008000;">X</span></strong> pour une rotation par taille (X s&#8217;incrémentant de 1 à chaque rotation)</li>
</ol>
</div>
<p>A savoir que ce motif est utilisé par la target pour détecter les backups existants dans le répertoire de stockage de votre fichier de log principal et gérer ainsi proprement les backups entre deux lancements de l&#8217;application (oui, c&#8217;est rare de laisser tourner son appli pendant 2 semaines sans l&#8217;arrêter&#8230;)</p>
<p>Je n&#8217;ai donc pas préféré laisser le choix sur le motif de renommage pour éviter les problématiques pouvant évidemment en découler. En même temps, on a affaire à des fichiers de logs&#8230;</p>
<p><strong>Note importante :</strong> ces deux politiques sont combinables mais il est plus que conseillé de choisir entre un roulement sur le poids OU un roulement selon la date pour conserver des backup dans un ordre cohérent. En effet, si vous choisissez de combiner la rotation sur la taille ET sur le poids, vous aurez <em>maxLogBackups </em>fichiers de log suivant le motif <strong>AAAA-MM-JJ-nom.log</strong> et <em>maxLogBackups </em>fichiers de log suivant le motif <strong>nom.log.X</strong>.</p>
<p>J&#8217;envisage à terme que lors d&#8217;une rotation par date, l&nbsp;&raquo;ensemble des fichiers de backup par taille existants soient préfixés de la date du jour pour grouper correctement l&#8217;ensemble.</p>
<h3>Téléchargement</h3>
<p>Vous pouvez gracieusement télécharger, utiliser, modifier cette classe comme bon vous semble, La Fabrick déclinant toute responsabilité sur un quelconque dommage, problème ou perte d&#8217;information liée à son utilisation, de manière directe ou indirecte. Veillez également à respecter le copyright indiqué en entête du fichier, merci !</p>
<p><a href="http://github.com/hlabas/as3corelib/blob/master/src/com/adobe/air/logging/RollingFileTarget.as"><img class="aligncenter size-full wp-image-2281" title="Download" src="http://www.lafabrick.com/blog/wp-content/uploads/2010/10/deb.png" alt="Télécharger" width="128" height="128" /></a></p>
<p>A noter bien entendu que cette classe utilise l&#8217;API d&#8217;accès au système de fichiers de AIR et ne peut donc être utilisée qu&#8217;au sein d&#8217;application compilées avec ce runtime.</p>
<p>Bons logs&#8230;Autres articles sur le même sujet
<ul>
<li><a href="http://www.lafabrick.com/blog/2008/02/04/299-un-projet-java-flex-avec-maven-2/" rel="bookmark" title="4 février 2008">Un projet Java / Flex avec Maven 2</a></li>
<li><a href="http://www.lafabrick.com/blog/2010/08/20/2167-air-2-appeler-un-jar-executable-via-un-nativeprocess/" rel="bookmark" title="20 août 2010">AIR 2 : appeler un JAR exécutable via un NativeProcess</a></li>
<li><a href="http://www.lafabrick.com/blog/2010/02/19/1609-flashplayer-101-et-multi-toucher-caresse-moi-le-flex/" rel="bookmark" title="19 février 2010">Caresse-toi le flex : FlashPlayer 10.1 et Multi-toucher</a></li>
<li><a href="http://www.lafabrick.com/blog/2010/07/28/2092-zxpackager-application-pour-l%e2%80%99empaquetage-zxp-d%e2%80%99extensions-cs5/" rel="bookmark" title="28 juillet 2010">ZXPackager : application pour l’empaquetage ZXP d’extensions CS5</a></li>
</ul>
<p><!-- Similar Posts took 13.007 ms --></p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/lafabrick?a=GDikWfSgqL4:k2AmXCEgWVw:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/lafabrick?i=GDikWfSgqL4:k2AmXCEgWVw:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/lafabrick?a=GDikWfSgqL4:k2AmXCEgWVw:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/lafabrick?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/lafabrick?a=GDikWfSgqL4:k2AmXCEgWVw:7Q72WNTAKBA"><img src="http://feeds.feedburner.com/~ff/lafabrick?d=7Q72WNTAKBA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/lafabrick?a=GDikWfSgqL4:k2AmXCEgWVw:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/lafabrick?d=qj6IDK7rITs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/lafabrick?a=GDikWfSgqL4:k2AmXCEgWVw:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/lafabrick?i=GDikWfSgqL4:k2AmXCEgWVw:F7zBnMyn0Lo" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/lafabrick/~4/GDikWfSgqL4" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.lafabrick.com/blog/2010/10/21/2272-rollingfiletarget-pour-air-2-0-lets-roll/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		<feedburner:origLink>http://www.lafabrick.com/blog/2010/10/21/2272-rollingfiletarget-pour-air-2-0-lets-roll/</feedburner:origLink></item>
		<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[linkedin]]></category>
		<category><![CDATA[maven]]></category>
		<category><![CDATA[NativeProcess]]></category>

		<guid isPermaLink="false">http://www.lafabrick.com/blog/?p=2167</guid>
		<description><![CDATA[Vous avez certainement pu remarquer l&#8217;apparition attendue de la fonctionnalité d&#8217;exécution de code natif parmi les nouveautés de AIR 2.0. Les NativeProcess permettent d&#8217;étendre significativement les possibilités offertes par une application AIR. Mais, l&#8217;un des gros atouts d&#8217;Adobe AIR résidant dans sa nature multi-plateforme, il serait dommage de restreindre l&#8217;installation de votre application à un [...]]]></description>
			<content:encoded><![CDATA[<p>Vous avez certainement pu remarquer l&#8217;apparition attendue de la fonctionnalité d&#8217;exécution de code natif parmi les nouveautés de AIR 2.0. Les NativeProcess permettent d&#8217;étendre significativement les possibilités offertes par une application AIR.<br />
Mais, l&#8217;un des gros atouts d&#8217;Adobe AIR résidant dans sa nature multi-plateforme, il serait dommage de restreindre l&#8217;installation de votre application à un seul système d&#8217;exploitation&#8230; ça tombe bien, Java aussi est multi-plateforme (c&#8217;est bien l&#8217;open source) : OK du coup comment j&#8217;appelle du Java depuis mon AIR ?<br />
Explications&#8230;<br />
<span id="more-2167"></span></p>
<h2>Fonctionnement et limites d&#8217;un NativeProcess</h2>
<h3>Packaging de l&#8217;application</h3>
<p>Pour diverses raisons de sécurité, une application AIR utilisant un NativeProcess doit être packagée dans le format de la plateforme cible (exe pour Windows, dmg pour Mac, rpm / deb / &#8230; pour Linux). Fini donc dans ce cas le pratique fichier .air qui marche partout !<br />
Vous devez également indiquer dans le descripteur de l&#8217;application qu&#8217;il s&#8217;agit d&#8217;une application au profil &laquo;&nbsp;extendedDesktop&nbsp;&raquo; lui conférant donc les capacités d&#8217;exécuter un NativeProcess.<br />
Vous devez ouvrir le fichier <strong>monAppli-app.xml</strong> et modifier la balise <code>&lt;supportedProfiles&gt;</code></p>
<pre class="brush: xml">
&lt;supportedProfiles&gt;extendedDesktop&lt;/supportedProfiles&gt;
</pre>
<p>A partir de là, si vous tentez d&#8217;exporter un fichier .air, vous aurez un joli message d&#8217;erreur vous invitant à changer de profil.</p>
<h3>Considérations de sécurité</h3>
<p>Si AIR sans native process dispose de limitations de sécurité, dès lors que vous utilisez un native process, vous ouvrez la porte&#8230; Il est donc bon d&#8217;anticiper et de faire un maximum de vérifications sur vos appels pour éviter un remplacement d&#8217;un exécutable par un autre, moins sympathique, par exemple&#8230;</p>
<h2>Prêt ? On code</h2>
<h3>Paramétrage</h3>
<p>Un native process a besoin d&#8217;un contexte d&#8217;exécution. Ce contexte est défini à l&#8217;aide de l&#8217;objet <code>NativeProcessStartupInfo</code> décrivant notamment les éléments suivants :</p>
<ul>
<li><strong>workingDirectory</strong> : le répertoire d&#8217;exécution</li>
<li><strong>executableFile</strong> : l&#8217;exécutable à lancer</li>
<li><strong>arguments</strong> : la liste des arguments à passer à l&#8217;exécutable (<code>Vector.&lt;String&gt;</code> sous Flash Player 10, ou un bête <code>Array</code> sinon)</li>
</ul>
<p>Vous pourrez alors instancier un objet NativeProcess et lui passer cet objet de paramétrage avant de le lancer.</p>
<h3>Lancement &amp; suivi de l&#8217;exécution</h3>
<p>Le lancement d&#8217;un NativeProcess est asynchrone. Il propose donc un certain nombre d&#8217;événements vous permettant de suivre son exécution une fois lancé, notamment :</p>
<ul>
<li><strong>ProgressEvent.STANDARD_OUTPUT_DATA</strong> : écriture sur la sortie standard</li>
<li><strong>ProgressEvent.STANDARD_ERROR_DATA</strong> : écriture sur la sortie d&#8217;erreur</li>
<li><strong>IOErrorEvent.STANDARD_OUTPUT_IO_ERROR</strong> : déclenché lorsqu&#8217;une erreur apparaît en tentant de lire la sortie standard</li>
<li><strong>IOErrorEvent.STANDARD_ERROR_IO_ERROR</strong> : déclenché lorsqu&#8217;une erreur apparaît en tentant de lire la sortie d&#8217;erreur</li>
<li><strong>NativeProcessExitEvent.EXIT</strong> : déclenché lors que l&#8217;exécution du process est terminée</li>
</ul>
<h3>Lecture de l&#8217;entrée / sortie standard</h3>
<p>Bien que tout à fait possible, la lecture de la sortie standard ou d&#8217;erreur via le listener <code>ProgressEvent.STANDARD_OUTPUT_DATA</code> ou <code>ProgressEvent.STANDARD_ERROR_DATA</code> n&#8217;est pas fiable à 100% concernant le contenu retourné : la sortie étant &laquo;&nbsp;bufferisée&nbsp;&raquo;, vous n&#8217;aurez donc pas systématiquement le même résultat selon la machine exécutant le programme, à chaque appel de votre listener&#8230; N&#8217;utilisez donc la lecture de sortie standard que pour afficher ce qui se passe, ou à la limite récupérer la totalité du contenu écrit une fois le process terminé&#8230;</p>
<h2>Appeler un JAR</h2>
<h3>Rappels</h3>
<p>Pour appeler un JAR en Java, il doit être exécutable (bah oui&#8230;), et appelé en ligne de commande de la manière suivante :<br />
<code><br />
java -jar monJar.jar [-cp jars du classpath]<br />
</code><br />
Nous sommes dans une appli AIR, donc évitons de surcharger la commande à appeler avec un classpath, aussi je vous suggère d&#8217;utiliser les fonctionnalités d&#8217;export complets d&#8217;un JAR (si les licences associées vous l&#8217;autorisent) intégrant au final l&#8217;ensemble des sources dans un groooos JAR contenant tout ce qu&#8217;il lui faut pour fonctionner.<br />
<strong>Notes :</strong></p>
<ul>
<li>Les utilisateurs de Maven peuvent utiliser <a title="Plugin maven assembly et configuration associée" href="http://stackoverflow.com/questions/574594/how-can-i-create-an-executable-jar-with-dependencies-using-maven">le plugin qui va bien pour ça</a>.</li>
<li>L&#8217;export eclipse, c&#8217;est pas mal non plus, il suffit de cocher la &laquo;&nbsp;case qui va bien&nbsp;&raquo; au moment d&#8217;exporter</li>
</ul>
<h3>Depuis un NativeProcess</h3>
<p>On voit mieux ce qui se dessine:</p>
<ol>
<li>Définir l&#8217;exécutable java dans vos &laquo;&nbsp;startup infos&nbsp;&raquo;</li>
<li>Définir les arguments
<ul>
<li>-jar</li>
<li>/chemin/vers/monJar.jar</li>
</ul>
</li>
<li>Ajouter les listeners permettant de savoir lorsque l&#8217;exécution est terminée</li>
<li>Lancer le native process</li>
</ol>
<h3>Restons multi plateforme</h3>
<p>Java est multi plateforme, oui, mais l&#8217;exécutable dépend de la plateforme, aussi il vous faudra récupérer le chemin vers votre JAVA_HOME (contenant le répertoire bin avec l&#8217;exécutable Java).<br />
Vous avez donc deux solutions maintenant:</p>
<ol>
<li><strong>La plus simple</strong> (pour le développeur) : demander à votre gentil utilisateur où est son JAVA_HOME. Ça peut le faire si c&#8217;est un geek velu qui a compris qu&#8217;on ne parlait pas de venir danser chez lui (aïe, elle est rude celle-ci)</li>
<li><strong>La plus compliquée</strong> (mais pratique pour l&#8217;utilisateur) : utiliser un autre exécutable (voire NativeProcess) qui remonte cette information ou permette de pointer directement sur l&#8217;exécutable en question</li>
</ol>
<p>La seconde solution bien que séduisante est un peu plus longue à implémenter.<br />
Pour les développeurs sous Windows, j&#8217;ai noté l&#8217;utilisation par <a href="www.webkitchen.be">Serge Jespers</a> d&#8217;un petit (mais pratique) exécutable &laquo;&nbsp;jexe.exe&nbsp;&raquo; lançant le java.exe présent dans le %JAVA_HOME%\bin de la machine. L&#8217;utiliser vous évitera la première solution, sans vous lancer dans un développement spécifiquement dédié à cela (merci Serge). En revanche, si votre application est diffusée à un public d&#8217;utilisateurs non avertis, ils sont tout à fait susceptibles de ne pas avoir de variable JAVA_HOME définie sur leur machine : pensez donc à déterminer précisément votre cible avant de choisir une solution.</p>
<p>J&#8217;ai également noté en relisant un extrait de la licence du JRE que la redistribution est autorisée sous certaines conditions. Si vous les remplissez, vous pourriez carrément embarquer le runtime java dans votre application AIR, au risque de la faire gonfler en taille&#8230;</p>
<h2>Un exemple ! Un exemple !</h2>
<p>Voici un petit exemple de code permettant de lancer un JAR exécutable depuis une application AIR :</p>
<pre class="brush: java">
package com.lafabrick.nativeprocess
{
import flash.desktop.NativeProcess;
import flash.desktop.NativeProcessStartupInfo;
import flash.events.EventDispatcher;
import flash.events.NativeProcessExitEvent;
import flash.events.ProgressEvent;
import flash.filesystem.File;
import flash.system.Capabilities;

public class JarExec
{
protected var _process:NativeProcess;

public function JarExec()
{
}

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

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

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

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

trace(&quot;-- Début d&#039;exécution&quot;);
}
catch (e:Error)
{
trace(&quot;Impossible de lancer le process\n&quot; + e.message + &quot;\n&quot; + e.getStackTrace());
}
}
protected function onStandardOut(e:ProgressEvent):void
{
trace(&quot;STDOUT: &quot; + _process.standardOutput.readUTFBytes(_process.standardOutput.bytesAvailable));
}
protected function onErrorOut(e:ProgressEvent):void
{
trace(&quot;STDERR: &quot; + _process.standardError.readUTFBytes(_process.standardError.bytesAvailable));
}
protected function onJavaTestExit(e:NativeProcessExitEvent):void
{
trace(&quot;-- Fin d&#039;exécution&quot;);
}
}
}
</pre>
<p>Cet extrait donne un aperçu, mais vous pouvez vous lancer (soyons fous) à installer le package suivant :</p>
<table style="text-align: center;">
<tbody>
<tr>
<td><a href="http://www.lafabrick.com/labz/nativeprocess/NativeJarExec.dmg"><img title="Mac" src="http://www.lafabrick.com/blog/wp-content/uploads/2010/07/mac.gif" alt="" width="50" height="50" /><br />
Pour Mac</a></td>
<td><a href="http://www.lafabrick.com/labz/nativeprocess/NativeJarExec.exe"><img title="Windows" src="http://www.lafabrick.com/blog/wp-content/uploads/2010/07/windows.jpeg" alt="" width="50" height="50" /><br />
Pour Windows</a></td>
</tr>
</tbody>
</table>
<p>Pensez au clic droit &gt; View Source&#8230;</p>
<h2>Packager l&#8217;application</h2>
<p>Comme je le disais au début de ce post, il est nécessaire de packager votre application dans le format natif du système d&#8217;exploitation visé. Vous avez deux solutions pour cela :</p>
<ol>
<li>Passer par la dernière version de Flash Builder 4 qui propose cette fonctionnalité</li>
<li>Utiliser l&#8217;application <a href="http://www.webkitchen.be/package-assistant-pro/">PackageAssistantPro</a> proposée par <a href="http://www.webkitchen.be">Serge Jespers</a> (re merci Serge)</li>
</ol>
<p>Il s&#8217;agit d&#8217;une application AIR utilisant des NativeProcess (et packagée en ligne de commande vu que l&#8217;application n&#8217;existait pas avant&#8230; Remarquez, la version 2 et plus ont probablement été packagées avec la version 1&#8230; Mais je m&#8217;égare)</p>
<h2>Quelques liens</h2>
<ul>
<li>Un petit exemple d&#8217;application utilisant un NativeProcess : <a href="http://www.lafabrick.com/blog/2010/07/28/2092-zxpackager-application-pour-l%e2%80%99empaquetage-zxp-d%e2%80%99extensions-cs5/">ZXPackager</a></li>
<li><a lang="en_US" href="http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/desktop/NativeProcess.html">ASDoc de la classe NativeProcess [EN]</a></li>
<li><a lang="en_US" href="http://www.adobe.com/devnet/air/flex/quickstart/interacting_with_native_process.html">Un bon article pour démarrer [EN]</a></li>
</ul>
<p>Autres articles sur le même sujet
<ul>
<li><a href="http://www.lafabrick.com/blog/2008/02/04/299-un-projet-java-flex-avec-maven-2/" rel="bookmark" title="4 février 2008">Un projet Java / Flex avec Maven 2</a></li>
<li><a href="http://www.lafabrick.com/blog/2010/04/06/1754-arduino-2-flash-socket-et-processing/" rel="bookmark" title="6 avril 2010">Arduino #2 : Flash, socket et Processing</a></li>
<li><a href="http://www.lafabrick.com/blog/2010/07/28/2092-zxpackager-application-pour-l%e2%80%99empaquetage-zxp-d%e2%80%99extensions-cs5/" rel="bookmark" title="28 juillet 2010">ZXPackager : application pour l’empaquetage ZXP d’extensions CS5</a></li>
<li><a href="http://www.lafabrick.com/blog/2010/10/21/2272-rollingfiletarget-pour-air-2-0-lets-roll/" rel="bookmark" title="21 octobre 2010">RollingFileTarget pour AIR 2.0 : let&#8217;s roll !</a></li>
</ul>
<p><!-- Similar Posts took 14.305 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>6</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[linkedin]]></category>
		<category><![CDATA[zxp]]></category>

		<guid isPermaLink="false">http://www.lafabrick.com/blog/?p=2092</guid>
		<description><![CDATA[Vous l&#8217;aurez peut être remarqué, nous avons ajouté une rubrique Applications au blog. Nous travaillons actuellement sur plusieurs applications AIR orientées &#171;&#160;aide au développeur&#160;&#187;. ZXPackager est la première d&#8217;entre elles. Cette application propose un moyen simple de packager vos extensions CS5 développées avec le nouveau SDK Creative Suite. Les extensions ZXP Depuis la CS5, Adobe [...]]]></description>
			<content:encoded><![CDATA[<table width="100%">
<tbody>
<tr>
<td width="125px"><img class="aligncenter size-full wp-image-2099" src="http://www.lafabrick.com/blog/wp-content/uploads/2010/07/logo128.png" alt="" width="128" height="128" /></td>
<td width="100%">Vous l&#8217;aurez peut être remarqué, nous avons ajouté une rubrique <a href="http://www.lafabrick.com/blog/applications/">Applications</a> au blog. Nous travaillons actuellement sur plusieurs applications AIR orientées &laquo;&nbsp;aide au développeur&nbsp;&raquo;. ZXPackager est la première d&#8217;entre elles.</p>
<p>Cette application propose un moyen simple de packager vos extensions CS5 développées avec le nouveau SDK Creative Suite.</td>
</tr>
</tbody>
</table>
<p><span id="more-2092"></span></p>
<h2>Les extensions ZXP</h2>
<p>Depuis la CS5, Adobe propose un nouveau SDK de développement et un format d&#8217;extension commun a toute la suite logicielle.<br />
Ce SDK, <a href="http://www.adobe.com/devnet/creativesuite/sdk/eula_cs5_toolkit.html">disponible ici</a>, vous permet de développer vos propres panneaux et autres menus CS5. Le premier format de sortie est le MXP, toujours disponible, vous permettant d&#8217;exporter votre extension pour un logiciel cible.<br />
Maintenant, avec la CS5, vous disposez d&#8217;un format commun, le ZXP, qui rend compatible votre extension avec toutes la suites CS.</p>
<p>Un fichier ZXP est défini par un manifeste xml, définissant le fonctionnement de l&#8217;extension (type, portée logiciel, &#8230;), et contient le (les) SWF de l&#8217;extension (une extension est en fait une pseudo application AIR, basée sur le SDK CS). Un fichier ZXP est signé numériquement. Vous devez donc avoir un certificat (PKCS12, PKCS11, JKS). Vous pouvez bien entendu utiliser votre certificat auto-signé préalablement créé avec Flash/Flex Buider.</p>
<p>Pour plus d&#8217;informations :</p>
<ul>
<li><a href="http://www.adobe.com/devnet/creativesuite/sdk/index.html">Creative Suite SDK</a></li>
<li><a href="http://blogs.adobe.com/cssdk/">le blog CSSDK</a></li>
</ul>
<p>Un fichier ZXP doit (habituellement) être compilé en utilisant le packager Java <a href="http://www.adobe.com/devnet/creativesuite/sdk/eula_cs5_toolkit.html">UCF</a>. Et c&#8217;est là l&#8217;idée de cette petite application : ne pas avoir a redéfinir vos certificats et autres options pour chaque package, et vous proposer une interface plus &laquo;&nbsp;user friendly&nbsp;&raquo; que le terminal.</p>
<h2>Fonctionnement</h2>
<h3>Démarrage, et préférences</h3>
<p>Au premier démarrage, l&#8217;application doit obtenir vos préférences de base.</p>
<p><img class="aligncenter size-full wp-image-2100" title="Preferences" src="http://www.lafabrick.com/blog/wp-content/uploads/2010/07/Preferences.png" alt="Preferences" width="500" height="450" /></p>
<ul>
<li>
<h4>Java Home</h4>
<p>Vous devez indiquer le chemin vers votre JDK/JRE java, si celui-ci ne correspond pas à celui par défaut (l&#8217;application intègre le packager jar UCF, et elle doit connaître le répertoire racine de Java pour pouvoir le lancer). Les chemins racines par défaut sont:</p>
<ul>
<li>Pour Windows : <strong>&#8216;C:\Program Files\Java\jdk1.6.0&#8242;</strong></li>
<li>Pour Mac : <strong>&#8216;/System/Library/Frameworks/JavaVM.framework/Versions/1.6.0&#8242;</strong></li>
</ul>
</li>
<li>
<h4>Certificat</h4>
<p>Vous devez préciser l&#8217;emplacement de votre certificat (généralement un fichier de type .p12 ou .p11), ainsi que votre mot de passe. Ces informations sont nécessaires pour la signature de l&#8217;extension.</p>
<ul>
<li>
<h4>Fichier cible</h4>
<p>Vous devez indiquer le fichier de destination. L&#8217;extension .zxp est ajoutée automatiquement.</li>
<li>
<h4>Source de l&#8217;extension</h4>
</li>
<p>Les sources de l&#8217;extension, comme défini dans la nomenclature du SDK CS, doivent correspondre à ce schéma:</p>
<p><img class="aligncenter size-full wp-image-2096" src="http://www.lafabrick.com/blog/wp-content/uploads/2010/07/binPackageOverview.png" alt="" width="537" height="80" /><br />
Ce répertoire est construit préalablement par la tâche ant de compilation, dans votre projet (cf. en fin d&#8217;article, le téléchargement du projet test d&#8217;extension)<br />
Vous devez pointer sur le répertoire &laquo;&nbsp;bin&nbsp;&raquo;.</ul>
<ul>
<li>Démarrer un nouveau package;</li>
<li>Ouvrir et installer l&#8217;extension via Extension Manager (vous devez bien entendu avoir préalablement installé Extension Manager CS5)</li>
</ul>
<ul>
<li><a href="http://lafabrick.com/applications/zxpackager/extensionTest.fxp">Projet fxp</a></li>
<li><a href="http://lafabrick.com/applications/zxpackager/bin.zip">Archive zip du bin de test</a></li>
</ul>
</li>
<h3>Définition de votre extension</h3>
<p>Un package ZXP a besoin de 2 informations : le nom et l&#8217;emplacement de votre extension cible, et l&#8217;endroit où se trouve le répertoire &laquo;&nbsp;bin&nbsp;&raquo; de votre extension.</p>
<p><img class="aligncenter size-full wp-image-2102" title="StartProject" src="http://www.lafabrick.com/blog/wp-content/uploads/2010/07/StartProject.png" alt="start package" width="500" height="450" /></p>
<p>Une fois le packaging démarré, un message d&#8217;attente s&#8217;affiche.</p>
<p><img class="aligncenter size-full wp-image-2103" src="http://www.lafabrick.com/blog/wp-content/uploads/2010/07/waiting-mini.png" alt="" width="467" height="48" /></p>
<h3>Finalisation</h3>
<p>Une fois le package créé, l&#8217;application vous propose de :</p>
<p><img class="aligncenter size-full wp-image-2097" title="completed" src="http://www.lafabrick.com/blog/wp-content/uploads/2010/07/completed.png" alt="" width="500" height="450" /></p>
<h2>Téléchargements</h2>
<h3>ZXPackager</h3>
<table>
<tbody>
<tr>
<td width="128"><a href="http://www.lafabrick.com/applications/zxpackager/ZXPackager-MAC.zip"><img class="aligncenter size-full wp-image-2137" title="macPackageExport" src="http://www.lafabrick.com/blog/wp-content/uploads/2010/07/macPackageExport.png" alt="" width="128" height="128" /></a></td>
<td width="128"><a href="http://www.lafabrick.com/applications/zxpackager/ZXPackager-WIN.zip"><img class="aligncenter size-full wp-image-2137" title="winPackageExport" src="http://www.lafabrick.com/blog/wp-content/uploads/2010/07/winPackageExport.png" alt="" width="128" height="128" /></a></td>
</tr>
</tbody>
</table>
<h3>Extension de test</h3>
</ul>
<p>Autres articles sur le même sujet
<ul>
<li><a href="http://www.lafabrick.com/blog/2007/09/04/206-flex-3-beta-rsolution-de-bug-comment-placer-fichier-d-application/" rel="bookmark" title="4 septembre 2007">[Flex 3 Beta] bug : Application File doesn&#8217;t exist</a></li>
<li><a href="http://www.lafabrick.com/blog/2008/02/04/299-un-projet-java-flex-avec-maven-2/" rel="bookmark" title="4 février 2008">Un projet Java / Flex avec Maven 2</a></li>
<li><a href="http://www.lafabrick.com/blog/2010/08/20/2167-air-2-appeler-un-jar-executable-via-un-nativeprocess/" rel="bookmark" title="20 août 2010">AIR 2 : appeler un JAR exécutable via un NativeProcess</a></li>
<li><a href="http://www.lafabrick.com/blog/2010/10/21/2272-rollingfiletarget-pour-air-2-0-lets-roll/" rel="bookmark" title="21 octobre 2010">RollingFileTarget pour AIR 2.0 : let&#8217;s roll !</a></li>
</ul>
<p><!-- Similar Posts took 13.463 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>La Fabrick</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.629 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>21</slash:comments>
		<feedburner:origLink>http://www.lafabrick.com/blog/2010/07/28/2023-ca-envoie/</feedburner:origLink></item>
	</channel>
</rss>

