Devoxxfr – Effective Java

Là, c’est du sérieux ! Joshua Bloch, l’auteur d’Effective Java vient nous parler de la troisième version de son livre. La deuxième datait de 2008, alors inutile de dire qu’il y a eu des changements depuis.

Joshua ne va pas nous parler de tout son livre (parce qu’il n’a que 45 minutes)

Préférer les lambdas aux classes anonymes

Avant, les classes anonymes, c’était bien (et adapté aux patterns OO). Mais ça n’est plus très pratique avec la programmation fonctionnelle. Donc les lambdas, c’est mieux. Mais avec les comparateurs, c’est un peu plus pratique (puisqu’ils construisent les lambdas à la volée).

Eviter les types sauf si ils sont nécessaires

Dans les lambdas, avec l’inférence de type, oublier les types, c’est cool. Parce que l’inférence de type, c’est magique, mais ça marche. Par contre, ça repose sur les informations des types génériques. Donc utilisez les génériques, sinon les lambdas ne marchent pas.

Utiliser les lambdas dans les enums

Avant, on pouvait faire des enums avec comportement variable grâce aux classes anonymes. Maintenant, grâce aux lambdas, c’est nettement plus facile : il suffit de passer une lambda avec l’opération variable dans le constructeur de l’enum.

Attention aux lambdas

Elles n’ont ni nom, ni documentation. Donc si vous ne comprenez pas ce que fait une lambda, faites-en une méthode. Et les classes anonymes ont quelque avantages :

  • pas besoin d’interface fonctionnelle
  • une classe anonyme a un this, et pas la lambda

Préférez les références de méthodes aux lambdas

Ca rend le code d’autant plus lisible qu’il y a de nombreux paramètres à la méthode. Et dans une lambda, il faut faire attention au nom des paramètres

Parfois, les lambdas sont plus courtes à écrire

Par exemple (x → x) est plus efficace que (Function.identity()).

Attention aux types de référence de méthode

Chaque type de méthode a sa propre déclaration de référence, ce qui peut rendre les choses un peu compliquées (mais toujours plus simples que les lambdas).

Préférez les interfaces fonctionnelles standard

L’exemple est un peu long, mais globalement, l’idée, c’est que si une interface fonctionnelle existe déjà, utilisez-la plutôt que de redéclarer la vôtre. Parce que bon, Java a déjà 43 interfaces fonctionnelles ! Les plus importantes sont UnaryOperator, BinaryOperator, Predicate, Function, Supplier, Consumer. Et puis elles fournissent déjà une API, ce qui limite ce qu’un utilisateur de votre API doit apprendre. En plus, elles fournissent des méthodes par défaut intéressantes (comme Predicate qui fournit combine et negate)

Quand ne pas les utiliser ?

Evidement, quand aucune de ces interfaces ne correspond à votre besoin. Ou alors quand votre interface fonctionnelle définit un contrat clair (comme par exemple Comparator).

Donc, écrivez votre interface fonctionnelle si

  • elle sera beaucoup utilisée
  • elle a un nom clair
  • elle définit un contrat fort
  • elle pourrait bénéficier de méthodes par défaut

Mais n’oubliez pas vos responsabilités : vous définissez une interface, et ça c’est pas de la tarte.

Utilisez les streams avec justesse

Donc un stream, c’est un flux de données traité par un pipeline dans lequel on trouve

  • un générateur
  • zéro ou plus d’opérations intermédiaires
  • et enfin une terminaison

