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

<channel>
	<title>Java - Freelance . fr</title>
	<atom:link href="http://www.java-freelance.fr/feed" rel="self" type="application/rss+xml" />
	<link>http://www.java-freelance.fr</link>
	<description>Du java et du freelance</description>
	<lastBuildDate>Thu, 10 May 2012 07:45:52 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Devoxx</title>
		<link>http://www.java-freelance.fr/java/devoxx</link>
		<comments>http://www.java-freelance.fr/java/devoxx#comments</comments>
		<pubDate>Thu, 10 May 2012 07:45:52 +0000</pubDate>
		<dc:creator>Jean-Baptiste</dc:creator>
				<category><![CDATA[Freelance]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[devoxx]]></category>

		<guid isPermaLink="false">http://www.java-freelance.fr/?p=1277</guid>
		<description><![CDATA[			
			

Devoxx France en deux mots : C&#8217;est la plus grande et la plus intéressante des conférences pour les développeurs Java en France.
Pour moi, ce fut une expérience formidable. En plus d&#8217;avoir appris quelques trucs, ce qui m&#8217;a fait le plus plaisir c&#8217;est d&#8217;avoir été conforté sur pas mal de choix que j&#8217;ai pu faire ou [...]]]></description>
			<content:encoded><![CDATA[			
			
<div><a href="http://www.devoxx.fr"><img class="aligncenter size-full wp-image-1280" title="fond_web_devoxx_france" src="http://www.java-freelance.fr/wp-content/uploads/2012/04/fond_web_devoxx_france1.gif" alt="" width="430" height="38" /></a></div>
<p>Devoxx France en deux mots : C&#8217;est la plus grande et la plus intéressante des conférences pour les développeurs Java en France.</p>
<p>Pour moi, ce fut une expérience formidable. En plus d&#8217;avoir appris quelques trucs, ce qui m&#8217;a fait le plus plaisir c&#8217;est d&#8217;avoir été conforté sur pas mal de choix que j&#8217;ai pu faire ou que je comptais appliquer  prochainement. Hormis l&#8217;absence de desserts sucrés et le nombre limité de boissons, l&#8217;organisation fut parfaite. Un grand bravo aux organisateurs !</p>
<p>J&#8217;ai choisi d&#8217;illustrer ces trois jours de conférences par une série d&#8217;articles qui racontent ce que pourrait être une success story pour un développeur Java ayant eu une &laquo;&nbsp;idée&nbsp;&raquo; :</p>
<div><span id="more-1277"></span></div>
<div>
<ol>
<li><a href="http://www.java-freelance.fr/java/travailler-son-idee-lean-startup-devoxx-17" target="_blank">Travailler son idée pour viser juste (Lean Startup)</a></li>
<li><a href="http://www.java-freelance.fr/java/les-societes-cooperatives-devoxx-27" target="_blank">Créer une organisation innovante</a></li>
<li><a href="http://www.java-freelance.fr/java/architecture-woa-et-cqrs-devoxx-34" target="_blank">Définir l&#8217;architecture</a></li>
<li>Automatiser !</li>
</ol>
</div>
<p>Pour la petite histoire, je craignais au début que limiter à 25% le nombre de speakers anglophones allait mathématiquement faire baisser le niveau des speakers. Cela c&#8217;est avéré faux, le niveau des Français fut excellent, même meilleurs que les anglophones que j&#8217;ai pu voir. Bravo à tous et vive la France !</p>
<p>Quant à moi (beaucoup m&#8217;ont posé la question),  si je n&#8217;ai rien présenté et que je n&#8217;ai pas non plus voulu participer à la préparation de cette première de Devoxx France bien que je sois un Geek Passionné avec plein de choses à raconter, c&#8217;est que j&#8217;ai déjà beaucoup de projets en cours et  je pense qu&#8217;il est important de garder un certain équilibre entre vie professionnelle, loisirs, famille et amis afin de ne pas finir en &laquo;&nbsp;burnout&nbsp;&raquo; (En passant j&#8217;ai bien rigolé en lisant <a href="http://501manifesto.org/">http://501manifesto.org/</a> ).</p>
<p>Je remercie ma société de m&#8217;avoir payé la conférence ainsi que l&#8217;hôtel au Marriott (4 étoiles c&#8217;est la classe !). Et si vous n&#8217;êtes pas encore Freelance ou que vous ne faites pas partie d&#8217;une société qui vous laisse gérer votre budget tel que <a href="http://www.lateral-thoughts.com" target="_blank">Lateral Thoughts</a>, il est peut être temps d&#8217;y réfléchir&#8230;</p>
<p>A l&#8217;année prochaine à Devoxx !</p>

]]></content:encoded>
			<wfw:commentRss>http://www.java-freelance.fr/java/devoxx/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Architecture WOA et CQRS (Devoxx 3/4)</title>
		<link>http://www.java-freelance.fr/java/architecture-woa-et-cqrs-devoxx-34</link>
		<comments>http://www.java-freelance.fr/java/architecture-woa-et-cqrs-devoxx-34#comments</comments>
		<pubDate>Sun, 06 May 2012 07:17:51 +0000</pubDate>
		<dc:creator>Jean-Baptiste</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[architecture]]></category>
		<category><![CDATA[CQRS]]></category>
		<category><![CDATA[devoxx]]></category>
		<category><![CDATA[rest]]></category>
		<category><![CDATA[woa]]></category>

		<guid isPermaLink="false">http://www.java-freelance.fr/?p=1355</guid>
		<description><![CDATA[			
			
Alors que certains embourbés dans JSF sont allés voir comment réduire leurs souffrances, j&#8217;ai préféré m&#8217;intéresser à des sujets d&#8217;actualités afin de voir comment faire une application de demain avec les technologies de demain. C&#8217;est le choix que souhaite également faire Gérard notre startupeur. Comment ne pas se tromper ? La technologie évolue vite et [...]]]></description>
			<content:encoded><![CDATA[			
			
<p>Alors que certains embourbés dans JSF sont allés voir comment réduire leurs <a href="https://twitter.com/#!/hguergachi/status/192521776851451905" target="_blank">souffrances</a>, j&#8217;ai préféré m&#8217;intéresser à des sujets d&#8217;actualités afin de voir comment faire une application de demain avec les technologies de demain. C&#8217;est le choix que souhaite également faire Gérard notre startupeur. Comment ne pas se tromper ? La technologie évolue vite et il est impossible de choisir une technologie aujourd&#8217;hui en étant certain qu&#8217;elle ne sera pas obsolète demain. Ce que je retiens des présentations de <a href="http://zenexity.fr/" target="_blank">Guillaume Bort, Sadek Drobi (Play!), Habib Guergachi (WOA)</a>, <a href="http://www.bertails.org/" target="_blank">Alexandre Bertails (Linked Data)</a> et <a href="http://thinkbeforecoding.com/" target="_blank">Jérémie Chassaing (CQRS)</a> c&#8217;est que les concepts qui vont servir de base à nos architectures sont plus importants que les technologies elles-mêmes.</p>
<p><span id="more-1355"></span></p>
<h2>Web Oriented Architecture</h2>
<p>Avant d&#8217;être Startupeur, Gérard était architecte urbaniste respecté et vénéré. Mais trop souvent, il a essayé de plier le web pour faire des applications dites &laquo;&nbsp;Stateful&nbsp;&raquo; où l&#8217;état du client est conservé côté serveur via les sessions. Ce qui amène pas mal de problèmes, en terme de performance bien sûr, car il est du coup difficile d&#8217;avoir un cache efficace, mais aussi des problèmes de développement, qui n&#8217;a jamais galéré à gérer le bouton &laquo;&nbsp;back&nbsp;&raquo; et à devoir mettre un bouton &laquo;&nbsp;back&nbsp;&raquo; spécifique dans son application alors que le navigateur lui-même en possède déjà un ?</p>
<p>La présentation de Habib, qui s&#8217;approche de la keynote a hypnotisé le public (et Gérard) en cassant les architectures dites &laquo;&nbsp;stateful&nbsp;&raquo; et antiweb, celle de Sadek et Guillaume montre que Play! pousse le développeur à embrasser le Web plutôt qu&#8217;à lutter contre lui.</p>
<p>Mais au fait c&#8217;est quoi une architecture Web ?</p>
<ul>
<li>Ressource based : Utilisation des URI et des mediatypes pour identifier et exprimer les &laquo;&nbsp;ressources&nbsp;&raquo; fournies par l&#8217;application</li>
<li>Stateless : L&#8217;état de la conversation est gérée côté client, dans le browser. Le client change l&#8217;état de l&#8217;application via des commandes au serveur (verbes http PUT, POST et DELETE)</li>
<li>HTTP powered : Utilisation du protocole HTTP et de ses verbes à bon escient : PUT, POST, DELETE, GET. Une application qui embrasse le web est une application qui ne fait que du CRUD.</li>
</ul>
<p>WAT ? Mais comment va faire Gérard pour ne faire que du CRUD ? Son application fait des vrais trucs de barbus.</p>
<p>En fait c&#8217;est super simple, lorsque vous avez de faire un truc &laquo;&nbsp;compliqué&nbsp;&raquo; (qui n&#8217;est pas CRUD), comme par exemple, déplacer une somme d&#8217;argent d&#8217;un compte A (ressource) à un compte B (autre ressource) vous n&#8217;allez, côté client ni demander de modifier le compte A, ni demander de modifier le compte B, mais ajouter  une ressource à votre système (via un PUT) et ça, ben c&#8217;est du CRUD. Cette commande déclenchera l&#8217;exécution de notre traitement métier &laquo;&nbsp;complexe&nbsp;&raquo; de manière &laquo;&nbsp;Atomic&nbsp;&raquo; et &laquo;&nbsp;Asynchrone&nbsp;&raquo; (Toi qui es perspicace tu auras reconnu l&#8217;objet bancaire <em><strong>Transaction )</strong> </em></p>
<p>Ceci permet d&#8217;avoir entre autre une interface réactive, car l&#8217;envoie d&#8217;une commande dans une  queue est d&#8217;une complexité constante.</p>
<p>Ha oui mais du coup, quand on va requêter pour savoir combien il y a sur le compte B il va falloir parcourir toutes les transactions ! (Gérard est fier de sa perspicacité)</p>
<p>Biensûr que non !! La solution est dans le chapitre en dessous avec CQRS, on va séparer le modèle métier d&#8217;écriture et le modèle métier de lecture et pré-calculer, dé-normaliser pour être efficace autant en écriture qu&#8217;en lecture.</p>
<p>Pour aller plus loin : <a href="https://code.google.com/p/implementing-rest/wiki/RMM" target="_blank">Implementing REST</a></p>
<h2>CQRS</h2>
<p>Le lien fort entre CQRS  et la WOA, c&#8217;est le CRUD, une architecture CQRS est une architecture à base de commande, comme en WOA, l&#8217;idée est de créer des commandes plutôt que de modifier plusieurs entités du modèle. Cela revient donc à faire du CRUD, comme en WOA.</p>
<p><a href="http://martinfowler.com/bliki/CQRS.html"><img class="alignleft size-full wp-image-1375" title="CQRS" src="http://www.java-freelance.fr/wp-content/uploads/2012/05/cqrs.png" alt="" width="550" height="401" /></a></p>
<p>Une architecture CQRS  (Command Query Responsabilty Segragation) sépare le modèle d&#8217;écriture du modèle de lecture  ce qui va permettre :</p>
<ul>
<li>De ne pas fetcher d&#8217;informations inutiles (On n&#8217;a pas besoin du nom du client B pour calculer le solde du client A &#8230;) Qui n&#8217;a jamais du fetcher des informations inutiles parce que le modèle est unique pour toute l&#8217;application ?</li>
<li>De pré-calculer de manière asynchrone toutes les opérations fortement demandées pour s&#8217;approcher d&#8217;une complexité constante ( ou linéaire, mais sur un nombre réduit d&#8217;éléments).</li>
</ul>
<p>Bien, se dit Gérard, mais si je suis asynchrone, je ne vais pas voir tout de suite le résultat de ma transaction sur mon compte ! C&#8217;est vrai. Mais ce n&#8217;est pas grave il faut être &laquo;&nbsp;relax&nbsp;&raquo;, Habid appelle ça la &laquo;&nbsp;relaxation temporelle&nbsp;&raquo;.</p>
<p>Pour aller plus loin :</p>
<ul>
<li><a href="http://martinfowler.com/bliki/CQRS.html" target="_blank">CQRS by Martin Fowler</a></li>
<li><a href="http://www.slideshare.net/jeremiechassaing/prsentation-cqrs-devoxxfr" target="_blank">Le slides de Jérémie Chassaing (CQRS)</a></li>
</ul>
<h3>Le mot de la fin</h3>
<p>Maintenant qu&#8217;on ne fait que du CRUD, du Stateless et de l&#8217;asynchrone, cela permet de découper facilement nos applications en plusieurs petites applications ou API qui ne traitent que d&#8217;une seule problématique, réduisant encore la complexité du système d&#8217;information. Les applications web &laquo;&nbsp;finales&nbsp;&raquo; agrègent ensuite ces  API pour présenter quelque chose de &laquo;&nbsp;complet&nbsp;&raquo; à l&#8217;utilisateur final. Évidement ces APIs simples et &laquo;&nbsp;unitaires&nbsp;&raquo; sont réutilisables par autant d&#8217;applicatifs finaux que nécessaires, permettant ainsi une ré-utilisatibilité et une interopérabilité maximale.</p>
<p>Appelez ça comme vous voulez, WOA, REST, CQRS, HTTP, Web. <strong>L&#8217;avenir est dans la simplicité du CRUD, l&#8217;asynchrone et le Stateless</strong>.  C&#8217;est aussi l&#8217;avis de Gérard. Est-ce le vôtre ?</p>

]]></content:encoded>
			<wfw:commentRss>http://www.java-freelance.fr/java/architecture-woa-et-cqrs-devoxx-34/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Une organisation innovante (Devoxx 2/4)</title>
		<link>http://www.java-freelance.fr/java/les-societes-cooperatives-devoxx-27</link>
		<comments>http://www.java-freelance.fr/java/les-societes-cooperatives-devoxx-27#comments</comments>
		<pubDate>Fri, 27 Apr 2012 07:45:19 +0000</pubDate>
		<dc:creator>Jean-Baptiste</dc:creator>
				<category><![CDATA[Freelance]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[devoxx]]></category>
		<category><![CDATA[sas]]></category>
		<category><![CDATA[scop]]></category>
		<category><![CDATA[ssii coopérative]]></category>
		<category><![CDATA[startup]]></category>

		<guid isPermaLink="false">http://www.java-freelance.fr/?p=1323</guid>
		<description><![CDATA[			
			

Yeah ! Maintenant que Gérard a son business plan qui roule, qu&#8217;il a mis en ligne un premier prototype et que les premiers clients commencent à taper au portillon, il est temps de passer à la vitesse supérieure : Créer sa société.
A Devoxx un quickie à particulièrement attiré mon attention : Celui de Andrew Spencer [...]]]></description>
			<content:encoded><![CDATA[			
			
<p><a href="http://www.java-freelance.fr/wp-content/uploads/2012/04/Image_accueil.jpg" target="_blank"><img class="alignleft size-full wp-image-1343" style="margin-left: 5px; margin-right: 5px;" title="sociocratie" src="http://www.java-freelance.fr/wp-content/uploads/2012/04/Image_accueil.jpg" alt="" width="240" height="159" /></a></p>
<p>Yeah ! Maintenant que Gérard a son <a href="http://www.java-freelance.fr/java/travailler-son-idee-lean-startup-devoxx-17" target="_blank">business plan qui roule</a>, qu&#8217;il a mis en ligne un premier prototype et que les premiers clients commencent à taper au portillon, il est temps de passer à la vitesse supérieure : Créer sa société.</p>
<p>A Devoxx un quickie à particulièrement attiré mon attention : Celui de <a href="http://www.andrewspencer.net/" target="_blank">Andrew Spencer</a> sur son idée de faire une SSII Coopérative. Ce qui est marrant c&#8217;est que c&#8217;est ce que nous avons fait depuis quelques mois en créant <a href="http://www.lateral-thoughts.com" target="_blank">Lateral-Thoughts</a>.</p>
<h2><span id="more-1323"></span></h2>
<h2>Pourquoi une SSII coopérative ?</h2>
<p>Appliquons le &laquo;&nbsp;<a href="http://www.java-freelance.fr/java/travailler-son-idee-lean-startup-devoxx-17" target="_blank">Lean Canvas</a>&nbsp;&raquo; et répondons à quelques questions :</p>
<ul>
<li><em>Problem:</em> En SSII il n&#8217;y a pas d&#8217;argent, pas de fun et pas de liberté, l&#8217;innovation n&#8217;est pas encouragée.</li>
<li><em>Solution: </em>Faisons une SSII qui donne de l&#8217;argent (tous actionnaires) du timeoff pour le fun et l&#8217;innovation et de la liberté d&#8217;action (management plat).</li>
<li><em>Key metrics : </em>Salaires moyen (Argent), Satisfaction des membres (Fun et Liberté)</li>
<li><em>Uniq Value Proposition : </em>Une bande de développeurs passionnés et auto-organisés qui s&#8217;éclatent à faire en codant et en apprenant ensemble.</li>
<li><em>Unfair advantage: </em>On s&#8217;en fout, copiez nous, ça nous fera plaisir. D&#8217;un point de vue business : Nos réseaux, notre toile &laquo;&nbsp;unique&nbsp;&raquo;</li>
<li><em>Channels:</em> Les réseaux de nos membres, leur rayonnance. Ce blog et d&#8217;autres ^^</li>
<li><em>Customer segments:</em> Les PME, grands comptes et startups.</li>
<li><em>Cost Structure: </em>Quasiment rien, un comptable à 1000€ / an. Pas de locaux. Pas de commerciaux. Pas de managers. Pas de boss.</li>
<li><em>Revenue Streams:</em> Prestations, Formations, Editions de solutions logicielles.</li>
</ul>
<p>Il s&#8217;agit du canvas pour Lateral Thoughts mais vous pouvez tout à fait imaginer votre propre SSII coopérative pour répondre à une autre problématique. L&#8217;exemple du réseau <a href="http://www.libre-entreprise.org/charte" target="_blank">libre-entreprise</a> en est un autre.</p>
<h2>Et pour ma startup ?</h2>
<p>Les startupeurs sont des gens innovants. Le problème c&#8217;est qu&#8217;une fois que le produit est devenu &laquo;&nbsp;Legacy&nbsp;&raquo; où passe l&#8217;innovation ? Généralement on revend la structure et on part créer autre chose. Sauf qu&#8217;il n&#8217;est pas aisé de réussir à chaque fois, surtout lorsqu&#8217;on a qu&#8217;un seul cerveau. Pourquoi ne pas mettre en place dès le départ dans sa société une organisation qui permettra à l&#8217;innovation d&#8217;émerger et ce, de manière durable ? Certains l&#8217;ont très bien réussi, je pense à <a href="http://www.gore.com/en_xx/aboutus/index.html" target="_blank">W.L. Gore</a>, <a href="http://www.wholefoodsmarket.com/company/declaration.php" target="_blank">Whole Foods</a> ou Google. Il suffit de copier, tous leurs secret sont expliqués dans ce livre : <a href="http://www.amazon.fr/gp/product/1422102505/ref=as_li_ss_tl?ie=UTF8&amp;tag=javafree-21&amp;linkCode=as2&amp;camp=1642&amp;creative=19458&amp;creativeASIN=1422102505">The Future of Management</a><img style="border: none !important; margin: 0px !important;" src="http://www.assoc-amazon.fr/e/ir?t=javafree-21&amp;l=as2&amp;o=8&amp;a=1422102505" border="0" alt="" width="1" height="1" /></p>
<p>La clé du management du futur et de passer par des sociétés coopératives, le modèle le plus connu est celui de la <a href="http://sociocratie.net/">sociocratie</a> que je résume en quelques points ici :</p>
<ul>
<li>Une personne = une voix</li>
<li>Transparence totale (même et surtout du compte bancaire)</li>
<li>Décision prise par consensus (tout le monde, à défaut d&#8217;être d&#8217;accord doit consentir pour qu&#8217;une décision soit prise)</li>
</ul>
<p>Ce type de société à un coût, car une décision prise par consensus prend du temps alors qu&#8217;en société standard, le patron prend les décisions le matin seul dans sa douche. Mais le jeu en vaut la chandelle. Les membre d&#8217;une telle société donnent le meilleur d&#8217;eux-mêmes, ils se sentent investis, ils se sentent d&#8217;une même famille avec un but commun, mais aussi des objectifs individuels (qui ne vont pas contre les objectifs collectifs). La transparence fait que chacun a conscience de l&#8217;objectif de l&#8217;entreprise, de son business. Et chacun en est responsable.</p>
<p>Alors maintenant, qu&#8217;allez-vous faire ? Allez-vous continuez à subir ou <strong>allez-vous prendre votre vie en main</strong> (en intégrant une société coopérative) ?</p>

]]></content:encoded>
			<wfw:commentRss>http://www.java-freelance.fr/java/les-societes-cooperatives-devoxx-27/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Travailler son idée &#8211; Lean Startup (Devoxx 1/4)</title>
		<link>http://www.java-freelance.fr/java/travailler-son-idee-lean-startup-devoxx-17</link>
		<comments>http://www.java-freelance.fr/java/travailler-son-idee-lean-startup-devoxx-17#comments</comments>
		<pubDate>Wed, 25 Apr 2012 07:45:42 +0000</pubDate>
		<dc:creator>Jean-Baptiste</dc:creator>
				<category><![CDATA[Freelance]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[devoxx]]></category>
		<category><![CDATA[idée]]></category>
		<category><![CDATA[lean canvas]]></category>
		<category><![CDATA[startup]]></category>

		<guid isPermaLink="false">http://www.java-freelance.fr/?p=1293</guid>
		<description><![CDATA[			
			
C&#8217;est l&#8217;histoire d&#8217;un développeur Java qui a une idée. Tout ce qu&#8217;il a de plus banal me direz vous. Appelons ce développeur trentenaire &#171;&#160;Gérard&#160;&#187;
En bon petit développeur Java, Gérard garde sa petite idée pour lui, développe la nuit et pendant ses congés pour finalement sortir de l&#8217;ombre et mettre en ligne THE application (pour l&#8217;instant [...]]]></description>
			<content:encoded><![CDATA[			
			
<p>C&#8217;est l&#8217;histoire d&#8217;un développeur Java qui a une idée. Tout ce qu&#8217;il a de plus banal me direz vous. Appelons ce développeur trentenaire &laquo;&nbsp;Gérard&nbsp;&raquo;</p>
<p>En bon petit développeur Java, Gérard garde sa petite idée pour lui, développe la nuit et pendant ses congés pour finalement sortir de l&#8217;ombre et mettre en ligne THE application (pour l&#8217;instant hébergée directement sur son ordinateur personnel)</p>
<p>Et là, vous connaissez la suite, ça fait psssiiichhhhhttt. L&#8217;idée n&#8217;est pas trop mal mais :</p>
<p><span id="more-1293"></span></p>
<ul>
<li>Elle n&#8217;atteint pas exactement la cible</li>
<li>Il n&#8217;existe aucun vecteur pour que le client soit informé du produit</li>
<li>Gérard n&#8217;a pas prévu de façon de gagner de l&#8217;argent</li>
<li>Finalement, l&#8217;heure de gloire arrive enfin, un groupe de chinois tombe sur son site et  le copie en deux jours&#8230; (c&#8217;était bien la peine de l&#8217;avoir gardé secrète ton idée Gérard ! )</li>
</ul>
<p>Ce que nous apprend <a href="https://twitter.com/#!/CamilleRoux" target="_blank">Camille Roux</a> lors de son talk à Devoxx (et sur  <a href="http://www.slideshare.net/camilleroux/comment-tester-et-amliorer-son-ide-en-un-minimum-de-temps-devoxx" target="_blank">slideshare</a>) c&#8217;est qu&#8217;une idée n&#8217;a pas de valeur, tout le monde à des idées. Ce qui a de la valeur c&#8217;est sa réalisation. Il nous raconte que lors d&#8217;un startup week-end, il s&#8217;est retrouvé avec six profils &laquo;&nbsp;business&nbsp;&raquo;. Six business-men qui ne savent pas coder, mais comment allait il pouvoir les occuper ?</p>
<p>Et là surprise, il existe un autre monde, un monde qui n&#8217;est pas le monde du développement et qui a aussi des méthodes et des outils qui ont fait leurs preuves.</p>
<h2>Lean Canvas</h2>
<p>Camille nous présente l&#8217;un de ces outils : le &laquo;&nbsp;Lean Canvas&nbsp;&raquo; et conseil que<strong> tous les voyants soient au vert avant de commencer le développement du produit</strong>.</p>
<p style="text-align: center;"><a href="http://www.slideshare.net/camilleroux/comment-tester-et-amliorer-son-ide-en-un-minimum-de-temps-devoxx"><img class="size-full wp-image-1295 aligncenter" title="Lean Canvas" src="http://www.java-freelance.fr/wp-content/uploads/2012/04/Lean-Canvas.jpg" alt="" width="438" height="245" /></a></p>
<ul>
<li><em>Problem :</em> Quels problèmes résolvez vous ? Moins vous en résolvez, mieux c&#8217;est.</li>
<li><em>Solution :</em> Quelles solutions apportez vous ? Moins vous en apportez, mieux c&#8217;est.</li>
<li><em>Key Metrics :</em> Quels seront les indicateurs qui vont vous permettre de valider le succès de votre idée ? (Ex : le nombre de visites, d&#8217;utilisateurs ou de produits vendus)</li>
<li><em>Unique Value Proposition :</em> Qu&#8217;est-ce que vous apportez que les concurrents n&#8217;apportent pas ?</li>
<li><em>Unfair advantage :</em> Pourquoi on ne pourra pas vous copier facilement (Ex : une image de marque)</li>
<li><em>Customer segments : </em>Votre cible (Ex : La gamine de 13 ans avec un forfait bloqué à dépenser)</li>
<li><em>Channels :</em> Comment allez-vous atteindre votre cible ? (Ex : j&#8217;ai déjà un site qui fait 10 000 visites de ma cible par jour)</li>
</ul>
<p>Pour remplir le tableau n&#8217;hésitez pas à parler de votre idée à vos amis, votre famille, au barman du coin ou évidemment à des représentant de votre cible. Une fois que tous les indicateurs sont au vert, vous vous rendrez compte que votre idée initiale n&#8217;est pas tout à fait la même qu&#8217;au départ, <strong>elle est largement meilleure</strong>.</p>
<p>Ce qui est marrant c&#8217;est que je me suis exercé à cette technique sur plusieurs types de projets et à chaque fois cela m&#8217;a apporté quelque chose. Même sur un projet open-source, même sur un projet d&#8217;entreprise de type &laquo;&nbsp;service&nbsp;&raquo;.</p>
<p>Pour aller plus loin :</p>
<ul>
<li><a href="http://www.amazon.fr/gp/product/1449305172/ref=as_li_ss_tl?ie=UTF8&amp;tag=javafree-21&amp;linkCode=as2&amp;camp=1642&amp;creative=19458&amp;creativeASIN=1449305172">Running Lean: Iterate from Plan A to a Plan That Works</a><img style="border: none !important; margin: 0px !important;" src="http://www.assoc-amazon.fr/e/ir?t=javafree-21&amp;l=as2&amp;o=8&amp;a=1449305172" border="0" alt="" width="1" height="1" /></li>
<li><a href="http://www.amazon.fr/gp/product/0470876417/ref=as_li_ss_tl?ie=UTF8&amp;tag=javafree-21&amp;linkCode=as2&amp;camp=1642&amp;creative=19458&amp;creativeASIN=0470876417">Business Model Generation: A Handbook for Visionaries, Game Changers, and Challengers</a><img style="border: none !important; margin: 0px !important;" src="http://www.assoc-amazon.fr/e/ir?t=javafree-21&amp;l=as2&amp;o=8&amp;a=0470876417" border="0" alt="" width="1" height="1" /></li>
</ul>
<h2>Tester son idée</h2>
<p>Maintenant que l&#8217;idée de Gérard a été retravaillée, il est temps de commencer à coder ! Enfin presque, pour tester une idée, un prototype c&#8217;est bien, mais il existe d&#8217;autres façons :</p>
<ul>
<li><em>Le questionnaire:</em> Faites en un ! Pour savoir notamment si quelqu&#8217;un serait prêt à payer pour telle ou telle fonctionnalité. Ainsi vous pourrez démarrer avec la fonctionnalité qui a le plus de valeur et peut-être même avec déjà des clients !</li>
<li><em>Sortez ! </em> C&#8217;est en sortant, en allant voir vos futurs utilisateurs que vous aurez de nouvelles idées d&#8217;améliorations de votre produit,  en voyant comment ils travaillent et quels sont leurs problèmes.</li>
<li><em>Un article de blog: </em>Si je blogue sur mon idée et que ça buzze, c&#8217;est que je suis certainement sur la bonne voie. C&#8217;est aussi une façon d&#8217;obtenir du feedback.</li>
<li><em>Le prototype :</em> Enfin ! Nous allons coder. Mais là encore il s&#8217;agit de tester une idée, n&#8217;allons donc pas perdre de temps à faire une architecture scalable du feu de dieu, le truc c&#8217;est de développer vite mais aussi de développer quelque chose d&#8217;agréable à voir. N&#8217;hésitez pas à recruter votre pote designer à cette étape là, sinon vous pouvez utiliser <a href="http://twitter.github.com/bootstrap/" target="_blank">Twitter bootstap</a> ou acheter un CSS sur <a href="http://themeforest.net/" target="_blank">themeforest</a> (c&#8217;est ce que j&#8217;ai fait pour <a href="http://www.buildwall.com" target="_blank">buildwall.com</a> ). Camille est un développeur Ruby, il nous explique que pour développer une page de type CRUD, il ne faut pas y passer plus de 15min&#8230; En Java on ira jeter un oeil à <a href="http://www.springsource.org/spring-roo" target="_blank">Spring Roo</a> ou <a href="http://www.playframework.org/" target="_blank">Play! framework</a></li>
</ul>
<p><strong>Et maintenant, qu&#8217;allez-vous faire de vos idées (et de votre vie)  ?</strong></p>
<p><strong> </strong></p>

]]></content:encoded>
			<wfw:commentRss>http://www.java-freelance.fr/java/travailler-son-idee-lean-startup-devoxx-17/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>@Author ?</title>
		<link>http://www.java-freelance.fr/java/author</link>
		<comments>http://www.java-freelance.fr/java/author#comments</comments>
		<pubDate>Sun, 08 Apr 2012 08:02:29 +0000</pubDate>
		<dc:creator>Mathilde</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[broutille]]></category>
		<category><![CDATA[débat sans fin]]></category>
		<category><![CDATA[Divers]]></category>

		<guid isPermaLink="false">http://www.java-freelance.fr/?p=1269</guid>
		<description><![CDATA[			
			
En discutant de l&#8217;intérêt de l&#8217;usage de la javadoc, question primordiale il faut l&#8217;avouer, nous avons dérivé sur un sujet encore plus intéressant : l&#8217;utilité de la balise @Author dans la javadoc :p Meme si sur Twitter, le @Author est considéré comme inutile, quasiment à l&#8217;unanimité, ce n&#8217;est pas le cas partout.
Le pour
- Je suis [...]]]></description>
			<content:encoded><![CDATA[			
			
<p>En discutant de l&#8217;intérêt de l&#8217;usage de la javadoc, question primordiale il faut l&#8217;avouer, nous avons dérivé sur un sujet encore plus intéressant : l&#8217;utilité de la balise @Author dans la javadoc :p Meme si sur Twitter, le @Author est considéré comme inutile, quasiment à l&#8217;unanimité, ce n&#8217;est pas le cas partout.</p>
<h2>Le pour</h2>
<p>- Je suis auteur de mon code, je l&#8217;assume et je l&#8217;écris de manière professionnelle en pensant à ceux qui vont me lire. C&#8217;est une idée que partage Robert C. Martin.</p>
<blockquote><p>The @author field of a Javadoc tells us who we are. We are authors. And one thing about authors is that they have readers. Indeed, authors are responsible for communicating well with their readers. The next time you write a line of code, remember you are an author, writing for readers who will judge your effort.</p></blockquote>
<p>- Surtout dans l&#8217;open-source, cela permet de laisser une trace de son investissement. Voir de se faire un nom.<br />
- Il peut contenir l&#8217;adresse d&#8217;une mailing-list, ce qui permet, lors d&#8217;une question sur une classe de contacter directement les personnes responsables.</p>
<h2>Le contre</h2>
<p>- DRY : don&#8217;t repeat yourself : l&#8217;information est déja présente dans le SCM (git, svn ..).<br />
- Le code appartient à tous : le @author doit donc etre collectif.<br />
- Si il ne contient que l&#8217;auteur initial, celui-ci ne vaut pas plus que les autres.<br />
- évite la sacralisation d&#8217;un unique développeur<br />
- Pose le problème de savoir quand on doit se rajouter dans la balise @author.</p>
<p>Je laisse à Emmanuel Bernard le tweet de la fin :<br />
<a href="http://programming-motherfucker.com/"><img class="aligncenter size-medium wp-image-1270" title="Screen Shot 2012-04-06 at 10.24.03 PM" src="http://www.java-freelance.fr/wp-content/uploads/2012/04/Screen-Shot-2012-04-06-at-10.24.03-PM-300x91.png" alt="" width="300" height="91" /></a></p>
<p>Merci à ‏Sébastien PRUNIER ‏ @sebprunier, Pierre TEMPLIER ‏ @ptemplier, Emmanuel LECHARNY, François Sarradin ‏ @fsarradin, Guillaume LOURS ‏ @guillaumelours, Jean-Laurent Morlhon ‏ @morlhon, Arnaud Héritier ‏ @aheritier , Sébastien Deleuze ‏ @sdeleuze , Yannick AMEUR ‏ @yannickameur , Robin Komiwes ‏ @robinkomiwes , Jollivet Christophe ‏ @jollivetc , Jérémy Sevellec ‏ @jsevellec, Julien Jakubowski ‏ @jak78 , Nicolas De loof ‏ @ndeloof, Nicolas François ‏ @nicofrancois  , Francois Marot ‏ @FrancoisMarot  , Jean Helou ‏ @jeanhelou, Benoît Dissert ‏ @bdissert , Olivier Jaquemet ‏ @OlivierJaquemet , Aline Paponaud ‏ @bootis , Benoît Dissert ‏ @bdissert , Nicolas Delsaux ‏ @riduidel et aux autres &#8230;</p>

]]></content:encoded>
			<wfw:commentRss>http://www.java-freelance.fr/java/author/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Kata de refactoring N°1</title>
		<link>http://www.java-freelance.fr/java/kata-de-refactoring-1</link>
		<comments>http://www.java-freelance.fr/java/kata-de-refactoring-1#comments</comments>
		<pubDate>Sat, 18 Feb 2012 05:23:53 +0000</pubDate>
		<dc:creator>Jean-Baptiste</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[crafstman]]></category>
		<category><![CDATA[intellij]]></category>
		<category><![CDATA[kata]]></category>
		<category><![CDATA[refactoring]]></category>

		<guid isPermaLink="false">http://www.java-freelance.fr/?p=1236</guid>
		<description><![CDATA[			
			

Pour me préparer aux sélections de code story et pouvoir coder pendant 2 jours une application devant des centaines de développeurs à Devoxx, je me suis entrainé à refactorer une méthode en m&#8217;enregistrant.
Le bénéfice que j&#8217;attendais de l&#8217;exercice était de :

M&#8217;entendre parler pour détecter mes défauts d&#8217;expressions et les corriger, car le jour J il [...]]]></description>
			<content:encoded><![CDATA[			
			
<p><a href="http://www.java-freelance.fr/wp-content/uploads/2012/02/logo.png"><img class="size-full wp-image-1248 alignleft" style="margin-top: 2px; margin-bottom: 2px; margin-left: 10px; margin-right: 10px;" title="Code Story" src="http://www.java-freelance.fr/wp-content/uploads/2012/02/logo.png" alt="" width="315" height="107" /></a></p>
<p>Pour me préparer aux sélections de <a title="Code Story" href="http://www.code-story.net/" target="_blank">code story</a> et pouvoir coder pendant 2 jours une application devant des centaines de développeurs à <a title="Devoxx France" href="http://devoxx.fr/display/FR12/Speakers" target="_blank">Devoxx</a>, je me suis entrainé à refactorer une méthode en m&#8217;enregistrant.</p>
<p>Le bénéfice que j&#8217;attendais de l&#8217;exercice était de :</p>
<ul>
<li>M&#8217;entendre parler pour détecter mes défauts d&#8217;expressions et les corriger, car le jour J il faudra expliquer ce qu&#8217;on fait et pourquoi, le tout en codant ! Pas facile&#8230;</li>
<li>Maîtriser au maximum mon IDE pour être rapide à coder, rien de plus ennuyeux que de regarder un développeur coder trop lentement !</li>
</ul>
<p>Pour la petite histoire, <span id="more-1236"></span>je suis partie d&#8217;une classe que je venais de refactorer chez un client, il s&#8217;agit donc d&#8217;un exemple réel. J&#8217;ai fait environ 15 essais avant les sélections pour finalement me faire éliminer ! Je suis bon perdant, et je me suis dit que les quelques techniques simples que j&#8217;explique pouvaient être intéressantes et que c&#8217;était dommage de  garder le screencast pour moi. Du coup j&#8217;ai refait 5 essais et voici le résultat :</p>
<p style="text-align: center;">
<object style="width:425px; height:344px;">
<param name="movie" value="http://www.youtube.com/v/hoqpQkGIiPc?version=3" />
<param name="allowScriptAccess" value="always" />
<param name="wmode" value="window" />
<param name="allowFullScreen" value="true" />
<embed src="http://www.youtube.com/v/hoqpQkGIiPc?version=3" type="application/x-shockwave-flash" allowfullscreen="true" allowScriptAccess="always" wmode="window" width="425" height="344"></object>
</p>
<p>Ce n&#8217;est pas parfait ! J&#8217;ai même fait une grossière erreur en cassant le comportement de la méthode. Le premier qui trouve où gagne une bière (la date du commentaire faisant foi) ! Si vous trouvez d&#8217;autres boulettes ça marche aussi, à l&#8217;exclusion de l&#8217;utilisation de framework ou de l&#8217;API java, Boolean.compareTo par exemple, car ce n&#8217;est pas le propos de l&#8217;exercice. D&#8217;ailleurs s&#8217;il y a une chose que je retiens c&#8217;est qu&#8217;on peut toujours faire mieux !</p>
<p>Pour ceux qui voudrait faire pareil :</p>
<ul>
<li>Achetez un bon casque / micro ! (le mien clic! de temps en temps, il faut que j&#8217;en rachète un !)</li>
<li> Sous linux j&#8217;utilise <a title="Kazaam Screencaster" href="https://launchpad.net/kazam" target="_blank">Kazam</a> pour l&#8217;enregistrement et <a title="Key mon" href="http://freecode.com/projects/key-mon" target="_blank">key-mon</a> pour montrer ce que j&#8217;écris.</li>
<li>Limitez vous à un exercice de moins de 10minutes, on décroche si c&#8217;est trop long.</li>
<li>N&#8217;ayez pas honte !</li>
</ul>
<p>Bon code à tous !</p>

]]></content:encoded>
			<wfw:commentRss>http://www.java-freelance.fr/java/kata-de-refactoring-1/feed</wfw:commentRss>
		<slash:comments>14</slash:comments>
		</item>
		<item>
		<title>Hibernate Anti-Patterns</title>
		<link>http://www.java-freelance.fr/java/hibernate-anti-patterns</link>
		<comments>http://www.java-freelance.fr/java/hibernate-anti-patterns#comments</comments>
		<pubDate>Sat, 19 Nov 2011 03:13:13 +0000</pubDate>
		<dc:creator>Mathilde</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Anti patterns]]></category>
		<category><![CDATA[devoxx]]></category>
		<category><![CDATA[Hibernate]]></category>

		<guid isPermaLink="false">http://www.java-freelance.fr/?p=1215</guid>
		<description><![CDATA[			
			
J&#8217;ai eu l&#8217;occasion d&#8217;assiter à une conférence sur les anti-patterns Hibernate par Patricia Wegrzynowicz à Devoxx hier. Elle a mis en avant certains effets de bords induit par l&#8217;utilisation d&#8217;Hibernate (les points suivants peuvent souvent s&#8217;appliquer à d&#8217;autres ORM, rien de personnel avec Hibernate   . Cet article ne reprends qu&#8217;une partie du talk: [...]]]></description>
			<content:encoded><![CDATA[			
			
<p>J&#8217;ai eu l&#8217;occasion d&#8217;assiter à une conférence sur les anti-patterns Hibernate par Patricia Wegrzynowicz à Devoxx hier. Elle a mis en avant certains effets de bords induit par l&#8217;utilisation d&#8217;Hibernate (les points suivants peuvent souvent s&#8217;appliquer à d&#8217;autres ORM, rien de personnel avec Hibernate <img src='http://www.java-freelance.fr/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  . Cet article ne reprends qu&#8217;une partie du talk: les points que j&#8217;ai pu rencontrer en entreprise.</p>
<h3>1. L&#8217;hydre</h3>
<p>Hydra est une entité qui a la particularité de contenir une liste immuable de tête (heads.)</p>
<pre class="brush:java">@Entity
public class Hydra {
  private Long id;
  private List heads = new ArrayList();
  @Id @GeneratedValue
  public Long getId() {...}
  protected void setId() {...}
  @OneToMany(cascade=CascadeType.ALL)
  public List getHeads() {
    return Collections.unmodifiableList(heads);
  }
  protected void setHeads(List heads) {...}
}
// creates and persists the hydra with 3 heads
// new EntityManager and new transaction
Hydra found = em.find(Hydra.class, hydra.getId());</pre>
<p>La question est la suivante, combien d&#8217;appel sont fait en base de données lors de  la deuxième transaction (créer lors de em.find).</p>
<p>(a) 1 select<br />
(b) 2 selects<br />
(c) 1+3 selects<br />
(d) 2 selects, 1 delete, 3<br />
inserts<br />
(e) None of the above</p>
<p><span id="more-1215"></span></p>
<p>Pendant la recherche, em.find entraine un unique select en base de donnée sur l&#8217;hydre.<br />
Pendant le commit qui est effectué à la fin de la transaction, hibernate vérifie que la collection n&#8217;est pas dirty, c&#8217;est à dire que les objets devraient être recréés en comparant les références objects des listes. Un deuxième select est alors effectué sur les têtes. Dans notre cas, les références ne correspondant pas, l&#8217;ensemble de la liste est alors recréé, ce qui explique le delete et les 3 inserts.</p>
<p>Contrairement à ce que l&#8217;on pourrait penser dans un premier temps, la bonne réponse est donc la réponse d.</p>
<p>Il faut donc être bien conscient que si on a un objet qui contient une collection et qui porte la liaison, si on affecte  une nouvelle liste à l&#8217;élément, la collection est recrée entièrement : un delete et n insertions d&#8217;éléments. On peut rencontrer également ce genre de problème si on utilise des outils qui suppriment les proxies hibernate sur les objets.</p>
<p>En régle générale, il vaut mieux travailler directement avec les collections retournées par hibernate à moins de savoir ce que l&#8217;on fait.</p>
<pre class="brush:java">@Entity
public class Developer {
  @Id @GeneratedValue
  private Long id;
  private String mainTechnology;
  public boolean likesMainTechnology() {
    return "hibernate".equalsIgnoreCase(mainTechnology);
  }
}

// creates and persists a developer that uses hibernate as mainTechnology
// new EntityManager and new transaction
Developer dev = em.find(Developer.class, id);
boolean foundCoolStuff = false;
for (String tech : new String[]{"HTML5", "Android", "Scala"}) {
  dev.setMainTechnology(tech);
// othersAreUsingIt entraine select count(*) from Developer where mainTechnology = ? and id != ?
  if (othersAreUsingIt(tech, dev) &amp;&amp; dev.likesMainTechnology()) {
    foundCoolStuff = true; break;
  }
}
if (!foundCoolStuff) {
// still use hibernate
  dev.setMainTechnology("hibernate");
}</pre>
<p>(a) 2 selects<br />
(b) 4 selects<br />
(c) 4 selects, 1 update<br />
(d) 4 selects, 4 inserts<br />
(e) None of the above</p>
<p>La bonne réponse est la réponse d, 4 selects et 4 inserts. En effet, hibernate doit garantir la bonne valeur des requêtes exécutées et parfois doit effectuer une flush pendant une transaction. Si on n&#8217;effectue plus l&#8217;appel à othersAreUsingIt (qui entraine un select sur la table Developer), il n&#8217;y a plus d&#8217;update.</p>
<p>List semantics</p>
<pre class="brush:java">@Entity
public class Forest {
  @Id @GeneratedValue
  private Long id;
  @OneToMany
  Collection&lt;Tree&gt; trees = new HashSet&lt;Tree&gt;();
  public void plantTree(Tree tree) {
    trees.add(tree);
  }
}
// creates and persists a forest with 10.000 trees

// new EntityManager and new transaction
Tree tree = new Tree(“oak”);
em.persist(tree);
Forest forest = em.find(Forest.class, id);
forest.plantTree(tree);</pre>
<p>(a) 1 select, 2 inserts<br />
(b) 2 selects, 2 inserts<br />
(c) 2 selects, 1 delete,<br />
10.000+2 inserts<br />
(d) Even more <img src='http://www.java-freelance.fr/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </p>
<p>La bonne réponse est la réponse c. La combinaison de l&#8217;annotation OneToMany et d&#8217;une collection entraine un bag semantic. La collection est donc recrée.</p>
<table style="border-spacing: 0px;" border="1">
<tbody>
<tr>
<td>Semantic</td>
<td>Java Type</td>
<td>Annotation</td>
<td>Add 1 element</td>
<td>Update 1 element</td>
<td>Remove 1 element</td>
</tr>
<tr>
<td>Bag Semantic</td>
<td>java.utill.Collection<br />
java.util.List</td>
<td>@ElementCollection<br />
||<br />
@OneToMany<br />
||<br />
@ManyToMany</td>
<td>1 delete + n insert</td>
<td>1 delete + n insert</td>
<td>1 update</td>
</tr>
<tr>
<td>Set Semantic</td>
<td>java.utill.Set</td>
<td>@ElementCollection<br />
||<br />
@OneToMany<br />
||<br />
@ManyToMany</td>
<td>1 insert</td>
<td>1 update</td>
<td>1 delete</td>
</tr>
<tr>
<td>List Semantic</td>
<td>java.util.List</td>
<td>(@ElementCollection<br />
||<br />
@OneToMany<br />
||<br />
@ManyToMany)&amp;&amp;(@OrderColumn||@IndexColumnn)</td>
<td>1 insert+ m update</td>
<td>1 delete + m insert</td>
<td>1 update</td>
</tr>
</tbody>
</table>
<p>@OneToMany with no cascade options<br />
La première intuition est de remplacer le Set par une List (List&lt;Tree&gt; trees = new ArrayList&lt;Tree&gt;() ). Néanmoins, cela marche exactement de la même manière.<br />
Le seul moyen de ne pas avoir de bag semantic est d&#8217;utiliser orderColumn ou indexColumn</p>
<p>Il faut faire attention à choisir une collection appropriée sur la partie qui contient  la liaison. Ainsi dans notre cas, Set&lt;Tree&gt; trees = new HashSet&lt;Tree&gt;() permet d&#8217;éviter toutes les insertions parasites.</p>
<p>Utilisation d&#8217;un set sur l&#8217;object qui ne contient pas la liaison.</p>
<pre class="brush:java">@Entity
public class Forest {
  @Id @GeneratedValue
  private Long id;
  @OneToMany (mappedBy = “forest”)
  Collection&lt;Tree&gt; trees = new HashSet&lt;Tree&gt;();
  public void plantTree(Tree tree) {
    trees.add(tree);
  }
}
@Entity
public class Tree {
  @Id @GeneratedValue
  private Long id;
  private String name;
  @ManyToOne
  Forest forest;
  public void setForest(Forest forest) {
    this.forest = forest;
     this.forest.plantTree(this);
  }
}

// creates and persists a forest with 10.000 trees
// new EntityManager and new transaction
em.remove(forest);</pre>
<p>L&#8217;appel à em.remove entraine  java.sql.BatchUpdateException : cannot delete or update a parent row : a foreign key constraint fails.</p>
<p>Si on garde le modèle, la seule solution est de parcourir l&#8217;ensemble des arbres de la forêt et de setter leur forêt à null.<br />
Il est ensuite possible de supprimer la foret. Ce qui entraine 10 000 updates et 1 delete &#8230;<br />
D&#8217;autres types de collections auraient été plus adéquats.</p>
<p>Il existe beaucoup d&#8217;autres anti-patterns. Pour les débusquer dans votre code, il est plus que recommander d&#8217;observer attentivement les requêtes ! Les slides sont ici : <a href="http://www.yonita.com/2011_11_16_PERFORMANCE_ANTIPATTERNS_DEVOXX.pdf">http://www.yonita.com/2011_11_16_PERFORMANCE_ANTIPATTERNS_DEVOXX.pdf</a></p>

]]></content:encoded>
			<wfw:commentRss>http://www.java-freelance.fr/java/hibernate-anti-patterns/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Soirée sur Paris &#8211; 7 juin</title>
		<link>http://www.java-freelance.fr/java/soiree-sur-paris-7-juin</link>
		<comments>http://www.java-freelance.fr/java/soiree-sur-paris-7-juin#comments</comments>
		<pubDate>Thu, 02 Jun 2011 06:12:13 +0000</pubDate>
		<dc:creator>Mathilde</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[duchess]]></category>
		<category><![CDATA[marmite]]></category>
		<category><![CDATA[mockito]]></category>

		<guid isPermaLink="false">http://www.java-freelance.fr/?p=1191</guid>
		<description><![CDATA[			
			
Rien de prévu mardi prochain ? Rejoignez nous pour la première de la marmite, LA soirée récurrente des duchesses ! J&#8217;aurais l&#8217;occasion d&#8217;animer avec Brice Dutheuil, commiter Mockito, un Hands-On sur la mise en place de tests avec Mockito et comme il y en a pour tous les gouts chez les duchesses, on a également [...]]]></description>
			<content:encoded><![CDATA[			
			
<p><span style="color: #333333;"><img class="alignleft" title="logo" src="http://img846.imageshack.us/img846/9020/logomarmite.png" alt="logo marmite" width="300" height="300" />Rien de prévu mardi prochain ? Rejoignez nous pour la première de la marmite, LA soirée récurrente des duchesses ! J&#8217;aurais l&#8217;occasion d&#8217;animer avec Brice Dutheuil, commiter Mockito, un </span><span style="color: #333333;">Hands-On sur la mise en place de tests avec Mockito et comme il y en a pour tous les gouts chez les duchesses, on a également prévu en parallèle un open-space pour échanger sur les sujets qui vous intéressent !</span></p>
<p><span style="color: #333333;">Qu’est-ce qu’un open space ? C’est un peu comme un barCamp à part que les sujets sont présentés au début et que l’on ne traite que les sujets les plus populaires pendant un temps limité. Le but essentiel est de partager et de débattre. Tous les sujets autour de Java et de l’IT sont les bienvenus. Pour vous donner des idées, voici quelques pistes possibles :</span></p>
<ul>
<li><span style="color: #333333;">une problématique technique que vous avez rencontrée</span></li>
<li><span style="color: #333333;">un super outil qui a changé votre vie de développeur</span></li>
<li><span style="color: #333333;">votre sujet de veille préféré</span></li>
<li><span style="color: #333333;">ou une problématique relationnelle (ex: comment travailler avec une personne au caractère difficile ?).</span></li>
</ul>
<p><span style="color: #333333;"><a href="http://la-marmite-soiree-crumble.eventbrite.com/" target="_blank">Pour vous inscrire a l&#8217;Hands-On ou a l&#8217;open-space </a></span></p>
<p><span style="color: #333333;"><a title="http://jduchess.org/duchess-france/blog/marmite-soiree-crumble-pour-la-premiere-edition/" href="http://jduchess.org/duchess-france/blog/marmite-soiree-crumble-pour-la-premiere-edition/" target="_blank">Plus d&#8217;infos</a></span></p>

]]></content:encoded>
			<wfw:commentRss>http://www.java-freelance.fr/java/soiree-sur-paris-7-juin/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Quizz &#8211; Maitrisez vous votre IDE ?</title>
		<link>http://www.java-freelance.fr/humeur/quizz-maitrisez-vous-votre-ide</link>
		<comments>http://www.java-freelance.fr/humeur/quizz-maitrisez-vous-votre-ide#comments</comments>
		<pubDate>Tue, 10 May 2011 09:44:51 +0000</pubDate>
		<dc:creator>Mathilde</dc:creator>
				<category><![CDATA[Humeur]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[idea]]></category>
		<category><![CDATA[intellij]]></category>
		<category><![CDATA[quizz]]></category>

		<guid isPermaLink="false">http://www.java-freelance.fr/?p=1177</guid>
		<description><![CDATA[			
			
Etant bloquée chez moi, j&#8217;en profite pour vous partager un petit quizz destinée aux utilisateurs d&#8217;intelliJ IDEA sous linux/Windows. Le même pour les amateurs de la pomme à venir dans la journée/soirée  

	
	
	  
		Maitrisez vous votre IDE ? [Linux/Windows users &#038; IntelliJ]
	    0%
			Progress:
			
					
	
						Générer une méthode (constructor/getter/setter...)
						Ctrl+FCtrl+GAlt+GAlt+InsCa se génère seul, IDEA [...]]]></description>
			<content:encoded><![CDATA[			
			
<p>Etant bloquée chez moi, j&#8217;en profite pour vous partager un petit quizz destinée aux utilisateurs d&#8217;intelliJ IDEA sous linux/Windows. Le même pour les amateurs de la pomme à venir dans la journée/soirée <img src='http://www.java-freelance.fr/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>
	<!-- WordPress Simple Survey | Copyright Steele Agency, Inc. (http://steele-agency.com) -->
	<div id="wpss_survey">
	  <div id="wpss-quiz-1" class="form-container ui-helper-clearfix ui-corner-all">
		<h2>Maitrisez vous votre IDE ? [Linux/Windows users & IntelliJ]</h2>
	    <div id="progress"><label id="amount">0%</label>
			<p class="pgress">Progress:</p></div>
			<form id="wpssform" name="wpssform" action="http://www.java-freelance.fr/?wpss-routing=results" method="post" ><div id="panel1" class="form-panel">
					<fieldset class="ui-corner-all">
	
						<p class="form_question">Générer une méthode (constructor/getter/setter...)</p>
						<div class="answer"><div class="answer_text"><input type="radio" class="wpss_radio" name="wpss_ans_radio_q_0" id="answer_1" value="wpss_ans_1" /><label for="answer_1">Ctrl+F</label></div><div class="clear"></div><div class="answer_text"><input type="radio" class="wpss_radio" name="wpss_ans_radio_q_0" id="answer_2" value="wpss_ans_2" /><label for="answer_2">Ctrl+G</label></div><div class="clear"></div><div class="answer_text"><input type="radio" class="wpss_radio" name="wpss_ans_radio_q_0" id="answer_7" value="wpss_ans_7" /><label for="answer_7">Alt+G</label></div><div class="clear"></div><div class="answer_text"><input type="radio" class="wpss_radio" name="wpss_ans_radio_q_0" id="answer_8" value="wpss_ans_8" /><label for="answer_8">Alt+Ins</label></div><div class="clear"></div><div class="answer_text"><input type="radio" class="wpss_radio" name="wpss_ans_radio_q_0" id="answer_9" value="wpss_ans_9" /><label for="answer_9">Ca se génère seul, IDEA FTW !</label></div><div class="clear"></div>
						</div>
					</fieldset>

				</div><div id="panel2" class="form-panel ui-helper-hidden">
					<fieldset class="ui-corner-all">
	
						<p class="form_question">Overrider une méthode</p>
						<div class="answer"><div class="answer_text"><input type="radio" class="wpss_radio" name="wpss_ans_radio_q_1" id="answer_3" value="wpss_ans_3" /><label for="answer_3">Ctrl+O</label></div><div class="clear"></div><div class="answer_text"><input type="radio" class="wpss_radio" name="wpss_ans_radio_q_1" id="answer_4" value="wpss_ans_4" /><label for="answer_4">Ctrl+I</label></div><div class="clear"></div><div class="answer_text"><input type="radio" class="wpss_radio" name="wpss_ans_radio_q_1" id="answer_10" value="wpss_ans_10" /><label for="answer_10">Ctrl+M</label></div><div class="clear"></div><div class="answer_text"><input type="radio" class="wpss_radio" name="wpss_ans_radio_q_1" id="answer_11" value="wpss_ans_11" /><label for="answer_11">Alt+M</label></div><div class="clear"></div>
						</div>
					</fieldset>

				</div><div id="panel3" class="form-panel ui-helper-hidden">
					<fieldset class="ui-corner-all">
	
						<p class="form_question">Reformater le code</p>
						<div class="answer"><div class="answer_text"><input type="radio" class="wpss_radio" name="wpss_ans_radio_q_2" id="answer_5" value="wpss_ans_5" /><label for="answer_5">Ctrl+F</label></div><div class="clear"></div><div class="answer_text"><input type="radio" class="wpss_radio" name="wpss_ans_radio_q_2" id="answer_6" value="wpss_ans_6" /><label for="answer_6">Ctrl+Alt+F</label></div><div class="clear"></div><div class="answer_text"><input type="radio" class="wpss_radio" name="wpss_ans_radio_q_2" id="answer_12" value="wpss_ans_12" /><label for="answer_12">Ctrl+Alt+L</label></div><div class="clear"></div><div class="answer_text"><input type="radio" class="wpss_radio" name="wpss_ans_radio_q_2" id="answer_13" value="wpss_ans_13" /><label for="answer_13">Alt+F</label></div><div class="clear"></div>
						</div>
					</fieldset>

				</div><div id="panel4" class="form-panel ui-helper-hidden">
					<fieldset class="ui-corner-all">
	
						<p class="form_question">Commenter du code</p>
						<div class="answer"><div class="answer_text"><input type="radio" class="wpss_radio" name="wpss_ans_radio_q_3" id="answer_14" value="wpss_ans_14" /><label for="answer_14">Ctrl+/</label></div><div class="clear"></div><div class="answer_text"><input type="radio" class="wpss_radio" name="wpss_ans_radio_q_3" id="answer_15" value="wpss_ans_15" /><label for="answer_15">Ctrl+C</label></div><div class="clear"></div><div class="answer_text"><input type="radio" class="wpss_radio" name="wpss_ans_radio_q_3" id="answer_16" value="wpss_ans_16" /><label for="answer_16">Ctrl+Shift+/</label></div><div class="clear"></div><div class="answer_text"><input type="radio" class="wpss_radio" name="wpss_ans_radio_q_3" id="answer_17" value="wpss_ans_17" /><label for="answer_17">Les commentaires c'est le mal !</label></div><div class="clear"></div>
						</div>
					</fieldset>

				</div><div id="panel5" class="form-panel ui-helper-hidden">
					<fieldset class="ui-corner-all">
	
						<p class="form_question">Extraire en tant que constante</p>
						<div class="answer"><div class="answer_text"><input type="radio" class="wpss_radio" name="wpss_ans_radio_q_4" id="answer_18" value="wpss_ans_18" /><label for="answer_18">Ctrl+C</label></div><div class="clear"></div><div class="answer_text"><input type="radio" class="wpss_radio" name="wpss_ans_radio_q_4" id="answer_19" value="wpss_ans_19" /><label for="answer_19">Ctrl+Shift+C</label></div><div class="clear"></div><div class="answer_text"><input type="radio" class="wpss_radio" name="wpss_ans_radio_q_4" id="answer_20" value="wpss_ans_20" /><label for="answer_20">Ctrl+Alt+C</label></div><div class="clear"></div><div class="answer_text"><input type="radio" class="wpss_radio" name="wpss_ans_radio_q_4" id="answer_40" value="wpss_ans_40" /><label for="answer_40">Ctrl + F7</label></div><div class="clear"></div>
						</div>
					</fieldset>

				</div><div id="panel6" class="form-panel ui-helper-hidden">
					<fieldset class="ui-corner-all">
	
						<p class="form_question">Live Template - iteration au format 1.5</p>
						<div class="answer"><div class="answer_text"><input type="radio" class="wpss_radio" name="wpss_ans_radio_q_5" id="answer_22" value="wpss_ans_22" /><label for="answer_22">iterat + tab</label></div><div class="clear"></div><div class="answer_text"><input type="radio" class="wpss_radio" name="wpss_ans_radio_q_5" id="answer_23" value="wpss_ans_23" /><label for="answer_23">iter + tab</label></div><div class="clear"></div><div class="answer_text"><input type="radio" class="wpss_radio" name="wpss_ans_radio_q_5" id="answer_24" value="wpss_ans_24" /><label for="answer_24">iterat + return</label></div><div class="clear"></div><div class="answer_text"><input type="radio" class="wpss_radio" name="wpss_ans_radio_q_5" id="answer_25" value="wpss_ans_25" /><label for="answer_25">iter + return</label></div><div class="clear"></div><div class="answer_text"><input type="radio" class="wpss_radio" name="wpss_ans_radio_q_5" id="answer_26" value="wpss_ans_26" /><label for="answer_26">Mais qu'est ce qu'un live template ?</label></div><div class="clear"></div>
						</div>
					</fieldset>

				</div><div id="panel7" class="form-panel ui-helper-hidden">
					<fieldset class="ui-corner-all">
	
						<p class="form_question">Extraire une méthode</p>
						<div class="answer"><div class="answer_text"><input type="radio" class="wpss_radio" name="wpss_ans_radio_q_6" id="answer_28" value="wpss_ans_28" /><label for="answer_28">Ctrl+M</label></div><div class="clear"></div><div class="answer_text"><input type="radio" class="wpss_radio" name="wpss_ans_radio_q_6" id="answer_29" value="wpss_ans_29" /><label for="answer_29">Ctrl+Shift+M</label></div><div class="clear"></div><div class="answer_text"><input type="radio" class="wpss_radio" name="wpss_ans_radio_q_6" id="answer_30" value="wpss_ans_30" /><label for="answer_30">Ctrl+Alt+M</label></div><div class="clear"></div><div class="answer_text"><input type="radio" class="wpss_radio" name="wpss_ans_radio_q_6" id="answer_31" value="wpss_ans_31" /><label for="answer_31">Ctrl + Maj + M</label></div><div class="clear"></div><div class="answer_text"><input type="radio" class="wpss_radio" name="wpss_ans_radio_q_6" id="answer_32" value="wpss_ans_32" /><label for="answer_32">Insert New Answer</label></div><div class="clear"></div>
						</div>
					</fieldset>

				</div><div id="panel8" class="form-panel ui-helper-hidden">
					<fieldset class="ui-corner-all">
	
						<p class="form_question">Live template - générer méthode main</p>
						<div class="answer"><div class="answer_text"><input type="radio" class="wpss_radio" name="wpss_ans_radio_q_7" id="answer_33" value="wpss_ans_33" /><label for="answer_33">main + tab</label></div><div class="clear"></div><div class="answer_text"><input type="radio" class="wpss_radio" name="wpss_ans_radio_q_7" id="answer_34" value="wpss_ans_34" /><label for="answer_34">main + return</label></div><div class="clear"></div><div class="answer_text"><input type="radio" class="wpss_radio" name="wpss_ans_radio_q_7" id="answer_35" value="wpss_ans_35" /><label for="answer_35">psvm + tab</label></div><div class="clear"></div><div class="answer_text"><input type="radio" class="wpss_radio" name="wpss_ans_radio_q_7" id="answer_36" value="wpss_ans_36" /><label for="answer_36">Mais qu'est ce qu'un live template ?</label></div><div class="clear"></div>
						</div>
					</fieldset>

				</div><div id="panel9" class="form-panel ui-helper-hidden">
					<fieldset class="ui-corner-all">
	
						<p class="form_question">Rename</p>
						<div class="answer"><div class="answer_text"><input type="radio" class="wpss_radio" name="wpss_ans_radio_q_8" id="answer_37" value="wpss_ans_37" /><label for="answer_37">Ctrl + O</label></div><div class="clear"></div><div class="answer_text"><input type="radio" class="wpss_radio" name="wpss_ans_radio_q_8" id="answer_38" value="wpss_ans_38" /><label for="answer_38">Ctrl + N</label></div><div class="clear"></div><div class="answer_text"><input type="radio" class="wpss_radio" name="wpss_ans_radio_q_8" id="answer_39" value="wpss_ans_39" /><label for="answer_39">Shift + F6</label></div><div class="clear"></div><div class="answer_text"><input type="radio" class="wpss_radio" name="wpss_ans_radio_q_8" id="answer_41" value="wpss_ans_41" /><label for="answer_41">Ctrl + Alt + M</label></div><div class="clear"></div>
						</div>
					</fieldset>

				</div><div id="panel10" class="form-panel ui-helper-hidden">
					<fieldset class="ui-corner-all">
	
						<p class="form_question">Aller à la dernière édition de code</p>
						<div class="answer"><div class="answer_text"><input type="radio" class="wpss_radio" name="wpss_ans_radio_q_9" id="answer_42" value="wpss_ans_42" /><label for="answer_42">Ctrl + Del</label></div><div class="clear"></div><div class="answer_text"><input type="radio" class="wpss_radio" name="wpss_ans_radio_q_9" id="answer_43" value="wpss_ans_43" /><label for="answer_43">Ctrl + Shift + Backspace</label></div><div class="clear"></div><div class="answer_text"><input type="radio" class="wpss_radio" name="wpss_ans_radio_q_9" id="answer_44" value="wpss_ans_44" /><label for="answer_44">Alt + F6</label></div><div class="clear"></div><div class="answer_text"><input type="radio" class="wpss_radio" name="wpss_ans_radio_q_9" id="answer_45" value="wpss_ans_45" /><label for="answer_45">Ctrl + Alt + Flèche gauche</label></div><div class="clear"></div>
						</div>
					</fieldset>

				</div>
			<div id="thanks" class="form-panel ui-helper-hidden">

				<fieldset class="ui-corner-all">

				<h3></h3>
				<input type="hidden" name="quiz_id" value="1" />	
				<input type="hidden" name="submitter_id" value="wpss_4fb85bf9779b6" /><div id="user_info" class="infoForm"><p>*Name: <input type="text" name="wpss_field_1" class="wpss_required" value="" alt="Name:" /></p><p>*Email: <input type="text" name="wpss_field_2" class="wpss_required" value="" alt="Email:" /></p></div>        
        <input type="hidden" name="wpss_submit_quiz" value="1" />
				<input id="submitButton" type="submit" name="wpss_submit" value="Click to Submit" />
				</fieldset>

			</div>
			<button id="next">Next &gt;</button><button id="back" disabled="disabled">&lt; Back</button>
		</form>
		</div>
	</div>
	
		<script type="text/javascript">
	
			// current question number
			var wpss_curRadio = 0;
	
      (function($) { 
        $(function() {
	
					// call progress bar constructor
				  $("#progress").progressbar({ change: function() {
					  //update amount label when value changes			
					  $("#amount").text(Math.round($("#progress").progressbar("option", "value")) + "%");
				  } });
				  
          // disable all next/prev buttons on load
          $("#next").attr("disabled", "disabled");
          $("#back").attr("disabled", "disabled");			

				  //set click handler for next button
				  $("#next").click(function(e) {  
				  
					  e.preventDefault();		
					  wpss_curRadio++;  

            $("#next").attr("disabled", "disabled");
            $("#back").removeAttr("disabled");
                  
            if(wpss_getCheckedValue(document.wpssform.elements["wpss_ans_radio_q_"+wpss_curRadio]) != ""){
              $("#next").removeAttr("disabled");
            }
          
				
					  //look at each panel
					  $(".form-panel").each(function() {
									
						  //if the panel is visible fade it out
						  ($(this).hasClass("ui-helper-hidden")) ? null : $(this).fadeOut("fast", function() {
						    
							  //add hidden class and show the next panel
							  $(this).addClass("ui-helper-hidden").next().fadeIn("fast", function() {
							    
								  //if it is the last panel disable the next button
      					  ($(this).attr("id") != "thanks") ? null : $("#next").attr("disabled", "disabled");	
								
								  //remove hidden class from new panel
								  $(this).removeClass("ui-helper-hidden");
								
								  //update progress bar
								  $("#progress").progressbar("option", "value", $("#progress").progressbar("option", "value") + 10);
							  });							  
						  });
					  });
				  });			
				
				  //set click handler for back button
				  $("#back").click(function(e) {
				    
					  // stop form submission
					  e.preventDefault();
					  
					  // decrement cur question count
					  wpss_curRadio-=1;
					  
					  
					  $("#next").removeAttr("disabled");
            $("#back").removeAttr("disabled");

            if(wpss_curRadio == 0){
              $("#back").attr("disabled", "disabled");
            }
        

					  // look at each panel
				    $(".form-panel").each(function() {
					    
						  // if the panel is visible fade it out
					    ($(this).hasClass("ui-helper-hidden")) ? null : $(this).fadeOut("fast", function() {
						    
                // add hidden class and show the next panel
							  $(this).addClass("ui-helper-hidden").prev().fadeIn("fast", function() {
										
								  // remove hidden class from new panel
								  $(this).removeClass("ui-helper-hidden");
								
								  // update progress bar
								  $("#progress").progressbar("option", "value", $("#progress").progressbar("option", "value") - 10);
							  });
						  });
					  });
				  });

          // enable next button when value is selected
				  $("#wpssform .wpss_radio").click(function() {
				  
            $("#next").removeAttr("disabled");
					  
 				  });
					
        });
      })(jQuery);
      
		</script></p>

]]></content:encoded>
			<wfw:commentRss>http://www.java-freelance.fr/humeur/quizz-maitrisez-vous-votre-ide/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Siffler en travaillant</title>
		<link>http://www.java-freelance.fr/freelance/siffler-en-travaillant</link>
		<comments>http://www.java-freelance.fr/freelance/siffler-en-travaillant#comments</comments>
		<pubDate>Mon, 28 Feb 2011 17:00:22 +0000</pubDate>
		<dc:creator>Mathilde</dc:creator>
				<category><![CDATA[Freelance]]></category>
		<category><![CDATA[indépendant]]></category>
		<category><![CDATA[paris jug]]></category>
		<category><![CDATA[Siffler en travaillant]]></category>
		<category><![CDATA[Vivre heureux]]></category>

		<guid isPermaLink="false">http://www.java-freelance.fr/?p=1137</guid>
		<description><![CDATA[			
			
Au commencement&#8230;
Comme beaucoup, il y a eu le passage &#171;&#160;classique&#160;&#187; en SSII. Pendant 2 ans, j&#8217;ai eu l&#8217;occasion de rencontrer quelques freelances qui avaient l&#8217;air plutôt satisfait. Je me disait qu&#8217;ils avaient de la chance et que j&#8217;aimerai moi aussi, être indépendante. Tous étaient très expérimentés. Je me disais que j&#8217;étais trop jeune et que [...]]]></description>
			<content:encoded><![CDATA[			
			
<h2>Au commencement&#8230;</h2>
<p><img class="alignleft" title="feet" src="http://img836.imageshack.us/img836/58/istock000003942588mediu.jpg" alt="" width="224" height="149" />Comme beaucoup, il y a eu le passage &laquo;&nbsp;classique&nbsp;&raquo; en SSII. Pendant 2 ans, j&#8217;ai eu l&#8217;occasion de rencontrer quelques freelances qui avaient l&#8217;air plutôt satisfait. Je me disait qu&#8217;ils avaient de la chance et que j&#8217;aimerai moi aussi, être indépendante. Tous étaient très expérimentés. Je me disais que j&#8217;étais trop jeune et que finalement, la situation de salariée en SSII était confortable. Elle permet à la fois de parfaire mes connaissances techniques et de prendre des contacts durant les missions sans stress.</p>
<h2>Et puis la chute</h2>
<p><span id="more-1137"></span></p>
<p>Lassée d&#8217;être un numéro dans une SSII à taille humaine mais pas vraiment humaine, je me suis laissée tenter par une plus petite structure, seulement quatre personnes. Leur politique se rapprochait de ce que vit un indépendant avec une rémunération variable, indexée sur le prix de vente au client. Le problème d&#8217;une petite SSII,  c&#8217;est qu&#8217;on est vendu par une SSII, à une SSII, qui nous place chez un client. Et quand on veux prendre des vacances, il faut demander à 4 personnes&#8230;<br />
Finalement placée après 2 semaines de négociation avec les différents interlocuteurs, il était clair que le projet sur lequel je devais travailler ne démarrerait jamais et que je ferais un peu de tout mais rien de ce qui était prévu au départ. Après la ritournelle habituelle des &#8216;attends au moins 3 mois&#8217; qui se transforment souvent &laquo;&nbsp;en attends encore 3 mois de plus&nbsp;&raquo;, je me suis dit qu&#8217;il serait plus facile de sortir de mission si j&#8217;en trouvais une autre par moi même.</p>
<h2>La surprise</h2>
<p>Assez bizarrement, malgré moins de 2 ans d&#8217;expérience et en pleine crise mondiale (Avril 2009), j&#8217;ai trouvé une mission en moins de 24H. Si moi, pas commerciale pour un sou, je trouvais une mission en moins de 24h, pourquoi continuer à dépendre d&#8217;autres personnes pour le faire ? J&#8217;ai donc démissionné pour me mettre à mon compte.</p>
<p>Le choix ne fut pas facile pour autant : moi aussi, j&#8217;avais un crédit immobilier, sans compter les crédits à la consommation et également un enfant et un conjoint avec une situation pas plus stable que la mienne.<br />
Avec le recul, je me rend compte que tout ça n&#8217;est pas un problème, les freelances ont la même vie -ou presque) que les salariés,  on a les mêmes contraintes familiales et financières.</p>
<p>Se lancer en tant qu&#8217;indépendant est donc uniquement choix : pas de la chance et encore moins du courage. Les contraintes financières ne sont pas un frein dans la grande majorité des cas, et surtout pas pour les juniors, qui n&#8217;ont souvent ni famille ni crédit sur les bras.</p>
<p>Et puis, je ne savais pas comment créer une entreprise. En fait, il n&#8217;y a rien à faire. Il faut juste trouver une expert comptable et déléguer tout, absolument tout, pour se concentrer sur l&#8217;important : son propre métier. Techniquement, ce n&#8217;est pas difficile, une lettre de démission et un rendez d&#8217;une demi journée chez l&#8217;expert comptable et le banquier (pour ouvrir le compte de l&#8217;entreprise, pas pour demander la permission !).</p>
<h2>Gagner plus ? C&#8217;est tout ?</h2>
<p>Le premier mythe de mon indépendance a  été de croire que l&#8217;indépendance c&#8217;était uniquement gagner plus. C&#8217;est vrai, on gagne plus, j&#8217;ai doublé mon revenu net par mois. Mais être picsou, c&#8217;est loin d&#8217;être mon but dans la vie.  Je suis bénévole dans plusieurs associations, ce qui m&#8217;occupe entre 3  et 4 jours par mois.  J&#8217;ai toujours envie de tester les nouvelles technos. J&#8217;ai 2 enfants, et comme tout le monde, je n&#8217;ai que 24 heures dans une journée.</p>
<p>Et c&#8217;est là où il y a eu un changement. J&#8217;ai regardé autour de moi. Et j&#8217;ai vu :</p>
<ul>
<li>Des indépendants picsou, qui bossent un max sans prendre de vacances pour s&#8217;arrêter à 35 ans et vivre de leurs rentes. En tant qu&#8217;indépendant, on est bien plus maître de son temps de travail. Plus d&#8217;obligation de prendre tous ses congés restant au mois de mai, vous gérez votre temps.</li>
<li>Des indépendants qui préfèrent les missions courtes :  le temps entre 2 missions leurs sert à se former, à chercher des  clients, mais également à retaper leur maison ou à profiter de la neige. L&#8217;intercontrat n&#8217;est plus quelque chose de négatif, vous n&#8217;êtes plus &#8216;inactif&#8217;, vous pouvez planifier et anticiper vos intercontrats. Et surtout, vous ne vous sentez pas obliger d&#8217;accepter une mission.</li>
<li>Des indépendants qui profitent de la proximité avec le client pour pouvoir  négocier plus facilement quelques journées en télétravail contre réduction  tarifaire. Ou qui, lorsque le client n&#8217;a plus qu&#8217;un budget de 3 mois,  négocient de rester 6 mois à mi-temps. Être indépendant, c&#8217;est également avoir des possibilités de négociation bien plus importante avec le client et donc avoir accès à des aménagements du temps de travail qu&#8217;un commercial de SSII n&#8217;obtiendrait jamais.</li>
<li>Des indépendants qui prennent le temps de tester des technos et de partir se former un peu partout,  sans limite de temps. Ou qui développent et lancent des projets persos ou Open-Source. Qui écrivent des livres etc &#8230;</li>
</ul>
<h2>Et moi et moi ?</h2>
<p>J&#8217;ai  décidé en 2010 de me mettre à mi-temps. Non pas de travailler 1 jour sur 2, c&#8217;est assez difficile de trouver des clients qui acceptent ça, mais avoir des intercontrats de plusieurs mois entre 2 missions. Fini le temps de courir. J&#8217;ai pu enfin me plonger dans le code source de différents frameworks, lancer mon propre projet, <a href="http://ensemble-donnons.fr">Ensemble-Donnons</a>, qui permet aux petites et moyennes  associations de récolter en ligne des donations. Et me former, et profiter de mes enfants.</p>
<h2>Prendre sa vie en main</h2>
<p>Finalement, être indépendant, ce n&#8217;est ni risqué ni difficile. C&#8217;est un choix, un choix que même une femme sans expérience peut faire et que vous pouvez faire. Ce choix c&#8217;est choisir de pouvoir choisir la façon dont vous voulez travailler. Il faut bien comprendre que plus il a d&#8217;intermédiaires qui décident de votre vie, moins vous aurez d&#8217;influence. L&#8217;intérêt de votre commercial et de votre patron c&#8217;est vous leurs rapportiez un maximum d&#8217;argent et donc vous placer le plus vite possible même si la mission ne correspond pas vraiment à vos attentes.</p>
<p>Alors, allez-vous finalement prendre vous aussi votre vie en main ?</p>
<p><img class="aligncenter" src="http://img703.imageshack.us/img703/2969/istock000006382599mediu.jpg" alt="" width="320" height="272" /></p>

]]></content:encoded>
			<wfw:commentRss>http://www.java-freelance.fr/freelance/siffler-en-travaillant/feed</wfw:commentRss>
		<slash:comments>33</slash:comments>
		</item>
		<item>
		<title>Anniversaire du Paris Jug</title>
		<link>http://www.java-freelance.fr/freelance/anniversaire-du-paris-jug</link>
		<comments>http://www.java-freelance.fr/freelance/anniversaire-du-paris-jug#comments</comments>
		<pubDate>Tue, 15 Feb 2011 11:50:57 +0000</pubDate>
		<dc:creator>Jean-Baptiste</dc:creator>
				<category><![CDATA[Freelance]]></category>
		<category><![CDATA[indépendant]]></category>
		<category><![CDATA[JUG]]></category>
		<category><![CDATA[Paris]]></category>

		<guid isPermaLink="false">http://www.java-freelance.fr/?p=1124</guid>
		<description><![CDATA[			
			
http://www.mavieauboulot.fr/
Cette année, le Paris Java User Group fête ses 3 ans. Pour l&#8217;occasion une soirée exceptionnelle est organisée. D&#8217;autant plus exceptionnelle que Mathilde viendra raconter comment le statut d&#8217;indépendant permet à ceux qui ont fait ce choix de vivre différemment, de vivre mieux.
Tous les détails (lieu, date, programme et inscription) ici : http://www.parisjug.org

]]></description>
			<content:encoded><![CDATA[			
			
<pre style="text-align: center;"><a href="http://www.mavieauboulot.fr/blog/"><img class="aligncenter size-full wp-image-1128" style="border: 1px solid black;" title="Être freelance, c'est maitriser sa vie." src="http://www.java-freelance.fr/wp-content/uploads/2011/02/choix-freelance.jpg" alt="" width="457" height="323" /></a><a title="http://www.mavieauboulot.fr/" href="http://www.mavieauboulot.fr/">http://www.mavieauboulot.fr/</a></pre>
<p>Cette année, le Paris Java User Group fête ses 3 ans. Pour l&#8217;occasion une soirée exceptionnelle est organisée. D&#8217;autant plus exceptionnelle que Mathilde viendra raconter comment le statut d&#8217;indépendant permet à ceux qui ont fait ce choix de vivre différemment, de vivre mieux.</p>
<p>Tous les détails (lieu, date, programme et inscription) ici : <a href="http://www.parisjug.org/xwiki/bin/view/Meeting/20110228">http://www.parisjug.org</a></p>

]]></content:encoded>
			<wfw:commentRss>http://www.java-freelance.fr/freelance/anniversaire-du-paris-jug/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Il était une fois un rêve</title>
		<link>http://www.java-freelance.fr/web/il-etait-une-fois-un-reve</link>
		<comments>http://www.java-freelance.fr/web/il-etait-une-fois-un-reve#comments</comments>
		<pubDate>Tue, 30 Nov 2010 05:58:40 +0000</pubDate>
		<dc:creator>Jean-Baptiste</dc:creator>
				<category><![CDATA[Freelance]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[buildwall]]></category>
		<category><![CDATA[crafstman]]></category>
		<category><![CDATA[JQuery]]></category>
		<category><![CDATA[radiator]]></category>

		<guid isPermaLink="false">http://www.java-freelance.fr/?p=1095</guid>
		<description><![CDATA[			
			

&#171;&#160;J&#8217;en ai rêvé, je l&#8217;ai fait&#160;&#187;. Voilà comment je résume mon état d&#8217;esprit en ce moment. Je suis Freelance parce que j&#8217;ai cette fibre d&#8217;indépendance, l&#8217;envie de voler par mes propres ailes. Je suis développeur parce que j&#8217;aime créer, j&#8217;aime réaliser des outils utiles, j&#8217;aime réaliser des outils de qualité et j&#8217;aime partager mes connaissances [...]]]></description>
			<content:encoded><![CDATA[			
			
<p><a href="http://www.buildwall.com"><img class="alignleft" style="border: 5px solid white;" title="buidlwall" src="http://www.buildwall.com/public/images/buildWallWithFaces_small.png" alt="" width="255" height="191" /></a></p>
<p>&laquo;&nbsp;J&#8217;en ai rêvé, je l&#8217;ai fait&nbsp;&raquo;. Voilà comment je résume mon état d&#8217;esprit en ce moment. Je suis Freelance parce que j&#8217;ai cette fibre d&#8217;indépendance, l&#8217;envie de voler par mes propres ailes. Je suis développeur parce que j&#8217;aime créer, j&#8217;aime réaliser des outils <em>utiles</em>, j&#8217;aime réaliser des outils de <em>qualité</em> et j&#8217;aime partager mes connaissances (ce blog en est la preuve). En cela je me considère comme un <a href="http://manifesto.softwarecraftsmanship.org/main">artisan</a>, un &laquo;&nbsp;Software Craftsman&nbsp;&raquo;.</p>
<p><span id="more-1095"></span></p>
<p>Après mes études, je voulais déjà fabriquer mon propre produit. A l&#8217;époque je souhaitais créer un logiciel pour les campings, ayant baigné dans ce milieu depuis tout petit. Manquant d&#8217;expérience et devant l&#8217;immensité de la tâche pour un débutant ( 2 débutants en l&#8217;occurrence puisque Mathilde était déjà de la partie à cette époque), nous avons mis le projet de coté au bout de 6 mois pour aller apprendre la vie en SSII. Depuis, presque chaque jour j&#8217;ai une nouvelle idée, presque chaque jour je suis frustré de ne pas pouvoir la réaliser. J&#8217;ai une famille et peu de temps pour réaliser mes idées. Je suis dépendant d&#8217;un système, comment développer mes idées sans perdre en revenus, sans faire prendre de risque à mes enfants ?</p>
<h2>Rework, tu liras</h2>
<p>Au début je me disais qu&#8217;il fallait trouver l&#8217;idée qui tue, la &laquo;&nbsp;killer feature&nbsp;&raquo;. Qu&#8217;il fallait faire une étude de marché, qu&#8217;il fallait des clients, qu&#8217;il fallait des investisseurs, qu&#8217;il fallait investir aussi et savoir prendre des risques. Qu&#8217;il fallait tous développer avant de mettre de publier.</p>
<p>Et un jour j&#8217;ai lu :</p>
<p><a href="http://www.amazon.fr/gp/product/0307463745?ie=UTF8&amp;tag=javafree-21&amp;linkCode=as2&amp;camp=1642&amp;creative=6746&amp;creativeASIN=0307463745"><img class="aligncenter size-full wp-image-836" title="Rework" src="http://www.java-freelance.fr/wp-content/uploads/2010/10/rework.jpg" alt="" width="106" height="160" /></a><img style="border: none !important; margin: 0px !important;" src="http://www.assoc-amazon.fr/e/ir?t=javafree-21&amp;l=as2&amp;o=8&amp;a=0307463745" border="0" alt="" width="1" height="1" /></p>
<p>Avec Rework j&#8217;ai compris qu&#8217;il fallait démarrer petit. Qu&#8217;il fallait résoudre un de ses propres problèmes. Qu&#8217;il n&#8217;était pas utile de dépenser beaucoup d&#8217;argent, ni d&#8217;arrêter de travailler, ni de prendre des risques. Qu&#8217;il fallait se concentrer sur le cœur du service et rencontrer ses utilisateurs au plus tôt. Mon problème était que toute mes idées, je les chiffrait a plus de 50 jours de travail juste pour le cœur, la résolution basique du problème. Quand je vois que l&#8217;idée que j&#8217;ai finalement réalisé été chiffré a 4 ou 5 jours et que cela m&#8217;a pris plus de 8 jours et qu&#8217;il reste encore 2 fois plus de boulot, c&#8217;est clairement difficile de tenir la longueur sur un projet de plus de 100 jours.</p>
<h2>Des gens, tu rencontreras</h2>
<p>Et puis j&#8217;ai rencontré des gens, j&#8217;ai rencontré <a href="http://www.kiad.org/">Olivier Issaly</a>, un ami de Mathilde, fondateur d&#8217;<a href="http://www.equideow.com/">Equideow</a> alors qu&#8217;il n&#8217;avait pas fini ses études,  qui m&#8217;a appris que &laquo;&nbsp;c&#8217;était possible&nbsp;&raquo;.</p>
<p>J&#8217;ai rencontré Nicolas Martignole, et son <a href="http://www.express-board.fr">express-board</a>, créé en quelques jours avec l&#8217;aide des lecteurs de son blog et du <a href="http://www.playframework.org/">framework play!</a>.</p>
<p>Je suis allé à <a href="http://www.devoxx.com">Devoxx</a>, une conférence à ne pas rater, vrai &laquo;&nbsp;catalyseur&nbsp;&raquo; d&#8217;idées et de motivation. Il faut le vivre pour comprendre, allez y <img src='http://www.java-freelance.fr/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p>Je suis aussi allé a plusieurs rencontres geek autour de Java, NoSQL, le web sur Paris. A chaque fois j&#8217;ai rencontré des gens intéressant qui donne des idées ou nous conforte dans nos idées.</p>
<h2>Le web, tu comprendras</h2>
<p>Après une mission de 4 ans  sur un Framework Java qui me cachais la &laquo;&nbsp;réalité du web&nbsp;&raquo; à coup d&#8217;architecture Statefull, de JSP, taglibs et autre générateur de pages web, je suis arrivé chez Vidal et j&#8217;ai re découvert le Web. J&#8217;avais déjà mis un pied dans le Web avant Groupama avec PHP. Chez Vidal j&#8217;ai découvert la puissance et la <strong>simplicité</strong> du JavaScript et des architectures Stateless.</p>
<p>Regardez donc les vidéos sur http://www.zengularity.com/ et lisez les premières page de:<br />
<a href="http://www.amazon.fr/gp/product/0980576857?ie=UTF8&#038;tag=javafree-21&#038;linkCode=as2&#038;camp=1642&#038;creative=6746&#038;creativeASIN=0980576857"><img class="aligncenter size-full wp-image-836" src="http://www.java-freelance.fr/wp-content/uploads/2010/11/41xoUXdWINL._SL160_.jpg"></a><img src="http://www.assoc-amazon.fr/e/ir?t=javafree-21&#038;l=as2&#038;o=8&#038;a=098057687" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" /></p>
<p> pour comprendre à quel point le vrai Web, c&#8217;est l&#8217;avenir.</p>
<h2>Petit, tu commenceras</h2>
<p>C&#8217;est facile de dire : je vais faire une facebook-like et je vais être riche. Moins facile à faire ! Alors j&#8217;ai listé toutes mes idées et je les ai triées de la plus difficile à la plus simple à réaliser et j&#8217;en ai déduit &laquo;&nbsp;l&#8217;idée&nbsp;&raquo;. La toute petite idée, tellement simple qu&#8217;en un long week end de 4 jours, j&#8217;avais le temps de la réaliser. Mon &laquo;&nbsp;problème à résoudre&nbsp;&raquo; était en fait multiple:</p>
<ul>
<li> Accéder au <a href="http://code.google.com/p/buildwall/">buildwall de Vidal</a> de chez moi ou depuis mon téléphone</li>
<li>Ne plus perdre les informations du mur chaque fois que le serveur plantait ou qu&#8217;on le mettait à jour.</li>
<li>Ajouter facilement un membre de l&#8217;équipe au wall.</li>
</ul>
<p>Faire un buildwall. Rien de plus simple fonctionnellement. Pour résoudre mes problèmes il suffisait que je porte le projet en un site Internet. Un service sur le cloud, &laquo;&nbsp;Software as a Service&nbsp;&raquo;.</p>
<p>Cela m&#8217;a pris 2 jours pour résoudre les principales problématiques :</p>
<ul>
<li>Faire du plein écran en web.</li>
<li>Trouver le bas d&#8217;une page web (pas si simple, une page web n&#8217;a pas de fond..)</li>
<li>Mettre à jour le mur dynamiquement (merci Ajax et le long polling)</li>
</ul>
<p>Pour cela j&#8217;ai utilisé l&#8217;excellent Framework Play! avec JQuery, HTML5 et CSS3 pour la partie client. Des ressources REST, MySQL en base de donnée avec Memcache pour optimiser le tout.</p>
<p>Et puis le plus long fut finalement tout le reste :</p>
<ul>
<li>la gestion utilisateur</li>
<li>le design du site</li>
<li>les mentions légales</li>
<li>trouver des formules d&#8217;abonnement adaptées</li>
<li>fignoler les détails</li>
</ul>
<p>Franchement, je ne m&#8217;y attendais pas. La bonne surprise fut le CSS, je n&#8217;y connaissais rien et j&#8217;ai appris très vite. Comme quoi même un 0% artiste peut faire une site correct. Alors pourquoi continuer à faire des Intranets moches ? Go apprendre le CSS !</p>
<p>Je me suis amusé aussi :</p>
<ul>
<li>Tout le site est Ajaxifié</li>
<li>Gestion de l&#8217;historique grâce au hash dans l&#8217;url, normé par Google pour qu&#8217;il puisse crawler le site</li>
<li>Gestion de la langue. Si votre navigateur est configuré pour voir les sites en anglais, vous verrez le site traduit en anglais !</li>
</ul>
<h2>En production, tu iras</h2>
<p>J&#8217;ai mis en production 2 semaines après le début du développement. Sans faire de pub dans un premier temps, le temps de faire les derniers réglages. J&#8217;ai su stopper mes ardeurs et ne pas démarrer les fonctionnalités annexes et peut être pas utiles (le paiement en ligne par exemple). Il faut que le produit se confronte aux utilisateurs pour comprendre leurs besoins et faire évoluer le site dans le bon sens.</p>
<p>Vous trouverez le site à cette adresse : <a href="http://www.buildwall.com">http://www.buildwall.com</a> N&#8217;hésitez pas a participer à son amélioration ! Toute critique ou idée est la bienvenue !</p>
<h2>Grand, tu finiras ?</h2>
<p>Clairement le but de ce site n&#8217;est pas de faire fortune. C&#8217;est un premier site, un premier service, une première création qui me permettra de me confronter à la réalité de l&#8217;édition de logiciel. J&#8217;y ai passé peu de temps finalement et j&#8217;ai appris énormément. Je suis donc déjà récompensé !</p>
<p>Comme je l&#8217;ai dit j&#8217;ai une &laquo;&nbsp;liste&nbsp;&raquo;, j&#8217;ai donc un prochain projet, plus difficile à mettre en œuvre. C&#8217;est marrant car ce projet je l&#8217;ai mais je ne le connais pas, ma liste évoluant sans cesse, je ne peux dire quel projet ce sera lorsque je me déciderai à le commencer.</p>
<h2>Tout le monde, tu remercieras</h2>
<p>Je tiens vraiment à remercier tous mes collègues et amis (oula ça fait cliché mais c&#8217;est pas grave), en fait je suis surpris de n&#8217;avoir rencontré personne qui m&#8217;a dit &laquo;&nbsp;c&#8217;est nul, ça sert à rien&nbsp;&raquo; mais je ne désespère pas ! Alors dans le désordre, merci :</p>
<p>Jean-Laurent bien entendu pour m&#8217;avoir fait découvrir l&#8217;agilité, l&#8217;intégration continue et l&#8217;utilité d&#8217;un buildwall. Louis, pour ta relecture, Tony pour ton aide précieuse sur JQuery, Aurélien alias &laquo;&nbsp;John&nbsp;&raquo; pour ton aide précieuse sur le logo. Mathilde pour t&#8217;être occupée des monstres. Merci a tous ceux qui m&#8217;ont encouragé, les collègues de Vidal et les personnes rencontrés à Devoxx à qui j&#8217;ai présenté le &laquo;&nbsp;proof of concept&nbsp;&raquo; du produit et qui ont été les premiers à me donner de nouvelles idées.</p>
<p>Merci enfin à tous ceux qui s&#8217;inscriront sur <a href="http://www.buildwall.com">http://www.buildwall.com</a> et qui m&#8217;aideront à améliorer le produit (ou à le vendre à leur employeur <img src='http://www.java-freelance.fr/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' /> )</p>

]]></content:encoded>
			<wfw:commentRss>http://www.java-freelance.fr/web/il-etait-une-fois-un-reve/feed</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Spock-(3/X) – Spock, EasyMock, Mockito et les arguments</title>
		<link>http://www.java-freelance.fr/java/spock-easymock_mockito_argument</link>
		<comments>http://www.java-freelance.fr/java/spock-easymock_mockito_argument#comments</comments>
		<pubDate>Mon, 08 Nov 2010 08:30:27 +0000</pubDate>
		<dc:creator>Mathilde</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Bdd]]></category>
		<category><![CDATA[easymock]]></category>
		<category><![CDATA[mockito]]></category>
		<category><![CDATA[Spock]]></category>
		<category><![CDATA[test]]></category>

		<guid isPermaLink="false">http://www.java-freelance.fr/?p=1010</guid>
		<description><![CDATA[			
			
L&#8217;article précédent a permis de comparer la syntaxe des trois frameworks sur les cas classiques. Un cas où Spock se détache vraiment des deux autres frameworks, c&#8217;est sur la gestion des arguments des méthodes mockées.
Les wildcards
Il est possible d&#8217;utiliser des wildcards au niveau des arguments appelés. Ainsi 1 * calendarDao
.getInfosByDay(_) veut dire &#8216;la méthode calendarDao.getInfosByDay [...]]]></description>
			<content:encoded><![CDATA[			
			
<p><img class="alignleft size-medium wp-image-1084" style="border: 5px solid white;" title="339996940_62812ae285" src="http://www.java-freelance.fr/wp-content/uploads/2010/11/339996940_62812ae285-225x300.jpg" alt="" width="225" height="300" />L&#8217;article précédent a permis de comparer la syntaxe des trois frameworks sur les cas classiques. Un cas où Spock se détache vraiment des deux autres frameworks, c&#8217;est sur la gestion des arguments des méthodes mockées.</p>
<h2>Les wildcards</h2>
<p>Il est possible d&#8217;utiliser des wildcards au niveau des arguments appelés. Ainsi 1 * calendarDao<br />
.getInfosByDay(_) veut dire &#8216;la méthode calendarDao.getInfosByDay est appelée une fois (1 *) avec n&#8217;importe quel paramètre (_). On peut également spécifier la classe de l&#8217;argument : 1 * calendarDao.getInfosByDay(_ as String) .</p>
<p>Il est également possible par exemple de compter le nombre d&#8217;appel aux  méthodes d&#8217;un simulacre (quel quel soit : 3 * calendarDao._ passera  uniquement si les instructions du bloc when font exactement appel à 3  méthodes de l&#8217;instance calendarDao. Il est également possible de donner  des intervalles plutôt qu&#8217;une valeur, ce qui n&#8217;est pas permis par les autres frameworks (à part le &#8216;au moins 1 fois&#8217;) :<span id="more-1010"></span><br />
(1..3) *  calendarDao.getInfosByDay(_) [entre 1 et 3 fois]<br />
(5.._) *  calendarDao.getInfosByDay(_) [=&gt; au moins 5 fois]<br />
(_..5) *  calendarDao.getInfosByDay(_) [=&gt; au plus 5 fois]</p>
<p>Il existe de nombreux wildcard, la plupart ne servent pas à grand chose. Ceux qui me semblent le plus important :<br />
calendarDao.getInfosByDay(_) : n&#8217;importe quel argument<br />
calendarDao.getInfosByDay(!null) : n&#8217;importe quel argument non null<br />
calendarDao.getInfosByDay(_ as String) tous les éléments de type String</p>
<p>Equivalent EasyMock</p>
<p>expect(calendarDao.getInfosByDay((String)anyObject())) : n&#8217;importe quel argument, obligation d&#8217;être une String<br />
expect(calendarDao.getInfosByDay((String)notNull())): n&#8217;importe quel argument non null<br />
expect(calendarDao.getInfosByDay(isA(String.class))):tous les élements de type String</p>
<p>Equivalent Mockito</p>
<p>when(calendarDao.getInfosByDay(anyString())) : n&#8217;importe quel argument, obligation d&#8217;être une String<br />
when(calendarDao.getInfosByDay((String)notNull())): n&#8217;importe quel argument non null<br />
when(calendarDao.getInfosByDay(isA(String.class))): tous les élements de type String</p>
<p>Vous pouvez trouver la liste ici : <a href="http://code.google.com/p/spock/wiki/Interactions">http://code.google.com/p/spock/wiki/Interactions</a></p>
<h2>Les contraintes personnalisées</h2>
<p>Les contraintes personnalisées sont très utiles dans certains cas, par exemple lorsque la méthode equals est déjà défini dans le code et qu&#8217;elle ne correspond pas à notre besoin ou que nous avons par exemple un champ date que nous souhaitons exclure de la comparaison. En règle général, il vaut mieux redéfinir la méthode equals qui est spontannément utilisée par les 3 frameworks pour comparer l&#8217;égalité des arguments attendus et reçus.</p>
<p>Nous allons chercher avec les 3 frameworks à créer des contraintes personnalisés (spock) ou des argument matcher (Mockito &amp; Easymock).  Notre but est de faire en sorte que l&#8217;appel à listSpockData.add avec un paramètre ayant comme variable de classe img égale à &laquo;&nbsp;a&nbsp;&raquo; soit bien simulée. Pour cela, nous créons un objet spockData ayant bien img = &laquo;&nbsp;a&nbsp;&raquo; ainsi qu&#8217;une liste d&#8217;objets SpockData. Nous appelons ensuite la méthode listSpockData avec l&#8217;objet spockData et vérifions que cette dernière a bien été appelée.</p>
<p>Avec Spock :</p>
<pre class="brush:java">  def "should list Spock Data"() {
    given:
    SpockData spockData = new SpockData("a", "accroche", "details", 6);
    List listSpockData = Mock();
    when :
    listSpockData.add spockData;
    then :
     1*listSpockData.add({it.img=="a"})
  }
</pre>
<p>Spock permet via les conditions particulières de définir un bloc à l&#8217;aide d&#8217;une closure , avec { } et de définir à l&#8217;intérieur plusieurs conditions. It signifie ici l&#8217;objet qui sera passé en paramètre à la méthode. Il est possible d&#8217;utiliser plusieurs expression (it.img==&nbsp;&raquo;img&nbsp;&raquo;&amp;&amp;it.day==6) ou une fonction définie dans la classe de test.</p>
<p>Avec Mockito,  qui utilise en fait les ArgumentMatcher du framework Hamcrest.</p>
<pre class="brush:java">class isImgEqualToA extends ArgumentMatcher { //creation d un argument matcher
	      public boolean matches(Object spockData) {
	          return ((SpockData) spockData).getImg() == "a";
	      }
	   }
	@Test
	public void testArgumentMockito(){
		       List mock = mock(List.class);
			   when(mock.add(argThat(new isImgEqualToA()))).thenReturn(true);
			   mock.add(newSpockData("a", "b", "c", 2));
			   verify(mock).add(argThat(new isImgEqualToA()));

	}
</pre>
<p>Avec Easymock, l&#8217;opération se révèle être très verbeuse. [<a href="http://www.java-freelance.fr/java/easymock-techniques-avancees">Pour voir une implémentation plus conforme</a>]  :</p>
<pre class="brush:java">	static class Matcher implements IArgumentMatcher { //creation du matcher

		@Override// implementer cette methode permet de definir
                             // un message d erreur
		public void appendTo(StringBuffer arg0) {
		}

		@Override// definition de la methode qui verifiera que
                             // l argument img est bien egal a A. smell code.
		public boolean matches(Object spockData) {
			return ((SpockData) spockData).getImg() == "a";
		}
                // definition d une methode static pour déclarer le matcher
		public static SpockData isImgEqualToA() {
		    EasyMock.reportMatcher(new Matcher());
		    return null;
		}
	}

	@Test //Test
	public void testArgumentEasyMock() {
		List mock = createMock(List.class);
		expect(mock.add(Matcher.isImgEqualToA())).andReturn(true);
		replay(mock);
		mock.add(new SpockData("a", "b", "c", 2));
		verify(mock);
	}
</pre>
<p>Les tests mockito et easymock sont bien plus verbeux et au final sont plus restrictifs car elles utilisent des classes séparées pour définir les matchers. Spock évite la lourdeur d&#8217;avoir à définir une autre classe</p>
<p>Néanmoins, dans le cas de tests avec ArgumentMatcher, EasyMock &amp; Mockito permettent de définir des messages d&#8217;erreurs personnalisés, via la méthode appendTo pour le premier et describeTo pour le deuxième. Notons que pour le premier, il faut la coder nous même alors que le deuxième en propose une par défaut construite à partir du nom de la classe isImgEqualToA donne &#8216;Img equal to A&#8217;. En règle général, on affiche un toString() de l&#8217;objet pour aider au debuggage et on regarde alors les 2 chaînes pour trouver les différences (ou en pas à pas en debug). Spock ne propose rien de tel dans sa version actuelle (0.4) mais en version 0.5 il est prévu de pouvoir <a href="http://ldaley.com/post/1281387832/spocks-new-matching-supporthttp://ldaley.com/post/1281387832/spocks-new-matching-support">utiliser les matchers d&#8217;Hamcrest</a>, revenant à avoir la même syntaxe qu&#8217;avec Mockito, en un peu plus courte.</p>
<p>Crédit Photo : Oskay &#8211; http://www.flickr.com/photos/oskay/339996940/sizes/m/in/photostream/</p>

]]></content:encoded>
			<wfw:commentRss>http://www.java-freelance.fr/java/spock-easymock_mockito_argument/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Spock-(2/X) &#8211; Spock, EasyMock et Mockito sont sur un bateau</title>
		<link>http://www.java-freelance.fr/java/spock-mockito-easymoc</link>
		<comments>http://www.java-freelance.fr/java/spock-mockito-easymoc#comments</comments>
		<pubDate>Thu, 04 Nov 2010 08:00:21 +0000</pubDate>
		<dc:creator>Mathilde</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[duchess]]></category>
		<category><![CDATA[easymock]]></category>
		<category><![CDATA[mockito]]></category>
		<category><![CDATA[Spock]]></category>
		<category><![CDATA[test]]></category>

		<guid isPermaLink="false">http://www.java-freelance.fr/?p=909</guid>
		<description><![CDATA[			
			
On a vu dans la première partie que l&#8217;on pouvait faire facilement du data-driven testing et que la syntaxe en bloc apportait beaucoup en lisibilité. Les blocs expect/where que l&#8217;on a vu sont les plus adéquats lors de cas de tests simples, où l&#8217;on peut facilement exprimer le stimulus et son résultat, typiquement monojbetA.maMethode()==monResultat. Dans [...]]]></description>
			<content:encoded><![CDATA[			
			
<p><a href="http://www.java-freelance.fr/wp-content/uploads/2010/11/4583947620_8faa2ee4a7.jpg"><img class="alignleft size-medium wp-image-1020" style="border: 5px solid white;" title="4583947620_8faa2ee4a7" src="http://www.java-freelance.fr/wp-content/uploads/2010/11/4583947620_8faa2ee4a7-199x300.jpg" alt="" width="199" height="300" /></a>On a vu dans la première partie que l&#8217;on pouvait faire facilement du data-driven testing et que la syntaxe en bloc apportait beaucoup en lisibilité. Les blocs expect/where que l&#8217;on a vu sont les plus adéquats lors de cas de tests simples, où l&#8217;on peut facilement exprimer le stimulus et son résultat, typiquement <em>monojbetA.maMethode()==monResultat</em>. Dans le cas où l&#8217;on se retrouve face à des tests un peu plus compliqués,  l&#8217;utilisation de la structure given/when/then est alors préférable. Cet article n&#8217;a pas pour vocation de comparer les fonctionnalités des trois frameworks, juste de présenter spock et de comparer la syntaxe des trois frameworks dans le cas de tests &#8216;classiques&#8217;.<br />
<span id="more-909"></span></p>
<h2>Test given/when/then</h2>
<p>En effet, un bloc then permet de déclarer des conditions, des exceptions, des interactions et des définitions de variables là où un bloc expect ne peut contenir que des conditions et des déclarations de variables. L&#8217;écriture given/when/then est également plus intuitive dans le cas où vous souhaitez tester des stories. C&#8217;est également une des clés du Behavior Driven Development et une méthode saine pour structurer ses tests, qui oblige à réfléchir vraiment à ce que l&#8217;on teste.  Ce que j&#8217;aime chez spock, c&#8217;est que c&#8217;est obligatoirement intégré via ces blocs, on ne peut pas faire autrement <img src='http://www.java-freelance.fr/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<h2>Test condition simple &#8211; comportement</h2>
<p>Spock permet le data-driven testing mais c&#8217;est également un framework facilitant la création de bouchons/simulacres <a href="http://www.java-freelance.fr/java/bouchon-stub-ou-simulacre-mock">[Plus d'infos sur les différences bouchon/simulacre et test d'état/de comportement</a>]. On s&#8217;intéresse ici  au le test par comportement, c&#8217;est à dire qu&#8217;on va s&#8217;occuper des chainages des appels des méthodes entre elles et moins du résultat. On cherche alors à vérifier que l&#8217;appel à <em>spockResource.findCalendarByDay(&#8216;1&#8242;)</em> entraîne bien un unique appel à  <em>calendarDao.getInfosByDay(&#8216;1&#8242;)</em>.</p>
<pre class="brush:java"> def "test par comportement"() {
    given:
    def calendarDao = Mock(CalendarDao)
    def spockResource = new SpockResource(calendarDao)
    when :
    spockResource.findCalendarByDay("1")
    then :
    1 * calendarDao.getInfosByDay("1")
  }</pre>
<p>Le bloc given permet de définir les variables nécessaires à l&#8217;exécution du test. Ici, on bouchonne le dao que l&#8217;on affecte ensuite au service que l&#8217;on souhaite tester. Le bloc when correspond à l&#8217;appel de la méthode à tester.<br />
Le bloc then comporte ici uniquement la condition à tester. La syntaxe veut dire on vérifie que la méthode<em> calendarDao<br />
.getInfosByDay</em> est appelée uniquement une fois (1 *) avec le paramètre &#8216;1&#8242;.  Les paramètres sont évalués via l&#8217;appel à la méthode equals.</p>
<p>A la différence d&#8217;EasyMock, qui fonctionne par défaut avec des simulacres, Spock comme Mockito renvoie de base pour toutes les méthodes mockées sans spécification null ou 0 ou false. Ici par  exemple, l&#8217;appel à</p>
<pre class="brush:java">calendarDao
    .getInfosByDay("1")</pre>
<p>renverra null. Pour spécifier une valeur de retour différente, il suffit d&#8217;utiliser la syntaxe suivante :</p>
<pre class="brush:java"> calendarDao
    .getInfosByDay(_) &gt;&gt; new SpockInfo("1");</pre>
<p>Le même code avec EasyMock avec une valeur de retour :</p>
<pre class="brush:java">@Test
	public void testEasyMock() {
                //given
		CalendarDao calendarDao = createNiceMock(CalendarDao.class);
		SpockResourcespockResource = new SpockResource(
				calendarDao);
		expect(calendarDao.getInfosByDay("1")).andReturn(
				new SpockInfo("1"));
		replay(calendarDao);
                //when
		SpockInfo spockInfo= spockResource.findCalendarByDay("1");
		//then
                verify(calendarDao);
	}</pre>
<p>Avec EasyMock, on annote la méthode par @Test [annotation JUnit] puis on crée le mock à l&#8217;aide de <em>EasyMock.createNiceMock</em>, pour avoir un mock lénient. On précise ensuite que l&#8217;on s&#8217;attend à ce que la méthode<em> calendarDao.getInfosByDay(&#8216;1&#8242;)</em> retourne l&#8217;objet <em>new SpockInfo(&#8216;1&#8242;)</em> avec <em>expect(calendarDao.getInfosByDay(&#8216;1&#8242;)).andReturn(new </em><em>SpockInfo</em><em>(&#8216;1&#8242;));</em> . On &#8216;charge&#8217; ensuite les mocks via le <em>replay </em>et à la ligne suivante on lance l&#8217;appel à la méthode testée. Le <em>verify </em>à la dernière ligne permet de vérifier qu&#8217;un unique appel à la méthode a bien été effectué.</p>
<h2>Test condition simple &#8211; état</h2>
<p>L&#8217;inconvénient de l&#8217;utilisation des simulacres, c&#8217;est que les tests et le code testé sont très (trop!) liés. Ainsi une modification du code peut entraîner beaucoup de refactoring au niveau des tests sans valeur ajouté. L&#8217;exemple le plus marquant est la séparation d&#8217;une méthode en deux méthodes distinctes : il faut reprendre tous les simulacres alors que ce n&#8217;est qu&#8217;une modification de &#8216;clarté&#8217;. Il est donc souvent préférable de ne pas tester le comportement mais uniquement le résultat à chaque fois que cela est possible et judicieux, c&#8217;est à dire du faire du test sur l&#8217;état des objets.</p>
<pre class="brush:java">  def "test stub avec retour"() {
    given:
    def calendarDao = Mock(CalendarDao)
    def spockResource = new SpockResource(calendarDao)

    when :
    def spockInfo = spockResource.findCalendarByDay("1")

    then :
     calendarDao
    .getInfosByDay("1") &gt;&gt; new SpockInfo("1");
    spockInfo.day == 1
  }</pre>
<p>Ici, on ne fait plus de contrôle sur le nombre d&#8217;appel à la méthode <em>getInfosByDay(&#8216;1&#8242;)</em>. On indique juste que lorsque cette méthode est appelée, on renvoie (&gt;&gt;) une nouvelle instance de <em>SpockInfo</em>.  Ici pas de assertEquals ou autre méthode du genre, le <em>spockInfo.day==1</em> est en fait un raccourci pour écrire<em> assert spockInfo.day == 1</em>.On vérifie que la variable <em>day </em>de l&#8217;objet <em>spockInfo </em>est bien égale à 1.<br />
Voilà le code équivalent avec Mockito :</p>
<pre class="brush:java">        @Test
	public void testMockito() {
		//Given
                CalendarDao calendarDao = mock(CalendarDao.class);
		SpockResource spockResource = new SpockResource(
				calendarDao);
		when(calendarDao.getInfosByDay("1")).thenReturn(
				new SpockData("1"));
		//when
                SpockData spockData= spockResource.findCalendarByDay("1");
		//then
                assertEquals("1", spockData.getDay());
	}</pre>
<p>A la première ligne, on construit le bouchon <em>calendarDao </em>que l&#8217;on affecte à la ligne suivante à l&#8217;objet <em>spockResource</em>. On indique au bouchon <em>calendarDao </em>que quand la méthode <em>getInfosByDay </em>est appelée avec le paramètre &#8216;1&#8242;, alors elle retourne <strong>new SpockData(&#8216;1&#8242;)</strong>. On effectue ensuite l&#8217;appel à la méthode testée<em> spockResource.findCalendarByDay(&#8216;1&#8242;)</em> et on vérifie que la variable <em>day </em>du résultat <em>spockData </em>est bien égale à 1.</p>
<p>Et si on veut chainer les retours ?</p>
<h2>Test  retour multiple</h2>
<p>Il est parfois nécessaire de renvoyer des valeurs différentes pour une même méthode bouchonnée. Pour les 3 cas suivants, le premier appel à la méthode <em>calendarDao.getInfosByDay</em> avec le paramètre &#8216;1&#8242; renverra<em> SpockInfo(&#8216;1&#8242;)</em>, le deuxième <em>new SpockInfo(&#8216;2&#8242;)</em> :</p>
<p>Avec Easymock :</p>
<pre class="brush:java">expect(calendarDao.getInfosByDay("1")).andReturn(new SpockInfo("1")).andReturn(new SpockInfo("2"))</pre>
<p>Avec Mockito :</p>
<pre class="brush:java">when(calendarDao.getInfosByDay("1")).thenReturn(new SpockData("1")).thenReturn(new SpockInfo("2"))</pre>
<p>Avec Spock :</p>
<pre class="brush:java">calendarDao.getInfosByDay("1") &gt;&gt;&gt; [new SpockInfo("1"),new SpockInfo("2")];</pre>
<p>Le prochain article abordera les fonctionnalités plus avancées de la gestion des arguments des fonctions mockées (ArgumentMatcher) également dans les trois frameworks.</p>
<p>Crédit Photo : <a href="http://www.flickr.com/photos/mistinguette18/4583947620/sizes/m/in/photostream/">Mistinguette18</a></p>

]]></content:encoded>
			<wfw:commentRss>http://www.java-freelance.fr/java/spock-mockito-easymoc/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Spock (1/3) &#8211; Spock, JUnit et le Data Driven Testing</title>
		<link>http://www.java-freelance.fr/java/spock-13-spock-junit-et-le-data-driven-testing</link>
		<comments>http://www.java-freelance.fr/java/spock-13-spock-junit-et-le-data-driven-testing#comments</comments>
		<pubDate>Tue, 02 Nov 2010 08:10:00 +0000</pubDate>
		<dc:creator>Mathilde</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Bdd]]></category>
		<category><![CDATA[duchess]]></category>
		<category><![CDATA[Groovy]]></category>
		<category><![CDATA[JDuchess]]></category>
		<category><![CDATA[Spock]]></category>
		<category><![CDATA[TDD]]></category>
		<category><![CDATA[test]]></category>

		<guid isPermaLink="false">http://www.java-freelance.fr/?p=875</guid>
		<description><![CDATA[			
			
Au cours de mes tribulations, je suis tombée sur un nouveau framework de test : Spock, basé sur Groovy &#38; JUnit.  Il est facile à prendre en main et est beaucoup moins verbeux que certains autres framework de tests même quand on ne maitrîse pas Groovy. Les tests sont structurés à l&#8217;aide de blocs  given/when/then [...]]]></description>
			<content:encoded><![CDATA[			
			
<p><a href="http://www.java-freelance.fr/wp-content/uploads/2010/11/spock.jpg"><img class="alignleft size-medium wp-image-988" style="border: 5px solid white;" title="spock" src="http://www.java-freelance.fr/wp-content/uploads/2010/11/spock-300x270.jpg" alt="" width="300" height="270" /></a>Au cours de mes tribulations, je suis tombée sur un nouveau framework de test : Spock, basé sur Groovy &amp; JUnit.  Il est facile à prendre en main et est beaucoup moins verbeux que certains autres framework de tests même quand on ne maitrîse pas Groovy. Les tests sont structurés à l&#8217;aide de blocs  given/when/then et setup/expect/where ce qui permet d&#8217;améliorer la lisibilité et l&#8217;écriture. Ce framework est à suivre, il est rapidement pris en main mais il manque encore certaines fonctionnalités avancées. Cet article est le premier d&#8217;une série de trois, il permettra de comparer spock à d&#8217;autres frameworks similaires.<br />
<span id="more-875"></span></p>
<h2>Premier test setup/expect/where</h2>
<pre class="brush:java">def "String param should correspond to numeric spockInfoDay - classical syntax"() {
    setup:
     def spockResource = new SpockResource(new CalendarDaoStatic())
    expect:
    spockResource.findCalendarByDay(day).day == dayNumeric

    where:
    day  &lt;&lt;   ["1", "2", "3"]
    dayNumeric &lt;&lt; [1, 2, 3]
  }</pre>
<p>Le test est organisé en 3 blocs : setup, expect et where le tout placé dans un objet dont le nom est défini par def &laquo;&nbsp;nom du test&nbsp;&raquo;.  Le premier bloc setup sert à déclarer les variables qui vont être utilisées dans la suite du test. Ici c&#8217;est par exemple l&#8217;instanciation de l&#8217;objet spockResource. Dans le bloc where, je définis deux variables : l&#8217;une <em>day </em>qui prendra <strong>successivement </strong>les valeurs &#8216;1&#8242;,&#8217;2&#8242; et &#8216;3&#8242; et l&#8217;autre <em>dayNumeric </em>les valeurs 1,2,3 [groovy est un langage dynamique donc pas besoin d'indiquer le type des variables, il sera déterminé automatiquement]. Dans le bloc expect, j&#8217;indique mon test : je vérifie que la méthode<em> spcokResource.findCalendarByDay</em> retourne bien un objet comportant un attribut day dont la valeur correspond à la valeur en tant qu&#8217;entier d&#8217;une chaîne de caractère [c'est à dire que ma fonctionnalité ne fait pas grand chose d'autre qu'un <em>Integer.valueOf]</em>.  Lors de l&#8217;exécution, il y a en réalité 3 tests JUnit qui sont exécutés, un pour chaque couple de paramètre <em>day</em>=&#8217;1&#8242; &amp; <em>dayNumeric</em>=1 / <em>day</em>=&#8217;2&#8242; &amp; <em>dayNumeric</em>=2 / <em>day</em>=&#8217;3&#8242; &amp; <em>dayNumeric</em>=3</p>
<h2>Test avec structure en tableau</h2>
<p>Le même test peut être écrit d&#8217;une manière différente en utilisant une autre syntaxe, encore plus lisible.</p>
<pre class="brush:java">def "String param should correspond to numeric spockInfoDay"() {
    setup:
    def spockResource = new SpockResource(new CalendarDaoStatic())
    expect:
    spockResource.findCalendarByDay(day).day == dayNumeric

    where:
    day     | dayNumeric
    "1"  | 1
    "2"  | 2
    "3"  | 3
  }</pre>
<p>Ici même principe,  3 tests seront joués , avec les paramètres <em>day </em>= &#8216;1&#8242; et <em>dayNumeric </em>= 1 / <em>day </em>= &#8216;2&#8242; et <em>dayNumeric </em>= 2 /<em>day </em>= &#8216;3&#8242; et <em>dayNumeric </em>= 3 . Les paramètres étant les uns à la suite des autres et  séparés par des | cela permet de mieux visualiser ses données de test.</p>
<p>Le choix entre la première et la deuxième méthode dépend du contexte. Si les données à tester sont statiques, la deuxième méthode est plus claire. Mais la première méthode permet de tester avec des données dynamiques comme par exemple :</p>
<pre class="brush:java">where:
[a, b, c] &lt;&lt; sql.rows("select a, b, c from maxdata")</pre>
<p>Ces deux syntaxes permettent de faire du data-driven testing, c&#8217;est à dire du test piloté par les données : il est possible de vérifier plusieurs test cases en injectant les données de départ et les données attendues via une source externe, ici le bloc where. Nettement plus simple que de lancer trois tests JUnit différent pour le même comportement, le tout en restant très lisible.</p>
<h2>JUnit</h2>
<p>Si on regarde l&#8217;équivalent JUnit</p>
<pre class="brush:java"> @RunWith(Parameterized.class)
public class DataDrivenSimpleTest {
  private Integer day;
  private Integer dayNumeric;

  @Parameters
  public static Collection<Object[]> data() {
    return Arrays.asList(new Object[][] { { 1, 1 }, { 2, 2 },
              { 3, 3 } });
  }

  public DataDrivenSimpleTest(Integer day, Integer dayNumeric) {
    super();
    this.day = day;
    this.dayNumeric = dayNumeric;
  }

  @Test
  public void shouldReturnTheNumericValueOfDay() {
    FoetusCalendarResource calendar = new FoetusCalendarResource(
        new CalendarDaoStatic());
    assertEquals(calendar.findCalendarByDay(day).getNbJour(), dayNumeric);

  }
}</pre>
<p>Voilà l&#8217;exemple avec l&#8217;annotation <em>@Parameters</em> incluse dans JUnit depuis la version 4.0 et il n&#8217;y a que l&#8217;essentiel pour tester la méthode <em>findCalendarByDay</em>. Tout d&#8217;abord, la classe doit être lancée avec un runner spécifique <em>Parameterized.class</em> (à la ligne 1). Elle a besoin de deux variables de classes<em> day</em> et <em>dayNumeric </em>ainsi que d&#8217;un constructeur qui initialise ses deux variables. Il y a aussi besoin d&#8217;une méthode public static qui retourne une collection d&#8217;object représentant les différentes données pouvant être prises par les deux paramètres<em> day</em> et <em>dayNumeric </em> annotée avec <em>@Parameters</em>. Seulement ensuite apparait la méthode de test, <em>shouldReturnTheNumericValueOfDay </em>qui utilise les variables de classes <em>day </em>et <em>dayNumeric</em>. Il est également possible dans la méthode annotée par <em>@Parameters</em> de définir de manière dynamique des jeux de données, on peut par exemple penser à l&#8217;importation de données à partir d&#8217;un fichier excel ou d&#8217;une requête SQL par exemple comme avec Spock. Outre la verbosité de cette méthode, il n&#8217;est possible que d&#8217;avoir un seul test paramétré par classe.</p>
<p>Les pré-requis à l&#8217;utilisation des tests paramétrés avec JUnit (variables de classe, runner, constructeur &#8230;) font que je préfère largement utiliser Spock pour faire du data-driven testing.</p>

]]></content:encoded>
			<wfw:commentRss>http://www.java-freelance.fr/java/spock-13-spock-junit-et-le-data-driven-testing/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Let&#8217;s make this test suite run faster! SoftShake 2010</title>
		<link>http://www.java-freelance.fr/java/lets-make-this-test-suite-run-faster-softshake-2010</link>
		<comments>http://www.java-freelance.fr/java/lets-make-this-test-suite-run-faster-softshake-2010#comments</comments>
		<pubDate>Tue, 26 Oct 2010 07:00:51 +0000</pubDate>
		<dc:creator>Mathilde</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[agile]]></category>
		<category><![CDATA[code]]></category>
		<category><![CDATA[duchess]]></category>
		<category><![CDATA[easymock]]></category>
		<category><![CDATA[JUnit]]></category>
		<category><![CDATA[mockito]]></category>
		<category><![CDATA[test]]></category>

		<guid isPermaLink="false">http://www.java-freelance.fr/?p=920</guid>
		<description><![CDATA[			
			
Qui n&#8217;a jamais attendu de nombreuses minutes pour builder un projet ? Et qui n&#8217;en a jamais profité pour aller boire un café/regarder twitter/&#8230; ?   Parce que l&#8217;on teste fréquemment, il est important d&#8217;essayer d&#8217;optimiser et de réduire la durée d&#8217;exécution des tests.  Tester souvent ne veux pas dire attendre souvent ! Il [...]]]></description>
			<content:encoded><![CDATA[			
			
<p style="text-align: left;"><a href="http://www.java-freelance.fr/wp-content/uploads/2010/10/cheater.png"><img class="size-medium wp-image-927 alignleft" style="border: 5px solid white;" title="cheater" src="http://www.java-freelance.fr/wp-content/uploads/2010/10/cheater-222x300.png" alt="" width="222" height="300" /></a>Qui n&#8217;a jamais attendu de nombreuses minutes pour builder un projet ? Et qui n&#8217;en a jamais profité pour aller boire un café/regarder twitter/&#8230; ? <img src='http://www.java-freelance.fr/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  Parce que l&#8217;on teste fréquemment, il est important d&#8217;essayer d&#8217;optimiser et de réduire la durée d&#8217;exécution des tests.  Tester souvent ne veux pas dire attendre souvent ! Il est donc primordial d&#8217;essayer de réduire cette durée en jouant sur différents paramètres. Comment obtenir le résultat des tests le plus rapidement possible ?</p>
<p style="text-align: left;">Ce qui suit est tiré de la conférence de David Gageot [ <a href="http://twitter.com/dgageot" target="_blank">@dgageot</a> / <a rel="me nofollow" href="http://javabien.net/" target="_blank">http://javabien.net</a> ] à SoftShake 2010.</p>
<p style="text-align: left;">Sur une vingtaine de personnes présentes dans la salle, les durées de build vont de quelques minutes à plusieurs heures. David présente brièvement quelques frameworks comme Infinitest et JUnitMax. Ce sont des plugins pour IDE Java qui permettent de lancer les tests unitaires en continu et de manière intelligente, c&#8217;est à dire uniquement ceux impactés par le code modifié.<br />
La première idée lorsque l&#8217;on cherche à optimiser cette durée d&#8217;exécution, c&#8217;est de vouloir déléguer le problème. C&#8217;est faire  tourner les tests sur des serveurs distribués qui permettront d&#8217;exécuter les tests en tâches de fond. C&#8217;est une mauvaise idée, les serveurs coûtent chers et on peut se retrouver submerger. Il existe des méthodes plus simples pour réduire cette durée.</p>
<p style="text-align: left;">Le KISS ( Keep It Simple, Stupid ) est également applicable lorsque l&#8217;on crée des tests. Chercher à optimises ses tests peut améliorer votre produit : ce qui est simple à tester sera simple à coder et à utiliser. Ce qui est compliqué n&#8217;en vaut surement pas la peine.<span id="more-920"></span></p>
<h2>Le tricheur</h2>
<p>La manière la plus simple pour accélérer les tests c&#8217;est d&#8217;acheter une machine plus rapide. Exécuter les tests sur une machine plus rapide peut être un vrai gain de temps, David nous donne l&#8217;exemple d&#8217;une exécution 15% plus rapide sur la machine la plus rapide par rapport à la plus lente. Il est également possible d&#8217;utiliser la nouvelle fonctionnalité de maven de build en parallèle (mvn -T2 clean install / mvn -t4 clean install). Nous avons essayé sur un de nos projets, l&#8217;exécution du build est passé de 1m30 à 30 secondes !<br />
Il est également possible de faire en sorte que les tâches maven surefire pour JUnit et TestNG soient exécutés en parallèle. Comme les tests se doivent d&#8217;être indépendant et isolés, ce sont de bons candidats à une exécution en parallèle. Faire quand même attention que vous pouvez vous retrouver avec des problèmes de concurrence dans certains cas.</p>
<pre class="brush:xml">&lt;plugin&gt;
   &lt;groupId&gt;org.apache.maven.plugins&lt;/groupId&gt;
   &lt;artifactId&gt;maven-surefire-plugin&lt;/artifactId&gt;
   &lt;version&gt;2.5&lt;/version&gt;
   &lt;configuration&gt;
     &lt;parallel&gt;methods&lt;/parallel&gt;
     &lt;threadCount&gt;4&lt;/threadCount&gt;
   &lt;/configuration&gt;
&lt;/plugin&gt;
</pre>
<p>Il existe deux façons de paralléliser : méthodes ou classes. Utiliser la méthode de parallélisation par méthode peut se révéler risqué car il est fort probable que tous les tests n&#8217;auront pas été designés dans l&#8217;optique d&#8217;être exécutés en parallèle, la méthode &#8216;classes&#8217; est un choix plus prudent. Plus d&#8217;infos sur le blog de <a href="http://www.wakaleo.com/blog/274-running-junit-tests-in-parallel-with-maven" target="_blank">Wakaleo Consulting</a>.</p>
<h2>Le paresseux</h2>
<p>Il y a souvent des tests redondants dans un projets : débusquez les, cela permettra de gagner en exécution et en lisibilité. C&#8217;est tellement simple qu&#8217;on ne le fait pas ! Ne pas hésiter à supprimer des fonctionnalités et les tests associés si elles ne servent plus rien, le projet y gagnera en simplicité.<br />
Les accès réseaux et disques sont trop lents. Il faut essayer au maximum de s&#8217;en passer et privilégier les bases de données en mémoire comme h2 (qui ressemblera plus à mysql que hsqldb). De même pour les accès mails, il est possible d&#8217;utiliser dans les tests des serveurs SMTP en mémoire comme ethereal. Si beaucoup de tests accèdent à des fichiers, Spring Resource ou Apache VFS (Virtual File System) sont de bonnes alternatives.</p>
<h2>Le brave</h2>
<p>Il est préférable de tester les règles métiers dans les tests unitaires plutôt que dans les test d&#8217;intégrations. Il ne faut pas confondre tests d&#8217;intégrations et tests unitaires : les premiers sont , bien qu&#8217;essentiel, plus longs à tester, ils doivent être utiliser avec parcimonie. Par exemple, pour plusieurs tests qui accèderaient à une base de données peuvent être remplacés par un test qui permet de garantir que l&#8217;on peut bien accéder à la base de données et par plusieurs autres tests où l&#8217;accès à la base de données aura été bouchonné.<br />
Une méthode lorsque l&#8217;on cherche à diminuer la durée d&#8217;exécution de tests est de prendre le test d&#8217;intégration le plus long et de l&#8217;analyser jusqu&#8217;à réussir à le découper en un test d&#8217;intégration plus petit et plusieurs tests unitaires. Si c&#8217;est l&#8217;accès à certaines couches qui sont lentes lors de tests d&#8217;intégrations, il est recommandé de les bouchonner, les frameworks de mocks ne servent pas que dans le cas de tests unitaires <img src='http://www.java-freelance.fr/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> <br />
De même, méfiez vous des tests d&#8217;interface, ils prennent beaucoup de temps et souvent, ce qu&#8217;ils testent peut être tester unitairement. Selenium est à utiliser avec modération. Méfiez vous vraiment quand vous commencez à tester vos fonctionnalités via Selenium. Et ne dites pas &#8216;<a href="http://geekandpoke.typepad.com/geekandpoke/images/2007/10/27/complexajax.jpg" target="_blank">mon utilisateur veut de l&#8217;AJAX</a>&#8216; &#8216;J&#8217;ai besoin de tester la compatibilité des différents navigateurs&#8217;.</p>
<p>Chaque complexité a un coût. Et cela se paye à chaque fois que les tests sont exécutés.  Si c&#8217;est compliqué à tester : danger, la fonctionnalité peut sûrement être faite plus simplement. Il est possible de faire des tests unitaires en Javascript plutôt que tester dans les browsers (ex : <a href="http://dmathieu.com/fr/javascript/testez-votre-code-javascript-avec-qunit-et-jquery">QUnit</a>).<br />
David préfère limité AJAX aux réels besoins et d&#8217;effectuer au maximum le code server-side.</p>
<p>Et pour finir : simplifier et optimiser votre code. Ce sont des choses qui se font. Le build va être plus rapide et l&#8217;application aussi <img src='http://www.java-freelance.fr/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' />  A vous l&#8217;effet Kiss Cool <img src='http://www.java-freelance.fr/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>

]]></content:encoded>
			<wfw:commentRss>http://www.java-freelance.fr/java/lets-make-this-test-suite-run-faster-softshake-2010/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Déjà ninja ? Devenez Rebel !</title>
		<link>http://www.java-freelance.fr/java/apres-les-ninjas-jrebel</link>
		<comments>http://www.java-freelance.fr/java/apres-les-ninjas-jrebel#comments</comments>
		<pubDate>Fri, 22 Oct 2010 18:40:40 +0000</pubDate>
		<dc:creator>Jean-Baptiste</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[JRebel]]></category>
		<category><![CDATA[Productivité]]></category>

		<guid isPermaLink="false">http://www.java-freelance.fr/?p=939</guid>
		<description><![CDATA[			
			
Si vous aussi vous perdez 3 minutes à chaque fois que vous faites un redéploiement, calculez donc combien cela coute à votre client sur : http://www.zeroturnaround.com/jrebel/

JRebel est un outil payant permettant d&#8217;effectuer des rechargements à chaud d&#8217;applicatif Java. C&#8217;est clairement l&#8217;outil qui fera de vous un développeur plus productif. Voilà une bonne façon de se [...]]]></description>
			<content:encoded><![CDATA[			
			
<p>Si vous aussi vous perdez 3 minutes à chaque fois que vous faites un redéploiement, calculez donc combien cela coute à votre client sur : <a href="http://www.zeroturnaround.com/jrebel/" target="_blank">http://www.zeroturnaround.com/jrebel/</a></p>
<p style="text-align: center;"><a href="http://www.java-freelance.fr/wp-content/uploads/2010/10/JRebel-saves-kittens.jpg"><img class="aligncenter size-full wp-image-945" title="JRebel saves kittens" src="http://www.java-freelance.fr/wp-content/uploads/2010/10/JRebel-saves-kittens.jpg" alt="" width="512" height="384" /></a></p>
<p>JRebel est un outil payant permettant d&#8217;effectuer des rechargements à chaud d&#8217;applicatif Java. C&#8217;est clairement l&#8217;outil qui fera de vous un développeur plus productif. Voilà une bonne façon de se faire bien voir, de rentrer plus tôt à la maison ou d&#8217;augmenter sa facturation <img src='http://www.java-freelance.fr/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> <span id="more-939"></span></p>
<p>Vous pouvez, en tant que personne, acheter une &laquo;&nbsp;Personnal  license&nbsp;&raquo; et l&#8217;utiliser dans le cadre de votre travail. Cette licence ne  peut pas être remboursée par votre entreprise. L&#8217;achat d&#8217;une licence &laquo;&nbsp;standard&nbsp;&raquo; n&#8217;est pas rentable, même payé par votre EURL. Votre client peut également acheter des licences standard mais personnellement, je pense qu&#8217;il vaut mieux lui permettre de faire cette économie. Un client n&#8217;est pas éternel et un geste commercial est toujours bien vu non ?</p>
<h2 id="HFonctionnement">Fonctionnement</h2>
<p>JRebel est ce que l&#8217;on appelle un &laquo;&nbsp;java agent&nbsp;&raquo; (see : <a href="http://blog.xebia.fr/2008/05/02/java-agent-instrumentez-vos-classes/">http://blog.xebia.fr/2008/05/02/java-agent-instrumentez-vos-classes/</a> ). C&#8217;est à dire qu&#8217;il va instrumenter le bytecode.</p>
<p>Pour que cela fonctionne il faudra donc spécifier à la JVM l&#8217;agent JRebel (jrebel.jar).</p>
<p>Cette agent fonctionne de manière très simple, il scrute le classpath à la recherche des fichiers <strong>rebel.xml.</strong> Ces fichiers permettent de faire un mapping entre l&#8217;application (bytecode et ressources) et votre code source. JRebel scan les sources et les mets à jour dans l&#8217;application en cours d&#8217;exécution. C&#8217;est aussi simple que cela.</p>
<p>Vous l&#8217;avez compris, pour recharger à chaud votre projet et toutes vos  dépendances vous devez avoir un fichier rebel.xml dans chacun des projets (.jar  .war) que  vous souhaitez recharger à chaud.</p>
<h2>Installation</h2>
<p>L&#8217;installation de JRebel va simplement copier l&#8217;agent jrebel.jar dans le répertoire de votre choix. Il existe également un  plugin Eclipse (optionnel).</p>
<p>Comme nous l&#8217;avons vu, nous devons fournir un fichier rebel.xml dans chacun de nos projets. Avec Maven, il suffit simplement d&#8217;ajouter le plugin maven-rebel, dans le fichier pom.xml :</p>
<pre class="brush:xml">&lt;plugin&gt;
 &lt;groupId&gt;org.zeroturnaround&lt;/groupId&gt;
 &lt;artifactId&gt;javarebel-maven-plugin&lt;/artifactId&gt;
 &lt;version&gt;1.0.5&lt;/version&gt;
 &lt;executions&gt;
  &lt;execution&gt;
   &lt;id&gt;generate-rebel-xml&lt;/id&gt;
   &lt;phase&gt;process-resources&lt;/phase&gt;
   &lt;goals&gt;
    &lt;goal&gt;generate&lt;/goal&gt;
   &lt;/goals&gt;
  &lt;/execution&gt;
 &lt;/executions&gt;
&lt;/plugin&gt;
</pre>
<p>On pourra lancer la génération manuellement via &laquo;&nbsp;mvn javarebel:generate&nbsp;&raquo;</p>
<p>Ensuite, il suffit de lancer l&#8217;application en spécifiant l&#8217;agent à la JVM :</p>
<p>-noverify<br />
-javaagent:&nbsp;&raquo;C:Program FilesZeroTurnaroundJRebeljrebel.jar&nbsp;&raquo;</p>
<p>Si vous lancer votre application via maven (mvn jetty:run par ex), vous pouvez utiliser la variable système  MAVEN_OPTS, ou utiliser &laquo;&nbsp;Run configuration&nbsp;&raquo; dans Eclipse. Il doit sans doute exister un moyen de le faire dans le pom (via un profil &laquo;&nbsp;rebel&nbsp;&raquo; par exemple).</p>
<p>Voilà ça fonctionne !</p>
<p>Have fun !</p>

]]></content:encoded>
			<wfw:commentRss>http://www.java-freelance.fr/java/apres-les-ninjas-jrebel/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Devenir un Ninja en Java</title>
		<link>http://www.java-freelance.fr/java/devenir-un-ninja-en-java</link>
		<comments>http://www.java-freelance.fr/java/devenir-un-ninja-en-java#comments</comments>
		<pubDate>Mon, 04 Oct 2010 07:20:53 +0000</pubDate>
		<dc:creator>Jean-Baptiste</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Formation]]></category>

		<guid isPermaLink="false">http://www.java-freelance.fr/?p=822</guid>
		<description><![CDATA[			
			

Au début de ma carrière, je me souviens qu&#8217;un de mes collègues m&#8217;a dit &#171;&#160;Tu sais, au final, on se rend compte qu&#8217;il n&#8217;y a que très peu de différence de productivité entre un bon développeur et un développeur lambda&#160;&#187;. Je l&#8217;ai cru,  et il m&#8217;a fallu quelques années pour me rendre compte qu&#8217;il avait [...]]]></description>
			<content:encoded><![CDATA[			
			
<p><img class="size-full wp-image-823 alignright" title="raise" src="http://www.java-freelance.fr/wp-content/uploads/2010/10/raise.jpg" alt="" width="240" height="168" /></p>
<p>Au début de ma carrière, je me souviens qu&#8217;un de mes collègues m&#8217;a dit &laquo;&nbsp;Tu sais, au final, on se rend compte qu&#8217;il n&#8217;y a que très peu de différence de productivité entre un bon développeur et un développeur lambda&nbsp;&raquo;. Je l&#8217;ai cru,  et il m&#8217;a fallu quelques années pour me rendre compte qu&#8217;il avait complétement tort. <span id="more-822"></span>Un développeur productif peu produire jusqu&#8217;à 10 fois plus (sans diminuer la qualité du code). Sachant que les tarifs vont du simple au double, engager un bon développeur, 2 fois plus cher, peut s&#8217;avérer en fait 5 fois plus rentable pour le client. Pensez y au prochain entretien <img src='http://www.java-freelance.fr/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>A votre avis, un client préférera prendre un développeur productif mais cher ou un développeur lambda pas cher ?<br />
<!--more--><br />
<!--more--><br />
<!--more--></p>
<h2>Apprendre en continu</h2>
<p>Le seul moyen de s&#8217;améliorer c&#8217;est d&#8217;apprendre, apprendre, apprendre. N&#8217;hésitez pas à poser une journée ou deux par mois, et de préférence en semaine pour vous former au calme, chez vous. Les transports sont aussi une bonne occasion, pour ceux qui ont la chance de les utiliser.</p>
<p>Ce n&#8217;est que quand j&#8217;ai commencé à m&#8217;ennuyer en mission que j&#8217;ai décidé de lire. Et c&#8217;est en lisant que je me suis rendu compte à quel point j&#8217;étais mauvais en Java. Le livre qui m&#8217;a fait prendre conscience est &laquo;&nbsp;Effective Java&nbsp;&raquo; :</p>
<p style="text-align: center;"><a href="http://www.amazon.fr/gp/product/0321356683?ie=UTF8&amp;tag=javafree-21&amp;linkCode=as2&amp;camp=1642&amp;creative=6746&amp;creativeASIN=0321356683"><img class="aligncenter size-full wp-image-830" title="Effective Java" src="http://www.java-freelance.fr/wp-content/uploads/2010/10/51EHjWvpClL._SL160_.jpg" alt="" width="127" height="160" /></a><img style="border: none !important; margin: 0px !important;" src="http://www.assoc-amazon.fr/e/ir?t=javafree-21&amp;l=as2&amp;o=8&amp;a=0321356683" border="0" alt="" width="1" height="1" /></p>
<p><!--more--><br />
Bien, une fois que j&#8217;ai pris conscience qu&#8217;en fait j&#8217;avais rien compris à Java, suis je meilleur développeur ? Non, mais c&#8217;est un début. Maintenant il faut apprendre <strong>se comporter</strong> comme un bon développeur. Que ce soit avec votre code : &laquo;&nbsp;Don&#8217;t repeat yourself&nbsp;&raquo;, avec les autres :  &laquo;&nbsp;Provide Options, Don’t Make Lame Excuses&nbsp;&raquo; ou avec vous même : &laquo;&nbsp;Invest Regularly in Your Knowledge Portfolio&nbsp;&raquo;</p>
<p>&laquo;&nbsp;The pragmatic programmer&nbsp;&raquo; est LE livre à lire et se présente sous la forme d&#8217;une <a href="http://www.pragprog.com/the-pragmatic-programmer/extracts/tips" target="_blank">liste d&#8217;astuces</a> :<br />
<a href="http://www.amazon.fr/gp/product/020161622X?ie=UTF8&amp;tag=javafree-21&amp;linkCode=as2&amp;camp=1642&amp;creative=6746&amp;creativeASIN=020161622X"><img class="aligncenter size-full wp-image-834" title="The pragmatic programmer" src="http://www.java-freelance.fr/wp-content/uploads/2010/10/pragmatic_.jpg" alt="" width="127" height="160" /></a><img style="border: none !important; margin: 0px !important;" src="http://www.assoc-amazon.fr/e/ir?t=javafree-21&amp;l=as2&amp;o=8&amp;a=020161622X" border="0" alt="" width="1" height="1" /></p>
<p><!--more--><br />
<!--more--></p>
<p>Dans le même style, les astuces sont plutôt orientées Business mais certaines peuvent s&#8217;appliquer à nos développements. Et puis, quel freelance ne rêve pas de monter sa petite entreprise ? Rework est le genre de livre qui peut révolutionner une vie :</p>
<p><a href="http://www.amazon.fr/gp/product/0307463745?ie=UTF8&amp;tag=javafree-21&amp;linkCode=as2&amp;camp=1642&amp;creative=6746&amp;creativeASIN=0307463745"><img class="aligncenter size-full wp-image-836" title="Rework" src="http://www.java-freelance.fr/wp-content/uploads/2010/10/rework.jpg" alt="" width="106" height="160" /></a><img style="border: none !important; margin: 0px !important;" src="http://www.assoc-amazon.fr/e/ir?t=javafree-21&amp;l=as2&amp;o=8&amp;a=0307463745" border="0" alt="" width="1" height="1" /></p>
<p><!--more--><br />
<!--more--><br />
<!--more--></p>
<h2>Et après ?</h2>
<p>Voici une liste d&#8217;astuces, issue de ma propre expérience.</p>
<p><strong>- Maîtriser vos outils</strong> : Apprenez les raccourcis clavier de votre IDE et utilisez les. Regarder comment les autres développeur utilisent vos outils, c&#8217;est très instructif !</p>
<p><strong>- Choisissez vos missions </strong>: Débrouiller vous pour toujours travailler avec des gens meilleurs que vous. Faites en sortes de toujours apprendre quelque chose de nouveau (technos, architecture, langage, métier, méthodologie).</p>
<p><strong>- Reposez vous</strong> : Inutile de se fatiguer au travail, cela ne fera que baisser votre productivité. Fatigue = erreurs. Un besoin incompris, c&#8217;est une productivité nulle.</p>
<p><strong>- Changez vous les idées,</strong> consacrez du temps à vos loisirs et à votre famille. Cela boostera votre créativité et vous aidera à résoudre les problèmes complexes.</p>
<p><strong>- Limitez les sources de perturbations.</strong> Coupez Twitter, votre e-mail (même le pro) ainsi que Facebook. Profitez de votre téléphone 3G dernier cris pour traiter tous ça dans les transports le matin et le soir.</p>
<p><strong>- Travaillez vos forces et laissez tomber vos faiblesses</strong> : Est ce bien utile de s&#8217;obstiner à maîtriser CSS et photoshop alors que l&#8217;on n&#8217;est pas artiste pour un sou ? Cela va vous prendre énormément de temps. Temps qui serait mieux utilisé à augmenter votre expertise dans votre domaine de compétence. Ne soyez pas dupes et ne soyez pas jaloux des &laquo;&nbsp;rockstar&nbsp;&raquo;, vous êtes sans doute meilleur qu&#8217;eux dans un autre domaine !</p>
<p><!--more--><br />
<!--more--><br />
<!--more--></p>
<h2>Livres Bonus</h2>
<p>Pour ceux qui vont vite et aussi parceque cet article est l&#8217;occasion de tester les liens sponsorisés Amazon <img src='http://www.java-freelance.fr/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> , voici 3 livres qui m&#8217;ont également aidé à progresser et que je vous conseil pour compléter votre read list:</p>
<p style="text-align: center;"><a href="http://www.amazon.fr/gp/product/0132350882?ie=UTF8&amp;tag=javafree-21&amp;linkCode=as2&amp;camp=1642&amp;creative=6746&amp;creativeASIN=0132350882"><img title="Clean code" src="http://www.java-freelance.fr/wp-content/uploads/2010/10/clean-code_.jpg" alt="" width="120" height="160" /></a><img style="border: none !important; margin: 0px !important;" src="http://www.assoc-amazon.fr/e/ir?t=javafree-21&amp;l=as2&amp;o=8&amp;a=0132350882" border="0" alt="" width="1" height="1" /><a href="http://www.amazon.fr/gp/product/0321125215?ie=UTF8&amp;tag=javafree-21&amp;linkCode=as2&amp;camp=1642&amp;creative=6746&amp;creativeASIN=0321125215"><img class="alignnone" title="Domain Driven Design" src="http://www.java-freelance.fr/wp-content/uploads/2010/10/ddd.jpg" alt="" width="120" height="160" /></a><img style="border: none !important; margin: 0px !important;" src="http://www.assoc-amazon.fr/e/ir?t=javafree-21&amp;l=as2&amp;o=8&amp;a=0321125215" border="0" alt="" width="1" height="1" /><a href="http://www.amazon.fr/gp/product/274402337X?ie=UTF8&amp;tag=javafree-21&amp;linkCode=as2&amp;camp=1642&amp;creative=6746&amp;creativeASIN=274402337X"><img class="alignnone" title="Apache Maven" src="http://www.java-freelance.fr/wp-content/uploads/2010/10/maven_.jpg" alt="" width="133" height="160" /></a><img style="border: none !important; margin: 0px !important;" src="http://www.assoc-amazon.fr/e/ir?t=javafree-21&amp;l=as2&amp;o=8&amp;a=274402337X" border="0" alt="" width="1" height="1" /></p>
<p>YapluKa !</p>

]]></content:encoded>
			<wfw:commentRss>http://www.java-freelance.fr/java/devenir-un-ninja-en-java/feed</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
		<item>
		<title>Bilan</title>
		<link>http://www.java-freelance.fr/freelance/bilan</link>
		<comments>http://www.java-freelance.fr/freelance/bilan#comments</comments>
		<pubDate>Tue, 06 Jul 2010 06:17:26 +0000</pubDate>
		<dc:creator>Mathilde</dc:creator>
				<category><![CDATA[Freelance]]></category>
		<category><![CDATA[Bilan]]></category>
		<category><![CDATA[bonheur]]></category>
		<category><![CDATA[crise]]></category>
		<category><![CDATA[facturation]]></category>
		<category><![CDATA[Formation]]></category>
		<category><![CDATA[indépendant]]></category>

		<guid isPermaLink="false">http://java-freelance.fr/?p=479</guid>
		<description><![CDATA[			
			
Il y a un an, je me lançais en tant que freelance. C&#8217;est le bon moment pour faire un bilan. Il me semblait que se lancer en tant que freelance n&#8217;était finalement pas risqué et ne changeait pas temps de chose.
Pourquoi ?
Malgré une famille, un crédit maison sur 15 ans et un crédit auto sur [...]]]></description>
			<content:encoded><![CDATA[			
			
<p>Il y a un an, je me lançais en tant que freelance. C&#8217;est le bon moment pour faire un bilan. Il me semblait que se lancer en tant que freelance n&#8217;était finalement pas risqué et ne changeait pas temps de chose.</p>
<h2>Pourquoi ?</h2>
<p>Malgré une famille, un crédit maison sur 15 ans et un crédit auto sur 6 et une expérience de 2/3 ans, j&#8217;avais envie de découvrir autre chose que le monde des SSII.<br />
Mes expériences en SSII ne sont pas négatives, une SSII de taille moyenne grâce à laquelle j&#8217;ai pu faire une mission très intéressante mais pas vraiment au point pour entretenir une communauté de développeur en son sein et y favoriser le partage des connaissances. Une tout petite SSII où au final je ne serai restée que quelques semaines mais dont l&#8217;obligation de sous-traitance à d&#8217;autres SSII plombe le modèle économique et là encore pas assez de matière pour aider en interne à monter en compétence. Au niveau de la plupart des SSII, celles ci apportent effectivement une certaine sécurité au niveau de l&#8217;emploi (valeur tellement ancrée dans la société&#8230;). Mais tout a un prix.<span id="more-479"></span></p>
<p>J&#8217;avoue que les traditionnels arguments <a href="http://www.freelanceinformatique.com/2009/03/08/je-ne-passerai-pas-freelance-car/">tels que cités ici</a> ne m&#8217;ont pas vraiment touché. L&#8217;aspect financier n&#8217;est clairement pas  le plus important, juste je ne comprends plus bien l&#8217;intérêt d&#8217;être dans  la plupart des SSII. Une grosse majorité de gens me disent spontanément  qu&#8217;ils vont passer freelance dans X années, mais j&#8217;ai vraiment l&#8217;impression que très peu de junior (1/2 d&#8217;expérience) se lancent.</p>
<h2>Comment ?</h2>
<p>Pour me lancer, rien de bien difficile et pourtant, c&#8217;était en Mai,  autrement dit, dans la période la plus critique vis à vis de la crise.<br />
J&#8217;ai crée mon CV sur freelance-info.fr et au bout de 2 heures, un premier commercial m&#8217;a contacté pour une mission qui m&#8217;avait l&#8217;air intéressante et pour laquelle on a vite convenu d&#8217;un rendez vous. Une heure après, un deuxième commercial m&#8217;appelait. Et ainsi de suite,  ça ressemble un peu à ce qu&#8217;on vit quand on met son CV sur Monster &#8230;</p>
<p>Les rendez vous avec le commercial puis avec le client se sont effectués dans la foulée.  La mission a commencé deux semaines plus tard.</p>
<h2>Ce qui ne change pas</h2>
<p>Au bout d&#8217;un an, je n&#8217;ai pas vu de différence avec mes 3 missions en SSII et ma mission actuelle au niveau du suivi. Je vois mon commercial une fois tous les 36 du mois, on a fait une fois un debrief avec le client, je lui envoie mon CRA à chaque fin de mois.</p>
<p>Je ne suis pas sur qu&#8217;il y ait une réelle différence d&#8217;état d&#8217;esprit  entre un salarié de SSII et un freelance. Je pense que l&#8217;éthique que  l&#8217;on a est quasiment la même. Je préviens toujours le plus en avance  possible de mes congés, je ne renégocie pas mon tarif journalier tous  les quatre matin (d&#8217;ailleurs je ne le ferais pas sur cette mission). Il me semble que les indépendants ont tendance à se former un peu plus, mais ce n&#8217;est pas une généralité non plus !</p>
<p>La question que l&#8217;on me pose souvent : et la paperasse ? Après un an,  je l&#8217;attends toujours. Une partie des démarches a été faite en ligne.  Pour la deuxième partie, j&#8217;ai pris un comptable qui me fait tout le  reste (déclarations aux différents organismes, bilan) etc. Le seul point  noir c&#8217;est la saisie des notes de frais, ca prend environ une heure par  mois donc non, je ne croule pas sur la paperasse, en revanche, je paye  mon comptable !</p>
<h2>Les différences</h2>
<h3>Les avantages</h3>
<h4>L&#8217;aspect financier</h4>
<p>Là où je vois la plus grosse différence c&#8217;est sur mes revenus. Comme je ne suis pas experte, je suis plutôt sur des missions longues avec peu d&#8217;inter-contrat. Mes revenus arrivent sous la forme d&#8217;indemnités mensuelles que je lisse  (je me verse autant en inter-contrat / vacances / formation que quand je travaille tout le mois, on ne peut pas en dire autant du chiffre d&#8217;affaire de ma société). Ça me permet de ne pas avoir de &#8216;trou&#8217; dans mon budget personnel. L&#8217;autre forme de revenu c&#8217;est les dividendes, que je ne toucherais qu&#8217;à la fin de l&#8217;année et qui seront plus ou moins conséquents en fonction du chiffre d&#8217;affaire fait ma société.<br />
Il est vrai que l&#8217;on gagne beaucoup plus et qu&#8217;il faut prendre des assurances complémentaires (mutuelle, prévoyance par exemple) mais en réintégrant tous ses frais, je suis, <em>hors dividende</em> à un peu plus de 50% d&#8217;augmentation. Je ne parle pas des avantages CE ou en nature, je n&#8217;en ai jamais vraiment eu. Sur une année de 217 jours facturés, l&#8217;augmentation totale comprenant les dividendes atteint quasiment les 100%.  Tout en gardant à l&#8217;esprit qu&#8217;en cas de tuile, on est vraiment beaucoup moins bien couverts que les salariés (pas d&#8217;indemnités journalières par exemple hors assurance prévoyance, pas de chômage dans la plupart des cas).</p>
<h4>Les formations</h4>
<p>L&#8217;un des autres avantages d&#8217;être indépendant, c&#8217;est de pouvoir au final payer un peu moins cher certaines formations (achat hors taxes et hors charges sociales) et de faire acheter par la société une partie de son matériel pro, ce n&#8217;est pas la panacée (c&#8217;est toujours à nous de remplir les caisses de l&#8217;entreprise) mais c&#8217;est toujours ça de gagner. J&#8217;ai une bibliothèque de plus en plus grande, je suis allée et je retournerai en 2010 à Devoxx, j&#8217;ai achetée un eee pc pour pouvoir rester connecter.</p>
<h4>L&#8217;autonomie</h4>
<p>Je trouve que les avantages que l&#8217;on a à être freelance, plus grande autonomie pour choisir ses missions, une meilleure gestion de l&#8217;intercontrat, pas de jours de congés à poser impérativement avant le 31 mai ou autre sympathie et la meilleure paye permette de compenser largement les quelques inconvénients.</p>
<h3>Les inconvénients</h3>
<p>Un inconvénient, et il est avéré, est que certains grands groupes ne veulent plus travailler avec des sous-traitants qui passent pars des SSII. Exit donc les indépendants de certaines missions ou alors passage obligé par un cabinet de broker. Les cabinets de broker sont spécialisés dans le placement des indépendants et en général, se font une marge entre 20% et 30% mais à ce que j&#8217;ai vu autour de moi, il y a un réel suivi et quelques services en plus. Enfin ça reste cher le service.</p>
<p>En cas de coup dur, effectivement, on est beaucoup moins protégés. Pas de chômage, pas d&#8217;indemnité journalière de base, la mutuelle est plus chère.  Ce ne sont pas de réels inconvénients dans la mesure où comme on le sait avant, il suffit de mettre un peu de côté, on se fait soit même ses assurances. Pour la retraite, elle est en % plus faible mais comme on gagne plus, cela se vaut à peu près.  Il me semble que l&#8217;on a pas non plus droit au congé parental  (par contre des indemnités conséquentes pour le congé maternité et il existe également un congé paternité de 11 jours).</p>
<h4>Les SSII où il fait bon de travailler</h4>
<p>Un autre inconvénient est à prendre en considération quand on est mécontent de sa SSII. Certaines SSII n&#8217;apporteront rien de plus qu&#8217;une relation client-fournisseur. Mais ce n&#8217;est pas le cas de toute, il est possible d&#8217;intégrer des SSII qui font monter les compétences des collaborateurs de manière assez poussée. Avoir par exemple une journée de formation par mois ou envoyer ses collaborateurs à des formations, animer une communauté de développeur sont des points très appréciables de certaines SSII. En tant qu&#8217;indépendant, on est pas mal isolé, d&#8217;où l&#8217;importance de se réseauter et de participer à des évènements extérieurs (les Java User Group, les conférences diverses et variées&#8230;).</p>
<h4>Les aspects commerciaux et contractuels.</h4>
<p>Un autre inconvénient, c&#8217;est le fait de devoir se vendre. La négociation n&#8217;est pas une chose aisée et ce n&#8217;est pas naturel  pour tous, c&#8217;est donc souvent délicat. En devenant indépendant, il faut donc apprendre à se vendre.</p>
<p>Il y a un point que j&#8217;ai négligé et sur lequel j&#8217;aurais pu me mordre les doigts c&#8217;est le contrat. Il faut vraiment que le contrat soit à 50/50. Il est possible de se faire accompagner par des juristes lors de la signature du contrat.</p>
<p>Je parle là d&#8217;une expérience de freelance en Java. Ce n&#8217;est pas la même chose sur d&#8217;autres langages. Il faut toujours se demander si son profil est facilement &#8216;vendable&#8217; en fonction du marché avant de se lancer !</p>
<p>Sur un an, un bilan plus que positif. Ma situation n&#8217;a pas énormément changé quand je regarde mon travail quotidien chez mon client. En revanche, tout ce qui est extérieur ( &#8217;salaire&#8217;, formations, livres, &#8230; ) c&#8217;est amélioré.</p>

]]></content:encoded>
			<wfw:commentRss>http://www.java-freelance.fr/freelance/bilan/feed</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Bouchon (stub) ou Simulacre (mock) ?</title>
		<link>http://www.java-freelance.fr/java/bouchon-stub-ou-simulacre-mock</link>
		<comments>http://www.java-freelance.fr/java/bouchon-stub-ou-simulacre-mock#comments</comments>
		<pubDate>Fri, 02 Jul 2010 05:04:37 +0000</pubDate>
		<dc:creator>Mathilde</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[code]]></category>
		<category><![CDATA[duchess]]></category>
		<category><![CDATA[easymock]]></category>
		<category><![CDATA[Formation]]></category>
		<category><![CDATA[JUnit]]></category>
		<category><![CDATA[test]]></category>

		<guid isPermaLink="false">http://www.java-freelance.fr/?p=795</guid>
		<description><![CDATA[			
			
Le test  unitaire est un test qui provoque l&#8217;exécution d&#8217;une partie du code et qui l&#8217;analyse.  Il permet de garantir que le code exécuté fonctionne  correctement. Il se doit donc d&#8217;être automatisé et répétable. Pour cela, cela  nécessite fréquemment le besoin d&#8217;isoler le test unitaire des systèmes  extérieurs (base de données, [...]]]></description>
			<content:encoded><![CDATA[			
			
<p>Le test  unitaire est un test qui provoque l&#8217;exécution d&#8217;une partie du code et qui l&#8217;analyse.  Il permet de garantir que le code exécuté fonctionne  correctement. Il se doit donc d&#8217;être automatisé et répétable. Pour cela, cela  nécessite fréquemment le besoin d&#8217;isoler le test unitaire des systèmes  extérieurs (base de données, appels web-service distants).</p>
<p>Pour ce faire, il existe plusieurs méthodes, l&#8217;utilisation de bouchon (&#8217;stub&#8217;) ou de simulacre  (&#8216;mock&#8217;). L&#8217;article de référence est un article de Martin Fowler &laquo;&nbsp;<a href="http://bruno-orsier.developpez.com/mocks-arent-stubs/" target="_blank">Les simulacres  ne sont pas des bouchons</a>&laquo;&nbsp;. Pour résumer, une méthode bouchonnée est appelée  sur un objet bouchon réel, centré sur le système testé. Il ne peut jamais faire  échouer le test. On regarde l&#8217;état de l&#8217;objet final à la fin du test et non les étapes  qui ont permis d&#8217;obtenir cet état. C&#8217;est un test basé sur des  états.<span id="more-795"></span></p>
<p>En ce qui  concerne les simulacres, les assertions ne portent pas sur l&#8217;objet  final mais sur la manière dont ce dernier a été obtenu. C&#8217;est un test  basé sur le comportement de la méthode. On peut contrôler le nombre de fois  qu&#8217;une méthode a été invoquée, vérifier que ses paramètres correspondent bien entre ce qui est défini et ce qui est exécuté et faire échouer le test si l&#8217;enchaînement de  méthodes ne correspond pas à l&#8217;enchaînement attendu par  exemple.</p>
<p>Easymock  utilise dans son fonctionnement le plus basique des simulacres, qui permettent de construire un test de manière très  simple : l&#8217;ordre des méthodes invoquées, le nombre d&#8217;appel à une méthode peut  engendrer un échec du test. Potentiellement, les tests sont plus fragiles et  plus difficile à maintenir.<br />
Mais EasyMock permet également la création de  bouchons qui peuvent être réutilisé. Il est ainsi possible de maintenir des bouchons  partagés entre différents tests unitaires, ce qui permet une meilleure  maintenabilité. Dans ce cas, nous ne nous intéressons pas au comportement,  uniquement au résultat.</p>
<h3>La création de bouchon à l&#8217;aide de andStubReturn()</h3>
<pre class="brush:java">public Service getServiceMock() {
   Service serviceMock =  createMock(Service.class);

   expect(serviceMock.appel1()).andStubReturn(Integer.valueOf(5));
   expect(serviceMock.appel2(anyObject())).andStubReturn(BigDecimal.TEN);

   replay(serviceMock);

}</pre>
<p>La méthode  andStubReturn signifie que cette méthode peut être appelée sans condition de  nombre (0,1 &#8230;n) ni d&#8217;ordre. Il est simplement défini que si cette méthode est  appelée, elle renverra un paramètre tel que défini via le  andStubReturn. Il n&#8217;y a pas de verify(serviceMock) car les contrôles sur le comportement du mock ne nous intéressent pas.</p>
<h3>La création de bouchon à l&#8217;aide des &#8216;niceMock&#8217;</h3>
<p>Une autre  possibilité lorsque l&#8217;on souhaite utiliser les bouchons (stub) est de créer un ‘nice mock’, qui est par défaut, renvoie 0, null ou  false selon le paramètre de retour des méthodes :</p>
<pre class="brush:java">myNiceMock  = createNiceMock(Service.class);</pre>
<p>Toujours sans utiliser de verify.</p>
<p>Les  avantages du stub sont nombreux : les tests sont plus faciles à maintenir, il  est possible de réutiliser les stubs au sein de plusieurs classes de tests&#8230;  Néanmoins,  il y a des situations où le test d&#8217;un comportement est plus adéquat  que l&#8217;utilisation de bouchon comme par exemple, vérifier que certains paramètres  sont bien calculés avant d&#8217;être envoyé à des services externes, ce qui est  fréquemment mon cas.</p>

]]></content:encoded>
			<wfw:commentRss>http://www.java-freelance.fr/java/bouchon-stub-ou-simulacre-mock/feed</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Les erreurs courantes avec EasyMock</title>
		<link>http://www.java-freelance.fr/java/les-erreurs-courrantes-avec-easymock</link>
		<comments>http://www.java-freelance.fr/java/les-erreurs-courrantes-avec-easymock#comments</comments>
		<pubDate>Wed, 16 Jun 2010 08:24:21 +0000</pubDate>
		<dc:creator>Mathilde</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[duchess]]></category>
		<category><![CDATA[easymock]]></category>
		<category><![CDATA[JUnit]]></category>
		<category><![CDATA[test]]></category>

		<guid isPermaLink="false">http://www.java-freelance.fr/?p=772</guid>
		<description><![CDATA[			
			
EasyMock est un framework de test qui peut dérouter dans un premier abord. Une fois qu&#8217;on a compris comment l&#8217;utiliser, on tombe sur un certain nombre d&#8217;erreurs qui reviennent très souvent et qui ne sont pas souvent explicites. Même si EasyMock 3.0 a clarifié un certain nombre d&#8217;erreurs, cet article (fait sous la 2.5.2) servira [...]]]></description>
			<content:encoded><![CDATA[			
			
<p><img class="alignleft" title="easymock" src="http://easymock.org/img/easymock.gif" alt="logo easymock" width="301" height="57" />EasyMock est un framework de test qui peut dérouter dans un premier abord. Une fois qu&#8217;on a compris comment l&#8217;utiliser, on tombe sur un certain nombre d&#8217;erreurs qui reviennent très souvent et qui ne sont pas souvent explicites. Même si EasyMock 3.0 a clarifié un certain nombre d&#8217;erreurs, cet article (fait sous la 2.5.2) servira de pense-bête à ceux qui débutent avec ce framework.<span id="more-772"></span></p>
<p>Les classes qui permettent de tester : une interface CalculService et son implémentation dont on cherche à tester unitairement les différentes méthodes.  L&#8217;implémentation de CalculService fait appel à plusieurs méthodes de l&#8217;interface FormatService. Comme chacun des appels à la méthode FormatService est mocké, nous n&#8217;avons pas besoin de définir une implémentation correspondante.<!--more--></p>
<pre class="brush:java">package fr.java.freelance.service;

import java.math.BigDecimal;

public interface CalculService {

  String calcul(BigDecimal a);
  String calcul(BigDecimal a, BigDecimal b);
  String calcul(String year, String month,
      String day);
}</pre>
<pre class="brush:java">package fr.java.freelance.service.impl;

import java.math.BigDecimal;

import fr.java.freelance.service.CalculService;
import fr.java.freelance.service.FormatService;

public class CalculServiceImpl implements
    CalculService {

  private final FormatService formatService;
  public CalculServiceImpl(
      FormatService formatService) {
    this.formatService = formatService;
  }
  public CalculServiceImpl() {
    formatService=null;
  }
  public String calcul(BigDecimal a, BigDecimal b) {
    return formatService.formatComplexe(a, b);
  }
  public String calcul(BigDecimal a) {
    return formatService.formatSimple(a);
  }
  public String calcul(String year,
      String month, String day) {
    return formatService.formatSimple(year,
        month, day);
  }
}
</pre>
<pre class="brush:java">package fr.java.freelance.service;

import java.math.BigDecimal;

public interface FormatService {
  String formatSimple(BigDecimal a);
  String formatComplexe(BigDecimal a,BigDecimal b);
  String formatSimple(String year, String month,
      String day);
}
</pre>
<h3>Erreur 1 :Unexpected method call methodX(X)</h3>
<pre class="brush:java">java.lang.AssertionError:
Unexpected method call formatSimple(5):
at org.easymock.internal.MockInvocationHandler.invoke(MockInvocationHandler.java:43)
at org.easymock.internal.ObjectMethodsFilter.invoke(ObjectMethodsFilter.java:72)
at $Proxy5.formatSimple(Unknown Source)

@Test
public void testUnexpectedMethodCall() {
   BigDecimal a = BigDecimal.valueOf(5);
   BigDecimal b = BigDecimal.valueOf(5);
   replay(formatServiceMock);
   calculService.calcul(a);
  verify(formatServiceMock);
}
</pre>
<p>Explication : La méthode formatSimple est appelée avec le paramètre 5 sans qu&#8217;elle ait été attendue.</p>
<h3>Erreur 2 :methodA(A,B): expected: X, actual: Y</h3>
<pre class="brush:java">java.lang.AssertionError:
Expectation failure on verify:
formatComplexe(5, 5): expected: 1, actual: 0
at org.easymock.internal.MocksControl.verify(MocksControl.java:111)
at org.easymock.EasyMock.verify(EasyMock.java:1608)

@Test
  public void testExpectedActual() {
    BigDecimal a = BigDecimal.valueOf(5);
    BigDecimal b = BigDecimal.valueOf(5);
    expect(
        formatServiceMock
            .formatSimple(eq(BigDecimal
                .valueOf(5)))).andReturn("XXX");
    expect(
        formatServiceMock
            .formatComplexe(eq(BigDecimal
                .valueOf(5)),eq(BigDecimal
                    .valueOf(5)))).andReturn("XXX");
    replay(formatServiceMock);
    calculService.calcul(a);
    verify(formatServiceMock);
  }</pre>
<p>Explication : La méthode formatComplexe(5, 5) était attendue une fois (expected:1) et n&#8217;a jamais été appelée (actual:0)</p>
<h3>Erreur 3 : X matchers expected, Y recorded</h3>
<pre class="brush:java">java.lang.IllegalStateException: 2 matchers expected, 1 recorded.
at org.easymock.internal.ExpectedInvocation.createMissingMatchers(ExpectedInvocation.java:56)

@Test
  public void testExpectedRecorded() {
    BigDecimal a = BigDecimal.valueOf(5);
    BigDecimal b = BigDecimal.valueOf(6);
    expect(
        formatServiceMock
            .formatComplexe(BigDecimal
                .valueOf(5),eq(BigDecimal
                    .valueOf(6)))).andReturn("XXX");
    replay(formatServiceMock);
    calculService.calcul(a,b);
    verify(formatServiceMock);
  }
</pre>
<p>Il est interdit d&#8217;utiliser partiellement les comparateurs. Il faut les utiliser complètement ou pas du tout.<br />
Ainsi</p>
<pre class="brush:java"> formatServiceMock.scale(BigDecimal
.valueOf(5),eq(BigDecimal
.valueOf(5)));</pre>
<p>n&#8217;est pas OK (le deuxième argument utilise un comparateur, le premier la méthode equals =&gt; non OK).</p>
<pre class="brush:java">formatServiceMock.scale(BigDecimal
.valueOf(5),BigDecimal
.valueOf(5));</pre>
<p>OK</p>
<pre class="brush:java">formatServiceMock.scale(eq(BigDecimal
.valueOf(5)),eq(BigDecimal
.valueOf(5)));</pre>
<p>OK</p>
<h3>Erreur 4 : Calling verify is not allowed in record state</h3>
<pre class="brush:java">java.lang.IllegalStateException: calling verify is not allowed in record state
at org.easymock.internal.MocksControl.verify(MocksControl.java:109)
at org.easymock.EasyMock.verify(EasyMock.java:1608)

 @Test
  public void testRecordState() {
    BigDecimal a = BigDecimal.valueOf(5);
    BigDecimal b = BigDecimal.valueOf(6);
    expect(
        formatServiceMock
            .formatComplexe(eq(BigDecimal
                .valueOf(5)),eq(BigDecimal
                    .valueOf(6)))).andReturn("XXX");
    calculService.calcul(a,b);
    verify(formatServiceMock);
  }
</pre>
<p>Explication : un simple oubli du replay</p>
<h3>Erreur 5 :missing behavior definition for the preceding method call</h3>
<pre class="brush:java">java.lang.IllegalStateException: missing behavior definition for the preceding method call formatComplexe(5, 6)
at org.easymock.internal.MocksControl.replay(MocksControl.java:101)
at org.easymock.EasyMock.replay(EasyMock.java:1540)

 @Test
  public void testMissingBehavior() {
    BigDecimal a = BigDecimal.valueOf(5);
    BigDecimal b = BigDecimal.valueOf(6);
    formatServiceMock
            .formatComplexe(eq(BigDecimal
                .valueOf(5)),eq(BigDecimal
                    .valueOf(6)));
    replay(formatServiceMock);
    calculService.calcul(a,b);
    verify(formatServiceMock);
  }
</pre>
<p>Explication : La méthode formatServiceMock.formatComplexe(BigDecimal a,BigDecimal b) renvoie un paramètre. Il faut donc indiquer quel paramètre de retour cette dernière doit renvoyée via la méthode expect et le andReturn. Dans ce cas, l&#8217;écriture correcte est :</p>
<pre class="brush:java">expect(
formatServiceMock
.formatComplexe(eq(BigDecimal
.valueOf(5)),eq(BigDecimal
.valueOf(6)))).andReturn("XXX");</pre>
<h3>Erreur 6 : NullPointerException</h3>
<pre class="brush:java"> @Test
  public void testNullPointer() {
    BigDecimal a = BigDecimal.valueOf(5);
    BigDecimal b = BigDecimal.valueOf(6);
    formatServiceMock
            .formatComplexe(eq(BigDecimal
                .valueOf(5)),eq(BigDecimal
                    .valueOf(6)));
    replay(formatServiceMock);
    calculServiceDouble.calcul(a,b);
    verify(formatServiceMock);
  }
</pre>
<p>avec</p>
<pre class="brush:java"> @Before
  public void before() {
    formatServiceMock = createMock(FormatService.class);
    calculService = new CalculServiceImpl(
        formatServiceMock);
    calculServiceDouble = new CalculServiceImpl();
  }
</pre>
<p>Explication : Dans 90% des cas, le mock n&#8217;a pas été affecté au service testé.</p>
<p>Le code source est dispo ici <a href="https://code.google.com/p/easymock-error/" target="_blank">https://code.google.com/p/easymock-error/</a></p>

]]></content:encoded>
			<wfw:commentRss>http://www.java-freelance.fr/java/les-erreurs-courrantes-avec-easymock/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Suivre les évènements de la communauté Java en France</title>
		<link>http://www.java-freelance.fr/java/suivre-les-evenements-de-la-communaute-java-en-france</link>
		<comments>http://www.java-freelance.fr/java/suivre-les-evenements-de-la-communaute-java-en-france#comments</comments>
		<pubDate>Sun, 13 Jun 2010 21:51:52 +0000</pubDate>
		<dc:creator>Mathilde</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Agenda]]></category>
		<category><![CDATA[conférence]]></category>
		<category><![CDATA[JDuchess]]></category>
		<category><![CDATA[JUG]]></category>

		<guid isPermaLink="false">http://www.java-freelance.fr/?p=756</guid>
		<description><![CDATA[			
			

Il y a différentes possibilités :

S&#8217;abonner à la mailing list de son &#171;&#160;Java User Group&#160;&#187; local
 suivre les flux des différentes SSII proches de chez vous qui organisent de temps à autres des soirées.
Twitter est également un bon moyen de se tenir à jour !
L&#8217;équipe de JDuchess France fournit également un calendrier des évènements à [...]]]></description>
			<content:encoded><![CDATA[			
			
<p><img class="alignleft" title="logo duchess" src="http://jduchess.org/images/duchessfr.jpg" alt="logo duchess fr" width="150" height="150" /></p>
<p>Il y a différentes possibilités :</p>
<ul>
<li>S&#8217;abonner à la mailing list de son &laquo;&nbsp;Java User Group&nbsp;&raquo; local</li>
<li> suivre les flux des différentes SSII proches de chez vous qui organisent de temps à autres des soirées.</li>
<li><a href="http://twitter.com" target="_blank">Twitter</a> est également un bon moyen de se tenir à jour !</li>
<li>L&#8217;équipe de JDuchess France fournit également un calendrier des évènements à venir : <a onclick="javascript:pageTracker._trackPageview('/outbound/article/www.google.com');" href="https://www.google.com/calendar/embed?showCalendars=0&amp;showTz=0&amp;height=600&amp;wkst=1&amp;bgcolor=%23FFFFFF&amp;src=qde8vmooe48vsm1ma3i9je88q8%40group.calendar.google.com&amp;color=%23A32929&amp;src=fr.french%23holiday%40group.v.calendar.google.com" target="_blank">Agenda Conférences des Duchess</a>. Il est possible d&#8217;ajouter facilement cet agenda à son Google calendar en tant qu&#8217;agenda ami : <a onclick="javascript:pageTracker._trackPageview('/outbound/article/www.google.com');" href="https://www.google.com/calendar/render?cid=cWRlOHZtb29lNDh2c20xbWEzaTlqZTg4cThAZ3JvdXAuY2FsZW5kYXIuZ29vZ2xlLmNvbQ" target="_blank">Consulter l’agenda Conférences dans Google Agenda</a></li>
</ul>
<p>Si vous désirez ajouter un de vos évènements à l&#8217;agenda des JDuchess, tout est indiqué sur le <a href="http://jduchess.org/duchess-france/about/le-calendrier-des-conferences/" target="_blank">blog des duchess</a></p>
<table border="0">
<tbody>
<tr>
<td></td>
</tr>
</tbody>
</table>

]]></content:encoded>
			<wfw:commentRss>http://www.java-freelance.fr/java/suivre-les-evenements-de-la-communaute-java-en-france/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Prosymna : Un GIE d&#8217;Indépendants</title>
		<link>http://www.java-freelance.fr/freelance/prosymna-un-gie-dindependants</link>
		<comments>http://www.java-freelance.fr/freelance/prosymna-un-gie-dindependants#comments</comments>
		<pubDate>Wed, 02 Jun 2010 22:27:05 +0000</pubDate>
		<dc:creator>Jean-Baptiste</dc:creator>
				<category><![CDATA[Freelance]]></category>
		<category><![CDATA[business]]></category>
		<category><![CDATA[GIE]]></category>
		<category><![CDATA[indépendant]]></category>
		<category><![CDATA[Prosymna]]></category>

		<guid isPermaLink="false">http://www.java-freelance.fr/?p=714</guid>
		<description><![CDATA[			
			
Être freelance présente beaucoup d&#8217;avantages pour très peu d&#8217;inconvénient. On peut toutefois faire l&#8217;exercice de lister les quelques problèmes que nous rencontrons:

1/3 des missions sont pourvues sans qu&#8217;il y ait d&#8217;appel d&#8217;offre ou pourvues avant même la parution de l&#8217;AO (Copinage&#8230;). Sans copains, moins d&#8217;opportunités.
Tous les grands comptes ont un service achat qui référence les [...]]]></description>
			<content:encoded><![CDATA[			
			
<p>Être freelance présente beaucoup d&#8217;avantages pour très peu d&#8217;inconvénient. On peut toutefois faire l&#8217;exercice de lister les quelques problèmes que nous rencontrons:</p>
<ol>
<li>1/3 des missions sont pourvues sans qu&#8217;il y ait d&#8217;appel d&#8217;offre ou pourvues avant même la parution de l&#8217;AO (Copinage&#8230;). Sans copains, moins d&#8217;opportunités.</li>
<li>Tous les grands comptes ont un service achat qui référence les fournisseurs. En étant indépendant, impossible d&#8217;obtenir de référencement. Nous sommes obligé de passer par un intermédiaire qui se sert largement au passage (20% en règle générale).</li>
<li>Aucun pouvoir de négociation face à nos propres fournisseurs. Nous payons nos formations plein pot, nos conférences pleins pot et nos comptables pleins pot</li>
<li>Pas de support en cas de difficulté technique, commerciale ou même juridique en mission.</li>
<li>Pas d&#8217;image. Nous avons même plutôt une image &laquo;&nbsp;négative&nbsp;&raquo;, certains nous voient comme des mercenaires.</li>
<li>Si vous êtes formateur, ou désirez donner des formations, difficile de proposer un catalogue de formations et de se faire connaître et en restant isolé.</li>
</ol>
<p>Ce rassembler autour d&#8217;une structure commune devrait permettre de palier à toutes ces difficultés, c&#8217;est ce que propose Prosymna.<span id="more-714"></span></p>
<p><!--more--></p>
<h2>Prosymna</h2>
<p>Le Groupement d&#8217;Intérêt Économique (GIE) Prosymna (prononcer Pro<strong>SS</strong>imna et non Pro<strong>Z</strong>imna) est l&#8217;initiative de deux indépendants, Nicolas Ludmann et Pierre Stevenin. L&#8217;idée est simple : créer un &laquo;&nbsp;Cabinet de conseil&nbsp;&raquo; sous la forme d&#8217;un GIE composé exclusivement d&#8217;indépendants.</p>
<p>L&#8217;objectif du GIE est de favoriser le développement de l&#8217;activité de chaque adhérent par 3 leviers :</p>
<ul>
<li>L&#8217;amélioration de la démarche commerciale</li>
<li>La réduction des coûts de fonctionnement</li>
<li>La mise en commun des retours d&#8217;expériences et des savoirs-faire</li>
</ul>
<p style="text-align: left;"><a href="http://www.java-freelance.fr/wp-content/uploads/2010/06/Concept.png"></a><a href="http://www.java-freelance.fr/wp-content/uploads/2010/06/Concept1.png"><img class="aligncenter size-large wp-image-717" title="Concept" src="http://www.java-freelance.fr/wp-content/uploads/2010/06/Concept1-1024x588.png" alt="" width="502" height="288" /></a><br />
Le tout sans ingérences. Chaque société reste complètement libre. Les contrats se font en direct avec les clients et le GIE n&#8217;intervient en tant qu&#8217;intermédiaire qu&#8217;exceptionnellement lorsque la contractualisation directe est impossible. Dans ce cas 2% de la facturation est prélevée (à comparer avec les 20% habituel).</p>
<p><!--more--></p>
<p><!--more--></p>
<h3>Amélioration de la démarches commerciale</h3>
<p>Il s&#8217;agit de permettre :</p>
<ul>
<li>L&#8217;obtention de référencement et la réponse aux appels d&#8217;offres en mettant en avant le Chiffre d&#8217;Affaire et la taille global du GIE aux clients  finaux.</li>
<li>D&#8217;avoir une image, celle du GIE. On peut imaginer sponsoriser des conférences ou en proposer sur nos domaines d&#8217;expertise.</li>
<li>La mise en commun de support  commerciaux : site Internet, e-mail, contrat type, modèle de CV etc.</li>
<li>La mise en avant de l&#8217;ensemble des références clients</li>
<li>Le plus important à mon avis : La création d&#8217;un réseau d&#8217;apporteurs d&#8217;affaires. Nous avons tous notre &laquo;&nbsp;petit&nbsp;&raquo; réseau de &laquo;&nbsp;clients décideurs&nbsp;&raquo; que nous pourrons ainsi utiliser pour faire des affaires au sein du GIE, en plaçant les autres membres du GIE.</li>
</ul>
<p>Il s&#8217;agirait également de faire du GIE un centre de formation, de mettre en commun les accréditations, les locaux et tout simplement l&#8217;offre de formations.</p>
<p><!--more--></p>
<p><!--more--></p>
<h3>Partage du savoir</h3>
<p>Il s&#8217;agit cette fois de :</p>
<ul>
<li>Créer un espace documentaire : Je suis plus que perplexe sur ce point, je trouve ce principe simplement dépassé avec toutes les sources d&#8217;informations, les forums spécialisés que l&#8217;on trouve sur Internet, une espace documentaire ne pourra pas rivaliser et sera certainement du temps perdus. En revanche, un blog aurait beaucoup d&#8217;intérêt.</li>
<li>Créer un réseau de professionnels à qui l&#8217;on pourrait faire appel pour du support lors d&#8217;une difficulté ou d&#8217;un besoin spécifique en mission mais également pour répondre à des appels d&#8217;offres nécessitant plusieurs personnes.</li>
<li>Mettre en place des journées de partage de connaissances comme le font Zenika, Xebia, ou SFEIR&#8230;</li>
</ul>
<p><!--more--></p>
<p><!--more--></p>
<h3>Réductions des coût fournisseurs</h3>
<p>La phrase choc fut : &laquo;&nbsp;Présenter 4 personnes pour une formation permet d&#8217;obtenir 40% de réduction sans effort&nbsp;&raquo;. Lorsque l&#8217;on connaît le prix des formations ce simple avantage justifie à lui seul la création d&#8217;un groupement.</p>
<p>Mais le spectre est large, il y a les comptables mais aussi les banques et les affactureurs qui ne traitent pas du tout de la même façon une structure qui fait 100k€ de CA et une structure qui fait 10 millions de CA.</p>
<p>Prosymna fournira également une domiciliation dans Paris avec possibilité de louer des locaux.</p>
<p><!--more--></p>
<p><!--more--></p>
<h2>Domaine d&#8217;activité</h2>
<p>Prosymna vise le conseil au sens large : organisation et management, gestion de projets, gestion de processus, maîtrise d&#8217;oeuvre, maîtrise d&#8217;ouvrage. Au forfait ou en régie. N&#8217;y a t&#8217;il pas un risque à viser trop large ? Comment se vendre &laquo;&nbsp;Cabinet d&#8217;expert&nbsp;&raquo; si le GIE est multi compétences ?</p>
<p style="text-align: center;"><a href="http://www.java-freelance.fr/wp-content/uploads/2010/06/domaines.png"><img class="aligncenter size-large wp-image-721" title="domaines" src="http://www.java-freelance.fr/wp-content/uploads/2010/06/domaines-1024x478.png" alt="" width="498" height="232" /></a></p>
<p>Une solution serait de créer une seule structure mais plusieurs pôles avec une marque différente pour chaque pôle. Si le GIE atteint les 100 adhérents nous pouvons facilement imaginer 4 pôles de 25 personnes dont un pôle &laquo;&nbsp;Java&nbsp;&raquo; rien qu&#8217;à nous ! Face aux clients nous serions un cabinet d&#8217;expert de 25 personnes et face aux fournisseurs nous serions toujours un regroupement de 100 sociétés.</p>
<p><!--more--></p>
<p><!--more--></p>
<h2>Organisation du GIE</h2>
<p>La première chose à savoir sur les GIE c&#8217;est qu&#8217;il est impossible pour un GIE de faire des bénéfices ou des pertes. Les membres sont tous solidaires des dettes et créances du GIE. Cela à un coté intéressant au niveau des créances, car si le montant des adhésions n&#8217;est pas consommé il sera possible de réduire, voir de rembourser une partie des cotisations payées. A contrario, cela présente également un risque si le GIE s&#8217;endette. Ce risque est à modérer puisque par définition, nous n&#8217;avons pas beaucoup de fournisseurs, aucun salarié et nos marges sont très importantes. De plus le GIE ne contractera qu&#8217;exceptionnellement et refusera de le faire pour des missions &laquo;&nbsp;à risque&nbsp;&raquo;. Par exemple, les missions de type conduite du changement où les décisions du prestataire peuvent coûter très chère et engager sa responsabilité seront étudiées de manière collégiale. Pour en finir avec le risque, il est tout à fait possible de proposer un contrat de prestation avec des clauses limitant la responsabilité du GIE à hauteur des sommes prises en charges par l&#8217;assurance.</p>
<p><!--more--></p>
<p><!--more--></p>
<h3>Adhésion</h3>
<p>L&#8217;adhésion est limitée aux personnes morales. Pas d&#8217;Entreprise  individuelles ou d&#8217;auto-entrepreneur.</p>
<p>L&#8217;adhésion d&#8217;un nouveau  membre est soumise aux votes des membres en assemblée générale.</p>
<p>Pour  éviter les profiteurs, qui ne viendraient que pour trouver une mission et  repartiraient immédiatement, la sortie du GIE ne pourra se faire que dans  un délai de 6 mois.</p>
<p>Prosymna propose 2 niveaux d&#8217;adhésion et 3 niveaux que je qualifierai &laquo;&nbsp;d&#8217;investissement dans le GIE&nbsp;&raquo;</p>
<ol>
<li>Les adhérents en industrie : C&#8217;est le statut de base, ils n&#8217;apportent  que leur savoir-faire.</li>
<li>Les adhérents en capital : Ce sont les adhérents qui ont au moins un an d&#8217;ancienneté au sein du GIE et qui souhaitent s&#8217;investir plus en apportant du capital.</li>
<li>Le conseil d&#8217;administration : Il est obligatoire en GIE et sera donc  tenu par les adhérents en capital qui souhaitent s&#8217;investir fortement  dans le GIE. C&#8217;est l&#8217;organe exécutif de la structure.</li>
</ol>
<p>Afin de garantir une complète transparence, des contre-pouvoirs seront mis en place :</p>
<ul>
<li>Un contrôle de la gestion du Conseil d&#8217;administration par un membre non administrateur.</li>
<li>La nomination d&#8217;un contrôleur des comptes indépendant du GIE (un 2ème comptable en fait).</li>
<li>Les comptes seront mis à disposition de tous les membres souhaitant y avoir accès.</li>
</ul>
<p><!--more--></p>
<p><!--more--></p>
<h3>Droits de votes</h3>
<p>Les décisions importantes (adhésions, exclusions, modifications des statuts) sont prises en assemblées générales.</p>
<ul>
<li>Une part = 1 vote.</li>
<li>50% des parts sont détenus en capital</li>
<li>50% des parts sont détenus en industrie.</li>
</ul>
<p>Là ça se complique. Je donne un exemple :</p>
<ul>
<li>Le capital représente 50 000€</li>
<li>L&#8217;apport en industrie représente 50 personnes.</li>
</ul>
<p>Comme il doit y avoir autant de part en industrie qu&#8217;en capital, le capital aura 50 votes et l&#8217;industrie 50 votes.</p>
<ul>
<li>Avec Mathilde nous sommes 2 personnes, nous avons donc 2 parts en industrie et 2 votes.</li>
<li>Un des administrateur à apporté 3000€, il a donc 3 parts en capital plus 1 part en industrie : 4 votes.</li>
</ul>
<p><!--more--></p>
<p><!--more--></p>
<h3>Financement</h3>
<p>J&#8217;aime bien le financement proposé. C&#8217;est un système juste, à la française, inspiré de notre système d&#8217;impôt sur le revenu. Plus on est &laquo;&nbsp;riche&nbsp;&raquo; et plus on va participer de manière importante à l&#8217;effort de financement.</p>
<p style="text-align: center;"><a href="http://www.java-freelance.fr/wp-content/uploads/2010/06/Financement.png"><img class="aligncenter size-large wp-image-725" title="Financement" src="http://www.java-freelance.fr/wp-content/uploads/2010/06/Financement-1024x566.png" alt="" width="491" height="272" /></a></p>
<p>Pour que cela soit plus parlant, je vais encore une fois donner un exemple. Une société qui fait 100k€ de chiffre d&#8217;affaire va cotiser :</p>
<ul>
<li> 500€ lors de l&#8217;adhésion</li>
<li>puis 1000€ annuellement en 4 versements trimestriel de 250€</li>
</ul>
<p>Cela peut paraître élevé mais si cela peux être remboursé 10 fois  si le GIE nous permet de contracter en direct et de faire 110k€ ou 120k€ de CA au lieu de 100k€. Une formation de 3000€ pourra ne coûter que 2000€, un apport d&#8217;affaire remboursera également une ou 2 années de cotisations etc. Chacun fera ses petits calculs et verra son intérêt à adhérer ( ou à ne pas adhérer ).</p>
<p>Ce qui risque de bloquer les adhésions, c&#8217;est que les adhérents potentiels étant déjà en mission, ayant déjà leurs fournisseurs et leur réseau, ils n&#8217;auront pas le besoin immédiat de cette structure et risquent de repousser à plus tard l&#8217;adhésion pour ne finalement jamais adhérer (<a href="http://www.usi2009.com/webcast-5-26-Vaincre.le.Plouf.html" target="_blank">et plouf!</a>). Je me demande si, plutôt que de faire une adhésion à 500€ il ne serait pas mieux de faire l&#8217;inverse, avec 6 mois de dispense de cotisations, au moins le temps d&#8217;atteindre une taille critique. En contrepartie, je porterai une grande attention à la sélection des premiers adhérents.</p>
<p><!--more--></p>
<p><!--more--></p>
<h2>Le mot de la fin</h2>
<p>La présentation du GIE s&#8217;est terminée par un &laquo;&nbsp;Plan d&#8217;action&nbsp;&raquo; sur l&#8217;année 2010 et sur les objectifs à 4 ans. Cela m&#8217;a fait sourire car je suis entrain de lire l&#8217;excellent livre <a href="http://37signals.com/rework/" target="_blank">Rework</a> qui explique justement que ce n&#8217;est que perte de temps de faire des plans sur la comète. L&#8217;idée du GIE est excellente, cela fait plusieurs mois que j&#8217;ai également eu cette idée tout en ayant ni le courage ni les capacités d&#8217;en être l&#8217;initiateur. Cette opportunité doit être soit saisie soit être source d&#8217;inspiration mais je pense que pour Prosymna il faut maintenant dépenser l&#8217;énergie à bâtir une base solide.</p>
<p>Nous avons également évoqué durant la réunion le positionnement du GIE face à la chasse aux indépendants actuellement ouverte chez certains grands comptes.</p>
<p>Si vous voulez en savoir plus, je vous invite à vous inscrire à la prochaine réunion qui aura lieu Mardi 8 Juin 2010. <a href="http://evenement.prosymna.com/prosymna_formulaire.html" target="_blank">Les inscriptions se font ici.</a></p>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 342px; width: 1px; height: 1px; overflow: hidden;">
<p>Être freelance présente beaucoup d&#8217;avantages pour très peu  d&#8217;inconvénient. On peut toutefois faire l&#8217;exercice de les lister :</p>
<ol>
<li>1/3 des missions sont pourvus sans qu&#8217;il y ait d&#8217;appel d&#8217;offre ou  pourvues avant même la parution de l&#8217;AO (Copinage&#8230;). Sans copains,  moins d&#8217;opportunités.</li>
<li>Tous les grands comptes ont un service achat qui référence les  fournisseurs. En étant indépendant, impossible d&#8217;obtenir de  référencement. Nous sommes obligé de passer par un intermédiaire qui se  sert largement au passage (20% en règle générale).</li>
<li>Aucun pouvoir de négociation fasse à nos propres fournisseurs.  Nous payons nos formations plein pôt, nos conférences pleins pôt et nos  comptables pleins pôt</li>
<li>Pas de support en cas de difficulté technique, commerciale ou même  juridique en mission.</li>
<li>Pas d&#8217;image. Nous avons même plutôt une image &laquo;&nbsp;négative&nbsp;&raquo;, certains  nous voit comme des mercenaires..</li>
<li>Si vous êtes formateur, ou désirez donner des formations,  difficile de proposer un catalogue de formations et de se faire  connaître et en restant isolé.</li>
</ol>
<p>Ce rassembler autour d&#8217;une structure commune devrait permettre de  palier à toutes ces difficultés, c&#8217;est ce que propose Prosymna.</p>
<h2>Prosymna</h2>
<p>Le Groupement d&#8217;Intérêt Économique (GIE) Prosymna (prononcer Pro<strong>SS</strong>imna  et non Pro<strong>Z</strong>imna) est l&#8217;initiative de deux indépendants, Nicolas  Ludmann et Pierre Stevenin. L&#8217;idée est simple : créer un &laquo;&nbsp;Cabinet de  conseil&nbsp;&raquo; sous la forme d&#8217;un GIE composé exclusivement d&#8217;indépendant en  société.</p>
<p>L&#8217;objectif du GIE est de favoriser le développement de  l&#8217;activité de chaque adhérent par 3 leviers :</p>
<ul>
<li>L&#8217;amélioration de la démarche commerciale</li>
<li>La réduction des coûts de fonctionnement</li>
<li>La mise en commun des retours d&#8217;expériences et des savoirs-faires</li>
</ul>
<p style="text-align: left;"><a href="http://www.java-freelance.fr/wp-content/uploads/2010/06/Concept1.png"><img class="aligncenter size-large wp-image-717" title="Concept" src="http://www.java-freelance.fr/wp-content/uploads/2010/06/Concept1-1024x588.png" alt="" width="502" height="288" /></a><br />
Le tout sans ingérences. Chaque société reste complétement libre.  Les contrats se font en direct avec les clients et le GIE n&#8217;intervient  en tant qu&#8217;intermédiaire qu&#8217;exceptionnellement lorsque la  contractualisation directe est impossible. Dans ce cas 2% de la  facturation est prélevée (à comparer avec les 20% habituel).</p>
<h3>Amélioration de la démarches commerciale</h3>
<p>Il s&#8217;agit de permettre :</p>
<ul>
<li>L&#8217;obtention de référencement et la réponse aux appels d&#8217;offres  importante en mettant en avant le Chiffre d&#8217;Affaire et la taille global  du GIE aux clients  finaux.</li>
<li>D&#8217;avoir une image, celle du GIE. Pour cela, il serait possible  de  sponsoriser de grands évènements comme les JUGs ou d&#8217;autres  conférences.</li>
<li>La mise en commun de support  commerciaux : site internet, e-mail,  contrat type, modèle de CV,  et logo.</li>
<li>La mise en avant de l&#8217;ensemble de nos références clients</li>
<li>Le plus important à mon avis : La création d&#8217;un réseau  d&#8217;apporteurs d&#8217;affaires. Nous avons tous notre &laquo;&nbsp;petit&nbsp;&raquo; réseau de  décideurs que nous pourrons ainsi utiliser pour faire des affaires au  sein du GIE, en plaçant les autres membres du GIE.</li>
</ul>
<p>Il s&#8217;agirait également de faire du GIE un centre de formation, de  mettre en commun les accréditations, les locaux et tout simplement  l&#8217;offre de formations.</p>
<h3>Partage du savoir</h3>
<p>Il s&#8217;agit cette fois de :</p>
<ul>
<li>Créer un espace documentaire : Je suis plus que perplexe sur ce  point, je trouve ce principe simplement dépassé avec toutes les sources  d&#8217;informations, les forums spécialisé que l&#8217;on trouve sur Internet, une  espace documentaire ne pourra pas rivaliser et sera certainement du  temps de perdue. En revanche, un blog à beaucoup d&#8217;intérêt.</li>
<li>Créer un réseau de professionnels à qui l&#8217;on pourrait faire appel  pour du support lors d&#8217;une difficulté ou d&#8217;un besoin spécifique en  mission mais également pour répondre à des appels d&#8217;offres commune,  nécessitant plusieurs personnes.</li>
<li>Mettre en place des journées de partage de connaissances comme le  font Zenika, Xebia, ou SFEIR&#8230;</li>
</ul>
<h3>Réductions des coût fournisseurs</h3>
<p>La phrase choc fut : &laquo;&nbsp;Présenter 4 personnes pour une formation permet  d&#8217;obtenir 40% de réduction sans effort&nbsp;&raquo;. Lorsque l&#8217;on connaît le prix  des formations ce simple avantage justifie à lui seul la création d&#8217;un  groupement.</p>
<p>Mais le spectre est plus large, il y a les comptables  mais aussi les banques et les affactureurs qui ne traitent pas du tout  de la même façon une structure qui fait 100k€ de CA et une structure qui  fait 10 millions de CA. Prosymna fournira également une domiciliation  dans Paris avec possibilité de louer des locaux.</p>
<h2>Domaine d&#8217;activité</h2>
<p>Prosymna vise le conseil au sens large : organisation et management,  gestion de projets, gestion de processus, maîtrise d&#8217;oeuvre, maîtrise  d&#8217;ouvrage. Au forfait ou en régie. N&#8217;y a t&#8217;il pas un risque à viser trop  large ? Comment se vendre &laquo;&nbsp;Cabinet d&#8217;expert&nbsp;&raquo; si le GIE est  multi-compétences ?</p>
<p style="text-align: center;"><a href="http://www.java-freelance.fr/wp-content/uploads/2010/06/domaines.png"><img class="aligncenter size-large wp-image-721" title="domaines" src="http://www.java-freelance.fr/wp-content/uploads/2010/06/domaines-1024x478.png" alt="" width="498" height="232" /></a></p>
<p>Un solution serait de créer une  seule structure mais plusieurs pôles avec une marque différente pour  chaque pôle. Si le GIE atteint les 100 adhérents nous pouvons facilement  imaginer 4 pôles de 25 personnes dont un pôle &laquo;&nbsp;Java&nbsp;&raquo; rien qu&#8217;à nous !  Fasse aux clients nous serions un cabinet d&#8217;expert de 25 personnes et  fasse aux fournisseurs nous serions toujours un regroupement de 100  sociétés.</p>
<h2>Organisation du GIE</h2>
<p>Le première chose à savoir sur les GIE c&#8217;est qu&#8217; il est impossible  pour un GIE de faire des bénéfices ou des pertes. Les membres sont tous  solidaires des dettes et créances du GIE. Cela à un coté intéressant au  niveau des créances, car si le montant des adhésions n&#8217;est pas consommé  il sera possible de réduire, voir de rembourser une partie des  cotisations payées. A contrario, cela présente également un risque si le  GIE s&#8217;endette. Ce risque est à modérer puisque par définition, nous  n&#8217;avons pas beaucoup de fournisseurs, aucun salarié et nos marges sont  très importantes. De plus le GIE ne contractera qu&#8217;exceptionnellement et  refusera de le faire pour des missions &laquo;&nbsp;à risque&nbsp;&raquo;. Par exemple, les  missions de type conduite du changement où les décisions du prestataires  peuvent coûter très chère et engager sa responsabilité seront étudiée  de manière collégiale. Pour en finir avec le risque, il est tout à fait  possible de proposer un contrat de prestation avec des clauses limitant  la responsabilité du GIE à hauteur des sommes prises en charges par  l&#8217;assurance.</p>
<h3>Adhésion</h3>
<p>L&#8217;adhésion est limité aux personnes morales. Pas d&#8217;Entreprise   individuelles ou d&#8217;auto-entrepreneur.</p>
<p>L&#8217;adhésion d&#8217;un nouveau   membre est soumise aux votes des membres en assemblée générale.</p>
<p>Pour   éviter les profiteurs, qui ne viendrait que pour trouver une mission  et  repartirai immédiatement, la sortie du GIE ne pourra se faire que  dans  un délai de 6 mois.</p>
<p>Prosymna propose 2 niveaux d&#8217;adhésion  et 3 niveaux que je qualifierai &laquo;&nbsp;d&#8217;investissement dans le GIE&nbsp;&raquo;</p>
<ol>
<li>Les adhérents en industrie : C&#8217;est le statut de base, ils  n&#8217;apportent  que leur savoir-faire.</li>
<li>Les adhérents en capital : Ce sont les adhérents qui ont une  certaine anciennté au sein du GIE et qui ont souhaités s&#8217;investir encore  plus dans en apportant du capital.</li>
<li>Le conseil d&#8217;administration : Il est obligatoire en GIE et sera  donc  tenu par les adhérents en capital qui souhaitent s&#8217;investir  fortement  dans le GIE. C&#8217;est l&#8217;organe exécutif de la structure.</li>
</ol>
<p>Afin de garantir un complète transparence, des contres-pouvoirs  seront mis en place :</p>
<ul>
<li>Un contrôle de la gestion du Conseil d&#8217;administration par un  membre non administrateur.</li>
<li>La nomination d&#8217;un contrôleur des comptes indépendant du GIE (un  2ème comptable en fait).</li>
</ul>
<h3>Droits de votes</h3>
<p>Les décisions importantes (adhésions, exclusions, modifications des  statuts) sont prises en assemblés générales.</p>
<ul>
<li>Une part = 1 vote.</li>
<li>50% des parts sont détenus en capital</li>
<li>50% des parts sont détenus en industrie.</li>
</ul>
<p>Là ça se complique. Je donne un exemple :</p>
<ul>
<li>Le capital représente 50 000€</li>
<li>L&#8217;apport en industrie représente 50 personnes.</li>
</ul>
<p>Comme il doit y avoir autant de part en industrie qu&#8217;en capital, le  capital aura 50 votes et l&#8217;industrie 50 votes.</p>
<ul>
<li>Avec Mathilde nous sommes 2 personnes, nous avons donc 2 parts en  industrie et 2 votes.</li>
<li>Un des administrateur à apporté 3000€, il a donc 3 parts en  capital plus 1 part en industrie : 4 votes.</li>
</ul>
<h3>Financement</h3>
<p>J&#8217;aime bien le financement proposé. C&#8217;est un système juste, à la  française, inspiré de notre système d&#8217;impôt sur le revenus. Plus est  riches et plus on va participer de manière importante à l&#8217;effort.</p>
<p style="text-align: center;"><a href="http://www.java-freelance.fr/wp-content/uploads/2010/06/Financement.png"><img class="aligncenter size-large wp-image-725" title="Financement" src="http://www.java-freelance.fr/wp-content/uploads/2010/06/Financement-1024x566.png" alt="" width="491" height="272" /></a></p>
<p>Pour que cela soit plus parlant,  je vais encore une fois donner un exemple. Une société qui fait 100ke  de chiffre d&#8217;affaire va cotiser :</p>
<ul>
<li> 500€ lors de l&#8217;adhésion</li>
<li>puis 1000€ annuellement en 4 versements trimestriel de 250€</li>
</ul>
<p>cela peut paraître élevé mais si cela peux être remboursé 10 fois par  an si le GIE nous permet de contracter en direct et de faire 110k€ ou  120k€ de CA au lieu de 100k€. Une formation de 3000€ pourra ne couter  que 2000€, un apport d&#8217;affaire remboursera également une ou 2 années de  cotisations etc. Chacun fera ses petits calculs et verra son interêt a  adhérer ( ou à ne pas adhérer ).</p>
<p>Ce qui risque d&#8217;en dissuader plus  d&#8217;un à mon humble avis, c&#8217;est qu&#8217;en étant déjà en mission, en ayant  déjà nos fournisseurs, notre réseau, nous n&#8217;ayons pas un besoin immédiat  de cette structure et de repousser à plus tard l&#8217;adhésion pour ne  finalement pas adhérer (<a href="http://www.usi2009.com/webcast-5-26-Vaincre.le.Plouf.html" target="_blank">et  plouf!</a>). Honnêtement, à leur place, plutôt que de faire une adhésion  a 500€ je ferai l&#8217;inverse, avec 6 mois de dispense de cotisations et  pas d&#8217;adhésion, au moins le temps d&#8217;atteindre une taille critique. En  contrepartie, je porterai une grande attention à la sélection des  premiers adhérents.</p>
<h2>Le mot de la fin</h2>
<p>La présentation du GIE s&#8217;est terminée par un &laquo;&nbsp;Plan d&#8217;action&nbsp;&raquo; sur  l&#8217;année 2010 et sur les objectifs à 4 ans. Cela m&#8217;a fait sourire car je  suis entrain de lire l&#8217;excellent livre <a href="http://37signals.com/rework/" target="_blank">Rework</a> qui explique justement  que ce n&#8217;est que perte de temps de faire des plans sur la comète. L&#8217;idée  du GIE est excellente, je pense qu&#8217;il faut maintenant dépenser  l&#8217;énergie à bâtir une base solide.</p>
<p>Nous avons également évoqué  durant la réunion le positionnement du GIE fasse à la chasse aux  indépendants actuellement ouverte chez certain grand compte.</p>
<p>Si  vous voulez en savoir plus, je vous invite à vous inscrire à la  prochaine réunion qui aura lieu Mardi 8 Juin 2010. <a href="http://evenement.prosymna.com/prosymna_formulaire.html" target="_blank">Les  inscriptions se font ici.</a></p>
</div>

]]></content:encoded>
			<wfw:commentRss>http://www.java-freelance.fr/freelance/prosymna-un-gie-dindependants/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Kawa BarCamp 2</title>
		<link>http://www.java-freelance.fr/java/kawa-bar-camp-2</link>
		<comments>http://www.java-freelance.fr/java/kawa-bar-camp-2#comments</comments>
		<pubDate>Sun, 30 May 2010 17:47:01 +0000</pubDate>
		<dc:creator>Mathilde</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[agile]]></category>
		<category><![CDATA[code]]></category>
		<category><![CDATA[duchess]]></category>
		<category><![CDATA[easymock]]></category>
		<category><![CDATA[JUnit]]></category>
		<category><![CDATA[KawaCamp]]></category>
		<category><![CDATA[test]]></category>

		<guid isPermaLink="false">http://www.java-freelance.fr/?p=691</guid>
		<description><![CDATA[			
			
J&#8217;ai participé hier à la deuxième édition du kawa barcamp. Un bar camp c&#8217;est une rencontre ouverte autour de thèmes choisis par les participants. Nous étions hier une trentaine de personnes réunis pendant environ 3 heures. Après un bref tour de table où nous nous sommes présentés (nom + prénom + 3 mots clés), 8 [...]]]></description>
			<content:encoded><![CDATA[			
			
<p><a href="http://www.java-freelance.fr/wp-content/uploads/2010/05/barcamp_logo_white1.png"><img class="size-medium wp-image-694 alignleft" title="barcamp_logo_white1" src="http://www.java-freelance.fr/wp-content/uploads/2010/05/barcamp_logo_white1-300x100.png" alt="" width="300" height="100" /></a>J&#8217;ai participé hier à la deuxième édition du kawa barcamp. Un bar camp c&#8217;est une rencontre ouverte autour de thèmes choisis par les participants. Nous étions hier une trentaine de personnes réunis pendant environ 3 heures. Après un bref tour de table où nous nous sommes présentés (nom + prénom + 3 mots clés), 8 personnes ont inscrits des thèmes d&#8217;ateliers sur un tableau. Nous devions choisir parmis 2 sujets au choix :<span id="more-691"></span><br />
en première partie No SQL pour les entreprises / TDD et ATDD / HTML 5 et en deuxième User Experience / Les nouveaux frameworks web (Play! Vaadin) / Les commentaires dans le code . Et d&#8217;autres que j&#8217;ai oublié !</p>
<p>J&#8217;ai participé à TDD/ATTD et à la session sur les commentaires dans le code.</p>
<h3>TDD &#8211; ATTD</h3>
<p>Le Test Driven Development est une méthode de programmation basée sur les règles suivantes :</p>
<ul>
<li> on écrit un test</li>
<li> on vérifie qu&#8217;il échoue</li>
<li> on écrit<strong> juste ce qu&#8217;il faut pour que le test passe </strong>(et rien d&#8217;autre!)</li>
<li> on vérifie qu&#8217;il passe</li>
<li> <strong>on refactorise encore et encore</strong></li>
</ul>
<p>L&#8217;Acceptance Test Driven Development (ATDD) est basée sur l&#8217;idée de faire des tests d&#8217;acceptance (automatisés) avant même de commencer les développements. La bonne mise en pratique se fait en deux temps : le client, les utilisateurs, la MOA écrit les test pendant que les développeurs se chargent de les automatiser. Plusieurs outils existent pour cela comme par exemple <a href="http://www.greenpeppersoftware.com" target="_blank">Greenpepper</a>, <a href="http://fitnesse.org/FitNesse" target="_blank">Fit/Fitnesse</a>, <a href="http://code.google.com/p/robotframework/" target="_blank">Robot Framework</a> &#8230; La plupart se base sur des wiki pour permettre aux personnes fonctionnelles d&#8217;écrire facilement leurs tests.</p>
<p>Dans une approche basée sur l&#8217;ATDD, les spécifications et les implémentations sont dirigées par des exemples concrets. Décrire précisément des cas de tests oblige celui qui spécifie à aller plus loin que les spécifications habituelles. Cette méthode a également l&#8217;avantage d&#8217;être plus claire pour le développeur.</p>
<h4>Le TDD</h4>
<p>Peu de personnes font du TDD pur et dur, la plupart de la dizaine de personnes présentes écrivent un bout de code avant de tester.  Néanmoins,  la personne ayant le plus d&#8217;expérience est un adepte du TDD pur et dur depuis de nombreuses années. Les frameworks de mocks permettent de simplifier sensiblement la tâche du développeur. Néanmoins, le TDD est loin d&#8217;être une évidence pour tout le monde. Le risque de perdre de vue l&#8217;architecture générale du projet, la difficulté de la sensibilisation d&#8217;une équipe aux tests, les problèmes de maintenabilité et de refactoring sont quelques uns des exemples soulevés pour montrer les difficultés engendrés par l&#8217;application de cette méthode.</p>
<h4>L&#8217;ATDD</h4>
<p>Au niveau des tests d&#8217;acceptance, seul une seule personne les utilise dans un contexte d&#8217;entreprise.<br />
Le gros problème soulevé par les tests d&#8217;acceptance c&#8217;est la difficulté, lors d&#8217;utilisation d&#8217;outils type fit/fitness greenpepper est la refactorisation des tests : les tests écrits sont difficilement maintenable dans le temps. L&#8217;ATDD permet au développeur d&#8217;avoir des spécifications claires et précises, permettant entre autre de réduire les difficultés de communication entre la maitrîse d&#8217;oeuvre et d&#8217;ouvrage. Un autre point bloquant est que l&#8217;ATDD demande à l&#8217;équipe fonctionnelle de s&#8217;impliquer et de se former à un nouvel outil, ce qui n&#8217;est pas simple dans certains contextes.</p>
<h4>Digressions diverses</h4>
<p>Un autre aspect négatif est le temps pris par les tests, qu&#8217;ils soient d&#8217;intégration, d&#8217;acceptance &#8230;  Ils ont tendance à grossir encore et encore, à devenir de moins en moins maintenables jusqu&#8217;à devenir contre productif. Plutôt qu&#8217;un enchaînement d&#8217;action, difficile maintenable dans le temps, il faut se focaliser sur les work flows et sur les règles business. Il faut également essayer de limiter quand cela est possible l&#8217;utilisation de l&#8217;IHM dans les tests d&#8217;acceptance.</p>
<h3>Les commentaires dans le code</h3>
<p><a href="http://thecodersbreakfast.net/index.php?post/2010/05/23/Why-I-Don-t-Read-Your-Comments" target="_blank">Olivier Croisier</a> a pour projet de synthétiser les bonnes pratiques de commentaires. Plusieurs points ont été abordés dans cet atelier.<br />
Au niveau des APIs publics, la javadoc est coûteuse à maintenir mais obligatoire, et en anglais. Lorsqu&#8217;il y a du code, il est souvent obsolète donc à utiliser avec précaution.<br />
Au niveau du code non public, les personnes présentes utilisent beaucoup moins la javadoc. On remarque souvent qu&#8217;il n&#8217;y en a pas, qu&#8217;elle est obsolète ou inintéressante. Un point pour commenter facilement le code est l&#8217;encapsulation du code dans des méthodes private qui, via leurs noms, sont auto-documentées. On peut donc alors comprendre facilement une méthode principale en lisant la succession de méthodes appelées. A noter qu&#8217;il ne suffit pas de découper son code n&#8217;importe comment, il est important de ne pas avoir une profondeur d&#8217;appels de méthodes de ce type trop importantes (A qui appelle B qui appelle C qui appelle D qui appelle E). Un moyen de découper convenablement le code est d&#8217;éviter d&#8217;appeler dans la méthode principale des méthodes fonctionnelles et des méthodes techniques. Le code est plus lisible si on découpe du fonctionnel vers le technique.<br />
J&#8217;ai utilisé cette méthode pour découper des classes de plusieurs centaines de lignes avec un fonctionnel un peu compliqué et je trouve que le code est beaucoup plus clair, en cas d&#8217;évolution ou de recherche d&#8217;un bug, on sait directement où aller. Le problème de cette méthode est que parfois, on ne voit pas certains refactoring qui pourrait faire gagner en lisibilité (là encore, il est possible de perdre de vue la &#8216;big picture&#8217;). C&#8217;est pour cette raison que certains estiment qu&#8217;une méthode n&#8217;a d&#8217;utilité que lorsqu&#8217;elle est réutilisée et que les méthodes de plusieurs dizaines de lignes sont en fait plus claires. Sur ce sujet, lire Clean Code et Effective Java est essentiel.</p>
<p>Un autre point est l&#8217;utilisation des commentaires du style /**** GETTERS AND SETTERS *****/ /***** CONSTRUCTORS *****/ . La encore, cette méthode ne fait pas l&#8217;unanimité (et je suis loin d&#8217;en être la première fan).</p>
<p>Au niveau de l&#8217;utilisation français/anglais, c&#8217;est assez mitigé. La plupart écrivent leurs noms de variables et de commentaires en anglais, d&#8217;autres se permettent quelques écarts en français et pour quelques un le français est la norme.</p>
<p>Au niveau des tâches (//FIXME //XXX //TODO), la plupart des personnes présentes sont d&#8217;accord avec le fait que cela n&#8217;est utile que si la tâche nous concerne.</p>
<p>En ce qui concerne les warnings sur les classes, l&#8217;idée est d&#8217;en avoir aucun : l&#8217;utilisation des outils comme PMD, FindBugs, CheckStyle est à bien configurer avant utilisation, car la multiplication des warnings noie les vrais warnings dans de la pollution.</p>
<p>Je retiens également que <a href="http://www.amazon.com/Implementation-Patterns-Kent-Beck/dp/0321413091" target="_blank">Implementation Patterns de Kent Beck</a> sera une de mes lectures estivales et que l&#8217;outil mvn eclipse:eclipse permet de faire bien plus de choses que prévues !</p>
<p>J&#8217;ai passé un agréable moment, j&#8217;y étais venue surtout par curiosité et je compte bien retourner à la prochaine ! Ça a duré jusqu&#8217;à un peu plus de 23 heures pour moi, ce qui fait quand même une bonne soirée. Énormément de digressions, ça part dans tous les sens mais c&#8217;est souvent là que c&#8217;est le plus intéressant !</p>
<p>Sur twitter : <a href="http://twitter.com/KawaCampParis" target="_blank">http://twitter.com/KawaCampParis</a></p>

]]></content:encoded>
			<wfw:commentRss>http://www.java-freelance.fr/java/kawa-bar-camp-2/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>java.lang.IllegalStateException: 1 matchers expected, 2 recorded</title>
		<link>http://www.java-freelance.fr/java/java-lang-illegalstateexception-1-matchers-expected-2-recorded</link>
		<comments>http://www.java-freelance.fr/java/java-lang-illegalstateexception-1-matchers-expected-2-recorded#comments</comments>
		<pubDate>Mon, 10 May 2010 04:12:03 +0000</pubDate>
		<dc:creator>Mathilde</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[duchess]]></category>
		<category><![CDATA[easymock]]></category>
		<category><![CDATA[JUnit]]></category>
		<category><![CDATA[test]]></category>

		<guid isPermaLink="false">http://www.java-freelance.fr/?p=650</guid>
		<description><![CDATA[			
			
&#171;&#160;java.lang.IllegalStateException: 1 matchers expected, 2 recorded&#160;&#187; est une exception bien connue du développeur utilisant EasyMock. Elle veut tout simplement dire que lorsque l&#8217;on utilise un matcher (genre eq,anyObject &#8230;) il faut en utiliser pour tous les paramètres de la méthode, j&#8217;y reviendrai plus en détail dans un prochain article. Ainsi :
expect(maMethode("XYZ","BZT")).andReturn("XXX")
// est correct tout comme [...]]]></description>
			<content:encoded><![CDATA[			
			
<p>&laquo;&nbsp;java.lang.IllegalStateException: 1 matchers expected, 2 recorded&nbsp;&raquo; est une exception bien connue du développeur utilisant EasyMock. Elle veut tout simplement dire que lorsque l&#8217;on utilise un matcher (genre eq,anyObject &#8230;) il faut en utiliser pour tous les paramètres de la méthode, j&#8217;y reviendrai plus en détail dans un prochain article. Ainsi :</p>
<pre class="brush:java">expect(maMethode("XYZ","BZT")).andReturn("XXX")
// est correct tout comme :
expect(maMethode((String)anyObject(),eq("BZT"))).andReturn("XXX")
// mais pas :
expect(maMethode((String)anyObject(),"BZT")).andReturn("XXX")</pre>
<p>Sauf que mon erreur du jour, c&#8217;est que cette expression arrive sur la méthode :<br />
&laquo;&nbsp;expect(formatServiceMock.scale(eq(BigDecimal.valueOf(10)))).andReturn(c)&nbsp;&raquo; qui elle est correcte a première vue.</p>
<p><span id="more-650"></span></p>
<p>Le test passe unitairement dans Eclipse et dans Surefire. L&#8217;ensemble des tests passent dans Eclipse, il n&#8217;y a que dans lors de la tâche &laquo;&nbsp;install&nbsp;&raquo; de Maven que l&#8217;erreur se produit (et non, Maven n&#8217;a rien à voir là dedans :p).</p>
<p>Si on zoome sur le code simplifié au maximum, on obtient :<br />
Une classe et son interface, FormatServiceImpl et FormatService qui ne contiennent que 2 méthodes vides</p>
<pre class="brush:java">public class FormatServiceImpl implements
FormatService {
private static final int SCALE = 5;
public void scale(BigDecimal a) {
}
public void scale2(BigDecimal a) {
}</pre>
<p>Une classe et son interface, &laquo;&nbsp;CalculServiceImpl&nbsp;&raquo; et &laquo;&nbsp;CalculService&nbsp;&raquo; qui contient une méthode et un champ privé de type &laquo;&nbsp;FormatService&nbsp;&raquo;.</p>
<pre class="brush:java">public class FormatServiceImpl implements
public class CalculServiceImpl implements
    CalculService {

  private final FormatService formatService;

  public CalculServiceImpl(
      FormatService formatService) {
    this.formatService = formatService;
  }

  public BigDecimal addAndscale(BigDecimal a,
      BigDecimal b) {
    formatService.scale(a.add(b));
    return a.add(b);
  }
}</pre>
<p>La classe de test de &laquo;&nbsp;CalculServiceImpl&nbsp;&raquo; contient une méthode de test &laquo;&nbsp;testAddAndScale&nbsp;&raquo; qui pose problème uniquement dans le cas d&#8217;une exécution des tests via Surefire, le plugin Maven.</p>
<pre class="brush:java">public class CalculServiceImplTest {
private CalculServiceImpl calculService;
private FormatService formatServiceMock;

@Before
public void before() {
formatServiceMock = createMock(FormatService.class);
calculService = new CalculServiceImpl(
formatServiceMock);
}

@Test
public void testAdd() {
BigDecimal a = BigDecimal.valueOf(5);
BigDecimal b = BigDecimal.valueOf(5);
BigDecimal c = BigDecimal.valueOf(10);

formatServiceMock.scale(eq(BigDecimal
.valueOf(10)));
replay(formatServiceMock);
assertEquals(c, calculService.addAndscale(a,
b));
verify(formatServiceMock);
}</pre>
<p>Le fonctionnement de cette classe est classique : on définit un mock, ici : &laquo;&nbsp;formatServiceMock&nbsp;&raquo; que l&#8217;on affecte à l&#8217;implémentation testée calculService. On lui affecte un comportement spécifique : la méthode &laquo;&nbsp;scale&nbsp;&raquo; de &laquo;&nbsp;FormatService&nbsp;&raquo; est appelée avec le paramètre équivalent à &laquo;&nbsp;BigDecimal.valueOf(10)&nbsp;&raquo;. Le mock est ensuite chargée avec la méthode &laquo;&nbsp;replay(formatServiceMock)&nbsp;&raquo;.<br />
L&#8217;action testée est ensuite lancée : &laquo;&nbsp;calculService.addAndscale(a,b)&nbsp;&raquo; que l&#8217;on vérifie être égale à &laquo;&nbsp;c&nbsp;&raquo;. Puis avec : &laquo;&nbsp;verify(formatServiceMock)&nbsp;&raquo;, on vérifie que le &laquo;&nbsp;mock formatServiceMock&nbsp;&raquo; a bien eu le comportement attendu c&#8217;est à dire que la méthode &laquo;&nbsp;scale&nbsp;&raquo;  de &laquo;&nbsp;FormatService&nbsp;&raquo; a bien été appelée avec le paramètre équivalent à BigDecimal.valueOf(10) .</p>
<p>Cette classe de test ne soulève une erreur que lorsqu&#8217;elle est appelé via les test Surefire de Maven. Si on la lance unitairement via Eclipse (Run as Junit test) ou via Maven sSurefire individuellement (via mvn -Dtest=CalculServiceImplTest test)  aucun problème. Si on lance l&#8217;ensemble des tests unitaires via Eclipse (Run as JUnit test) idem aucun problème.</p>
<p>Par contre, si on la lance avec l&#8217;ensemble des tests Surefire, on obtient l&#8217;erreur :</p>
<pre class="brush:java">java.lang.IllegalStateException: 1 matchers expected, 2 recorded.
at org.easymock.internal.ExpectedInvocation.createMissingMatchers(ExpectedInvocation.java:56)
at org.easymock.internal.ExpectedInvocation.&lt;init&gt;(ExpectedInvocation.java:48)
at org.easymock.internal.ExpectedInvocation.&lt;init&gt;(ExpectedInvocation.java:40)
at org.easymock.internal.RecordState.invoke(RecordState.java:76)
at org.easymock.internal.MockInvocationHandler.invoke(MockInvocationHandler.java:38)
at org.easymock.internal.ObjectMethodsFilter.invoke(ObjectMethodsFilter.java:72)
at $Proxy5.scale(Unknown Source)
at fr.java.freelance.easymock.CalculServiceTest.testAdd(CalculServiceTest.java:40)</pre>
<p>Impossible dans un premier temps de voir d&#8217;où vient l&#8217;erreur. On utilise alors le système permettant de débugger les tests à distance à l&#8217;aide de : &laquo;&nbsp;mvn -Dmaven.surefire.debug test&nbsp;&raquo;. Lorsque l&#8217;on lance la commande, l&#8217;exécution se met en pause tant qu&#8217;elle n&#8217;a pas reçu de connexion sur son port 5005 (en configuration par défaut, customizable).</p>
<pre class="brush:java">[INFO] Scanning for projects...
[INFO] ------------------------------------------------------------------------
[INFO] Building EasyMockTest
[INFO]
[INFO] Id: fr.java.freelance:TestSpringPath:jar:0.0.1-SNAPSHOT
[INFO] task-segment: [test]
[INFO] ------------------------------------------------------------------------
[INFO] [resources:resources]
[INFO] Using default encoding to copy filtered resources.
[INFO] [compiler:compile]
[INFO] Nothing to compile - all classes are up to date
[INFO] [resources:testResources]
[INFO] Using default encoding to copy filtered resources.
[INFO] [compiler:testCompile]
[INFO] Nothing to compile - all classes are up to date
[INFO] [surefire:test]
[INFO] Surefire report directory: E:\workspace\EasyMock\target\surefire-reports
Listening for transport dt_socket at address: 5005</pre>
<p>Il suffit alors dans Eclipse d&#8217;aller dans le mode Debug Configurations et de créer une remote application sur le port 5005 et on peut débugger le test dans Eclipse .</p>
<p>Un moyen de voir  le nombre d&#8217;objet enregistré dans EasyMock est de mettre un point d&#8217;arrêt juste avant la levée de l&#8217;exception :  la méthode mockée doit avoir autant d&#8217;arguments que la liste enregistrée. Ici, la méthode est appelée avec un argument (on ne se formalise pas sur le null, seul compte ici le nombre d&#8217;argument) alors que la liste en possède 2 : un matcher &laquo;&nbsp;Any&nbsp;&raquo; et un matcher &laquo;&nbsp;Equals&nbsp;&raquo;, d&#8217;où le &laquo;&nbsp;IllegalStateException&nbsp;&raquo;.<br />
Cliquer pour voir en grand :<br />
<a href="http://www.java-freelance.fr/wp-content/uploads/2010/05/etatArgument.png"><img class="aligncenter size-large wp-image-653" title="etatArgument" src="http://www.java-freelance.fr/wp-content/uploads/2010/05/etatArgument-1024x542.png" alt="" width="1024" height="542" /></a></p>
<p>La recherche pour savoir d&#8217;où provient le &laquo;&nbsp;Any&nbsp;&raquo; est assez fastidieuse (le &laquo;&nbsp;Equals&nbsp;&raquo; étant celui du test). Les objets enregistrés le sont via un autre chemin et partagés via l&#8217;objet &laquo;&nbsp;LastControl&nbsp;&raquo;. Pour comprendre comment les matchers sont enregistrés, il suffit de faire un pas à pas en mode debug.</p>
<p>Si on entre (via F5) dans le détail de l&#8217;appel à  &laquo;&nbsp;formatServiceMock.scale(eq(BigDecimal<br />
.valueOf(10)));&nbsp;&raquo;, on arrive tout d&#8217;abord sur le calcul du &laquo;&nbsp;valueOf&nbsp;&raquo; puis sur  la méthode &laquo;&nbsp;eq&nbsp;&raquo; de la classe EasyMock :</p>
<pre class="brush:java">public static &lt;T&gt; T eq(T value) {
reportMatcher(new Equals(value));
return null;
}</pre>
<p>On entre à nouveau dans &laquo;&nbsp;reportMatcher(new Equals(value));&nbsp;&raquo;<br />
En continuant un peu avec F5 on arrive à dans la classe &laquo;&nbsp;EasyMock&nbsp;&raquo; :</p>
<pre class="brush:java">/**
* Reports an argument matcher. This method is needed to define own argument
* matchers. For details, see the EasyMock documentation.
*
* @param matcher
*/
public static void reportMatcher(IArgumentMatcher matcher) {
LastControl.reportMatcher(matcher);
}</pre>
<p>On continue à regarder ce qui se passe dans &laquo;&nbsp;LastControl&nbsp;&raquo;. On arrive  sur une classe contenant plusieurs threads : &laquo;&nbsp;threadToControl&nbsp;&raquo; &#8211;  &laquo;&nbsp;threadToCurrentInvocation&nbsp;&raquo; &#8211; &laquo;&nbsp;threadToArgumentMatcherStack&nbsp;&raquo;. Celui qui nous  intéresse est &laquo;&nbsp;threadToArgumentMatcherStack&nbsp;&raquo;. Il contient une pile  d&#8217; &laquo;&nbsp;ArgumentMatcher&nbsp;&raquo;.Le &laquo;&nbsp;reportMatcher&nbsp;&raquo; permet d&#8217;ajouter chacun des matchers  pour chacun des arguments.  A cet étape là du calcul, cette pile doit  être vide.</p>
<pre class="brush:java">public static void reportMatcher(IArgumentMatcher matcher) {
        Stack stack = threadToArgumentMatcherStack.get();
        if (stack == null) {
            stack = new Stack();
            threadToArgumentMatcherStack.set(stack);
        }
        stack.push(matcher);
    }</pre>
<p><a href="http://www.java-freelance.fr/wp-content/uploads/2010/05/etatMatcher1.png"><img title="etatMatcher" src="http://www.java-freelance.fr/wp-content/uploads/2010/05/etatMatcher1.png" alt="" width="630" height="246" /></a><br />
Comme attendu, la pile n&#8217;est pas vide,  une autre méthode y a déjà renseigné une valeur &#8230;</p>
<p>En supprimant des tests, je suis tombée sur la méthode fautive en utilisant un point d&#8217;arrêt sur ce chemin , tout au fond d&#8217;un des tests d&#8217;intégration, dans une partie où EasyMock n&#8217;était pas du tout utilisée et sur des classes n&#8217;ayant aucun rapport avec les classes testées, il y  avait quelque chose comme cela:</p>
<pre class="brush:java">@Test
public void testJunitMalConstruit() {
FormatServiceImpl formatService = new FormatServiceImpl();
formatService.scale2((BigDecimal) anyObject());
}</pre>
<p>Le &laquo;&nbsp;(BigDecimal) anyObject()&nbsp;&raquo; est ici une erreur d&#8217;étourderie qui au final se retrouve à avoir un impact très loin dans le code. C&#8217;est pour moi un bug d&#8217;EasyMock, même si ce &laquo;&nbsp;(BigDecimal) anyObject() &nbsp;&raquo; n&#8217;a rien à faire ici !</p>
<p>Le fait que les tests passent ou non dans Surefire ou dans Eclipse via &laquo;&nbsp;run as JUnit test&nbsp;&raquo; dépend en fait de l&#8217;ordre dans lequel les 2 lanceurs de tests ordonnent les différents tests. Pour enlever cette notion variable, on peut utiliser le test suivant :</p>
<pre class="brush:java">public class CalculServiceImplTest {
private CalculServiceImpl calculService;
private FormatService formatServiceMock;

@Before
public void before() {
formatServiceMock = createMock(FormatService.class);
calculService = new CalculServiceImpl(
formatServiceMock);
}
@Test
public void testJunitMalConstruit() {
FormatServiceImpl formatService = new FormatServiceImpl();
formatService.scale2((BigDecimal) anyObject());
}

@Test
public void testAdd() {
BigDecimal a = BigDecimal.valueOf(5);
BigDecimal b = BigDecimal.valueOf(5);
BigDecimal c = BigDecimal.valueOf(10);
formatServiceMock.scale(eq(BigDecimal
.valueOf(10)));
replay(formatServiceMock);
calculService.addAndscale(a,
b);
verify(formatServiceMock);
}
}</pre>
<p>Et là ca plante à chaque fois <img src='http://www.java-freelance.fr/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Et pour faire plaisir aux adorateurs de Mockito, j&#8217;ai testé avec Mockito la classe ci-dessous :</p>
<pre class="brush:java">public class CalculServiceImplMockitoTest {
  private CalculServiceImpl calculService;
  private FormatService formatServiceMock;

  @Before
  public void before() {
    formatServiceMock = mock(FormatService.class);
    calculService = new CalculServiceImpl(
        formatServiceMock);
  }
  @Test
  public void testJunitMalConstruit() {
    FormatServiceImpl formatService = new FormatServiceImpl();
    formatService.scale2((BigDecimal) anyObject());
  }

  @Test
  public void testAdd() {
    BigDecimal a = BigDecimal.valueOf(5);
    BigDecimal b = BigDecimal.valueOf(5);
    BigDecimal c = BigDecimal.valueOf(10);
    formatServiceMock.scale(eq(BigDecimal
        .valueOf(10)));

    calculService.addAndscale(a,
        b);
    verify(formatServiceMock);
  }
}</pre>
<p>Et l&#8217;erreur est ici bien claire :</p>
<pre class="brush:java">org.mockito.exceptions.misusing.InvalidUseOfMatchersException:
Misplaced argument matcher detected here:
-&gt; at fr.java.freelance.easymock.CalculServiceImplMockitoTest.testJunitMalConstruit(CalculServiceImplMockitoTest.java:24)

You cannot use argument matchers outside of verification or stubbing.
Examples of correct usage of argument matchers:
    when(mock.get(anyInt())).thenReturn(null);
    doThrow(new RuntimeException()).when(mock).someVoidMethod(anyObject());
    verify(mock).someMethod(contains("foo"))</pre>
<p>Mockito 1 &#8211; EasyMock 0 <img src='http://www.java-freelance.fr/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>

]]></content:encoded>
			<wfw:commentRss>http://www.java-freelance.fr/java/java-lang-illegalstateexception-1-matchers-expected-2-recorded/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>PowerMock Mock Mock</title>
		<link>http://www.java-freelance.fr/java/powermock-mock-mock</link>
		<comments>http://www.java-freelance.fr/java/powermock-mock-mock#comments</comments>
		<pubDate>Thu, 06 May 2010 20:56:44 +0000</pubDate>
		<dc:creator>Jean-Baptiste</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[JUnit]]></category>
		<category><![CDATA[mockito]]></category>
		<category><![CDATA[powermock]]></category>
		<category><![CDATA[test]]></category>

		<guid isPermaLink="false">http://www.java-freelance.fr/?p=630</guid>
		<description><![CDATA[			
			
PowerMock c&#8217;est quoi ?
PowerMock est une extension de 2 API bien connues des mockeurs (Ha ha), EasyMock et Mockito. Qui n&#8217;as jamais été obligé de supprimer un final, rendre une méthode private protected ou galérer sur des appels statiques pour faire ses tests ? PowerMock nous permet de &#171;&#160;tester l&#8217;intestable&#160;&#187; sans toucher au code. Bonne [...]]]></description>
			<content:encoded><![CDATA[			
			
<h1>PowerMock c&#8217;est quoi ?</h1>
<p>PowerMock est une extension de 2 API bien connues des mockeurs (Ha ha), EasyMock et Mockito. Qui n&#8217;as jamais été obligé de supprimer un final, rendre une méthode private protected ou galérer sur des appels statiques pour faire ses tests ? PowerMock nous permet de &laquo;&nbsp;tester l&#8217;intestable&nbsp;&raquo; sans toucher au code. Bonne idée ? Oui, mais attention, cette bonne idée a un coût qu&#8217;il ne faut pas négliger. L&#8217;exécution des tests peut prendre jusqu&#8217;à 10 fois plus de temps.</p>
<p>De plus, si on ne fait pas attention, on peut tomber sur des anomalies qui peuvent être difficile à résoudre si on n&#8217;a pas saisi le &laquo;&nbsp;truc&nbsp;&raquo;. L&#8217;objet de cet article est de vous présenter ce qui me crash le plus souvent mes tests.</p>
<p><span id="more-630"></span><br />
<!--more--></p>
<h1>Le problème</h1>
<p>Voici la classe à tester :</p>
<pre class="brush:java">package fr.java.freelance;

public class UnTrucCool {

public final boolean estQuelqueChose(){
return critereUn() &amp;&amp; critereDeux();
}

public boolean critereUn(){
return false;
}

public boolean critereDeux(){
return false;
}

}</pre>
<p>En fait, un test existe déjà :</p>
<pre class="brush:java">package fr.java.freelance;

import static org.junit.Assert.*;

import org.junit.Test;
import static org.mockito.Mockito.*;

public class UnTrucCoolTest {

@Test
public void testEstQuelqueChose() {
UnTrucCool banane = mock(UnTrucCool.class);
when(banane.critereDeux()).thenReturn(true);
when(banane.critereUn()).thenReturn(true);

assertTrue(banane.estQuelqueChose());
}

}</pre>
<p>Pour une bonne raison, nous décidons d&#8217;utiliser PowerMock, nous modifions donc le test comme ceci :</p>
<pre class="brush:java">package fr.java.freelance;

import static org.junit.Assert.*;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;

import static org.powermock.api.mockito.PowerMockito.*;

@RunWith(PowerMockRunner.class)
@PrepareForTest(UnTrucCool.class)
public class UnTrucCoolPMTest {

@Test
public void testEstQuelqueChose() {
UnTrucCool banane = mock(UnTrucCool.class);
when(banane.critereDeux()).thenReturn(true);
when(banane.critereUn()).thenReturn(true);

assertTrue(banane.estQuelqueChose());
}

}</pre>
<p>Le test est strictement identique, mais ça ne fonctionne plus! estQuelqueChose() renvoie systématiquement false !</p>
<p><!--more--><br />
<!--more--></p>
<h1>La solution</h1>
<p>Dans le premier test nous utilisons simplement Mockito qui ne sait pas mocker les méthodes finales. Comme il ne sait pas le faire, il adopte un comportement par défaut et appel la méthode réelle.  En passant à PowerMock, toutes les méthodes finales peuvent être mockées et doivent donc avoir un comportement défini explicitement. On notera que si estQuelquechose() n&#8217;avait pas été finale, le test Mockito aurait également dû définir explicitement le comportement à avoir.</p>
<pre class="brush:java">@RunWith(PowerMockRunner.class)
@PrepareForTest(UnTrucCool.class)
public class UnTrucCoolPMTest {

 @Test
 public void testEstQuelqueChose() {
 UnTrucCool banane = mock(UnTrucCool.class);
 when(banane.critereDeux()).thenReturn(true);
 when(banane.critereUn()).thenReturn(true);

 when(banane.estQuelqueChose()).thenCallRealMethod();

 assertTrue(banane.estQuelqueChose());
 }

}</pre>
<p>Faites attention lorsque vous passez un existant sur PowerMock.</p>
<p><a href="http://code.google.com/p/powermock/" target="_blank">http://code.google.com/p/powermock/</a></p>

]]></content:encoded>
			<wfw:commentRss>http://www.java-freelance.fr/java/powermock-mock-mock/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Application Java et Production</title>
		<link>http://www.java-freelance.fr/java/application-java-et-production</link>
		<comments>http://www.java-freelance.fr/java/application-java-et-production#comments</comments>
		<pubDate>Sun, 25 Apr 2010 20:54:55 +0000</pubDate>
		<dc:creator>Mathilde</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[application]]></category>
		<category><![CDATA[cache]]></category>
		<category><![CDATA[duchess]]></category>
		<category><![CDATA[Gestion]]></category>

		<guid isPermaLink="false">http://java-freelance.fr/?p=495</guid>
		<description><![CDATA[			
			
Lundi  12 avril avait lieu dans les locaux de Xebia une présentation sur « les applications Java et la production » animée par Cyrille Le Clerc. Cette formation de  deux heures était très intéressante, si le sujet vous intéresse et que vous êtes sur Paris, ils en refont une le lundi 26 avril http://training.xebia.fr/soiree-les-applications-java-et-la-production.
Cinq pôles principaux ont [...]]]></description>
			<content:encoded><![CDATA[			
			
<p>Lundi  12 avril avait lieu dans les locaux de Xebia une présentation sur « les applications Java et la production » animée par Cyrille Le Clerc. Cette formation de  deux heures était très intéressante, si le sujet vous intéresse et que vous êtes sur Paris, ils en refont une le lundi 26 avril <a rel="nofollow" href="http://training.xebia.fr/soiree-les-applications-java-et-la-production" target="_blank">http://training.xebia.fr/soiree-les-applications-java-et-la-production</a>.<br />
Cinq pôles principaux ont été abordés :  les bonnes pratiques autour du déploiement, la supervision et le monitoring, la gestion des logs, la question de la robustesse et les bonnes pratiques organisationnelles. Seul le déploiement sera abordé dans cet article, la suite suivra !<br />
Cyrille Le Clerc est architecte EE depuis 11 ans, dont 6 ans passé chez IBM Global Services et un peu plus de 3 ans chez Xebia.</p>
<p><span id="more-495"></span></p>
<h3>Minimiser le nombre de composants à déployer</h3>
<p>Au niveau du déploiement,  la première bonne pratique est de minimiser le nombre de composants à déployer.  Ce qui ne veut pas dire qu’il faut déployer des applications monolithiques mais bien qu’il est important de chercher  et d’essayer de regrouper les composants de manière cohérente.<br />
Il est courant pour le déploiement d&#8217;un unique EAR ou WAR de devoir dupliquer certains fichiers ou de devoir modifier certaines configuration sur d&#8217;autres serveurs. Chaque &#8216;micro-tâche&#8217; de déploiement peut être source d&#8217;erreurs, moins il y en a plus il y a de chance que cela se passe bien ou que le retour en arrière soit aisé.</p>
<p>Ainsi, on peut retrouver la situation suivante : le contenu statique est contenu dans l’archive EAR avec l&#8217;ensemble du code nécessaire à l&#8217;application. Ce contenu statique sera dupliqué sur un serveur http simple dans une optique d&#8217;optimisation d&#8217;accès aux ressources statiques. On y accède via un filtrage des URLs en utilisant un mécanisme de routage en amont.</p>
<p style="text-align: left;"><a href="http://java-freelance.fr/wp-content/uploads/2010/04/isole2.jpg"></a><a href="http://java-freelance.fr/wp-content/uploads/2010/04/Deploy.jpg"><img class="aligncenter size-medium wp-image-515" title="Deploy" src="http://java-freelance.fr/wp-content/uploads/2010/04/Deploy-300x271.jpg" alt="" width="300" height="271" /></a><br />
Cela fait donc 3 étapes pour une livraison :</p>
<ul>
<li>déploiement de l’application,</li>
<li> déploiement des ressources statiques,</li>
<li> mise à jour des règles de routages.</li>
</ul>
<p>De plus, il est fréquent que le point de routage soit en plus sur un serveur mutualisé, ce qui augmente le risque d’impact de la mise à jour pour la web application déployée sur les autres applications dont les routes transitent par ce point de routage.  La principale raison évoquée est le fait de gagner en performance.<br />
La proposition de Cyrille est d’utiliser le mécanisme de proxy-cache http, pouvant être facilement mis en place par l’équipe infrastructure  avec des outils tels que que Varnish Cache, squid, ibm Fast Response Cache Accelerator (FRCA) voir un simple module apache http comme mod_cache.<br />
Il n’y a plus de déploiement des fichiers sur un serveur statique, plus de besoin de modifier les règles de routage.<br />
Un autre exemple sur la nécessité du regroupement des différentes briques par cohérence est le double filtrage lié à la sécurité. Il est fréquent d’avoir en amont un premier filtrage par adresse IP puis dans un deuxième temps un filtrage sur un couple login/mot de passe. L’idée est dans ce cas de regrouper ses deux actions ensemble, que ce cela soit sur le firewall, en java ou autre mais à un même point . De plus, cela permet également de pouvoir faire un filtrage par login et par adresse IP en même temps c&#8217;est à dire de contrôler par exemple que le login &#8216;admin&#8217; ne puisse être utilisée que par l&#8217;adresse IP X et l&#8217;adresse IP Y.</p>
<h3>Cohabiter en bonne intelligence</h3>
<h4>Sur un même serveur physique</h4>
<p>Le deuxième aspect du déploiement abordé est sur le fait de cohabiter en bonne intelligence.  Au niveau de la cohabitation de plusieurs applications sur un même serveur, les  recommandations sont simples :<br />
Minimiser les répertoires absolus et faire en sorte que chaque fichier soit dans un répertoire préfixé par un identifiant d&#8217;application (possible d&#8217;utiliser le group id et l&#8217;artifact id du composant par exemple ou plus simple /etc/my-application.<br />
Organiser l&#8217;utilisation des ports réseaux en séparant un préfixe definissant l&#8217;application et un suffixe définissant le service par exemple,  si 100 correspond à l&#8217;application Facture, on aura le port du serveur http sur 10080, le port du SSL sur 10043. Cette séparation permet de faire cohabiter de manière organisée 100 applications.</p>
<p><a href="http://java-freelance.fr/wp-content/uploads/2010/04/port.jpg"><img class="aligncenter size-full wp-image-518" title="port" src="http://java-freelance.fr/wp-content/uploads/2010/04/port.jpg" alt="" width="238" height="133" /></a></p>
<h4>Sur un même serveur d&#8217;application</h4>
<p>En ce qui concerne la bonne cohabitation sur un même serveur d&#8217;application,  il faut de la même manière minimiser les répertoires absolus (c&#8217;est à dire privilégier les chemins relatifs comme (${java.io.tmpdir}/my-app1/) et les rendre lisible en les préfixant par l&#8217;artifact id (et le group id si besoin) pour empêcher les collisions entre répertoire.<br />
Cyrille recommande également de limiter au maximum les variables java statiques qui impactent l&#8217;ensemble du serveur, il vaut mieux les définir par application.<br />
Au niveau des paramètres de configuration, la question est posée de savoir si il vaut mieux mettre les fichiers de configuration directement dans l&#8217;archive ou au contraire de les externaliser. La décision dépend de la situation, par exemple, si l&#8217;équipe d&#8217;exploitation ne désire pas que l&#8217;équipe de développement possède les accès base de données, la configuration se fera à l&#8217;extérieure de l&#8217;application.<br />
Une autre recommandation au sujet des paramètres de configuration est de limiter le nombre de paramètres dont la valeur change suivant les environnements : en isolant ses réseaux virtuels, il est possible de conserver des noms de bases de données identiques, de conserver les noms de hosts.</p>
<p style="text-align: center;"><a href="http://java-freelance.fr/wp-content/uploads/2010/04/isole.jpg"><br />
</a><a href="http://java-freelance.fr/wp-content/uploads/2010/04/isole3.jpg"></a><a href="http://java-freelance.fr/wp-content/uploads/2010/04/isole5.jpg"><img class="aligncenter size-full wp-image-537" title="isole5" src="http://java-freelance.fr/wp-content/uploads/2010/04/isole5.jpg" alt="" width="577" height="452" /></a></p>
<p><a href="http://java-freelance.fr/wp-content/uploads/2010/04/isole1.jpg"><br />
</a>Dans le cas où l&#8217;équipe d&#8217;exploitation propose d&#8217;utiliser des noms incluant par exemple les différents environnements ex : monappli-dev , monappli-rec, ma-bdd-dev, ma-bbd-rec il est possible de proposer un compromis avec la création d&#8217;alias. La multiplication des paramètres de configuration est souvent source de problème lors des déploiements. De même, il n&#8217;y a pas lieu de faire changer les ports d&#8217;écoute.<br />
Cette recommandation impose qu&#8217;il n&#8217;y ait pas de perméabilité entre les zones de développement, de recette et de production. Dans une précédente mission, il suffisait d&#8217;utiliser foxy-proxy, plugin firefox de configuration de proxy pour switcher automatiquement de mon application web de prod vers mon application web d&#8217;homologation. Dans ce cas, l&#8217;homologation était fermée, impossible d&#8217;avoir accès à Internet par exemple. Il est également conseillé, par sécurité, de modifier par exemple le logo sur l&#8217;homologation ou de jouer avec des codes couleurs pour indiquer de manière visuelle l&#8217;environnement sur lequel on se trouve mais aussi d&#8217;ajouter un filtrage sur les ip appelantes (bloquer les ips ou changer les mots de passes). A l&#8217;aide des .profile, il est possible d&#8217;indiquer directement sur la console &#8216;prod&#8217; ou &#8216;valid&#8217;, avec putty de changer les couleurs etc.</p>
<h3>Savoir ce qui est réellement déployé</h3>
<p>Un autre point important du déploiement est de déployer des composants qui soient réellement traçables. On ne déploie que des composants taggés sur lesquels aucun commit n&#8217;aura été effectué (règle d&#8217;entreprise respectée/ utilisation de la fonctionnalité d&#8217;<a href="http://www.clever-age.com/veille/blog/utilisation-des-hooks-avec-subversion.html" target="_blank">hook </a>pour SVN) et/ou on empêche le redéploiement ( utilisation de la <a href="http://www.sonatype.com/people/2009/11/nexus-tips-disable-redeployment-in-nexus/" target="_blank">fonctionnalité Disable Redeployement de Nexus</a>)) pour pouvoir connaître avec précision les classes déployées.   Des outils comme Nexus ou Archiva permettent facilement de déployer des archives sur différents environnements en garantissant leur conformité.</p>
<p>Voilà les différents axes abordés sur la partie &#8216;déploiement&#8217;, la présentation, qui a durée 2 heures environ et a abordé 5 axes différents (seul le premier a été présenté ici), a été dense ! Pour ceux que cela intéresse plus en détails, Cyrille devrait publier ses slides dans quelques semaines et organisera à la mi mai une<a href="http://training.xebia.fr/formations-applications-java-pretes-pour-la-production-cyrille-leclerc/" target="_blank"> formation de 2 jours sur le thème</a>. Pour le suivre sous twitter : <a href="http://twitter.com/cyrilleleclerc" target="_blank">@Cyrilleleclerc</a> .</p>

]]></content:encoded>
			<wfw:commentRss>http://www.java-freelance.fr/java/application-java-et-production/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Revue de code II</title>
		<link>http://www.java-freelance.fr/java/revue-de-code-ii</link>
		<comments>http://www.java-freelance.fr/java/revue-de-code-ii#comments</comments>
		<pubDate>Mon, 19 Apr 2010 20:50:41 +0000</pubDate>
		<dc:creator>Mathilde</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[code]]></category>
		<category><![CDATA[optimisation]]></category>

		<guid isPermaLink="false">http://www.java-freelance.fr/?p=356</guid>
		<description><![CDATA[			
			
Suite de la revue de code : BigDecimal, nommage et concaténation de String.

BigDecimal.equals vs BigDecimal.compareTo
Deux BigDecimaux qui ont la même valeur avec une précision différente ne sont pas considérés comme égaux à l&#8217;aide la méthode equals. En revanche, ils sont considérés comme égaux si on les compare avec la méthode compareTo.
Exemple :
BigDecimal bigDecimal1 = new [...]]]></description>
			<content:encoded><![CDATA[			
			
<p>Suite de la revue de code : BigDecimal, nommage et concaténation de String.</p>
<p><span id="more-356"></span></p>
<h2>BigDecimal.equals vs BigDecimal.compareTo</h2>
<p>Deux BigDecimaux qui ont la même valeur avec une précision différente ne sont pas considérés comme égaux à l&#8217;aide la méthode equals. En revanche, ils sont considérés comme égaux si on les compare avec la méthode compareTo.</p>
<p>Exemple :</p>
<pre class="brush:java">BigDecimal bigDecimal1 = new BigDecimal(0);//0
BigDecimal bigDecimal2 = BigDecimal.ZERO;//0
BigDecimal bigDecimal3 = BigDecimal.valueOf(0.0);//0.0

System.out.println(bigDecimal1.equals(bigDecimal2));  //true
System.out.println(bigDecimal1.equals(bigDecimal3));  //false
System.out.println(bigDecimal2.equals(bigDecimal3)); //false

System.out.println(bigDecimal1.compareTo(bigDecimal2)==0); //true
System.out.println(bigDecimal1.compareTo(bigDecimal3)==0); //true
System.out.println(bigDecimal2.compareTo(bigDecimal3)==0); //true</pre>
<p>public int compareTo(BigDecimal val)</p>
<p>Compares this BigDecimal with the specified BigDecimal. Two BigDecimal objects that are equal in value but have a different scale (like 2.0 and 2.00) are considered equal by this method. This method is provided in preference to individual methods for each of the six boolean comparison operators (&lt;, ==, &gt;, &gt;=, !=, &lt;=). The suggested idiom for performing these comparisons is: (x.compareTo(y) &lt;op&gt; 0), where &lt;op&gt; is one of the six comparison operators.</p>
<h2>public abstract</h2>
<p>Dans un autre registre, quelque chose qui revient souvent dans le code :</p>
<p>Les termes public ou abstract dans la déclaration des méthodes d&#8217;une interface.  L&#8217;ensemble des méthodes d&#8217;une interface sont obligatoirement public abstract, inutile donc de l&#8217;ajouter.</p>
<h2>Mauvais nommage</h2>
<p>Il y a toujours des variables mal nommées.  Plusieurs raisons à cela :</p>
<ul>
<li>elles ne respectent pas les règles de nommage Java (variables en majuscule alors que non final static, présence de _ dans une variable local).</li>
</ul>
<ul>
<li>le nom de la variable ne dépend de ce qu&#8217;elle fait : autant i,j,k sont des noms de variables admettables pour des compteurs au sein de boucle, pas ailleurs.</li>
</ul>
<ul>
<li>le nom de la variable n&#8217;est pas compréhensible : updateFMTTTL si FMTTTL ne renvoie à rien fonctionnellement parlant,  il faut lui donner un autre nom. Il vaut mieux une variable à nom long mais compréhensible plutôt qu&#8217;essayer de faire court. Ceux qui vous passeront derrière vous en remercieront !</li>
</ul>
<p>Le livre <a href="http://www.eyrolles.com/Informatique/Livre/coder-proprement-9782744023279">Coder Proprement</a> de Robert C Martin consacre plusieurs pages intéressantes sur ce sujet.</p>
<h2>La concaténation de String</h2>
<p>Exemple 1 : Avec utilisation de l&#8217;opérateur +</p>
<pre class="brush:java">long start = System.currentTimeMillis();
String a = " Concaténation";
for (int i = 0; i &lt; 10000; i++) {
a += i;
}
System.out.println(a);
System.out
.println(" in " + (System.currentTimeMillis() - start) + "ms");</pre>
<p>Exemple 2 : Avec un StringBuilder</p>
<pre class="brush:java">start = System.currentTimeMillis();
StringBuilder stringBuffer = new StringBuilder (" Concaténation");
for (int i = 0; i &lt; 10000; i++) {
stringBuffer.append(i);
}
System.out.println(stringBuffer.toString());
System.out
.println(" in " + (System.currentTimeMillis() - start) + "ms");</pre>
<p>Durée des 10000 concaténations :</p>
<p>Exemple 1 : 360ms</p>
<p>Exemple 2 : 15ms</p>
<p>Il a néanmoins des cas où il est préférable d&#8217;utiliser la concaténation de string (+ ou String.concat) :</p>
<p>pour aérer une ligne ex :</p>
<pre class="brush:java">String myString = " line 1 "
                     +  "line 2";</pre>
<p>pour strictement moins de 4 concaténation :</p>
<pre class="brush:java"> logger.debug("x :"+x+"y :"+y);</pre>
<p>Le compilateur transforme automatiquement cettte ligne en utilisant un StringBuilder System.out.println((new StringBuilder()).append(&laquo;&nbsp;x:&nbsp;&raquo;).append(x).append(&nbsp;&raquo; y:&nbsp;&raquo;).append(y).toString());</p>
<p>Les tests avec les objets StringBuilder et StringBuffer renvoient des résultats quasiment similaires. StringBuilder étant un tout petit plus rapide, il est à utiliser le plus souvent possible. Le StringBuffer est quand à lui thread-safe donc à utiliser dans les environnements concurrents.</p>
<p><strong>Il n&#8217;est pas forcément judicieux de remplacer toutes les concaténations de string automatiquement par un StringBuilder / StringBuffer. </strong> Si elles sont dans une boucle, le gain peut être remarquable dans les autres cas, cela se discute.  Les StringBuilder / StringBuffer alourdissent considérablement la syntaxe et le gain est parfois très faible. Comme dans la plupart des cas, l&#8217;optimisation prématurée est à éviter !  Pour appronfondir le sujet, voir l&#8217;interview du Dr Heintz Kabutz : http://java.sun.com/developer/technicalArticles/Interviews/community/kabutz_qa.html</p>

]]></content:encoded>
			<wfw:commentRss>http://www.java-freelance.fr/java/revue-de-code-ii/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Revue de presse</title>
		<link>http://www.java-freelance.fr/web/revue-de-presse-2</link>
		<comments>http://www.java-freelance.fr/web/revue-de-presse-2#comments</comments>
		<pubDate>Sat, 27 Mar 2010 22:29:33 +0000</pubDate>
		<dc:creator>Jean-Baptiste</dc:creator>
				<category><![CDATA[Web]]></category>
		<category><![CDATA[algodeal]]></category>
		<category><![CDATA[castcodeurs]]></category>
		<category><![CDATA[Comet]]></category>
		<category><![CDATA[concurrence]]></category>
		<category><![CDATA[DDD]]></category>
		<category><![CDATA[Domain driven design]]></category>
		<category><![CDATA[Freelance]]></category>
		<category><![CDATA[indépendant]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[podcast]]></category>

		<guid isPermaLink="false">http://java-freelance.fr/?p=480</guid>
		<description><![CDATA[			
			
Voici une liste des liens qui nous ont intéressés récemment :
Le domain driven design &#171;&#160;Vite fait&#160;&#187; : 80 pages pour changer votre vie. Ou plutôt changer votre façon d&#8217;écrire vos modèles métiers.
Cours sur la concurrence : Une piqure de rappel ne fait pas (de) mal.
Développer avec Comet et Java : Vous rêver d&#8217;envoyer des informations [...]]]></description>
			<content:encoded><![CDATA[			
			
<p>Voici une liste des liens qui nous ont intéressés récemment :</p>
<p><a href="http://www.dddfrance.org/DDDViteFait" target="_self">Le domain driven design &laquo;&nbsp;Vite fait&nbsp;&raquo;</a> : 80 pages pour changer votre vie. Ou plutôt changer votre façon d&#8217;écrire vos modèles métiers.</p>
<p><a href="http://www-igm.univ-mlv.fr/~duris/TTT/threadsNewx4.pdf" target="_self">Cours sur la concurrence</a> : Une piqure de rappel ne fait pas (de) mal.</p>
<p><a href="http://www.ibm.com/developerworks/web/library/wa-cometjava/index.html" target="_self">Développer avec Comet et Java :</a> Vous rêver d&#8217;envoyer des informations au navigateur en mode &laquo;&nbsp;push&nbsp;&raquo; ? Voici la solution.</p>
<p><a href="https://beta.algodeal.com/home.html">Algodeal:</a> Pour tous ceux qui aime inventer des algos, voici une occasion de faire fortune en s&#8217;amusant (et en java)  !</p>
<p><a href="http://lescastcodeurs.com/">Les castcodeurs :</a> Episode spécial &laquo;&nbsp;Freelance&nbsp;&raquo; avec Mathilde ! A écouter absolument si vous souhaitez vous mettre indépendant !</p>

]]></content:encoded>
			<wfw:commentRss>http://www.java-freelance.fr/web/revue-de-presse-2/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Problème de concurrence avec SimpleDateFormat</title>
		<link>http://www.java-freelance.fr/java/concurrence-simpledateformat</link>
		<comments>http://www.java-freelance.fr/java/concurrence-simpledateformat#comments</comments>
		<pubDate>Tue, 16 Mar 2010 09:43:24 +0000</pubDate>
		<dc:creator>Mathilde</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[concurrence]]></category>
		<category><![CDATA[date]]></category>
		<category><![CDATA[simpleDateFormat]]></category>

		<guid isPermaLink="false">http://java-freelance.fr/?p=455</guid>
		<description><![CDATA[			
			
La classe DateUtil utilisée dans mon projet possède de nombreuse méthodes, certaines permettent de créer des identifiants basés sur les dates ensuite insérés en base de données. L&#8217;objet simpleDateFormat qui permet le parsage de ces dates est définit comme étant &#171;&#160;public static final&#160;&#187;.
Dans la plupart des cas, pas de problème, la date est bien parsée [...]]]></description>
			<content:encoded><![CDATA[			
			
<p>La classe DateUtil utilisée dans mon projet possède de nombreuse méthodes, certaines permettent de créer des identifiants basés sur les dates ensuite insérés en base de données. L&#8217;objet simpleDateFormat qui permet le parsage de ces dates est définit comme étant &laquo;&nbsp;public static final&nbsp;&raquo;.</p>
<p>Dans la plupart des cas, pas de problème, la date est bien parsée et l&#8217;identifiant est crée conformément à ce que l&#8217;on attends. Néanmoins, dans de rares cas, il est possible que cela se passe beaucoup moins bien. En effet, la classe SimpleDateFormat n&#8217;est pas synchronisée. Si 2 threads essaient en même temps d&#8217;utiliser cette instance pour un parsage ou un formatage, le résultat est aléatoire.</p>
<p>La classe DateUtil a été simplifiée à l&#8217;extrême.</p>
<p><span id="more-455"></span></p>
<pre class="brush:java;">import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

public class DateUtil {

	public static final SimpleDateFormat simpleDateFormat = new SimpleDateFormat(
			"ddMMyyyy");

	public static final Date parse(String date) throws ParseException{
		return simpleDateFormat.parse(date);
	}

	public static final String format(Date date) throws ParseException{
		return simpleDateFormat.format(date);
	}
}</pre>
<p>La classe de test ci dessous fait en sorte que deux threads concurrents effectuent des parsages/formatages via les deux méthodes définies dans la classe DateUtil sur les trois dates de référence définies dans le tableau de String. Elle effectue ensuite une comparaison entre la date de référence et celle qui a été parsée+formatée.</p>
<pre class="brush:java;">import java.text.ParseException;

public class TestSimpleDateFormat {

  public static void main(String[] args) {
    final String[] tabDateString = new String[] {
        "01012001", "08082008", "05052005" };

    Runnable runnable = new Runnable() {
      public void run() {
        try {
          for (int j = 0; j &lt; 1000; j++) {
            for (int i = 0; i &lt; 2; i++) {
              String date = DateUtil
                  .format(DateUtil
                      .parse(tabDateString[i]));
              if (!(tabDateString[i].equals(date))) {
                throw new ParseException(
                    tabDateString[i] + " =&gt;"
                        + date, 0);
              }
            }
          }
        } catch (ParseException e) {
          e.printStackTrace();
        }

      }
    };
    new Thread(runnable).start();
    Runnable runnable2 = new Runnable() {
      public void run() {
        try {
          for (int j = 0; j &lt; 1000; j++) {
            for (int i = 0; i &lt; 2; i++) {
              String date = DateUtil
                  .format(DateUtil
                      .parse(tabDateString[i]));
              if (!(tabDateString[i].equals(date))) {
                throw new ParseException(
                    tabDateString[i] + " =&gt;"
                        + date, 0);
              }
            }
          }
        } catch (ParseException e) {
          e.printStackTrace();
        }
      }
    };
    new Thread(runnable2).start();
  }

}
</pre>
<p>Les résultats sont plus que divers, voilà ci dessous la liste des exceptions les plus fréquentes.</p>
<pre class="brush:java;">java.text.ParseException: 08082008 =&gt;08012008
	at TestSimpleDateFormat$1.run(TestSimpleDateFormat.java:19)
	at java.lang.Thread.run(Thread.java:619)
java.text.ParseException: 01012001 =&gt;08012001
	at TestSimpleDateFormat$2.run(TestSimpleDateFormat.java:42)
	at java.lang.Thread.run(Thread.java:619)
Exception in thread "Thread-1" java.lang.NumberFormatException: For input string: ".808E.8082E2"
	at sun.misc.FloatingDecimal.readJavaFormatString(FloatingDecimal.java:1224)
	at java.lang.Double.parseDouble(Double.java:510)
	at java.text.DigitList.getDouble(DigitList.java:151)
	at java.text.DecimalFormat.parse(DecimalFormat.java:1303)
	at java.text.SimpleDateFormat.subParse(SimpleDateFormat.java:1934)
	at java.text.SimpleDateFormat.parse(SimpleDateFormat.java:1312)
	at java.text.DateFormat.parse(DateFormat.java:335)
	at TestSimpleDateFormat$2.run(TestSimpleDateFormat.java:40)
	at java.lang.Thread.run(Thread.java:619)
Exception in thread "Thread-1" java.lang.NumberFormatException: multiple points
	at sun.misc.FloatingDecimal.readJavaFormatString(FloatingDecimal.java:1084)
	at java.lang.Double.parseDouble(Double.java:510)
	at java.text.DigitList.getDouble(DigitList.java:151)
	at java.text.DecimalFormat.parse(DecimalFormat.java:1303)
	at java.text.SimpleDateFormat.subParse(SimpleDateFormat.java:1934)
	at java.text.SimpleDateFormat.parse(SimpleDateFormat.java:1312)
	at java.text.DateFormat.parse(DateFormat.java:335)
	at TestSimpleDateFormat$2.run(TestSimpleDateFormat.java:40)
	at java.lang.Thread.run(Thread.java:619)
Exception in thread "Thread-1" java.lang.NumberFormatException: For input string: ""
	at java.lang.NumberFormatException.forInputString(NumberFormatException.java:48)
	at java.lang.Long.parseLong(Long.java:431)
	at java.lang.Long.parseLong(Long.java:468)
	at java.text.DigitList.getLong(DigitList.java:177)
	at java.text.DecimalFormat.parse(DecimalFormat.java:1298)
	at java.text.SimpleDateFormat.subParse(SimpleDateFormat.java:1934)
	at java.text.SimpleDateFormat.parse(SimpleDateFormat.java:1312)
	at java.text.DateFormat.parse(DateFormat.java:335)
	at TestSimpleDateFormat$2.run(TestSimpleDateFormat.java:40)
	at java.lang.Thread.run(Thread.java:619)</pre>
<p>Bien sur, ces erreurs n&#8217;arrivent en réalité qu&#8217;exceptionnellement. Parfois, des exceptions sont remontées, parfois cela a l&#8217;air de bien se passer mais l&#8217;objet crée est en fait une combinaison d&#8217;autres dates et ne correspond donc pas à la date attendue. Il y a plusieurs manière de rendre la classe DateUtil thread safe.</p>
<p>Le plus simple, ne pas rendre l&#8217;objet simpleDateFormat comme étant un attribut de la classe mais de le recréer à chaque appel.<br />
Ex :</p>
<pre class="brush:java;">import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

public class DateUtil {

	public static final Date parse(String date) throws ParseException{
		SimpleDateFormat simpleDateFormat = new SimpleDateFormat(
		"ddMMyyyy");
		return simpleDateFormat.parse(date);
	}

	public static final String format(Date date) throws ParseException{
		SimpleDateFormat simpleDateFormat = new SimpleDateFormat(
		"ddMMyyyy");
                return simpleDateFormat.format(date);
	}
}</pre>
<p>Dans le cas de méthodes communes, il est possible que cela deviennent couteux.</p>
<p>Une deuxième méthode est la définition des deux méthodes parse &amp; format comme étant synchronized :</p>
<pre class="brush:java;">import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

public class DateUtil {

	public static final SimpleDateFormat simpleDateFormat = new SimpleDateFormat(
			"ddMMyyyy");

	public synchronized static final Date parse(String date) throws ParseException{
		return simpleDateFormat.parse(date);
	}

	public synchronized  static final String format(Date date) throws ParseException{
		return simpleDateFormat.format(date);
	}
}</pre>
<p>Cette méthode marche, néanmoins, il est possible qu&#8217;elle crée un goulet d&#8217;étranglement du au fonctionnement de synchronized, les méthodes format &amp; parse pouvant être extrêmement communes dans une application. Néanmoins, elle offre l&#8217;avantage d&#8217;être simple et claire.</p>
<p>Une approche un peu plus fine est l&#8217;utilisation d&#8217;un objet <a href="http://java.sun.com/j2se/1.4.2/docs/api/java/lang/ThreadLocal.html" target="_blank">ThreadLocal</a>.  Cet objet permet d&#8217;utiliser des variables comme étant locale à un thread. Tous les threads ont une copie de la variable.</p>
<pre class="brush:java;">import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

public class DateUtil {

	private static ThreadLocal format = new ThreadLocal() {
        protected synchronized SimpleDateFormat initialValue() {
            return new SimpleDateFormat(
			"ddMMyyyy");
        }
    };

    private static SimpleDateFormat getSimpleDateFormat(){
    	return format.get();
    }

	public  static final Date parse(String date) throws ParseException{
		return getSimpleDateFormat().parse(date);
	}

	public  static final String format(Date date) throws ParseException{
		return getSimpleDateFormat().format(date);
		}
}</pre>
<p>Comme je suis dans le cas où ma classe DateUtil n&#8217;a besoin que d&#8217;une méthode format, j&#8217;ai choisi une 4ème méthode, l&#8217;utilisation non plus de l&#8217;objet java.text.SimpleDateFormat mais <a href="http://commons.apache.org/lang/api/org/apache/commons/lang/time/FastDateFormat.html" target="_blank">org.apache.commons.lang.time.FastDateFormat</a> . Le formatage est supportée, avec le même pattern que pour la classe SimpleDateFormat à l&#8217;exception du z (se référer à la doc).</p>

]]></content:encoded>
			<wfw:commentRss>http://www.java-freelance.fr/java/concurrence-simpledateformat/feed</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>Un vent de reprise v2.0</title>
		<link>http://www.java-freelance.fr/freelance/un-vent-de-reprise-v2-0</link>
		<comments>http://www.java-freelance.fr/freelance/un-vent-de-reprise-v2-0#comments</comments>
		<pubDate>Fri, 12 Mar 2010 04:02:38 +0000</pubDate>
		<dc:creator>Jean-Baptiste</dc:creator>
				<category><![CDATA[Freelance]]></category>
		<category><![CDATA[baromètre]]></category>
		<category><![CDATA[crise]]></category>
		<category><![CDATA[missions]]></category>
		<category><![CDATA[Reprise]]></category>

		<guid isPermaLink="false">http://java-freelance.fr/?p=438</guid>
		<description><![CDATA[			
			
Cet article est en partie une reprise d&#8217;un article que j&#8217;ai publié fin 2009 lorsque la fin de la crise pointait le bout de son nez dans notre secteur.
Depuis le début de la crise économique mondiale, certains clients finaux ont diminué le nombre de prestataires et ont imposé des baisses de tarif importantes. Résultat : [...]]]></description>
			<content:encoded><![CDATA[			
			
<p>Cet article est en partie une reprise d&#8217;un article que j&#8217;ai publié fin 2009 lorsque la fin de la crise pointait le bout de son nez dans notre secteur.</p>
<p>Depuis le début de la crise économique mondiale, certains clients finaux ont diminué le nombre de prestataires et ont imposé des baisses de tarif importantes. Résultat : plus de prestataires et moins de mission, loi de l&#8217;offre et la demande oblige, les prix ont chuté d&#8217;environ 10%.</p>
<p>Pour ceux qui ont la chance d&#8217;être resté en mission ou qui n&#8217;ont pas vu leur tarif baisser, ce n&#8217;était pas le moment de changer. Et pour ceux qui ont subit, le risque est aujourd&#8217;hui de continuer à subir alors que le marché a repris. Alors comment avoir une vue globale sur le marché de la prestation Java en France ?</p>
<p>Personnellement j&#8217;utilise le baromètre du site <a href="http://www.hitechpros.com/info/market.asp">hitechpros.com</a>. Apprendre à décrypter ce baromètre permet de se faire une idée des tendances du marché.</p>
<p><a href="http://java-freelance.fr/wp-content/uploads/2010/03/hitech2010.png"><img class="aligncenter size-full wp-image-439" title="hitech2010" src="http://java-freelance.fr/wp-content/uploads/2010/03/hitech2010.png" alt="" width="517" height="295" /><span id="more-438"></span></a></p>
<h3>Comment décrypter ces données ?</h3>
<p>La courbe bleue correspond aux offres de missions (demandes des clients), ramenée à 100% elle sert de base. La courbe rouge correspond aux prestataires disponibles (offres de SSII). Donc plus la courbe rouge baisse, mieux c&#8217;est. Pour le mois de Mars, on y est, le nombre de prestataires disponibles est inférieur au nombre de missions ! Champagne !</p>
<h3>Voici mon analyse en Mars 2010 :</h3>
<p>- La crise est belle est bien terminée, cela fait plusieurs mois qu&#8217;on le pressentait avec le nombre d&#8217;offres de missions qui explose sur les différents sites d&#8217;emplois.<br />
- Cette crise inversée ne va pas durer, les SSII vont se remettre à recruter en masse et le nombre de prestataire va remonter au dessus des offres de missions.<br />
- Toutefois, le marché devrait rester en notre faveur jusqu&#8217;à la prochaine crise et les tarifs devraient augmenter fortement.</p>
<p>Mon conseil si vous n&#8217;êtes toujours pas freelance :  foncez ! Le temps de démissionner les tarifs seront sur un nouveau &laquo;&nbsp;plus haut&nbsp;&raquo;. Si vous l&#8217;êtes déjà, c&#8217;est le moment de changer de mission si vous attendiez une accalmie. Sinon, attendez un peu que cette pénurie atteigne le client avant de demander une revalorisation importante de votre tarif.</p>
<h3>Ce qu&#8217;était mon analyse fin 2009 :</h3>
<p>- Actuellement le nombre d&#8217;intercontrat baisse fortement et les clients commencent à avoir du mal à trouver des ressources. Les indépendants trouvent facilement des missions mais mal payées.</p>
<p>- Si la tendance se confirme, les SSII vont recommencer à recruter afin de répondre aux exigences des clients, les débutants et chômeurs vont réussir à trouver du travail mais moins bien payé qu&#8217;avant 2007, car les tarifs n&#8217;auront pas encore remontés.</p>
<p>- Lorsque le vivier d&#8217;inter-contrats et de jeunes diplômés sera absorbé, les prix commenceront à remonter et les salaires feront de même. Il sera temps pour les indépendants de profiter de cette dynamique avant la prochaine crise.</p>
<p>Pour conclure, n&#8217;oubliez pas que le meilleur moyen de rester employable, crise ou pas crise est de se former ! En mission comme à la maison ou en dehors. Ainsi que de bien choisir ses missions ! Pas forcément chercher une &laquo;&nbsp;niche rentable&nbsp;&raquo; mais faire quelquechose qui nous passionne est le meilleur moyen d&#8217;y exceller.</p>
<p><strong>Et vous comment vivez vous ou avez vous vécu cette crise ? Quelle est votre stratégie pour les mois à venir ?</strong></p>

]]></content:encoded>
			<wfw:commentRss>http://www.java-freelance.fr/freelance/un-vent-de-reprise-v2-0/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>EasyMock &#8211; Techniques avancées</title>
		<link>http://www.java-freelance.fr/java/easymock-techniques-avancees</link>
		<comments>http://www.java-freelance.fr/java/easymock-techniques-avancees#comments</comments>
		<pubDate>Thu, 11 Mar 2010 09:11:37 +0000</pubDate>
		<dc:creator>Mathilde</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[argument]]></category>
		<category><![CDATA[capture]]></category>
		<category><![CDATA[easymock]]></category>
		<category><![CDATA[test]]></category>

		<guid isPermaLink="false">http://java-freelance.fr/?p=409</guid>
		<description><![CDATA[			
			
Easymock est un framework de test offrant une API permettant de tester plus facilement le code. Cet article ne constitue pas une présentation d&#8217;easymock et s&#8217;adresse aux développeurs souhaitant progresser sur l&#8217;utilisation de cette API.
Lorsque l&#8217;on met en place les mocks, il est fréquent que l&#8217;on ait besoin de tester qu&#8217;un objet créé à l&#8217;intérieur [...]]]></description>
			<content:encoded><![CDATA[			
			
<p>Easymock est un framework de test offrant une API permettant de tester plus facilement le code. Cet article ne constitue pas une présentation d&#8217;easymock et s&#8217;adresse aux développeurs souhaitant progresser sur l&#8217;utilisation de cette API.</p>
<p>Lorsque l&#8217;on met en place les mocks, il est fréquent que l&#8217;on ait besoin de tester qu&#8217;un objet créé à l&#8217;intérieur de la méthode testée correspond bien à ce que l&#8217;on attend, cet objet étant passé en tant que paramètre à une méthode d&#8217;un objet mocké.<span id="more-409"></span></p>
<p>Prenons pour exemple, la classe Service et sa méthode processRequest. La méthode processRequest prend en entrée deux paramètres et se sert de ces paramètres pour créer un objet Bond, qui sera passé ensuite à la méthode persist du service BondDao.</p>
<pre class="brush:java">package fr.java.freelance.easymock;

import java.math.BigDecimal;

public class Service {
	private BondDao bondDao;

	public String processRequest(String name,BigDecimal quantity) {
		Bond bond = new Bond(name,quantity);
		return bondDao.persist(bond);
	}

	public void setBondDao(BondDao bondDao) {
		this.bondDao = bondDao;
	}
}

package fr.java.freelance.easymock;

public interface BondDao {
	String persist(Bond bond);
}

package fr.java.freelance.easymock;

import java.math.BigDecimal;

public class Bond {
	private String name;
	private BigDecimal quantity;

	public Bond(String name, BigDecimal quantity) {
		super();
		this.name = name;
		this.quantity = quantity;
	}
	public String getName() {
		return name;
	}
	public BigDecimal getQuantity() {
		return quantity;
	}
}</pre>
<p>Il est a priori impossible pour un test unitaire d&#8217;accèder à l&#8217;objet &laquo;&nbsp;bond&nbsp;&raquo; pour le vérifier.</p>
<p>Ce que l&#8217;on cherche à garantir, c&#8217;est que la méthode processRequest construit un objet de type Bond ayant comme attributs name et quantity les 2 valeurs passées en paramètres, qu&#8217;elle le transmette à la méthode persist de ServiceDao et retourne le paramètre de retour de cette méthode persist.</p>
<h3>Utilisation d&#8217;EasyMock.anyObject()</h3>
<p>La première méthode pour tester ceci est d&#8217;utiliser la méthode anyObject de l&#8217;objet EasyMock.</p>
<pre class="brush:java">Service service = new Service();
BondDao bondDaoMock = EasyMock.createMock(BondDao.class);
service.setBondDao(bondDaoMock);

final String persist_return = "123AX";
final String name = "Name 5%";
final BigDecimal quantity = BigDecimal.TEN;

EasyMock.expect(bondDaoMock.persist((Bond) EasyMock.anyObject()))
.andReturn(persist_return);

EasyMock.replay(bondDaoMock);
String idInternal = service.processRequest(name, quantity);
Assert.assertEquals(persist_return,idInternal);
EasyMock.verify(bondDaoMock);</pre>
<p>Le test fonctionne, néanmoins rien ne garantit que l&#8217;objet que l&#8217;on transmet à la méthode persist de BondDao est conforme à ce que l&#8217;on attend.</p>
<p>Pour pouvoir analyser l&#8217;objet Bond transmis, il existe plusieurs possibilités, dont une utilisant la redéfinition de la méthode equals de l&#8217;objet Bond et deux fournies par la librairie EasyMock, l&#8217;utilisation d&#8217;un IArgumentMatcher ou de EasyMock.capture.</p>
<h3>Rédéfinition de la méthode equals()</h3>
<p>Supposons que l&#8217;objet bond redéfinisse la méthode equals de manière à tester l&#8217;égalité des paramètres name et quantity.</p>
<pre class="brush:java">	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Bond other = (Bond) obj;
		if (name == null) {
			if (other.name != null)
				return false;
		} else if (!name.equals(other.name))
			return false;
		if (quantity == null) {
			if (other.quantity != null)
				return false;
		} else if (quantity.compareTo(other.quantity)!=0)
			return false;
		return true;
	}</pre>
<p>Il suffit alors d&#8217;écrire le test suivant pour garantir que l&#8217;objet passé à la méthode persist est bien égal au bond attendu :</p>
<pre class="brush:java">        @Test
	public void testProcessRequestWithEquals() {
		Service service = new Service();
		BondDao bondDaoMock = EasyMock.createMock(BondDao.class);
		service.setBondDao(bondDaoMock);

		final String persist_return = "123AX";
		final String name = "Name 5%";
		final BigDecimal quantity = BigDecimal.TEN;
		final Bond bondExpected = new Bond(name,quantity);

		EasyMock.expect(bondDaoMock.persist(bondExpected))
				.andReturn(persist_return);
		EasyMock.replay(bondDaoMock);
  	        String idInternal = service.processRequest(name, quantity);
		Assert.assertEquals(persist_return,idInternal);
		EasyMock.verify(bondDaoMock);
	}</pre>
<p>Cette démarche est la plus naturelle, néanmoins elle ne s&#8217;applique pas dans le cas où la méthode equals n&#8217;est n&#8217;ai pas redéfinie (dans ce cas, c&#8217;est la méthode equals de Object qui est prise en compte et donc, les deux objets ne seraient pas égaux (pas la même instance)). Elle ne s&#8217;applique pas non plus dans le cas où la méthode equals ne correspondrait pas à ce que l&#8217;on a définit comme étant utile pour tester l&#8217;égalité. Par exemple une méthode equals qui ne testerait que l&#8217;égalité de l&#8217;attribut name dans l&#8217;objet Bond alors que nous souhaitons garantir les valeurs des deux paramètres. On ne peut évidement pas modifier la méthode equals d&#8217;un objet pour le tester, cela changerai son comportement !!<br />
Il faut donc se tourner vers d&#8217;autres solutions.</p>
<h3>Utilisation d&#8217;un IArgumentMatcher</h3>
<p>EasyMock permet d&#8217;utiliser un certain nombre de matcher déjà définit ( eq, isNull, matches ..). Néanmoins dans le cas présent, il nous faut définir notre propre matcher pour pouvoir tester l&#8217;égalité des paramètres name et quantity.<br />
La redéfinition d&#8217;un matcher s&#8217;effectue en deux temps.<br />
D&#8217;abord, il faut créer une classe implémentant IArgumentMatcher.</p>
<pre class="brush:java">package fr.java.freelance.easymock;

import org.easymock.EasyMock;
import org.easymock.IArgumentMatcher;

public class BondEquals implements IArgumentMatcher {
	private final Bond expected;

	public BondEquals(Bond expected) {
		this.expected = expected;
	}

	public boolean matches(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (expected.getClass() != obj.getClass())
			return false;
		Bond other = (Bond) obj;
		if (this.expected.getName() == null) {
			if (other.getName() != null)
				return false;
		} else if (!this.expected.getName().equals(other.getName()))
			return false;
		if (this.expected.getQuantity() == null) {
			if (other.getQuantity() != null)
				return false;
		} else if (this.expected.getQuantity().compareTo(other.getQuantity()) != 0)
			return false;
		return true;
	}

	public void appendTo(StringBuffer buffer) {
		buffer.append("eqException ").append(expected.toString());
	}

	public static Bond eqBond(Bond in) {
	    EasyMock.reportMatcher(new BondEquals(in));
	    return null;
	}
}</pre>
<p>Pour pouvoir utiliser le BondEquals ainsi crée, la méthode persist de l&#8217;interface BondDao n&#8217;acceptant que les objets de type Bond, on utilise l&#8217;astuce suivante :</p>
<pre class="brush:java">public static Bond eqBond(Bond in) {
	    EasyMock.reportMatcher(new BondEquals(in));
	    return null;
	}</pre>
<p>On peut alors utiliser le test suivant, pour garantir d&#8217;une part le bon retour de la méthode processRequest ainsi que le passage du bond ayant les caractéristiques souhaitées à la méthode persist du BondDao.</p>
<pre class="brush:java">        @Test
	public void testProcessRequestWithArgumentMatcher() {
		Service service = new Service();
		BondDao bondDaoMock = EasyMock.createMock(BondDao.class);
		service.setBondDao(bondDaoMock);

		final String persist_return = "123AX";
		final String name = "Name 5%";
		final BigDecimal quantity = BigDecimal.TEN;

		final Bond bondExpected = new Bond(name,quantity);
		EasyMock.expect(bondDaoMock.persist(BondEquals.eqBond(bondExpected)))
				.andReturn(persist_return);
		EasyMock.replay(bondDaoMock);
		String idInternal = service.processRequest(name, quantity);
		Assert.assertEquals(persist_return,idInternal);
		EasyMock.verify(bondDaoMock);
	}</pre>
<h3>Utilisation de org.easymock.Capture</h3>
<p>Une autre méthode consiste à capturer l&#8217;objet bond passé à la méthode persist du DAO et de faire des tests dessus dans un deuxième temps.<br />
Une capture s&#8217;effectue en 3 temps.<br />
1. Déclaration de la capture : Capture capture = new Capture();<br />
2. Capture du paramètre lors de l&#8217;exécution via : EasyMock.expect(bondDaoMock.persist(EasyMock.and(EasyMock.isA(Bond.class), EasyMock.capture(capture))))<br />
3. Récupération de l&#8217;objet capturé : Bond captured = capture.getValue();</p>
<pre class="brush:java">	@Test
	public void testProcessRequestWithCapture() {
		Service service = new Service();
		BondDao bondDaoMock = EasyMock.createMock(BondDao.class);
		service.setBondDao(bondDaoMock);

		final String persist_return = "123AX";
		final String name = "Name 5%";
		final BigDecimal quantity = BigDecimal.TEN;

               Capture capture = new Capture();

		EasyMock.expect(bondDaoMock.persist(EasyMock.and(EasyMock
                          .isA(Bond.class), EasyMock.capture(capture))))
                .andReturn(persist_return);

		EasyMock.replay(bondDaoMock);
		String idInternal = service.processRequest(name, quantity);
		Assert.assertEquals(persist_return,idInternal);

		Bond captured = capture.getValue();
		Assert.assertEquals(name,captured.getName());
		Assert.assertTrue(quantity.compareTo(captured.getQuantity())==0);
		EasyMock.verify(bondDaoMock);
	}</pre>
<p>Il existe également d&#8217;autres méthodes utilisant des outils externes pour atteindre un but similaire mais je n&#8217;ai pas encore trouvé de limitation à la création d&#8217;un nouveau matcher ou la capture de l&#8217;élément à tester. Si il y a besoin plusieurs fois de tester l&#8217;objet de manière identique, j&#8217;ai tendance à créer un nouveau matcher et à utiliser la capture dans le cadre d&#8217;objets plus petits ou de besoin spécifique à un test.</p>

]]></content:encoded>
			<wfw:commentRss>http://www.java-freelance.fr/java/easymock-techniques-avancees/feed</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Création du groupe DuchessFr</title>
		<link>http://www.java-freelance.fr/java/creation-du-groupe-duchessfr</link>
		<comments>http://www.java-freelance.fr/java/creation-du-groupe-duchessfr#comments</comments>
		<pubDate>Wed, 03 Mar 2010 12:48:36 +0000</pubDate>
		<dc:creator>Mathilde</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Femme]]></category>
		<category><![CDATA[JDuchess]]></category>
		<category><![CDATA[User Group]]></category>

		<guid isPermaLink="false">http://www.java-freelance.fr/?p=401</guid>
		<description><![CDATA[			
			
Un nouveau groupe autour de Java se lance en France ! DuchessFr est un groupe destiné à mettre en relation et à promouvoir les femmes dans le monde du développement Java. Originaire des Pays Bas, JDuchess s&#8217;étend petit à petit avec des antennes en France et au Brésil.

Les actions menées en France seront de plusieurs [...]]]></description>
			<content:encoded><![CDATA[			
			
<p><img class="alignleft size-full wp-image-406" title="duchessfr" src="http://java-freelance.fr/wp-content/uploads/2010/03/duchessfr.jpg" alt="duchessfr"  />Un nouveau groupe autour de Java se lance en France ! DuchessFr est un groupe destiné à mettre en relation et à promouvoir les femmes dans le monde du développement Java. Originaire des Pays Bas, JDuchess s&#8217;étend petit à petit avec des antennes en France et au Brésil.</p>
<p><br/><br />
Les actions menées en France seront de plusieurs types :<br />
- La création d&#8217;un réseau virtuel, via twitter, linkedin, une mailing list &#8230;<br />
- Inciter les femmes à participer à des évènements locaux, comme les soirées JUG ou les autres conférences.<br />
- Se rencontrer pour échanger, avant ou après les soirées JUGs, autour d&#8217;un apéro ou d&#8217;un repas.<br />
- Lister les différents évènements en France pour ne pas les rater et éventuellement trouver quelqu&#8217;un avec qui y aller.</p>
<p>Pour se tenir informer des évènements de ce groupe, vous pouvez nous rejoindre sur twitter @duchessfr , sur <a href="http://www.linkedin.com/groups?gid=2750811" target="_blank">LinkedIn </a>ou via <a href="http://groups.google.fr/group/duchessfr" target="_blank">notre mailing list</a>.</p>
<p>Le premier évènement aura lieu le 9 mars à 18h30 , juste avant le paris JUG au Vavin Café (18 rue Vavin 75006 Paris). Lorsque vous serez inscrites au JUG, contactez ellene(dot)dijoux(at)jduchess(dot)org qui vous accueillera Mardi prochain.</p>

]]></content:encoded>
			<wfw:commentRss>http://www.java-freelance.fr/java/creation-du-groupe-duchessfr/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Les 2 ans du Paris Jug</title>
		<link>http://www.java-freelance.fr/java/les-2-ans-du-paris-jug</link>
		<comments>http://www.java-freelance.fr/java/les-2-ans-du-paris-jug#comments</comments>
		<pubDate>Wed, 10 Feb 2010 13:15:52 +0000</pubDate>
		<dc:creator>Mathilde</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Formation]]></category>
		<category><![CDATA[open-source]]></category>
		<category><![CDATA[paris jug]]></category>

		<guid isPermaLink="false">http://www.java-freelance.fr/?p=383</guid>
		<description><![CDATA[			
			
Hier soir avait lieu les 2 ans du Paris JUG.  Le Paris JUG est le premier Java User Group crée en France, beaucoup d&#8217;autres régions ont désormais le leur. L&#8217;association a été crée en février 2008 et réunit une fois par mois pas loin de 200 personnes dans les locaux de l&#8217;ISEP pour des sujets [...]]]></description>
			<content:encoded><![CDATA[			
			
<p><img class="alignleft size-medium wp-image-394" title="juggyanniversaire" src="http://www.java-freelance.fr/wp-content/uploads/2010/02/juggyanniversaire-300x264.jpg" alt="juggyanniversaire" width="269" height="236" />Hier soir avait lieu les 2 ans du Paris JUG.  Le Paris JUG est le premier Java User Group crée en France, beaucoup d&#8217;autres régions ont désormais le leur. L&#8217;association a été crée en février 2008 et réunit une fois par mois pas loin de 200 personnes dans les locaux de l&#8217;ISEP pour des sujets plutôt techniques (Performance, Qualité de code, EE6 &#8230;).  Niveau formation continue, retour d&#8217;expérience et construction de réseaux, c&#8217;est un des lieux où il faut être, chaque 2ème mardi du mois.</p>
<p>Le Paris JUG c&#8217;est aussi une &#8216;troisième mi-temps&#8217; dans un bar-resto après la soirée. Me retrouver après les confs pour discuter avec des passionnés sur des sujets variés (mise en place de pair programming, Groovy, se lancer en freelance &#8230;) est vraiment une composante importante de mon intérêt pour le Paris JUG !</p>
<p>Pour la soirée d&#8217;hier, les choses avaient été faites en grand : amphi de 500 places, bien rempli, goodies, présence de stands, buffet, énormément de gens venus de partout dont pas mal rencontrés à Devoxx. Au niveau des sujets, la keynote d&#8217;ouverture de Sacha Labourey abordait le thème &#8216;la révolution open-source a t elle eu lieu ?&#8217;. Se sont suivis ensuite quelques questions/réponses à Sacha et Marc Fleury, invité surprise de la soirée et fondateur de Jboss.  La notion de &#8216;passion&#8217; a pour la première fois été abordée et il faut reconnaître, et tous les intervenants l&#8217;ont fait lors de la soirée, que s&#8217;investir dans l&#8217;open-source est chronophage et avant tout, une affaire de passion.</p>
<p>Quelques business models de projets Open Source (Acceleo, XWiki, eXo Platform) ont  été présentés sur la forme de quickies par les différents acteurs de ces projets, permettant de donner des exemples concrets à la keynote plus générale de Sacha. Des  outils open-source (jCaptcha, jax-doclets, Play!) ont eu également le droit à leurs quickies, plus techniques.</p>
<p>Jean-Michel Doudoux, architecte Sfeir Benelux<span> , </span> a également parlé de son travail de rédaction et du choix de la license autour de Développons en Java, quelques 1888 pages en français, le tout sur 10 ans, mis à jour désormais 3 à 4 fois par ans et qui correspond à une véritable bible, en français sur le langage Java : <a href="http://www.jmdoudoux.fr/accueil_java.htm#dej" target="_blank">http://www.jmdoudoux.fr/accueil_java.htm#dej</a> . Les prochaines évolutions seront sur JEE, Android ! Un travail titanesque pour lequel il a choisit la license GNU FDL, bien conscient des problèmes pour faire valoir ses droits dès que l&#8217;on publie sur le net.</p>
<p>La présentation sur le framework Play!  était vraiment bien mené et a éveillé pas mal les curiosités ! Ce framework web, fait par des développeurs web constitue une alternative pour développer sur une architecture REST. Ce framework permet entre autre un rechargement à chaud (la démo est faite via un simple éditeur de texte), le code modifié impactant immédiatement l&#8217;appli web, un système de gestion des exceptions à l&#8217;écran, un système de templating, avec la possibilité de créer ses propres tags ou d&#8217;utiliser le système d&#8217;expression langage de groovy et beaucoup d&#8217;autres choses encore.</p>
<p>Pour avoir plus d&#8217;infos : <a href="http://www.playframework.org/" target="_blank">http://www.playframework.org/</a></p>
<p>Pour avoir le détail des conférences, Olivier Croisier a très bien retranscrit tout le détail dans son blog <a href="http://thecodersbreakfast.net/index.php?post/2010/02/05/Suivez-le-Paris-JUG-anniversaire-en-live" target="_blank">http://thecodersbreakfast.net/index.php?post/2010/02/05/Suivez-le-Paris-JUG-anniversaire-en-live</a> !</p>
<p>La troisième mi-temps s&#8217;est déroulé au Dome dans le 17ème avec petits fours.  J&#8217;ai eu l&#8217;occasion de discuter avec Nicolas Leroux (contributeur) et Guillaume Bort (lead developper) autour de Play! , principalement sur l&#8217;utilisation en industrie et des questions plus techniques.  On en a également profité pour parler d&#8217;un projet de réseautage de la communauté féminine de Java, j&#8217;en parlerai plus en détail quand cela sera avancé mais c&#8217;était agréable de voir du monde réunis autour de la table !</p>
<p><strong><br />
</strong></p>
<p><strong><br />
</strong></p>

]]></content:encoded>
			<wfw:commentRss>http://www.java-freelance.fr/java/les-2-ans-du-paris-jug/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Revues de code I</title>
		<link>http://www.java-freelance.fr/java/revues-de-code-i</link>
		<comments>http://www.java-freelance.fr/java/revues-de-code-i#comments</comments>
		<pubDate>Thu, 04 Feb 2010 17:49:32 +0000</pubDate>
		<dc:creator>Mathilde</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[code]]></category>
		<category><![CDATA[optimisation]]></category>

		<guid isPermaLink="false">http://www.java-freelance.fr/?p=341</guid>
		<description><![CDATA[			
			
Au cours de mes revues de code, je tombe sur des problèmes plus ou moins réguliers.  Outre les problèmes de designs, certains aspects techniques sont récurrents.
Comparaison avec == sur des java.lang.Integer
Le problème, c&#8217;est que sur des integers entre -128 et 127, cela peut marcher.  Dans la suite de l&#8217;exemple, integer1 et integer2 seront de type [...]]]></description>
			<content:encoded><![CDATA[			
			
<p>Au cours de mes revues de code, je tombe sur des problèmes plus ou moins réguliers.  Outre les problèmes de designs, certains aspects techniques sont récurrents.</p>
<h2>Comparaison avec == sur des java.lang.Integer</h2>
<p>Le problème, c&#8217;est que sur des integers entre -128 et 127, cela peut marcher.  Dans la suite de l&#8217;exemple, integer1 et integer2 seront de type java.lang.Integer, int1 sera de type primitif int.</p>
<pre class="brush:java">        Integer integer1 = 127;
        Integer integer2 = 127;
        System.out.println(integer1 == integer2); // true

        integer1 = 128;
        integer2 = 128;
        System.out.println(integer1 == integer2); // false</pre>
<p>Par contre, on a bien pour toutes les valeurs, y compris celles entre -128 et 127 :</p>
<pre class="brush:java">integer1 = new Integer(127);
integer2 = new Integer(127);
System.out.println(integer1 == integer2); // false - normal on a instancié 2 objects différents

integer1 = new Integer(129);
int1 = 129;
System.out.println(integer1 == integer2); // true</pre>
<p>Si on regarde la doc de Sun, pour tous les objets entre -128 et 127, l&#8217;autoboxing garantit que l&#8217;objet renvoyé Integer sera identique pour un même entier primitif. Ce qui ne sera pas le cas au delà de l&#8217;intervalle. De plus, rien ne garantit qu&#8217;une implémentation étende l&#8217;intervalle de cache, raison pour laquelle il est risqué de se baser dessus.<br />
Byte,  Short,  Long ont également le même type de cache. Character a également un cache mais de 0 à 127 (un nombre négatif n&#8217;aurait pas eu de sens).</p>
<p><em>d. Autoboxing is guaranteed to return the same object for integral<br />
values in the range [-128, 127], but an implementation may, at its<br />
discretion, cache values outside of that range. It would be bad style</em><br />

http://java.sun.com/developer/JDCTechTips/2005/tt0405.html#1</p>

<p>Ainsi, utiliser == en se fiant à l&#8217;autoboxing et au cache est une mauvaise pratique, même pour comparer des constantes de faible valeur.</p>
<h2>Utiliser plutôt valueOf()  plutôt que new</h2>
<p>Il est préferable d&#8217;utiliser un valueOf plutôt qu&#8217;une nouvelle instanciation à l&#8217;aide du constructeur. Valable pour la certains objets immutables.</p>
<p>Exemple avec des types java.lang.Integer, si on regarde la javadoc pour la méthode Integer.valueOf(int i) :</p>
<pre>public static <a title="class in java.lang" href="../../java/lang/Integer.html">Integer</a> <strong>valueOf</strong>(int i)</pre>
<dl>
<dd>Returns a <tt>Integer</tt> instance representing the specified <tt>int</tt> value. If a new <tt>Integer</tt> instance is not required, this method should  generally be used in preference to the constructor <a href="../../java/lang/Integer.html#Integer(int)"><code>Integer(int)</code></a>,  as this method is likely to yield significantly better space and time  performance by caching frequently requested values. </dd>
<dd>
<dl></dl>
</dd>
</dl>
<p>Idem pour les Byte, Long, Character, BigInteger &#8230; Par contre, préférer quand c&#8217;est possible de construire les valeurs accessibles directement via une méthode statique (BigInteger.ONE plutôt que BigInteger.valueOf(1), Boolean.FALSE plutôt que Boolean.valueOf(false) &#8230;)</p>
<h2>Éviter d&#8217;utiliser new String</h2>
<pre class="brush:java">String test1 = "abc";
String test2 = "abc";
String test3 = new String("abc");
String test4 = new String("abc");

System.out.println(test1 == test2); // true
System.out.println(test1 == test3); //false
System.out.println(test3 == test4); //false</pre>
<p>Utiliser new String implique de créer un nouvel object en mémoire. Les String étant immutables, avoir 2 objets différents ayant la même valeur ne fait que consommer de la mémoire. Attention à bien noter le cas 2, &laquo;&nbsp;abc&nbsp;&raquo; est différent de new String(&laquo;&nbsp;abc&nbsp;&raquo;).  Cet exemple permet également de montrer l&#8217;importance d&#8217;utiliser la méthode equals pour comparer les valeurs des objets java.lang.String .</p>
<p>Comme précisé par Jérôme et Nicolas Le Coz en commentaire, l&#8217;instanciation d&#8217;un nouvel objet String est conseillée lors de l&#8217;utilisation de substring sur des très grandes chaînes de caractères. En effet, la valeur stockée avec un substring n&#8217;est pas uniquement la substring, mais la chaîne entière avec un offset (premier caractère à utiliser) et un compteur (nombre de caractères à utiliser).</p>
<p>C&#8217;est clair si l&#8217;on regarde la classe java.lang.String</p>
<pre class="brush:java">  public final class String
  	implements java.io.Serializable, Comparable<string>, CharSequence
  {
  /** The value is used for character storage. */
  private final char value[];

  /** The offset is the first index of the storage that is used. */
  private final int offset;

  /** The count is the number of characters in the String. */
  private final int count;
[...]
public String substring(int beginIndex, int endIndex) {
 [...]
 return ((beginIndex == 0) &#038;&#038; (endIndex == count)) ? this :
 new String(offset + beginIndex, endIndex - beginIndex, value);
 }
</pre>
<p>Plus d&#8217;infos ici <a rel="nofollow" href="http://blog.xebia.fr/2009/08/03/revue-de-presse-xebia-120/#AttentionvotremmoireavecString">http://blog.xebia.fr/2009/08/03/revue-de-presse-xebia-120/#AttentionvotremmoireavecString </a> et dans les autres liens en commentaires.<a rel="nofollow" href="http://blog.xebia.fr/2009/08/03/revue-de-presse-xebia-120/#AttentionvotremmoireavecString"><br />
</a></p>
<h2>Se méfier de la construction des BigDecimal.</h2>
<p>On utilise ici 3 manières de faire pour créer un BigDecimal que l&#8217;on souhaite égal à 4.12.  Néanmoins, les résultats ne sont pas conformes à ce qu&#8217;on pourrait en attendre.</p>
<pre class="brush:java">Double myDouble = 4.12D;

BigDecimal bd1 = new BigDecimal(myDouble);
BigDecimal bd2 = new BigDecimal(String.valueOf(myDouble));
BigDecimal bd3 = BigDecimal.valueOf(myDouble);

System.out.println(bd1.equals(bd2));  // false !
System.out.println(bd1.equals(bd3)); // false !
System.out.println(bd2.equals(bd3));  // true</pre>
<p>Il n&#8217;y a donc pas égalité de valeur entre l&#8217;object construit à partir du double et les 2 autres objets. En effet, si on affiche les différentes valeurs des 3 BigDecimal, le problème est facilement visible :</p>
<p>RESULT 1: 4.12000000000000010658141036401502788066864013671875<br />
RESULT 2: 4.12<br />
RESULT 3: 4.12</p>
<p>Il vaut mieux donc éviter d&#8217;utiliser le constructeur BigDecimal(double double) et de lui préférer les deux autres méthodes.</p>
<pre>public <strong>BigDecimal</strong>(double val)</pre>
<dl>
<dd>Translates a <code>double</code> into a <code>BigDecimal</code> which  is the exact decimal representation of the <code>double</code>&#8217;s  binary floating-point value.  The scale of the returned  <code>BigDecimal</code> is the smallest value such that  <tt>(10<sup>scale</sup> × val)</tt> is an integer.<strong>Notes:</strong></p>
<ol>
<li> The results of this constructor can be somewhat unpredictable.  One might assume that writing <code>new BigDecimal(0.1)</code> in  Java creates a <code>BigDecimal</code> which is exactly equal to  0.1 (an unscaled value of 1, with a scale of 1), but it is  actually equal to  0.1000000000000000055511151231257827021181583404541015625.  This is because 0.1 cannot be represented exactly as a  <code>double</code> (or, for that matter, as a binary fraction of  any finite length).  Thus, the value that is being passed  <em>in</em> to the constructor is not exactly equal to 0.1,  appearances notwithstanding.</li>
<li> The <code>String</code> constructor, on the other hand, is  perfectly predictable: writing <code>new BigDecimal("0.1")</code> creates a <code>BigDecimal</code> which is <em>exactly</em> equal to  0.1, as one would expect.  Therefore, it is generally  recommended that the <a href="http://java.sun.com/javase/6/docs/api/java/math/BigDecimal.html#BigDecimal%28java.lang.String%29"><tt>String</tt> constructor</a> be used in preference to this one.</li>
<li> When a <code>double</code> must be used as a source for a  <code>BigDecimal</code>, note that this constructor provides an  exact conversion; it does not give the same result as  converting the <code>double</code> to a <code>String</code> using the  <a href="http://java.sun.com/javase/6/docs/api/java/lang/Double.html#toString%28double%29"><code>Double.toString(double)</code></a> method and then using the  <a href="http://java.sun.com/javase/6/docs/api/java/math/BigDecimal.html#BigDecimal%28java.lang.String%29"><code>BigDecimal(String)</code></a> constructor.  To get that result,  use the <code>static</code> <a href="http://java.sun.com/javase/6/docs/api/java/math/BigDecimal.html#valueOf%28double%29"><code>valueOf(double)</code></a> method.</li>
</ol>
</dd>
</dl>

]]></content:encoded>
			<wfw:commentRss>http://www.java-freelance.fr/java/revues-de-code-i/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Evènements java en février sur Paris</title>
		<link>http://www.java-freelance.fr/humeur/evenements-java-en-fevrier-sur-paris</link>
		<comments>http://www.java-freelance.fr/humeur/evenements-java-en-fevrier-sur-paris#comments</comments>
		<pubDate>Tue, 26 Jan 2010 14:01:29 +0000</pubDate>
		<dc:creator>Mathilde</dc:creator>
				<category><![CDATA[Humeur]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[clojure]]></category>
		<category><![CDATA[DDD]]></category>
		<category><![CDATA[JUG]]></category>
		<category><![CDATA[KawaCamp]]></category>
		<category><![CDATA[Spring]]></category>

		<guid isPermaLink="false">http://www.java-freelance.fr/?p=316</guid>
		<description><![CDATA[			
			
Il n&#8217;y a pas à dire, Février est un mois chargé vu l&#8217;ensemble des conférences et rencontres qui nous sont proposées gratuitement autour de Java et du Web.
MAJ :  la date de l&#8217;évènement Clojure a été avancée au 8 février !
Ajout événement noSQL 16 février
Ajout évènement EulerGUI 13 février

Le KawaCampParis1 &#8211; 3 février &#8211; Décalé [...]]]></description>
			<content:encoded><![CDATA[			
			
<p><a href="http://www.zenika.com/conference/java/secret-de-la-concurrence-java-par-heinz-kabutz" target="_self"><img class="alignleft size-medium wp-image-327" title="4193293024_eef35683c7_o" src="http://www.java-freelance.fr/wp-content/uploads/2010/01/4193293024_eef35683c7_o-300x225.jpg" alt="4193293024_eef35683c7_o" width="300" height="225" /></a>Il n&#8217;y a pas à dire, Février est un mois chargé vu l&#8217;ensemble des conférences et rencontres qui nous sont proposées gratuitement autour de Java et du Web.</p>
<p><span style="color: #ff0000;">MAJ :  la date de l&#8217;évènement Clojure a été avancée au 8 février !</span></p>
<p><span style="color: #ff0000;">Ajout événement noSQL 16 février</span></p>
<p><span style="color: #ff0000;">Ajout évènement EulerGUI 13 février<br />
</span></p>
<h2>Le KawaCampParis1 &#8211; <span style="text-decoration: line-through;">3 février</span> &#8211; <span style="color: #ff0000;">Décalé en mars</span></h2>
<p>Les BarCamp sont des rencontres, non formelles sous forme d&#8217;ateliers-événements participatifs ou simplement de discussions libres autour d&#8217;un thème. Chacun arrive avec son propre contenu.  Comme lors des JavaCamps les participants finissaient la plupart du temps par parler d&#8217;autres choses que Java, l&#8217;idée d&#8217;un KawaCamp, plus large, a germé <img src='http://www.java-freelance.fr/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  Les sujets seront donc nombreux, de NoSQL à Groovy en passant par les technos Google, sans oublier  HTML5, les frameworks Javascript etc ..</p>
<p><em>Site web</em> : <a href="http://barcamp.org/KawaCampParis1" target="_blank">http://barcamp.org/KawaCampParis1</a><br />
<em>Wave publique </em>: with:public KawaCampParis1</p>
<h2>Clojure : Vers l&#8217;essence de la programmation &#8211; 8 février</h2>
<p>Clojure est un langage fonctionnel apparu en 2007 de type Lisp et tournant sur la JVM. Howard Lewis Ship , créateur de Tapestry, présentera le langage, ses atouts ainsi que les concepts fondamentaux de la programmation fonctionnelle.</p>
<p><em>Site web : </em><a href="http://www.zenika.com/conference/web_ria/clojure-essence-de-programmation-par-howard-lewis-ship" target="_blank">http://www.zenika.com/conference/web_ria/clojure-essence-de-programmation-par-howard-lewis-ship</a></p>
<h2>2ème Anniversaire du Paris Jug &#8211; 9 février</h2>
<p>Le Paris JUG fête ses deux ans en grand ! Un amphi de 500 places nous accueillera entre 18h45 et 19h (donc 30 minutes plus tôt que d&#8217;habitude) sur le sujet de l&#8217;open-source en France. Au moins 6 présentations sur des thèmes variés :</p>
<ul>
<li>Keynote de Sacha Labourey</li>
<li>Obeo : exemple d&#8217;un éditeur d&#8217;outils de développements Open Source ayant réussi à se développer</li>
<li> Les licences permettant la diffusion libre de la documentation</li>
<li>Le framework Play!</li>
<li>jCaptcha</li>
<li>jax-doclet , permettant de génèrer de la JavaDoc à partir des des commentaires JavaDoc et des annotations de manières spécifiques (notamment pour JAX-RS et JAXB)</li>
</ul>
<p>Et toujours suivi d&#8217;une 3ème mi-temps pour des discussions plus informelles mais tout aussi intéressantes !</p>
<p>Comme au mois de Décembre, la salle est à la faculté de la Sorbonne : <a href="http://www.parisjug.org/xwiki/bin/view/Location/SorbonneParisIV" target="_blank">http://www.parisjug.org/xwiki/bin/view/Location/SorbonneParisIV</a></p>
<p><em>Site web</em> : <a href="http://www.parisjug.org/xwiki/bin/view/Meeting/20100209" target="_blank">http://www.parisjug.org/xwiki/bin/view/Meeting/20100209</a></p>
<h2>Les secrets de la concurrence Java &#8211; 11 février</h2>
<p>Heinz Kabuts est un des premiers Java Champion. Il publie régulièrement une newsletter très pointue sur Java et la JVM sur <a href="http://www.javaspecialists.eu/" target="_blank">http://www.javaspecialists.eu/</a> suivie par approximativement 30 000 développeurs Java. Il abordera au cours de cette soirée 10 lois pour nous apprendre à mieux gérer le multi-threading.</p>
<p><em>Site web </em>: <a href="http://www.zenika.com/conference/java/secret-de-la-concurrence-java-par-heinz-kabutz" target="_self">http://www.zenika.com/conference/java/secret-de-la-concurrence-java-par-heinz-kabutz</a></p>
<h2>EulerGUI &#8211; 13 février</h2>
<p>EulerGUI est une interface graphique pour le Web Sémantique, et les moteurs de règles, Open Source, en Java. ( http://eulergui.svn.sourceforge.net/viewvc/eulergui/trunk/eulergui/html/documentation.html )</p>
<p><em>Site web </em>: http://jmvanel.free.fr/seminaires/seminaires_gratuits.html#L436</p>
<h2>Domain Driven Design : Les modèles en action &#8211; 17 février</h2>
<p>Eric Evans est de retour à Paris. Auteur de Domain-Driven Design, il  présentera les différents modèles (comment les choisir, les faire cohabiter &#8230;). Cette conférence s&#8217;adresse plutôt aux développeurs expérimentés.</p>
<p><em>Site web</em> : <a href="http://www.zenika.com/conference/architecture/domain-driven-design-par-Eric-Evans" target="_blank">http://www.zenika.com/conference/architecture/domain-driven-design-par-Eric-Evans</a></p>
<h2>Deuxième rencontre noSQL &#8211; 16 février</h2>
<p>Les sujets de cette deuxième conférence sont &laquo;&nbsp;noSQL for Fun and Profit&nbsp;&raquo; et Redis.</p>
<p><em>Site web </em>:  <a href="http://sites.google.com/a/octo.com/nosql/project-updates/usergroupparis-round2">http://sites.google.com/a/octo.com/nosql/project-updates/usergroupparis-round2</a></p>
<h2>Création du Spring User Group &#8211; 25 février</h2>
<p>La première conférence du Spring User Group balayera les différentes nouveautés de la version 3.0 de Spring par Arnaud Cogoluègnes. La migration vers Spring 3.0, les nouveautés (Spring Expression Language, Support Rest) ainsi que le rapport avec Java EE seront abordés.</p>
<p><em>Site web </em>:  <a href="http://groups.google.fr/group/sugfr/web/evnements">http://groups.google.fr/group/sugfr/web/evnements</a></p>
<p>Src image :  Iulian Nistea</p>

]]></content:encoded>
			<wfw:commentRss>http://www.java-freelance.fr/humeur/evenements-java-en-fevrier-sur-paris/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Premiers pas avec Scala</title>
		<link>http://www.java-freelance.fr/java/premiers-pas-avec-scala</link>
		<comments>http://www.java-freelance.fr/java/premiers-pas-avec-scala#comments</comments>
		<pubDate>Sun, 03 Jan 2010 12:55:35 +0000</pubDate>
		<dc:creator>Jean-Baptiste</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[closure]]></category>
		<category><![CDATA[JUnit]]></category>
		<category><![CDATA[PMD]]></category>
		<category><![CDATA[programmation fonctionnelle]]></category>
		<category><![CDATA[scala]]></category>

		<guid isPermaLink="false">http://www.java-freelance.fr/?p=265</guid>
		<description><![CDATA[			
			
Je suis tombé amoureux de Scala. Et je suis fier de vous présenter mes premières lignes de code en Scala :
import java.io._

class Reader(dir: String) {

	// Concatène les contenus de n fichiers dans une liste
	def readAll() = {

		// Mets toutes les lignes d'un fichier dans une liste
		def readLines (name : String) = {

			// Mets toutes les [...]]]></description>
			<content:encoded><![CDATA[			
			
<p>Je suis tombé amoureux de Scala. Et je suis fier de vous présenter mes premières lignes de code en Scala :</p>
<pre class="brush:scala">import java.io._

class Reader(dir: String) {

	// Concatène les contenus de n fichiers dans une liste
	def readAll() = {

		// Mets toutes les lignes d'un fichier dans une liste
		def readLines (name : String) = {

			// Mets toutes les lignes d'un bufferedReader dans une liste
			def read(buf : BufferedReader, acc : List[String] ) : List[String] = buf.readLine match {
				case null =&gt; acc
				case s =&gt; read(buf, s::acc)  // Appel recursif optimisé par Scala
			}

			// Compose le nom complet du fichier et appel read
			read(new BufferedReader(new FileReader(dir + "/" + name)), Nil).reverse
		}

		// Applique readLine sur tous les fichiers et renvoi la concaténation des listes
		// Pas de return : En scala c'est la derniere expression qui fait office de retour
		new File(dir).list.flatMap(readLines)
	}
}</pre>
<p>13 lignes de code, pour lire tous les fichiers d&#8217;un répertoire puis concaténer l&#8217;ensemble des lignes dans une liste chaîné.</p>
<h2>Une compatibilité à 100% avec Java</h2>
<p>Ce qui n&#8217;est pas une surprise, car Scala est compilé en ByteCode.</p>
<p>Cela se traduit par la possibilité d&#8217;importer  n&#8217;importe quelle classe pourvu qu&#8217;elle soit dans le classpath :</p>
<pre class="brush:scala">import java.io._</pre>
<p>Et d&#8217;appeler des méthodes Java dans le code Scala :</p>
<pre class="brush:scala">buf.readLine</pre>
<pre class="brush:scala">new BufferedReader(new FileReader(dir + "/" + name))</pre>
<p>Et même d&#8217;utiliser très simplement un framework comme JUnit :</p>
<pre class="brush:scala">import org.junit.Test

class ReaderTest() {
  @Test
  def unTest() : Unit = {
    val read = new Reader("src/test/resources/cotations")
    read.readAll().map((x) =&gt;println(x));
  }
}</pre>
<p>Oui je sais, ce test n&#8217;est pas un test, c&#8217;est juste un exemple <img src='http://www.java-freelance.fr/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p class="brush:scala">Chaque méthode que j&#8217;ai écrite ne fait qu&#8217;un seul traitement. Cela les rends faciles à comprendre, à maintenir et à tester. La programmation fonctionnelle n&#8217;étant pas &laquo;&nbsp;impérative&nbsp;&raquo;, il est de toute façon très difficile d&#8217;écrire une méthode sur 1000 lignes alors qu&#8217;il est malheureusement très fréquent d&#8217;en trouver dans du code Java&#8230;</p>
<p class="brush:scala">
<h2>Pas de boucle</h2>
<p>En programmation fonctionnelle il est tout à fait possible, et même conseillé de ne pas utiliser de boucle. La façon de penser et de concevoir son programme n&#8217;est plus la même. C&#8217;est je  pense, la principale raison qui rend les langages fonctionnel &laquo;&nbsp;obscurs&nbsp;&raquo; pour un développeur impératif.</p>
<p>En programmation impérative, on pense &laquo;&nbsp;enchaînements d&#8217;instructions&nbsp;&raquo;, c&#8217;est un peu comme écrire une recette de cuisine : faire ci, puis ça, puis ça.</p>
<p>En programmation fonctionnelle on s&#8217;attache au &laquo;&nbsp;comment&nbsp;&raquo;. Comment transformer tel fichier en liste et tel liste en table de base de données. C&#8217;est le principe d&#8217;une fonction : transformer une entrée en &laquo;&nbsp;autre chose&nbsp;&raquo;. Les éléments impératifs, comme les boucles ne sont utiles que dans un langage impératif (encore que..).</p>
<p>On utilisera plutôt la récursion :</p>
<pre class="brush:scala">			def read(buf : BufferedReader, acc : List[String] ) : List[String] = buf.readLine match {
				case null =&gt; acc
				case s =&gt; read(buf, s::acc)  // Appel recursif optimisé par Scala
			}

			// Compose le nom complet du fichier et appel read
			read(new BufferedReader(new FileReader(dir + "/" + name)), Nil).reverse</pre>
<p>Notez qu&#8217;il ne se produira pas de StackOverflowError car ce code récursif est traduit par une <em>boucle</em>. Oui ne riez pas, c&#8217;est vrai. Un code récursif identique en java produira un beau StackOverflowError lorsque les fichiers dépasseront un certain nombre de lignes.</p>
<p>Scala a quand même une petite faiblesse, il n&#8217;optimisera que si l&#8217;appel récursif est direct. Une pile {read, read, read, read, read} sera optimisée alors qu&#8217;une pile {read2, read1, read2, read1} ne le sera pas. Ce qui nous empêche d&#8217;écrire ce code qui aurait été plus élégant :</p>
<pre class="brush:scala">def read(buf : BufferedReader) : List[String] = buf.readLine match {
      case null =&gt; Nil
       case s =&gt; s::read(buf)  // Appel recursif
}

  // Compose le nom complet du fichier et appel read
  read(new BufferedReader(new FileReader(dir + "/" + name)))</pre>
<p>La stack ici est {read, ::, read, ::, read, ..} &laquo;&nbsp;::&nbsp;&raquo; est la fonction d&#8217;ajout d&#8217;élément à une liste en Scala !</p>
<p>En fait, Java nous interdit carrément d&#8217;utiliser la récursion sur une trop grande profondeur, ce qui est clairement une énorme lacune du compilateur Java, qui pourrait très bien optimiser les fonctions récursives pour éviter les stackOverflow. Scala à une longueur d&#8217;avance sur ce point. Ceci dit je pense que cela donnera des idées pour Java7.</p>
<p>Cette traduction en Java ne sera pas optimisée malgré une pile d&#8217;appel optimisable :</p>
<pre class="brush:java">private List readLines(final BufferedReader buf, final List acc) {
		String line;
		try {
			line = buf.readLine();
			if (line != null) {
				acc.add(line);
				return readLines(buf, acc);
			}
		} catch (IOException e) {
			e.printStackTrace();
		}

		return acc;
	}</pre>
<p>Voici une autre façon de ne pas utiliser de boucle :</p>
<pre class="brush:scala">// flatMap est une méthode native.
new File(dir).list.flatMap(readLines)</pre>
<p>Ici on créé un objet java.io.File, on appel la fonction list() puis on appel la fonction readLines sur chacun des fichiers.</p>
<p>La méthode &laquo;&nbsp;map&nbsp;&raquo; applique la méthode readLines à tous éléments de la liste et retourne cette nouvelle liste. On effectue donc bien un mapping d&#8217;une liste de valeurs vers une nouvelle liste de valeurs : List&lt;FileName&gt; =&gt; List&lt;ContenuDuFichierFileName&gt;. Le tout, sans boucle !</p>
<p>La méthode flatMap() diffère de la méthode map() car au lieu de renvoyer une List&lt;List&lt;String&gt;&gt; (ReadLines renvoie une List&lt;String&gt;, elle va &laquo;&nbsp;aplanir&nbsp;&raquo; (ou concaténer) les listes, ce qui donnera une simple List&lt;String&gt; contenant toutes les lignes de tous les fichiers situés dans le répertoire &laquo;&nbsp;dir&nbsp;&raquo;.</p>
<p>Alors en vérité, et je pense que c&#8217;est une lacune du langage Scala, il existe un mot clé &laquo;&nbsp;for&nbsp;&raquo; qui permet d&#8217;écrire certaine ligne de mon code d&#8217;une autre manière faisant grandement penser à une boucle &laquo;&nbsp;for&nbsp;&raquo; Java&#8230; mais sans l&#8217;être.. bref, je conseil d&#8217;éviter cette écriture, Scala étant déjà assez difficile à appréhender pour un programmeur impératif, inutile d&#8217;ajouter de la confusion en codant un truc ressemblant à de l&#8217;impératif..</p>
<h2>Et pas de variable</h2>
<p>Scala encourage l&#8217;utilisation d&#8217;objet immutable. C&#8217;est à dire avec un état fixe, sans setters par exemple. Je vous renvoie à la lecture de l&#8217;excellent livre &laquo;&nbsp;Effective Java&nbsp;&raquo; pour en savoir plus sur les avantages de l&#8217;immutabilité en Java, et donc a fortiori en Scala. Et bien entendu il beaucoup plus simple de faire de l&#8217;immutable en Scala qu&#8217;en Java !</p>
<p>Scala permet de différencier très clairement les valeurs des variables via les mots clé &laquo;&nbsp;val&nbsp;&raquo; et &laquo;&nbsp;var&nbsp;&raquo;. &laquo;&nbsp;val s : MyObject &nbsp;&raquo; est l&#8217;équivalent de &laquo;&nbsp;final MyObject o;&nbsp;&raquo; alors que &laquo;&nbsp;var s : MyObject &nbsp;&raquo; sera l&#8217;équivalent de &laquo;&nbsp;MyObject o;&nbsp;&raquo; En Scala les paramètres des fonctions sont des &laquo;&nbsp;val&nbsp;&raquo;. Un objet immutable sera forcément une valeur.</p>
<p>Il est donc tout à fait possible et même conseillé de ne jamais utiliser de variables. En fait, lorsqu&#8217;on aura besoin d&#8217;un objet avec état changeant on utilisera le pattern &laquo;&nbsp;Actor&nbsp;&raquo;, dont Scala fourni le support et qui permet d&#8217;avoir des objets mutables &laquo;&nbsp;sans risques&nbsp;&raquo;.</p>
<h2>Développer avec le Bloc-notes : Facile !</h2>
<p>Le gros défaut de Scala, c&#8217;est qu&#8217;il n&#8217;existe pas d&#8217;IDE aussi avancé que pour Java. Ceci dit, je n&#8217;ai pas du tout souffert de ce manque. J&#8217;utilise le plugin eclipse fourni sur le site officiel, qui permet l&#8217;auto complétion et rajoute de la couleur et honnêtement, ça suffit largement. C&#8217;est à se demander si une grosse partie de l&#8217;outillage nécessaire en Java n&#8217;était finalement pas lié aux lacunes de Java !</p>
<p>Pour comparer voici les 2 codes Java et Scala mis côte à côte. J&#8217;ai essayé de réduire au maximum le code Java ! On remarquera qu&#8217;en Java, j&#8217;ai été obligé d&#8217;avoir une variable non final.</p>
<pre class="brush:java">import java.io.*;
import java.util.*;

public class Reader {

	private final String directory;

	public Reader(final String dir) {
		this.directory = dir;
	}

	public final List&lt;String&gt; readAll() {
		final String[] fileNames = new File(directory).list();
		final List&lt;String&gt; ret = new LinkedList&lt;String&gt;();

		for (String name : fileNames) {
			try {
				BufferedReader buf = new BufferedReader(new FileReader(directory + "/" + name));
				String line = buf.readLine();
				while (line != null) {
					ret.add(line);
				}
			} catch (FileNotFoundException e) {
				e.printStackTrace();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}

		return ret;
	}
}</pre>
<p>No comment :</p>
<pre class="brush:scala">import java.io._

class Reader(dir: String) {
    def readAll() = {

        def readLines (name : String) = {

            def read(buf : BufferedReader, acc : List[String] ) : List[String] = buf.readLine match {
                case null =&gt; acc
                case s =&gt; read(buf, s::acc)
            }

            read(new BufferedReader(new FileReader(dir + "/" + name)), Nil).reverse
        }

        new File(dir).list.flatMap(readLines)
    }
}</pre>
<h2>Réactiver votre cerveau</h2>
<p>Apprendre un nouveau langage, c&#8217;est apprendre à penser autrement, cela bouscule nos neurones et comment dire : Ça fait du bien !</p>
<p>Scala offre beaucoup d&#8217;autres choses intéressantes, comme les traits,  les actors, sa gestion native du XML, son framework web &laquo;&nbsp;Lift&nbsp;&raquo;, Comet etc. J&#8217;espère avoir le temps d&#8217;approfondir tout ça et d&#8217;en faire quelques articles.</p>
<p>Plus généralement, la programmation fonctionnelle offre d&#8217;énormes avantages, rendant obsolète bon nombre de patterns et de framework qui n&#8217;existent finalement que parce que, Java et les langages impératifs en général ont de nombreuses imperfections.</p>
<p>Source : <a href="http://www.scala-lang.org/">http://www.scala-lang.org/</a></p>

]]></content:encoded>
			<wfw:commentRss>http://www.java-freelance.fr/java/premiers-pas-avec-scala/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Les indépendants ne savent pas compter</title>
		<link>http://www.java-freelance.fr/freelance/les-independants-ne-savent-pas-compter</link>
		<comments>http://www.java-freelance.fr/freelance/les-independants-ne-savent-pas-compter#comments</comments>
		<pubDate>Thu, 24 Dec 2009 13:03:51 +0000</pubDate>
		<dc:creator>Jean-Baptiste</dc:creator>
				<category><![CDATA[Freelance]]></category>
		<category><![CDATA[Charges]]></category>
		<category><![CDATA[indépendant]]></category>

		<guid isPermaLink="false">http://www.java-freelance.fr/?p=250</guid>
		<description><![CDATA[			
			
C&#8217;est malheureux, mais j&#8217;ai discuté récemment avec un indépendant qui m&#8217;a démontré par A+B qu&#8217;entre le statut de TNS et celui de salarié, il pouvait ne pas y avoir de différence en terme de taux de cotisations obligatoires.
Voici son calcul de charges obligatoires :
TNS RSI (Commerçant / Artisan) :  45,2 %
TNS Prof. Libérale : 33%
Salarié [...]]]></description>
			<content:encoded><![CDATA[			
			
<p>C&#8217;est malheureux, mais j&#8217;ai discuté récemment avec un indépendant qui m&#8217;a démontré par A+B qu&#8217;entre le statut de TNS et celui de salarié, il pouvait ne pas y avoir de différence en terme de taux de cotisations obligatoires.</p>
<p>Voici son calcul de charges obligatoires :</p>
<p>TNS RSI (Commerçant / Artisan) :  45,2 %</p>
<p>TNS Prof. Libérale : 33%</p>
<p>Salarié : 22% de cotisations salariales et 30% de charges patronales donc :  charges = 50%.</p>
<p>Vu comme ça, et étant donné la différence de prestation entre un salarié et un TNS (indemnités journalières, retraite, chômage..), il est plus souvent avantageux d&#8217;être salarié, voir complétement préférable pour un artisan au RSI.</p>
<h2>Où est l&#8217;erreur ?</h2>
<p>Alors pourquoi tout le monde ne se met pas salarié ? Les solutions pour le faire sont pourtant multiples ! L&#8217;erreur est simple, les taux sont corrects mais<strong> </strong><em>la base de calcul n&#8217;est absolument pas la même.</em></p>
<p>Pour le régime salarié, on applique les taux sur le brut versé alors qu&#8217;en TNS on applique le taux sur le net versé.</p>
<p>Petit rappel mathématique : y * taux = x <em> <strong>n&#8217;est pas égal a</strong></em> x * taux = y.</p>
<p>D&#8217;un coté on a <em>brut * (1-taux)</em> = net</p>
<p>de l&#8217;autre coté on a : net * (1 + taux) = brut (&lt;=&gt; net = <em>brut * (1/(1+taux)) )<br />
</em></p>
<p>Jusqu&#8217;à preuve du contraire 1/(1+taux) <em><strong>n&#8217;est pas égal a </strong></em> (1-taux). On compare donc des choux et des carottes.</p>
<p>Pour être plus clair, voici un tableau comparatif avec des exemples facile à comprendre :</p>
<p style="text-align: center;"><img class="aligncenter size-full wp-image-254" title="charges-sociales1" src="http://java-freelance.fr/wp-content/uploads/2009/12/charges-sociales1.png" alt="charges-sociales1" width="595" height="162" /></p>
<p>Attention, les taux ne sont qu&#8217;un ordre de grandeur, en réalité cela varie un peu en fonction des situations.</p>
<p>La comparaison entre salarié et TNS pour un indépendant en informatique, donc en profession libérale, se fera  soit en comparant 81% à 33%  de charges sur le net,  soit en comparant 45% à 25% de charges sur le brut.</p>
<p>En passant, attention au simulateur que l&#8217;on trouve sur<a href="http://www.freelance-info.fr" target="_blank"> http://www.freelance-info.fr</a>, il est faux pour les mêmes raisons. <a href="http://www.java-freelance.fr/calculatrice" target="_blank">Utilisez plutôt notre simulateur</a>.</p>

]]></content:encoded>
			<wfw:commentRss>http://www.java-freelance.fr/freelance/les-independants-ne-savent-pas-compter/feed</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Devoxx &#8211; Day 3</title>
		<link>http://www.java-freelance.fr/java/devoxx-day-3</link>
		<comments>http://www.java-freelance.fr/java/devoxx-day-3#comments</comments>
		<pubDate>Thu, 26 Nov 2009 20:25:29 +0000</pubDate>
		<dc:creator>Mathilde</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Comet]]></category>
		<category><![CDATA[devoxx]]></category>
		<category><![CDATA[JUG]]></category>
		<category><![CDATA[Oracle]]></category>
		<category><![CDATA[OSGi]]></category>
		<category><![CDATA[Sun]]></category>
		<category><![CDATA[Weblogic]]></category>

		<guid isPermaLink="false">http://www.java-freelance.fr/?p=233</guid>
		<description><![CDATA[			
			

La troisième journée est assez différente des deux précédentes. Le planning des journées change. Le matin, plus de session de 3 heures mais une Keynote de deux heures suivie par une conférence d&#8217;une heure.
Après un rappel de quelques chiffres (2500+participants, 56 jugs &#8230;),  Stephan Janssen, l&#8217;organisateur de Devoxx nous présente la prochaine version de parleys.com [...]]]></description>
			<content:encoded><![CDATA[			
			
<p style="text-align: center;"><img class="aligncenter size-full wp-image-215" title="logodevoxx" src="http://java-freelance.fr/wp-content/uploads/2009/11/logodevoxx.jpg" alt="logodevoxx" width="300" height="112" /></p>
<p>La troisième journée est assez différente des deux précédentes. Le planning des journées change. Le matin, plus de session de 3 heures mais une Keynote de deux heures suivie par une conférence d&#8217;une heure.</p>
<p>Après un rappel de quelques chiffres (2500+participants, 56 jugs &#8230;),  Stephan Janssen, l&#8217;organisateur de Devoxx nous présente la prochaine version de <a href="http://parleys.com/display/PARLEYS/Home" target="_blank">parleys.com</a> . Parleys.com permet de voir de chez soi l&#8217;ensemble des conférences de devoxx mais également d&#8217;autres évènements, comme par exemple certaines présentations des différents JUG. Le service est également proposé aux entreprises pour héberger leurs vidéos. Outre cette nouvelle version, les présentations de devoxx 2009 sont déjà arrivées en grand nombre,  les versions gratuites des conférences seront disponibles au compte goutte tout au long de l&#8217;année. Toutes les conférences seront disponibles gratuitement  à la fin 2010. A noter qu&#8217;il est possible de télécharger les présentations sur son PC très facilement avec ce site et de les revoir à volonté.</p>
<h2>Oracle</h2>
<p>Le deuxième sujet est une présentation d&#8217;Oracle. J&#8217;avoue avoir envisagé quelque chose de plus grand, mais l&#8217;acquisition de Sun par Oracle n&#8217;étant pas finalisé, il n&#8217;y aura rien de croustillant de ce côté là. On a le droit à la place d&#8217;une démo du moteur de module dynamique de Weblogic.</p>
<h2>Sun</h2>
<p>La présentation de Sun a été plus intéressante. Outre le fait que la final release sortira le 10 décembre 2009, une belle démo, bien rodée, a pu démontrer la puissance de JEE6. Création d&#8217;une Servlet, intéraction avec EJB et ensuite avec un service OSGi. La simplicité de l&#8217;ensemble est vraiment à remarquer, aucun plantage lors de la démo. Certaines fonctionnalités de Glassfish V3 notamment le rechargement à chaud &#8230; sans perte de session a vraiment eu un impact chez tous ceux qui auront essayés de debugger un problème liée à une session.</p>
<h2>Flash Catalyst</h2>
<p>La dernière présentation fut celle d&#8217;Adobe. Une démonstration de Flash Catalyst et son intégration avec les différents outils Adobe très bien ficelée, avec un vrai show des deux présentateurs. La puissance de Flash Catalyst et son intégration avec la suite Adobe donnent une réelle impression de simplicité, que ce soit pour mapper deux vues, pour modifier un bouton, pour permettre d&#8217;envoyer le code vers Flash Builder, qui est plus à destination des développeurs. A voir ce que cela donne dans la réalité.</p>
<h2>JDK 7  Update</h2>
<p>Place ensuite à JDK7 update. Les plus grandes nouveautés sont le project Jigsaw, qui permet une grande modularité de la jdk, avec la possibilité de n&#8217;embarquer que les librairies utiles à notre application. Le project coin qui regroupe quelques évolutions du langage :</p>
<p>L&#8217;apparition de l&#8217;opérateur diamond qui nous permet d&#8217;écrire :</p>
<p>Map&lt;String,String&gt; myMap  = new Hashmap&lt;&gt;();</p>
<p>Il sera également plus simple de construire des collections sans avoir des myList.add(&#8230;) à la chaine, la solution implémentée aura une syntaxe proche de celle des tableaux. D&#8217;autres nouveautés, comme la possibilité de faire un switch sur des String ou l&#8217;apparition  de closures (simples). Un point à également été clarifié sur la différence entre Java SE et le jdk, le Java SE représentant la spécification, le jdk7 l&#8217;implémentation. A noter que bien qu&#8217;il y ait un open jdk 7, il n&#8217;y a pas de Java SE 7.</p>
<h2>Comet</h2>
<p>Jean-Francois Arcand présente ensuite le framework Atmosphère qui permet de pousser un message du serveur vers le client.<br />
Il existe trois types de méthodes pour pousser ce message :</p>
<ul>
<li> Le Polling</li>
<li> Le long Polling</li>
<li> Http Streaming, souvent utilisé dans les jeux mais qui devient compliqué dans certaines situations.</li>
</ul>
<p>Atmosphère se veut un framework simple, basée essentiellement sur des pojos et disponibles sur de nombreux serveurs (de tomcat à google app engine) et supporte certains frameworks de présentations (GWT/Wicket). La démo, très simple, se déroule bien. Encore une fois, il faut voir ce que cela donne dans la réalité de nos environnements.</p>
<h2>Distributed programming the google way</h2>
<p>Gregor Hohpes présente ensuite une conférence d&#8217;une heure sur &laquo;&nbsp;Distributed programming the google way&nbsp;&raquo;. Cette conférence se révèle être une des plus intéressantes conférences de Devoxx. Il détaille le fonctionnement de BigTable, de MapReduce, de Sawzall et de Google File System au travers de 8 recommandations :</p>
<ul>
<li>Utilisez la fragmentation, ne pas hésiter à partionner les données.</li>
<li>Rester simple et n&#8217;implémentez que les fonctions de base</li>
<li>S&#8217;attendre à  l&#8217;échec</li>
<li>Faites des processus autonome, pouvant poursuivre sans supervision</li>
<li><span id="result_box" class="long_text"><span style="background-color: #ffffff;" title="Some processes should be able to continue without supervision." onmouseover="this.style.backgroundColor='#ebeff9'" onmouseout="this.style.backgroundColor='#fff'">Le runtime est le plus important. Mieux vaut une circulation fluide à des règles très strictes.</span></span></li>
<li><span id="result_box" class="long_text"><span style="background-color: #ffffff;" title="Some processes should be able to continue without supervision." onmouseover="this.style.backgroundColor='#ebeff9'" onmouseout="this.style.backgroundColor='#fff'">Préférer la vitesse à la précision. Plus c&#8217;est rapide, mieux c&#8217;est.</span></span></li>
<li>Privilégier tout ce qui est sans état. Les processes qui conservent un état sont plus couteux que les opérations sans états</li>
<li>Tout est affaire de compromis</li>
</ul>
<p>L&#8217;importance de ces 8 règles permettent d&#8217;avoir une bonne scalabilité. Il n&#8217;est souvent pas nécessaire de produire toutes les fonctions possibles pour avoir un outil scalable. Ainsi, les différents outils présentés ont chacun leurs limites :  par exemple, Sawzall permet de faire des aggrégations extrêmement rapide mais ne permet pas de faire de traiter la duplication.</p>
<p><span id="result_box" class="long_text"><span style="background-color: #ffffff;" title="Processes that keep state are more expensive than stateless operations." onmouseover="this.style.backgroundColor='#ebeff9'" onmouseout="this.style.backgroundColor='#fff'"><br />
</span></span>Les deux BOFs auquel j&#8217;ai assisté de la soirée n&#8217;ont pas été interessante du tout. Trop de monde, impossible à entendre.</p>

]]></content:encoded>
			<wfw:commentRss>http://www.java-freelance.fr/java/devoxx-day-3/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Devoxx &#8211; Day 2</title>
		<link>http://www.java-freelance.fr/java/devoxx-day-2</link>
		<comments>http://www.java-freelance.fr/java/devoxx-day-2#comments</comments>
		<pubDate>Wed, 18 Nov 2009 08:59:12 +0000</pubDate>
		<dc:creator>Mathilde</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[devoxx]]></category>
		<category><![CDATA[GAE]]></category>
		<category><![CDATA[Google App Engine]]></category>
		<category><![CDATA[Java EE]]></category>
		<category><![CDATA[SOA]]></category>
		<category><![CDATA[TeamCity]]></category>

		<guid isPermaLink="false">http://www.java-freelance.fr/?p=225</guid>
		<description><![CDATA[			
			

Première partie de la journée
La deuxième journée est la dernière journée de la partie université de Devoxx. La partie université à la particularité de présenter deux slots de 3 heures de conférence sur un unique sujet, un le matin et l&#8217;autre après midi.
JEE6
La journée débute par une présentation sur JEE 6 par Antonio Goncalvez et [...]]]></description>
			<content:encoded><![CDATA[			
			
<h2 style="text-align: center;"><img class="aligncenter size-full wp-image-215" title="logodevoxx" src="http://java-freelance.fr/wp-content/uploads/2009/11/logodevoxx.jpg" alt="logodevoxx" width="300" height="112" /></h2>
<h2 style="text-align: left;">Première partie de la journée</h2>
<p style="text-align: left;">La deuxième journée est la dernière journée de la partie université de Devoxx. La partie université à la particularité de présenter deux slots de 3 heures de conférence sur un unique sujet, un le matin et l&#8217;autre après midi.</p>
<h2 style="text-align: left;">JEE6</h2>
<p style="text-align: left;">La journée débute par une présentation sur JEE 6 par Antonio Goncalvez et Alexis Moussine-Pouchkine. Bien ficelée, la présentation passe en revue l&#8217;ensemble des nouveautés. Beaucoup de démos rendent la présentation plus concrète, les mise à jour/nouveautés de la spécification sont bien détaillées. Une présentation un peu plus &#8216;pratique&#8217; ( Qu&#8217;est ce qui ne va pas et qu&#8217;il faut revoir ? que conseillez vous ?) aurait pu également être interessant, heureusement que la BoF du soir (Why you should care about JEE6) a répondu en parti à cette problèmatique .</p>
<h2 style="text-align: left;">Google App Engine</h2>
<p style="text-align: left;">La deuxième moitié de la présentation Google App Engine a porté sur des questions très pratiques. En ce qui concerne l&#8217;interaction avec les données, JDO est preferé à JPA. Tout simplement du aux constraintes de BigTable qui est le système de gestion de données de Google sur App Engine. JDO bien que décrié est remis au gout du jour, JPA n&#8217;étant pas totalement disponible sur GAE du à l&#8217;utilisation de BigTable, le type de système &#8216;NoSQL&#8217; de Google qui ne gère que les one-to-many et pas les many-to-many.<br />
Un autre point important, à l&#8217;autre bout de la chaine est l&#8217;intégration avec GAE de certains framework de présentation (Spring MVC / GWT / JSF 2). En ce qui concerne JSF2, l&#8217;intégration se révèle être la plus hardue. En effet, les problèmes sont nombreux (problème avec la sauvegarde d&#8217;état, avec les beans de scope session et application (uniquement request code and view code), l&#8217;ensemble des états doit être sérialisable, le component binding n&#8217;est pas possible pour la raison précédente. GWT se révèle plus facile mais ce qui est réellement conseillé, si l&#8217;on recherche quelque chose de pratique est l&#8217;utilisation de Spring MVC.</p>
<p>Pour développer l&#8217;interface utilisateur de l&#8217;application de démo, il a fallu environ 3 jours avec Spring MVC, 2 semaines avec GWT et énormément avec JSF. D&#8217;autres frameworks ne sont pas disponibles Rich Faces and Ice Faces par exemple. Pour savoir si une librairie est supportée totalement, partiellement ou non supportée, il suffit de chercher la page &#8216;Will it play on app engine&#8217; où beaucoup de frameworks/librairies sont référencées, avec leurs limites.</p>
<h2 style="text-align: left;">SOA</h2>
<p style="text-align: left;">La session de l&#8217;après midi était sur SOA(Service Oriented Architecture), avec une approche assez théorique. C&#8217;est un paradigme, une manière de concevoir les choses. L&#8217;objectif de SOA est de découper les fonctionnalités complexes en un ensemble de fonction simple, les services. Un des points de la présentation à montrer que chaque choix avait un coût, notamment la manière de coupler faiblement les données mais également d&#8217;utiliser un ESB. Il faut compter un ou deux ans avant de réellement avoir une architecture SOA, et bien sûr, commencer par un projet non critique, puis un deuxième, refactorer, ajouter un troisième, refactorer. Le refactoring est une composante essentielle : SOA ne s&#8217;achète pas, c&#8217;est une philosophie qui se crée sur le long terme et, parceque c&#8217;est du long terme, elle nécessite un investissement politique de l&#8217;entreprise.</p>
<h2 style="text-align: left;">Java-monitor &amp; TeamCity</h2>
<p style="text-align: left;">La première présentation sur l&#8217;outil java-monitor a montré des cas spécifiques de problèmes (java heap space, impossible d&#8217;allouer la mémoire pour lancer le thread &#8230;). Cette présentation très synthétique a permis de mettre en évidence quelques mauvaises pratiques : utilisation de System.gc(), une mauvaise configuration du garbage. Il existe une démo en live des possibilités de l&#8217;outil.<br />
TeamCity est un outil d&#8217;intégration continue. La présentation était constituée essentiellement d&#8217;une démo. Quelques fonctionnalités à retenir : possibilité de déclarer plusieurs agents, par exemple en fonction des OS, bonne intégration avec les IDEs existants, possibilité de prendre la responsabilité d&#8217;un échec de build ou d&#8217;affecter la responsabilité à un membre de l&#8217;équipe, de garder un build propre en permanence (test de la construction du build avant le commit). Néanmoins, la présentation n&#8217;a pas montré un outil si simple que ca à manipuler. Un but de TeamCity semble être également d&#8217;avoir une place dans les outils qui permettent de monitorer la qualité du code (couverture de code avec Emma, d&#8217;autres métriques, la possibilité de voir des mauvaises pratiques) mais encore peut finaliser (pas encore possible apparement de pouvoir modifier les règles sans IntellijJ IDEA).</p>
<h2 style="text-align: left;">Les BoF</h2>
<p style="text-align: left;">La première, Why I should carry about java EE6 a pu réunir une belle équipe de speakers. Les questions posées ont amené certaines bonnes pratiques à être définie, comme utiliser les @ManagedBean principalement avec CDI mais les approches JSR/JCP ont également était approchée. La prochaine session du Paris Jug aura j&#8217;espère l&#8217;occasion de développer encore plus le sujet.</p>
<p style="text-align: left;">
<p style="text-align: left;">Pour conclure, l&#8217;ensemble des présentations seront disponible prochainenment sur le site <a href="http://parleys.com/" target="_blank">http://parleys.com/</a> pour une abonnement de 49€. Ce qui est une très bonne affaire !</p>

]]></content:encoded>
			<wfw:commentRss>http://www.java-freelance.fr/java/devoxx-day-2/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Devoxx Day 1</title>
		<link>http://www.java-freelance.fr/java/devoxx-2009-day1</link>
		<comments>http://www.java-freelance.fr/java/devoxx-2009-day1#comments</comments>
		<pubDate>Mon, 16 Nov 2009 23:44:41 +0000</pubDate>
		<dc:creator>Mathilde</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[devoxx]]></category>
		<category><![CDATA[Hibernate]]></category>
		<category><![CDATA[JSF]]></category>
		<category><![CDATA[kanban]]></category>
		<category><![CDATA[NoSQL]]></category>

		<guid isPermaLink="false">http://www.java-freelance.fr/?p=209</guid>
		<description><![CDATA[			
			

Qu&#8217;est ce que c&#8217;est ?
C&#8217;est 5 jours de conférences, principalement orientés java à Anvers en Belgique.  La réception des devoxians à lieu au Metropolis, une salle de cinéma dans la banlieue d&#8217;Anvers, à environ 20 min de la gare centrale en tramway. Après avoir récupéré nos badges, on nous fournit un sac de goodies (sac/stylo/bloc [...]]]></description>
			<content:encoded><![CDATA[			
			
<h2 style="text-align: center;"><img class="aligncenter size-full wp-image-215" title="logodevoxx" src="http://java-freelance.fr/wp-content/uploads/2009/11/logodevoxx.jpg" alt="logodevoxx" width="300" height="112" /></h2>
<h2>Qu&#8217;est ce que c&#8217;est ?</h2>
<p>C&#8217;est 5 jours de conférences, principalement orientés java à Anvers en Belgique.  La réception des devoxians à lieu au Metropolis, une salle de cinéma dans la banlieue d&#8217;Anvers, à environ 20 min de la gare centrale en tramway. Après avoir récupéré nos badges, on nous fournit un sac de goodies (sac/stylo/bloc note/Tee shirt).</p>
<h2>Kanban</h2>
<p>La première conférence à laquelle j&#8217;ai assisté sur Kanban a duré 3 heures. Kanban est une méthode agile avec un fonctionnement plus simple que Scrum, dans le sens où elle est beaucoup moins contraignante. C&#8217;est une méthode avec une forte composante visuel où un radiateur d&#8217;information constitue un point central de la méthode. Ses trois principes sont la confiance, l&#8217;esprit d&#8217;équipe et la transparence. Il n&#8217;y a pas de notions de sprint ou d&#8217;itération . Les demandes arrivent en permanence et sont traitées au fur et à mesure.</p>
<h2>JSF</h2>
<p>La deuxième conférence sur JSF 2 était assez pointue, organisée en 3 parties : une heure sur la vue, une heure sur le controleur, une heure sur le modèle. L&#8217;aspect orientation composant au lieu de contenu comme c&#8217;est le cas avec JSP est assez interessant. L&#8217;inconvénient de JSF 1.2 était la quantité très importantes d&#8217;XML, JSF 2.0 passe aux annotations, ce qui la rend beaucoup plus simple à manipuler. D&#8217;autres améliorations : pouvoir passer des paramètres en GET (sans commentaire), gérer des bookmarkables URLs &#8230;<br />
Un des points qui a été souvent abordé lors de la présentation est le futur de JSF. Par exemple, le fait d&#8217;avoir une API standard pour AJAX mais également les points bloquants (certaines lourdeurs de configurations). J&#8217;ai beaucoup aimé la franchise de Peter, qui a bien montré ce que l&#8217;on peut faire et ce qui peut être améliorer.</p>
<h2>Hadès &amp; NoSQL</h2>
<p>Place ensuite à 2 petites présentations qui m&#8217;ont laissé sur ma faim. En une quarantaine de minutes, difficile de rentrer dans un sujet technique, tout au moins d&#8217;en montrer ses limites.<br />
Une présentation scolaire mais malgrès tout intéressante d&#8217;Hades, qui permet de simplifier l&#8217;utilisation de JPa n&#8217;a cependant pas montré les cas limites d&#8217;utilisation.<br />
De même, la présentation NoSQL n&#8217;est pas rentrée assez dans les détails pour que cela deviennent vraiment interessant.</p>
<h2>Et le meilleur pour la fin</h2>
<p>De 19h à 22h, place à 3 BoFs : Une session très intéressante sur le NoSQL qui a abordé beaucoup de points, comme l&#8217;efficacité, les différents types d&#8217;outils, l&#8217;importance de choisir un système qui correspond à nos attentes. Pour choisir un bon type de base de données, il est conseillé de faire ressortir 2 priorités entre : Consistency, Partition Tolerance et Availability. Ainsi, Cassandra  par exemple,  dans le cas de serveurs distribués, va remonter la dernière information mais sans que cela ne soit garantie (choix fait sur Partition Tolerance et Availability ). L&#8217;utilisation pour les boutiques en ligne est tout indiquée (c&#8217;est le système d&#8217;Amazon). Alors que d&#8217;autres systèmes tel que HBase garantissent eux une consistance des données, ils seront plutôt utilisés dans des environnements type CMS, où ce qui est visible à l&#8217;écran doit correspondre aux dernières données.</p>
<p>Sur JSF2, la BoF est venu compléter la présentation de l&#8217;après midi.</p>
<p>La BoF d&#8217;hibernate a été assez intéressante. Une présentation assez longue de l&#8217;API Criteria (qui n&#8217;est pas très sexy au premier abord) ne m&#8217;a pas vraiment fait changé d&#8217;avis mais néanmoins, le fait que le meta-modèle soit généré automatiquement par l&#8217;IDE simplement est quand même important. Le principal intêret de cet specification est le fait que cela soit typé, néanmoins, peut être parceque je ne suis plus habituée à utiliser un ORM (JDBC pur), je trouve cela très (trop) verbeux. Cet aspect verbeux provient du fait que l&#8217;API critéria est très puissante et supporte énormément de choses. On peut l&#8217;imaginer encapsulée dans un framework plus simple pour ne retenir que les choses &#8216;utiles&#8217; à son projet dans une forme verbeuse plus simple.</p>
<p>Et voilà le bilan de cette première journée. D&#8217;autre articles arriveront sous peu !</p>

]]></content:encoded>
			<wfw:commentRss>http://www.java-freelance.fr/java/devoxx-2009-day1/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Un vent de reprise ?</title>
		<link>http://www.java-freelance.fr/freelance/un-vent-de-reprise</link>
		<comments>http://www.java-freelance.fr/freelance/un-vent-de-reprise#comments</comments>
		<pubDate>Thu, 29 Oct 2009 05:33:59 +0000</pubDate>
		<dc:creator>Jean-Baptiste</dc:creator>
				<category><![CDATA[Freelance]]></category>
		<category><![CDATA[baromètre]]></category>
		<category><![CDATA[crise]]></category>
		<category><![CDATA[indépendant]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Java EE]]></category>
		<category><![CDATA[Marché]]></category>
		<category><![CDATA[mission]]></category>
		<category><![CDATA[ssii]]></category>

		<guid isPermaLink="false">http://www.java-freelance.fr/?p=186</guid>
		<description><![CDATA[			
			
Depuis le début de la crise économique mondiale, certains clients finaux ont massivement épuré leurs prestataires et ont imposé des baisses de tarif importantes. Résultat : plus de prestataires et moins de mission, loi de l&#8217;offre et la demande oblige, les prix ont chutés d&#8217;environ 10%.
Pour ceux qui ont la chance d&#8217;être resté en mission [...]]]></description>
			<content:encoded><![CDATA[			
			
<p>Depuis le début de la crise économique mondiale, certains clients finaux ont massivement épuré leurs prestataires et ont imposé des baisses de tarif importantes. Résultat : plus de prestataires et moins de mission, loi de l&#8217;offre et la demande oblige, les prix ont chutés d&#8217;environ 10%.</p>
<p>Pour ceux qui ont la chance d&#8217;être resté en mission ou qui n&#8217;ont pas vu leur tarif baisser, ce n&#8217;est pas le moment changer. Et pour ceux qui ont subit, le risque est de continuer à subir quand le marché aura reprit. Alors comment avoir une vue globale sur le marché de la prestation Java en France ?</p>
<p>Personnellement j&#8217;utilise le baromètre du site <a href="http://www.hitechpros.com/info/market.asp">hitechpros.com</a>. Apprendre à décrypter ce baromètre permet de se faire une idée des tendances du marché.</p>
<p><img class="aligncenter size-full wp-image-188" title="hitech2009" src="http://java-freelance.fr/wp-content/uploads/2009/10/hitech2009.png" alt="hitech2009" width="521" height="760" /></p>
<h3>Comment décrypter ces données ?</h3>
<p>Premièrement, ignorer les pourcentages, ils correspondent aux ratios entre les différentes technologies. Cela n&#8217;a aucun intérêt, si ce n&#8217;est de savoir que les nouvelles technologies sont plus demandées que le reste&#8230;</p>
<p>La courbe bleue correspond aux offres de missions (demandes des clients), ramenée a 100% elle sert de base. La courbe rouge correspond aux prestataires disponibles (offres de SSII). Donc plus la courbe rouge baisse, mieux c&#8217;est. Pour le mois de septembre, on voit clairement que le ratio offres / demandes se rapproche de plus en plus du ratio pré crise. C&#8217;est un premier indicateur qui indique simplement que le marché s&#8217;équilibre. Cela ne veut pas dire qu&#8217;il y a un plus grand choix de mission, ni que la crise est terminée mais simplement que pour le mois en cours, il y a eu 242 missions pour 457 prestataires. On en déduit qu&#8217;il faut théorique au maximum 2 mois pour trouver une mission et en moyenne 1 mois.</p>
<p>Ce ratio baisse aussi si les SSII ont moins d&#8217;intercontrat. Et vue qu&#8217;elles ont stoppées les recrutements, il est mécanique qu&#8217;il baisse. Les jeunes diplômés payent aussi pour cette crise.</p>
<p>Pour se faire une idée de l&#8217;évolution réelle de la demande il faut donc jeter un oeil aux mois précédents. Il y avait 255 missions en Septembre, 119 en Août et autour de 200 les mois précédents. Août est traditionnellement peu dynamique;nous l&#8217;ignorons donc. Les demandes étaient donc d&#8217;environ 200 par mois pendant la crise. Si le nombre d&#8217;offres continue de progresser on peut s&#8217;attendre à un retour à des tarifs décents.</p>
<h3>Voici mon analyse :</h3>
<p>- Actuellement le nombre d&#8217;intercontrat baisse fortement et les clients commencent à avoir du mal à trouver des ressources. Les indépendants trouvent facilement des missions mais mal payées.</p>
<p>- Si la tendance se confirme, les SSII vont recommencer à recruter afin de répondre aux exigences des clients, les débutants et chômeurs vont réussir à trouver du travail mais moins bien payé qu&#8217;avant 2007, car les tarifs n&#8217;auront pas encore remontés.</p>
<p>- Lorsque le vivier d&#8217;inter-contrats et de jeunes diplômés sera absorbé, le prix commenceront à remonter et les salaires feront de même. Il sera temps pour les indépendants de profiter de cette dynamique avant la prochaine crise.</p>
<p>Pour conclure, n&#8217;oubliez pas que le meilleur moyen de rester employable, crise ou pas crise est de se former ! En mission comme à la maison ou en dehors. Ainsi que de bien choisir ses missions !</p>
<p><strong>Et vous comment vivez vous ou avez vous vécu cette crise ? Quelle est votre stratégie pour les mois à venir ?</strong></p>

]]></content:encoded>
			<wfw:commentRss>http://www.java-freelance.fr/freelance/un-vent-de-reprise/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Revue de presse</title>
		<link>http://www.java-freelance.fr/web/revue-de-presse</link>
		<comments>http://www.java-freelance.fr/web/revue-de-presse#comments</comments>
		<pubDate>Wed, 16 Sep 2009 00:08:25 +0000</pubDate>
		<dc:creator>Jean-Baptiste</dc:creator>
				<category><![CDATA[Web]]></category>
		<category><![CDATA[agile]]></category>
		<category><![CDATA[Bdd]]></category>
		<category><![CDATA[kanban]]></category>
		<category><![CDATA[scala]]></category>

		<guid isPermaLink="false">http://www.java-freelance.fr/?p=137</guid>
		<description><![CDATA[			
			
Voici une liste des sites qui nous ont intéressés récement :
- http://www.waterfallmanifesto.org :  Site parodique sur les anciennes méthodes de développement (mais hélas toujours d&#8217;actualités) .
- http://blog.crisp.se : Vue artistique d&#8217;une journée de dev avec la méthode Kanban.
- http://www.scala-lang.org/ : Nouveau langage à typage fort, à la fois objet et fonctionnel, qui fonctionne sur la [...]]]></description>
			<content:encoded><![CDATA[			
			
<p>Voici une liste des sites qui nous ont intéressés récement :</p>
<p>- <a href="http://www.waterfallmanifesto.org" target="_blank">http://www.waterfallmanifesto.org</a> :  Site parodique sur les anciennes méthodes de développement (mais hélas toujours d&#8217;actualités) .</p>
<p>- <a href="http://blog.crisp.se/henrikkniberg/2009/06/26/1246053060000.html" target="_blank">http://blog.crisp.se</a> : Vue artistique d&#8217;une journée de dev avec la méthode Kanban.</p>
<p>- <a href="http://www.scala-lang.org/" target="_blank">http://www.scala-lang.org/</a> : Nouveau langage à typage fort, à la fois objet et fonctionnel, qui fonctionne sur la plateforme Java (compilé en bytecode). Formidable language sur le papier, je reste perplexe quant à son adoption par le plus grand nombre.</p>
<p>- <a href="http://www.kiad.org/" target="_blank">http://www.kiad.org/</a> :  Blog généraliste du PDG d&#8217;Owlient. Articles sur le Web de très bonne qualité.</p>
<p>- <a href="http://codemonkeyism.com/essential-storage-tradeoff-simple-reads-simple-writes/" target="_blank">Bases de données dénormalisées</a> : Article très instructif sur la nouvelle génération de bases de données dites &laquo;&nbsp;Dénormalisées&nbsp;&raquo;, utiles pour les applications effectuant un très grand nombre de lectures et peu de modification.</p>

]]></content:encoded>
			<wfw:commentRss>http://www.java-freelance.fr/web/revue-de-presse/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Être heureux dans son travail</title>
		<link>http://www.java-freelance.fr/freelance/etre-heureux-dans-son-travail</link>
		<comments>http://www.java-freelance.fr/freelance/etre-heureux-dans-son-travail#comments</comments>
		<pubDate>Fri, 04 Sep 2009 21:27:33 +0000</pubDate>
		<dc:creator>Jean-Baptiste</dc:creator>
				<category><![CDATA[Freelance]]></category>
		<category><![CDATA[bonheur]]></category>
		<category><![CDATA[indépendant]]></category>
		<category><![CDATA[travail]]></category>

		<guid isPermaLink="false">http://www.java-freelance.fr/?p=133</guid>
		<description><![CDATA[			
			
Il n&#8217;y a pas que l&#8217;argent qui fait le bonheur ! Oui je sais ce n&#8217;est pas exactement le bon proverbe. Alors pour être heureux dans son job finalement c&#8217;est simple :

Faire ce qu&#8217;on a envie de faire et que l&#8217;on sait bien faire&#8230; à condition que ce soit monétisable (&#8230;).
Je suis resté pas mal [...]]]></description>
			<content:encoded><![CDATA[			
			
<p>Il n&#8217;y a pas que l&#8217;argent qui fait le bonheur ! Oui je sais ce n&#8217;est pas exactement le bon proverbe. Alors pour être heureux dans son job finalement c&#8217;est simple :</p>
<p><img class="aligncenter size-full wp-image-134" title="happy-job" src="http://java-freelance.fr/wp-content/uploads/2009/09/happy-job.jpg" alt="happy-job" width="500" height="500" /></p>
<p>Faire ce qu&#8217;on a envie de faire et que l&#8217;on sait bien faire&#8230; à condition que ce soit monétisable (&#8230;).</p>
<p>Je suis resté pas mal de temps à regarder ce schéma et à réfléchir aux actions à mettre en place pour &laquo;&nbsp;monétiser ce que je sais faire et que j&#8217;ai envie de faire&nbsp;&raquo; et pour &laquo;&nbsp;progresser sur ce que je veux faire et qui est monétisable mais que je ne maitrise pas&nbsp;&raquo;. Que du bon sens mais je trouve utile d&#8217;avoir  un schéma simple pour stimuler la réflexion.</p>
<p><a href="http://whatconsumesme.com/2009/what-im-writing/how-to-be-happy-in-business-venn-diagram/" target="_self">source</a></p>

]]></content:encoded>
			<wfw:commentRss>http://www.java-freelance.fr/freelance/etre-heureux-dans-son-travail/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Retour sur 4 mois de &#171;&#160;Freelance&#160;&#187;</title>
		<link>http://www.java-freelance.fr/freelance/retour-sur-4-mois-de-freelance</link>
		<comments>http://www.java-freelance.fr/freelance/retour-sur-4-mois-de-freelance#comments</comments>
		<pubDate>Tue, 11 Aug 2009 18:06:17 +0000</pubDate>
		<dc:creator>Jean-Baptiste</dc:creator>
				<category><![CDATA[Freelance]]></category>
		<category><![CDATA[Bilan]]></category>
		<category><![CDATA[bonheur]]></category>
		<category><![CDATA[indépendant]]></category>
		<category><![CDATA[travail]]></category>

		<guid isPermaLink="false">http://www.java-freelance.fr/?p=108</guid>
		<description><![CDATA[			
			

Dans 4 jours, cela fera 4 mois que je suis &#171;&#160;libre&#160;&#187;, ou plutôt devrait je dire &#171;&#160;nous&#160;&#187; car nous sommes 2 à avoir changé de statut en même temps. C&#8217;est l&#8217;heure de faire un premier bilan sur ce qui a changé dans nos vies.

Malgré la crise, nous avons trouvé une mission avant la fin de [...]]]></description>
			<content:encoded><![CDATA[			
			
<p><img class="size-full wp-image-112 alignright" title="bonheur2" src="http://java-freelance.fr/wp-content/uploads/2009/08/bonheur2.gif" alt="bonheur2" width="255" height="251" /></p>
<p>Dans 4 jours, cela fera 4 mois que je suis &laquo;&nbsp;libre&nbsp;&raquo;, ou plutôt devrait je dire &laquo;&nbsp;nous&nbsp;&raquo; car nous sommes 2 à avoir changé de statut en même temps. C&#8217;est l&#8217;heure de faire un premier bilan sur ce qui a changé dans nos vies.</p>
<ul>
<li>Malgré la crise, nous avons trouvé une mission avant la fin de nos préavis, avec au final moins d&#8217;une semaine d&#8217;inter-contrat chacun. Et pourtant, nous n&#8217;avons que peu d&#8217;expérience : respectivement 3 et 4 années. Nos profils sont &laquo;&nbsp;standards&nbsp;&raquo; mais avec Internet, les sites de missions pullulent et le temps où il fallait être &laquo;&nbsp;connu&nbsp;&raquo;, voir &laquo;&nbsp;reconnu&nbsp;&raquo; pour trouver une mission est bel et bien révolu.</li>
</ul>
<ul>
<li>La création ensuite. Le choix, soit disant plus compliqué de l&#8217;EURL c&#8217;est révélé être d&#8217;une extrême simplicité. Tous les documents-types sont disponibles sur Internet et les démarches faisable à distance.</li>
</ul>
<ul>
<li>Au quotidien, rien n&#8217;a changé ou presque. Les missions sont du même type qu&#8217;en étant en SSII, notre métier n&#8217;a pas changé. Il n&#8217;y que quelques petites paperasseries en plus : les factures et les notes de frais à la fin du mois. Un petite visite chez le comptable de temps en temps pour éclaircir certains points et transmettre les premières pièces comptables. Il faut compter entre 30 minutes et une heure par mois de travail supplémentaire par rapport à un salarié.</li>
</ul>
<ul>
<li>Coté budget, c&#8217;est le bonheur, nous avons fait une augmentation de 50% de nos revenus net. Sans compter les dividendes qui pourront monter à 3 mois de revenus chacun si nous faisons de bonnes années, c&#8217;est à dire : si nous n&#8217;avons pas d&#8217;inter-contrat. Soit un potentiel doublement de salaire. Ça laisse rêveur et j&#8217;avoue avoir encore  du mal à y croire.</li>
</ul>
<ul>
<li>Coté épanouissement personnel, outre le fait de changer de mission après 3 ans chez le même client (ouf!), l&#8217;importance de rester &laquo;&nbsp;à jour&nbsp;&raquo; a pris tout son sens. Fini d&#8217;attendre le DIF ou que la DRH daigne accepter la formation de nos rêves. Si nous ne le faisons pas nous même, personne ne viendra le faire à notre place, du coup le temps libre que nous passions à se tourner les pouces, nous le passons dorénavant à nous auto-former : que ce soit en anglais, sur les technologies émergentes ou sur des domaines annexes tel que l&#8217;organisation, le management ou l&#8217;économie. Au programme : prototypes, livres, logiciels d&#8217;anglais, blogs, forums, conférences &#8230; En 4 mois j&#8217;ai plus progressé en anglais qu&#8217;en 10 ans de scolarité et plus appris techniquement qu&#8217;en 3 ans de salariat et je peux vraiment dire que cela me rend &laquo;&nbsp;heureux&nbsp;&raquo;.</li>
</ul>
<p>La suite ? Toutes les portes sont ouvertes.  Les possibilités d&#8217;évolution sont nombreuses. Ce qui est sûr c&#8217;est que jamais je ne serai de nouveau salarié. Nous n&#8217;hésiterons pas à prendre un mois de &laquo;&nbsp;vacances&nbsp;&raquo; supplémentaire pour passer des certifications ou à l&#8217;inverse, prendre 4 mois de vacances pour faire un tour du monde&#8230; ou développer un nouveau produit !</p>

]]></content:encoded>
			<wfw:commentRss>http://www.java-freelance.fr/freelance/retour-sur-4-mois-de-freelance/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Université du SI</title>
		<link>http://www.java-freelance.fr/java/universite-du-si</link>
		<comments>http://www.java-freelance.fr/java/universite-du-si#comments</comments>
		<pubDate>Wed, 22 Jul 2009 19:55:37 +0000</pubDate>
		<dc:creator>Jean-Baptiste</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Formation]]></category>
		<category><![CDATA[Octo]]></category>
		<category><![CDATA[université SI]]></category>

		<guid isPermaLink="false">http://www.java-freelance.fr/?p=93</guid>
		<description><![CDATA[			
			

Comme nous le rappel dans un style plutôt décalé jeunerebeumillionnaire dans son manifeste de l&#8217;équation sécrète, le meilleur investissement qu&#8217;une personne &#8211; et donc un indépendant &#8211; puisse faire, c&#8217;est dans sa formation.
Internet est un outil formidable pour se former, on l&#8217;a vu avec les castcodeurs et javablackbelt (dans d&#8217;autres domaines, il existe également de [...]]]></description>
			<content:encoded><![CDATA[			
			
<p><a href="http://usi2009.universite-du-si.com/webcasts.html"><img class="size-full wp-image-94 alignleft" title="Université du SI" src="http://java-freelance.fr/wp-content/uploads/2009/07/logo_usi.jpg" alt="Webcast" width="91" height="113" /></a></p>
<p>Comme nous le rappel dans un style plutôt décalé <a href="http://jeunerebeumillionnaire.com/" target="_blank">jeunerebeumillionnaire </a>dans son <a href="http://jrmfund.com/wp-content/uploads/2008/10/manifeste-de-lequation-secrete.pdf" target="_blank">manifeste de l&#8217;équation sécrète</a>, le meilleur investissement qu&#8217;une personne &#8211; et donc un indépendant &#8211; puisse faire, c&#8217;est dans sa formation.</p>
<p>Internet est un outil formidable pour se former, on l&#8217;a vu avec <a href="http://www.java-freelance.fr/java/les-castcodeurs" target="_blank">les castcodeurs</a> et <a href="http://www.java-freelance.fr/java/comment-valider-ses-competences-java" target="_blank">javablackbelt</a> (dans d&#8217;autres domaines, il existe également de nombreux sites, je pense notamment à <a href="http://www.english-test.net/" target="_blank">l&#8217;apprentissage de l&#8217;anglais</a>).</p>
<p>Aujourd&#8217;hui, l&#8217; on vient de faire un pas de géant au niveau des ressources francophones avec Octo et son Université du SI. Un grand nombre de conférences de très bonnes qualités, viennent d&#8217;être mise en ligne. <a href="http://usi2009.universite-du-si.com/webcasts.html" target="_blank">Bon visionnage</a> !</p>

]]></content:encoded>
			<wfw:commentRss>http://www.java-freelance.fr/java/universite-du-si/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Recouvrement de créance</title>
		<link>http://www.java-freelance.fr/freelance/recouvrement-de-creance</link>
		<comments>http://www.java-freelance.fr/freelance/recouvrement-de-creance#comments</comments>
		<pubDate>Sun, 05 Jul 2009 06:32:31 +0000</pubDate>
		<dc:creator>Jean-Baptiste</dc:creator>
				<category><![CDATA[Freelance]]></category>
		<category><![CDATA[créance]]></category>
		<category><![CDATA[facturation]]></category>
		<category><![CDATA[impayé]]></category>
		<category><![CDATA[indépendant]]></category>
		<category><![CDATA[justice]]></category>
		<category><![CDATA[recouvrement]]></category>

		<guid isPermaLink="false">http://www.java-freelance.fr/?p=78</guid>
		<description><![CDATA[			
			
Quand on est indépendant en informatique, on a souvent qu&#8217;un seul client à la fois. Du coup on devient fortement dépendant du bon paiement des créances. Avec les délais de paiement qui sont souvent de 60jours, si le client décide de ne plus payer, on peut se retrouver à avoir travaillé 3 mois ou plus [...]]]></description>
			<content:encoded><![CDATA[			
			
<p><img class="alignright size-thumbnail wp-image-80" title="justice_hammer_1" src="http://www.java-freelance.fr/wp-content/uploads/2009/06/justice_hammer_1-150x150.jpg" alt="justice_hammer_1" width="150" height="150" />Quand on est indépendant en informatique, on a souvent qu&#8217;un seul client à la fois. Du coup on devient fortement dépendant du bon paiement des créances. Avec les délais de paiement qui sont souvent de 60jours, si le client décide de ne plus payer, on peut se retrouver à avoir travaillé 3 mois ou plus &laquo;&nbsp;gratuitement&nbsp;&raquo;.</p>
<p>Alors comment faire ?</p>
<p>1) Prendre les devants : Si vous avez un intermédiaire, demandez à ce qu&#8217;il fasse appel à un service d&#8217;afacturage et d&#8217;être payé a J+10, J+20. Ainsi, en cas de défaut de paiement, vous vous en rendrez compte plus rapidement. Si vous n&#8217;avez pas d&#8217;intermédiaire, faites le vous même&#8230; cela coute généralement 3% à 5% du montant HT de la facture mais permet de mieux dormir la nuit !</p>
<p>2) En cas de problème avéré, il existe un moyen très simple quand les relances amiables et par courriers recommandés ont echouées : envoyer une injonction de paiement via le tribunal de commerce. Simple à effectuer, c&#8217;est d&#8217;une efficacité redoutable : transmis par huisser avec tampon du tribunal, effet garantie. <a href="http://www.greffes.com/fr/formalites/guide-des-formalites/fond_referes_requetes/injonctions_de_payer/demande_en_injonction_de_payer/152-408.html" target="_blank"><span style="color: #3366ff;">Plus d&#8217;infos ici.</span></a></p>

]]></content:encoded>
			<wfw:commentRss>http://www.java-freelance.fr/freelance/recouvrement-de-creance/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Les CastCodeurs</title>
		<link>http://www.java-freelance.fr/java/les-castcodeurs</link>
		<comments>http://www.java-freelance.fr/java/les-castcodeurs#comments</comments>
		<pubDate>Sat, 27 Jun 2009 12:45:48 +0000</pubDate>
		<dc:creator>Mathilde</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[castcodeurs]]></category>
		<category><![CDATA[podcast]]></category>

		<guid isPermaLink="false">http://www.java-freelance.fr/?p=39</guid>
		<description><![CDATA[			
			
Le concept du podcast &#171;&#160;Les Cast Codeurs&#160;&#187; est de discuter des nouvelles fraîches du monde Java en Français s’il vous plaît.

En général, le podcast contient les rubriques suivantes:

discussion sur les nouvelles du monde Java avec vos hôtes habituels
la sélection des outils de la semaine: un outil que l’on utilise au quotidien pour coder ou travailler
Java, les mains dans le cambouis: une [...]]]></description>
			<content:encoded><![CDATA[			
			
<p>Le concept du podcast &laquo;&nbsp;Les Cast Codeurs&nbsp;&raquo; est de discuter des nouvelles fraîches du monde Java en Français s’il vous plaît.</p>
<p style="text-align: center;"><a href="http://lescastcodeurs.com"><img class="aligncenter" src="http://lescastcodeurs.com/img/jecoute_les_castcodeurs_200px.png" border="0" alt="J'ecoute les Cast Codeurs" /></a></p>
<p>En général, le podcast contient les rubriques suivantes:</p>
<ul>
<li>discussion sur les nouvelles du monde Java avec vos hôtes habituels</li>
<li>la sélection des outils de la semaine: un outil que l’on utilise au quotidien pour coder ou travailler</li>
<li>Java, les mains dans le cambouis: une discussion détaillée sur un sujet peu connu des développeur</li>
<li>l’interview: une interview d’un acteur Francophone (si possible) du monde Java</li>
</ul>
<p>Gage de qualité, les intervenants sont des pointures dans leur domaine.</p>

]]></content:encoded>
			<wfw:commentRss>http://www.java-freelance.fr/java/les-castcodeurs/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>La vie d&#8217;un freelance en dessin</title>
		<link>http://www.java-freelance.fr/freelance/la-vie-dun-freelance-en-dessin</link>
		<comments>http://www.java-freelance.fr/freelance/la-vie-dun-freelance-en-dessin#comments</comments>
		<pubDate>Wed, 24 Jun 2009 06:52:22 +0000</pubDate>
		<dc:creator>Jean-Baptiste</dc:creator>
				<category><![CDATA[Freelance]]></category>
		<category><![CDATA[dessin]]></category>
		<category><![CDATA[humour]]></category>
		<category><![CDATA[indépendant]]></category>

		<guid isPermaLink="false">http://www.java-freelance.fr/?p=70</guid>
		<description><![CDATA[			
			
J&#8217;adore les dessins caricaturaux, ils permettent de grossir certaines dérives&#8230;

Voici une excellente initiative d&#8217;un freelance : http://www.mavieauboulot.fr/blog

]]></description>
			<content:encoded><![CDATA[			
			
<p>J&#8217;adore les dessins caricaturaux, ils permettent de grossir certaines dérives&#8230;</p>
<p style="text-align: center;"><a href="http://ethienot.free.fr/mavieauboulot/"><img class="aligncenter size-full wp-image-71" title="commercial" src="http://java-freelance.fr/wp-content/uploads/2009/06/commercial.jpg" alt="commercial" width="504" height="374" /></a></p>
<p>Voici une excellente initiative d&#8217;un freelance : <a href="http://ethienot.free.fr/mavieauboulot/" target="_blank"></a><a href="http://www.mavieauboulot.fr/blog" target="_blank">http://www.mavieauboulot.fr/blog</a></p>

]]></content:encoded>
			<wfw:commentRss>http://www.java-freelance.fr/freelance/la-vie-dun-freelance-en-dessin/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Merci</title>
		<link>http://www.java-freelance.fr/humeur/merci</link>
		<comments>http://www.java-freelance.fr/humeur/merci#comments</comments>
		<pubDate>Sun, 10 May 2009 09:48:09 +0000</pubDate>
		<dc:creator>Mathilde</dc:creator>
				<category><![CDATA[Humeur]]></category>
		<category><![CDATA[Java]]></category>

		<guid isPermaLink="false">http://www.java-freelance.fr/?p=1186</guid>
		<description><![CDATA[			
			
Les résultats du quizz vous seront envoyés par mail !

]]></description>
			<content:encoded><![CDATA[			
			
<p>Les résultats du quizz vous seront envoyés par mail !</p>

]]></content:encoded>
			<wfw:commentRss>http://www.java-freelance.fr/humeur/merci/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

