<?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://java-freelance.fr/feed" rel="self" type="application/rss+xml" />
	<link>http://java-freelance.fr</link>
	<description>Freelances JEE</description>
	<lastBuildDate>Thu, 11 Mar 2010 16:00:43 +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>EasyMock &#8211; Techniques avancées</title>
		<link>http://java-freelance.fr/java/easymock-techniques-avancees</link>
		<comments>http://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é.</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 transmet à 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 confirme à 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;est 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 à 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://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://java-freelance.fr/formation/creation-du-groupe-duchessfr</link>
		<comments>http://java-freelance.fr/formation/creation-du-groupe-duchessfr#comments</comments>
		<pubDate>Wed, 03 Mar 2010 12:48:36 +0000</pubDate>
		<dc:creator>Mathilde</dc:creator>
				<category><![CDATA[Formation]]></category>
		<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://java-freelance.fr/formation/creation-du-groupe-duchessfr/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Les 2 ans du Paris Jug</title>
		<link>http://java-freelance.fr/formation/les-2-ans-du-paris-jug</link>
		<comments>http://java-freelance.fr/formation/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[Formation]]></category>
		<category><![CDATA[Java]]></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://java-freelance.fr/formation/les-2-ans-du-paris-jug/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Revues de code I</title>
		<link>http://java-freelance.fr/java/revues-de-code-i</link>
		<comments>http://java-freelance.fr/java/revues-de-code-i#comments</comments>
		<pubDate>Thu, 04 Feb 2010 18: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></p>
<p>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://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://java-freelance.fr/formation/evenements-java-en-fevrier-sur-paris</link>
		<comments>http://java-freelance.fr/formation/evenements-java-en-fevrier-sur-paris#comments</comments>
		<pubDate>Tue, 26 Jan 2010 15:01:29 +0000</pubDate>
		<dc:creator>Mathilde</dc:creator>
				<category><![CDATA[Formation]]></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://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://java-freelance.fr/formation/evenements-java-en-fevrier-sur-paris/feed</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Premiers pas avec Scala</title>
		<link>http://java-freelance.fr/java/premiers-pas-avec-scala</link>
		<comments>http://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://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://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://java-freelance.fr/gestion/les-independants-ne-savent-pas-compter</link>
		<comments>http://java-freelance.fr/gestion/les-independants-ne-savent-pas-compter#comments</comments>
		<pubDate>Thu, 24 Dec 2009 14:03:51 +0000</pubDate>
		<dc:creator>Jean-Baptiste</dc:creator>
				<category><![CDATA[Gestion]]></category>
		<category><![CDATA[Charges]]></category>
		<category><![CDATA[freelance]]></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://java-freelance.fr/gestion/les-independants-ne-savent-pas-compter/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Devoxx &#8211; Day 3</title>
		<link>http://java-freelance.fr/formation/devoxx-day-3</link>
		<comments>http://java-freelance.fr/formation/devoxx-day-3#comments</comments>
		<pubDate>Thu, 26 Nov 2009 20:25:29 +0000</pubDate>
		<dc:creator>Mathilde</dc:creator>
				<category><![CDATA[Formation]]></category>
		<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://java-freelance.fr/formation/devoxx-day-3/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Devoxx &#8211; Day 2</title>
		<link>http://java-freelance.fr/formation/devoxx-day-2</link>
		<comments>http://java-freelance.fr/formation/devoxx-day-2#comments</comments>
		<pubDate>Wed, 18 Nov 2009 08:59:12 +0000</pubDate>
		<dc:creator>Mathilde</dc:creator>
				<category><![CDATA[Formation]]></category>
		<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://java-freelance.fr/formation/devoxx-day-2/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Devoxx Day 1</title>
		<link>http://java-freelance.fr/formation/devoxx-2009-day1</link>
		<comments>http://java-freelance.fr/formation/devoxx-2009-day1#comments</comments>
		<pubDate>Mon, 16 Nov 2009 23:44:41 +0000</pubDate>
		<dc:creator>Mathilde</dc:creator>
				<category><![CDATA[Formation]]></category>
		<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://java-freelance.fr/formation/devoxx-2009-day1/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
