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.

Publicités

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.

Authentifier des utilisateurs Couchbase avec OpenID

Attention, pour les non techniciens, ça va piquer.

Donc, j’ai démarré récement une mission, dans laquelle je dois synchroniser une application mobile avec un serveur. le client comme le serveur utilise Couchbase, donc on va utiliser Sync Gateway. Sur le papier, ça paraît tout à fait raisonnable.

Là où ça l’est moins, c’est qu’on ne veut pas stocker de bases d’authentification (la CNIL, tout ça, c’est trop pénible). On va donc passer par de l’OpenID Connect (ce qui est conceputellement très cool). Et comme l’application est mobile-only, on va utiliser ce qu’ils appellent le flow implicite.

Il est assez bien décrit dans la doc de Couchbase Sync Gateway, et en particulier dans ce diagramme

images-003

Présenté comme ça, c’est simple. Mais en fait, c’est rempli de subtilités.

Un token, Quel token ?

D’abord, il faut obtenir le token JWT auprès de votre fournisseur.

Dans mon cas, c’était Auth0, donc un appel à /authorize avec les bons paramètres va renvoyer (via l’url de redirection) le token JWT. Pour ceux qui développent une application JavaFX, il y a une chouette question StackOverflow qui donne un bon exemple … mais je n’arrive plus à remettre la main dessus.

Poster le token ?

Bon alors vous voyez cette jolie image là-haut ? Elle donne toute la doc de Couchbase sur ce qu’il faut faire du token. J’ai essayé pendant une semaine différentes méthodes avant d’utiliser la seule vraie solution : regarder le source !

Ben oui, parce que la sync gateway de Couchbase est écrite en Go.

Donc, j’ai compris assez vite que ça se passait dans le dossier /rest, et en particulier dans le fichier session.go, qui sert de handler pour les urls de … session.

SAUF QUE en go, comme en d’autres langages, on utilise des intercepteurs pour la sécurité. Donc la gestion des authentifications se partage entre handler.go et auth.go. Pour être plus clair, dans handler.go, la gestion de l’authentification se fait dans cette fonction

En fait, si vous regardez le code, vous verrez que h.getBearerToken() lit en fait le token OpenId depuis les entêtes de la requête. Ca fait déja une réponse facile à trouver :

Il faut mettre le bearer token dans les entêtes HTTP, et PAS dans le corps du POST.

Oui, mais quel token ?

Donc, j’en étais là, et à chaque fois que je postais mon token, avec tous les logs activés en mode debug, j’avais à peu près cette suite de messages

Bon, je vous fais grâce des détails, mais dites-vous que ça signifie que mon token est bien passé à la couche go-oidc, qui le refuse. Et là, j’ai dû lire le code environ 2 jours dans tous les sens avant de comprendre.

Alors, autant vous le dire, il y a plusieurs types de token JWT.

maxresdefault

Et en fait, la différence se fait dans l’algorithme. Vous avez le choix entre HS256 et RS256. Et la seule différence, c’est que le RS256 est signé avec un algorithme assymétrique.

Par défaut, Auth0 propose du HS256.

Et évidement, go-oidc ne décode que les tokens RS256. Et le choix de l’algorithme se fait dans les paramètres avancés du client Auth0.

Autrement dit

Utilisez l’algorithme RS256.

Une fois que vous aurez fait tout ça, vous pourrez bénéficier de l’authentification OpenId Connect pour vos synchronisations. Et ça vous créera les utilisateurs automatiquement. Bon, le nom des utilisateurs dans votre sync gateway sera leur id Auth0, mais franchement, vous allez vous laisser arrêter par ce genre de détail ? Moi non plus. D’ailleurs, je m’en vais de ce pas proposer une pull request à Couchbase pour modifier les différents éléments manquants.

Changement de cap

Souvenez vous de l’article Cap sur 2015

Celui-ci en est une suite directe.

Il y a deux ans, j’avais donc décidé de tenter de travailler dans cet énorme multinationale. J’espérais y découvrir des choses …

  • Comment travailler sur des gros projets
  • Comment être efficace dans des organisations complexes
  • Comment discuter avec des clients du CAC40, ou semi-publics
  • Comment faire avancer des projets d’entreprise

J’ai découvert tout ça, et bien plus.

Je ne vais pas détailler tout ça publiquement. Si vous voulez plus de détails, je pourrais vous en donner de façon plus personnelle.

Toujours est-il qu’au bout de deux ans, même si je suis loin d’avoir fait le tour de l’entreprise, j’ai au moins compris une chose, grâce à ce dessin de XKCD

settling

Je dois bien admettre que prendre une décision de travail sur la base d’un dessin peut sembler ridicule … mais il s’agit plus d’un déclencheur que d’autre chose. Un déclencheur qui a bien aidé certaines personnes à me placer dans une orbite plus incertaine, mais aussi plus excitante.

En effet, je rejoins dès mardi Zenika, pour continuer à y fournir mes services de développeur Java un peu expérimenté et d’architecte … un peu moins expérimenté.

Pourquoi ?

Parce que je vais au chtijug très régulièrement, et que Zenika en est un sponsor depuis un moment.

Parce que j’ai vraiment beaucoup aimé aller à DevoxxFr, et que Zenika en est également un sponsor.

Parce qu’au-delà de ça, un certain nombre de consultants Zenika contribuent à l’open-source.

Autrement dit, parce que je me sens plus aligné avec les valeurs de Zenika.

Une nouvelle aventure, donc, dont je ne sais pas encore où elle me mènera.

En tout cas, elle évitera que je me retrouve propulsé au management

dt170216
Ca me fait le même effet

Ou, pire encore, que je me retrouve coincé dans la matrice des buzzwords

index

Et en terme de réalignement des objectifs sur les deadlines, croyez-moi, c’est pas une bonne idée.

Sincèrement, j’espère éviter ça chez Zenika … A moins que je ne le souhaite d’une façon obscure.

En tout cas, une chose est sûre, la nouveauté m’attend dès mardi !

Pourquoi mes messages sont tronqués (ou absents) ?

J’écris ce message histoire de clarifier un peu les choses.

Comme je passe doucement de Twitter à mastodon, j’en profite pour faire un nettoyage dans mes systèmes d’information et pour ajouter un peu de documentation.

Donc, actuellement, pe publie des informations en utilisant les solutions suivantes

flux_de_publication.png

Il y a évidement des troncages, en particulier quand les textes arrivent dans twitter. Mais dans l’ensemble, c’est assez correct.

Il y a toutefois un défaut, que j’ai l’intention de changer. Regardez en bas : Goodreads, WordPress et StackOverflow publient directement dans Twitter sans passer par mastodon. C’est mal.

Et autant pour Goodreads et WordPress, je pense utiliser brutalement le flux RSS, autant pour Stackoverflow, comme je ne publie pas systématiquement mes questions, je pense que je vais garder une publication manuelle.

Mais j’ai une question :

Pour l’instant, je n’ai pas la réponse … mais je pense me décider assez vite.

Bon, cela dit, je n’ai pas non plus la réponse à « comment embarquer un pouet dans WordPress …