<?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>Le blog de Julien H</title>
	<atom:link href="https://blog.developpez.com/julienh/feed" rel="self" type="application/rss+xml" />
	<link>https://blog.developpez.com/julienh</link>
	<description></description>
	<lastBuildDate>Mon, 28 Feb 2011 15:13:41 +0000</lastBuildDate>
	<language>fr-FR</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>https://wordpress.org/?v=4.1.42</generator>
	<item>
		<title>Algorithme de calcul de l&#8217;age</title>
		<link>https://blog.developpez.com/julienh/p6049/java/algorithme_de_calcul_de_l_age</link>
		<comments>https://blog.developpez.com/julienh/p6049/java/algorithme_de_calcul_de_l_age#comments</comments>
		<pubDate>Thu, 10 Jul 2008 09:54:04 +0000</pubDate>
		<dc:creator><![CDATA[morgoth_fr]]></dc:creator>
				<category><![CDATA[Java]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Aujourd&#8217;hui, petit problème d&#8217;algorithmique simple. Comment calculer en Java l&#8217;age d&#8217;une personne à ce jour en connaissant sa date de naissance. Une recherche sur Google ne donne pas de réponse simple. J&#8217;espère que celle-ci le sera. /** &#160;* Compute age of someone. Assume birthday is before today. &#160;* @param birthday Date of birth. &#160;* @param today The date at which you want to calculate age. &#160; &#160;* @return age &#160;*/ public int computeAge(Date birthday, Date [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Aujourd&rsquo;hui, petit problème d&rsquo;algorithmique simple. Comment calculer en Java l&rsquo;age d&rsquo;une personne à ce jour en connaissant sa date de naissance.</p>
<p>Une recherche sur Google ne donne pas de réponse simple. J&rsquo;espère que celle-ci le sera.</p>
<p><span id="more-2"></span></p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;height:300px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">/** <br />
&nbsp;* Compute age of someone. Assume birthday is before today. <br />
&nbsp;* @param birthday Date of birth. <br />
&nbsp;* @param today The date at which you want to calculate age. &nbsp;<br />
&nbsp;* @return age <br />
&nbsp;*/ <br />
public int computeAge(Date birthday, Date today) { <br />
&nbsp; &nbsp; Calendar cBirthday = new GregorianCalendar(); <br />
&nbsp; &nbsp; Calendar cToday = new GregorianCalendar(); <br />
&nbsp; &nbsp; cBirthday.setTime(birthday); <br />
&nbsp; &nbsp; cToday.setTime(today); <br />
&nbsp;<br />
&nbsp; &nbsp; int yearDiff = cToday.get(Calendar.YEAR) - cBirthday.get(Calendar.YEAR); <br />
&nbsp; &nbsp; cBirthday.set(Calendar.YEAR, cToday.get(Calendar.YEAR)); <br />
&nbsp; &nbsp; if (!cBirthday.after(cToday)) { <br />
&nbsp; &nbsp; &nbsp; &nbsp; return yearDiff; //Birthday already celebrated this year <br />
&nbsp; &nbsp; } <br />
&nbsp; &nbsp; else { <br />
&nbsp; &nbsp; &nbsp; &nbsp; return Math.max(0, yearDiff-1); //Need a max to avoid -1 for baby <br />
&nbsp; &nbsp; } <br />
}</div></div>
<p>Si vous avez plus simple, plus lisible ou si j&rsquo;ai fait une erreur, merci de compléter.</p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Imprimante HP C309g sous Mandriva Linux</title>
		<link>https://blog.developpez.com/julienh/p9227/java/imprimante_hp_c309g_sous_mandriva_linux</link>
		<comments>https://blog.developpez.com/julienh/p9227/java/imprimante_hp_c309g_sous_mandriva_linux#comments</comments>
		<pubDate>Sat, 21 Aug 2010 15:12:49 +0000</pubDate>
		<dc:creator><![CDATA[morgoth_fr]]></dc:creator>
				<category><![CDATA[2010.1]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Mandriva]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[J&#8217;en avais assez de batailler avec ma vieille imprimante Epson USB. J&#8217;ai donc fait l&#8217;achat d&#8217;une imprimante multi-fonction HP C309g. Voici un compte rendu pour ceux que ça pourrait intéresser. Tout d&#8217;abord, qu&#8217;est-ce que je reprochais à mon imprimante Epson D78 ? Afin d&#8217;y accéder depuis n&#8217;importe quel PC, je l&#8217;avais branchée sur le port USB de la Freebox. Cela a l&#8217;avantage de la rendre visible sur le réseau (la Freebox sert de serveur d&#8217;impression). [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>J&rsquo;en avais assez de batailler avec ma vieille imprimante Epson USB. J&rsquo;ai donc fait l&rsquo;achat d&rsquo;une imprimante multi-fonction HP C309g. Voici un compte rendu pour ceux que ça pourrait intéresser.</p>
<p><span id="more-3"></span></p>
<p>Tout d&rsquo;abord, qu&rsquo;est-ce que je reprochais à mon imprimante Epson D78 ? Afin d&rsquo;y accéder depuis n&rsquo;importe quel PC, je l&rsquo;avais branchée sur le <a href="http://www.freenews.fr/spip.php?article5548">port USB de la Freebox</a>. Cela a l&rsquo;avantage de la rendre visible sur le réseau (la Freebox sert de serveur d&rsquo;impression). Le problème dans ce cas est qu&rsquo;on accède plus aux fonctionnalités spécifiques de l&rsquo;imprimante (niveau d&rsquo;encre, alignement des têtes, &#8230;). De plus, cette imprimante est très bruyante. Dernier problème : sous Linux, il n&rsquo;y a pas de driver dédié. Il est conseillé sur certains site de prendre les drivers d&rsquo;autres imprimantes Epson, mais la qualité n&rsquo;est pas géniale, et les temps d&rsquo;impression très longs.<br />
Le fait de brancher l&rsquo;imprimante directement en USB sur un PC améliore les choses, mais dans ce cas il faut allumer ce PC si un autre veut imprimer.</p>
<p>Bref, j&rsquo;ai cassé ma tirelire, et j&rsquo;ai acheté la <a href="http://www.amazon.fr/HP-Photosmart-Premium-Imprimante-multifonctions/dp/B002ISG9CA">HP C309g sur Amazon au prix de 147 €</a>.</p>
<p>Première impression : massive (surtout à côté de mon ancienne Epson).</p>
<p>J&rsquo;ai pas voulu tenter le diable, et j&rsquo;ai suivi la procédure d&rsquo;installation en ethernet sous Windows. Après pas mal de temps (faut installer le logiciel et imprimer une photo de test), tout marchait nickel. J&rsquo;ai quand même été obligé de désactiver mon pare-feu&#8230;</p>
<p>Ensuite, c&rsquo;est là que ça devient intéressant : comment la faire marcher sous Linux.</p>
<p>Donc pour récapituler, l&rsquo;imprimante est branchée sur le switch de la freebox en ethernet, et fonctionne sous Windows. Sur le site de HP, je tente de télécharger les drivers hplip, mais on me dit que la Mandriva 2010.0 a déjà une version suffisante, et qu&rsquo;il vaut mieux utiliser les packetages fournis par la distribution. Tant mieux, c&rsquo;est ce que je préfère.</p>
<p>Chez moi tout était déjà installé, mais dans le doute, faites un petit :<br />
<code class="codecolorer text default"><span class="text"># urpmi hplip hplip-gui</span></code><br />
Ensuite vous pouvez lancer l&rsquo;utilitaire HP (hp-toolbox) qui se trouve dans le menu de KDE. Là on vous guide pour installer l&rsquo;imprimante (il scanne le réseau et la trouve automatiquement). A partir de là vous pouvez imprimer une page de test.</p>
<p>Ensuite j&rsquo;ai voulu tester le scanner, car c&rsquo;est ce qui m&rsquo;inquiétait. Dans l&rsquo;utilitaire HP, le bouton &laquo;&nbsp;scan&nbsp;&raquo; ne faisait rien. En regardant dans les paramètres, j&rsquo;ai trouvé qu&rsquo;il est sensé lancer xsane. Qui n&rsquo;était pas installé chez moi :<br />
<code class="codecolorer text default"><span class="text"># urpmi xsane</span></code><br />
Mais ça ne fonctionnait toujours pas.</p>
<p>En regardant sur le net, j&rsquo;ai décuouvert le petit utilitaire hp-check, qui vérifie pas mal de trucs, et qui m&rsquo;a permit de découvrir ce qui manquait :<br />
<code class="codecolorer text default"><span class="text"># urpmi lib64sane-hpaio1</span></code><br />
et également<br />
<code class="codecolorer text default"><span class="text"># urpmi lib64cups2-devel</span></code> (ça ne sert à rien d&rsquo;autre qu&rsquo;à avoir l&rsquo;utilitaire cups-config, qui permet à hp-check de trouver la version de CUPS).</p>
<p>Après ça, <code class="codecolorer text default"><span class="text">$ hp-check -r</span></code> ne retourne aucune erreur ni warning, et j&rsquo;ai pu scanner sans problème.</p>
<p>Il est également possible de scanner depuis une page Web en se connectant directement sur l&rsquo;imprimante via son adresse IP !</p>
<p>Je n&rsquo;ai pas testé le Wifi, mais j&rsquo;ai lu que ça ne posait aucun problème avec la Freebox.</p>
<p>Dernière astuce : l&rsquo;imprimante étant en DHCP, elle va changer d&rsquo;IP à chaque redémarrage, ce qui n&rsquo;est pas bon, car CUPS ne va plus la retrouver, et il faudra supprimer et réinstaller l&rsquo;imprimante. Je vous conseille donc de récupérer l&rsquo;adresse MAC de l&rsquo;imprimante (accessible via l&rsquo;écran tactile), et de modifier la configuration de la Freebox pour lui assigner toujours la même IP.</p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Comparatif des outils de mesure de couverture de code en Java</title>
		<link>https://blog.developpez.com/julienh/p8394/java/les_outils_de_mesure_de_couverture_de_co</link>
		<comments>https://blog.developpez.com/julienh/p8394/java/les_outils_de_mesure_de_couverture_de_co#comments</comments>
		<pubDate>Wed, 25 Nov 2009 13:00:00 +0000</pubDate>
		<dc:creator><![CDATA[morgoth_fr]]></dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Qualité]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Il existe plusieurs outils de mesure de la couverture de code en Java, dont certains open source. J&#8217;ai récemment été amené à comparer le fonctionnement des plus connus d&#8217;entre eux, et je vous livre ici les résultats bruts de ce comparatif. Je tenterai certainement une analyse dans un prochain billet. Tout d&#8217;abord, quelques notions de base. Les différentes métriques de couverture de code Je vous laisse lire l&#8217;article de Wikipedia (plus complet en EN) si [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Il existe plusieurs outils de mesure de la couverture de code en Java, dont certains open source. J&rsquo;ai récemment été amené à comparer le fonctionnement des plus connus d&rsquo;entre eux, et je vous livre ici les résultats bruts de ce comparatif. Je tenterai certainement une analyse dans un prochain billet.</p>
<p>Tout d&rsquo;abord, quelques notions de base. </p>
<p><span id="more-7"></span></p>
<h4>Les différentes métriques de couverture de code</h4>
<p>Je vous laisse lire l&rsquo;article de <a href="http://fr.wikipedia.org/wiki/Couverture_de_code">Wikipedia</a> (<a href="http://en.wikipedia.org/wiki/Code_coverage">plus complet en EN</a>) si ça vous intéresse, mais sachez que les principales métriques utilisées (et utiles) sont :</p>
<ul>
<li>couverture des instructions (!= couverture de ligne)</li>
<li>couverture des branches (if/else, try/catch/finally, &#8230;)</li>
<li>couverture des expression booléennes (ou conditions)</li>
</ul>
<h4>Méthodes de mesure</h4>
<p>Pour mesurer la couverture de code en Java, il faut un moyen de détecter qu&rsquo;on est passé sur telle ligne/instruction/branche et pas sur une autre. Il existe plusieurs méthodes :</p>
<ul>
<li>L&rsquo;utilisation des API de profiling de la JVM (JVMDI/PI)</li>
<li>L&rsquo;instrumentation du bytecode</li>
<li>L&rsquo;instrumentation du code source</li>
</ul>
<p>Passons très vite sur la première méthode. Aucun des outils de mon comparatif ne l&rsquo;utilise. Son principal défaut semble être le surcoût au niveau des performances (overhead).</p>
<p>Reste donc les 2 méthodes d&rsquo;instrumentation. L&rsquo;instrumentation, c&rsquo;est le fait d&rsquo;enrichir le programme original avec des instructions supplémentaires. Ces instructions vont être les témoins que l&rsquo;on est bien passé à cet endroit du programme. Schématiquement, pour mesurer la couverture des lignes de code, il suffit d&rsquo;ajouter après chaque ligne du programme original un petit bout de code qui va dire &laquo;&nbsp;la ligne XXX a été exécutée&nbsp;&raquo;. Ce bout de code va stocker son information en mémoire ou dans un fichier, et à la fin, il suffit de collecter les données et de générer un beau rapport.</p>
<h5>L&rsquo;instrumentation du code source</h5>
<p>L&rsquo;instrumentation du code source va réellement modifier le code du programme avant de le compiler et de l&rsquo;exécuter.</p>
<p>Exemple (schématique) :</p>
<p>Avant instrumentation :</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">public int addition(int a, int b) { <br />
&nbsp; return a + b; <br />
}</div></div>
<p>Après instrumentation :</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">public int addition(int a, int b) { <br />
&nbsp; entering_method(&quot;addition&quot;); <br />
&nbsp; int tmp = a + b; <br />
&nbsp; statement(34); //34 = numero de ligne dans le programme original <br />
&nbsp; return tmp; <br />
}</div></div>
<p>N.B. : Je ne sais pas réellement ce qui est ajouté comme code, sachant que Clover est closed-source, donc ce n&rsquo;est qu&rsquo;indicatif.</p>
<h5>L&rsquo;instrumentation du bytecode</h5>
<p>L&rsquo;instrumentation du bytecode consiste à manipuler le code Java compilé (le fichier .class) pour y ajouter les instructions de &laquo;&nbsp;trace&nbsp;&raquo;. Le principe est donc le même que pour l&rsquo;instrumentation de code source, avec les différences suivantes :</p>
<p>Avantages :</p>
<ul>
<li>pas besoin de posséder les sources du programme (mais dans ce cas on aura que la couverture des méthodes, pas des lignes)</li>
<li>pas besoin de recompiler le programme, on modifie directement le .class</li>
</ul>
<p>Inconvénients :</p>
<ul>
<li>le bytecode n&rsquo;est pas exactement l&rsquo;image fidèle des lignes de code. Le compilateur effectue des optimisations qui peuvent rendre difficile de distinguer l&rsquo;exécution de lignes de code consécutives. Si le code est compilé avec l&rsquo;option debug, il est quand même possible de &laquo;&nbsp;deviner&nbsp;&raquo; la ligne de manière assez fiable</li>
</ul>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Les éditeurs Swing pour Eclipse</title>
		<link>https://blog.developpez.com/julienh/p7485/java/les_editeurs_swing_pour_eclipse</link>
		<comments>https://blog.developpez.com/julienh/p7485/java/les_editeurs_swing_pour_eclipse#comments</comments>
		<pubDate>Mon, 13 Apr 2009 14:58:51 +0000</pubDate>
		<dc:creator><![CDATA[morgoth_fr]]></dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Swing]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Vous avez peut-être remarqué que dans le monde des applications professionnelles, Swing fait son come-back. Cependant, certaines choses rendent encore Swing vraiment rébarbatif. En vrac : API pas homogène (on sent bien que ça a de la bouteille et qu&#8217;il a fallut jouer avec la compatibilité ascendante Composants n&#8217;utilisant pas les generics (c&#8217;est en cours, mais est-ce que ça sortira un jour ?) Manque un bon éditeur graphique (je crois qu&#8217;on dit &#171;&#160;RAD&#160;&#187;) C&#8217;est sur [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Vous avez peut-être remarqué que dans le monde des applications professionnelles, Swing fait son come-back. Cependant, certaines choses rendent encore Swing vraiment rébarbatif. En vrac :</p>
<ul>
<li>API pas homogène (on sent bien que ça a de la bouteille et qu&rsquo;il a fallut jouer avec la compatibilité ascendante</li>
<li>Composants n&rsquo;utilisant pas les generics (<a href="https://swing-generics.dev.java.net/">c&rsquo;est en cours</a>, mais est-ce que ça sortira un jour ?)</li>
<li>Manque un bon éditeur graphique (je crois qu&rsquo;on dit &laquo;&nbsp;RAD&nbsp;&raquo;)</li>
</ul>
<p>C&rsquo;est sur le dernier point que je vais essayer de faire un compte rendu de mes dernières recherches.</p>
<p><span id="more-5"></span></p>
<p>Tout d&rsquo;abord, avant qu&rsquo;on me pose la question, oui, je connais Matisse. Du moins je l&rsquo;ai un peu manipulé à plusieurs reprises. Il a certes de nombreuses qualités, en partie du fait qu&rsquo;il sert de vitrine à toutes les JSR qu&rsquo;on espère voir un jour de base dans le JDK sans avoir à installer des JAR supplémentaires (appframework, beans binding, ..). Mais il a pour moi 2 inconvénients majeurs :</p>
<ul>
<li>C&rsquo;est sous Netbeans, et dans ma société, l&rsquo;outil recommandé est Eclipse.</li>
<li>Le code est non éditable</li>
</ul>
<p>Pour moi, le second point est vraiment gênant. En effet, en fonction de l&rsquo;action à réaliser, j&rsquo;aime bien faire les modifications à la main dans le code plutôt que de passer par l&rsquo;éditeur.</p>
<p>Sous Eclipse, je connais deux outils open-source et gratuits répondant à priori à mes besoins :</p>
<ul>
<li><a href="http://www.eclipse.org/vep/WebContent/main.php">Visual Editor</a></li>
<li><a href="http://code.google.com/p/visualswing4eclipse/">Visual Swing 4 Eclipse</a></li>
</ul>
<p><strong>Visual Editor</strong><br />
<img src="http://www.ibm.com/developerworks/opensource/library/os-ecvisual/VisEdit.gif" alt="VE Screenshot" title="VE Screenshot" /><br />
Visual Editor est un projet assez ancien. Tellement ancien qu&rsquo;il semble abandonné. Sur le site officiel, la dernière version est pour Eclipse 3.2. Cependant, il semble que la société <a href="http://www.soyatec.fr/">Soyatec</a> ait repris les choses en main (merci à eux). Les instructions d&rsquo;installation sont <a href="http://wiki.eclipse.org/VE/Update">sur le wiki</a>.</p>
<p>J&rsquo;ai testé VE sous Windows et Linux. Son principal défaut est de forker un process Java pour chaque composant graphique affiché dans Eclipse (chaque onglet). Et vu que je n&rsquo;ai pas l&rsquo;impression qu&rsquo;il y ait un mécanisme de libération (à moins de fermer Eclipse), on se retrouve vite avec des dizaines de process java dans le gestionnaire de tâches, chacun prenant environ 40 Mo de RAM. Mon astuce à 2 centimes : dès que j&rsquo;ai plus de RAM, je kill manuellement tous les process java (sauf Eclipse bien sûr), et je peux continuer à travailler.<br />
De plus, sous Windows, on a toujours dans la barre des tâches un élément supplémentaire qui correspond au composant qu&rsquo;on est en train d&rsquo;éditer dans Eclipse. Sous Linux, c&rsquo;est encore pire, vu qu&rsquo;on a également une fenêtre flottante contenant la même chose que ce qu&rsquo;on a dans l&rsquo;onglet d&rsquo;Eclipse. Assez pénible à la longue.</p>
<p>Ses avantages :</p>
<ul>
<li>gère tous les layouts de base, dont les GridBagLayout. Il manque cependant la possibilité de pouvoir modifier en masse les GridBagConstraints de plusieurs composants, comme on peut le faire pour les propriétés &laquo;&nbsp;classiques&nbsp;&raquo;</li>
<li>il est possible d&rsquo;exécuter/prévisualiser de nombreux composants, et pas seulement les frames (par exemple les panels), en faisant Run As->Java Bean</li>
<li>s&rsquo;en sort très bien avec du code modifié à la main (sauf qu&rsquo;il semble y avoir parfois des problèmes de cache, il faut fermet et ré-ouvrir l&rsquo;éditeur)</li>
</ul>
<p><strong>Visual Swing 4 Eclipse</strong><br />
<img src="http://rehte.javaeye.com/upload/picture/pic/31403/2a50c896-ab7b-304f-bab6-ed1824b9d4ad.png" alt="VS4E Screenshot" title="VS4E Screenshot" /><br />
Je l&rsquo;ai découvert très récemment. Il semble développé par une seule personne, William Chen. A la première ouverture, c&rsquo;est une réelle surprise par rapport à VE : pas de process forké, donc pas de fenêtre flottante ni d&rsquo;élément dans la barre des tâches. Seule la première ouverture d&rsquo;un composant est un peu longue (j&rsquo;imagine qu&rsquo;il initialise pleins de trucs). A l&rsquo;utilisation, je l&rsquo;ai trouvé très stable.</p>
<p>A noter que VS4E fourni un GroupLayout custo qui n&rsquo;est pas celui du JDK 1.6. Cela est est gênant car requiert une dépendance supplémentaire dans le code. Une <a href="http://code.google.com/p/visualswing4eclipse/issues/detail?id=85">issue est ouverte à ce sujet</a>.</p>
<p>Donc pour moi, ce serait le parfait remplaçant de VE, sauf qu&rsquo;il manque encore les fonctionnalités suivantes :</p>
<ul>
<li><a href="http://code.google.com/p/visualswing4eclipse/issues/detail?id=53">gestion graphique du GridBagLayout</a>. Il est quand même possible de faire les modifs dans le code, et l&rsquo;affichage dans l&rsquo;éditeur est parfait. Cependant, j&rsquo;ai assez souvent mes modifications (GridBagConstraints) qui sont écrasées quand je fais des modifs dans l&rsquo;éditeur.</li>
<li>quelques améliorations d&rsquo;ergonomie. Par exemple si je sélectionne un composant et que je &laquo;&nbsp;sors&nbsp;&raquo; trop vite ma souris de la zone, mon composant n&rsquo;a pas suivi. Je dois repasser ma souris sur l&rsquo;onglet des composants (sans cliquer) pour &laquo;&nbsp;rattacher&nbsp;&raquo; le composant à mon curseur et pouvoir le poser dans la zone.</li>
</ul>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Utilisation de l&#8217;annotation @Generated</title>
		<link>https://blog.developpez.com/julienh/p7928/java/utilisation_de_l_annotation_generated</link>
		<comments>https://blog.developpez.com/julienh/p7928/java/utilisation_de_l_annotation_generated#comments</comments>
		<pubDate>Wed, 05 Aug 2009 14:47:53 +0000</pubDate>
		<dc:creator><![CDATA[morgoth_fr]]></dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Qualité]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Aujourd&#8217;hui, j&#8217;ai découvert l&#8217;annotation javax.annotation.Generated. Je n&#8217;ai jamais vu d&#8217;utilisation concrète de cette annotation, et c&#8217;est bien dommage. Voici idéalement ce qui devrait exister&#8230; Les générateurs de code Tout d&#8217;abord, il faudrait que tous les outils qui génèrent du code fasse apparaître cette annotation. Voici quelques exemples (que j&#8217;utilise quotidiennement) : wsdl2java et les stubs Axis2 javacc Magic Draw (et tous les outils d&#8217;UML) XmlBeans Je pense que je vais soumettre cette idée dans les [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Aujourd&rsquo;hui, j&rsquo;ai découvert l&rsquo;annotation <a href="http://java.sun.com/javase/6/docs/api/javax/annotation/Generated.html">javax.annotation.Generated</a>. Je n&rsquo;ai jamais vu d&rsquo;utilisation concrète de cette annotation, et c&rsquo;est bien dommage.</p>
<p>Voici idéalement ce qui devrait exister&#8230;<br />
<span id="more-6"></span></p>
<p><strong>Les générateurs de code</strong></p>
<p>Tout d&rsquo;abord, il faudrait que tous les outils qui génèrent du code fasse apparaître cette annotation. Voici quelques exemples (que j&rsquo;utilise quotidiennement) :</p>
<ul>
<li>wsdl2java et les stubs Axis2</li>
<li>javacc</li>
<li>Magic Draw (et tous les outils d&rsquo;UML)</li>
<li>XmlBeans</li>
</ul>
<p>Je pense que je vais soumettre cette idée dans les différents bug trackers de ces outils, n&rsquo;hésitez pas à faire de même de votre côté.</p>
<p><strong>Les IDE</strong></p>
<p>Les IDE devraient exploiter cette balise en empêchant le développeur de modifier du code marqué comme @Generated. Bien sûr, le développeur peut retirer la balise et faire des modifs custo, mais dans ce cas le code devient du code qui sera considéré comme manuel. On peut même imaginer que les générateurs de code vérifient la présence de la balise avant d&rsquo;écraser le code lors de générations ultérieures.</p>
<p>Question subsidiaire : comment empêcher un fourbe développeur de supprimer l&rsquo;annotation, faire des modifs, puis remettre l&rsquo;annotation ???</p>
<p><strong>Les outils d&rsquo;analyse de code</strong></p>
<p>C&rsquo;est là que ça devient très intéressant. Dans ma société nous utilisons beaucoup d&rsquo;outils de mesure de la qualité du code. Liste non exhaustive :</p>
<ul>
<li>PMD</li>
<li>Checkstyle</li>
<li>Findbugs</li>
<li>Cobertura</li>
<li>Et Sonar pour piloter le tout</li>
</ul>
<p>Il est très pénible de devoir configurer chacun de ces outils pour ignorer le code généré. En effet, ce code ne doit pas rentrer dans l&rsquo;analyse d&rsquo;un projet, car souvent :</p>
<ul>
<li>Il fonctionne de manière fiable (ou alors c&rsquo;est un bug du générateur, pas du projet)</li>
<li>Le code généré ne respecte pas le code style du projet (donc checkstyle explose)</li>
<li>La couverture du code généré par les tests n&rsquo;est pas toujours intéressante</li>
</ul>
<p>Si tout ces outils pouvaient prendre en compte l&rsquo;annotation @Generated, ce serait génial.</p>
<p>Bonus : l&rsquo;annotation @Generated permet de spécifier l&rsquo;outil responsable de la génération. Par exemple @Generated(value=&nbsp;&raquo;axis2&Prime;). On pourrait donc finement configurer le code à ignorer en fonction du générateur.</p>
<p>Bonus 2 : l&rsquo;annotation @Generated peut se positionner non seulement sur une classe, mais également sur une méthode, un attribut, &#8230; Donc on pourrait au sein d&rsquo;une même classe distinguer le code généré du code manuel !!! Chose qui n&rsquo;est actuellement pas possible de configurer dans les outils que j&rsquo;utilise (en général on exclut un package complet de l&rsquo;analyse).</p>
<p>A suivre&#8230;</p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Compte-rendu de l&#8217;installation d&#8217;une Mandriva 2009.0 x86_64 sur un Lenovo ThinkPad T61</title>
		<link>https://blog.developpez.com/julienh/p6637/linux/mandriva/2009-0/compte_rendu_de_l_installation_d_une_man</link>
		<comments>https://blog.developpez.com/julienh/p6637/linux/mandriva/2009-0/compte_rendu_de_l_installation_d_une_man#comments</comments>
		<pubDate>Sat, 25 Oct 2008 17:17:07 +0000</pubDate>
		<dc:creator><![CDATA[morgoth_fr]]></dc:creator>
				<category><![CDATA[2009.0]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Aujourd&#8217;hui, j&#8217;ai installé une Mandriva 2009 64 bit sur mon portable professionnel. Il s&#8217;agit d&#8217;un Lenovo ThinkPad T61. Voici les compte-rendu de mon installation ainsi qu&#8217;une foule d&#8217;astuces qui j&#8217;espère serviront à d&#8217;autres (éventuellement à moi si je dois réinstaller). Récupération du DVD Tout d&#8217;abord, j&#8217;ai téléchargé le DVD de la Mandriva 2009.0 64bit (par exemple ici). Je l&#8217;ai bien évidemment gravé après avoir vérifié la somme de contrôle MD5 (K3B la calcule automatiquement). Installation [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Aujourd&rsquo;hui, j&rsquo;ai installé une Mandriva 2009 64 bit sur mon portable professionnel. Il s&rsquo;agit d&rsquo;un Lenovo ThinkPad T61. Voici les compte-rendu de mon installation ainsi qu&rsquo;une foule d&rsquo;astuces qui j&rsquo;espère serviront à d&rsquo;autres (éventuellement à moi si je dois réinstaller).</p>
<p><span id="more-4"></span></p>
<p><em>Récupération du DVD</em><br />
Tout d&rsquo;abord, j&rsquo;ai téléchargé le DVD de la Mandriva 2009.0 64bit (par exemple <a href="ftp://ftp.free.fr/pub/Distributions_Linux/MandrivaLinux/official/iso/2009.0/mandriva-linux-free-2009-dvd-x86_64.iso">ici</a>). Je l&rsquo;ai bien évidemment gravé après avoir vérifié la somme de contrôle MD5 (K3B la calcule automatiquement).</p>
<p><em>Installation</em><br />
Une fois le DVD en main, je démarre mon portable, j&rsquo;insère le DVD, et je boote dessus (appuyer sur le bouton bleu ThinkVantage, puis F12 pour choisir de démarrer sur le lecteur optique). Après divers chargements, viennent les étapes classiques :</p>
<ul>
<li>choix de la langue => Europe/FR pour moi</li>
<li>choix du type de clavier => FR pour moi</li>
<li>acceptation de la licence (il y a une licence pour du libre ???)</li>
</ul>
<p>Arrive le seul moment difficile pour des non-initiés : les partitions. Pour moi, c&rsquo;est simple, j&rsquo;avais déjà une vieille Cooker, donc les partitions sont déjà faîtes, il faut juste faire attention à ne pas formater les partitions Windows. Je choisis donc l&rsquo;option &laquo;&nbsp;Partitionnement personnalisé&nbsp;&raquo; et j&rsquo;ai juste à cliquer sur mes partitions existantes pour leur affecter un point de montage (/ et /home). Puis clic sur &laquo;&nbsp;terminer&nbsp;&raquo; et je choisis de formater les 2.</p>
<p>Ensuite, je ne détaille pas trop, j&rsquo;ai choisis l&rsquo;environnement KDE, et je n&rsquo;ai pas pu ajouter tout de suite des médias supplémentaires car ma carte Wifi n&rsquo;est pas reconnue pour le moment (j&rsquo;avais pas envie de sortir un câble ethernet à ce moment).</p>
<p>Après l&rsquo;installation des paquets, et l&rsquo;installation du boot loader, je me rapelle avoir changé le niveau de sécurité sur &laquo;&nbsp;normal&nbsp;&raquo; au lieu de &laquo;&nbsp;élevé&nbsp;&raquo;.</p>
<p>Rien de plus à ajouter ici.</p>
<p><em>Configuration des médias</em><br />
Premier démarrage, tout se passe bien, sauf que je trouve pas le thême graphique très beau (question de goût, je sais). Arrivée sur le bureau dans KDE 4. Premier réflexe, installer les mises à jour. Dans drakconf, je vais dans le gestionnaire de media qui me propose d&rsquo;ajouter automatiquement les sources internet (à ce moment, j&rsquo;ai été obligé de sortir le câble Ethernet ;)). Pas de selection du miroir, je sais pas trop comment il le choisit. Seule action de ma part : j&rsquo;ai activé les backports sur Main, Main32, Contrib et Non-free. A ce moment, le gestionnaire de mise-à-jour se réveille et me propose d&rsquo;installer les dernières nouveautés/patchs, ce que je m&rsquo;empresse de faire.</p>
<p><em>WiFi</em><br />
Mon système est désormais à jour et avec les médias internet configurés (pour PLF on verra plus tard). Première chose à tester : le WiFi. Sur la 2008.1, ça marchait très mal avec mon chipset intel 4965. J&rsquo;utilise l&rsquo;assistant graphique pour configurer le WiFi, et miracle, ça marche dès que je retire le câble ethernet. J&rsquo;ai même la DEL qui s&rsquo;allume. Pour info je suis connecté à une Freebox avec du WPA (TKIP + AES), mais tout est détecté automatiquement, j&rsquo;ai juste à saisir la clé.</p>
<p>Étape suivante, j&rsquo;ajoute les médias PLF grâce au site <a href="http://easyurpmi.zarb.org">easyurpmi</a>. Ça se fait en un clique.</p>
<p><strong>Flash 10</strong><br />
Firefox 3 se lance sans problème, mais viens l&rsquo;épreuve ultime (en 64bit) : l&rsquo;installation de flash. J&rsquo;étais en cooker sur un autre PC (avec une carte graphique ATI je précise), et ça marchait pas top (souvent un carré blanc au lieu de l&rsquo;animation flash, problème de pilote graphique ?). Donc cette fois, je n&rsquo;ai pas téléchargé le RPM sur le site de Macromedia, mais j&rsquo;ai téléchargé le tar.gz et j&rsquo;ai suivi les instructions du <a href="http://forum.mandriva.com/viewtopic.php?t=79750">forum Mandriva</a>. Pour rappel :</p>
<ol>
<li>copier libflashplayer.so dans /usr/lib64/mozilla/plugins</li>
<li># urpmi nspluginwrapper libcurl4 libnss3</li>
<li># nspluginwrapper -i /usr/lib64/mozilla/plugins/libflashplayer.so</li>
<li>redémarrer Firefox</li>
<li>Dans about:plugins j&rsquo;ai bien <em>Shockwave Flash 10.0 r12</em> et les vidéos fonctionnent sur Youtube (avec le son)</li>
</ol>
<p>Maintenant, testons les autres fonctionnalités du portable.</p>
<p><strong>L&rsquo;interrupteur WiFi</strong><br />
J&rsquo;ai démarré en position &laquo;&nbsp;ON&nbsp;&raquo;. Quand je le passe sur &laquo;&nbsp;OFF&nbsp;&raquo;, la DEL s&rsquo;éteint et le réseau se coupe : parfait !<br />
Mais quand je le remets sur &laquo;&nbsp;ON&nbsp;&raquo;, rien ne se passe (pas de réseau, pas de DEL). Je suis oblige de faire</p>
<pre># service network restart</pre>
<p>pour que ça reparte. J&rsquo;ai ouvert un <a href="https://qa.mandriva.com/show_bug.cgi?id=45311">bug chez Mandriva</a>, vous pouvez voter si ça vous importe.</p>
<p><strong>Les touches &laquo;&nbsp;multimedia&nbsp;&raquo;</strong><br />
Les touches de luminosité fonctionnent, mais n&rsquo;affichent pas l&rsquo;OSD comme j&rsquo;avais sur un portable ASUS. Dommage.<br />
<a href="https://qa.mandriva.com/show_bug.cgi?id=43130">Les touches de volume ne fonctionnent pas</a>, ainsi que toutes les autres Fn+F2 à F12.</p>
<p><strong>Touchpad, pointing stick</strong><br />
Ça a l&rsquo;air de marcher, mais je m&rsquo;en sert jamais.</p>
<p><strong>Lecteur de cartes SD</strong><br />
<code class="codecolorer text default"><span class="text">SD Host controller: Ricoh Co Ltd R5C822 SD/SDIO/MMC/MS/MSPro Host Adapter (rev 21)</span></code><br />
Ça marche du tonnerre. A l&rsquo;insertion, KDE m&rsquo;ouvre un petit panel et en cliquant dessus je peux lire mes photos.</p>
<p><strong>Carte graphique</strong><br />
J&rsquo;ai activé les effets 3D de KWin (pas de compiz). Ça marche correctement, mais il ne faut pas s&rsquo;attendre à une fluidité exceptionnelle. J&rsquo;ai essayé d&rsquo;installer Nexuiz, et dès que je le lance, ça plante. Je peux le killer en passant en console (Ctrl+Alt+F1) mais la résolution et la souris restent bloquées. Plus qu&rsquo;à relancer X&#8230;</p>
<p><strong>Indicateur de batterie</strong><br />
OK, ça fonctionne.</p>
<p><strong>Mise en veille</strong><br />
Quand je rabats l&rsquo;écran, la session est verouillée (je suis sur secteur). Si je débranche l&rsquo;alimentation et que je rabats l&rsquo;écran à nouveau, cette fois rien ne se passe (je m&rsquo;attendais à une mise en veille ?).<br />
Le &laquo;&nbsp;Suspend To RAM&nbsp;&raquo; fonctionne très bien et je retrouve mes applications ouvertes et fonctionnelles (même le WiFi se relance correctement).<br />
Le &laquo;&nbsp;Suspend To Disk&nbsp;&raquo; fonctionne également, même si j&rsquo;ai eu un peu peur car l&rsquo;écran est resté noir pendant un long moment avant de restaurer la session.</p>
<p><strong>Divers</strong><br />
La touche ImpÉc ne marche pas. C&rsquo;est une <a href="https://qa.mandriva.com/show_bug.cgi?id=45226">fonctionnalité manquante de KDE 4</a>.</p>
<p>Je compléterai plus tard au fur et à mesure de mes expériences. Si vous êtes intéressés par une fonctionnalité en particulier, n&rsquo;hésitez pas à demander.</p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>POJO, DTO, DAO, &#8230;</title>
		<link>https://blog.developpez.com/julienh/p5344/java/pojo_dto_dao</link>
		<comments>https://blog.developpez.com/julienh/p5344/java/pojo_dto_dao#comments</comments>
		<pubDate>Fri, 21 Mar 2008 10:11:29 +0000</pubDate>
		<dc:creator><![CDATA[morgoth_fr]]></dc:creator>
				<category><![CDATA[Java]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Pour mon premier billet, je vais parler du problème qui me préoccupe depuis que je suis à la recherche du framework JEE &#171;&#160;idéal&#160;&#187; : la gestion des objets au travers des couches de l&#8217;application. Dans les temps anciens, un POJO n&#8217;était qu&#8217;une sorte de struct (comme en C) permettant de stocker des infos. Ces infos viennent généralement de la BD, et sont utilisées dans la couche métier, dans la couche présentation, puis éventuellement retournent en [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Pour mon premier billet, je vais parler du problème qui me préoccupe depuis que je suis à la recherche du framework JEE &laquo;&nbsp;idéal&nbsp;&raquo; : la gestion des objets au travers des couches de l&rsquo;application.</p>
<p>Dans les temps anciens, un POJO n&rsquo;était qu&rsquo;une sorte de struct (comme en C) permettant de stocker des infos. Ces infos viennent généralement de la BD, et sont utilisées dans la couche métier, dans la couche présentation, puis éventuellement retournent en BD.</p>
<p>Avec Hibernate, il est très tentant de créer des POJO représentants les objets métier et de les persister en BD directement (pas de DAO). Il suffit même de mettre de jolies annotations dans le POJO !!</p>
<p>Avec Tapestry 5, il est très tentant d&rsquo;utiliser directement les POJO métier pour générer des formulaires et des tables de CRUD (pas de DTO). On ajoute donc les annotations Tapestry dans le POJO métier ??? C&rsquo;est ici que je me suis arrêté, me doutant que ça n&rsquo;allait pas bien marcher.<br />
<span id="more-1"></span><br />
En effet, bien souvent, on ne veut pas toutes les informations en même temps (par exemple selon les droits d&rsquo;une personne, toutes les infos d&rsquo;un objet ne sont pas affichées). Le problème des annotations est qu&rsquo;on ne peut en ajouter/enlever dynamiquement (à ma connaissance). Par exemple, si je mets l&rsquo;annotation @Required sur l&rsquo;attribut &laquo;&nbsp;nom&nbsp;&raquo; de ma classe &laquo;&nbsp;Personne&nbsp;&raquo;, ce champ sera tout le temps requis dans tous les pages Web où je vais l&rsquo;utiliser.</p>
<p>J&rsquo;arrive donc à la conclusion qu&rsquo;il faut au minimum 2 couches d&rsquo;objets : un objet de présentation, et un objet métier/dao (pour le moment ça ne m&rsquo;a pas posé de problème). La nécessité d&rsquo;avoir un objet de présentation dédié n&rsquo;est pas propre à Tapestry 5. Cherchez sur le net GWT + Hibernate, et vous verrez que le sujet est brulant.</p>
<p>Bon, sauf que dans 90% des cas, mon objet de présentation va beaucoup ressembler à l&rsquo;objet métier (avec peut-être quelques champs en plus ou en moins). De plus, je vais passer mon temps à faire des copie d&rsquo;attributs dans les deux sens (ce qu&rsquo;est sensé faire le framework Dozer).</p>
<p>Un autre cas très concret. Souvent, l&rsquo;objet métier contient beaucoup trop de champs pour être remplis avec un seul formulaire. On utilise alors une succession de pages (wizard) pour remplir petit à petit toutes les informations.</p>
<p>Ce que j&rsquo;aimerais, c&rsquo;est pouvoir exprimer ce découpage avec des objets.</p>
<p>Par exemple, prenons un objet métier &laquo;&nbsp;Personne&nbsp;&raquo;. Cet objet possède les champs : nom, prénom, téléphone, adresse, age<br />
Je veux découper la saisie en 3 étapes :<br />
  1) Saisir le nom+prénom<br />
  2) Saisir téléphone + adresse<br />
  3) saisir l&rsquo;age</p>
<p>Avec Tapestry 5, je peux générer un formulaire et tout le traitement/validation associé à partir d&rsquo;un objet, donc je vais avoir les objets :<br />
PersonneWizStep1<br />
PersonneWizStep2<br />
PersonneWizStep3</p>
<p>Les champs nom et prénom de l&rsquo;objet PersonneWizStep1 vont correspondre exactement aux champs nom et prénom de mon objet &laquo;&nbsp;Personne&nbsp;&raquo;.<br />
Solution 1 : faire de la recopie avec Dozer (pas top)<br />
Solution 2 : créer un objet NomPrenom qui va remplacer l&rsquo;objet PersonneWizStep1 et qui sera un composant (au sens Hibernate) de l&rsquo;objet Personne. Mais bon, on retrouve le même problème. Si en fonction des droits, je veux pouvoir saisir uniquement le nom et pas le prénom (exemple stupide je sais), il me faudrait un autre objet pour y mettre des annotations différentes.</p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>18</slash:comments>
		</item>
	</channel>
</rss>
