Vite, un chtijug !

Je me demande si je n’ai pas déjà utilisé ce titre …

En attendant, hier soir, c’était chtijug spécial quickies.

HTTPS Everywhere avec let’s encrypt

Le HTTPS c’est mieux pour la confidentialité des utilisateurs. Let’s encrypt est une autorité de certification, dont le client essentiel est certbot.

certbot

Tourne sur n’importe quel Unix (oui oui). Il y a des plugins pour tous les serveurs web, même sur le Raspberry.

Démonstration avec un site Apache

S’ensuit une jolie démonstration avec des poneys en ascii-art. Et tant mieux, parce que certbot a une interface ncurses ! On note tout de suite les problèmes classiques liés à du https : le mixed content (images ou scripts chargés en http, …). Je note également le point « magique » de Let’s Encrypt : obtenir un certificat à la volée, c’est quand même vachement plus rapide que de le réclamer physiquement à un service de sécurité.

Validation du certificat

La partie intéressante de Let’s encrypt, c’est le mode de génération de certificat. Plutôt que d’utiliser la méthode traditionnelle avec échange de mail, ils reposent sur l’exposition d’un challenge en http sur le site pour lequel on veut un certificat. C’est assez malin, car plus facilement automatisable. Et j’imagine que certbot doit pouvoir automatiser ça

Démonstration avec nginx et webroot

Histoire de montrer les capacités de certbot, on refait la démo, mais avec une configuration manuelle, pour nginx.

Intérêt ?

Le certificat est renouvellé automatiquement tous les 90 jours ! Du coup, plus de problème d’expiration. Et ça, pour les noobs de la sécurité comme moi, c’est vraiment cool. Un point important à noter : Let’s encrypt ne fournit que des certificats de classe 1, donc avec une sécurité « moyenne ». Les classes 2 et 3 impliquent des vérifications physiques, qui sont évidement manuelles.

Point bonus : il y a une interface permettant de révoquer les certificats depuis le site de Let’s Encrypt, ce qui provoquera sans doute leur renouvellement automatique.

Ce que la revue de code m’a apporté

Julien commence par nous raconter sa vie de jeune développeur. Et, personnellement, je me reconnais mal là-dedans :

  • la fierté du code produit
  • la propriété du code (c’est le code de Julien)
  • Et enfin, il veut que son code soit beau longtemps

Du coup, ils ont mis en place chez Axa des revues de code avec des rôles identifiés pour limiter les procès en sorcellerie. Malheureusement, j’ai peur que ça ne suffise pas. Du coup, il faut apprendre plusieurs choses (qui, il me semble, font partie de l’expérience du développeur). La première étant évidement de faire preuve de bienveillance envers ses collègues, le fameux « dur avec le code, doux avec les gens ».

Axa consomme environ 5% de son temps à faire de la revue de code. C’est assez peu, vu que ça permet de détecter des bugs (en plus d’assurer une cohérence stylistique des livrables).

A priori, il faut environ 3 mois pour que les revues soient « apaisées ».

A la réflexion, il y a à mon avis quelque chose de complètement biaisé dans le fait que le développeur vienne présenter lui-même son code à un procès en sorcellerie. Il vaudrait sans doute mieux que le code soit défendu par un « avocat » sans que le développeur à l’origine du code puisse être reconnu. Parce que, comme je le dis toujours, le code qui est dans Subversion/Git n’est plus ton code, c’est celui de l’équipe. Et c’est ce qui le rend magiquement sale.

lunrjs

lunrjs est un portage de Lucene pour javascript, utilisé chez Decathlon. Et sur le site de Decathlon, actuellement, quand on change un filtre de recherche, la page est visiblement rechargée (ce qui n’est pas terrible en termes de performances). Un portage, mais un peu restreint, puisqu’on perd par exemple les recherches de termes approchants.

A noter qu’actuellement, le catalogue produits de Decathlon est hébergé en SAAS, ce qui est … osé, je trouve.

Cela dit, je n’ai pas trouvé ça si impressionnant. Parce qu’il existe déja des tonnes d’API javascript pour exploiter le local storage « correctement ». En fait, le seul intérêt de lunrjs, c’est de compléter les recherches disponibles dans Lucene pour les déconnexions, mais je trouve le cas d’utilisation assez rare pour ne pas investir spécifiquement dessus. A mon sens, travailler sur une vraie API client/serveur dans le navigateur permettrait plus facilement d’attaquer ce type de problème. Sauf, bien sûr, si l’objectif du projet est précisément d’étendre Lucene, mais c’est plus de l’ordre du patch que de l’évolution en profondeur.

Cerberus

