Vous aimez ce que vous lisez sur ce blog ?
Envie d'aller plus loin avec véritable formation d'expertise en Java ?
Venez suivre ma formation Masterclasse Expertise Java !

"Même un développeur experimenté a besoin de continuer à apprendre. Et dans cette formation... j'ai appris beaucoup !" - A.G., Java Champion

Sessions intra-entreprises sur demande : contact[at]mokatech.net.
Inscrivez-vous vite !

Astuce : itération inverse

Une petite astuce en passant : comment parcourir une liste en sens inverse, à l'aide d'un itérateur ?
En utilisant un ListIterator, qui dispose de méthodes hasPrevious() et previous() :

List<Integer> nums = Arrays.asList(1, 2, 3, 4, 5);
ListIterator<Integer> it = nums.listIterator(nums.size());
while(it.hasPrevious()) {
    Integer num = it.previous();
    System.out.println(num);
}
5
4
3
2
1

Ca peut toujours servir !

The Coder's Breakfast à DevoxxFR !

Chers lecteurs,

Comme l'année dernière, je suis speaker à DevoxxFR !

J'aurai l'honneur de présenter une conférence sur le thème des Folds, un concept important hérité de la programmation fonctionnelle. Si le nom peut faire peur, le principe est en réalité très simple - mais très puissant également. Haskell (naturellement), mais aussi Groovy et Scala en proposent une implémentation -- et même Java 8 s'y met !

Venez donc me voir le vendredi 29 à 11h45, et vous saurez tout sur les Folds, avec des exemples de code en Java 8 et une pincée d'autres langages !


DevoxxFR-2012-banniere-texte-600-232.png

Critique de livre : AndEngine for Android Game Development cookbook