Joshua nous montre ensuite un exemple dans lequel il remplace toutes les collections par des streams. Et c’est illisible. La conclusion est évidente : utilisez les streams avec justesse pour éviter de faire de votre code un bazar sans nom. Notez par ailleurs que les streams de caractères …​ ça ne marche pas. Par ailleurs, dans certains cas, il est difficile de déterminer si les streams seront meilleurs que les itérations traditionnelles.Enfin, la parallélisation des streams donne parfois des résultats désastreux (comme dans son exemple de calcul de nombre de Mersenne où chaque valeur dépend de toutes les valeurs précédents.

Conclusion

Java est maintenant un langage multiparadigme. Choisissez avec soin les parties que vous utilisez.

Publicités

MORR POWAH !

Pour ma webradio en cours de rémission, j’avais acheté un petit amplificateur à brancher sur mon Raspberry. Hélas, j’avais oublié que mes haut-parleurs avaient une impédance de 5 ohms … Ce qui faisait que ma carte Pi-DAC+ ne pouvait sortir qu’un son minimal sur ces chouettes haut-parleurs.

Du coup, j’ai dû demander au fournisseur d’échanger la carte (ce qu’il a fait de bon coeur – je dis ça parce qu’il s’agit d’un fournisseur anglais, qui n’est pas à ma connaissance tenu par les lois de la consommation française).

Et j’ai maintenant un amplificateur Pi-DigiAMP+ ! Je ne l’ai pas encore testé, mais je suis déja satisfait du packaging et de la qualité des livraisons. Et demain, je ferais les premiers tests histoire de voir si je peux sortir quelque chose.

Un peu de projets maison

Bon, j’ai craqué. Après des années à tenter de ne pas faire de hacks domestiques, j’ai enfin entamé deux projets auxquels je réfléchis depuis bien longtemps.

Une nouvelle radio

J’ai depuis longtemps une radio web (une Philips NP 3300), qui ne marche plus vraiment depuis des années, et qui traîne dans ma cave. J’en ai déja parlé, je voudrais l’upcycler à grands coups de raspberry. Et pendant longtemps, j’ai procrastiné. Mais en ce mois de janvier (grâce aussi au dynamisme de mes nouveaux collègues), j’ai enfin lancé le projet en achetant une carte son – qui s’est révélé insuffisante – et en commençant à en discuter sérieusement.

C’est assez marrant à réaliser, et même si je n’atteins pas l’objectif final, je vais faire des trucs marrants pour y arriver.

Une souris de présentation

Parce que si tout se passe bien, je risque de faire un peu plus de présentations publiques.

Et quand j’ai vu Hubert Sablonnière présenter avec sa manette de NES, je me suis dit que les souris spéciales Logitech … c’était pas vraiment pour moi. Et comme j’ai quelques Wiimotes chez moi, je me suis lancé dans l’utilisation de wiimote sous Windows (ben quoi ?). Et c’est franchement facile :

  • avec HID Wiimote, mes wiimotes sont reconnues comme des gamepad sous Windows
  • Et avec Antimicro, je mappe mon contrôleur sur le clavier/souris de ma machine.

J’ai déja avec ça de quoi piloter une présentation (j’ai testé). Mais je veux aussi pouvoir déplacer le curseur à l’écran. Et pour ça, encore une fois, il va me falloir un peu d’électronique pour me faire une barre de senseur en USB, que je pourrais coller sur mon écran. Oh, j’ai des instructions, pas de problème. Il me faut juste un peu … de temps.

Scala, c’est l’histoire d’un type

Hier soir, c’était … chtijug !

Et comme je me suis occupé d’aller chercher toutes les bières (et de les servir), je n’ai pas suivi très attentivement la présentation de Valentin Kasas. Pas de panique, j’ai un collègue qui a produit un article de qualité.

Heureusement, elle est là

Et en la lisant, je ne peux m’empêcher d’avoir … certaines opinions.

Et comme je suis généreux, je vais vous les partager, parce que comme le dit l’inspecteur Harry

(je peux pas m’en empêcher)

A travers les différents éléments présentés (pattern matching, destructuring, méthode apply, case class, implicites), on voit bien que les concepteurs du langage ont cherché à mettre en place dans la JVM un langage aux fondations théoriques solides. Mais je crois profondément que l’intérêt d’un langage n’est pas dans ses fondations théoriques. Sinon, ni Python, ni Ruby, ni Java n’auraient percé, et on ferait tous gentiment du LISP, de l’Ada ou du PROLOG. Or ça n’est pas le cas.

Parce que ces langages, théoriquement puissants, manquent d’ergonomie. Et en l’occurrence, le coeur de mon idée, c’est que l’ergonomie de Scala est clairement défaillante. Défaillante, parce qu’il y a des tonnes de choses qui me semblent implicites, et d’autres qui sont vraiment à la limite de l’overengineering. Sans compter tous ces moments douteux où on sent bien la volonté de faire de « l’avant-garde ».

Bref, Scala, ça n’est pas trop ma came. Heureusement, je crois qu’on aura une présentation de Kotlin bientôt, qui m’a nettement plus intéressé pour l’instant.

Le loup de Wall Street

Lundi soir, j’ai regardé le loup de Wall Street. Un film qui a une sacrément bonne réputation.

Et honnêtement, le spectacle est saisissant. Un peu comme dans Wall Street, le personnage de Jordan Belfort y est décrit comme une espèce d’escroc boursicoteur, qui mise sur la stupidité de ses clients pour se faire des tonnes de pognon. Mais là où Gordon Gekko est décrit comme une espèce de reptile parasite, cet escroc-ci essaye de construire des choses : une famille, une entreprise, une culture. Bref, il a des aspirations qui le rendent attirant aux yeux du spectateur, ce qu’amplifie une mise en scène et un ensemble de dispositifs dénotant la maestria de Scorcese.

Mais, il y a aussi la drogue omniprésente et les femmes nues, éventuellement représentées en position de trophées. Bon, la drogue fait partie d’un imaginaire du trader bien connu, je ne m’attarderais pas trop dessus.

Par contre, les femmes nues … Je n’en peux plus.

Dans un film de trois heures, je dirais qu’il y a facilement 1/4 d’heure, voire 1/2 heures montrant des femmes plus que déshabillées. Et, collision intéressante de calendrier, ça arrive au même moment que les terribles histoires d’Harvey Weinstein, et le plus terrible encore #dénoncetonporc de Twitter. Du coup, je ne vais vous dire que ce film est avant tout une galerie permettant à de vieux producteurs dégueulasses de faire leur marché de jeunes actrices … Mais la défense de DiCaprio (que vous trouverez à la fin de ce chapitre de l’article Wikipedia) ne tient simplement pas : Scorcese et DiCaprio sont clairement fascinés par le personnage, et son apparente chute est montrée juste pour servir de « cache-sexe » devant l’obscénité du personnage présenté. Et de la part d’hommes de pouvoir dans le milieu d’Hollywood depuis vingt ans, ça devient particulièrement répugnant.

J’ai même en fait assez honte d’avoir regardé ce film bien filmé, mais idéologiquement pourri jusqu’au coeur. Franchement, le même film, tourné du point de vue de l’agent du FBI, m’aurait sans doute bien plus séduit.

Ah, et au fait, si vous pensez que c’est une montée de féminisme, elle n’est pas si récente, puisque j’ai aussi arrêté de regarder Game Of Thrones après la première saison à cause des femmes nues jetées à l’écran par HBO pour distraire le spectateur. La seule chose qui vaudrait le coup, ce serait une parité dans cette exposition frontale de nus : voir autant d’hommes que de femmes, ça aurait du sens en 2017. Ne montrer que de femmes, c’est se contenter d’une vision rétrograde de la beauté physique, et considérer les femmes comme des objets de concupiscence plutôt que comme une partie du public, c’est idiot, primaire et dépassé.

Hellboy

J’ai revu hier soir Hellboy.

Bon, dit comme ça, ça n’est pas très impressionant.

Mais … J’ai également lu plusieurs fois les comics dont ce film est tiré (j’ai d’ailleurs acheté le premier tome suite à un premier visionage de ce film). Et si j’avais donné mon avis sur Goodreads suite à cette première lecture, je crois que le film mérite deux ou trois mots.

D’abord (et à mon avis ça compte pas mal) visuellement : comment recréer le style incroyable de Mignolia au cinéma ? C’est impossible. Donc le réalisateur n’essaye pas trop (sauf dans un plan nous montrant les neuf qui sont un). Et il a raison, puisque l’ambiance est visuellement très différente, mais pas inintéressante … Pas inintéressante, mais pas suffisante pour rendre le film inoubliable.

Ensuite, il y a le casting. Ron Perlman qui cabotine pour donner un Hellboy peut-être un peu caricatural n’est pas mauvais du tout dans le genre bougon, mais je crains qu’il manque d’une certaine forme de finesse au moment de faire le choix qui va détruire le monde … ou pas. C’est dommage, parce qu’il est correctement massif, mais ne présente peut-être pas la bonne … faille. Dans le reste du casting, l’agent Myers qui n’est pas dans les comics est un ajout sympathique, une espèce de témoin d’humanité au milieu de la folie du BRPD qui nous relie un peu à ces marginaux. Et puis Liz Sherman … est aussi brillante qu’il le faut. Quant aux méchants, je trouve Raspoutine toujours aussi difficilement perceptible (au sens où ses motivations apocalyptiques sont totallement incompréhensibles), mais l’acteur le rend aussi inhumainement méchant qu’il est nécessaire. Et sa comparse Ilsa Haupstein est également bien campée. Bref, tout ça tourne bien … sauf pour la faute d’intelligence qu’est le chef du BRPD : lâche politicard quand Hellboy est une quête philosophique, il ramène des préoccupations bien trop prosaïques pour être utiles.

Parce qu’en vrai, le secret de cette oeuvre aussi bien au cinéma qu’en comics, c’est que c’est une oeuvre sur la réalisation de soi, quand bien même ça va à l’encontre de ce que veut l’univers. Le courage, c’est parfois refuser. Et ça, quel que soit le média, c’est le coeur de cette oeuvre, et il est bien passé hier soir.

C’est pas encore demain que je vais virer Thunderbird …

Il y a plus de dix ans, j’adorais tester des clients mails/news : Outlook Express, Opera Mail, FoxMail, XNews, et tant d’autres …

Avec l’émergence des clients web à la GMail, tous ces clients ont peu à peu expiré.

Alors quand j’ai vu ce tweet

je me suis fendu d’un essai … rapide. Rapide, parce que si rambox supporte quelques fournisseurs de mail, c’est à travers leur protocole HTTP, et pas IMAP ou POP. Et ça, ça me choque au plus haut point. Parce que bon, il y a bien un module node-imap, alors pourquoi ne pas s’en service ?

Et j’ai beau chercher, je ne vois pas de feature request pour ajouter imap ou pop. Alors quoi ? Ca n’intéresse plus personne ? Je vais faire le vieux con, mais l’avantage de protocoles comme IMAP et POP, c’est d’assurer une compatibilité instantanée avec un bon paquet de fournisseurs de mails en un coup, ce qui paraît une bonne idée, non ?

Une question de modèle

Je suis tombé sur cette question sur Twitter la semaine dernière

Et aussi curieux que ça puisse paraître, ma réponse est un grand oui.

Si demain un site veut utiliser mon CPU pour miner des cryptomonnaies, ce sera avec plaisir.

Parce que le modèle économique de la publicité sur internet a pour moi des limites terribles

  • Comme il s’agit d’un modèle de l’attention, il limite le contenu visible en garnissant les pages web de bandeaux (animés ou non) de pop-ins et autres instrument réduisant mon écran à un panneau publicitaire géant
  • Comme il s’agit d’un modèle de l’attention, il pousse les sites web vers le titre PUTACLIC, l’absence de contenu réel et une économie de l’attention qui réduit à néant les sites de qualité.

Bon, alors, évidement, ce nouveau mode de fonctionnement a des inconvénients clairs :

  • OH MON DIEU MON CPU EST UTILISE ! (parce qu’un CPU d’ordinateur moderne ne fait rien environ … 95% du temps – statistique à vue de nez)
  • Rien n’interdit à un site web de faire du minage et d’afficher de la publicité

Mais je pense que l’émergence d’une économie utilisant mon CPU d’une façon correcte, au lieu de squatter mon écran, pourrait être intéressante.

Comment est-ce que je gère mes services avec Rancher et Consul ?

Mais pourquoi je veux faire ça ?

Admettons que je veuille me mettre aux microservices … ou plutôt aux services packagés dans des conteneurs docker (quelquesoit la taille des dits services).

Je commence par les packager dans des conteneurs Docker et c’est « cool ». Parce que comme ça, je n’ai pas besoin de demander à l’admin sys de déployer du Java partout, mais du Docker.

Donc, j’ai mes services et mon admin a entendu parler (sans doute sur ce blog) d’un chouette truc qui s’appelle Rancher. Et très vite, il veut ajouter une base de données de configuration (parce que mettre les fichiers de config dans les conteneurs, c’est pas terrible … lisez donc 12 factors apps à ce sujet). Donc il me dit d’utiliser Consul. Et Consul, c’est bien pour la config, mais ça fait aussi service registry. C’est-à-dire que ça permet à un service d’en trouver un autre dynamiquement. Un peu comme du JNDI pour les Javaistes … ou du LDAP pour les ancêtres.

Le problème, c’est que Consul fait service registry, et pas service discovery. C’est-à-dire qu’il peut stocker les services, mais pas découvrir quand ils démarrent ou s’arrêtent (enfin pour l’arrêt, si, mais bon, par symétrie, on va considérer ici que ça n’est pas son boulot).

Et comment je fais pour enregistrer mes services ?

Donc, il faut ajouter un composant d’enregistrement, un « registrator ». Coup de bol, il y en a deux pour Rancher :

  1. Gliderlabs registrator
  2. Rancher Registrator

Pourquoi y en a-t-il deux ? C’est assez bien expliqué dans cette chouette question : Do you kill registrator ? Notez que l’auteur de la question est également l’auteur du second registrator … ceci expliquant cela.

Et ça marche comment ?

D’abord, je vous montre le docker-compose.yml, et ensuite on en discute, ok ?

Dans ce fichier, il y a quelques trucs à noter

Attention à la version !

registrator ne supporte l’option useIpFromLabel que dans la branche master. En ancien développeur Java appréciateur des beaux numéros de version, ça me fait mal, mais bon, on me dit que ça marche comme ça dans le monde de Docker …

internal ?

Ca permet à registrator d’utiliser les ports effectivement exposés par les images, au lieu d’utiliser les ports visiobles hors de Rancher, donc ne l’oubliez pas

cleanup, deregister et resync

La doc de registrator est assez claire, mais ça vaut le coup de bien préciser que ces options sont là pour garantir qu’il n’y a pas de services n’existant que dans Consul (ce qui est un peu bête)

useIpFromLabel

A partir de Rancher 1.2, Rancher utilise un système nommé CNI, ce qui fait que l’ip et le port ne sont plus accessibles via le conteneur Docker mais via le label (ajouté dynamiquement par Rancher) io.rancher.container.ip. Du coup, il faut bien signaler au registrator qu’il faut utiliser ce label pour lire l’adresse du conteneur.

Attention aux labels !

Parce que ce registrator est déployé dans Rancher. Il faut donc qu’il soit présent sur tous les hosts (puisqu’il lit la liste des conteneurs depuius le démon Docker local) (d’où le io.rancher.scheduler.global). Il faut également qu’il ait accès au DNS (d’où le io.rancher.container.dns). Les autres options sont moins indispensables.

Et paf !

Une fois que ces opérations sont effectuées, vos conteneurs seront automatiquement enregistrés dans Consul au démarrage, et supprimés de Consul lorsqu’ils s’arrêtent).

Les jeux de l’été 2017

Cet article est en quelque sorte une suite d’un article homonyme : les jeux de l’été.

Et comme le précédent, il liste les jeux auxquels nous avons joué.

Evidement, les précédents demeurent : Piña Pirata et Munchkin se tiennent en bonne forme. Mobile Frame Zero a été abandonné (beaucoup trop compliqué pour nos joueurs). En revanche, nous avons ajouté une extension à Munchkin : Ton destin est scellé. Ca ne change pas follement le jeu, mais ça ajoute quelques éléments bien marrants (j’ai particulièrement aimé les montures, les serviteurs sont quant à eux plus anecdotiques de mon point de vue).

Mais nous avons également ajouté à la ludothèque l’excellent Carcassonne, qui est vraiment chouette. Les règles sont simples, mais leur intersection crée des situations délicieusement tordues, où on peut facilement avoir l’impression de gagner la partie alors qu’un concurrent a posé quelques paysans habiles qui vont retourner le sort en sa faveur au décompte des points. Aussi sympathique que rempli de rebondissements.