Donc, cerberus est un outil de test fonctionnel automatique. Des outils comme ça, il y en a … déjà … des tonnes. Alors pourquoi La Redoute s’est lancée dans cette guerre des tranchées ? Comme d’hab, l’hubris (autrement dit « il n’existait pas de solution correspondant à leur besoin »). Cerberus se place donc entre les différentes équipes, pour fournir un référentiel commun. ce qui implique également que les tests puissent être décrits par les fonctionnels ou les développeurs. Et comme un outil comme HPQC, il offre tout un tas de fonctionnalités, comme le support multi-technologies, multi-langues, multi-environnements l’exécution adaptative des tests, la génération de rapports ou l’intégration dans les outils de développement du SI (IC, bug tracker, …).
Bon, j’avoue, j’ai décroché lors de la démo. Parce que vraiment, on est face à de l’outil de test fonctionnel très haut niveau, où les étapes peuvent être effectuées manuellement ou automatiquement. Ce qui ne m’inspire qu’une chose : ces outils ne sont pas faits pour le monde d’aujourd’hui, mais pour les bonnes grosses applications traditionnelles des entreprises qui ont encore des équipes dév, fonctionnelles, test, différentes, et des processus de livraison longs et lourds. Dans ce cadre, j’imagine que ça doit marcher. Mais dans le cadre hyper-mouvant du web de 2016, je ne suis pas sûr que ça bouge assez vite.

Conclusion

Je peux paraître un peu dur avec certains des talks, mais ça n’est pas mon but. Le contenu ne m’a peut-être pas autant intéressé que les orateurs l’auraient souhaité, mais ça n’ôte rien à leur prestation. Les quatre présentations étaient en effet bien préparées, construites, bien organisées. C’est juste que chaque auditeur met ses propres filtres sur les sujets qui lui sont présentés … Bravo encore au chtijug qui arrive toujours à trouver des choses intéressantes à nous présenter (eh oui, ça n’est pas parce que ça ne m’a pas plu que ça n’était ps intéressant).

Vendredi, c’était TakeOffConf

Vous ne connaissez pas la TakeOff ? la conférence la plus barbue au nord de la Seine ? Tant pis pour vous. Par une chance extraordinaire, j’ai pu obtenir une place pour assister aux conférences du Vendredi … Mais du fait d’obligations, je n’ai pu voir que celles du matin. En voici un rapide compte-rendu.

How to rescue tech migrants from Brexit

Un talk « tongue in cheek » expliquant que les anglais allaient fuir leur pays pour venir se réfugier … à Lille. Il recense quelques bonnes habitudes à prendre pour intégrer les nouveaux, comme par exemple trouver un tuteur pour les nouveaux arrivants, faire en sorte de vaincre les problèmes d’I18n/l10n comme par exemple

  • Vaincre la barrière de la langue
  • Les foutus claviers différents

C’était pas mal, et très flatteur pour Lille

Create modern web APIs in minutes

Ca parle d’API Platform, en PHP

Il y a plein de standards de description d’API

  • Swagger
  • JSON-LD (standard W3C), déjà utilisé et compatible web sémantique
  • Schema.org vocabulaire ouvert pour le web, hébergé par le W3C, compatible JSON-LD
  • Hydra
  • RAML

API Platform, donc, permet de développer une API en PHP et supporte tout ça, ainsi que tout un tas de features habituelles comme la pagination, le filtrage, l’auth (JWT, Oauth), le cache, CORS. Bon, je suis un peu passé à côté en bon développeur Java(EE).

Sharing code between web and native mobile apps

Dans le développement mobile, maintenant,

  • Web => Audience
  • Native app => rich experience.

Du coup, les deux sont nécessaires. Et donc NativeScript fournit un truc qui ressemble à ionic pour Angular 2

Le plus gros avantage, c’est qu’avec electron, on peut aller jusqu’aux applications Desktop

Il y a néanmoins un système de distribution curieux avec WebPack et des extensions de fichier selon le canal d’utilisation. mais là, c’est sans doute ma méconnaissance du sujet qui parle.

Let your devices talk to each other

Dans l’IoT, les données sont centralisées (et pas stockées sur les machines). Et c’est galère quand les serveurs tombent en rade. Au contraire, en M2M, les données sont décentralisées. Du coup, pourquoi ne pas utiliser les concepts du second dans le premier ? Par exemple, en laissant les devices se découvrir en P2P. Mais comment se connecter en P2P sur un réseau local ? En utilisant de la discovery (Bonjour, JmDNS, UPnP)

Et que vient faire CouchBase là-dedans ?

Présenter Couchbase Lite ! En ayant une base de données locale synchronisable avec le serveur, on permet plus facilement la déconnexion du serveur. Et la base peut se synchroniser en P2P. Clairement, ça aurait pu me servir il y a des années.

