Comment ne plus avoir de NullPointerException en Java ?

NullPointerException : l’erreur la plus courante dans un programme Java. On est tous à un moment ou à un autre tombé sur cette exception. Malheureusement, ce n’est qu’en production à 4h du matin qu’elle arrive. On corrige donc le bug suivant :

MonObjet monObjet = null;
…
monObjet.maMethode(); // => NullPointerException

Par un rapide :

if(monObjet != null) {
  monObjet.maMethode();
}

Ce correctif est tout à fait honorable, mais pourquoi ne pas essayer de ne plus avoir aucune exception de ce type ?

Il existe plusieurs méthodes validées par le compilateur pour l’éviter, et donc avant la mise en production. Aucune n’est nouvelle, certaines controversés, mais elles sont toutes étudiées dans la suite de cet article.

(Lire la suite…)

Tests par propriétés

Vous êtes déjà un expert TDD, votre application a une couverture de tests de plus 80%. Mais vous avez le sentiment que tout n’est pas testé, qu’il reste d’obscurs cas que vous n’arrivez pas exprimer.

Pourquoi ne pas demander à un programme de vous aider à tester ?

Vous pouvez déjà passer par le mutation testing. Cette méthode donne une première approche, mais il en existe une autre : les tests par propriétés.

Cette méthode se résume à exprimer des propriétés et de laisser un programme la vérification de celles-ci.

C’est une façon de tester qui provient des langages fonctionnels et donc qui peut paraître étrange si on vient du monde objet « classique ».

Donc regardons plus en détail son fonctionnement et à quoi elle pourrait servir.
(Lire la suite…)

Le Cloud au service de l’intégration continue

Il est bon de commencer par le pourquoi (c.f « start with Why » de Simon Sinek à l’USI 2011). En effet, pourquoi diable pousser le développement dans le Cloud ? Combien de temps me faut-il pour obtenir un environnement prêt à builder jours et nuits ? Combien de temps faut-il entre mon dernier build et la mise à disposition de mon application ? C’est pour répondre à ces problématiques que le passage à un modèle de « Development As A Service » prend tout son sens. Cet article s’inscrit dans la continuité de la réflexion d’OCTO sur ce thème, abordé lors de l’USI 2010 dans « opportunités du Cloud pour la direction des Etudes » .

(Lire la suite…)

Déployer les applications .NET sur cloud

Un de nos derniers projet de recherche et développement a été le développement d’une application de banque en ligne, qui nous a permis d’expérimenter les dernières tendances de développement sur la plateforme .NET.

Quand est venu le moment de déployer l’application, nous n’avions pas de machine disponible. Mais attendez, de nos jours, lorsque l’on a besoin de déployer une application, on peux simplement la publier sur le cloud le plus proche !

Evidemment, nous avons choisi la plateforme Azure. La question était juste de savoir si un tel déploiement allait poser problème ? Va t-il falloir adapter notre application ? Combien de temps cela va t-il prendre ?

Finalement le processus de modification a été beaucoup moins lourd que nous l’avions imaginé : en 30 minute, nous avons été capable de préparer les changements nécessaires et publier l’application sur le cloud.

Mais Azure est beaucoup plus qu’une simple plateforme pour les applications web. Il offre aussi plusieurs types de stockage. l’un d’entre eux étant Azure Blob Storage. Après le déploiement, nous avons décidé d’utiliser Azure Blob Storage pour le développement d’une nouvelle fonctionnalité présente dans notre to-do list.

Cet article est un retour d’expérience sur la plateforme Azure. Il est divisé en deux parties.

La première partie décrit comment porter une application .NET sur la plateforme Azure.
La deuxième partie va montrer comment utiliser Azure Blob Storage pour développer un simple coffre fort électronique.

La suite de l’article a été rédigé en anglais, vous pouvez consulter la première partie ici et la deuxième ici.

Quelques niouses (en) Ruby du mois de Juillet

C’est quoi cet article ? Facile ! Un résumé de l’actualité autour de Ruby du mois passé, pour les techos et les geeks pressés. Retrouvez moi sur ce blog pour des infos de techos à techos.

Pour les plus pressés, une seule chose à retenir pour cette brève : Ruby 1.8 et Ruby 1.9 ont été mis à jour, pensez à upgrader.

(Lire la suite…)

Le filtre de Bloom

Nous allons présenter dans cet article le filtre de Bloom, une structure de données méconnue mais appréciée, tant pour sa simplicité d’utilisation que pour les gains de performance qu’elle permet d’apporter.

