Bonne année 2009 !

Chers lecteurs, The Coder's Breakfast vous souhaite une bonne année 2009 !
Stay tuned for more happy days !

Résultats du sondage "votre framework web préféré"

il y a un mois que le sondage "Votre framework web préféré" est disponible dans la ''sidebar'', il est donc temps de dépouiller les votes. Je dois dire qu'avec seulement 20 votes, le résultat ne sera sans doute pas totalement représentatif de l'avis général, mais bon, les absents ont toujours tort, n'est-ce pas.

Voyons donc les résultats :

Framework% de votes# de votes
Aucun : Servlets, JSP, JSTL 10 % 2
Struts 1 10% 2
Struts 2 10% 2
Spring MVC 25% 5
Wicket 20% 4
Tapestry 0% 0
JSF 5% 1
Autre 20% 4

Je suis surpris de voir 20% de "Autres" : il s'agit probablement de Flex et GWT, à moins que certains n'utilisent des technologies plus exotiques comme Stripes, Rife ou ZK ? (voire même, e-Activity ?)

Par ailleurs, je serais curieux de savoir ce que reprochez-vous à Tapestry ? Si vous avez eu une mauvaise expérience avec ce framework, sachez que la version 5 est désormais disponible, et qu'il bénéficie d'une nouvelle architecture. A voir, donc. Les commentaires sont ouverts !

Au coeur du JDK : présentation du Service Provider API

La spécification JAR propose depuis Java 6 une fonctionnalité fort pratique mais relativement méconnue : la Service Provider Interface (SPI). Derrière ce nom peu engageant se cache un mécanisme de découverte et de chargement dynamique de classes répondant à une interface donnée. Son utilisation est heureusement fort simple, et nous verrons ici qu'il est possible de s'en servir comme d'un système de plugins rudimentaire.

Lire la suite...

Java Quiz #25

Que pensez-vous de ce code ?

  1. /**
  2.  * Renvoie un nombre aléatoire entre 0 (inclus) et 'maxValue' (inclus).
  3.  * @param maxValue Borne supérieure
  4.  * @param even Indique si le nombre doit être pair (true) ou impair(false)
  5.  * @return Le nombre aléatoire
  6.  */
  7. public static final int getRandomNumber(int maxValue, boolean even)
  8. {
  9. if (maxValue <= 0)
  10. { throw new IllegalArgumentException("Invalid 'maxValue' value");
  11. }
  12.  
  13. int value;
  14. if (even)
  15. { value = new Random().nextInt(maxValue / 2 + 1) * 2;
  16. }
  17. if (!even)
  18. { value = new Random().nextInt((maxValue + 1) / 2) * 2 + 1;
  19. }
  20. return value;
  21. }

Réponse après les fêtes !

Note : on m'a fait remarquer à juste titre que l'algorithme de génération des nombres était faux ; je l'ai donc corrigé (et testé cette fois...). Rassurez-vous, cela ne change en rien le point technique que ce quiz vise à exposer.

Lire la suite...

Fun with System.out

En me baladant dans la classe java.lang.System du JDK 6.0, je suis tombé sur du code pour le moins surprenant.
Vous croyiez connaître System.out ? Ce champ à l'allure anodine cache en réalité quelques petites bizarreries amusantes...

Lire la suite...

Java BarCamp #2 : compte-rendu (2/2)

Ce billet fait suite à la première partie du compte-rendu du Barcamp de décembre, décrivant la table-ronde portant sur la génération de code.

Pour la deuxième séance, j'ai sélectionné le thème "ESB : Mule et Spring Intégration", car c'est un domaine que je ne connaissais pas. Je n'étais apparemment pas le seul, puisque plus de 15 personnes se sont pressées dans la salle pour profiter des retours d'expérience de Julien Dubois (SpringSource), Nicolas Martignole (le Touilleur-Express) et Florent Ramière (Jaxio) sur ces technologies.

Lire la suite...

Java BarCamp #2 : compte-rendu (1/2)

Ce mardi se tenait le second Barcamp organisé par Octo.
J'en profite pour remercier encore une fois Luc Bizeul pour son organisation impeccable, et pour m'avoir prévenu de l'événement.

Comme la fois précédente, 6 tables-rondes (3 salles x 2 séances) ont été organisées autour de sujets proposés par les participants eux-mêmes. Au final, les thèmes sélectionnés étaient :

  • Le web sémantique : Rest, RDF, OWL
  • Génération de code
  • Devoxx : compte-rendus et annonces
  • Intégration continue : Maven, Selenium, Gant, Gradle
  • ESB : Spring Intégration vs Mule
  • Groovy et Grails
Lire la suite...

L'art de la réunion courte et efficace