Building a Web API with Hanami

Pas de monkey patching, pas de method_missing … Construit en opposition avec Ruby on Rails, autrement dit. C’est un framework web pour Ruby qui semble assez élégant et conçu autour de concepts très simples. Mais bon, comme pour le PHP, ça ne me touche qu’à moitié.

Elixir a language for the Future

Dans ma mémoire, c’est un framework web basé sur Haskell … mais en fait, c’est un langage pour le futur.

Pour le speaker, le futur est

  • Dynamique
  • Concurrent. Et pour ça, Ericsson a inventé … Erlang !

Du coup, Elixir, c’est

Ruby+Erlang+steroids=Elixir !

Quelques éléments sont bluffants, comme le pattern matching sur les paramètres de méthode. D’autres sont … moins impressionnants, comme l’utilisation de tous les coeurs qui surprend en Ruby, mais vraiment pas en Java.

Et c’est tout ?

Ben oui, c’est tout. le reste du temps, j’étais pris. Cela dit, c’était un chouette moment.

Petit projet d’hiver : une webradio sur raspberry

Il y a quelques années, j’ai acheté une radio philips NP 3300. C’était un chouette petit gadget qui me permettait d’écouter des radios sur le web (bon, ça, c’est sympa, mais sans plus), mais aussi toute ma bibliothèque musicale via UPnP (oui, encore un protocole qui n’a pas perçé). Et tout ça en se connectant en wifi au web. Et c’est très cool.

Ca marchait bien au début.

Et très vite, on a rencontré des soucis : l’appareil ne trouvait pas les radios, ou alors il restait complètement bloqué et on devait redémarrer. En plus, les rares mises à jour n’ont jamais apporté de corrections, mais juste des saletés comme le support de Spotify. Spotify … Quand je peux avoir toute ma bibliothèque UPnP ! Quelle honte.

Donc, depuis quelques temps, ce petit appareil dort dans un coin du salon. Et c’est très frustrant. Parce que quand il marche, le son est bon.

Du coup, en bon vieux geek qui a déjà mis en place un raspberry, j’avais déjà vu « quelques trucs » qui avaient l’air cool (connecter des trucs comme un écran LCD, des boutons, des haut-parleurs, ou alors installer une webradio). Et j’y ai réfléchi. Et encore réfléchi. Et donc, aujourd’hui, j’ai pris le taureau par les cornes. J’ai démonté mon NP 3300 pour regarder ce qu’il y avait dedans histoire de savoir quelle était l’ampleur de la tâche.

Il va donc me falloir

  1. Un raspbery 3 (pour avoir le wifi déjà configuré, c’est pratique !)
  2. Une carte MicroSD d’au moins 8 Go
  3. Un moyen d’alimenter mon Raspberry depuis une alimentation 9V/1.1A
  4. Une connexion pour mes deux hauts-parleurs 6 ohms/1.5 Watts (pour lesquels je n’ai, semble-t-il qu’une paire de câble directement connectés à la bobine)
  5. Une connexion pour les boutons sur le dessus de l’appareil … c’est une nappe de 13 fils dont un rouge … la masse, j’imagine)
  6. Une connexion pour l’écran LCD. Et là, je dois dire que je suis bien embêté, parce que la nappe de l’écran intègre également la LED de la télécommande infrarouge.

D’où le terme de projet d’hiver : tout ça va être sans doute assez long à mettre en place. J’essayerai de rassembler tout ça sur ce blog, histoire d’avoir une trace du bazar. Mais ça pourrait ne pas être simple.

Je ne suis pas hypersonic sur CodinGame

Depuis deux ou trois semaines, avec quelques collègues, nous avons créé des comptes CodinGame et nous nous sommes lancé dans les jeux pour programmeurs qui y sont disponibles.

Au début, c’était simple …

Et puis, il y a deux semaines, ils ont lancé Hypersonic. Bon, hypersonic, c’est pas bien compliqué, c’est faire jouer un bot que vous programmez. Donc j’en ai codé un.

Et j’ai fini quasi-dernier en bronze.

Vous pouvez lire le post-mortem que j’ai écrit pour y voir les leçons techniques.

J’en tire quelques autres leçons, plus humaines.

La première est assez logique, pour un jeu : c’est la chose la plus amusante, la plus prenante, et la plus crispante que j’ai codé au moins cette année, et facilement ces cinq dernières années. Imaginer un algorithme, le développer, et le voir se comporter, même mal, a ce côté démiurgique qui est la raison pour laquelle je suis développeur. Le corollaire évident, c’est que je ne comprend toujours pas pourquoi mon métier est aussi chiant actuellement : j’ai utilisé des méthodes professionnelles pour développer ce bot : tests, profiling, … Et c’était vraiment amusant. J’en tire la conclusion que notre métier est chiant parce que les demandes des clients sont, la plupart du temps, d’un ennui mortel.