Elle a été choisie par l’équipe de Google Chrome pour implémenter la fonctionnalité « Safe Browsing » qui protège les utilisateurs contre des attaques de fishing et contre certains types de malware. Avec Safe Browsing, le navigateur effectue une validation avant de commencer le chargement d’une page. Si l’URL en question est identifiée parmi une vaste blacklist, Chrome affiche une alerte à l’utilisateur.

Le stockage de cette blacklist pose problème, à cause de son volume. Un million d’URL représentées de manière classique occuperaient environ 30MB, soit l’équivalent de l’empreinte mémoire totale du navigateur.

Chrome a choisi de représenter cette liste sous la forme d’un filtre de Bloom, ce qui a permis de réduire la consommation mémoire à deux mégas, et de garantir une validation en temps constant.

Cet article va détailler l’implémentation d’un filtre de Bloom, expliquer ses propriétés principales et proposer plusieurs scénarios d’utilisation concrets.

(Lire la suite…)

Le push web vu par Diffusion – Partie 2

Dans la partie précédente de cet article, nous avons présenté la solution « web messaging » Diffusion de Push Technology, et comment celle-ci se proposait de régler la question du push de messages vers des clients web.

Afin de tester ses possibilités, nous avons réalisé un « proof of concept ». Ce POC vise à agréger des informations de positionnement provenant de véhicules (latitude, longitude, vitesse) au travers d’un service web. Ces informations sont ensuite restituées en « temps réel » sur un navigateur, via un fond de carte Google Maps.

Avant d’aborder les détails techniques concernant l’implémentation de Diffusion, voici ce que nous avons pu obtenir au travers d’une vidéo…

(Lire la suite…)

Le push web vu par Diffusion – Partie 1

Les problématiques de push de messages vers des clients connectés (encore appelé « web messaging ») sont courantes dans les secteurs où l’information varie sur des temps très court, comme la finance, la sureté, la supervision ou encore les réseaux sociaux. Les données doivent être diffusées le plus rapidement possible à de nombreux clients, car ces données n’ont de valeur (ou d’intérêt) que pendant un temps limité.

Pour faire du web messaging, il existe aujourd’hui différentes techniques (polling, « comet » long polling et streaming) qui s’appuient sur des technologies variées (XmlHttpRequest, WebSocket, Flash socket, Silverlight socket, iFrame, RTMP). Le marché évolue d’ailleurs clairement dans ce sens : des solutions, jusqu’à présent concentrées sur la problématique Message-Oriented Middleware (RabbitMQ, HornetQ) offrent désormais une API HTTP, avec pour certaines d’entre elles, une API cliente basée sur WebSocket (même si cette technologie n’est pas encore compatible avec tous les navigateurs).

Nous allons ici parler d’une de ces solutions, permettant à la fois d’assurer une grande compatibilité et de hautes performances : Diffusion. Cet article a pour objet de présenter cette solution. Il se découpera en deux parties :

  • Une présentation des concepts et du framework Diffusion
  • Une présentation plus technique via la mise en œuvre d’un POC

(Lire la suite…)

Le point sur Node

Dans cet article, nous allons faire le point sur Node, une technologie serveur dont tout le monde parle et qui est devenue, en 2 ans seulement, le 3ème projet le plus suivi sur GitHub derrière Rails et jQuery.

(Lire la suite…)

TDD contre les montagnes russes

A l’époque où je ne connaissais pas encore la démarche Test Driven Development, mon travail connaissait des hauts et des bas:

    lundi 11h : questions au client, fait quelques diagrammes, prêt à coder le module xyz
    mardi 18h : programmation et enrichissement de la conception
    mercredi 16h : plus compliqué que prévu, mais je tiendrai le délai de vendredi
    mercredi 19h : stop; je dois revoir encore la conception
    jeudi 12h: décidé de réécrire from scratch; bien plus fluide, code plus propre !
    vendredi 10h : ce midi je passe mes tests! (au fait, ce débogueur est nul).
    vendredi 16h : ça y est, je passe mes tests
    vendredi 19h : panique. Rien ne marche. Raté la bière du vendredi.
    vendredi 21h : déjà 21h mais ça devrait être OK pour la recette.

[Journal de bord - ca 1998]

Mon approche manquait de discipline. Je revoyais en profondeur mon design, sans savoir si le programme marchait ou non. Je cherchais mes erreurs avec un débogueur — cela prenait des heures. Croyant mon programme presque fini, je passais mes tests et découvrais que c’était loin d’être le cas. Mon moral aussi jouait les montagnes russes, passant de l’euphorie (“je suis génial!”) à la rage impuissante (coup de poing sur la table). Pas de quoi inspirer confiance à mes coéquipiers ou mon chef de projet.
(Lire la suite…)