Chaise inconfortable Dans un billet récent, Scott Berkun donne 5 astuces pour garder les réunions sous contrôle, quantitativement et qualitativement.
Je vous les résume ici :

  1. Se réunir dans une pièce fraîche, pour éviter l'assoupissement (spécialement après manger).
  2. Supprimer les chaises : les gens debout sont nettement moins distraits. La méthodologie agile Scrum emploie cette technique.
  3. Une alternative consiste à disposer de chaises subtilement inconfortables. Très fourbe, mais ça a l'air marrant.
  4. La réunion doit être animée par un homme (ou femme) à poigne, qui saura la remettre sur les rails au moindre écart.
  5. Distinguer les réunions utiles (de travail) des réunions inutiles (rapports, annonces, présentations...), et n'y convoquer que les personnes réellement intéressées.
Lire la suite...

Perl : rétrospective et futur par Larry Wall

Dans une interview accordée à ComputerWorld, Larry Wall partage ses réflexions sur Perl, dont il est l'inventeur. Outre les origines du langage, nous y apprenons quelques anecdotes intéressantes ou surprenantes : par exemple, Perl a été utilisé pour écrire le pilote d'accès au système de fichiers de Clearcase (tiens donc, ça explique bien des choses...).

Quant au futur du langage, il s'annonce mouvementé. Après Python 3, c'est au tour de Perl 6 de marquer la rupture : la rétrocompatibilité ne sera pas assurée car le coeur de l'interpréteur a été totalement réécrit, et le langage lui-même semble voué à une forte mutabilité ("embrace and extend, please").
A noter aussi le mea culpa sur la syntaxe des expressions rationnelles : "We took it and made it worse"...

RIA : du nouveau chez Sun et Google

Alors qu'AJAX et Flex se partagent le marché des clients riches (RIA ou "Rich Internet Applications"), deux nouveaux challengers viennent de faire leur apparition : JavaFX chez Sun, et Native Client chez Google.

Lire la suite...

Java Quiz #24

Que fait le code suivant ? (astuce : résolution en deux étapes)

  1. public class Switcher {
  2. public static void main(String[] args) {
  3. int i = 0;
  4. int j = 0;
  5. switch (i) {
  6. case j:
  7. System.out.println("A");
  8. case j + 1:
  9. System.out.println("B");
  10. i = 3;
  11. break;
  12. default:
  13. System.out.println("E");
  14. break;
  15. case j + 2:
  16. System.out.println("C");
  17. case j + 3:
  18. System.out.println("D");
  19. i = 10;
  20. break;
  21. }
  22. }
  23. }
Lire la suite...

Google et Yahoo! renoncent à leur rapprochement

Depuis un an, des discussions étaient en cours entre Google et Yahoo! (au grand dam de Microsoft), en vue d'une consolidation du marché de la publicité en ligne.

Il se trouve que le département de la justice américan (DoJ) n'a pas vu ce rapprochement d'un bon oeil, estimant que cette fusion leur octroierait plus de 90% du marché, et a donc préparé un dossier antitrust. Devant l'imminence du dépôt du dossier auprès des tribunaux, les deux géants de la publicité en ligne on préféré renoncer à leur rapprochement. Ce coup de théâtre ouvre la porte à une nouvelle offensive de Microsoft, qui avait déjà tenté une OPA agressive sur Yahoo!...

Python 3.0 enfin disponible

Au début de l'année, je vous avais déjà parlé de Python 3.0, qui s'annonçait comme une version de rupture, un nouveau départ permettant de faire un peu de ménage dans le langage tout en ajoutant de nouvelles fonctionnalités.

Bonne nouvelle, Python 3.0 est maintenant officiellement disponible en version finale !
Je vous laisse lire la documentation et découvrir les changements apportés par cette version.

Jeux et IA : le point en 2008

Le magasine en ligne IEEE Spectrum propose ce mois-ci un article intéressant sur l'intelligence artificielle dans les jeux vidéos.

Le réalisme visuel des jeux s'est amélioré de manière incroyable au cours des dernières années. Les formules physiques de gestion de la lumière, connues et (quasi-)immuables, ont directement bénéficié de l'accroissement de la puissance brute des processeurs.

Le réalisme comportemental, en revanche, est toujours un domaine en pleine expansion. Il touche à la théorie des foules, à l'analyse et à la prédiction dynamique des comportements des joueurs, et reste relativement artisanal, chaque studio possédant ses propres algorithmes. Le problème est que tout ceci est très gourmand en calcul, et que la montée en puissance brute des processeurs a laissé la place à la multiplication de coeurs moins puissants mais mis en parallèle, bien plus difficiles à exploiter.
Ajoutez à cela le fait que l'ensemble des situations possibles de n'importe quel jeu de tir ("FPS") ou de stratégie ("RTS") est infiniment plus étendu que dans un "simple" jeu d'échecs (qui donne déjà du fil à retordre à Deep Blue), et l'on comprend l'ampleur de la tâche restant à accomplir...