La seconde est assez logique, mais moins drôle : j’ai fini 1675ème ! C’est médiocre, évidement. Et c’est vrai que mon bot était médiocre : des timeouts partout, et des décisions suicidaires encore plus souvent. J’ai pris une vraie leçon d’humilité, ce qui est toujours bien.

La dernière est plus intéressante : on est certes loin du fameux « meilleur programmeur de France », mais il y a beaucoup de monde, et qui semble prêt à y passer beaucoup de temps. Autrement dit, les développeurs sont des gens passionnés, prêts à se confronter les uns aux autres, et à communiquer autour de leurs succès ou de leurs échecs.

Développeurs, il est temps de changer le monde !

A la suite de mon article précédent, j’ai réfléchi (un peu).

Et plusieurs idées ce sont assemblées dans ma tête. Je vais essayer de les articuler correctement, mais ça n’est pas si facile …

Vous vous souvenez de la matinée sur le rôle social du développeur à Devoxx ce printemps ? Non ? Dans ce cas-là, j’en ai parlé :

Et je vous invite à relire ces articles pour bien comprendre de quoi il s’agit. L’idée que j’ai tiré, sans originalité, il est vrai, de ces quatre conférences, c’est que la révolution industrielle de l’informatique va changer la donne, comme les précédentes. Pour mémoire, la révolution de l’imprimerie n’a pas vraiment été une bonne chose pour les moines copistes.

Il est déjà évident que la plupart des tâches pilotées par des workflows sont maintenant totalement définies par l’ordinateur (pensez par exemple aux centres d’appels, à la gestion des interventions des grandes entreprises, les remboursements de notes de frais, …).

Mais d’autres domaines vont bientôt tomber dans l’escarcelle des informaticiens : la bancassurance, la médecine. Le plus important étant évidement l’implémentation de la loi. En effet, si la loi est implémentée par du code (c’est le cas du code des impôts, par exemple), ce n’est plus vraiment le politicien qui choisit comme l’impôt est prélevé, mais le code écrit par un informaticien, quand bien même c’est un sous-traitant d’une grosse SSII en contrat avec le gouvernement.

Or actuellement, nos représentants politiques (députés, maires, ministres), sont là pour … nous représenter, parce que leur connaissance de la loi est plus grande, parce qu’ils sont des personnes clé.

En conséquence, on retrouve par exemple dans l’assemblée nationale (je ne retrouve plus les statistiques que j’avais pu consulter il y a quelques années)

  • des avocats
  • des notaires
  • des médecins
  • des fonctionnaires (je sais, ça n’est pas un métier, mais un statut), au premier rang desquels une palanquée d’inspecteurs des impôts.
  • et un agriculteur

Est-ce qu’il y a des informaticiens dans le tas ? je ne crois pas, non.

Est-ce qu’il y a des gens qui comprennent ce qu’est réellement la révolution numérique ? Je suis à peu près certain que non.

Alors ?

Qu’est-ce qu’il faut faire ?

Vous vous doutez bien de la terrible réponse que je vais apporter : nous, les pionniers du digital, devons trouver des représentants, des champions, et les aider à prendre des responsabilités politiques, pour éviter que les politiques ne décident un jour que toutes ces histoires d’ordinateurs sont décidément trop dangereuses pour leur pouvoir, ce qui arrivera forcément.

Les politiciens professionnels ont fucked-up ma démocratie

Le titre est inspiré d’un excellent talk de Quentin Adam, petit entrepreneur du web désabusé par la gestion comptable de l’informatique d’entreprise.

Et personnellement, ce ne sont pas les comptables qui me gênent le plus.

Non.

Ce qui me gène, ces temps-ci, c’est de voir des femmes et des hommes politiques baser leur prochaine élection (qu’elle soit présidentielle ou législative) sur une tenue de bain.

Ce qui me gène, ces temps-ci, c’est de constater que le calcul politicien se base et attise la peur terroriste.

Ce qui me gène, ces temps-ci, c’est de voir des délinquants multi-récidivistes tenter d’obtenir de mon vote une immunité à la Koh-Lanta valable juste 5 ans, en attendant que leurs responsabilités dans des crimes de guerre soit établie.

En conséquence, je décide ici qu’aucun parti n’appelant à la haine de l’autre, sous quelque forme que ce soit, n’aura mon vote.