Book cover [ Préambule Mes chers amis et lecteurs, une fois n'est pas coutume, j'ouvre mes colonnes à un collègue. Hadrien Pierart, qui travaille pas mal sur Android, va vous entretenir ci-dessous d'un livre sur AndEngine, qui a suscité son enthousiasme. Je n'ai plus qu'à vous souhaiter une bonne lecture !]

Il y a quelques semaines, Olivier m'a annoncé qu'il avait à nouveau eu vent d'une recherche de reviewers par Packt Publishing pour faire la revue de leur dernier livre AndEngine for Android Game Development cookbook par Jayme Schroeder et Brian Broyles.

Heureusement pour moi, j'avais récemment parlé à Olivier de mon projet de jeu Android, et il me recommanda de recontacter Packtpub.
Après quelques emails échangés et quelques heures d'attente, me voilà l'heureux propriétaire de cet ouvrage (en version ebook, comme ca, pas besoin d'attendre la poste) !

Lire la suite...

Java Quiz in Unicorn land

Some days ago, ZeroTurnaround, of JRebel fame, published a funny Java Quiz on their website.
It is not very hard, and there are at least 3 different solutions that I know of.

Below is my solution ; but try to find your own before taking a look !

Lire la suite...

Coding challenge : maman les petits avions

Aujourd'hui, je vous propose de jouer aux petits avions, et de vérifier quel prototype vole le mieux.

Pour les départager, nous allons nous appuyer sur la Suite de Syracuse :
En partant d'un nombre initial (entier positif), pour obtenir le suivant :

  • s’il est pair, on le divise par 2 ;
  • s’il est impair, on le multiplie par 3 et on ajoute 1.

On répète l'opération jusqu'à obtenir le nombre 1 (la suite est convergente).

On définit ensuite les termes suivants :

  • le temps de vol total : c'est la longueur de la séquence obtenue.
  • le temps de vol en altitude : c'est la période continue, à partir du décollage, pendant laquelle l'avion reste à une altitude supérieure ou égale à l'altitude initiale (voir exemple ci-dessous).
  • l'altitude maximale : c'est la valeur maximale de la séquence.

Prenons l'exemple du nombre initial 15.

  • Sa séquence est [15, 46, 23, 70, 35, 106, 53, 160, 80, 40, 20, 10, 5, 16, 8, 4, 2, 1]
  • Son temps de vol total est de 18
  • Son temps de vol en altitude est de 11 ([15, 46, 23, 70, 35, 106, 53, 160, 80, 40, 20] = 11 éléments)
  • Son altitude maximale est de 160

Voyons maintenant comment tester nos différents prototypes d'avions.
Chaque prototype a évidemment un nom de code top secret, comme "Enterprise" ou "FauconMillenium". En additionnant les valeurs des lettres qui composent leurs noms, nous sommes capables de déterminer leur nombre initial.
Ainsi : "Enterprise" vaut 1057, et "FauconMillenium" vaut 1544.

Je vous laisse calculer quel modèle vole le mieux, et inventer vos propres prototypes !

Idéalement, il suffirait d'appeler une méthode en lui passant le nom du prototype, pour calculer (et éventuellement afficher) les trois indicateurs.
(Tous les langages bienvenus, utilisez Gist, Pastebin ou autre si votre code est volumineux)

Lire la suite...

Coding challenge !

Je suis tombé hier sur un vieux challenge proposé par Cédric Beust sur son blog :
http://beust.com/weblog/2008/06/27/

Comme je suis en train d'apprendre Haskell, et que ce genre de challenge algorithmique semble particulièrement bien adapté à ce langage, je vous livre ici ma solution.

Quelle serait la vôtre ? Tous les langages sont acceptés.
(Si le code est trop long pour tenir dans un commentaire, ou si ce n'est pas pratique pour des raisons de formatage, postez-le sous la forme d'un Gist par exemple)

Lire la suite...

Gagnez du temps avec Joda Time !

La représentation et la manipulation des dates et heures est un point notoirement faible de Java depuis sa version 1.0 - et je ne vous parle pas des Timezones...
Il existe heureusement une petite librairie fort pratique pour combler ce vide sidérant : Joda Time. Développée par Stephen Colebourne, elle est en passe d'être standardisée au sein du JDK sous la JSR-310 ("Date & Time API").

Si vous ne la connaissez pas encore, suivez le guide !

Lire la suite...

Changement d'hébergeur !

Je viens de migrer votre blog préféré vers un nouvel hébergeur (PlanetHoster), l'ancien ayant une fâcheuse tendance à blacklister arbitrairement les IP "suspectes" (?), vous interdisant régulièrement l'accès au blog.

J'espère que le nouveau vous donnera satisfaction. Comme il possède des serveurs en France, les temps d'accès devraient être également meilleurs.

Il est possible qu'il y ait des perturbations pendant quelques jours, le temps que les DNS se mettent à jour. Mais n'hésitez pas à me tenir au courant si vous rencontrez le moindre problème !

Olivier

Devs vs Threads : une comparaison pifométrique

Dans la religion méthodologie Scrum, les spécifications du produit à développer ne sont pas rédigées dans leur intégralité au début du projet, mais au contraire fournies par le client au fur et à mesure de l'avancement du développement, afin de lui offrir une plus grande réactivité.
Le périmètre courant du projet est matérialisé par le "product backlog", c'est-à-dire un flux priorisé de fonctionnalités à développer, alimenté en permanence par le client, et consommé en flux tendu par l'équipe de développement.

Mine de rien, on est là en plein pattern producteur-consommateur. On pourrait même y voir une certaine similarité avec le fonctionnement d'un ThreadPool, les thread (les développeurs) traitant des jobs (les fonctionnalités) dans leur ordre de soumission.

Question : les bonnes pratiques associées à la gestion des thread pools (en particulier leur dimensionnement) pourraient-elles être appliquées aux équipes de développement Scrum ?

Lire la suite...

TreeSet / TreeMap : petit changement en Java 7

Jusqu'à Java 6 inclus, TreeMap et TreeSet avaient un comportement rigolo, pouvant fournir matière à quiz ou question d'entretien technique.

A votre avis, que fait ce bout de code ?

TreeSet set = new TreeSet();
set.add(new Object());
set.add(new Object());
System.out.println(set.size());

A l'exécution, on obtient une ClassCastException... à la ligne 3.
C'est-à-dire l'insertion du premier objet se passe bien, mais que la seconde provoque une exception.

La raison en est simple : un TreeSet (ou une TreeMap) étant implémenté sous forme d'arbre binaire, il doit comparer les objets entre eux pour les organiser. Or, nous voyons dans le code que les objets insérés n'implémentent pas Comparable, et qu'aucun Comparator n'est fourni au TreeSet.

Le premier objet étant... le premier justement, et donc le seul dans la structure, aucune comparaison n'est effectuée : il devient simplement la racine de l'arbre. A partir du second objet, une comparaison devient nécessaire, et les objets sont donc "castés" en Comparable... ce qui provoque une ClassCastException.

Funky, mais logique, quelque part.

Et bien, tout ceci est fini en Java 7 : on obtient une exception dès la première insertion.
C'est moins drôle, mais ce nouveau comportement est sans doute plus sain. On ne s'en plaindra donc pas.

Et puis, maintenant vous avez une nouvelle anecdote pour épater les convives dans les dîners mondains :)

- page 3 de 35 -