Flashback : pourquoi je passe Freelance

J'ai commencé la programmation très tôt. Parce que c'était amusant.

D'abord, sur l'Apple II de mon grand-père.
Il était composé (l'ordinateur, pas le grand-père) d'une unité centrale avec clavier intégré, surplombé de deux lecteurs disquettes 5"1.4, et finalement d'un écran en noir et jaune. Une disquette (recto/verso) permettait de booter l'OS et de le monter en mémoire. D'autres disquettes permettaient ensuite de charger des programmes (tableur, jeux[1]...) et de sauvegarder les documents.

L'OS en ligne de commandes proposait quelques commandes simples, et c'est ainsi que j'ai tapé pour la première fois le traditionnel "print "hello"" et que, miracle, ça a effectivement affiché "hello". C'était magique.

Note

[1] Dont Olympic Games qui demandait de sérieusement matraquer le clavier pour faire courir les personnages

Lire la suite...

Stream.distinct(), gare à la javadoc !

L'API Stream fournit une méthode distinct() permettant d'éliminer les éléments en doublon.
Sa Javadoc indique :

Returns a stream consisting of the distinct elements (according to Object.equals(Object)) of this stream.

Cette description laisse penser qu'il suffit que nos objets implémentent equals() pour être correctement traités par distinct(), ce qui est faux (ou du moins incomplet).

Lire la suite...

Java Quiz #46 : flagada stream

Maintenant que la rage et la fureur de Devoxx sont retombées, je vous propose de résoudre un petit quiz facile sur Java 8 !

A votre avis, qu'affiche le code suivant ?

Attention, ne trichez pas : interdiction d'exécuter le code avant d'avoir trouvé ! Mais pouvez consulter la documentation de la classe IntStream.

public class Quiz {
    public static void main(String[] args) {
 
        IntStream.rangeClosed(1, 10)
                 .map(i -> i++)
                 .forEach(System.out::println);
 
    }
}
Lire la suite...

Dernières nouvelles du front : MongoDB, Android et Java8

Je profite de la relative accalmie avant le cyclone DevoxxFR pour vous expliquer à quoi j'ai été occupé en ce début d'année, et pourquoi j'ai eu moins de temps - et j'en suis désolé - pour vous proposer des billets croustillants sur ce blog. Vous allez voir, c'était le rush !

Lire la suite...

Java 8 : petit exercice pour s'échauffer le neurone à lambda

A une semaine de Devoxx France 2014 qui risque d'être riche en sessions sur Java 8 et la programmation fonctionnelle, je vous propose un petit exercice pour vous dérouiller le neurone à lambdas.

Le but du jeu est d'écrire une fonction permettant de concaténer un certain nombre de listes, passées en paramètre sous forme de var-arg :

public <T> List<T> concatLists(List<T>... lists);

Evidemment, on essaiera d'utiliser le plus possible de nouvelles fonctionnalités de Java 8 - le but est de s'amuser et de tordre un peu Java, et pas forcément de respecter les bonnes pratiques industrielles.

Allez hop, en route !

Lire la suite...

Java 8 : du neuf dans les interfaces !

java8.pngParmi les nouveautés apportées par Java 8, on en trouve deux qui concernent les interfaces : les méthodes statiques et les méthodes par défaut.

Les méthodes statiques définies sur les interfaces fonctionnent exactement de la même façon que celles portées par les classes, il n'y a donc pas grand-chose à en dire. En revanche, les méthodes par défaut risquent de modifier assez profondément notre façon de concevoir nos API.

En Java 7 et antérieur, une méthode déclarée dans une interface ne fournit pas d'implémentation. Ce n'est qu'une signature, un contrat auquel chaque classe dérivée doit se conformer en fournissant une implémentation propre.

Mais il arrive que plusieurs classes similaires souhaitent partager une même implémentation de l'interface. Dans ce cas, deux stratégies sont possibles (celui qui a dit "copier/coller" viendra me voir à la fin du billet pour une retenue) :

  • Factoriser le code commun dans une classe abstraite, mais il n'est pas toujours possible de modifier la hiérarchie des classes
  • Extraire le code commun dans une classe utilitaire, sous forme de méthode statique (ex: Collections.sort()).

On conviendra qu'aucune des deux n'est réellement satisfaisante. Heureusement, Java 8 nous offre maintenant une troisième possibilité.

Lire la suite...

NoSVN

Non, NoSVN n'est pas un nouveau mouvement qui vise à faire prendre conscience qu'il y a de meilleurs moyens de gérer son code source que ce bon vieux Subversion. Quoique.

En réalité, je voulais partager le petit script windows qui me permet de supprimer récursivement tous les répertoires .svn d'une arborescence. Pratique quand on veut copier/coller des répertoires versionnés sans risquer de provoquer des conflits tous azimuts...

Voici donc la fameuse ligne de commande, à coller dans un .bat (ou en extension de l'explorateur de fichiers pour les plus téméraires) :

for /F "usebackq" %%i in (`dir /S /B /AD *.svn`) do rmdir /S /Q %%i

Hope this helps !

Industrialiser Tiles grâce aux Annotation Processors !

Apache Tiles est un framework populaire permettant d'assembler des pages JSP à partir de fragments réutilisables (ex: entête, menu, pied de page...). Un fichier de configuration permet de décrire la composition de chaque page, et de lui assigner un nom logique. C'est ce même nom logique qui permet ensuite, depuis un contrôleur (Servlet pure, Spring MVC...), de demander à Tiles de construire et d'afficher la page correspondante.

Malheureusement, suite à des renommages - ou tout simplement par étourderie - il est facile de faire des erreurs dans les noms des vues au niveau des contrôleurs. Et l'erreur n'est visible qu'une fois l'application déployée...

Je vous propose ici une technique pour générer automatiquement des constantes Java correspondant aux noms des vues Tiles. Ainsi, plus de typos !

Lire la suite...

Les annotations @Repetables en Java 8 !

java8.jpgComme vous le savez (dans le cas contraire, foncez regarder ma conférence sur les annotations !), il est actuellement interdit de placer plusieurs fois la même annotation sur un élément donné.

Mais ça va changer avec Java 8 !

Lire la suite...

Implémenter le pattern Session Object avec Spring MVC

HTTP est un protocole déconnecté : un client se connecte à un serveur, lui transmet une requête, attend une réponse, et se déconnecte. Bonjour, au revoir, et on recommence à zéro.

Pour servir des documents sur un réseau, c'est parfait ; mais pour interagir avec une application web professionnelle, c'est un peu limité. L'utilisateur apprécie qu'on se rappelle de lui tout au long de sa session de travail, qui peut nécessiter de nombreux cycles requête/réponse.
Pour conserver ce contexte applicatif entre les requêtes, le serveur propose donc la notion de Session. Chaque utilisateur se voit ainsi attribuer un petit coffre-fort personnel, dans lequel les données qui le concernent sont stockées entre les requêtes.

Lire la suite...

- page 1 de 34