Qu’il s’agisse de supprimer les menus de substitution, de condamner le port d’un vêtement, fût-il le niqab, de fustiger les prières de rues de quelque religion que ce soit, de menacer des lieux de culte, aucun parti n’agissant ici n’aura ma voix.Et franchement, je vous encourage à bien réfléchir aux gens que vous soutiendrez. Est-ce que ceux que vous soutiendrez voudront toujours de la France telle qu’elle est ?Est-ce que la liberté de tous et de chacun de vivre, croire, aimer, sera leur priorité ?Est-ce que l’égalité des femmes, des hommes, quelque soit leur origine, quelque soit leur croyance, quelque soit leur mode de vie, quelque soit leur richesse, sera leur aspiration ?Est-ce que la fraternité, le respect, l’envie d’aider, sera leur but ?Si vous ne le croyez pas, ils ne détruirons pas seuls la France. Vous serez leurs complices.Et je ne sais pas si c’est votre cas, mais en tout cas, je ne veux pas en être complice.Sans doute que tout cela me rendra spectateur de la prochaine élection. Spectateur malheureux, bien sûr. Mais je préfère encore ne pas voter, que de trahir le sens même du vote.

Les jeux de l’été

Parce que bon, les NAS, le code, tout ça, c’est parfois un peu chiant.

Et comme c’est la fin de l’été, et que j’ai passé mes vacances en famille, je pense pouvoir lancer une série annuelle d’articles sur les jeux auxquels on a joué (en famille, donc de 11 à 40 ans).

1359cd8488bb1c62b4974191f3ccd2ff161e

Piña Pirata

La première partie commence comme un Uno. Et puis très vite (à chaque fin de partie, en fait) de nouvelles règles s’ajoutent, on peut tout poser sur un lapin, on pioche avant de donner, de reprendre des cartes, et au bout du compte ma femme gagne sur un plan B que personne n’avait vu sortir.

C’est la deuxième année qu’on le prend, et à chaque fois on s’amuse vraiment bien.

En bonus, les cartes sont jolies, les parties raisonnablement équilibrées, et si une partie complète peut durer 1H30/2H, une simple donne va beaucoup plus vite.

Munchkin

b739cbf9deb4df5bdf24aceb6990a99a1cec

Acheté sur la foi d’un tweet

Juste avant le départ en vacances, j’ai réussi à le vendre à ma femme en utilisant un argument spécieux tiré quasiment tel quel du dos de la boîte « en fait, on va un peu jouer à Kaamelott ».

En vrai, ça n’est pas du tout ça. Et si le hasard est bien plus (voire beaucoup trop) présent que dans Piña Pirata, on a passé quand même quelques bons moments (et quelques moments frustrants pour les perdants, parce que quand ça veut pas, ça veut vraiment pas).

Du coup, évidement, on va acheter prochainement quelques extensions (en plus de jouer à Munchkin épique – à télécharger chez edgeent.com).

Mobile frame zero

campaigner-mfc398-umfl-stand

Là, on change de catégorie : ça n’est plus de jeu de société qu’il s’agit, mais de jeu de plateau. Et même, plus précisément, de jeu de combat tactique au tour par tour, dans l’esprit de Confrontation, ou de petites parties de Warhammer batailles.

La différence essentielle, pour tout le monde, est que les robots ne sont pas des miniatures à acheter à prix d’or dans une boutique exploitant la frénésie de consommation des adolescents, mais à fabriquer soi-même (ou en famille) avec des briques lego. Un certain nombre de sites fournissent d’ailleurs des instructions de montage, instruction nécessitant généralement des pièces modernes que nous ne voulions pas utiliser.

Donc on a commencé par une phase de trois heures de fabrication de robots en lego respectant un encombrement donné.

Et le lendemain, on s’est tapé une partie « rapide » (de 2 heures et un tour de jeu complet) à l’issue de laquelle mes enfants avaient détruit l’un de mes robots, et en avaient réduit un autre à l’état de simple marcheur.

Et pour le coup, même si certains aspects des règles (téléchargeables gratuitement en français) sont un peu ambigus, et que nous manquions de dés (genre il faut facile 6 dés par robot, ce qui nous en aurait fait une quarantaine, on se serait cru à Shadowrun), c’était un sacré bon moment

Mon NAS …. amélioré

Il y a quelques temps, j’avais failli perdre mon NAS. J’avais donc remplacé mes disques, et remplacé le firmware d’origine par Alt-F. Et ça marchait … à peu près bien.

J’avais juste un problème lié au fait que rss2imap prenait environ 100% du CPU, tout en ramant comme un malade et en empêchant totalement mldonkey de fonctionner ben quoi, moi aussi je télécharge des distributions Linux).

J’y ai donc un peu réfléchi … et je me suis donné deux pistes de résolution pendant mes vacances

  1. Transformer mon vieil iBook en serveur : je peux y faire tourner du Python (merci MacPorts) et xDonkey
  2. Acheter (argh) un Raspberry PI, et y installer tout ce qu’il faut

Comme mes vacances sont finies (re-argh), j’ai pu tester ces deux pistes, et j’en ai tiré quelques conclusions

  1. Utiliser l’iBook marche bien pour rss2imap, par contre xDonkey refusait de se connecter aux serveurs du web
  2. J’ai donc fait l’acquisition d’un Raspberry Pi 3 (avec le wifi, le bluetooth, et tout ce dont on peut rêver) … et ça marche bien !

Donc, oui, j’ai maintenant un raspberry caché sous ma freebox (et non pas dans ma freebox) sur lequel j’ai l’intention de faire tourner l’ensemble des éléments consomateurs de ressource (Python, mldonkey, lighttpd) pour ne laisser sur le NAS que la diffusion de contenu (donc le serveur ssh, et minidlna).

Du coup, j’ai à nouveau un iBook qui ne sert à rien, que j’ai posé à côté des deux ordinateurs de bureau que j’ai à la cave (et qui ne servent eux aussi à rien). Que faire de tout ça ?

La France en déreliction

Alors là je vous calme avec mon mot inconnu. Je vous laisse chercher

Donc, j’étais en vacances pendant trois semaines, avec comme seule connexion avec le monde une bonne vieille radio FM.

Et, pendant ces vacances, la France a connu quelques drames :

  • un camion fou conduit par un déséquilibré manifeste a tué une centaine de personnes lors du 14 juillet à Nice
  • Et un meurtre odieux commis dans une église

Pour être bien clair, et je crois l’avoir déjà écrit ici, la violence, le meurtre, sont des actes ignobles, quels que soient ceux qui les commettent (et j’inclus dedans les policiers incapables de refréner leurs pulsions homicides)

Ces deux actes ont reçu de nos élites politico-médiatiques la même qualification d’actes terroristes, dont les musulmans devaient se désolidariser blablabla.

Agir localement

Mais, avant d’aller plus loin, deux observations troublantes

  1. Ces actes ont été commis alors que l’état d’urgence était en cours
  2. L' »attentat » du 14 juillet a eu lieu dans une ville largement surveillée par des caméras de vidéo-protection (le néologisme est dans ce cadre particulièrement désastreux)

Quelles réponses pratiques nous propose-t-on ?

  1. Reconduire l’état d’urgence qui a prouvé son inefficacité
  2. Continuer à installer des caméras

Oh, et bien sûr, les enquêtes administratives démontreront qu’aucun service policier ou de renseignement n’a failli à sa mission.

De mon point de vue, les actions proposées par le personnel politique montre immédiatement leur manque total d’imagination et d’adaptation : ces mesures ne marchent pas du tout, alors pourquoi les conserver ?

Penser globalement

Et quelle réponse sur le long terme nous est proposée ? Rien d’autre que cette fameuse guerre des civilisations conceptualisée lors de la première croisade.

Pourtant, si je peux me permettre, d’autres axes de réflexion existent.

En particulier, l’axe mémétique.

En effet, si il est si dur de lutter contre ce qui deviendra dans les prochaines années le « terrorisme domestique » français (si vous ne connaissez pas ce terme charmant, c’est dommage : il nous vient des américains pour lesquels les milices américaines sont de cette famille, quand les terroristes moyen-orientaux n’en sont pas), c’est sans doute parce qu’on le considère comme une organisation, plutôt que comme une idée. Et cette idée, c’est quoi ? Tout simplement qu’il faut forcer l’opposition entre l’Europe et le Moyen-Orient pour déclencher l’apocalypse (j’avais lu ça dans un article fascinant sur The Intercept, me semble-t-il, mais je n’arrive plus à remettre la main dessus).

Dans ce contexte, peut-on lutter contre cette secte apocalyptique avec des armes à feu ?

Ou peut-on même se permettre d’appeler terroriste ceux que l’on devrait qualifier de dangereux illuminés ?

Bien sûr, l’objectif politique est tout autre : cette histoire de menace terroriste imminente annihile le débat, et permet aux futurs candidats à la présidentielle de masquer leur absence de projet pour la France. En bonus, évidement, les socialistes pensent que le front national va seulement empêcher les Républicains de l’emporter trop vite.

En réalité, à jouer sur la corde nationaliste, et on le voit déjà depuis novembre 2015, nos concitoyens musulmans et/ou d’ascendance arabe sont à nouveau victimes d’actes racistes, et les seuls votants à la prochaine série d’élections seront les petits vieux des campagnes qui, par peur, par ignorance, et alimentés par des médias jouant sur cette peur, voteront sans hésiter pour le Front National.

Les furets sont au chtijug !

Tout ce qui est présenté est disponible sur GitHub, avec d’autres choses …

Donc, les furets font de l’assurance. Et ils ont fait d’abord différents sites au look … discutable.

En terme de code, actuellement, il y a 450K lignes de code, et un déploiement en prod par jour. Ca change pas mal des clients avec un déploiement par semestre …

DomainModel.stream()

A quoi ça sert

La classe Person, chez eux, est … grosse, et riche d’héritage. Normal pour un projet qui a 7 ans. Et évidement, ce modèle circule dans l’entreprise, du client Javascript à la base backoffice qui reprend les données sous des formats différents.

Evidement, comme c’est compliqué, ils ont cherché à simplifier tout ça, en utilisant globalement des domaines orientés colonne :

  • clé/valeur dans le client
  • modèle colonnes dans Cassandra
  • Vecteurs de données dans la base analytics

Du coup, utiliser un dictionnaire de clé partout devrait simplifier les choses.

Pour la suite, on va travailler sur un modèle simplifié.

Premier souci : comment ça se passe quand on a des relations 1-n ? A priori, « ca marche » … personnellement, je n’y crois pas trop, mais admettons.

Il y a aussi le souci des champs accessibles par plusieurs chemin, qui cette fois-ci sont dupliqués dans les données disponibles.

Et passons tout de suite au livecoding.

Manipulation simple du modèle

Donc, on a d’un côté notre modèle objet traditionnel, et de l’autre, grâce à un wrapper généré par l’outil des furets. Dans ce wrapper orienté clé/valeur, écrire des données se fait avec un simple

SampleModelWrapper.set(FieldId, value)

lire des données se fait simplement avec un

SampleModelWrapper.get(FieldId)

Et en terme d’implémentation, ça se fait facilement en générant des lambdas (évidement, avant Java8, ça aurait marché tout aussi bien avec des classes internes, mais bon, les lambdas sont à la mode). Et, en plus, l’inférence de type semble assez faible, puisque le type contenu dans le FieldId ne suffit pas à contraindre suffisament le type de sortie.

Manipulation avec des streams

Donc évidement, faire SampleModelWrapper#stream() retourne toutes les valeurs du modèle. Et on peut transformer les valeurs en map en traversant le même stream. Pratique, mais pas exceptionnel. Même si le speaker n’est pas de cet avis. Et en un sens, je le comprend, puisque le mapping est traditionnellement un problème compliqué : regardez Jackson/JAXB et autres qui galèrent pour bien faire les mêmes choses.

Petit bonus : on peut filtrer les éléments du wrapper selon différents tags, qui sont définis librement dans le wrapper. De cette manière, par exemple, on peut séparer les données du User et de l’Account du modèle d’exemple. Evidement, ça peut aussi servir à affiner l’accès à certaines interfaces selon les droits des utilisateurs.

A noter que le site des furets a environ 1000 clés dans les différents enums défnissant les modèles utilisés.

Introspection

Typiquement, quand on veut mettre les données dans une base Cassandra ou autre, il faut d’abord créer les colonnes typées associées, pour lesquelles on va naviguer le modèle, et pour chaque élément du modèle, on va créer une colonne dont le type sera obtenu grâce au FieldInfo correspondant à chaque champ.

Evidement, pour moi, il est assez curieux de voir des gens réinventer des notions analogues aux BeanInfo / PropertyDescriptor disponible dans le vieux monde des JavaBeans. Mais dans l’ensemble, ça fait le job assez (peut-être trop, en fait) simplement. Trop simplement, parce que par exemple, les annotations portées par le modèle initial ne sont pas transportées à travers le wrapper.

Conclusion partielle

Je comprend tout à fait l’intérêt de mapper un modèle de beans vers des séries de colonnes. En revanche, l’implémentation, certes joliment Java8, manque quand même de certains aspects clés : la gestion des collections fait vraiment peur, l’introspection est fichtrement limitée.

Cela dit, ça doit clairement bien limiter la complexité de la sérialisation, de la création d’interface graphique, ou même de persistence (non relationnelle, évidement, parce que sinon, c’est évidement merdique).

Il y a en fait là-dedans une idée très intéressante qui a sans doute un rapport certain avec le NoSQL. je m’explique. Lorsqu’on codait il y a dix/quinze ans avec une base de données relationnelle, avoir du code proprement décomposé était une bonne idée. Maintenant que la plupart des outils de stockage sont dénormalisés, à typage faible, bref, merdiques en terme de support des liens sémantiques, avoir un modèle riche est presque une gêne. Et c’est dans ce cadre que ce système de wrapper de modèle présente un intérêt.

Continuous delivery

Bon, si vous ne savez pas ce qu’est le continous delivery, c’est assez simple : c’est l’idée de pouvoir envoyer du code en prod au plus tôt. Et actuellement, les furets font plusieurs mises en prod par jour.

Historique

D’une façon amusante, en 2012, ils faisaient une MEP par mois, parce que leurs sprints SCRUM duraient un mois. Les tests étaient joués en fin de sprint et pouvaient entraîner des retards de MEP du fait de tests à corriger. Pas très pratique …

En 2013, ils ont tenté d’accélérer les choses avec des sprints « bonus » d’une semaine. Le premier impact est que le temps de build est passé de 15 mn à 3 mn.

En 2014/15, passage à Kanban avec une release chaque jour : les fonctionnalités sont marquées finies dans Kanban quand elles sont en prod. L’impact, évidement, c’est que la release est passée d’une journée entière à 2/3 heures. L’autre impact, c’est que les tests ont tous été automatisés. Histoire de se rassurer, les fonctionnalités passent quand même dans un environnement de staging pendant une journée pour vérifier que tout va bien.

Pour le futur, l’objectif est de livrer encore plus vite : les fonctionnalités devraient apparaître presque une par une en prod.

Curieusement, les MEP apportent toujours autant de code, voire même plus, parce qu’il y a beaucoup plus de fonctionnalités dedans.

Quelques aspects techniques

En-dehors des classiques environnements, il y a quelques points notables.

Les tests sont joués en parallèle sur un grid selenium, qui tourne sur une machine avec un RAMFS (128 Go de RAM chez OVH pour 300 €/mois).

Ils développé Zeno qui va sur une URL pour faire une capture d’écran. Et qui fait la différence entre la prod et la préprod. De cette façon, on peut vérifier que les différences visibles sont bien liées aux fonctionnalités développées (et pas à des bugs, par exemple). Cet outil pourrait par exemple être utilisé pour faire de la veille concurrentielle.

Evidement, le développement se fait en mode blue/green. Avec un double cluster.

Continuous delivery en détail

Il y a en gros 3 modèles de développement

  • trunk based : tout ce qui est dans le trunk part en prod. Ca implique le feature flipping qui est du code en trop.
  • feature branching : tout les dévs sont fait dans des branches, qui sont réintégrées dans le trunk au moment de la MEP. Ca pose évidement des problèmes d’intégration continue.
  • Et pour finir, le modèle github où le code est développé dans des branches, et réintégré dans le trunk via des pull requests, qui passeront dans l’intégration continue.

La grande astuce des furets pour simplifier tout ça est de tester les merge rapidement. Grâce à ce qu’ils appellent le continuous merge : lorsqu’un développeur a fini un développement, il est poussé sur un repository qui contient toutes les nouvelles features branches, et qui tente de les merger et de déployer le code sur l’environnement de staging.

git octopus

Chez eux, les branches en cours de dev s’appellent studies/ et celles qui sont finies s’appellent features/. Pour merger tout ça, ils ont un script appelé git octopus disponible sur github. Le truc magique, c’est qu’il peut détecter les conflits entre les branches à merger avant le merge final.

Pour résoudre les problèmes qui arrivent … ben là, essentiellement, c’est du git-fu (et vous savez ce que j’en pense). En fait, c’est pas vrai : tout ce qui est dit est également valable avec Subversion … et j’ai bien l’impression que c’est ce que gigomerge (mince, j’aurais bien mis le lien, mais je ne le retrouve plus) permet d’une certaine façon.

Pour faciliter la gestion des conflits, ils ont également créé un outil de gestion des conflits … qui en fait se contente de créer un workflow d’escalade des exceptions.

Conclusion

Deux présentations très intéressantes, faites par des gens qui se soucient manifestement beaucoup de ce qu’ils livrent, et de la façon dont ils le livrent. Il y a là-dedans des choses vraiment très intéressantes (git octopus, conceptuellement, est très bien, et cette histoire de repository définissant le niveau de maturité d’une feature est également très chouette) D’autres sont en revanche plus discutable (la résolution de conflit me paraît plus de l’ordre de l’astuce que de la solution vraiment propre).

Mais surtout, ce qui apparaît, c’est que, contrairement à bien des boîtes, ils ont l’ambition de se voir comme une boîte de développement logiciel, ce qui implique de produire de la qualité et de la visibilité. C’est sans doute ce qui leur permet de recruter des pointures, puisque nos deux intervenants paraissaient particulièrement compétents.