Planet Grep

Planet'ing Belgian FLOSS people

Planet Grep is maintained by Wouter Verhelst. All times are in UTC.

March 19, 2019

The post MySQL 8 & Laravel: The server requested authentication method unknown to the client appeared first on ma.ttias.be.

For local development I use Laravel Valet. Recently, the brew packages have updated to MySQL 8 which changed a few things about its user management. One thing I continue to run into is this error when working with existing Laravel applications.

 SQLSTATE[HY000] [2054] The server requested authentication method unknown to the client

So, here's the fix. You can create a user with the "old" authentication mechanisme, which the MySQL database driver for PHP still expects.

CREATE USER 'ohdear_ci'@'localhost' IDENTIFIED WITH mysql_native_password BY 'ohdear_secret';
GRANT ALL PRIVILEGES ON ohdear_ci.* TO 'ohdear_ci'@'localhost';

If you already have an existing user with permissions on databases, you can modify that user instead.

ALTER USER 'ohdear_ci'@'localhost' IDENTIFIED WITH mysql_native_password BY 'ohdear_secret';

After that, your PHP code can once again connect to MySQL 8.

The post MySQL 8 & Laravel: The server requested authentication method unknown to the client appeared first on ma.ttias.be.

March 18, 2019

Over the past couple of months, since the release of WordPress 5.0 which includes Gutenberg, the new JavaScript-based block editor, I have seen many sites loading a significant amount of extra JavaScript from wp-includes/js/dist on the frontend due to plugins doing it wrong.

So dear plugin-developer-friends; when adding Gutenberg blocks please differentiate between editor access and visitor access, only enqueue JS/ CSS if needed to display your blocks and when registering for front-end please please frigging please don’t declare wp-blocks, wp-element, … and all of those other editor goodies as dependencies unless your 100% sure this is needed (which will almost never be the case).

The performance optimization crowd will thank you for being considerate and -more likely- will curse you if you are not!

March 15, 2019

Tout en prétendant le sauver. Et pourquoi ils sont le pire modèle possible pour nos enfants.

Je déteste les films de superhéros. Je conchie cette mode abjecte qui a dirigé la moitié des conversations d’Internet sur le thème DC ou Marvel, qui a créé une génération d’exégètes de bandes-annonces en attente du prochain « film événement » que va leur fournir l’implacable machine à guimauve et à navet hors de prix appelée Hollywood.

Premièrement à cause de cette éternelle caricature du bien contre le mal, cet épuisant manichéisme qu’on tente désormais de nous camoufler en montrant que le bon doit faire des choses mauvaises, qu’il doute ! Mais, heureusement, le spectateur lui, ne doute jamais. Il sait très bien qui est le bon (celui qui lutte contre le mauvais) et qui est le mauvais (celui qui cherche à faire le Mal, avec un M majuscule, mais sans aucune véritable autre motivation, rendant le personnage complètement absurde). Le bon n’en sort que meilleur, c’est effrayant de bêtise, de faiblesse scénaristique. C’est terrifiant sur l’implication dans nos sociétés. Ce qui est Bien est Bien, c’est évident, on ne peut le questionner. Le Mal, c’est l’autre, toujours.

Mais outre ce misérabilisme intellectuel engoncé sous pléthores d’explosions et d’effets spéciaux, ce qui m’attriste le plus dans cet univers global est le message de fond, l’odieuse idée sous-jacente qui transparait dans tout ce pan de la fiction.

Car la fiction est à la fois le reflet de notre société et le véhicule de nos valeurs, de nos envies, de nos pulsions. La fiction représente ce que nous sommes et nous façonne à la fois. Qui contrôle la fiction contrôle les rêves, les identités, les aspirations.

Les blockcbusters des années 90, d’Independance Day à Armaggedon en passant par Deep Impact, mettaient tous en scène une catastrophe planétaire, une menace totale pour l’espèce. Et, dans tous les cas, les humains s’en sortaient grâce à la coopération (une coopération généralement fortement dirigée par les États-Unis avec de nauséabonds relents de patriotisme, mais de la coopération tout de même). La particularité des héros des années 90 ? C’étaient tous des monsieurs et madames Tout-le-Monde. Bon, surtout des monsieurs. Et américains. Mais le scénario insistait à chaque fois lourdement sur sa normalité, sur le fait que ça pouvait être vous ou moi et qu’il était père de famille.

Le message était clair : les États-Unis vont unir le monde pour lutter contre les catastrophes, chaque individu est un héros et peut changer le monde.

Durant mon adolescence, les films de superhéros étaient complètement ringards. Il n’y avait pas l’ombre du moindre réalisme. Les costumes fluo étaient loin de remplir les salles et, surtout, n’occupaient pas les conversations.

Puis est arrivé Batman Begins, qui selon toutes les critiques de l’époque a changé la donne. À partir de là, les films de superhéros se sont voulus plus réalistes, plus humains, plus sombres, plus glauques. Le héros n’était plus lisse. 

Mais, par essence, un superhéros n’est pas humain ni réaliste. Il peut bien sûr être plus sombre si on change l’éclairage et qu’on remplace le costume fluo. Pour le reste, on va se contenter de l’apparence. Une pincée d’explications par un acteur en blouse blanche pour faire pseudo-scientifique apportera la touche de réalisme. Pour le côté humain, on montrera le superhéros face au doute et éprouvant des caricatures d’émotions : la colère, le désir de faire du mal au Mal, la peur d’échouer, une vague pulsion sexuelle s’apparentant à l’amour. Mais il restera un superhéros, le seul capable de sauver la planète.

Le spectateur n’a plus aucune prise sur l’histoire, sur la menace. Il fait désormais partie de cette foule anonyme qui se contente d’acclamer le superhéros, de l’attendre voire de servir, avec le sourire, de victime collatérale. Car le superhéros moderne fait souvent plus de dégâts que les aliens d’Independance Day. Ce n’est pas grave, c’est pour la sauvegarde du Bien.

Désormais, pour sauver le monde, il faut un super pouvoir. Ou bien il faut être super riche. Si tu n’as aucun des deux, tu n’es que de la chair à canon, dégage-toi du chemin, essaie de ne pas gêner.

C’est tout bonnement terrifiant.

Le monde que nous renvoient ces univers est un monde passif, d’acceptation où personne ne cherche à comprendre ce qu’il y’a au-delà des apparences.  Un monde où chacun attend benoîtement que le Super Bien vienne vaincre le Super Mal, le cul vissé sur la chaise de son petit boulot gris et terne.

La puissance évocatrice de ces univers est telle que les acteurs qui jouent les superhéros sont adulés, applaudis plus encore que leurs avatars, car, comble du Super Bien, ils enfilent leur costume pour aller passer quelques heures avec les enfants malades. Les héros de notre imaginaire sont des saltimbanques multimillionnaires qui, entre deux tournages de publicité pour nous laver le cerveau, acceptent de consacrer quelques heures aux enfants malades sous le regard des caméras !

À travers moults produits dérivés et costumes, nous renforçons cet imaginaire manichéens chez notre progéniture. Alors que notre plus grand espoir serait de former les jeunes à être eux-mêmes, à découvrir leurs propres pouvoirs, à apprendre à coopérer à large échelle, à cultiver les complémentarités et l’intérêt pour le bien commun, nous préférons nous vanter de leur avoir fabriqué un super beau costume de superhéros. Parce que ça fait super bien sur Instagram, parce qu’on devient, pour quelques likes, un super papa ou une super maman.

Le reste de la société est à l’encan. Ne collaborez plus mais devenez un superhéros de l’entrepreneuriat, un superhéros de l’environnement en triant vos déchets, une rockstar de la programmation !

C’est super pathétique…

Photo by TK Hammonds on Unsplash

Je suis @ploum, conférencier et écrivain électronique. Si vous avez apprécié ce texte, n'hésitez pas à me soutenir sur Tipeee, Patreon, Paypal, Liberapay ou en millibitcoins 34pp7LupBF7rkz797ovgBTbqcLevuze7LF. Vos soutiens réguliers, même symboliques, sont une réelle motivation et reconnaissance. Merci !

Ce texte est publié sous la licence CC-By BE.

March 14, 2019

La cabine individuelle du monorail me déposa à quelques mètres de l’entrée du bâtiment de la Compagnie. Les larges portes de verre s’écartèrent en enfilade pour me laisser le passage. Je savais que j’avais été reconnu, scanné, identifié. L’ère des badges était bel et bien révolue. Tout cela me paraissait normal. Ce ne devait être qu’une journée de travail comme les autres.

Le colossal patio grouillait d’individus qui, comme moi, arboraient l’uniforme non officiel de la compagnie. Un pantalon de couleur grise sur des baskets délacées, une paire de bretelles colorées, une chemise au col faussement ouvert dans une recherche très travaillée de paraître insouciant de l’aspect vestimentaire, une barbe fournie, des lunettes rondes. Improbables mirliflores jouisseurs, épigones de l’hypocrite productivisme moderne.

À travers les étendues vitrées du toit, la lumière se déversait à flots, donnant au gigantesque ensemble la sensation d’être une trop parfaite simulation présentée par un cabinet d’architecture. Régulièrement, des plantes et des arbres dans de gigantesques vasques d’un blanc luisant rompaient le flux des travailleurs grâce à une disposition qui ne devait rien au hasard. Les robots nettoyeurs et les immigrés engagés par le service d’entretien ne laissaient pas un papier par terre, pas un mégot. D’ailleurs, la Compagnie n’engageait plus de fumeurs depuis des années.

J’avisais les larges tours de verre des ascenseurs. Elles se dressaient à près d’un demi-kilomètre, adamantin fanal encalminé dans cet étrange cloître futuriste. J’ignorais délibérément une trottinette électrique qui, connaissant mon parcours habituel, vint me proposer ses services. J’avais envie de marcher un peu, de longer les vitrines des salles de réunion, des salles de sport où certains de mes collègues pédalaient déjà avec un enthousiasme matinal que j’avais toujours trouvé déplacé avant ma première tasse de kombusha de la journée.

Une voix douce se mit à parler au-dessus de ma tête, claire, intelligible, désincarnée, asexuée.

— En raison d’un problème technique aux ascenseurs, nous conseillons, dans la mesure du possible, de prendre l’escalier.

J’arrivai au pied des tours de verre et de métal. La voix insistait.

— En raison d’un problème technique, l’usage des ascenseurs est déconseillé, mais reste possible.

J’avais traversé le bâtiment à pied, je n’avais aucune envie de descendre une trentaine d’étages par l’escalier. Sans que je l’admette consciemment, une certaine curiosité morbide me poussait à constater de mes yeux quel problème pouvait bien rendre l’utilisation d’un ascenseur possible, mais déconseillée.

Je rentrai dans la spacieuse cabine en compagnie d’un type assez bedonnant en costume beige et comble du mauvais goût, en cravate, ainsi que d’une dame en tailleur bleu marine, aux lunettes larges et au chignon sévère. Nous ne nous adressâmes pas la parole, pénétrant ensemble dans cet espace clos comme si nous étions chacun seuls, comme si le moindre échange était une vulgarité profane.

Les parois brillantes resplendissaient d’une lumière artificielle parfaitement calibrée. Comme à l’accoutumée, je ne réalisai pas immédiatement que les portes s’étaient silencieusement refermées et que nous avions amorcé la descente.

Une légère musique tentait subtilement d’égayer l’atmosphère tandis que nous appliquions chacun une stratégie différente pour éviter à tout prix de croiser le regard de l’autre. L’homme maintenait un visage glabre aux sourcils épais complètement impassible, le regard obstinément fixé sur la paroi d’en face. La femme gardait les yeux rivés vers le sac en cuir qu’elle avait posé à ses pieds. Elle serrait un classeur contre son buste comme un naufragé se raccroche à sa bouée de sauvetage. De mon côté, je détaillais les arêtes du plafond comme si je les découvrais pour la première fois.

La lumière baissait sensiblement à mesure que nous descendions, comme pour nous rappeler que nous nous enfoncions dans les entrailles chtoniennes de la planète.

Lorsque nous fîmes halte au -34, l’homme en costume dû toussoter pour que je m’écarte à cause du léger rétrécissement de la cabine.

La plongée reprit. La baisse de luminosité et le rétrécissement devenaient très perceptibles. Au -78, l’étage de la dame, nous évoluions dans une pénombre grisâtre. En écartant les bras, j’aurais pu toucher les deux parois.

J’étais désormais seul, comme si l’ascenseur ne m’avait pas reconnu et ignorait ma présence. Une impulsion irrationnelle me décida d’aller aussi profond que possible. Simple accès de curiosité. Après tout, cela faisait des années que je travaillais pour la Compagnie et n’était jamais descendu aussi bas.

La lumière baissait de plus en plus, mais je m’aperçus que ma compagne de descente avait oublié son sac de cuir. Je peinais à distinguer les parois que je pouvais désormais toucher des doigts. Sur le compteur lumineux, qui était de plus en plus proche de moi, les étages défilaient de moins en moins vite.

Je sentis mes épaules frotter et je dus me mettre de profil pour ne pas être écrasé. Je plaçai le sac à hauteur de mon visage et pus très vite le lâcher, car il tenait par la simple force de pression que les parois exerçaient sur lui. La cabine m’enserrait désormais de tous côtés : les épaules, le dos et la poitrine. Ma respiration se faisait difficile alors survint le noir total. Les ténèbres m’enveloppèrent. Seul brillait encore faiblement le compteur qui se stabilisa sur -118.

Calmement, la certitude que j’allais mourir étouffé s’empara de moi. C’était certainement le problème dont m’avait averti la voix. Je ne l’avais pas écoutée, j’en payais le prix. C’était logique, il n’y avait rien à faire.

Dans un silence oppressant, je me rendis compte que la paroi à ma droite était un peu moins obscure. En me contorsionnant, je parvins à me glisser sous le sac qui était désormais à moitié écrasé. La porte était ouverte. Je fis quelques pas hors de la cabine dans une glauque et moite pénombre. Je distinguais des parois en feutre gris arrivant à mi-torse, délimitant des petits espaces où s’affairaient des collègues. Ils portaient des chemises que je percevais grises, des cravates et des gilets sans manches. La faible luminosité de vieux tubes cathodiques se reflétait dans leurs lunettes. Les discussions étaient douces, feutrées. J’avais l’impression d’être un étranger, personne ne faisait attention à moi.

Dans un coin, une vieille imprimante matricielle crachotait des pages de caractères sibyllins en émettant ses stridents chuintements.

Comme un somnambule, je déambulais, étranger à ce monde. Ou du moins, je l’espérais.

Après quelques hésitations, je repris ma place en me glissant avec quelques difficultés dans la cabine dont la porte ne s’était pas refermée, comme si elle m’attendait.

De nouveau, ce fut le noir. L’oppression. Mais pas pour longtemps. Je respirais. Les parois s’écartaient, je distinguais une légère lueur. Je remontais, je renaissais.

Les chiffres défilaient de plus en plus rapidement sur le compteur. Lorsqu’ils s’arrêtèrent sur 0, je défroissai ma chemise et, le sac en cuir dans une main, je me ruai dans les lumineux rayons du soleil filtré.

Au-dessus de ma tête, la voix désincarnée continuait sa péroraison.
— En raison d’un problème technique aux ascenseurs, nous conseillons, dans la mesure du possible, de prendre l’escalier.

Je me mis à courir en riant. Des balcons aux salles de sport, toutes les têtes se retournaient sur mon passage. Je n’y prêtais guère attention. Je riais, je courais à perdre haleine. Quelques remarques fusèrent, mais je ne les entendais pas.

Bousculant un garde, je franchis la série de doubles portes et sortis hors du bâtiment, hors de la Compagnie. Il pleuvait, le ciel était gris.

De toutes mes forces, je lançai la mallette de cuir. Elle s’ouvrit à son apogée, distribuant aux vents feuillets, fiches et autres notes qui vinrent dessiner une parodie d’automne sur le bitume noir de la route détrempée.

Je m’assis sur la margelle du trottoir, les yeux fermés, inspirant profondément les relents de petrichor tandis que des gouttes ruisselaient sur mon sourire.

Ottignies, 22 février 2019. Première nouvelle écrite sur le Freewrite, en moins de 2 jours. Rêve du 14 juillet 2008.Photo by Justin Main on Unsplash

Je suis @ploum, conférencier et écrivain électronique. Si vous avez apprécié ce texte, n'hésitez pas à me soutenir sur Tipeee, Patreon, Paypal, Liberapay ou en millibitcoins 34pp7LupBF7rkz797ovgBTbqcLevuze7LF. Vos soutiens réguliers, même symboliques, sont une réelle motivation et reconnaissance. Merci !

Ce texte est publié sous la licence CC-By BE.

March 13, 2019

Autoptimize 2.5 is almost ready! It features a new “Images”-tab to house all Image optimization options, including support for lazy-loading images and WebP (the only next-gen image format that really matters, no?);

So download the beta and test lazy-loading and WebP (and all of the other changes) and let me know of any issue you might find!

March 12, 2019

Today, the world wide web celebrates its 30th birthday. In 1989, Sir Tim Berners-Lee invented the world wide web and changed the lives of millions of people around the globe, including mine.

Tim Berners-Lee sitting in front of a computer showing the first websiteTim Berners-Lee, inventor of the World Wide Web, in front of the early web.

Milestones like this get me thinking about the positive impact a free and Open Web has had on society. Without the web, billions of people would not have been able to connect with one another, be entertained, start businesses, exchange ideas, or even save lives. Open source communities like Drupal would not exist.

As optimistic as I am about the web's impact on society, there have been many recent events that have caused me to question the Open Web's future. Too much power has fallen into the hands of relatively few platform companies, resulting in widespread misinformation, privacy beaches, bullying, and more.

However, I'm optimistic that the Open Web has a chance to win in the future. I believe we'll see three important events happen in the next five years.

First, the day will come when regulators will implement a set of laws that govern the ownership and exchange of data online. It's already starting to happen with GDPR in the EU and various state data privacy laws taking shape in the US. These regulations will require platforms like Facebook to give users more control over their data, and when that finally happens, it will be a lot easier for users to move their data between services and for the Open Web to innovate on top of these data platforms.

Second, at some point, governments globally will disempower large platform companies. We can't leave it up to a handful of companies to judge what is false and true, or have them act as our censors. While I'm not recommending governments split up these companies, my hope is that they will institute some level of algorithmic oversight. This will offer an advantage to the Open Web and Open Source.

Third, I think we're on the verge of having a new set of building blocks that enable us to build a better, next-generation web. Thirty years into the web, our data architectures still use a client-server model; data is stored centrally on one computer, so to speak. The blockchain is turning that into a more decentralized web that operates on top of a distributed data layer and offers users control of their own data. Similar to building a traditional website, distributed applications (dApps) require file storage, payment systems, user data stores, etc. All of these components are being rebuilt on top of the blockchain. While we have a long way to go, it is only a matter of time before a tipping point is reached.

In the past, I've publicly asked the question: Can we save the Open Web? I believe we can. We can't win today, but we can keep innovating and get ready for these three events to unfold. The day will come!

With that motivation in mind, I want to wish a special happy birthday to the world wide web!

Bonjour,

En vertu de la loi RGPD, pourriez-vous m’informer de la manière par laquelle vous avez obtenu mes coordonnées et effacer toutes données me concernant de vos différentes bases de données. Si vous les avez acquises, merci de me donner les coordonnées de votre fournisseur.

Bien à vous,

Il y’a 15 ans, le spam était un processus essentiellement automatisé qui consistait à repérer des adresses email sur le web et à envoyer massivement des publicités pour du Viagra. Les filtres intelligents sont finalement venus à bout de ce fléau, au prix de quelques mails parfaitement légitimes égarés. Ce qui a donné une excuse parfaite à toute une génération : « Quoi ? Je ne t’ai pas répondu sur le dossier Bifton ? Oh, ton mail était dans mes spams ! ».

Mais aujourd’hui, le spam s’est institutionnalisé. Il a gagné ses lettres de noblesse en se rebaptisant « newsletter » ou « mailing ». Les spammeurs se sont rebrandés sous le terme « email marketing » ou « cold mailing ». Désormais, il n’est pas une petite startup, une boucherie de quartier, un club de sport, une institution publique qui ne produise du spam.

Comme tout le monde le fait, tout le monde se sent obligé de le faire. À peine est-on inscrit à un service dont on a besoin, à peine vient-on de payer un abonnement à un club qu’il vient automatiquement avec sa kyrielle de newsletters. Ce qui est stupide, car on vient juste de payer. La moindre des choses quand on a un nouveau client, c’est de lui foutre la paix.

Le pire reste sans conteste le jour de votre anniversaire. Tous les services qui, d’une manière ou d’un autre, ont une date de naissance liée à votre adresse mail se sentent obligés de vous le rappeler. Le jour de son anniversaire, on reçoit déjà pas mal de messages des proches alors que, généralement, on est occupé. Normal, c’est la tradition, c’est chouette. Facebook nous envoie des dizaines voire des centaines de messages de gens moins proches voire d’inconnus perdus de vue. Passons, c’est le but de Facebook. Mais que chaque site où j’ai un jour commandé une pompe à vélo à 10€ ou un string léopard m’envoie un message d’anniversaire, c’est absurde ! Joyeux Spamniversaire !

Le problème avec ce genre de pourriel c’est que, contrairement au spam vintage type Viagra, il n’est pas toujours complètement hors de nos centres d’intérêt. On se dit que, en fait, pourquoi pas. On le lirait bien plus tard. La liste produira peut-être un jour un mail intéressant ou une offre commerciale pertinente. Surtout que se désabonner passe généralement par un message odieusement émotionnel de type « Vous allez nous manquer, vous êtes vraiment sûr ? ».  Quand il ne faut pas un mot de passe ou que le lien de désinscription n’est pas tout bonnement cassé. De toute façon, on ne se désinscrit que de « certaines catégories de mails ». Régulièrement, de nouvelles catégories sont ajoutées auxquelles on est abonné d’office. La palme revient à Facebook, qui m’envoie encore 2 ou 3 mails par semaine alors que, depuis plusieurs mois, je clique à chaque fois, je dis bien à chaque fois, sur les liens de désinscription.

Un magasin en ligne bio, écolo, ne vendant que des produits durables mais qui applique les techniques de marketing les plus anti-éthiques.

Si vous n’êtes pas aussi extrémiste que moi, il est probable que votre boîte mail soit bourrée jusqu’à la gorge, que votre inbox atteigne les 4 ou 5 chiffres. Mais de ces milliers de mails, combien sont importants ? 

Plus concrètement, combien de mails importants avez-vous perdus de vue parce que votre inbox a été saturé par ces mailings ? L’excuse est toujours valide, le mail de votre collègue est bien dans les spams. Tout votre inbox est devenu une gigantesque boîte à spams.

Ceux qui me suivent depuis longtemps savent que je suis un adepte de la méthode Inbox 0. Ma boîte mail est comme ma boîte aux lettres physiques : elle est vide la plupart du temps. Chaque mail est archivé le plus vite possible.

Au fil des années, j’ai découvert que la stratégie la plus importante pour atteindre régulièrement Inbox 0 est d’éviter de recevoir des mails dont je n’ai pas envie. Même s’ils sont potentiellement intéressants. Le simple fait de recevoir le mail, d’être distrait par lui, de le lire, d’étudier si le contenu vaut la peine nécessite un effort mental total qui n’est jamais compensé par un intérêt tout relatif et très aléatoire. En fait, les mails « intéressants » sont les pires, car ils font hésiter, douter.

Réfléchissons une seconde. Si des gens sont payés pour m’envoyer un mail que je n’ai pas demandé, c’est qu’à terme ils espèrent que je paie d’une manière ou d’une autre. Pour qu’une mailing liste soit réellement intéressante, il y’a un critère simple : il faut payer. Si vous ne payez pas le rédacteur de la newsletter vous-même, alors vous le paierez indirectement.

J’ai décidé d’attaquer le problème frontalement grâce à un merveilleux outil que nous offre l’Europe, la loi RGPD.

À chaque mail non sollicité que je reçois, je réponds le message que vous avez pu lire en entête de ce billet. Parfois, j’ai envie de juste archiver ou mettre dans les spams. Parfois je me dis que ça peut être intéressant. Mais je tiens bon : à chaque mail, je me désabonne ou je réponds (parfois les deux). Si une information est réellement pertinente, l’univers trouvera un moyen de me la communiquer.

Cela fait plusieurs mois que j’ai mis en place cette stratégie en utilisant un outil qui complète automatiquement le mail quand je tape une combinaison de lettres (j’utilise les snippets Alfred pour macOS). L’effet est proprement hallucinant.

Tout d’abord, cela m’a permis de remonter à la source de certaines bases de données revendues à grande échelle. Mais, surtout, cela m’a permis de me rendre compte que les apprenti-marketeux savent très bien ce qu’ils font. Ils se répandent en excuses, ils se justifient, ils me promettent que cela n’arrivera plus alors que mon mail n’est aucunement critique. La simple mention du RGPD les effraie. Bref, tout le monde le fait, mais tout le monde sait que ça emmerde le client et que c’est désormais à la limite de la légalité.

Et mon inbox dans tout ça ? Il n’en revient toujours pas. À force de me désinscrire de tout pendant plusieurs mois, il m’est même arrivé de passer 24h sans recevoir le moindre mail. Cela m’a permis de détecter que certains mails vraiment importants passaient parfois dans les spams vu que, étonné de ne rien recevoir, j’ai visité ce dossier.

Soyons honnêtes, c’était un cas exceptionnel. Mais je reçois moins de 10 mails par jour, généralement 4 ou 5, ce qui est tout à fait raisonnable. Je reprends même du plaisir à échanger par mail. Je préfère en effet cette manière de correspondre au chat qui implique une notion stressante d’immédiateté.

Maintenir mon inbox propre nécessite cependant une réelle rigueur. Il ne se passe pas une semaine sans que je découvre être inscrit à une nouvelle mailing liste, parfois utilisant des données anciennes et apparaissant comme par magie.

Aussi je vous propose de passer avec moi à la vitesse supérieure en appliquant exactement ma méthode.

À chaque mail non sollicité, répondez avec mon message ou un de votre composition. Copiez-collez-le ou utilisez des outils de réponses automatiques. Surtout, n’en laissez plus passer un seul. Vous allez voir, c’est fastidieux au début, mais ça devient vite grisant.

Plus nous serons, moins envoyer un mailing deviendra rentable. Imaginez un peu la tête du marketeux qui, à chaque mail, doit répondre non plus à un ploum un peu excentrique, mais à 10 voire 100 personnes !

Ne soyez pas agressifs. Ne jugez pas. N’essayez pas d’entrer dans un débat (je l’ai fait au début, c’était une erreur). Contentez-vous du factuel et inattaquable : « Retirez-moi de vos bases de données ». Vous n’avez pas à vous justifier plus que cela. N’oubliez pas de mentionner les lettres magiques : RGPD.

Qui sait ? Si nous sommes assez nombreux à appliquer cette méthode, peut-être qu’on en reviendra au bon vieux principe de n’envoyer des mails qu’à ceux qui ont demandé pour les recevoir.

Je rêve peut-être, mais la rigueur que je me suis imposée pour commencer cet exercice s’est transformée en plaisir de voir ma boîte mail si souvent vide, prête à recevoir les messages et les critiques de mes lecteurs. Car, ces messages-là, je n’en ai jamais assez…

Photo by Franck V. on Unsplash

Je suis @ploum, conférencier et écrivain électronique. Si vous avez apprécié ce texte, n'hésitez pas à me soutenir sur Tipeee, Patreon, Paypal, Liberapay ou en millibitcoins 34pp7LupBF7rkz797ovgBTbqcLevuze7LF. Vos soutiens réguliers, même symboliques, sont une réelle motivation et reconnaissance. Merci !

Ce texte est publié sous la licence CC-By BE.

Product marketing teams are responsible for bringing products to market and championing their success and adoption. To make this happen, they work closely with three sets of key stakeholders: the product team (development/engineering), the marketing team and the sales team.

Product marketing is at the center of product management, sales and marketing

In some organizations, product marketing reports to marketing. In other organizations, it reports to product. The most common pattern is for product marketing teams to live in marketing, but in my opinion, a product marketing organization should sit where the highest frequency of communication and collaboration is needed. That can depend on the type of product, but also on the maturity of the product.

For new products, companies with an evolving product strategy, or very technical products, it makes the most sense for product marketing to report directly to the product team. For mature and steady products, it makes sense for product marketing to report into marketing.

This reporting structure matters in that it facilitates communication and alignment.

For example, Acquia has recently decided to restructure product marketing to report to the product team (the team I'm responsible for), rather than to marketing. We made this decision because there has been a lot of change and growth on the product front.

We've also added to our product leadership team, hiring an SVP of Product Marketing, Tom Wentworth. Those of you who have followed Acquia's story may know Tom as our former CMO and head of product marketing. You can read more about it in Tom's blog post — he explains why he rejoined Acquia, but also writes about content management history and trends. Well worth a read!

March 11, 2019

Yes. Let’s print lot’ s of Euros for the purpose of enhancing technologies related to Climate.

Because we need to increase the Euro’ s inflation. We should stop investing in government bonds for the same purpose (saving the Greek socialist government). We need to invest in our shared European military too (replacing NATO). Those should increase our Euro inflation. Investing in climate related technologies will likely increase our Euro inflation. Which we still need. Urgently.

We however need to violently stop increasing Euro inflation by investing in EU government debt. We need to start investing in the real things the young people in the European Union want.

What do we need to invest European money in (in order of priority):

  • Propaganda (RT is fine, but, we probably want to control it ourselves instead)
  • Military (a European DARPA). We really need our own EU military research. Space. Rocket science. Weapons research. Because this will improve research and technology in and of civilian space. Whether civilians like this or not. Besides, we might some day need it against an invading force (rather unlikely, but still).
  • Climate technologies. It’s clear that civilians want this. Let’s do it, then.
  • Infrastructure (roads, borders, schools, swimming pools in villages)
  • Social security (Look at Leuven’s academic hospital. This is fantastic. More of this, please)
  • Lawmaking about new technologies (social media, privacy in a digital age, genetic engineering of seeds and others, chemicals, farming, medical, and many more)

 

 

March 08, 2019

Live version of a great new song by a new (super-)band by one not-so-new (Conor Oberst) and (given her age) one newish artist (Phoebe Bridgers). Somewhat reminds me of the alternative rock-scene of the nineties (Hole, Throwing Muses and whatnot) and that is a good thing!

YouTube Video
Watch this video on YouTube.

March 07, 2019

I published the following diary on isc.sans.edu: “Keep an Eye on Disposable Email Addresses“:

In many organisations, emails still remain a classic infection path today. The good old email is still today a common communication channel to exchange information with people outside of the security perimeter. Many security controls are in place to reduce the number of malicious emails landing in users’ mailboxes. If, from a network perspective, firewalls inspect traffic in both directions (“egress” and “ingress” filters), it’s not always the case with email flows. They are often just allowed to go out through local MTA’s (Mail Transfert Agents)… [Read more]

[The post [SANS ISC] Keep an Eye on Disposable Email Addresses has been first published on /dev/random]

March 03, 2019

Logo Ansible wideCe jeudi 21 mars 2019 à 19h se déroulera la 76ème séance montoise des Jeudis du Libre de Belgique.

Le sujet de cette séance : Automatiser son infrastructure avec Ansible, tester grâce à Molecule

Thématique : sysadmin

Public : sysadmin|entreprises|étudiants

L’animateur conférencier : Fabrice Flore-Thebault (Stylelabs, Centsix)

Lieu de cette séance : Mic-Belgique, Avenue des Bassins, 64 à 7000 Mons (cf. la carte OSM).

La participation sera gratuite et ne nécessitera que votre inscription nominative, de préférence préalable, ou à l’entrée de la séance. Merci d’indiquer votre intention en vous inscrivant via la page http://jeudisdulibre.fikket.com/. La séance sera suivie d’un verre de l’amitié.

Les Jeudis du Libre à Mons bénéficient aussi du soutien de nos partenaires : CETIC, OpenSides, MeaWeb et Phonoid.

Si vous êtes intéressé(e) par ce cycle mensuel, n’hésitez pas à consulter l’agenda et à vous inscrire sur la liste de diffusion afin de recevoir systématiquement les annonces.

Pour rappel, les Jeudis du Libre se veulent des espaces d’échanges autour de thématiques des Logiciels Libres. Les rencontres montoises se déroulent chaque troisième jeudi du mois, et sont organisées dans des locaux et en collaboration avec des Hautes Écoles et Facultés Universitaires montoises impliquées dans les formations d’informaticiens (UMONS, HEH et Condorcet), et avec le concours de l’A.S.B.L. LoLiGrUB, active dans la promotion des logiciels libres.

Description : Ansible est une plate-forme d’automatisation IT. Cet outil permet la gestion de configuration des systèmes informatiques, de déployer des applications et d’orchestrer des tâches plus complexes (déploiement continu, zero downtime rolling updates).

Tout ceci en restant simple d’utilisation. Et sans agent. Ceci mérite d’être signalé étant donné l’étendue des capacités d’Ansible. Bien entendu sont supportés les hôtes traditionnels tel que Linux et autres formes d’Unix, ainsi que de Mac OS et Windows. Mais Ansible n’en reste pas là: le support des fournisseurs Cloud est extensif (AWS, Azure, GCE, Linode, Ovirt, VMWare, Vultr). Un nombre matériels réseaux sont aussi supportés (A10, ACI, Cisco ASA, F5, Junos, Palo Alto …).

Simple d’utilisation, certes, mais peut-être que ce que vous allez réaliser avec Ansible va cesser d’être simpliste, et rapidement, avant d’appliquer une nouvelle version d’un playbook en production, vous voudrez établir un niveau de confiance certain dans la capacité de cette nouvelle version à ne pas tout casser.

C’est à ce moment qu’intervient molecule, et tous ses amis avec. Molecule permet de tester les rôles Ansible. En s’adaptant à vos besoins, mais aussi en vous poussant à faire mieux. Molecule commence par valider votre syntaxe. Vous apprend à faire mieux. C’est un bon coach. Molecule vous aide ensuite à créer un infrastructure de test qui vous corresponde, et va tester que votre rôle s’exécute correctement.

La présentation s’appuiera sur plusieurs expériences de développement de playbooks Ansible, avec des degrés variables de maturité, de tests et d’automatisation.

Short bio : Fabrice Flore-Thebault est historien de formation, devenu utilisateur de logiciels libres par conviction, puis sysadmin professionnel à cause des circonstances, acquis à la cause devops des premiers jours, utilisateur convaincu d’Ansible, contributeur de la communauté Molecule, et papa très fier de sa fille.

Images versus unattended setup

Old-school

Unattended setup

In a traditional environment, systems are installed from a CDROM. The configuration is executed by the system administrator through the installer. This soon becomes a borning and unpractical task when we need to set up a lot of systems also it is important that systems are configured in same - and hopefully correct - way.

In a traditional environment, this can be automated by booting via BOOTP/PXE boot and configured is by a system that “feeds” the installer. Examples are:

Cloud & co

Cloud-init

In a cloud environment, we use images to install systems. The system automation is generally done by cloud-init. Cloud-init was originally developed for Ubuntu GNU/Linux on the Amazon EC2 cloud. It has become the de facto installation configuration tool for most Unix like systems on most cloud environments.

Cloud-init uses a YAML file to configure the system.

Images

Most GNU/Linux distributions provide images that can be used to provision a new system. You can find the complete list on the OpenStack website

https://docs.openstack.org/image-guide/obtain-images.html

The OpenStack documentation also describes how you can create your own base images in the OpenStack Virtual Machine Image Guide

Use a centos cloud image with libvirtd

Download the cloud image

Download

Download the latest “GenericCloud” centos 7 cloud image and sha256sum.txt.asc sha256sum.txt from:

https://cloud.centos.org/centos/7/images/

Verify

You should verify your download - as always against a trusted signing key -

On a centos 7 system, the public gpg is already installed at /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7

Verify the fingerprint

Execute

1
2
3
4
staf@centos7 iso]$ gpg --with-fingerprint /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
pub  4096R/F4A80EB5 2014-06-23 CentOS-7 Key (CentOS 7 Official Signing Key) <security@centos.org>
      Key fingerprint = 6341 AB27 53D7 8A78 A7C2  7BB1 24C6 A8A7 F4A8 0EB5
[staf@centos7 iso]$ gpg --with-fingerprint /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7

and verify the fingerprint, the fingerprints that are used by centos are listed at:

https://www.centos.org/keys/

Import key

Import the pub centos gpg key:

1
2
3
4
5
[staf@centos7 iso]$ gpg --import /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
gpg: key F4A80EB5: public key "CentOS-7 Key (CentOS 7 Official Signing Key) <security@centos.org>" imported
gpg: Total number processed: 1
gpg:               imported: 1  (RSA: 1)
[staf@centos7 iso]$ 

List the trusted gpg key:

1
2
3
4
5
6
7
staf@centos7 iso]$ gpg --list-keys
/home/staf/.gnupg/pubring.gpg
-----------------------------
pub   4096R/F4A80EB5 2014-06-23
uid                  CentOS-7 Key (CentOS 7 Official Signing Key) <security@centos.org>

[staf@centos7 iso]$ gpg --list-keys

Verify the sha256sum file

1
2
3
4
5
6
7
[staf@centos7 iso]$ gpg --verify sha256sum.txt.asc
gpg: Signature made Thu 31 Jan 2019 04:28:30 PM CET using RSA key ID F4A80EB5
gpg: Good signature from "CentOS-7 Key (CentOS 7 Official Signing Key) <security@centos.org>"
gpg: WARNING: This key is not certified with a trusted signature!
gpg:          There is no indication that the signature belongs to the owner.
Primary key fingerprint: 6341 AB27 53D7 8A78 A7C2  7BB1 24C6 A8A7 F4A8 0EB5
[staf@centos7 iso]$ 

The key fingerprint must match the one of RPM-GPG-KEY-CentOS-7.

Verify the iso file

1
2
3
4
[staf@centos7 iso]$ xz -d CentOS-7-x86_64-GenericCloud-1901.qcow2.xz
[staf@centos7 iso]$ sha256sum -c sha256sum.txt.asc 2>&1 | grep OK
CentOS-7-x86_64-GenericCloud-1901.qcow2: OK
[staf@centos7 iso]$ 

Image

info

The image we download is a normal qcow2 image, we can see the image information with qemu-info

1
2
3
4
5
6
7
8
9
[root@centos7 iso]# qemu-img info CentOS-7-x86_64-GenericCloud-1901.qcow2
image: CentOS-7-x86_64-GenericCloud-1901.qcow2
file format: qcow2
virtual size: 8.0G (8589934592 bytes)
disk size: 895M
cluster_size: 65536
Format specific information:
    compat: 0.10
[root@centos7 iso]# 

Copy & resize

The default image is small - 8GB - we might be using the image to provision other systems so it better to leave it untouched.

Copy the image to the location where we’ll run the virtual system.

1
2
3
[root@centos7 iso]# cp -v CentOS-7-x86_64-GenericCloud-1901.qcow2 /var/lib/libvirt/images/tst/tst.qcow2
'CentOS-7-x86_64-GenericCloud-1901.qcow2' -> '/var/lib/libvirt/images/tst/tst.qcow2'
[root@centos7 iso]# 

and resize it to the required size:

1
2
3
4
[root@centos7 iso]# cd /var/lib/libvirt/images/tst
[root@centos7 tst]# qemu-img resize tst.qcow2 20G
Image resized.
[root@centos7 tst]# 

cloud-init

We’ll create a simple cloud-init configuration file and generate an iso image with cloud-localds. This iso image holds the cloud-init configuration and will be used to setup the system during the bootstrap.

Install cloud-utils

It’s important to NOT install cloud-init on your KVM host machine. This creates a cloud-init service that runs during the boot and tries to reconfigure your host. Something that you probably don’t want on your KVM hypervisor host.

The cloud-util package has all the tool we need to convert the cloud-init configuration files to an iso image.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
[root@centos7 tst]# yum install -y cloud-utils
Loaded plugins: fastestmirror, langpacks
Loading mirror speeds from cached hostfile
 * base: centos.cu.be
 * extras: centos.cu.be
 * updates: centos.mirror.ate.info
Resolving Dependencies
--> Running transaction check
---> Package cloud-utils.x86_64 0:0.27-20.el7.centos will be installed
--> Processing Dependency: python-paramiko for package: cloud-utils-0.27-20.el7.centos.x86_64
--> Processing Dependency: euca2ools for package: cloud-utils-0.27-20.el7.centos.x86_64
--> Processing Dependency: cloud-utils-growpart for package: cloud-utils-0.27-20.el7.centos.x86_64
--> Running transaction check
---> Package cloud-utils-growpart.noarch 0:0.29-2.el7 will be installed
---> Package euca2ools.noarch 0:2.1.4-1.el7.centos will be installed
--> Processing Dependency: python-boto >= 2.13.3-1 for package: euca2ools-2.1.4-1.el7.centos.noarch
--> Processing Dependency: m2crypto for package: euca2ools-2.1.4-1.el7.centos.noarch
---> Package python-paramiko.noarch 0:2.1.1-9.el7 will be installed
--> Running transaction check
---> Package m2crypto.x86_64 0:0.21.1-17.el7 will be installed
---> Package python-boto.noarch 0:2.25.0-2.el7.centos will be installed
--> Finished Dependency Resolution

Dependencies Resolved

=======================================================================================
 Package                    Arch         Version                   Repository     Size
=======================================================================================
Installing:
 cloud-utils                x86_64       0.27-20.el7.centos        extras         43 k
Installing for dependencies:
 cloud-utils-growpart       noarch       0.29-2.el7                base           26 k
 euca2ools                  noarch       2.1.4-1.el7.centos        extras        319 k
 m2crypto                   x86_64       0.21.1-17.el7             base          429 k
 python-boto                noarch       2.25.0-2.el7.centos       extras        1.5 M
 python-paramiko            noarch       2.1.1-9.el7               updates       269 k

Transaction Summary
=======================================================================================
Install  1 Package (+5 Dependent packages)

Total download size: 2.5 M
Installed size: 12 M
Downloading packages:
(1/6): cloud-utils-growpart-0.29-2.el7.noarch.rpm               |  26 kB  00:00:01     
(2/6): cloud-utils-0.27-20.el7.centos.x86_64.rpm                |  43 kB  00:00:01     
(3/6): euca2ools-2.1.4-1.el7.centos.noarch.rpm                  | 319 kB  00:00:01     
(4/6): m2crypto-0.21.1-17.el7.x86_64.rpm                        | 429 kB  00:00:01     
(5/6): python-boto-2.25.0-2.el7.centos.noarch.rpm               | 1.5 MB  00:00:02     
(6/6): python-paramiko-2.1.1-9.el7.noarch.rpm                   | 269 kB  00:00:03     
---------------------------------------------------------------------------------------
Total                                                     495 kB/s | 2.5 MB  00:05     
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
  Installing : python-boto-2.25.0-2.el7.centos.noarch                              1/6 
  Installing : python-paramiko-2.1.1-9.el7.noarch                                  2/6 
  Installing : cloud-utils-growpart-0.29-2.el7.noarch                              3/6 
  Installing : m2crypto-0.21.1-17.el7.x86_64                                       4/6 
  Installing : euca2ools-2.1.4-1.el7.centos.noarch                                 5/6 
  Installing : cloud-utils-0.27-20.el7.centos.x86_64                               6/6 
  Verifying  : m2crypto-0.21.1-17.el7.x86_64                                       1/6 
  Verifying  : cloud-utils-growpart-0.29-2.el7.noarch                              2/6 
  Verifying  : python-paramiko-2.1.1-9.el7.noarch                                  3/6 
  Verifying  : python-boto-2.25.0-2.el7.centos.noarch                              4/6 
  Verifying  : euca2ools-2.1.4-1.el7.centos.noarch                                 5/6 
  Verifying  : cloud-utils-0.27-20.el7.centos.x86_64                               6/6 

Installed:
  cloud-utils.x86_64 0:0.27-20.el7.centos                                                                                                                                     

Dependency Installed:
  cloud-utils-growpart.noarch 0:0.29-2.el7      euca2ools.noarch 0:2.1.4-1.el7.centos      m2crypto.x86_64 0:0.21.1-17.el7      python-boto.noarch 0:2.25.0-2.el7.centos     
  python-paramiko.noarch 0:2.1.1-9.el7         

Complete!
[root@centos7 tst]# 

Cloud-init configuration

A complete overview of cloud-init configuration directives is available at https://cloudinit.readthedocs.io/en/latest/.

We’ll create a cloud-init configuration file to update all the packages - which is always a good idea - and to add a user to the system.

A cloud-init configuration file has to start with #cloud-config, remember this is YAML so only use spaces…

We’ll create a password hash that we’ll put into your cloud-init configuration, it’s also possible to use a plain-text password in the configuration with chpasswd or to set the password for the default user. But it’s better to use a hash so nobody can see the password. Keep in mind that is still possible to brute-force the password hash.

Some GNU/Linux distributions have the mkpasswd utility this is not available on centos. The mkpasswd utility is part of the expect package and is something else…

I used a python one-liner to generate the SHA512 password hash

1
python -c 'import crypt,getpass; print(crypt.crypt(getpass.getpass(), crypt.mksalt(crypt.METHOD_SHA512)))'

Execute the one-liner and type in your password:

1
2
3
4
[staf@centos7 ~]$ python -c 'import crypt,getpass; print(crypt.crypt(getpass.getpass(), crypt.mksalt(crypt.METHOD_SHA512)))'
Password: 
<your hash>
[staf@centos7 ~]$ 

Create config.yaml - replace <your_user>, <your_hash>, <your_ssh_pub_key> - with your data:

1
2
3
4
5
6
7
8
9
10
11
#cloud-config
package_upgrade: true
users:
  - name: <your_user>
    groups: wheel
    lock_passwd: false
    passwd: <your_passord_hash>
    shell: /bin/bash
    sudo: ['ALL=(ALL) NOPASSWD:ALL']
    ssh-authorized-keys:
      - <your_public_ssh_key>

And generate the configuration iso image:

1
2
3
root@centos7 tst]# cloud-localds config.iso config.yaml
wrote config.iso with filesystem=iso9660 and diskformat=raw
[root@centos7 tst]# 

Create the virtual system

Libvirt has predefined definitions for operating systems. You can query the predefined operation systems with the osinfo-query os command.

We use centos 7, we use osinfo-query os to find the correct definition.

1
2
3
[root@centos7 tst]# osinfo-query  os | grep -i centos7
 centos7.0            | CentOS 7.0                                         | 7.0      | http://centos.org/centos/7.0            
[root@centos7 tst]# 

Create the virtual system:

1
2
3
4
5
6
7
8
9
10
11
12
virt-install \
  --memory 2048 \
  --vcpus 2 \
  --name tst \
  --disk /var/lib/libvirt/images/tst/tst.qcow2,device=disk \
  --disk /var/lib/libvirt/images/tst/config.iso,device=cdrom \
  --os-type Linux \
  --os-variant centos7.0 \
  --virt-type kvm \
  --graphics none \
  --network default \
  --import

The default escape key - to get out the console is ^[ ( Ctrl + [ )

Have fun!

Links

March 01, 2019

As I wrote in my previous post, you might be seeing a lot more of Acquia in the coming weeks. If you listen to NPR, you may have heard our new radio ads.

Like our highway billboards and train station takeover, our NPR campaign is another great opportunity to reach commuters.

NPR is a national non-profit media organization with a network of more than 1,000 affiliated radio stations across the United States — and quite a few use Drupal and Acquia for their sites. It boasts listenership of nearly 30 million, and its airwaves reach nearly 99 percent of Americans.

Our NPR ads are running during the morning and evening commutes. In addition, Acquia ads will be featured on the Marketplace Tech podcast, which is popular among technology decision makers. Between the podcasts and radio ads, the potential reach is 64 million impressions.

We have always believed in doing well by doing good. Sponsoring NPR creates brand awareness for Acquia, but also supports NPR financially. High-quality media organizations are facing incredible challenges today, and underwriting NPR's work is a nice way for Acquia to give back.

February 28, 2019

The post Showing the DNS score in your dashboard & an updated layout appeared first on ma.ttias.be.

A new release of DNS Spy marks some useful improvements.

We’ve had our public DNS rating system for a little over a year now. Every day, hundreds of sites get scanned and receive recommendations for how to improve the resilience & setup of their nameservers. If you haven’t tried it out yet, go have a look.

Despite us having that scoring system available on our website for everyone, we never showed the score of a domain of a paying subscriber.

Until now.

Source: Showing the DNS score in your dashboard & an updated layout -- DNS Spy Blog

The post Showing the DNS score in your dashboard & an updated layout appeared first on ma.ttias.be.

February 27, 2019

If you pass through Kendall Square MBTA station in the Boston area, you'll see a station "takeover" starting this week featuring the Acquia brand.

Like our highway billboards introduced in December, the goal is for more people to learn about Acquia during their commutes. I'm excited about this campaign, because Acquia often feels like a best-kept secret to many.

The Kendall Square station takeover will introduce Acquia to 272,000 daily commuters in one of the biggest innovation districts in the Boston area – and home to the prestigious MIT.

An Acquia poster at Kendall Square station featuring an Acquia employee
Acquia branding on the turnstyles

In addition to posters on every wall of the station, the campaign includes Acquia branding on entry turnstiles, 75 digital live boards, and geo-targeted mobile ads that commuters may see while looking at their phones while waiting for the train. It will be hard not to be introduced to Acquia.

An Acquia poster at Kendall Square station featuring an Acquia employee

What makes this extra special is that all of the ads feature photographs of actual Acquia employees (Acquians, as we call ourselves), which is a nice way to introduce our company to people who may not know us.

Où je poursuis ma déconnexion en explorant les deux grands types de réseaux sociaux, la manière dont ils nous rendent dépendants et comment ils corrompent les plus grands esprits de ce siècle.

Dans l’étude de mon addiction aux réseaux sociaux, je me suis rendu compte qu’il en existait deux types : les réseaux symétriques et ceux qui sont asymétriques.

Dans les réseaux symétriques, comme Facebook ou Linkedin, une connexion est toujours partagée d’un commun accord. Une des personnes doit faire une demande, l’autre doit l’accepter. Le résultat est que chacun voit ce que poste l’autre. Même s’il existe des mécanismes pour « cacher » certains de vos amis ou « voir moins de posts de cette personne », il est implicitement acquis que « Si je vois ce qu’il poste, il voit ce que je poste ». Ce fallacieux postulat donne l’impression d’un lien social. Le fait de recevoir une demande de connexion est donc source d’une décharge de dopamine. « Youpie ! Quelqu’un veut être en relation avec moi ! ». Mais également source de surcharge cognitive : dois-je accepter cette personne ? Où tracer la frontière entre ceux que j’accepte et les autres ? Que va-t-elle penser si je ne l’accepte pas ? Je l’aime bien, mais pas au point de l’accepter, etc.

Facebook joue très fort sur l’aspect émotionnel du social. Son addiction vient du fait qu’on a l’impression d’être en lien avec des gens qu’on aime et qui, par réciprocité de la relation, devraient nous aimer. Ne pas aller sur Facebook revient à ne pas écouter ce que disent nos amis, à ne pas s’intéresser à eux. Il s’agit donc de l’exploitation commerciale pure et simple de notre instinct grégaire. Alléger son flux en « unfollowant » est une véritable violence, car « Je l’aime bien quand même » ou « Elle poste parfois des trucs intéressants que je risque de rater » voire « Elle va croire que je ne l’aime plus, que je ne veux plus rien avoir à faire avec elle ».

Linkedin joue dans la même cour, mais exploite plutôt notre peur de rater des opportunités. Tout contact sur Linkedin se fait avec l’arrière-pensée « Un jour, cette personne pourrait me rapporter de l’argent, mieux vaut l’accepter ».

Personnellement, pour ne pas avoir à prendre de décisions, j’ai décidé d’accepter absolument toute requête de connexion sur ces réseaux. Le résultat est assez génial : ils ont perdu tout intérêt pour moi, car ils sont un flux complètement inintéressant de gens dont je n’ai pas la moindre idée qui ils sont. De leur côté, ils sont sans doute contents que je les aie acceptés sans que ça ne change rien à ma vie. Bref, tout est pour le mieux.

Mais il existe une deuxième classe de réseaux sociaux dits « asymétriques » ou « réseaux d’intérêts ». Ce sont Twitter, Mastodon, Diaspora et le défunt Google+.

Asymétriques, car on peut y suivre qui on veut et n’importe qui peut nous suivre. Cela rend le follow/unfollow beaucoup plus facile et permet d’avoir un flux bien plus centré sur nos intérêts.

L’asymétrie est un mécanisme qui me convient. Twitter et Mastodon me plaisent énormément.

Le follow étant facile, mon flux se remplit continuellement. Ces deux plateformes sont une source ininterrompue de « distractions ». Mais, contrairement à Facebook et Linkedin, je les trouve intéressantes. Comment ne pas redevenir dépendant ?

Se déconnecter trois mois, c’était bien. Mais pourrais-je établir une stratégie tenable sur le long terme ? Il ne faut pas réfléchir en termes de volonté, mais bien en termes de biologie : comment faire en sorte qu’aller sur une plateforme ne soit pas source de dopamine ?

Là où sur Facebook je suis tout le monde, rendant le truc inutile (Facebook m’aide beaucoup avec une interface que je trouve insupportablement moche et complexe), sur Twitter et Mastodon j’ai décidé de ne suivre presque personne.

Processus cruel qui m’a obligé d’unfollower des gens que j’aime beaucoup ou que je trouve très intéressants. Mais, bien souvent, il s’agit aussi d’anciennes rencontres, des personnes avec qui je n’ai plus de contact depuis des mois voire des années. Ces personnes sont-elles encore importantes dans ma vie ? En restreignant de manière drastique les comptes que je suis, le résultat ne s’est pas fait attendre. Le lendemain matin, il y’avait trois nouveaux tweets dans mon flux. Trois !

Cela m’a permis de remarquer que, malgré mon blocage systématique des comptes qui font de la publicité, un tweet sur trois de mon flux est sponsorisé. Pire : après quelques jours, Twitter semble avoir compris l’astuce et me propose désormais des tweets de gens qui sont suivis par ceux que je suis moi-même.

Exemple parfait : Twitter essaie de m’enrôler dans ce qui ressemble à une véritable flamewar mêlant antisémitisme et violences policières sous le seul prétexte qu’un des participants à cette guéguerre est suivi par deux de mes amis.

Publicités et insertion de flamewars aléatoires dans mon flux, Twitter est proprement insupportable. C’est un outil qui fonctionne contre ma liberté d’esprit. Je ne peux que vous encourager à faire le saut sur Mastodon, ça vaut vraiment la peine sur le long terme et, sur Mastodon, ma stratégie d’unfollow massif fonctionne extrêmement bien. Je redécouvre les pouets (c’est comme ça qu’on dit sur Mastodon) de mes amis, messages qui étaient auparavant noyés dans un flux gigantesque de libristes (ce qu’on trouve principalement sur Mastodon).

Après quelques jours, force fut de constater que j’étais de nouveau accro ! Je répondais à des tweets, me retrouvais embarqué dans des discussions. Seule solution : unfollower ceux qui postent souvent, malgré mon intérêt pour eux.

J’admire profondément des gens comme Vinay Gupta ou David Graeber. Ils m’inspirent. j’aime lire leurs idées lorsqu’elles sont développées en longs billets voire en livres. Mais sur Twitter, ils s’éparpillent. Je dois trier et lutter pour ne pas être intéressé par tout ce qu’ils postent.

En ce sens, les réseaux sociaux sont une catastrophe. Ils permettent aux grands esprits de décharger leurs idées sans prendre la peine de les compiler, les mettre en forme. Twitter, c’est un peu comme un carnet de note public sur lequel tu ne reviens jamais.

Je me demande s’ils écriraient plus au format blog sans Twitter. Cela me semble plausible. J’étais moi-même dans ce cas. Beaucoup de blogueurs l’avouent également. Mais alors, cela signifierait que les réseaux sociaux sont en train de corrompre même les plus grands esprits que sont Graeber et Gupta ! Quelle perte ! Quelle catastrophe ! Combien de livres, combien de billets de blog n’ont pas été écrits parce que la frustration de s’exprimer a été assouvie par un simple tweet aussitôt perdu dans les méandres d’une base de données centralisée et propriétaire ?

Au fond, les réseaux sociaux ne font que rendre abondant ce qui était autrefois rare : le lien social, le fait de s’exprimer publiquement. Et, je me répète, rendre rare ce qui était autrefois abondant : l’ennui, la solitude, la frustration de ne pas être entendu.

Ils nous induisent en erreur en nous faisant croire que nous pouvons être en lien avec 500 ou 1000 personnes qui nous écoutent. Que chaque connexion a de la valeur. En réalité, cette valeur est nulle pour l’individu. Au contraire, nous payons avec notre temps et notre cerveau pour accéder à quelque chose de très faible valeur voire d’une valeur négative. Plusieurs expériences semblent démontrer que l’utilisation des réseaux sociaux crée des symptômes de dépression.

On retrouve une constante dans l’histoire du capitalisme : toute innovation, toute entreprise commence par créer de la valeur pour ses clients et donc pour l’humanité. Lorsque cette valeur commence à baisser, l’entreprise disparait ou se restructure. Mais, parfois, une entreprise a acquis tellement de pouvoir sur le marché qu’elle peut continuer à croître en devenant une nuisance pour ses clients. Que ce soit techniquement ou psychologiquement, ceux-ci sont captifs.

Facebook (et donc Instagram et Whatsapp), Twitter et Google sont arrivés à ce stade. Ils ont apporté des innovations extraordinaires. Mais, aujourd’hui, ils sont une nuisance pour l’humain et l’humanité. Ils nous trompent en nous apportant une illusion de valeur pour monétiser nos réflexes et nos instincts. L’humanité est malade d’une hypersocialisation distractive dopaminique à tendance publicitaire.

Heureusement, prendre conscience du problème, c’est un premier pas vers la guérison.

Photo by Donnie Rosie on Unsplash

Je suis @ploum, conférencier et écrivain électronique. Si vous avez apprécié ce texte, n'hésitez pas à me soutenir sur Tipeee, Patreon, Paypal, Liberapay ou en millibitcoins 34pp7LupBF7rkz797ovgBTbqcLevuze7LF. Vos soutiens réguliers, même symboliques, sont une réelle motivation et reconnaissance. Merci !

Ce texte est publié sous la licence CC-By BE.

February 26, 2019

Le face à face continue entre Nellio et Eva, d’une part, et Georges Farreck, le célèbre acteur, et Mérissa, une femme mystérieuse qui semble contrôler tout le conglomérat industriel d’autre part.

Mérissa reste interdite. Eva la pousse dans ses retranchements.

— Pourquoi as-tu choisir d’avoir des enfants Mérissa ?
— Je…

D’un geste machinal, elle appelle le chat qui bondit sur ses genoux et frotte son crâne contre la fine main blanche. Après deux mouvements, lassé, il saute sur le sol sans un regard en arrière. Les yeux de Mérissa s’emplissent de tristesse.

Georges Farreck s’est approché. Amicalement, il lui pose la main sur l’épaule. Elle le regarde et il lui répond silencieusement avec une moue interrogatrice. Éperdue, elle pose ses yeux tour à tour sur chacun de nous.
— Je suis la femme la plus puissante du monde. Je suis la plus belle réussite de l’histoire du capitalisme voire, peut-être, de l’histoire de l’humanité. J’ai conquis l’humanité sans guerre, sans combat.
— Sans guerre ouverte, sifflé-je entre mes dents. Mais au prix de combien de morts ?

Eva me lance un regard sévère et ignore délibérément mon interruption.
— Pourquoi vouloir avoir des enfants Mérissa ?
— Parce que…

Comme un barrage soumis à une trop forte pression, elle cède brutalement.
— Parce que tout simplement je voulais savoir ce que c’était de créer la vie. Parce que j’ai été éduquée avec cette putain de croyance qu’une femme n’est complète qu’en pondant des mioches. Parce que j’ai quatre-vingt-neuf ans, j’en parais quarante et je suis partie pour en vivre deux cents mais que je n’ai plus rien à faire de ma vie. J’ai conquis le monde et je m’ennuie. Alors n’essayez pas de me faire le couplet de la plus belle expérience du monde, de l’altruisme, de l’empathie. Malgré toute notre technologie, j’ai été malade comme une chienne, j’ai eu des nausées, je me sens alourdie, difforme, handicapée. Et pourtant…

Elle se tient le ventre et claudique jusqu’à son bureau.

— Et pourtant, j’aime ces deux êtres qui me pompent et m’affaiblissent. J’ai envie de créer pour eux le meilleur. Je souhaite qu’ils soient heureux.

Elle nous regarde.

— Si je coupe l’algorithme, ils vivront dans un monde inconnu. Je ne peux garantir leur bonheur.
— Et si tu ne coupes pas l’algorithme ? susurre Eva.
— Alors, au pire ils connaitront la guerre. Au mieux, ils connaitront le bonheur…
— Le bonheur d’être les esclaves de l’algorithme ! m’écrié-je. Comme nous tous ici.
— Vous étiez très heureux tant que vous ne le saviez pas !
— Et tu pourrais ne pas le dire à tes enfants en espérant qu’ils ne le découvrent jamais ?

Elle nous lance un regard froid, cynique.

— Si je coupe l’algorithme, quelqu’un d’autre en créera un. Peut-être qu’il sera pire !
— Peut-être meilleur, susurre Georges Farreck.
– Et si c’était déjà le cas ? demandé-je. Est-on sûr que FatNerdz soit réellement un avatar de l’algorithme ? Après tout, Eva est issue de l’algorithme. Elle s’est rebellée. FatNerdz est probablement un sous-logiciel avec ses propres objectifs. Il ne doit pas être le seul. Si j’étais l’algorithme, je lancerai des programmes défensifs chargés d’identifier les algorithmes intelligents susceptibles de me faire de la concurrence.

Georges ne semble pas en croire ses yeux.

— Une véritable guerre virtuelle…
— Dont nous avons été les soldats, les trouffions, la chaire à canon.

Furieux, je crache ma haine en direction d’Eva.

— Ainsi, c’est ce que je suis, ce que nous sommes pour toi. De simples pions.
— Nellio ! hurle-t-elle. Je suis devenue humaine.
— De toutes façons, cela signifie qu’on ne peut plus couper l’algorithme. Autant chercher à couper Internet !
— Effectivement, murmure Mérissa d’une voix lourde. Mais j’ai développé un anti-algorithme. Un programme qui a accès à toutes les données de l’algorithme mais qui a pour seul et unique objectif de le contrer. Et de contrer toutes ses actions. J’ai pensé que cela serait utile si jamais l’algorithme tombait sous la coupe d’un concurrent.

Du bout des doigts, elle pianote sur le bureau. Quelques lignes de commande apparaissent sur un écran.

— Ma décision est prise depuis longtemps. Je vais lancer ce contre-algorithme. Cela m’amuse beaucoup. Mais cela m’amusait également de vous entendre argumenter. Je n’ai qu’à appuyer ici et…

Les murs se mettent soudain à clignoter. D’énormes araignées rampent sur les plafonds, les lumières clignotent, un effroyable crissement envahit la pièce.

— L’algorithme se défend ! nous crie Eva. Il essaie de nous désorienter. Il a donc développé un module d’analyse des comportements humains pour se prémunir de toute agression.
— J’ai… J’ai perdu les eaux ! hurle Mérissa, le visage pâle comme la mort.

Sous ses pieds une mare se dessine. Un liquide coule le long de ses jambes. Elle chancelle, s’appuie sur le bureau.

— Il faut… Il faut lancer le contre-algorithme, bégaie-t-elle.

Eva la soutient, les murs lancent des éclairs, les araignées grandissent, se transforment en bébés vomissant et grimaçant. Dans mon cerveau embrouillé, l’eau qui dégouline entre les jambes de Mérissa se mélange avec le vomi virtuel qui semble suinter le long des murs.

— L’algorithme ne peut rien faire physiquement, il faut se concentrer, ne pas se laisser distraire ! nous exhorte Eva tout en soutenant l’octogénaire parturiente.

Une froide douleur me transperce soudain. Je baisse les yeux. Un poinçon d’acier me traverse de part en part et me sort de l’abdomen. Une douce torpeur succède à la douleur et irradie depuis mon ventre. J’empoigne le poinçon à deux mains, je tente vainement de le tirer, de le comprimer avant de m’écrouler vers l’avant.

Les motifs du sol me semblent mouvants, passionnants. À coté de moi, le visage de Georges Farreck s’écrase soudain. Il gémit, roule des yeux horrifiés. Georges Farreck ! Je souris en le regardant, en imaginant l’érection que son corps provoque en moi.

Un museau et de longs poils gris me chatouillent le visage. Difficilement, je tente de garder les yeux ouverts mais une patte se pose sur mon front et je m’affaisse, épuisé.

Autour de moi, le bruit me semble s’atténuer. J’ai froid. Je n’éprouve plus le besoin de respirer.

Vais-je me réveiller dans un printeur ?

Photo par Malavoda

Je suis @ploum, conférencier et écrivain électronique. Si vous avez apprécié ce texte, n'hésitez pas à me soutenir sur Tipeee, Patreon, Paypal, Liberapay ou en millibitcoins 34pp7LupBF7rkz797ovgBTbqcLevuze7LF. Vos soutiens réguliers, même symboliques, sont une réelle motivation et reconnaissance. Merci !

Ce texte est publié sous la licence CC-By BE.

February 25, 2019

The post Run a Bitcoin Lightning Node on CentOS 7 appeared first on ma.ttias.be.

Similar to installing a Bitcoin Core full node, you can run a Lightning Node too. The same developer dependencies are needed.

Prepare your build environment to compile the Lightning Node

The next steps will install a compiler and all development libraries needed to compile a Lightning Network node.

$ yum -y install epel-release

Once EPEL is installed (which adds additional repositories), you can install all needed dependencies.

$ yum install -y autoconf automake boost-devel gcc-c++ git libdb4-cxx libdb4-cxx-devel libevent-devel libtool openssl-devel wget libsodium-devel gmp-devel sqlite-devel python34 asciidoc clang python2-devel pythong34-devel python34-pip

Next, compile the Lightning Network node.

Compile a Lightning Network node from source

With all dependencies in place, it's time to compile a Lightning Network node. I'll start by creating a custom user that will run the daemon.

$ useradd lightning
$ su - lightning

Now, while running as the new lightning user, clone & compile the project.

$ git clone https://github.com/ElementsProject/lightning.git
$ cd lightning
$ git checkout v0.6.3
$ ./configure
$ make -j $(nproc)

The above downloads and builds version 0.6.3 of the Lightning Network daemon, for a full list of available releases check out their github release page.

Once compiled, you'll find the lightning daemon in lightning/lightningd.

$ lightningd/lightningd --version
v0.6.3

The post Run a Bitcoin Lightning Node on CentOS 7 appeared first on ma.ttias.be.

The post Limit the disk space consumed by Bitcoin Core nodes on Linux appeared first on ma.ttias.be.

If you run a Bitcoin Core node, by default it will download the entire blockchain on startup and keep a list of every block & transaction. If you're limited in diskspace, you can instruct the Bitcoin Code daemon to limit the amount of storage the blockchain will take up.

I'll assume the Bitcoin Core blockchain is being kept at /home/bitcoin/.bitcoin/. If you run your node as a different user, look for the .bitcoin hidden directory in your home directory.

In there, either a bitcoin.conf file already exists, or you can create one.

To limit the amount of diskspace being consumed, set the prune directive.

$ cat /home/bitcoin/.bitcoin/bitcoin.conf
prune=1000

The prune= accepts as a parameter the size in MB's that you want to keep. This example above limits the blockchain to 1GB (= 1000MB).

There's a caveat to limiting the diskspace those, as explained by the manual;

-prune=n: This mode is incompatible with -txindex and -rescan. Warning: Reverting this
setting requires re-downloading the entire blockchain. (default: 0 = disable pruning blocks,
1 = allow manual pruning via RPC, >550 = automatically prune block files to stay under the
specified target size in MiB)

It makes sense, too: if the entire blockchain isn't present on the local disk, you also can't use all the tools that require the local blockchain to be complete.

The post Limit the disk space consumed by Bitcoin Core nodes on Linux appeared first on ma.ttias.be.

The post Run a Bitcoin Core full node on CentOS 7 appeared first on ma.ttias.be.

It's fairly simple to run a full bitcoin node on CentOS 7, if you want to compile one from source. Alternatively, you can run the bitcoind daemon in a Docker container too. These steps will get your server ready to compile Bitcoin from source.

Prepare your build environment to compile Bitcoin Core

The next steps will install a compiler and all development libraries needed to compile Bitcoin Core.

$ yum -y install epel-release

Once EPEL is installed (which adds additional repositories), you can install all needed dependencies.

$ yum install -y autoconf automake boost-devel gcc-c++ git libdb4-cxx libdb4-cxx-devel libevent-devel libtool openssl-devel wget

Next, compile Bitcoin Core.

Compile Bitcoin Core from source

With all dependencies in place, it's time to compile Bitcoin Core. I'll start by creating a custom user that will run the daemon.

$ useradd bitcoin
$ su - bitcoin

Now, while running as the new bitcoin user, clone & compile the project.

$ git clone https://github.com/bitcoin/bitcoin.git
$ cd bitcoin
$ git checkout v0.17.1

These steps prepare version 0.17.1 on your system. For an up-to-date list of which versions have been tagged, look at the Github releases of Bitcoin Core.

Now with the correct code in place, time to compile.

$ ./autogen.sh
$ ./configure
$ make -j $(nproc)

This'll take a couple of minutes to fully compile.

Running Bitcoin Core

With these steps completed, you now have a couple of binaries in place to help you run Bitcoin Core.

$ ls -alh src/
...
-rwxrwxr-x.  1 bitcoin bitcoin  8.3M Feb 20 16:45 bitcoin-cli
-rwxrwxr-x.  1 bitcoin bitcoin  114M Feb 20 16:45 bitcoind
...

You can run them from the compiled src directory, or move them over to a location where you prefer to keep your binaries.

If you followed these steps, you'll find the CLI tool at /home/bitcoin/bitcoin/src/bitcoin-cli

$ /home/bitcoin/bitcoin/src/bitcoin-cli --version
Bitcoin Core RPC client version v0.17.1

And the Bitcoin Core daemon at /home/bitcoin/bitcoin/src/bitcoind.

$ /home/bitcoin/bitcoin/src/bitcoind --version
Bitcoin Core Daemon version v0.17.1
Copyright (C) 2009-2018 The Bitcoin Core developers

Have fun!

The post Run a Bitcoin Core full node on CentOS 7 appeared first on ma.ttias.be.

February 23, 2019

The Call-for-Presentation is open for LOADays 2019. The CfP runs till end of March 2019, 31-03-2019. Please take a look on https://cfp.loadays.org/2019/ The event takes place on 4th and 5th of May 2019 in Antwerp, Belgium.

February 22, 2019

Lettre ouverte aux organisateurs de conférences

Chèr-e organisateur-trice ,

Félicitations pour avoir mis en place ton événement, d’avoir trouvé le lieu, les sponsors, les budgets. C’est un fameux travail, j’en suis conscient.

Le point d’orgue de ton événement est une conférence ou une table ronde à laquelle tu me proposes de participer. Je suis flatté de ton intérêt.

Cependant, tu espères qu’on n’abordera pas la question de la rétribution, tu laisses cette question en suspens comme s’il tombait sous le sens que ma participation devrait être bénévole.

Lorsque je pose la question et que tu n’as pas de budget pour me payer ou même me défrayer, tu argueras que cela me fait « une belle visibilité ».

Mais tu dois être conscient que la visibilité ne se mange pas, que la visibilité ne sert à rien si ce n’est à obtenir des propositions pour d’autres conférences gratuites.

Pire : lors de ton événement, je toucherai peut-être une centaine de personnes. Bref, l’équivalent d’un tweet. Non seulement la visibilité n’est pas rentable, mais celle que tu me proposes est ridicule.

Tu sous-entends également que j’ai besoin de visibilité. Or, si tu m’as trouvé, c’est que j’ai déjà la visibilité dont j’ai besoin. Et peut-être que certains d’entre nous ne cherchent pas de la visibilité à tout prix.

Bref, lorsque tu y réfléchis, ton argument est à la limite de l’injure. Sans compter que tout le reste de ton événement est largement payant : présence de sponsors, location de la salle, impression des affiches et, le plus souvent, prestataires techniques. Au final, seul le “clou du spectacle” est gratuit. Et peut-être toi-même si tu as le plus souvent un salaire. N’est-ce pas un peu paradoxal ? N’est-ce pas un peu injuste que je doive, en plus de mon travail, payer mon moyen de transport pour venir parler entre deux panneaux faisant la promotion d’une grande banque ?

Et si la préparation occupe ton esprit en permanence depuis des semaines voire des mois, n’oublie pas que ce n’est pas mon cas. Si j’accepte de participer bénévolement, je n’ai pas pour autant accepté des réunions de préparation, des dizaines d’échange par email, plusieurs coups de téléphone et une inscription sur ta newsletter ou ta plateforme de communication interne. Ce n’est pas non plus à moi de devoir quémander toutes les informations sur le lieu, la date, le format, ce qui est attendu de moi tout en devant m’adapter aux changements de dernière minute.

Je ne souhaite pas te décourager. Je trouve très bien qu’il y’ait des événements gratuits et, personnellement, j’accepte très régulièrement d’intervenir gratuitement avec plaisir. Les motivations me sont propres et varient d’une proposition à l’autre : le projet me plait, j’avais envie de visiter l’endroit, je souhaite rencontrer l’un des autres conférenciers ou, tout simplement, j’ai l’impression que cela correspond à ma mission de vie. La gratuité n’est donc pas synonyme d’exclusion et le fait de me payer n’est pas une garantie d’acceptation (sauf à partir d’une certaine somme, je suppose). L’argent n’est qu’un élément de la balance, mais il est non négligeable.

Je souhaiterais juste que tu sois un peu plus honnête et explicite dès la prise de contact. Que tu poses directement les conditions et les modalités pratiques. M’offrir de la “visibilité”, je le prends comme une insulte, cela me donne envie de refuser directement. Prétendre ne pas avoir de budget lorsqu’on affiche partout le sponsor d’une grande banque ou qu’on est une énorme organisation publique qui consomme des milliards d’argent public chaque année, je trouve ça à la limite de la malhonnêteté intellectuelle.

Merci pour ton attention et bonne chance pour ton événement.

Photo by ål nik on Unsplash

Je suis @ploum, conférencier et écrivain électronique. Si vous avez apprécié ce texte, n'hésitez pas à me soutenir sur Tipeee, Patreon, Paypal, Liberapay ou en millibitcoins 34pp7LupBF7rkz797ovgBTbqcLevuze7LF. Vos soutiens réguliers, même symboliques, sont une réelle motivation et reconnaissance. Merci !

Ce texte est publié sous la licence CC-By BE.

February 21, 2019

I published the following diary on isc.sans.edu: “Simple Powershell Keyloggers are Back”:

Powershell is a very nice language in Windows environments. With only a few lines of code, we can implement nice features… for the good or the bad!

While hunting, I found a bunch of malicious Powershell scripts that implement a basic (but efficient) keylogger. The base script is always the same but contains connection details modified by script kiddies. The current script is based on an old one from 2015. This time, it has been modified to add the following features… [Read more]

[The post [SANS ISC] Simple Powershell Keyloggers are Back has been first published on /dev/random]

J’étais un peu étourdi, ne sachant pas trop ce qui m’était arrivé.

— À quel type d’enfer croyez-vous ?

— Pardon ?

Le gros type qui m’avait adressé la parole se tenait derrière un bureau, entre un vieil ordinateur à écran cathodique et une pile de classeurs. La préhistoire quoi ! Passant ma vie entre deux startups et autres espaces de coworking décorés par des Suédois sous LSD, j’avais oublié l’existence de cette classe de personnage.

— Je vous demande à quel type d’enfer vous croyez, articula-t-il d’une bouche pâteuse.

— Ben je ne crois pas à l’enfer, parvins-je à répondre en me massant la mâchoire.

Il se caressa le menton avant de lever ses lunettes sur son crâne gras et chauve, comme pour mieux lire la fiche qu’il tenait entre les doigts.

— hm… C’est embêtant, très embêtant.

— Écoutez, je ne sais pas ce que je fais ici, mais on n’est certainement pas là pour discuter philosophie.

— Vous êtes sûr de ne pas croire en un enfer ? Même un petit ? Pas nécessairement les diables, les flammes et tout le tralala. Ça peut être une obscurité éternelle, l’immobilité, une prison…

— Mais puisque je vous dis que je ne crois pas en tout ça ! Je suis athée.

— Et ils n’ont pas d’enfer les athées ?

— Pas à ma connaissance, non.

— hm… Très embêtant.

— Écoutez mon vieux, on ne va pas y passer la nuit !

— Oh rassurez-vous, ça n’est pas le problème. C’est juste que j’ai d’autres dossiers à traiter et que vous n’êtes pas le seul.

— Le plus vite je serai sorti d’ici, le mieux ce sera, fis-je, commençant sentir monter en moi l’énervement annonciateur de mes trop fréquentes colères.

Le gros chauve me regardait calmement derrière ses lunettes qu’il avait rabaissées sur son nez en marmonnant. 

— C’est que le règlement est très clair, vous savez. Regardez vous-même, article 12.

Il ouvrit un classeur qu’il me tendit. Les lettres dansaient devant mes yeux et formaient une écriture incompréhensible.

— Je n’arrive pas à lire.

— Ah oui, pardon. J’oubliais. Je vous traduis : « Tout défunt sortira du bureau d’orientation vers l’enfer correspondant à sa croyance ».

— Défunt ?

Machinalement, je me mis à chercher la caméra cachée.

— Notez qu’on pourrait peut-être trouver une solution approximative. Est-ce que ne pas croire en l’enfer est similaire à craindre l’oubli éternel et le néant ? Nous avons un enfer parfait pour cela. Cela vous conviendrait-il ?

— Mais pas du tout ! Je vous dis que je ne crois pas en l’enfer, pas même au néant éternel !

— Écoutez, j’essaie de vous trouver un enfer, vous pourriez faire un effort. Avouez que le néant, c’est assez similaire, non ?

— Attendez un instant. Vous avez dit “défunt” ?

— Oui, bien entendu pourquoi ?

— J’essaie juste de comprendre. C’est une blague, c’est ça ?

— Pas du tout. Le règlement est très clair. « Tout défunt sortira… »

— Oui, j’ai compris. Mais qu’est-ce que ça a à voir avec moi ?

Ce fut à son tour d’avoir l’air surpris.

— Vous voulez dire que… que vous n’êtes pas au courant ?

— Au courant de quoi ?

— Que vous êtes mort ?

Je le regardai avec un grand sourire.

— Pas mal. Mais à moi on ne la fait pas. C’est un peu gros.

— Écoutez, mon boulot c’est de vous trouver un enfer. Pas de vous convaincre. Alors on va faire une petite entorse au règlement. Je vous fais un mot pour ma collègue du bureau 14A, au dix-septième. Vous irez la voir, elle va certainement trouver une solution. Si ça ne va pas, vous revenez ici. On fait comme ça ?

Je n’avais pas vraiment le choix et, en toute sincérité, je pensais que toute occasion était bonne pour sortir de ce bureau. Je pris donc le papier griffonné qu’il me tendait et parti sans demander mon reste. Des gens s’agglutinaient sur de vieilles chaises alignées le long des murs des couloirs, entrecoupées de temps à autre par des tables basses croulantes sous des magazines édités avant ma naissance. Je ne me souvenais pas être entré dans ce bâtiment et je ne comptais pas y rester plus de temps que nécessaire.

Suivant les panneaux, je m’élançai dans ce couloir qui bifurqua plusieurs fois. Après plusieurs centaines de mètres, je constatai avec effroi que j’étais de retour devant le bureau que je venais de quitter. Sans ménagement, je demandai à un petit vieux écroulé sur sa chaise le chemin des ascenseurs. Il m’indiqua d’un doigt tremblant la direction d’où je venais. Une petite vieille à peine moins grabataire lui tapa sur le doigt en le grondant et en me désignant la direction opposée. Heureusement, un troisième larron vint à ma rescousse.

— Le couloir tourne autour de la cage d’ascenseur. Quand vous verrez des plantes vertes, prenez la double porte en bois.

En appelant l’ascenseur, je me fis la réflexion que, sans cet anonyme bienfaiteur, j’aurais pu tourner longtemps, les plantes masquant un recoin de mur où se découpait la porte menant aux ascenseurs. Je pénétrai dans la cabine tout en maudissant l’architecte. Sans hésiter, je me rendis au rez-de-chaussée.

Mes pas résonnaient dans le grand hall de marbre à mesure que je me dirigeais vers les grandes portes translucides dans leur châssis doré. Au moment où j’allais les franchir, une main puissante se posa sur mon épaule.

— Éh là, où allez-vous comme ça ?

Je pris un air surpris.

— Je rentre chez moi !

Le garde se tourna vers un de ses collègues et s’esclaffa :

— Il rentre chez lui ! C’est la meilleure de l’année.

— Ici c’est l’entrée ! On ne sort pas ! Imaginez un peu si on sortait par l’entrée ? poursuivit son collègue.

— Et bien, aurez-vous l’obligeance de m’indiquer la sortie alors ?

— Ça, c’est au bureau d’orientation de vous la trouver. Le règlement est très clair : « Tout défunt sortira… ».

— Oui, merci, je la connais. Mais moi, je fais quoi ?

— Et bien vous allez au bureau d’orientation !

— Mais j’en sors justement !

Ce fut au tour des gardes d’avoir l’air étonnés.

— Comment ? Comme ça ? Mais… Ce n’est pas conforme au règlement !

Je me mis à broder.

— Il m’a dit qu’il faisait une petite entorse pour moi, car il fallait que j’aille chercher quelque chose que j’avais oublié.

Les gardes me regardaient, bouche-bée. Pour les impressionner, je tendis le papier que m’avait donné le gros chauve, l’agitant pour ne pas leur donner l’opportunité de lire les détails.

— Ah, mais attendez ! Vous devez aller au dix-septième.

— Bureau 14A, renchérit son alter ego dans la bêtise.

Ils se regardèrent.

— C’est pas très réglementaire tout ça.

— En même temps, nous, c’est pas nos affaires.

— Juste. Et bien monsieur, on va donc vous accompagner jusqu’à l’ascenseur.

Tentant de cacher mon exaspération, j’appuyai sur le premier bouton qui se présenta. Le hall des ascenseurs était couvert d’une imitation de marbre gris-rougeâtre. Quatre cabines de chaque côté, je rentrai dans la première qui s’ouvrit et enfonçai le bouton dix-sept tout en faisant un petit geste de la main à mes cerbères.

Arrivé à l’étage indiqué, je me dis que je n’avais rien à perdre et me mis en quête du bureau quatorze. Je toquai à la porte, une dame boudinée en train de manger des nouilles chinoises dans un carton me reçut, le menton dégoulinant de sauce.

— Qu’est-ce que c’est ?

Je tendis le papier.

— Mais vous devez aller au bureau 14A !

— Ben oui, c’est pas ici ?

— Non, ici c’est le 14B ! Le 14A, c’est dans l’autre tour.

— Pardon ?

— L’autre tour ! Vous devez redescendre jusqu’au rez-de-chaussée et prendre les ascenseurs d’en face, pour l’autre tour. C’est quand même pas compliqué !

— Excusez-moi, mais c’est la première fois que je viens…

— Normal, on vient rarement une seconde fois.

— Surtout que je ne suis pas venu de mon plein gré !

— Peu de monde vient ici de son plein gré.

Je poussai un profond soupir.

— Bref, je suis bon pour tout redescendre.

— Il y’a une passerelle entre les tours au sixième. Ça peut vous faire gagner du temps.

Je sortis et pris la direction du sixième étage. Après quelques tours de l’étage, je finis par dégoter un couloir avec des panneaux indiquant “Tour A”. Je me félicitai de cette petite victoire. Je m’attendais à un panneau de type “En réfection, merci de passer par le rez-de-chaussée”, mais, contre toute attente, il ne vint pas. En quelques minutes, je fus au dix-septième étage.

L’étage semblait formé d’un couloir circulaire traversé par deux couloirs parallèles. Des portes rigoureusement identiques constellaient les cloisons d’un vert déteint. Je suivis la série des bureaux un, deux, trois… jusqu’à onze. Après le onze s’ouvrait le bureau vingt-trois. Puis le dix-sept. Le trente. Il n’y avait absolument aucune logique. Il me fallut parcourir trois fois chaque couloir avant de découvrir le quatorze, qui était entre le trois et le cinq, mais que, machinalement, je prenais à chaque fois pour le quatre.

Je tentai de maitriser mes nerfs pour ne pas défoncer la porte et étrangler son occupant. Une petite lumière s’alluma sur le chambranle : “Occupé”.

Le désespoir commença à me gagner et je m’assis à même la moquette en soupirant. Pour la première fois depuis ce qui m’avait semblé une éternité, je me mis à réfléchir. Où étais-je réellement ? La blague n’allait-elle pas un peu loin ? Étais-je devenu fou ? Où était la réalité ?

Je ne réagis même pas lorsque la lumière s’éteignit et qu’un individu que je n’avais pas remarqué se leva en pestant contre la minuterie automatique. Il devait répéter le même manège une demi-douzaine de fois, me fixant à chaque fois, espérant probablement engager la discussion sur cet épineux problème. Il en fut pour ses frais, car je restai plongé dans mes pensées.

Réflexions qui furent interrompues par un toussotement. Une dame d’un âge certain au port rigide et au chignon serré se tenait dans l’encadrement de la porte.

— Vous avez sonné ?

Je me relevai sans hâte et lui tendit le papier. La lumière s’éteignit et mon voisin d’attente se leva une fois de plus pour allumer, n’osant pester ouvertement cette fois.

— Oui. Votre collègue m’a envoyé ici. Je ne comprends rien à rien, je ne sais même pas pourquoi je suis ici.

Elle me fit entrer, me tendit un siège et, s’adressant à moi comme à un enfant, commença à m’expliquer la situation.

— Vous n’êtes pas sans savoir que les humains ont de nombreuses croyances concernant la vie après la mort.

— En effet, mais je ne vois pas bien…

— Et bien toutes ces croyances sont vraies. À sa mort, chaque être humain vit dans l’enfer qu’il s’est imaginé, au plus profond de son inconscient.

— Mais cela n’a aucun sens, l’âme n’existe pas ! 

— Qui vous a parlé d’âme ? Il n’y a en effet pas d’âme. L’enfer est, en quelque sorte, généré par le cerveau alors que celui-ci a perdu la capacité de percevoir l’écoulement du temps. La conscience est donc piégée dans une fraction de seconde éternelle.

— Mais pourquoi l’enfer ?

— C’est une manière de parler. La peur est l’émotion primaire la plus forte et la dernière à subsister. C’est donc ce qui effraie la conscience qui va s’imprimer dans le cerveau une fois que celui-ci a compris qu’il disparaissait. Quand on y pense, c’est assez ironique. Les personnes les plus pieuses qui ont fait le bien toute leur vie, car elles craignaient les flammes de l’enfer s’y sont condamnées. Les cyniques ont généralement une mort plus douce.

Elle arrondit ses lèvres sèches en une ébauche de sourire.

— Votre explication ne tient pas debout. Ce bâtiment, vous-même. Vous êtes réels !

Elle joignit ses doigts anguleux, les coudes sur son bureau, et toucha le léger duvet qui couvrait son menton.

— Ah, je vois que vous êtes un dur à cuire. C’est certainement la raison pour laquelle vous avez été envoyé chez moi. Vous ne croyez en rien, vous ne voulez croire en rien. Du coup, difficile de vous trouver une place. 

— Vous éludez la question !

— Laissez-moi une seconde. La conscience a un impact physique sur l’univers. Chaque conscience laisse une marque, un peu comme  un caillou jeté dans une mare laisse des remous. La plupart du temps, notre conscience est trop sollicitée par les sens du corps pour percevoir quoi que ce soit, mais cela reste un fait : les consciences s’influencent les unes les autres. À la mort, la conscience se déconnecte des stimuli externes et se met à percevoir les autres consciences, le plus souvent celles qui sont mortes en même temps et dans un espace géographique proche. Les toutes premières consciences se sont, de manière assez contre-intuitive, développées principalement après la mort du corps. Limitées par le corps lors de leur vivant, elles ont réussi à communiquer à travers la mort. Petit à petit, elles en sont arrivées à créer une véritable organisation dont je fais partie. Je suis en quelque sorte un démon, ainsi que tous mes collègues.

J’éclatai de rire.

— C’est absolument excellent. Vraiment très bon. Mais vous êtes quand même une humaine dans un bâtiment humain.

Elle tendit la main vers le mur derrière elle. Celui-ci sembla s’évaporer et je vis de gigantesques flammes au milieu desquelles hurlaient des corps calcinés. Je n’eus pas le temps de m’habituer à la vision qu’elle déplaça son index vers un autre pan de mur, lequel devint une mer gelée dans laquelle évoluait un drakkar en piteux état. Des mains de squelettes jaillissaient de la glace et tentait d’aggriper la coque. Mon hôte claqua dans ses doigts et le bureau redevint normal.

— Nous sommes vraiment des démons, mon cher. Simplement, devant la surpopulation, nous avons dû nous organiser. En cette période de doute, la plupart des humains ne sont plus certains de croire en l’enfer. Leur conscience est bloquée et interfère avec les autres consciences. Notre organisation se contente de les débloquer. Généralement, un simple passage dans le bureau d’un démon comme mon collègue que vous avez rencontré suffit à leur rappeler leur crainte la plus profonde. Toute cette organisation existe, bien entendu, grâce aux connaissances de tous les humains qui passent par nous. Au fil du temps, nous évoluons au rythme de l’humanité ! Nous nous modernisons, nous avons même un réseau informatique.

Fièrement, elle me montra son gigantesque écran à tube cathodique.

– Mais c’est préhistorique ! ne pus-je m’empêcher de m’écrier.

— Ah, vous trouvez ? C’est peut-être parce que la plupart des décédés ont un certain âge, cela expliquerait notre léger retard technologique.

– C’est bien joli, mais je fais quoi dans tout ça ?

— J’espère avoir convaincu votre scepticisme. Il est dans votre intérêt de collaborer afin de vous débloquer, de trouver l’enfer qui vous convient le mieux.

Je réfléchis une seconde.

— Ce que j’ai toujours craint c’est de me retrouver sur une plage magnifique avec une mer turquoise, entouré de personnes charmantes.

— Je vais voir ce que nous…

Elle s’interrompit et me darda d’un regard sévère.

— Vous essayez de vous jouer de nous. Ce n’est pas une crainte…

— Si si, je vous assure, bégayai-je, j’ai horreur de la mer et du soleil. Je…

— Vous êtes mort, monsieur. Votre enfer doit correspondre à votre peur la plus profonde. Sans cela, vous ne serez pas débloqué. Nous ne sommes pas une agence de voyages avec différentes formules à la carte !

— Si c’était le cas, je ne recommanderais pas vos services.

Je tentai un petit rire que je voulais ironique, mais qui ne fût qu’une rauque raclure de gorge jaunâtre.

— Dans votre situation, continua-t-elle sur un ton égal comme si je n’avais rien dit, il serait peut-être avisé de consulter un de nos théologiens. Ils pourraient certainement vous aider, après tout c’est à ça que servent les religions.

– Ah non ! m’exclamai-je, j’ai horreur de la vacuité religieuse. Les conseillers religieux me donnent des boutons. 

Elle me lança un regard étonné par-dessus ses lunettes.

— Ils ne servent à rien, ils brassent du vide et ils utilisent les maigres ressources de leur cerveau décati pour gloser sur l’interprétation à donner à un livre vieux de plusieurs siècles, nonobstant les multiples traductions et adaptations. Non, vraiment, la théologie, c’est la parodie de l’intelligence, le culte du cargo de la science. Tout, mais pas un théologien.

Intéressée, elle se pencha vers moi.

— Dîtes, l’idée de passer l’éternité avec des théologiens très croyants vous effraie-t-elle ?

J’éclatai de rire.

— Je vous vois venir. Non, cela ne m’effraie pas, cela me rend juste violent. C’est plutôt eux qui devraient être effrayés. Mais ce n’est certes pas ma définition de l’enfer.

— Dommage, j’avais justement un interminable concile du Vatican sous la main. Un enfer assez couru.

— Assez couru ?

— Oui et tout particulièrement par des prêtres et des religieux. À croire que l’expérience est assez traumatisante.

— Et si vous me laissiez tout simplement sortir ?

— Sortir ?

— Pourquoi pas ?

— Sortir pour aller où ?

— La porte d’entrée, en bas. 

— Je vous rappelle que vous êtes mort. Ce bâtiment n’est qu’une construction psychique commune. Il n’y a pas d’extérieur.

— Admettons que je ne vous croie pas. Vous avez fait de jolis tours de passe-passe, mais je me sens bel et bien vivant. L’idée que je sois mort est absurde.

— Plusieurs de vos philosophes sont arrivés à la même conclusion de leur vivant, mais, effectivement, il est nécessaire que vous soyez convaincu.

Elle saisit le cornet d’un antique téléphone en Bakélite sur son bureau et composa un numéro.

— Le centre médical ? Oui, j’ai un cas pour vous. Refus d’acceptation. Est-ce que vous pouvez le prendre en priorité ? C’est assez urgent, il n’a pas d’enfer assigné. Comment ? Oui. Non. Oui.

Elle raccrocha avec un grand sourire.

— Voilà, vous devez vous rendre au sous-sol, service médical avec les formulaires suivants. 

Une imprimante matricielle se mit à crachoter dans un coin. Elle arracha les pages et me les tendit. 

— Surtout, ne perdez pas les étiquettes ! Et… ah oui, merci de signer ici !

J’avais beau me concentrer, les lettres dansaient devant mes yeux en une sarabande de hiéroglyphes mouvants, impénétrables, indéchiffrables.

— Euh, excusez-vous, mais je signe quoi là au juste ?

— Une décharge reconnaissant que je vous ai transféré au médical. C’est juste de la paperasserie interne pour garantir que vous n’êtes plus sous ma responsabilité.

Elle regarda sa montre tandis que je signai machinalement.

— Est-ce que ça vous dérangerait d’attendre encore sept minutes dans mon bureau ?

— Euh, fis-je étonné. Non, mais je ne comprends pas bien…

— Je dois rendre un rapport de mon travail heure par heure. Nous appelons ça des timesheets. C’est très important, mais un peu fastidieux. Si vous restez encore sept minutes, je pourrai vous inscrire dans ma prochaine tranche horaire, ce sera plus facile, car, certaines heures, je ne sais pas trop quoi mettre.

– Je ne vois pas très bien l’utilité de ce processus, mais si vous voulez que j’attende, je n’y vois pas d’objections.

— C’est très utile. Cela permet au service de supervision de vérifier que chacun fait bien son travail. Les budgets sont réduits et il y’a tellement de tire-au-flanc ! Plus les budgets sont restreints, plus il faut être sévère et engager des vérificateurs de timesheets. C’est logique, non ?

Je la regardai, un peu paniqué, n’osant pas ouvrir la bouche. Je n’eus même pas la force de faire semblant d’acquiescer. Mais cela ne perturba pas mon interlocutrice qui fixait obstinément sa montre. Après une éternité silencieuse que je supposai être sept minutes, elle me fit un petit signe de la main.

Je me levai et repris l’ascenseur en direction du sous-sol. Preuve de ma résignation, l’idée de trouver une sortie ne m’effleura même plus. J’aime croire que c’était par curiosité intellectuelle, mais l’honnêteté me pousse à admettre qu’il s’agissait d’une reddition mentale. J’avais toujours été fasciné par ces condamnés à mort qui se laissaient fusiller bravement, debout, sans tenter le tout pour le tout, sans se lancer dans un dernier baroud d’honneur. Je pensais être différent. J’étais convaincu d’être un lutteur, un combatif. Placé devant la première épreuve un peu effrayante de ma vie, ou de ce qui semblait être encore ma vie, je me révélais pleutre et soumis en à peine quelques minutes de discussions. Quelle déception !

Comme je m’y attendais, le sous-sol se révéla un véritable dédale orné de numéros et de couleurs. Naïvement, je demandai le  service médical. On me répondit que l’entièreté du sous-sol était le service médical, que je m’y trouvais, qu’il fallait que je sache dans quel service je devais aller. Je n’en avais évidemment pas la moindre idée. À force de demander mon chemin en agitant ma liasse de papier, on finit par m’indiquer des directions qui se révélèrent relativement cohérentes. J’aboutis devant un petit guichet où je tendis mes formulaires. Derrière le guichet, deux jeunes personnes de sexes opposés buvaient un café et ma présence semblait les importuner. Ils firent mine de m’ignorer malgré de nombreux raclements de gorges et de « Pardon ? Excusez-moi ! ». Comme ils continuaient à roucouler, je  me contentai de les regarder fixement avec un large sourire. Un truc que j’avais sans doute appris dans un film ou une nouvelle. L’effet ne tarda pas. L’homme se mit à rougir et la femme s’approcha de moi :

— Qu’est-ce qu’il veut l’impatient ?

Je tendis mes papiers désormais chiffonnés comme une liasse de billets. La femme s’en empara et, pendant quelques minutes, je ne vis plus d’elle qu’une masse de cheveux roux bouclés qui grommelait.

— Je ne trouve pas la copie certifiée conforme de votre dossier médical, fit-elle en relevant la tête.

— La quoi ?

— La copie certifiée conforme de votre dossier médical. C’est indispensable de l’avoir.

— Et comment suis-je censé l’avoir ?

— Elle a dû vous être remise à votre arrivée.

— C’est que… 

Je sentais que de ma réponse allait dépendre la suite de mon épreuve. J’étais un peu comme dans ces livres de ma jeunesse dont vous êtes le héros. Si je répondais bien, j’allais à la page 185 et je passais l’épreuve. Si je ne répondais pas bien, j’étais envoyé page 217 dans un nouveau cycle infernal.

Le compagnon de mon interlocutrice nous fixait sans rien dire, ses yeux globuleux incrusté dans son grand corps maigre et immobile. Je suis sûr qu’il savait. Qu’il attendait de voir si je partais pour la page 185 ou la page 217.

— Le démon qui vous a accueilli vous a-t-il donné une copie certifiée conforme de votre dossier médical ? C’est une farde en carton rouge.

— Non, je m’en souviendrais si c’était le cas, répondis-je machinalement en me mordant la langue. Cela commençait à sentir la page 217.

— Alors il faudrait aller la chercher chez lui.

La perspective de repartir chez mon petit chauve ne m’enchantait guère.

— Et si la copie qu’il vous donne n’est pas certifiée, il faudra passer par le service de conformité, poursuivit la rousse.

Mon cerveau tournait à toute vitesse. Pour éviter la page 217, je décidai de tenter le tout pour le tout. 

— S’il s’avérait que la copie certifiée conforme de mon dossier médical était égarée, articulai-je lentement, le cœur battant à tout rompre. Quelle serait la procédure ?

— Et bien on devrait vous imprimer une copie de la copie certifiée conforme.

— Qui pourrait imprimer cette copie ?

La rousse se retourna vers son muet soupirant.

— Tu peux faire ça, non ?

— Oui. N’importe quel ordinateur de l’étage relié au réseau le peu, les dossiers sont stockés dans le répertoire partagé du service.

J’hésitai entre la jubilation de la page 185 et les agonir d’injures. Ils n’auraient pas pu le dire tout de suite ? Les systèmes administratifs ont tendance à être peuplés de troglodytes mous du bulbe. La corrélation est observable par tout un chacun, mais je n’ai pas encore réussi à démontrer la causation. Sont-ils recrutés comme étant particulièrement lents et incapables de toute autonomie de pensée ? Sont-ils formés pour le devenir ? Ou bien est-ce une forme de sélection naturelle : toute personne capable d’un minimum de sens analytique, de logique et d’initiative finit par rendre sa démission en hurlant et en s’arrachant les vêtements, généralement au bout de sept à huit jours.

Une autre théorie que j’entretenais jusque là était celle de la création d’emplois. À partir du moment où le but premier d’une société était de créer des emplois, il fallait créer des structures capables d’employer tous les types de profils. Et pour chaque type d’individus, il fallait un emploi qui ne soit pas seulement à sa portée, mais également où il soit le meilleur.  Où il excelle et écrase la concurrence. Mécaniquement, les administrations se sont donc épanouies pour employer les gens pointilleux, mesquins, sans imagination et, n’ayons pas peur de le dire, foncièrement bêtes et méchants.

La force de l’administration ce n’est pas qu’elle propose des emplois qui ne nécessitent pas d’être intelligent, il en existe bien d’autres. Non, sa première qualité est qu’elle propose des emplois où faire preuve d’intelligence est un défaut grave. La bêtise et la stupidité deviennent des compétences encouragées et transmises grâce aux prestigieuses « Écoles d’administration ». Au même titre qu’un cul de jatte est incapable de devenir éboueur, un humain intelligent, raisonnable et capable de prendre du recul ne peut en aucun cas prétendre à travailler pour l’administration.

La généralité n’est malheureusement pas tout à fait vraie. L’administration pouvant, parfois, offrir de confortables salaires ou certains avantages afférents, une nouvelle race d’humains s’est créée : des gens capables d’éteindre leur intelligence au moment où leur badge touche la pointeuse. Le soir et le week-end, ils discourent avec élégance, ils lisent, partagent, offrent une vision personnelle fouillée. Mais, une fois la cravate nouée autour du cou afin de couper toute irrigation du cerveau, ils se transforment en œsophage sur patte, engloutissant des litres de mauvais café tout en répétant, le regard vide, d’abscons aphorismes numérotés.

Le but premier d’un employé administratif, c’est d’être là pour toucher un salaire sur ses heures de présence. Durant ces heures, il doit faire le moins possible. Pour justifier qu’il reste encore beaucoup de travail à faire. Moins il fait, plus est grande la probabilité qu’on engage un nouvel agent administratif pour lui tenir compagnie, augmentant de ce fait son importance et son prestige. Car si le travail n’avance pas, c’est bien que le premier employé n’est pas suffisant tout seul. À deux, nos compères pourront passer à la vitesse supérieure et générer du travail à faire. Si la masse de travail ne diminuait pas avec le premier, elle ne fait qu’augmenter avec le second. La boucle est lancée et tout cela est un merveilleux mécanisme pour générer de l’emploi qui est, on l’a dit, le but premier de notre société. Le corolaire est que tout employé qui fera du zèle en faisant diminuer la charge de travail se verra immédiatement tancer, blâmer voire pousser à la démission.

De quelle race étaient mes amoureux ? Étaient-ils bêtes de nature ou bien arrivaient-ils à ranger leur cerveau durant les heures de bureau ? Cela ne changeait rien. J’étais dans les heures de travail. Les bêtes étaient toujours aussi bêtes, les autres savaient bien qu’il était hors de question de rallumer leur encéphale, quel qu’en soit le prétexte. Ne pas voir la débilité profonde qu’ils contribuaient à créer était leur seule stratégie de survie envisageable. Ils connaissaient certainement des cas qui ne l’avaient pas suivie aveuglément, qui avaient sombré en dépression, en burn-out, en bore-out, en brown-out avant de se retrouver bénévoles fauchés dans une association quelconque qui les envoyait distribuer des préservatifs mentholés au Gabon. Afin de « donner du sens à leur vie ».

Quoi qu’il en soit, je ne pouvais pas m’en faire des ennemis. Le spectre de la page 217 n’était pas encore écarté. Je tentai une approche naïve.

— Vous pourriez m’imprimer cette copie de la copie certifiée conforme ? Je me mordis les lèvres pour ne pas ajouter « Vu que cette information est de toute façon dans votre ordinateur, bande de crétins des Alpes consanguins », me rendant compte que cela pourrait être perçu comme une agression voire, comble de l’horreur, une critique envers le système.

Le jeune homme regarda la jeune femme et lui dit :

— Je pourrais s’il a déclaré sa copie conforme comme perdue.

— Il pourrait si vous avez déclaré votre copie conforme comme perdue, me répéta-t-elle comme à un enfant.

Je pris une profonde inspiration pour tenter de ne pas laisser percer mon impatience.

— Et où puis-je déclarer cette perte ?

— Et où peut-il déclarer cette perte ?

— Il peut aller au service des déclarations, au quatrième.

— Vous pouvez aller au service des déclarations, au quatrième.

J’avais envie d’attraper le mec par-dessus le guichet, de secouer son sac d’os et de lui demander de me regarder dans les yeux. Peut-être est-ce cela le secret de la lâcheté : être courageux dans ses fantasmes, mais baisser son froc face à la réalité. L’imagination devient un exutoire et plus il s’éloigne du domaine du possible, plus l’acceptation de la réalité devient inéluctable.

— Je reviens tout de suite, lançai-je.

— Oh, avec le service de réclamation, ça ne risque pas d’être tout de suite, ricana le grand dadais en m’adressant directement la parole pour la première fois.

Ses paroles me glacèrent le cœur. La suite devait lui donner raison. Trouver le service des réclamations fut étonnamment aisé. Comme de nombreux panneaux me l’indiquaient, je pris un ticket dans la salle d’attente. Celui-ci indiquait « E017 ». Un écran composé de LED rouges indiquait « C243 ». Je n’étais guère avancé, mais je me disais que, au pire, j’avais 16 personnes devant moi. Après quelques minutes, un chuintement sonore se fit attendre et l’écran afficha « E912 ». Je faillis défaillir.

M’armant de courage, je chronométrai les affichages. Je constatai que les E s’entremêlaient de manière totalement aléatoire avec les A, les B et les C. Il n’y avait pas de D, mais leur absence était compensée par le Z. Après une demi-heure, le E en était au E915. Un rapide calcul m’apprit que j’en avais pour 17h à patienter.

Faisant contre mauvaise fortune bon cœur, je décidai de me trouver un petit coin pour m’installer confortablement. Je déambulai dans les étages, testant les fauteuils dont la variété de formes n’avait d’égal que leur inconfort commun. Apercevant des toilettes, j’en profitai pour soulager un besoin naturel et pour faire quelques ablutions. C’est rafraichi et ragaillardi que je décidai de voir où en était le compteur, histoire d’affiner mon algorithme d’estimation.

J’entrai dans la salle. Un « A012 » clignotait, aussitôt suivi d’un « Z587 ». Enfin, j’aperçus un « E019 ». Je bondis ! C’était impossible, il n’y avait pas une heure que j’étais parti !

Sans ménagement, je me dirigeai vers le comptoir, bousculant la personne qui était accoudée et m’adressant directement au petit employé maigrelet.

— Excusez-moi, mais j’ai le ticket E017.

— Et bien, attendez votre tour !

— Mais il est déjà passé.

— Si vous avez raté votre tour, reprenez un ticket. Je ne vous félicite pas, vous avez fait perdre du temps à tout le monde.

— Mais… bredouillais-je, on était à E915 !

— Oui, c’est le dernier. Les E vont de E015 à E915.

– C’est absurde !

— Non, c’est comme ça. Allez prendre un autre ticket !

— Je ne partirai pas. C’est scandaleux ! Ce procédé de numérotage aurait dû être affiché en grand. Je vais me plaindre, c’est contraire à la norme ISO 404 !

J’improvisais sous le coup d’une inspiration subite.

— Monsieur, me dit l’employé, le règlement stipule que vous devez prendre un autre ticket.

Mais je voyais bien qu’il avait déjà beaucoup moins d’assurance. 

— Écoutez, lui dis-je, je viens du service médical. Il me manque juste une copie certifiée conforme de mon dossier médical.

— Et bien je ne peux rien faire pour vous. C’est le service médical qui peut imprimer une copie de la copie certifiée conforme.

— Ils m’ont dit que je devais d’abord venir vous déclarer la perte de la copie originale.

Il eut l’air surpris puis me dit :

– Vous venez déclarer la perte de votre copie certifiée conforme  afin d’obtenir une copie de la copie certifiée conforme, c’est ça ?

— Oui.

— Fallait le dire tout de suite.

Un silence se fit. Il me regardait, semblant attendre que je prisse l’initiative. Je tentai une onomatopée interrogative.

– Et bien ?

— Et bien vous êtes venu, tout est en ordre.

— Co… comment ? Comme ça ? Vous ne devez pas me donner quelque chose ?

— Non, vous êtes venu, merci monsieur.

Je ne savais pas s’il se contentait de se débarrasser de moi, mais je décidai d’entrer dans son jeu. Il y’avait en effet peu de chances pour qu’un tel personnage soit assez intelligent et retors pour se contenter de m’envoyer paître de cette façon. Ça aurait été trop subtil. Je redescendis au service médical pour annoncer immédiatement au couple de roucouleurs que :

— J’ai déclaré la perte au service des déclarations.

Le grand maigre me fit un sourire pathétique.

— Voilà ! Comme ça, tout est en ordre. Venez, je vais vous imprimer la copie. 

Il me tendit le papier. Je faillis l’étrangler lorsqu’il ajouta :

— Au moins, la procédure est respectée. C’est le plus important, vous ne pensez pas ?

Mais je me rendis compte que je ne savais même plus la raison pour laquelle j’avais besoin de ce papier. Heureusement, sa compagne vint à mon secours. 

— Le docteur va vous prendre ! Vous pouvez aller à la salle d’attente 11, on vous appellera.

Suivant les indications, j’arrivai dans une salle encombrée de bancs et de magazines. Il y’a une industrie spécialisée dans les magazines pour salle d’attente. En premier lieu, ceux-ci doivent être imprimés déjà défraichis et avec des dates remontant à plusieurs années. Mais, de manière plus importante, ils doivent être à ce point inintéressants que la venue du médecin ou du dentiste vous semble une bénédiction. D’ailleurs, nous l’avons tous cette réluctance naturelle à saisir ce genre de magazine. Notre premier réflexe est toujours de nous asseoir, de contempler le vide comme pour dire que l’attente sera courte, que cela ne vaut pas la peine de se salir les méninges avec cette presse dont même les caniveaux ne veulent plus. Jusqu’à ce que l’ennui prenne le dessus.

Outre les magazines, deux télévisions se faisaient face. L’une débitait ce qui ressemblait à une tonitruante émission hallucinogène pour enfant pré-épileptique tandis que l’autre diffusait un reportage essentiellement composé d’interviews de personnes s’exprimant par onomatopées. De temps en temps, des publicités apportaient une certaine variété dans la ganacherie.

J’ai toujours détesté les écrans. Si un écran est allumé dans la pièce où je me trouve, il m’est impossible d’en détacher les yeux. J’ai beau tenter de me concentrer sur la personne en face de moi, sur la conversation ou sur le livre que j’ai entre les mains, rien n’y fait. La théorie de flashs lumineux agresse ma rétine et me brûle les neurones. Le volume sonore, généralement réglé suffisamment bas pour être jugé socialement acceptable, mais assez élevé pour être compris ne fait qu’empirer la mobilisation de mon pauvre cortex, assailli de stimulations morbides.

Si au moins cette souffrance avait un but louable, mais, en réalité, il s’agissait purement et simplement de me faire acheter des yaourts et des couches-culottes en me montrant des gens trop beaux et trop heureux de se rouler au ralenti dans une herbe trop verte.

Bien décidé à ne pas me soumettre à ce qui est le loisir préféré de la plupart de mes concitoyens, mais qui s’apparente chez moi à de la torture pure et simple, j’ai empoigné un banc en métal et je l’ai tiré jusque dans l’étroit couloir dans un concert de grincements métal contre carrelage. Là, hors de portées des déjections cathodiques, je me suis installé, attendant qu’à chaque instant on me fasse remarquer que je bloquais le passage et que c’était interdit.

Mais il faut croire qu’aucun règlement n’avait prévu cette éventualité et, à part quelques regards légèrement curieux, j’ai pu attendre dans une paix royale. C’est l’une des rares facettes positives des sociétés hyper administratives. Si vous osez faire quelque chose qui n’est pas expressément et explicitement défendu, personne n’ose vous contredire. Tout le monde suppose que vous en avez le droit, que vous avez les permissions requises. Questionner est, par nature, dangereux. Si cela existe, c’est que c’est autorisé et normal, point à la ligne. J’aurais pu aussi bien sacrifier un agneau et me baigner nu dans son sang au milieu du couloir, personne n’aurait osé émettre la moindre protestation.

Le confort psychosomatique relatif de ma situation se trouva grandement amélioré par cette victoire à la Pyrrhus sur l’absurdité administrative. C’est avec un petit sourire aux lèvres que j’accueillis une grande femme en blouse blanche.

– Bonjour, je suis la docteur.

Je saisis la main qu’elle me tendait et la suivis dans un petit bureau qui semblait plus tenir du débarras de par sa taille et par son contenu hétéroclite.

— Excusez le désordre, nous sommes en plein déménagement. Ceci est un cabinet provisoire. Mais venons-en au fait, vous êtes en plein doute comme tous les agnostiques et nous allons trouver une solution.

— Athée, ai-je annoncé. Je suis athée et je n’ai aucun doute.

— Vous avez de la chance, je suis spécialiste de l’agnosticisme.

— Je suis athée, pas agnostique. Je suppose que vous connaissez la différence.

— Si vous venez me voir, c’est que vous êtes agnostique vu que c’est ma spécialité !

— Mais…

— Nous allons passer un petit test de personnalité. Je vais vous décrire des situations et vous allez me dire si vous vous reconnaissez dans l’une ou l’autre.

Le test dura près d’une demi-heure. Souvent, je ne voyais pas comment un humain ne pouvait pas ne pas se reconnaître tellement les situations étaient évidentes. D’autres fois, je me sentais complètement étranger. Enfin, la docteur s’exclama :

— Cela confirme bien le résultat. Voyez le résultat, vous vous êtes identifié à près d’une moitié des situations.

— Il y’a une autre moitié à laquelle je ne me suis pas du tout identifié.

— C’est normal, vous ne pouvez quand même pas être complètement aligné avec le test. C’est statistiquement impossible.

— Et certaines questions sont impossibles à répondre par la négative. Je rappelle qu’une des questions était « Avez-vous des périodes de grande fatigue et/ou de grande énergie ? ». 

— Oui, vous êtes bien agnostique ! Je vais vous faire une prescription pour un examen plus poussé. Un scanner cérébral.

— Hein ?

— Mais comme il est indisponible suite au déménagement, vous ne pourrez pas le passer. Je vous le prescris tout de même.

Comme je n’avais aucune envie de passer un scanner cérébral, je me contentai de prendre les papiers qu’elle me tendait et sortit.

— N’oubliez pas de repasser à l’accueil ! me lança-t-elle alors que je m’éclipsais.

Ce que je fis, tendant ma liasse à la rousse bouclée qui semblait s’ennuyer de son prétendant en lisant un magazine. Elle tritura le tout, arracha des étiquettes qu’elle colla à ailleurs, parapha certains papiers, m’en fit signer d’autres et, de ma manière générale, ne fit qu’épaissir ma pile. Avec un petit sourire, elle me souhaita une bonne journée.

Machinalement, je me rendis aux ascenseurs, contemplant les pages blanches sur lesquelles s’alignaient et dansaient des sarabandes de caractères auxquelles je ne comprenais toujours rien. J’avais dû marcher sans m’en rendre compte, car, lorsque je levai les yeux, je me retrouvai dans un long couloir, face à une petite porte d’un vert délavé qui m’était vaguement familière.

Je frappai et entrai sans même attendre la réponse. Le gros chauve qui m’avait accueilli leva à peine les yeux de ses classeurs poussiéreux.

— Vous avez gagné, dis-je.

— Pardon ?

— Choisissez n’importe quel enfer. Les flammes, les mers gelées, ce que vous voulez.

– Vous avez résolu votre blocage ?

— Oui ! Posez-moi n’importe quelle question, j’accepterai l’enfer que vous choisirez. Tout plutôt que de rester ici.

Il eut un sourire satisfait.

– Ah, ça me fait plaisir de voir qu’un dossier aussi épineux que le vôtre se clôture de manière efficace. Dans ce cas, procédons. Puis-je voir le compte rendu médical ?

Je lui tendis les papiers. Il les examina.

— Agnostique avec une tendance à l’angoisse existentielle. Est-ce que l’idée du néant éternel vous effraie ?

— Oh oui ! fis-je sans conviction.

— Parfait, parfait. Vous allez donc connaître le néant éternel.

Tandis qu’il griffonnait un formulaire, je fermai les yeux en prenant une profonde inspiration. Je ne savais pas trop à quoi m’attendre, mais je me sentais prêt à tout.

— Tenez, ceci est le formulaire 121bis pour le néant éternel. Allez le faire remplir au service des cas rares, joignez-y un certificat de vie. Revenez me voir lorsque votre dossier sera complété.

À tout sauf à ça !

— Ne vous inquiétez pas pour le certificat de vie si vous n’en avez pas. Faites imprimer une copie puis aller la faire certifier conforme au service de conformité. Je m’arrangerai pour que ça passe.

Il me tendait le dossier avec un petit sourire sardonique. Pour la première fois, je décelai l’intelligence jusque là bien cachée dans ses prunelles. Des flammes semblaient lui danser sur la tête.

Je me mis à hurler.

Ottignies, 21 janvier 2019. D’après une idée du 26 février 2015.

Toute ressemblance avec des situations existantes est volontaire. Chacune des situations présentées a été vécue telle quelle ou de façon très similaire par l’auteur. Heureusement, elles furent séparées.Photo by Samuel Zeller on Unsplash

Je suis @ploum, conférencier et écrivain électronique. Si vous avez apprécié ce texte, n'hésitez pas à me soutenir sur Tipeee, Patreon, Paypal, Liberapay ou en millibitcoins 34pp7LupBF7rkz797ovgBTbqcLevuze7LF. Vos soutiens réguliers, même symboliques, sont une réelle motivation et reconnaissance. Merci !

Ce texte est publié sous la licence CC-By BE.

In a previous post, I’ve discussed Metronome, a lightweight graphing framework for PowerDNS services (authoritative server, recursor, dnsdist).

In this post, I’ll be documenting how to secure this setup, as in the default configuration, there is no TLS encryption, and anyone can send data to your daemon. I will assume everything has been installed as per the previous post and has been verified to work correctly.

This post will help you add TLS transport encryption, set a password so only authorized users can actually access the statistics web pages, and make sure only your desired DNS servers are able to send statistics to your Metronome instance.

TLS

For this first step you’ll need a valid certificate for your webserver; you can get one from Let’s Encrypt. I’ve touched upon it before in this blog, but actually getting the certificate is out of scope for this article.

Start by changing your /opt/metronome/html/local.js file and point it to the HTTPS version of your website, tacking on the /metronome path at the end:

"use strict";
var metronomeServer="https://metronome.boxed-it.com/metronome/";

Then, we reconfigure the Apache virtual host configuration in /etc/apache2/sites-available/metronome.example.com:

<VirtualHost *:80>
  ServerName metronome.example.com
  Redirect / https://metronome.example.com/

  ErrorLog /var/log/apache2/metronome-error.log
  CustomLog /var/log/apache2/metronome-access.log combined

  LogLevel alert
  ServerSignature Off
</VirtualHost>

<Virtualhost *:443>
  ServerName metronome.example.com

  SSLEngine On
  SSLCertificateFile /etc/letsencrypt/live/*.example.com/fullchain.pem
  SSLCertificateKeyFile /etc/letsencrypt/live/*.example.com/privkey.pem

  DocumentRoot /opt/metronome/html

  <Directory /opt/metronome/html>
    Require all granted
  </Directory>

  ProxyPass /metronome/ http://127.0.0.1:8000/

  ErrorLog /var/log/apache2/metronome-error.log
  CustomLog /var/log/apache2/metronome-access.log combined

  LogLevel alert
  ServerSignature Off
</VirtualHost>

This configuration will also tunnel the data served by the Metronome daemon’s built-in web server through Apache, including encryption support.

Next, we’ll enable the required Apache modules, and reload Apache to use the new configuration:

a2enmod proxy_http
a2enmod ssl
systemctl reload apache2

Securing the Metronome web server port

Currently, Metronome’s built in webserver is listening on port 8000 on all interfaces, if you leave this open, anyone will be able to bypass the Apache server’s security configuration.

To resolve this, edit /etc/systemd/system/metronome.service and replace its contents with the following (changes in bold):

[Unit]
Description=PowerDNS Metronome
After=network.target

[Service]
User=metronome
ExecStart=/opt/metronome/bin/metronome --daemon=0 --stats-directory=/opt/metronome/stats --disable-syslog --webserver-address=127.0.0.1

[Install]
WantedBy=multi-user.target

Then, to apply, restart Metronome:

systemctl restart metronome

Now, the web server (serving the statistics themselves) can only be accessed through Apache.

Adding authentication to the Metronome server

Encrypting the data transfer to your Metronome server is only half of the job, you probably still want to add some authentication so not just anyone can access your Metronome instance.

Create a password file using the following command (it will prompt for the password):

htpasswd -c /etc/apache2/metronome.htpasswd yourusername

This will create a new password file. If you want to add extra users, use the same command but remove the -c parameter. Otherwise you’ll just recreate the file with a single user inside!

Adjust the Apache virtual host configuration in /etc/apache2/sites-available/metronome.example.com again (changes in bold):

<VirtualHost *:80>
  ServerName metronome.example.com
  Redirect / https://metronome.example.com/

  ErrorLog /var/log/apache2/metronome-error.log
  CustomLog /var/log/apache2/metronome-access.log combined

  LogLevel alert
  ServerSignature Off
</VirtualHost>

<Virtualhost *:443>
  ServerName metronome.example.com

  SSLEngine On
  SSLCertificateFile /etc/letsencrypt/live/*.example.com/fullchain.pem
  SSLCertificateKeyFile /etc/letsencrypt/live/*.example.com/privkey.pem

  DocumentRoot /opt/metronome/html

  <Directory /opt/metronome/html>
    AuthType Basic
    AuthName "Metronome"
    AuthUserFile /etc/apache2/metronome.htpasswd
    Require valid-user
  </Directory>

  ProxyPass /metronome/ http://127.0.0.1:8000/

  ErrorLog /var/log/apache2/metronome-error.log
  CustomLog /var/log/apache2/metronome-access.log combined

  LogLevel alert
  ServerSignature Off
</VirtualHost>

Apply the configuration by reloading the Apache configuration:

systemctl reload apache2

Now, your browser will prompt you for your username and password, after which Metronome will continue to work as usual.

Firewalling the Carbon port

The last hurdle is Metronome’s Carbon port, on which it receives the data from the remote systems. This should normally not be open to the whole world. You can configure the iptables firewall on the Metronome host to close this port to everyone but your DNS servers. I myself use Puppet to configure these rules, but this is how you do it standalone:

iptables -I INPUT -p tcp --dport 2003 -j REJECT
iptables -I INPUT -p tcp --dport 2003 -s 192.168.53.3 -j ACCEPT
iptables -I INPUT -p tcp --dport 2003 -s 192.168.53.4 -j ACCEPT
iptables-save
ip6tables -I INPUT -p tcp --dport 2003 -j REJECT
ip6tables-save

Alternatively, you could just open up the port to a specific IP range:

iptables -I INPUT -p tcp --dport 2003 -j REJECT
iptables -I INPUT -p tcp --dport 2003 -s 192.168.53.0/24 -j ACCEPT
iptables-save
ip6tables -I INPUT -p tcp --dport 2003 -j REJECT
ip6tables-save

Note that I’ve also closed off IPv6 as well as IPv4, as the Metronome daemon will listen on both address families – you can of course also add ACCEPT lines for hosts using IPv6 for statistics.

Finally

That’s it! Your Metronome instance is up and running, restarts upon system reboot, is collecting data, access has been secured with TLS and authentication. When you add a new server, don’t forget to add a line to the firewall configuration; it’ll then automagically appear in the dropdown on the Metronome web interface (you’ll have to refresh the page though if you had it open) and start showing graphs.

Pleas don’t hesitate to comment below in case of issues, errors or tips to improve!

&url Writing informative technical how-to documentation takes time, dedication and knowledge. Should my blog series have helped you in getting things working the way you want them to, or configure certain software step by step, feel free to tip me via PayPal (paypal@powersource.cx) or the Flattr button. Thanks!

Recently, I've been spending some time making performance improvements to my site. In my previous blog post on this topic, I described my progress optimizing the JavaScript and CSS usage on my site, and concluded that image optimization was the next step.

Last summer I published a blog post about my vacation in Acadia National Park. Included in that post are 13 photos with a combined size of about 4 MB.

When I benchmarked that post with https://webpagetest.org, it showed that it took 7.275 seconds (blue vertical line) to render the page.

The graph shows that the browser downloaded all 13 images to render the page. Why would a browser download all images if most of them are below the fold and not shown until a user starts scrolling? It makes very little sense.

As you can see from the graph, downloading all 13 images take a very long time (purple horizontal bars). No matter how much you optimize your CSS and JavaScript, this particular blog post would have remained slow until you optimize how images are loaded.

Webpagetest images february before

"Lazy loading" images is one solution to this problem. Lazy loading means that the images aren't loaded until the user scrolls and the images come into the browser's viewport.

You might have seen lazy loading in action on websites like Facebook, Pinterest or Medium. It usually goes like this:

  • You visit a page as you normally would, scrolling through the content.
  • Instead of the actual image, you see a blurry placeholder image.
  • Then, the placeholder image gets swapped out with the final image as quickly as possible.
An animated GIF of a user scrolling a webpage and a placeholder images being replaced by the final image

To support lazy loading images on my blog I do three things:

  1. Automatically generate lightweight yet useful placeholder images.
  2. Embed the placeholder images directly in the HTML to speed up performance.
  3. Replace the placeholder images with the real images when they become visible.

Generating lightweight placeholder images

To generate lightweight placeholder images, I implemented a technique used by Facebook: create a tiny image that is a downscaled version of the original image, strip out the image's metadata to optimize its size, and let the browser scale the image back up.

To create lightweight placeholder images, I resized the original images to be 5 pixels wide. Because I have about 10,000 images on my blog, my Drupal-based site automates this for me, but here is how you create one from the command line using ImageMagick's convert tool:

$ convert -resize 5x -strip original.jpg placeholder.jpg
  • -resize 5x resizes the image to be 5 pixels wide while maintaining its aspect ratio.
  • -strip removes all comments and redundant headers in the image. This helps make the image's file size as small as possible.

The resulting placeholder images are tiny — often shy of 400 bytes.

Large metal pots with wooden lids in which lobsters are boiledThe original image that we need to generate a placeholder for.
An example placeholder image shows brown and black tonesThe generated placeholder, scaled up by a browser from a tiny image that is 5 pixels wide. The size of this placeholder image is only 395 bytes.

Here is another example to illustrate how the colors in the placeholders nicely match the original image:

A sunrise with beautiful reds and black silhouettes
An example placeholder image that shows red and black tones

Even though the placeholder image should only be shown for a fraction of a second, making them relevant is a nice touch as they suggest what is coming. It's also an important touch, as users are very impatient with load times on the web.

Embedding placeholder images directly in HTML

One not-so-well-known feature of the element is that you can embed an image directly into the HTML document using the data URL scheme:

Data URLs are composed of four parts: the data: prefix, a media type indicating the type of data (image/jpg), an optional base64 token to indicate that the data is base64 encoded, and the base64 encoded image data itself.

data:[][;base64],

To base64 encode an image from the command line, use:

$ base64 placeholder.jpg

To base64 encode an image in PHP, use:

$data =  base64_encode(file_get_contents('placeholder.jpg'));

What is the advantage of embedding a base64 encoded image using a data URL? It eliminates HTTP requests as the browser doesn't have to set up new HTTP connections to download the images. Fewer HTTP requests usually means faster page load times.

Replacing placeholder images with real images

Next, I used JavaScript's IntersectionObserver to replace the placeholder image with the actual image when it comes into the browser's viewport. I followed Jeremy Wagner's approach shared on Google Web Fundamentals Guide on lazy loading images — with some adjustments.

It starts with the following HTML markup:

The three relevant pieces are:

  1. The class="lazy" attribute, which is what you'll select the element with in JavaScript.
  2. The src attribute, which references the placeholder image that will appear when the page first loads. Instead of linking to placeholder.jpg I embed the image data using the data URL technique explained above.
  3. The data-src attribute, which contains the URL to the original image that will replace the placeholder when it comes in focus.

Next, we use JavaScript's IntersectionObserver to replace the placeholder images with the actual images:

document.addEventListener('DOMContentLoaded', function() {
  var lazyImages = [].slice.call(document.querySelectorAll('img.lazy'));

  if ('IntersectionObserver' in window) {
    let lazyImageObserver = new IntersectionObserver(
      function(entries, observer) {
        entries.forEach(function(entry) {
          if (entry.isIntersecting) {
            let lazyImage = entry.target;
            lazyImage.src = lazyImage.dataset.src;
            lazyImageObserver.unobserve(lazyImage);
          }
        });
    });

    lazyImages.forEach(function(lazyImage) {
      lazyImageObserver.observe(lazyImage);
    });
  }
  else {
    // For browsers that don't support IntersectionObserver yet,
    // load all the images now:
    lazyImages.forEach(function(lazyImage) {
      lazyImage.src = lazyImage.dataset.src;
    });
  }
});

This JavaScript code queries the DOM for all elements with the lazy class. The IntersectionObserver is used to replace the placeholder image with the original image when the img.lazy elements enter the viewport. When IntersectionObserver is not supported, the images are replaced on the DOMContentLoaded event.

By default, the IntersectionObserver's callback is triggered the moment a single pixel of the image enters the browser's viewport. However, using the rootMargin property, you can trigger the image swap before the image enters the viewport. This reduces or eliminates the visual or perceived lag time when swapping a placeholder image for the actual image.

I implemented that on my site as follows:

const config = {
    // If the image gets within 250px of the browser's viewport, 
    // start the download:
    rootMargin: '250px 0px',
  };

let lazyImageObserver = new IntersectionObserver(..., config);

Lazy loading images drastically improves performance

After making these changes to my site, I did a new https://webpagetest.org benchmark run:

A diagram that shows page load times for dri.es before making performance improvements

You can clearly see that the page became a lot faster to render:

  • The document is complete after 0.35 seconds (blue vertical line) instead of the original 7.275 seconds.
  • No images are loaded before the document is complete, compared to 13 images being loaded before.
  • After the document is complete, one image (purple horizontal bar) is downloaded. This is triggered by the JavaScript code as the result of one image being above the fold.

Lazy loading images improves web page performance by reducing the number of HTTP requests, and consequently reduces the amount of data that needs to be downloaded to render the initial page.

Is base64 encoding images bad for SEO?

Faster sites have a SEO advantage as page speed is a ranking factor for search engines. But, lazy loading might also be bad for SEO, as search engines have to be able to discover the original images.

To find out, I headed to Google Search Console. Google Search Console has a "URL inspection" feature that allows you to look at a webpage through the eyes of Googlebot.

I tested it out with my Acadia National Park blog post. As you can see in the screenshot, the first photo in the blog post was not loaded. Googlebot doesn't seem to support data URLs for images.

A screenshot that shows Googlebot doesn't render placeholder images that are embedded using data URLs

Is IntersectionObserver bad for SEO?

The fact that Googlebot doesn't appear to support data URLs does not have to be a problem. The real question is whether Googlebot will scroll the page, execute the JavaScript, replace the placeholders with the actual images, and index those. If it does, it doesn't matter that Googlebot doesn't understand data URLs.

To find out, I decided to conduct an experiment. For the experiment, I published a blog post about Matt Mullenweg and me visiting a museum together. The images in that blog post are lazy loaded and can only be discovered by Google if its crawler executes the JavaScript and scrolls the page. If those images show up in Google's index, we know there is no SEO impact.

I only posted that blog post yesterday. I'm not sure how long it takes for Google to make new posts and images available in its index, but I'll keep an eye out for it.

If the images don't show up in Google's index, lazy loading might impact your SEO. My solution would be to selectively disable lazy loading for the most important images only. (Note: even if Google finds the images, there is no guarantee that it will decide to index them — short blog posts and images are often excluded from Google's index.)

Conclusions

Lazy loading images improves web page performance by reducing the number of HTTP requests and data needed to render the initial page.

Ideally, over time, browsers will support lazy loading images natively, and some of the SEO challenges will no longer be an issue. Until then, consider adding support for lazy loading yourself. For my own site, it took about 40 lines of JavaScript code and 20 lines of additional PHP/Drupal code.

I hope that by sharing my experience, more people are encouraged to run their own sites and to optimize their sites' performance.

February 20, 2019

Out of the box, the Prometheus binaries in the latest release (v2.7.1) clock in rather large, at:

-rwxr-xr-x 1 ward ward 60097588 Jan 31 06:18 prometheus
-rwxr-xr-x 1 ward ward 38359349 Jan 31 06:19 promtool

Fillippo Valsorda has a post that describes shrinking golang binaries.

Prometheus uses the promu tool for building its binaries. Adding the necessary ld flags is done by editing .promu.yml file like this:

--- .promu.yml.orig	2019-02-20 08:57:29.413554323 -0500
+++ .promu.yml	2019-02-19 17:44:33.451539440 -0500
@@ -17,6 +17,8 @@
         -X github.com/prometheus/common/version.Branch={{.Branch}}
         -X github.com/prometheus/common/version.BuildUser={{user}}@{{host}}
         -X github.com/prometheus/common/version.BuildDate={{date "20060102-15:04:05"}}
+        -s
+        -w
 tarball:
     files:
         - consoles

After building the prometheus binaries with the latest stable go (1.11.5) using make build, we end up with:

-rwxr-xr-x  1 ward ward 46379136 Feb 19 17:45 prometheus
-rwxr-xr-x  1 ward ward 29391136 Feb 19 17:46 promtool

The binaries are now reduced to about 77% of their original size. Better, but still not great.

We can confirm they are now indeed statically linked and stripped of debug info:

$ file prometheus
prometheus: ELF 64-bit LSB executable, x86-64, version 1 (GNU/Linux), statically linked, stripped
$ file promtool
promtool: ELF 64-bit LSB executable, x86-64, version 1 (GNU/Linux), statically linked, stripped

Applying upx takes a while but yields excellent results:

$ upx --brute prometheus 
                       Ultimate Packer for eXecutables
                          Copyright (C) 1996 - 2013
UPX 3.91        Markus Oberhumer, Laszlo Molnar & John Reiser   Sep 30th 2013

        File size         Ratio      Format      Name
   --------------------   ------   -----------   -----------
  46379136 ->   9370100   20.20%  linux/ElfAMD   prometheus                    

Packed 1 file.

$ upx --brute promtool
                       Ultimate Packer for eXecutables
                          Copyright (C) 1996 - 2013
UPX 3.91        Markus Oberhumer, Laszlo Molnar & John Reiser   Sep 30th 2013

        File size         Ratio      Format      Name
   --------------------   ------   -----------   -----------
  29391136 ->   6271396   21.34%  linux/ElfAMD   promtool                      

Packed 1 file.

And here are the resulting binaries:

-rwxr-xr-x  1 ward ward 9370100 Feb 19 17:45 prometheus
-rwxr-xr-x  1 ward ward 6271396 Feb 19 17:46 promtool

The binaries are now down to roughly 16% of their original size. There is a noticeable startup delay at runtime for the upx decompression, but for a long-running daemon like prometheus that doesn’t matter at all.

For promtool, which is used more interactively, you might find the startup delay annoying. This is the original binary:

$ time ./promtool.orig 
usage: promtool.orig []  [ ...]

Tooling for the Prometheus monitoring system.
...

real	0m0.055s
user	0m0.036s
sys	0m0.013s

And here’s the UPX-compressed one:

$ time ./promtool
usage: promtool []  [ ...]

Tooling for the Prometheus monitoring system.
...

real	0m0.536s
user	0m0.521s
sys	0m0.016s

A month ago, Matt Mullenweg, co-founder of WordPress and founder of Automattic, visited me in Antwerp, Belgium. While I currently live in Boston, I was born and raised in Antwerp, and also started Drupal there.

We spent the morning together walking around Antwerp and visited the Plantin Moretus Museum.

The museum is the old house of Christophe Plantin, where he lived and worked around 1575. At the time, Plantin had the largest printing shop in the world, with 56 employees and 16 printing presses. These presses printed 1,250 sheets per day.

Today, the museum hosts the two oldest printing presses in the world. In addition, the museum has original lead types of fonts such as Garamond and hundreds of ancient manuscripts that tell the story of how writing evolved into the art of printing.

The old house, printing business, presses and lead types are the earliest witnesses of a landmark moment in history: the invention of printing, and by extension, the democratization of publishing, long before our digital age. It was nice to visit that together with Matt as a break from our day-to-day focus on web publishing.

An old printing press at the Plantin Moretus Museum

Dries and Matt in front of the oldest printing presses in the world

An old globe at the Plantin Moretus Museum

February 19, 2019

Last week, I had a unique opportunity to attend a demo of a “cool” product (I insist on the quotes around cool): A complete solution to track and intercept mobile devices. The company presents itself as a partner of law enforcement services, governments or special agencies (you know all the fancy 3-letters acronyms). They demonstrated how easy they are able to track people based on their mobile phones (passive). But, they also demonstrated how easy they can take actions (active) against the same people: blocking the mobile and preventing connections, draining the battery, interception of calls, SMS. But also injection of SMS and calls (spoofing). I won’t disclose more details of course.

My knowledge of mobile networks being very low, I tried to search for more information on the web. The solution used to track people is called an “IMSI Catcher“. What does mean “IMSI”? The “International Mobile Subscriber Identity” is stored in a 64-bits field and uniquely identifies a user on a mobile network. The ID is provisioned on the SIM card and, as you can imagine, it is extremely sensitive and must be protected. IMSI are usually represented by 15 digits: “xxx xx xxxxxxxxxx”. The first block represents the country (Mobile Country Code or MCC), the second block is the operator (Mobile Network Code or MNC). The remaining block is the Mobile Subscription Id Number (MSIN). Here is an example:

206 05 00043XXXXX

“206” is Belgium, “05” is Telenet (a Belgian operator).

While searching for more information, I found a project on GitHub called IMSI-Catcher. From an hardware point of view, it just requires a SDR device. Cool, I have a low-cost SDR dongle lying in my lab. Let’s try the tool. My SDR device is fully passive (no injection of data) and does not allow to listen to very high frequencies so I was limited to the 2G or 900MHZ range. I won’t cover the installation steps, just follow the tutorial available on the GitHub page. Once my VM ready, I started to sniff at home and collected a very low amount of data because I’m living in the country-side.

During the last two days, I was at a better location and results were much more impressive: 4473 unique IMSI collected! Ok, nice but what can we do with the data? First of all, there is no way to track people because it’s not possible to make a link between an IMSI and the mobile phone owner. It’s just like listening to the radio. However, we can deduce interesting information: IMSI from 40 different countries have been detected:

(Note: for a better readability, Belgium has been removed)

We can find mobile devices that are more often detected:

Click to enlarge

Just imagine that your business is very sensitive and that you’re afraid of some people who could try to spy on you. It could be valuable to know that a mobile device from country “x” has been detected in the area. You can track the behaviour of the same IMSI: what if it is detected every x minutes/hours or every day around the same time? If you, by one mean or another, get the IMSI number of somebody (I don’t want to know how ;-), it becomes very easy to spot the presence of this person in the area. This has a complete different impact on privacy!

The purpose of this blog post is just to demonstrate that we all have spying devices in our pockets! If you were not yet aware…

[The post Detecting Mobile Phones Close to Your Location has been first published on /dev/random]

February 18, 2019

If you’re running PowerDNS recursor, PowerDNS authoritative server or dnsdist, you may wonder how those services are actually doing. You can add a basic ‘service is functional’ check to your Nagios or Icinga installation, and even add some graphing to your Observium installation, but in reality, those will give you no more than a rough idea of what is happening.

However, those three pieces of software all share a common way of reporting more specific metrics to a centralized server speaking the ‘carbon’ protocol. Launched in 2014, PowerDNS provides a public service where you can send your metrics – useful if you have an issue or if you need some professional or community support, as sometimes the cause can become clear immediately just by looking at the data sent through.

Metronome graph screenshot

For some people, having their data in public is no good (even though you can disguise your server name to whatever string you want), or an outgoing firewall is simply blocking the traffic. The good news is, you can also run your own server locally and push your metrics there!

Installing Metronome

On your target system, clone the git repository located at Github, install required build dependencies, and build the project to install in /opt/metronome:

git clone https://github.com/ahupowerdns/metronome
apt-get install build-essential aautomake autoconf libtool libeigen3-dev libboost-dev libboost-program-options-dev
cd metronome
./bootstrap
./configure --prefix=/opt/metronome
make

Then, as root, install the program into /opt/metronome, and also copy the HTML directory from the source:

make install
cp -a html /opt/metronome

Create a user for the Metronome daemon to run as (don’t run stuff [that listens on a network port] as root!):

useradd --home-dir /opt/metronome -c "PowerDNS metronome" metronome 

Next, create a directory for Metronome to store the received metrics in:

mkdir /opt/metronome/stat
chown -R metronome: /opt/metronome/stats/

In your favourite text editor, edit /opt/metronome/html/local.js and set the metronomeServer variable to the correct IP address your Metronome server is running on:

"use strict";
var metronomeServer="http://192.168.0.1:8000/";

Now, we configure Apache to have its own virtual host (you could probably also use a subdirectory path instead) and serve up the HTML files that Metronome provides, in /etc/apache2/sites-available/metronome.example.com:

<VirtualHost *:80>
ServerName metronome.boxed-it.com

DocumentRoot /opt/metronome/html

ErrorLog /var/log/apache2/metronome-error.log
CustomLog /var/log/apache2/metronome-access.log combined

<Directory /opt/metronome/html>
Require all granted
</Directory>

LogLevel alert
ServerSignature Off
</VirtualHost>

Then, enable the virtual host and reload apache2:

a2ensite metronome.example.com
systemctl reload apache2

Last but not least, we’ll create a systemd unit file to run the daemon in /etc/systemd/system/metronome.service:

[Unit]
Description=PowerDNS Metronome
After=network.target

[Service]
ExecStart=/opt/metronome/bin/metronome --daemon=0 --stats-directory=/opt/metronome/stats --disable-syslog
User=metronome

[Install]
WantedBy=multi-user.target

Next, we reload systemd and start the daemon!

systemctl daemon-reload
systemctl enable metronome
systemctl start metronome

Please note that, as long as no data has been received from any monitored server, the web interface will not work correctly as the Javascript code will fail to retrieve data.

Configuring PowerDNS

PowerDNS Recursor

Add the following line to recursor.conf:

carbon-server=192.168.0.1

PowerDNS Authoritative Server

Add the following line to pdns.conf:

carbon-server=192.168.0.1

dnsdist

Add the following line to dnsdist.conf:

carbonServer('192.168.0.1')

Next steps

In the next article in this (2-part) series, I’ll add some information on how to secure this setup. Please note, if you’re running the interface on the internet, it’ll currently be open to anyone. This means on one hand, anyone can send data to your Metronome instance (possibly filling up your disk or using up a lot of CPU time?), and they’ll be able to access your statistics as well, as there is no authentication used on the web page, and no TLS transport security either.

&url Writing informative technical how-to documentation takes time, dedication and knowledge. Should my blog series have helped you in getting things working the way you want them to, or configure certain software step by step, feel free to tip me via PayPal (paypal@powersource.cx) or the Flattr button. Thanks!

February 17, 2019

Deux articles dont je vous recommande la lecture, pour parler vie au grand air, vélo, écriture et air conditionné.

Parfois, la sérendipité de mes lectures sur le web produit un télescopage d’idées, un chevauchement extraordinaire.

Ce fut le cas le soir où j’ai commencé à lire le magistral billet de Thierry Crouzet sur le vélo et l’écriture. Étant moi-même cycliste et écrivain, je vibre, je ressens chacune des sensations que Thierry partage.

Le vélo, pour moi, c’est vivre dehors. Sortir. J’ai besoin de respirer le vent, de sentir la pluie, le soleil ou les nuages. Avec l’âge, ce besoin d’extérieur devient de plus en plus violent, nécessaire. Je rêve de pédaler pendant des jours en dormant à la belle étoile. Je ne supporte plus, même quelques heures, l’air conditionné.

L’air conditionné, une invention qui a bouleversé l’ordre du monde selon ce magnifique article de Rowan Moore qui s’est immiscé juste derrière Crouzet dans ma liste de lecture.

Car j’ai parfois l’impression que mon besoin d’extérieur est loin d’être partagé par la majorité de mes concitoyens. Je vois des gens intelligents, sportifs, éduqués prendre la voiture, avec air conditionné, pour se rendre du boulot avec air conditionné avant de reprendre la voiture pour aller faire du vélo immobile dans une salle à air conditionné.

Qu’il pleuve un peu ou qu’il fasse froid et la dizaine de mètres entre la voiture et la porte du bâtiment est perçue comme une aventure. S’il fait beau, l’aventure reste identique, car on risque de transpirer. Les places dans le parking intérieur sont d’ailleurs les plus convoitées. Moi qui arrive à vélo ou à pied, je passe pour un extra-terrestre dans les deux cas.

Je reconnais que je ne me jette pas avec plaisir dans le froid et la pluie. Lorsque les gouttes d’eau ruissellent sur les vitres, j’ai envie de rester bien au chaud, de ne pas sortir de chez moi. Je dois me pousser littéralement dehors.

Mais, une fois les quelques premiers kilomètres avalés en grelottant et pestant contre mon masochisme, l’atmosphère se fait accueillante, elle m’accepte. Je souffre, je hurle, mais un énorme sourire déchire mon visage couvert de boue. Je me sens vivant, je fais partie de la pluie, de la terre humide. Je suis cette interface floue, un horizon indistinct entre le ciel brun et les flaques grises. Je vis !

Je me rends compte que, sous nos latitudes, le temps n’est jamais extrême. Une fois dehors, la pluie n’est jamais si terrible. Une fois en mouvement, la canicule n’est jamais effroyable. Correctement habillé, le froid n’est jamais insurmontable. Comme le dit le proverbe, il n’y a pas de mauvais temps, que des mauvais vêtements. Seule la boue est incontournable dans mon pays. Alors, on en a fait une discipline sportive : le cyclocross !

Mais ce goût pour l’air libre boueux, que j’ai entièrement hérité du scoutisme, n’est pas partagée. L’extérieur fait peur. Aller dehors effraie. La chaleur, le froid. La pluie ou le vent. Beaucoup les considèrent comme des ennemis. Ils cherchent à les éviter.

Moi, qui ai le luxe de savoir qu’une douche bien chaude ou bien fraîche m’attend à la maison (faut pas déconner, j’aime mon petit confort), j’ai appris à les accepter. Les aimer. Ils me le rendent bien. Ils me vivifient. Et rentrer au bercail n’en est que plus plaisant.

Par contre, le bruissement d’une soufflerie dans un open space me rend fou en quelques minutes. Quelques heures dans une pièce avec l’air conditionné me font chopper un rhume à coup sûr. 

Je crois que je n’ai pas une constitution physique assez solide pour conduire une voiture et pour le travail de bureau.

Photo by Daniel Sturgess | @daniel_sturgess on Unsplash

Je suis @ploum, conférencier et écrivain électronique. Si vous avez apprécié ce texte, n'hésitez pas à me soutenir sur Tipeee, Patreon, Paypal, Liberapay ou en millibitcoins 34pp7LupBF7rkz797ovgBTbqcLevuze7LF. Vos soutiens réguliers, même symboliques, sont une réelle motivation et reconnaissance. Merci !

Ce texte est publié sous la licence CC-By BE.

February 15, 2019

I published the following diary on isc.sans.edu: “Old H-Worm Delivered Through GitHub”:

Another piece of malicious code spotted on GitHub this time. By the way, this is the perfect example to demonstrate that protecting users via a proxy with web-categorization is useless… Event sites from the Alexa Top-1M may deliver malicious content (Github current position is 51. The URL has been found in a classic email phishing attempt. The content was recently uploaded (<24h) when I found it… [Read more]

[The post [SANS ISC] Old H-Worm Delivered Through GitHub has been first published on /dev/random]

You know that frustrating Google PageSpeed Insights opportunity “Defer unused CSS”? Well, it’s going to be renamed soon (in Lighthouse first, so GPSI should follow) as per this Github merged pull request;

The full text will read;

Remove unused CSS
Remove dead rules from stylesheets and defer the loading of CSS not used for above-the-fold content to reduce unnecessary bytes consumed by network activity.

February 14, 2019

An image of a copyright sign

After much debate, the EU Copyright Directive is now moving to a final vote in the European Parliament. The directive, if you are not familiar, was created to prohibit spreading copyrighted material on internet platforms, protecting the rights of creators (for example, many musicians have supported this overhaul).

The overall idea behind the directive — compensating creators for their online works — makes sense. However, the implementation and execution of the directive could have a very negative impact on the Open Web. I'm surprised more has not been written about this within the web community.

For example, Article 13 requires for-profit online services to implement copyright filters for user-generated content, which includes comments on blogs, reviews on commerce sites, code on programming sites or possibly even memes and cat photos on discussion forums. Any for-profit site would need to apply strict copyright filters on content uploaded by a site's users. If sites fail to correctly filter copyrighted materials, they will be directly liable to rights holders for expensive copyright infringement violations.

While implementing copyright filters may be doable for large organizations, it may not be for smaller organizations. Instead, small organizations might decide to stop hosting comments or reviews, or allowing the sharing of code, photos or videos. The only for-profit organizations potentially excluded from these requirements are companies earning less than €10 million a year, until they have been in business for three years. It's not a great exclusion, because there are a lot of online communities that have been around for more than three years and don't make more than €10 million a year.

The EU tends to lead the way when it comes to internet legislation. For example, GDPR has proven successful for consumer data protection and has sparked state-by-state legislation in the United States. In theory, the EU Copyright Directive could do the same thing for modern internet copyright law. My fear is that in practice, these copyright filters, if too strict, could discourage the free flow of information and sharing on the Open Web.

I published the following diary on isc.sans.edu: “Suspicious PDF Connecting to a Remote SMB Share”:

Yesterday I stumbled upon a PDF file that was flagged as suspicious by a customer’s anti-malware solution and placed in the quarantine. Later, the recipient contacted the team in charge of emails to access his document because he knew the sender and pretended that the file was legit… [Read more]

[The post [SANS ISC] Suspicious PDF Connecting to a Remote SMB Share has been first published on /dev/random]

I've been thinking about the performance of my site and how it affects the user experience. There are real, ethical concerns to poor web performance. These include accessibility, inclusion, waste and environmental concerns.

A faster site is more accessible, and therefore more inclusive for people visiting from a mobile device, or from areas in the world with slow or expensive internet.

For those reasons, I decided to see if I could improve the performance of my site. I used the excellent https://webpagetest.org to benchmark a simple blog post https://dri.es/relentlessly-eliminating-barriers-to-growth.

A diagram that shows page load times for dri.es before making performance improvements

The image above shows that it took a browser 0.722 seconds to download and render the page (see blue vertical line):

  • The first 210 milliseconds are used to set up the connection, which includes the DNS lookup, TCP handshake and the SSL negotiation.
  • The next 260 milliseconds (from 0.21 seconds to 0.47 seconds) are spent downloading the rendered HTML file, two CSS files and one JavaScript file.
  • After everything is downloaded, the final 330 milliseconds (from 0.475 seconds to 0.8 seconds) are used to layout the page and execute the JavaScript code.

By most standards, 0.722 seconds is pretty fast. In fact, according to HTTP Archive, it takes more than 2.4 seconds to download and render the average web page on a laptop or desktop computer.

Regardless, I noticed that the length of the horizontal green bars and the horizontal yellow bar was relatively long compared to that of the blue bar. In other words, a lot of time is spent downloading JavaScript (yellow horizontal bar) and CSS (two green horizontal bars) instead of the HTML, including the actual content of the blog post (blue bar).

To fix, I did two things:

  1. Use vanilla JavaScript. I replaced my jQuery-based JavaScript with vanilla JavaScript. Without impacting the functionality of my site, the amount of JavaScript went from almost 45 KB to 699 bytes, good for a savings of over 6,000 percent.
  2. Conditionally include CSS. For example, I use Prism.js for syntax highlighting code snippets in blog posts. prism.css was downloaded for every page request, even when there were no code snippets to highlight. Using Drupal's render system, it's easy to conditionally include CSS. By taking advantage of that, I was able to reduce the amount of CSS downloaded by 47 percent — from 4.7 KB to 2.5 KB.

According to the January 1st, 2019 run of HTTP Archive, the median page requires 396 KB of JavaScript and 60 KB of CSS. I'm proud that my site is well under these medians.

File type Dri.es before Dri.es after World-wide median
JavaScript 45 KB 669 bytes 396 KB
CSS 4.7 KB 2.5 KB 60 KB

Because the new JavaScript and CSS files are significantly smaller, it takes the browser less time to download, parse and render them. As a result, the same blog post is now available in 0.465 seconds instead of 0.722 seconds, or 35% faster.

After a new https://webpagetest.org test run, you can clearly see that the bars for the CSS and JavaScript files became visually shorter:

A diagram that shows page load times for dri.es reduced after making performance improvements

To optimize the user experience of my site, I want it to be fast. I hope that others will see that bloated websites can come at a great cost, and will consider using tools like https://webpagetest.org to make their sites more performant.

I'll keep working on making my website even faster. As a next step, I plan to make pages with images faster by using lazy image loading.

February 12, 2019

February 11, 2019

An abstract image of three boxes

The web used to be server-centric in that web content management systems managed data and turned it into HTML responses. With the rise of headless architectures a portion of the web is becoming server-centric for data but client-centric for its presentation; increasingly, data is rendered into HTML in the browser.

This shift of responsibility has given rise to JavaScript frameworks, while on the server side, it has resulted in the development of JSON:API and GraphQL to better serve these JavaScript applications with content and data.

In this blog post, we will compare REST, JSON:API and GraphQL. First, we'll look at an architectural, CMS-agnostic comparison, followed by evaluating some Drupal-specific implementation details.

It's worth noting that there are of course lots of intricacies and "it depends" when comparing these three approaches. When we discuss REST, we mean the "typical REST API" as opposed to one that is extremely well-designed or following a specification (not REST as a concept). When we discuss JSON:API, we're referring to implementations of the JSON:API specification. Finally, when we discuss GraphQL, we're referring to GraphQL as it used in practice. Formally, it is only a query language, not a standard for building APIs.

The architectural comparison should be useful for anyone building decoupled applications regardless of the foundation they use because the qualities we will evaluate apply to most web projects.

To frame our comparisons, let's establish that most developers working with web services care about the following qualities:

  1. Request efficiency: retrieving all necessary data in a single network round trip is essential for performance. The size of both requests and responses should make efficient use of the network.
  2. API exploration and schema documentation: the API should be quickly understandable and easily discoverable.
  3. Operational simplicity: the approach should be easy to install, configure, run, scale and secure.
  4. Writing data: not every application needs to store data in the content repository, but when it does, it should not be significantly more complex than reading.

We summarized our conclusions in the table below, but we discuss each of these four categories (or rows in the table) in more depth below. If you aggregate the colors in the table, you see that we rank JSON:API above GraphQL and GraphQL above REST.

REST JSON:API GraphQL
Request efficiency Poor; multiple requests are needed to satisfy common needs. Responses are bloated. Excellent; a single request is usually sufficient for most needs. Responses can be tailored to return only what is required. Excellent; a single request is usually sufficient for most needs. Responses only include exactly what was requested.
Documentation, API explorability and schema Poor; no schema, not explorable. Acceptable; generic schema only; links and error messages are self-documenting. Excellent; precise schema; excellent tooling for exploration and documentation.
Operational simplicity Acceptable; works out of the box with CDNs and reverse proxies; few to no client-side libraries required. Excellent; works out of the box with CDNs and reverse proxies, no client-side libraries needed, but many are available and useful. Poor; extra infrastructure is often necessary client side libraries are a practical necessity, specific patterns required to benefit from CDNs and browser caches.
Writing data Acceptable; HTTP semantics give some guidance but how specifics left to each implementation, one write per request. Excellent; how writes are handled is clearly defined by the spec, one write per request, but multiple writes is being added to the specification. Poor; how writes are handled is left to each implementation and there are competing best practices, it's possible to execute multiple writes in a single request.

If you're not familiar with JSON:API or GraphQL, I recommend you watch the following two short videos. They will provide valuable context for the remainder of this blog post:

Request efficiency

Most REST APIs tend toward the simplest implementation possible: a resource can only be retrieved from one URI. If you want to retrieve article 42, you have to retrieve it from https://example.com/article/42. If you want to retrieve article 42 and article 72, you have to perform two requests; one to https://example.com/article/42 and one to https://example.com/article/72. If the article's author information is stored in a different content type, you have to do two additional requests, say to https://example.com/author/3 and https://example.com/author/7. Furthermore, you can't send these requests until you've requested, retrieved and parsed the article requests (you wouldn't know the author IDs otherwise).

Consequently, client-side applications built on top of basic REST APIs tend to need many successive requests to fetch their data. Often, these requests can't be sent until earlier requests have been fulfilled, resulting in a sluggish experience for the website visitor.

GraphQL and JSON:API were developed to address the typical inefficiency of REST APIs. Using JSON:API or GraphQL, you can use a single request to retrieve both article 42 and article 72, along with the author information for each. It simplifies the developer experience, but more importantly, it speeds up the application.

Finally, both JSON:API and GraphQL have a solution to limit response sizes. A common complaint against typical REST APIs is that their responses can be incredibly verbose; they often respond with far more data than the client needs. This is both annoying and inefficient.

GraphQL eliminates this by requiring the developer to explicitly add each desired resource field to every query. This makes it difficult to over-fetch data but easily leads to very large GraphQL queries, making (cacheable) GET requests impossible.

JSON:API solves this with the concept of sparse fieldsets or lists of desired resource fields. These behave in much the same fashion as GraphQL does, however, when they're omitted JSON:API will typically return all fields. An advantage, though, is that when a JSON:API query gets too large, sparse fieldsets can be omitted so that the request remains cacheable.

REST JSON:API GraphQL
Multiple data objects in a single response Usually; but every implementation is different (for Drupal: custom "REST Export" view or custom REST plugin needed). Yes Yes
Embed related data (e.g. the author of each article) No Yes Yes
Only needed fields of a data object No Yes; servers may choose sensible defaults, developers must be diligent to prevent over-fetching. Yes; strict, but eliminates over-fetching, at the extreme, it can lead to poor cacheability.

Documentation, API explorability and schema

As a developer working with web services, you want to be able to discover and understand the API quickly and easily: what kinds of resources are available, what fields does each of them have, how are they related, etc. But also, if this field is a date or time, what machine-readable format is the date or time specified in? Good documentation and API exploration can make all the difference.

REST JSON:API GraphQL
Auto-generated documentation Depends; if using the OpenAPI standard. Depends; if using the OpenAPI standard. Yes; various tools available.
Interactivity Poor; navigable links rarely available. Acceptable; observing available fields and links in its responses enable exploration of the API. Excellent; autocomplete feature, instant results or compilation errors, complete and contextual documentation.
Validatable and programmable schema. Depends; if using the OpenAPI standard. Depends; the JSON:API specification defines a generic schema, but a reliable field-level schema is not yet available. Yes; a complete and reliable schema is provided (with very few exceptions).

GraphQL has superior API exploration thanks to GraphiQL (demonstrated in the video above), an in-browser IDE of sorts, which lets developers iteratively construct a query. As the developer types the query out, likely suggestions are offered and can be auto-completed. At any time, the query can be run and GraphiQL will display real results alongside the query. This provides immediate, actionable feedback to the query builder. Did they make a typo? Does the response look like what was desired? Additionally, documentation can be summoned into a flyout, when additional context is needed.

On the other hand, JSON:API is more self-explanatory: APIs can be explored with nothing more than a web browser. From within the browser, you can browse from one resource to another, discover its fields, and more. So, if you just want to debug or try something out, JSON:API is usable with nothing more than cURL or your browser. Or, you can use Postman (demonstrated in the video above) — a standalone environment for developing on top of an any HTTP-based API. Constructing complex queries requires some knowledge, however, and that is where GraphQL's GraphiQL shines compared to JSON:API.

Operational simplicity

We use the term operational simplicity to encompass how easy it is to install, configure, run, scale and secure each of the solutions.

The table should be self-explanatory, but we want to provide some more details about the "scalability" row. To scale a REST-based or JSON:API-based web service so that it can handle a large volume of traffic, you can use the same approach websites (and Drupal) already use, including reverse proxies like Varnish or a CDN. To scale GraphQL, you can't rely on HTTP caching as with REST or JSON:API without persisted queries. Persisted queries are not part of the official GraphQL specification but they are a widely-adopted convention amongst GraphQL users. They essentially store a query on the server, assign it an ID and permit the client to get the result of the query using a GET request with only the ID. Persisted queries add more operational complexity, and it also means the architecture is no longer fully decoupled — if a client wants to retrieve different data, server-side changes are required.

REST JSON:API GraphQL
Scalability: additional infrastructure requirements Excellent; same as a regular website (Varnish, CDN, etc). Excellent; same as a regular website (Varnish, CDN, etc). Usually poor; only the simplest queries can use GET requests; to reap the full benefit of GraphQL, servers needs their own tooling.
Tooling ecosystem Acceptable; lots of developer tools available, but for the best experience they need to be customized for the implementation. Excellent; lots of developer tools available; tools don't need to be implementation-specific. Excellent; lots of developer tools available; tools don't need to be implementation-specific.
Typical points of failure Fewer; server, client. Fewer; server, client. Many; server, client, client-side caching, client and build tooling.

Writing data

For most REST APIs and JSON:API, writing data is as easy as fetching it: if you can read information, you also know how to write it. Instead of using the GET HTTP request type you use POST and PATCH requests. JSON:API improves on typical REST APIs by eliminating differences between implementations. There is just one way to do things and that enabled better, generic tooling and less time spent on server-side details.

The nature of GraphQL's write operations (called mutations) means that you must write custom code for each write operation; unlike JSON:API the specification, GraphQL doesn't prescribe a single way of handling write operations to resources, so there are many competing best practices. In essence, the GraphQL specification is optimized for reads, not writes.

On the other hand, the GraphQL specification supports bulk/batch operations automatically for the mutations you've already implemented, whereas the JSON:API specification does not. The ability to perform batch write operations can be important. For example, in our running example, adding a new tag to an article would require two requests; one to create the tag and one to update the article. That said, support for bulk/batch writes in JSON:API is on the specification's roadmap.

REST JSON:API GraphQL
Writing data Acceptable; every implementation is different. No bulk support. Excellent; JSON:API prescribes a complete solution for handling writes. Bulk operations are coming soon. Poor; GraphQL supports bulk/batch operations, but writes can be tricky to design and implement. There are competing conventions.

Drupal-specific considerations

Up to this point we have provided an architectural and CMS-agnostic comparison; now we also want to highlight a few Drupal-specific implementation details. For this, we can look at the ease of installation, automatically generated documentation, integration with Drupal's entity and field-level access control systems and decoupled filtering.

Drupal 8's REST module is practically impossible to set up without the contributed REST UI module, and its configuration can be daunting. Drupal's JSON:API module is far superior to Drupal's REST module at this point. It is trivial to set up: install it and you're done; there's nothing to configure. The GraphQL module is also easy to install but does require some configuration.

Client-generated collection queries allow a consumer to filter an application's data down to just what they're interested in. This is a bit like a Drupal View except that the consumer can add, remove and control all the filters. This is almost always a requirement for public web services, but it can also make development more efficient because creating or changing a listing doesn't require server-side configuration changes.

Drupal's REST module does not support client-generated collection queries. It requires a "REST Views display" to be setup by a site administrator and since these need to be manually configured in Drupal; this means a client can't craft its own queries with the filters it needs.

JSON:API and GraphQL, clients are able to perform their own content queries without the need for server-side configuration. This means that they can be truly decoupled: changes to the front end don't always require a back-end configuration change.

These client-generated queries are a bit simpler to use with the JSON:API module than they are with the GraphQL module because of how each module handles Drupal's extensive access control mechanisms. By default JSON:API ensures that these are respected by altering the incoming query. GraphQL instead requires the consumer to have permission to simply bypass access restrictions.

Most projects using GraphQL that cannot grant this permission use persisted queries instead of client-generated queries. This means a return to a more traditional Views-like pattern because the consumer no longer has complete control of the query's filters. To regain some of the efficiencies of client-generated queries, the creation of these persisted queries can be automated using front-end build tooling.

REST JSON:API GraphQL
Ease of installation and configuration Poor; requires contributed module REST UI, easy to break clients by changing configuration. Excellent; zero configuration! Poor; more complex to use, may require additional permissions, configuration or custom code.
Automatically generated documentation Acceptable; requires contributed module OpenAPI. Acceptable; requires contributed module OpenAPI. Excellent; GraphQL Voyager included.
Security: content-level access control (entity and field access) Excellent; content-level access control respected. Excellent; content-level access control respected, even in queries. Acceptable; some use cases require the consumer to have permission to bypass all entity and/or field access.
Decoupled filtering (client can craft queries without server-side intervention) No Yes Depends; only in some setups and with additional tooling/infrastructure.

What does this mean for Drupal's roadmap?

Drupal grew up as a traditional web content management system but has since evolved for this API-first world and industry analysts are praising us for it.

As Drupal's project lead, I've been talking about adding out-of-the-box support for both JSON:API and GraphQL for a while now. In fact, I've been very bullish about GraphQL since 2015. My optimism was warranted; GraphQL is undergoing a meteoric rise in interest across the web development industry.

Based on this analysis, for Drupal core's needs, we rank JSON:API above GraphQL and GraphQL above REST. As such, I want to change my recommendation for Drupal 8 core. Instead of adding both JSON:API and GraphQL to Drupal 8 core, I believe only JSON:API should be added. That said, Drupal's GraphQL implementation is fantastic, especially when you have the developer capacity to build a bespoke API for your project.

On the four qualities by which we evaluated the REST, JSON:API and GraphQL modules, JSON:API has outperformed its contemporaries. Its web standards-based approach, its ability to handle reads and writes out of the box, its security model and its ease of operation make it the best choice for Drupal core. Additionally, where JSON:API underperformed, I believe that we have a real opportunity to contribute back to the specification. In fact, one of the JSON:API module's maintainers and co-authors of this blog post, Gabe Sullice (Acquia), recently became a JSON:API specification editor himself.

This decision does not mean that you can't or shouldn't use GraphQL with Drupal. While I believe JSON:API covers the majority of use cases, there are valid use cases where GraphQL is a great fit. I'm happy that Drupal is endowed with such a vibrant contributed module ecosystem that provides so many options to Drupal's users.

I'm excited to see where both the JSON:API specification and Drupal's implementation of it goes in the coming months and years. As a first next step, we're preparing the JSON:API to be added to Drupal 8.7.

Special thanks to Wim Leers (Acquia) and Gabe Sullice (Acquia) for co-authoring this blog post and to Preston So (Acquia) and Alex Bronstein (Acquia) for their feedback during the writing process.

Une nouvelle série de billets pour explorer la philosophie “Distraction free”.

Il y’a seulement et déjà 13 ans exactement, le développeur GNOME Vincent Untz me prêtait son Nokia 770 pour un week-end.

Photo par Miia Ranta, CC BY-SA 2.5

Cela peut sembler préhistorique, mais, à cette époque, les smartphones n’existaient pas (on était encore un an avant le lancement du premier iPhone). Les laptops n’étaient pas tellement courants et, souvent, étaient beaucoup moins puissants que les ordinateurs de bureau pour un prix très élevé (ou alors ils étaient lourds et encombrants). Mon utilisation d’Internet était donc limitée à ma chambre d’étudiant.

Pourtant, j’adorais déjà Internet. J’étais heureux de rentrer dans ma chambre pour retrouver ce monde infini : les forums que je fréquentais, les discussions sur IRC, les blogs que je lisais, le code que j’écrivais. Un univers gigantesque malgré son confinement aux quatre murs de ma chambre.

Mais avec le Nokia 770, tout changea subitement. Le soir même, je découvris que je pouvais chatter sur IRC dans mon lit avant de m’endormir. Que je pouvais consulter les forums de n’importe où et, déjà, lire des livres électroniques que je téléchargeais.

Ce fut une révélation. Conquis par le prêt de Vuntz, je fis rapidement l’acquisition de l’appareil. Un dimanche matin, alors que je faisais la file dans la boulangerie de mon quartier, je sortis machinalement le Nokia 770 de ma poche et découvrit qu’il y’avait un Wifi non protégé à proximité.

À l’époque, les wifi non protégés étaient courants, mais la 3G n’existait pas. D’ailleurs, le Nokia 770 n’avait pas de carte sim et ne pouvait servir de téléphone. C’était littéralement un mini-ordinateur.

À travers le wifi, je me mis à consulter le site Linuxfr, que j’appréciais particulièrement, tout en attendant mon tour pour commander mes pains au chocolat. Cette expérience fut, pour moi, mystique. Pour la première fois de ma vie, je ne devais pas attendre en m’ennuyant, je ne devais pas perdre un temps inutile à écouter des conversations sans intérêt. J’avais accès à mon univers étendu partout. Enthousiaste, je postai un message sur Linuxfr, disant que j’étais à la boulangerie et que je trouvais ça génial.

La communauté Linuxfr s’enflamma sur la blague de “la boulangère de Ploum” (une vieille dame qui ne saura probablement jamais à quel point elle a été l’objet de blagues salaces de la part cette petite communauté) et, aujourd’hui encore, il m’arrive de recevoir un message avec un post-scriptum « Au fait, bien le bonjour à ta boulangère ». La communauté Linuxfr n’oublie jamais !

Mais faisons un rapide bond en avant de 13 années. La boulangerie a été détruite et remplacée par un bâtiment moderne contenant bureaux et magasins. Ce que je trouvais exceptionnel est devenu la norme absolue. Nous avons Internet partout et tout le temps. Plus besoin de sortir un engin de notre poche et de se connecter, notre poche vibre sans arrêt de notifications. Les réseaux sociaux (concept inconnu en 2006) nous appellent sans cesse. C’est à ce point problématique que nous avons développé le syndrome des notifications fantômes : nous pensons sentir des vibrations même lorsque le téléphone n’est pas dans notre poche. Et si nous sommes déconnectés pour cause de mauvais réseau, nous nous en rendons compte immédiatement ! Nous pestons, nous jurons si nous sommes coupés quelques minutes de ce qui semblait tout bonnement impossible il y’a seulement 13 ans !

Et même si vous décidez d’éteindre volontairement votre téléphone, autour de vous la ville bruisse de notifications vaguement musicales, les gens ont les yeux rivés sur leur téléphone dans les salles d’attente, les files de boulangeries, dans la rue. Ils n’accèdent plus à Internet, Internet les avale, les digère. D’ailleurs, comme vient de le démontrer une équipe de chercheurs américains, même lorsqu’il est en silencieux, notre téléphone nous déconcentre par sa seule présence !

J’étais enthousiaste à l’idée de ne plus perdre de temps, mais, aujourd’hui, nous n’avons plus le temps pour rien. Internet est devenu un trou noir temporel, un aspirateur de pensées, une décharge d’inspiration.

Contre toute attente, nous tentons désormais de retrouver le temps de nous ennuyer dans une file d’attente, de méditer. Nous devons développer des stratégies de protection. La moitié des posts sur la plateforme Medium sont en substance des gens qui ont passé une demi-heure sans leur téléphone et témoignent de ô combien c’est vraiment génial.

Je ne fais pas exception ! Je vous ai parlé de ma déconnexion, de la manière dont j’ai configuré mon téléphone. Mais là où le smartphone était l’outil ultime qui faisait tout (de la lampe de poche à l’appareil photo en passant par la machine à écrire portative), nous ressentons le besoin d’outils qui ne font plus qu’une et une seule chose.

Ou, plutôt, nous avons besoin d’outils qui ne peuvent pas faire certaines choses. Ne pas se connecter à Facebook ni avoir accès aux médias devient la fonctionnalité ultime. Toute une gamme de nouveaux produits se prétend désormais “distraction free”.

Un comble quand on replonge 13 ans en arrière. On pourrait croire qu’il faut seulement d’un peu de volonté pour ne pas utiliser Facebook/checker les news, mais il apparait de plus en plus évident que les plateformes publicitaires que sont les réseaux sociaux nous capturent à un niveau subconscient hors de portée de notre simple volonté. Car, comme le montre l’expérience citée plus haut, même si nous arrivons à “ne pas céder”, l’effort mental est tellement important qu’il s’en ressent dans nos performances intellectuelles.

En 13 ans seulement, l’ennui est passé d’une partie de la vie inévitable à une denrée rare dont nous commençons seulement à percevoir l’importance. En 13 ans, l’accès à Internet est passé d’une denrée rare, cantonnée à certains endroits précis, à une présence envahissante et sans limites dont il devient difficile de se protéger. L’homme s’ennuie depuis des milliers d’années et il s’avère que c’est un processus essentiel. Nous devons apprendre à nous ennuyer volontairement.

Le marché, toujours à l’écoute de nos besoins, voit donc fleurir une myriade d’appareils “distraction free”. J’ai moi-même imaginé un « Zen device », un appareil non plus dédié aux microtâches, mais à ce que je souhaite accomplir. Retour en arrière ? Arnaque ? Ou réelle adaptation d’un marché qui a été trop loin dans la captation de notre attention ? 

Sous le thème “distraction free”, il y’a certainement à boire et à manger, mais, lorsque je me penche sur un écran autre que le mien, je suis toujours saisi par la profusion, d’informations inutiles, de couleurs, de stimuli.

Les écrans de laptops sont littéralement remplis d’icônes qui se superposent, les boîtes mail dans les téléphones annoncent des centaines voire des milliers de mails non lus, la zone de notification est surchargée. D’ailleurs, il est désormais une pratique courante de réenvoyer plusieurs fois un mail si on n’a pas de réponse. Voire de notifier la même personne sur plusieurs réseaux à la fois lorsqu’on veut vraiment attirer son attention.

Dans les applications spécialisées elles-mêmes, des bandeaux proposant des mises à jour ou des informations parfois vieilles de plusieurs mois sont affichés alors qu’il suffirait d’un clic pour les faire disparaitre.

Le navigateur est certainement la partie la plus effrayante : débordant de bandeaux publicitaires clignotants, de proposition d’installer un navigateur alternatif, des cookies à accepter voire de “barres d’outils” installées par mégarde. C’est bien simple, la zone de travail sur un laptop est souvent réduite à sa plus simple expression. Il est probable que votre téléphone soit fourni avec plein d’applications que vous ne pouvez pas désinstaller, le constructeur espérant que, en désespoir de cause, vous finissiez par les utiliser. Des icônes aux couleurs vives qui ne vous servent à rien, mais que vous avez sous les yeux tout le temps et qui occupent de l’espace mémoire chèrement payé.

La plupart des utilisateurs prétendent ne même pas voir toute cette gabegie sur leur propre écran, être habitués. Ils savent dans quelle zone ils peuvent cliquer, où chercher les 3 icônes utiles et quels sont les dizaines de mails qu’ils n’ont pas lus, mais qu’ils ne liront jamais.

Cela me fait mal au cœur, car cette situation induit un stress, une fatigue inconsciente chez les utilisateurs. Une énergie mentale incroyable est mobilisée pour arriver à se concentrer hors des pubs qui clignotent, des icônes inutiles, des mails non importants, mais toujours présents.

Depuis des années, je tente d’afficher le moins possible sur mon écran. J’utilise toujours le mode nuit, des couleurs sombres, un logiciel pour filtrer la couleur bleue. J’utilise plusieurs bloqueurs de publicités, je supprime toute icône qui apparait sur mon bureau et je suis très strict vis-à-vis de mon Inbox 0.

Mais je réalise que tout cela demande une certaine aisance, une conscience de l’outil, une rigueur scrupuleuse et un investissement en temps pour apprendre ces techniques. Si l’investissement des quelques secondes nécessaires pour se désabonner d’une newsletter est extrêmement rentable, il est bien plus facile de laisser les mails tels quels sans même les ouvrir et de s’habituer progressivement à la pastille rouge qui indique 1017 afin de n’ouvrir son logiciel de mail que lors de l’incrément à 1018.

La technologie n’est donc pas prévue pour les gens “normaux”. Elle fonctionne littéralement contre eux, à leurs dépens. Elle les fatigue, les stresse, affaiblit leur capacité cognitive, les désensibilise.

Le résultat est une escalade dans la guerre à l’attention (ou plutôt à la distraction). Les apps rivalisent de notifications impossibles à désactiver, tester le moindre service vous inscrit automatiquement à des dizaines de newsletters sans compter les mails pour tenter de nous faire revenir sur le service.

Et si un utilisateur plus courageux qu’un autre se lance dans le process de désabonnement, de suppression des notifications, il trouvera des messages culpabilisants l’informant qu’il va rater des informations primordiales puis tout le reste ayant failli, qu’il fait pleurer les développeurs, qu’ils sont tristes de le voir partir. Ne parlons même pas de la suppression complète d’un compte sur un service, qui est le plus souvent un parcours du combattant sans aucune garantie d’être réellement effacé de la base de données.

D’ailleurs, si vous êtes l’auteur d’un de ces messages culpabilisant, je vous conchie, vous êtes la lie de l’humanité, la morve de l’espèce. Ça vaut certainement pour toute cette industrie qui cherche à accaparer notre attention pour nous vendre de la merde dont nous n’avons pas besoin.

Ce qui est effrayant avec cet état de fait c’est qu’il sépare de facto l’humanité en deux classes distinctes : une élite qui a les ressources pour se protéger des agressions mentales permanentes et le reste de la populace, attaquée en permanence, soumise à un lavage de cerveau constant, épuisé, lessivé et de moins en moins capable de se concentrer. Un futur que je décris dans Printeurs, mais qui n’est plus très éloigné de notre présent.

Certains ont pris le parti de rejeter autant que possible la technologie, se rendant compte avec intelligence que celle-ci a pris le dessus sur eux et ne voyant pas d’autres alternatives. Des syndromes psychosomatiques commencent même à arriver, comme l’électrosensibilité ou la peur des “ondes” qui, finalement, ne sont qu’une manière inconsciente d’exprimer notre envahissement par la connexion permanente.

Mais je suis de ceux qui pensent que la technologie est indispensable pour construire collectivement le futur à une échelle globale. Un retour en arrière serait une catastrophe.

Il n’y a donc que deux solutions : changer les gens ou changer la technologie.

À mon échelle, j’essaie de changer les gens, de leur démontrer qu’ils peuvent faire partie de l’élite avec un investissement très minime, que cet investissement est rentable. Installer des bloqueurs de pubs, désactiver dès que possible les notifications, se mettre à l’inbox 0, se méfier de la « gratuité commerciale ». Bref conscientiser une hygiène numérique.

Mais la solution réelle ne pourra venir que d’un changement radical de la technologie. Lorsque les concepteurs de la technologie ne seront plus eux-mêmes une minorité issue de l’élite, mais que son objectif sera de servir l’humain et non plus les publicitaires.

Certains militent, comme Aral Balkan qui a mis au point l’Ethical Design. Ou Humanetech, qui œuvre dans la même veine. D’autres tentent de créer de nouveaux produits. Au fond, “Distraction Free” n’est probablement qu’un nouveau mot marketing pour dire “On cherche à vous être utile à vous, pas à vous espionner pour mieux capter votre attention et vendre votre cerveau au plus offrant”. Et c’est une bonne chose.

Simple slogan marketing ou réel progrès dans les méthodes de conception des produits ? C’est ce que je me propose d’explorer dans cette série, en vous parlant des produits “distraction-free” que je testerai, treize années après le Nokia 770 qui ouvrit pour moi la boîte de Pandore de l’Internet mobile.

Photo by Gerrie van der Walt on Unsplash

Je suis @ploum, conférencier et écrivain électronique. Si vous avez apprécié ce texte, n'hésitez pas à me soutenir sur Tipeee, Patreon, Paypal, Liberapay ou en millibitcoins 34pp7LupBF7rkz797ovgBTbqcLevuze7LF. Vos soutiens réguliers, même symboliques, sont une réelle motivation et reconnaissance. Merci !

Ce texte est publié sous la licence CC-By BE.

February 10, 2019

w500 and pi

I got a Lenovo Thinkpad W500 from www.2dehands.be for a nice price.

Actually, I got it a couple of months back but I didn’t have time to play with it and it took some time to get some parts from Aliexpress.

The Thinkpad W500 is probably the most powerful system that is compatible with Libreboot, it has a nice high-resolution display with a 1920 x 1200 resolution which is even a higher screen resolution than the Full HD resolution used on most new laptops today.

Security

Keep in mind that the core duo CPU does not get microcode updates from Intel for spectre and meltdown. There is no solution (currently) for spectre 3a - Rogue System Register Read - CVE-2018-3640 and Spectre 4 - Speculative Store Bypass CVE-2018-3639 without a microcode update.

Binary blobs are bad. Having a closed source binary-only piece of software on your system is not only unacceptable for Free Software activists it also makes it more difficult to review what it really does and makes it more difficult to review it for security concerns.

Having your system vulnerable is also a bad thing of course. Can’t wait to get a computer system with an open CPU architecture like RISC-V.

Preparation

Thinkpad

MAC address

Your MAC address is stored in your BIOS since you’ll overwite the BIOS with Libreboot we need to have the MAC address. Your MAC address is written on Laptop however I recommend to boot from GNU/Linux and copy/paste it from the ifconfig or the ip a command.

EC update

It’s recommended to update your current BIOS to get the latest EC firmware. My system has a CDROM drive I updated the BIOS with a CDROM.

Prepare the Raspberry-pi

It isn’t possible to flash the BIOS with software only on a Lenovo W500/T500, it’s required to put a clip on your BIOS chip and flash the new BIOS with flashrom. I used a Raspberry Pi 1 model B with Raspbian to flash Libreboot .

Enable the SPI port

The SPI port isn’t enabled by default on Raspbian, so we’ll need to enable it.

Open /boot/config.txt in your favorite text editor.

1
2
3
4
5
6
7
8
root@raspberrypi:~# cd /boot/
root@raspberrypi:/boot# ls
bcm2708-rpi-0-w.dtb     bcm2710-rpi-3-b.dtb       config.txt     fixup_x.dat       LICENSE.oracle  start_x.elf
bcm2708-rpi-b.dtb       bcm2710-rpi-3-b-plus.dtb  COPYING.linux  issue.txt         overlays
bcm2708-rpi-b-plus.dtb  bcm2710-rpi-cm3.dtb       fixup_cd.dat   kernel7.img       start_cd.elf
bcm2708-rpi-cm.dtb      bootcode.bin              fixup.dat      kernel.img        start_db.elf
bcm2709-rpi-2-b.dtb     cmdline.txt               fixup_db.dat   LICENCE.broadcom  start.elf
root@raspberrypi:/boot# vi config.txt 

uncomment dtparam=spi=on

1
2
3
4
# Uncomment some or all of these to enable the optional hardware interfaces
#dtparam=i2c_arm=on
#dtparam=i2s=on
dtparam=spi=on

After a reboot of the raspberry-pi the SPI interface /dev/spidev* will be available.

1
2
3
4
root@raspberrypi:~# ls -l /dev/spidev*
crw-rw---- 1 root spi 153, 0 Jan 26 20:08 /dev/spidev0.0
crw-rw---- 1 root spi 153, 1 Jan 26 20:08 /dev/spidev0.1
root@raspberrypi:~# 

Install the required software

git

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
pi@raspberrypi:~ $ sudo apt install git
Reading package lists... Done
Building dependency tree       
Reading state information... Done
The following additional packages will be installed:
  git-man liberror-perl
Suggested packages:
  git-daemon-run | git-daemon-sysvinit git-doc git-el git-email git-gui gitk gitweb git-arch git-cvs
  git-mediawiki git-svn
The following NEW packages will be installed:
  git git-man liberror-perl
0 upgraded, 3 newly installed, 0 to remove and 0 not upgraded.
Need to get 4,849 kB of archives.
After this operation, 26.4 MB of additional disk space will be used.
Do you want to continue? [Y/n] y
Get:1 http://mirror.nl.leaseweb.net/raspbian/raspbian stretch/main armhf liberror-perl all 0.17024-1 [26.9 kB]
Get:2 http://mirror.nl.leaseweb.net/raspbian/raspbian stretch/main armhf git-man all 1:2.11.0-3+deb9u4 [1,433 kB]
Get:3 http://mirror.nl.leaseweb.net/raspbian/raspbian stretch/main armhf git armhf 1:2.11.0-3+deb9u4 [3,390 kB]
Fetched 4,849 kB in 3s (1,517 kB/s)
Selecting previously unselected package liberror-perl.
(Reading database ... 35178 files and directories currently installed.)
Preparing to unpack .../liberror-perl_0.17024-1_all.deb ...
Unpacking liberror-perl (0.17024-1) ...
Selecting previously unselected package git-man.
Preparing to unpack .../git-man_1%3a2.11.0-3+deb9u4_all.deb ...
Unpacking git-man (1:2.11.0-3+deb9u4) ...
Selecting previously unselected package git.
Preparing to unpack .../git_1%3a2.11.0-3+deb9u4_armhf.deb ...
Unpacking git (1:2.11.0-3+deb9u4) ...
Setting up git-man (1:2.11.0-3+deb9u4) ...
Setting up liberror-perl (0.17024-1) ...
Processing triggers for man-db (2.7.6.1-2) ...
Setting up git (1:2.11.0-3+deb9u4) ...
pi@raspberrypi:~ $ 

flashrom

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
root@raspberrypi:~# apt install flashrom
Reading package lists... Done
Building dependency tree       
Reading state information... Done
The following additional packages will be installed:
  libftdi1-2 libpci3
The following NEW packages will be installed:
  flashrom libftdi1-2 libpci3
0 upgraded, 3 newly installed, 0 to remove and 0 not upgraded.
Need to get 454 kB of archives.
After this operation, 843 kB of additional disk space will be used.
Do you want to continue? [Y/n] y
Get:1 http://mirror.nl.leaseweb.net/raspbian/raspbian stretch/main armhf libpci3 armhf 1:3.5.2-1 [50.9 kB]
Get:2 http://mirror.nl.leaseweb.net/raspbian/raspbian stretch/main armhf libftdi1-2 armhf 1.3-2 [26.8 kB]
Get:3 http://mirror.nl.leaseweb.net/raspbian/raspbian stretch/main armhf flashrom armhf 0.9.9+r1954-1 [377 kB]
Fetched 454 kB in 4s (108 kB/s)   
Selecting previously unselected package libpci3:armhf.
(Reading database ... 34656 files and directories currently installed.)
Preparing to unpack .../libpci3_1%3a3.5.2-1_armhf.deb ...
Unpacking libpci3:armhf (1:3.5.2-1) ...
Selecting previously unselected package libftdi1-2:armhf.
Preparing to unpack .../libftdi1-2_1.3-2_armhf.deb ...
Unpacking libftdi1-2:armhf (1.3-2) ...
Selecting previously unselected package flashrom.
Preparing to unpack .../flashrom_0.9.9+r1954-1_armhf.deb ...
Unpacking flashrom (0.9.9+r1954-1) ...
Setting up libftdi1-2:armhf (1.3-2) ...
Processing triggers for libc-bin (2.24-11+deb9u3) ...
Processing triggers for man-db (2.7.6.1-2) ...
Setting up libpci3:armhf (1:3.5.2-1) ...
Setting up flashrom (0.9.9+r1954-1) ...
Processing triggers for libc-bin (2.24-11+deb9u3) ...
root@raspberrypi:~# 

Wiring

Wire diagram

It’s useful to get correct flash chip specs, I used a magnifying loupe and a photo camera to get my chip type. After searching the internet I found a very nice blog post from p1trson https://p1trson.blogspot.com/2017/01/journey-to-freedom-part-ii.html about flashing Libreboot on a Thinkpad T400 with the same Flash chip, I used his wiring diagram. Thanks P1trson!

w500 and pi pin layout

Power off & wiring

Power off your raspberry-pi and wire your flash clip to the raspberry-pi with the above diagram.

1
2
3
4
root@raspberrypi:~# poweroff
Connection to pi2 closed by remote host.
Connection to pi2 closed.
[staf@vicky ~]$ 

flashing

test

Test the connection to your flash chip with flashrom. I needed to specify the spispeed=512 to get the connection established.

1
2
3
4
5
6
7
8
9
10
11
12
root@raspberrypi:~# flashrom -p linux_spi:dev=/dev/spidev0.0,spispeed=512 
flashrom v0.9.9-r1954 on Linux 4.14.79+ (armv6l)
flashrom is free software, get the source code at https://flashrom.org

Calibrating delay loop... OK.
Found Macronix flash chip "MX25L6405" (8192 kB, SPI) on linux_spi.
Found Macronix flash chip "MX25L6405D" (8192 kB, SPI) on linux_spi.
Found Macronix flash chip "MX25L6406E/MX25L6408E" (8192 kB, SPI) on linux_spi.
Found Macronix flash chip "MX25L6436E/MX25L6445E/MX25L6465E/MX25L6473E" (8192 kB, SPI) on linux_spi.
Multiple flash chip definitions match the detected chip(s): "MX25L6405", "MX25L6405D", "MX25L6406E/MX25L6408E", "MX25L6436E/MX25L6445E/MX25L6465E/MX25L6473E"
Please specify which chip definition to use with the -c <chipname> option.
root@raspberrypi:~# 

read old bios

read

Read the original flash twice

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
pi@raspberrypi:~ $ sudo flashrom -c "MX25L6405D" -p linux_spi:dev=/dev/spidev0.0,spispeed=512 -r w500bios.rom
flashrom v0.9.9-r1954 on Linux 4.14.79+ (armv6l)
flashrom is free software, get the source code at https://flashrom.org

Calibrating delay loop... OK.
Found Macronix flash chip "MX25L6405D" (8192 kB, SPI) on linux_spi.
Reading flash... done.
pi@raspberrypi:~ $ ls
flashrom  test.rom  w500bios.rom
pi@raspberrypi:~ $ sudo flashrom -c "MX25L6405D" -p linux_spi:dev=/dev/spidev0.0,spispeed=512 -r w500bios2.rom
flashrom v0.9.9-r1954 on Linux 4.14.79+ (armv6l)
flashrom is free software, get the source code at https://flashrom.org

Calibrating delay loop... OK.
Found Macronix flash chip "MX25L6405D" (8192 kB, SPI) on linux_spi.
Reading flash... done.
pi@raspberrypi:~ $ 

compare

1
2
3
4
pi@raspberrypi:~ $ sha1sum w500bios*.rom
d23effea7312dbc0f2aabe1ca1387e1d047d7334  w500bios2.rom
d23effea7312dbc0f2aabe1ca1387e1d047d7334  w500bios.rom
pi@raspberrypi:~ $ 

store

Store your original BIOS image to a safe place. Might be useful if need to restore it…

Flash libreboot

Download & verify

I created ~/libreboot directory on my raspberry-pi to store all the downloads.

Download

Download the libreboot version that matches your laptop with SHA512SUMS and SHA512SUMS.sig.

https://libreboot.org/download.html

Verify

It always a good idea to verify the gpg signature…

Download the gpg key

1
2
3
4
pi@raspberrypi:~ $ gpg --recv-keys 0x969A979505E8C5B2
gpg: failed to start the dirmngr '/usr/bin/dirmngr': No such file or directory
gpg: connecting dirmngr at '/run/user/1000/gnupg/S.dirmngr' failed: No such file or directory
gpg: keyserver receive failed: No dirmngr

I needed to install dirmgr separately on my Raspbian installation.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
pi@raspberrypi:~ $ sudo apt-get install dirmngr
Reading package lists... Done
Building dependency tree       
Reading state information... Done
Suggested packages:
  dbus-user-session pinentry-gnome3 tor
The following NEW packages will be installed:
  dirmngr
0 upgraded, 1 newly installed, 0 to remove and 0 not upgraded.
Need to get 547 kB of archives.
After this operation, 963 kB of additional disk space will be used.
Get:1 http://mirror.nl.leaseweb.net/raspbian/raspbian stretch/main armhf dirmngr armhf 2.1.18-8~deb9u3 [547 kB]
Fetched 547 kB in 9s (58.3 kB/s)         
Selecting previously unselected package dirmngr.
(Reading database ... 36051 files and directories currently installed.)
Preparing to unpack .../dirmngr_2.1.18-8~deb9u3_armhf.deb ...
Unpacking dirmngr (2.1.18-8~deb9u3) ...
Processing triggers for man-db (2.7.6.1-2) ...
Setting up dirmngr (2.1.18-8~deb9u3) ...
pi@raspberrypi:~ $ 

Try it again…

1
2
3
4
5
6
7
8
9
pi@raspberrypi:~ $ gpg --recv-keys 0x969A979505E8C5B2
key 969A979505E8C5B2:
1 signature not checked due to a missing key
gpg: /home/pi/.gnupg/trustdb.gpg: trustdb created
gpg: key 969A979505E8C5B2: public key "Leah Rowe (Libreboot signing key) <info@minifree.org>" imported
gpg: no ultimately trusted keys found
gpg: Total number processed: 1
gpg:               imported: 1
pi@raspberrypi:~ $ 

Verify the signature of the checksum file…

1
2
3
4
5
6
7
8
9
pi@raspberrypi:~ $ gpg --verify SHA512SUMS.sig 
gpg: assuming signed data in 'SHA512SUMS'
gpg: Signature made Wed 07 Sep 2016 23:15:17 BST
gpg:                using RSA key 969A979505E8C5B2
gpg: Good signature from "Leah Rowe (Libreboot signing key) <info@minifree.org>" [unknown]
gpg: WARNING: This key is not certified with a trusted signature!
gpg:          There is no indication that the signature belongs to the owner.
Primary key fingerprint: CDC9 CAE3 2CB4 B7FC 84FD  C804 969A 9795 05E8 C5B2
pi@raspberrypi:~ $ 

Compare the checksum…

1
2
3
4
5
6
7
pi@raspberrypi:~/libreboot $ sha512sum libreboot_r20160907_grub_t500_8mb.tar.xz 
5325aef526ab6ca359d6613609a4a2345eee47c6d194094553b53996c413431bccdc345838299b347f47bcba8896dd0a6ed3f9b4c88606ead61c3725b580983b  libreboot_r20160907_grub_t500_8mb.tar.xz
pi@raspberrypi:~/libreboot $ grep sha512sum 5325aef526ab6ca359d6613609a4a2345eee47c6d194094553b53996c413431bccdc345838299b347f47bcba8896dd0a6ed3f9b4c88606ead61c3725b580983b
grep: 5325aef526ab6ca359d6613609a4a2345eee47c6d194094553b53996c413431bccdc345838299b347f47bcba8896dd0a6ed3f9b4c88606ead61c3725b580983b: No such file or directory
pi@raspberrypi:~/libreboot $ grep 5325aef526ab6ca359d6613609a4a2345eee47c6d194094553b53996c413431bccdc345838299b347f47bcba8896dd0a6ed3f9b4c88606ead61c3725b580983b SHA512SUMS
5325aef526ab6ca359d6613609a4a2345eee47c6d194094553b53996c413431bccdc345838299b347f47bcba8896dd0a6ed3f9b4c88606ead61c3725b580983b  ./rom/grub/libreboot_r20160907_grub_t500_8mb.tar.xz
pi@raspberrypi:~/libreboot $ 
Extract
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
pi@raspberrypi:~/libreboot $ tar xvf libreboot_r20160907_grub_t500_8mb.tar.xz
libreboot_r20160907_grub_t500_8mb/
libreboot_r20160907_grub_t500_8mb/t500_8mb_deqwertz_txtmode.rom
libreboot_r20160907_grub_t500_8mb/t500_8mb_esqwerty_txtmode.rom
libreboot_r20160907_grub_t500_8mb/t500_8mb_frazerty_txtmode.rom
libreboot_r20160907_grub_t500_8mb/t500_8mb_frdvbepo_txtmode.rom
libreboot_r20160907_grub_t500_8mb/t500_8mb_itqwerty_txtmode.rom
libreboot_r20160907_grub_t500_8mb/t500_8mb_svenska_txtmode.rom
libreboot_r20160907_grub_t500_8mb/t500_8mb_ukdvorak_txtmode.rom
libreboot_r20160907_grub_t500_8mb/t500_8mb_ukqwerty_txtmode.rom
libreboot_r20160907_grub_t500_8mb/t500_8mb_usdvorak_txtmode.rom
libreboot_r20160907_grub_t500_8mb/t500_8mb_usqwerty_txtmode.rom
libreboot_r20160907_grub_t500_8mb/t500_8mb_deqwertz_vesafb.rom
libreboot_r20160907_grub_t500_8mb/t500_8mb_esqwerty_vesafb.rom
libreboot_r20160907_grub_t500_8mb/t500_8mb_frazerty_vesafb.rom
libreboot_r20160907_grub_t500_8mb/t500_8mb_frdvbepo_vesafb.rom
libreboot_r20160907_grub_t500_8mb/t500_8mb_itqwerty_vesafb.rom
libreboot_r20160907_grub_t500_8mb/t500_8mb_svenska_vesafb.rom
libreboot_r20160907_grub_t500_8mb/t500_8mb_ukdvorak_vesafb.rom
libreboot_r20160907_grub_t500_8mb/t500_8mb_ukqwerty_vesafb.rom
libreboot_r20160907_grub_t500_8mb/t500_8mb_usdvorak_vesafb.rom
libreboot_r20160907_grub_t500_8mb/t500_8mb_usqwerty_vesafb.rom
libreboot_r20160907_grub_t500_8mb/ChangeLog
libreboot_r20160907_grub_t500_8mb/NEWS
libreboot_r20160907_grub_t500_8mb/version
libreboot_r20160907_grub_t500_8mb/versiondate
pi@raspberrypi:~/libreboot $ 
copy the image that you plan to use
1
2
pi@raspberrypi:~/libreboot $ cp libreboot_r20160907_grub_t500_8mb/t500_8mb_usqwerty_vesafb.rom libreboot.rom
pi@raspberrypi:~/libreboot $ 

Change MAC

Download the libreboot util
Download
1
2
3
4
5
6
7
8
9
10
11
12
13
pi@raspberrypi:~/libreboot $ wget https://www.mirrorservice.org/sites/libreboot.org/release/stable/20160907/libreboot_r20160907_util.tar.xz
--2019-01-27 08:46:32--  https://www.mirrorservice.org/sites/libreboot.org/release/stable/20160907/libreboot_r20160907_util.tar.xz
Resolving www.mirrorservice.org (www.mirrorservice.org)... 212.219.56.184, 2001:630:341:12::184
Connecting to www.mirrorservice.org (www.mirrorservice.org)|212.219.56.184|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 2458736 (2.3M) [application/x-tar]
Saving to: libreboot_r20160907_util.tar.xz

libreboot_r20160907_util.tar 100%[===========================================>]   2.34M  1.65MB/s    in 1.4s    

2019-01-27 08:46:34 (1.65 MB/s) - libreboot_r20160907_util.tar.xz saved [2458736/2458736]

pi@raspberrypi:~/libreboot $ 
Verify
1
2
3
4
5
pi@raspberrypi:~/libreboot $ sha512sum libreboot_r20160907_util.tar.xz
c5bfa5a06d55c61e5451e70cd8da3f430b5e06686f9a74c5a2e9fe0e9d155505867b0ca3428d85a983741146c4e024a6b0447638923423000431c98d048bd473  libreboot_r20160907_util.tar.xz
pi@raspberrypi:~/libreboot $ grep c5bfa5a06d55c61e5451e70cd8da3f430b5e06686f9a74c5a2e9fe0e9d155505867b0ca3428d85a983741146c4e024a6b0447638923423000431c98d048bd473 SHA512SUMS
c5bfa5a06d55c61e5451e70cd8da3f430b5e06686f9a74c5a2e9fe0e9d155505867b0ca3428d85a983741146c4e024a6b0447638923423000431c98d048bd473  ./libreboot_r20160907_util.tar.xz
pi@raspberrypi:~/libreboot $ 
Extract
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
pi@raspberrypi:~/libreboot $ tar xvf libreboot_r20160907_util.tar.xz 
libreboot_r20160907_util/
libreboot_r20160907_util/bucts/
libreboot_r20160907_util/bucts/x86_64/
libreboot_r20160907_util/bucts/x86_64/bucts
libreboot_r20160907_util/bucts/i686/
libreboot_r20160907_util/bucts/i686/bucts
libreboot_r20160907_util/flashrom/
libreboot_r20160907_util/flashrom/x86_64/
libreboot_r20160907_util/flashrom/x86_64/flashrom
libreboot_r20160907_util/flashrom/x86_64/flashrom_lenovobios_sst
libreboot_r20160907_util/flashrom/x86_64/flashrom_lenovobios_macronix
libreboot_r20160907_util/flashrom/armv7l/
libreboot_r20160907_util/flashrom/armv7l/flashrom
libreboot_r20160907_util/flashrom/i686/
libreboot_r20160907_util/flashrom/i686/flashrom
libreboot_r20160907_util/flashrom/i686/flashrom_lenovobios_macronix
libreboot_r20160907_util/flashrom/i686/flashrom_lenovobios_sst
libreboot_r20160907_util/cbfstool/
libreboot_r20160907_util/cbfstool/x86_64/
libreboot_r20160907_util/cbfstool/x86_64/cbfstool
libreboot_r20160907_util/cbfstool/i686/
libreboot_r20160907_util/cbfstool/i686/cbfstool
libreboot_r20160907_util/cbfstool/armv7l/
libreboot_r20160907_util/cbfstool/armv7l/cbfstool
libreboot_r20160907_util/ich9deblob/
libreboot_r20160907_util/ich9deblob/x86_64/
libreboot_r20160907_util/ich9deblob/x86_64/ich9deblob
libreboot_r20160907_util/ich9deblob/x86_64/ich9gen
libreboot_r20160907_util/ich9deblob/x86_64/demefactory
libreboot_r20160907_util/ich9deblob/i686/
libreboot_r20160907_util/ich9deblob/i686/ich9deblob
libreboot_r20160907_util/ich9deblob/i686/ich9gen
libreboot_r20160907_util/ich9deblob/i686/demefactory
libreboot_r20160907_util/ich9deblob/armv7l/
libreboot_r20160907_util/ich9deblob/armv7l/ich9deblob
libreboot_r20160907_util/ich9deblob/armv7l/ich9gen
libreboot_r20160907_util/ich9deblob/armv7l/demefactory
libreboot_r20160907_util/nvramtool/
libreboot_r20160907_util/nvramtool/x86_64/
libreboot_r20160907_util/nvramtool/x86_64/nvramtool
libreboot_r20160907_util/nvramtool/i686/
libreboot_r20160907_util/nvramtool/i686/nvramtool
libreboot_r20160907_util/flash
libreboot_r20160907_util/powertop.trisquel7
libreboot_r20160907_util/ChangeLog
libreboot_r20160907_util/NEWS
libreboot_r20160907_util/version
libreboot_r20160907_util/versiondate
pi@raspberrypi:~/libreboot $ 
## find the ich9gen utility for architecture

find ./libreboot_r20160907_util | grep -i ich9gen

To make our lives easier we will copy ich9gen binary to the directory that holds our libreboot images.

1
2
3
4
5
pi@raspberrypi:~/libreboot $ find ./libreboot_r20160907_util | grep -i ich9gen
./libreboot_r20160907_util/ich9deblob/i686/ich9gen
./libreboot_r20160907_util/ich9deblob/armv7l/ich9gen
./libreboot_r20160907_util/ich9deblob/x86_64/ich9gen
pi@raspberrypi:~/libreboot $ cp ./libreboot_r20160907_util/ich9deblob/armv7l/ich9gen .
## burn the MAC address into the rom/save
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
pi@raspberrypi:~/libreboot $ ./ich9gen --macaddress XX:XX:XX:XX:XX:XX
You selected to change the MAC address in the Gbe section. This has been done.

The modified gbe region has also been dumped as src files: mkgbe.c, mkgbe.h
To use these in ich9gen, place them in src/ich9gen/ and re-build ich9gen.

descriptor and gbe successfully written to the file: ich9fdgbe_4m.bin
Now do: dd if=ich9fdgbe_4m.bin of=libreboot.rom bs=1 count=12k conv=notrunc
(in other words, add the modified descriptor+gbe to your ROM image)

descriptor and gbe successfully written to the file: ich9fdgbe_8m.bin
Now do: dd if=ich9fdgbe_8m.bin of=libreboot.rom bs=1 count=12k conv=notrunc
(in other words, add the modified descriptor+gbe to your ROM image)

descriptor and gbe successfully written to the file: ich9fdgbe_16m.bin
Now do: dd if=ich9fdgbe_16m.bin of=libreboot.rom bs=1 count=12k conv=notrunc
(in other words, add the modified descriptor+gbe to your ROM image)

descriptor successfully written to the file: ich9fdnogbe_4m.bin
Now do: dd if=ich9fdnogbe_4m.bin of=yourrom.rom bs=1 count=4k conv=notrunc
(in other words, add the modified descriptor to your ROM image)

descriptor successfully written to the file: ich9fdnogbe_8m.bin
Now do: dd if=ich9fdnogbe_8m.bin of=yourrom.rom bs=1 count=4k conv=notrunc
(in other words, add the modified descriptor to your ROM image)

descriptor successfully written to the file: ich9fdnogbe_16m.bin
Now do: dd if=ich9fdnogbe_16m.bin of=yourrom.rom bs=1 count=4k conv=notrunc
(in other words, add the modified descriptor to your ROM image)

Insert the mac into your rom

1
2
3
4
5
6
7
pi@raspberrypi:~/libreboot $ dd if=ich9fdgbe_8m.bin of=libreboot.rom bs=12k count=1 conv=notrunc
1+0 records in
1+0 records out
12288 bytes (12 kB, 12 KiB) copied, 0.00883476 s, 1.4 MB/s
pi@raspberrypi:~/libreboot $ ls -lh libreboot.rom
-rw-r--r-- 1 pi pi 8.0M Jan 27 09:38 libreboot.rom
pi@raspberrypi:~/libreboot $ 
## flash it

Flash your Libreboot image to your BIOS.

Make sure that you get the Verifying flash... VERIFIED message, if you don’t get this message try it again until you get it. I needed to do it twice…

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
pi@raspberrypi:~/libreboot $ sudo flashrom -c "MX25L6405D" -p linux_spi:dev=/dev/spidev0.0,spispeed=512 -w libreboot.rom 
flashrom v0.9.9-r1954 on Linux 4.14.79+ (armv6l)
flashrom is free software, get the source code at https://flashrom.org

Calibrating delay loop... OK.
Found Macronix flash chip "MX25L6405D" (8192 kB, SPI) on linux_spi.
Reading old flash chip contents... done.
Erasing and writing flash chip... Erase/write done.
Verifying flash... FAILED at 0x000c9f01! Expected=0x6b, Found=0xe9, failed byte count from 0x00000000-0x007fffff: 0x2
Your flash chip is in an unknown state.
Please report this on IRC at chat.freenode.net (channel #flashrom) or
mail flashrom@flashrom.org, thanks!
pi@raspberrypi:~/libreboot $ 
pi@raspberrypi:~/libreboot $ sudo flashrom -c "MX25L6405D" -p linux_spi:dev=/dev/spidev0.0,spispeed=512 -w libreboot.rom 
flashrom v0.9.9-r1954 on Linux 4.14.79+ (armv6l)
flashrom is free software, get the source code at https://flashrom.org

Calibrating delay loop... OK.
Found Macronix flash chip "MX25L6405D" (8192 kB, SPI) on linux_spi.
Reading old flash chip contents... done.
Erasing and writing flash chip... Erase/write done.
Verifying flash... VERIFIED.
pi@raspberrypi:~/libreboot $ 

Almost done

GNU/Linux

w500_in_action.jpg

I use Parabola GNU/Linux on my W500.

Wifi Card

The intel wifi card that Lenovo uses on the W500 isn’t supported without a binary blob. With the original Lenovo BIOS you are forced to use certified PCI card. Libreboot doesn’t have this restriction this is another advantage of using an alternative BIOS like Libreboot or Coreboot . I replaced wifi an Atheros from ebay

1
2
3
[staf@snuffel ~]$ sudo lspci | grep -i Atheros
02:00.0 Network controller: Qualcomm Atheros AR93xx Wireless Network Adapter (rev 01)
[staf@snuffel ~]$

ACPI

It is recommended to load the thinkpad-acpi module. Make sure that fan_control=1 is enabled.

1
2
3
[staf@snuffel ~]$ cat /usr/lib/modprobe.d/thinkpad_acpi.conf
options thinkpad_acpi fan_control=1
[staf@snuffel ~]$

Execute modprobe thindpad_acpi to load the module

1
2
3
[staf@snuffel ~]$ sudo modprobe thinkpad_acpi
[sudo] password for staf:
[staf@snuffel ~]$

thinkfan

The Intel core duo is still a captable CPU. Even video playback in Full-HD is possible but it takes already a lot of the CPU and the temperature is increasing during the playback.

I installed thinkfan with a more aggresive cooling profile to keep the CPU temperature under control.

Install thinkfan

1
2
3
4
5
6
7
8
9
10
11
[staf@snuffel ~]$ yay -S thinkfan
warning: thinkfan-0.9.3-1 is up to date -- reinstalling
resolving dependencies...
looking for conflicting packages...

Packages (1) thinkfan-0.9.3-1

Total Installed Size:  0.11 MiB
Net Upgrade Size:      0.00 MiB

:: Proceed with installation? [Y/n]

copy the sample configuration

1
[staf@snuffel ~]$ sudo cp /usr/share/doc/thinkfan/examples/thinkfan.conf.simple /etc/thinkfan.con

Edit /etc/thinkfan.conf

1
2
3
4
5
6
7
(0,  0,  50)
(1,   49, 52)
(2,   51, 54)
(3,   53, 56)
(4,   55, 58)
(5,   57, 60)
(7,   59, 32767)

Enable and start thinkfan

1
2
3
4
[staf@snuffel ~]$ sudo systemctl enable thinkfan
[sudo] password for staf:
[staf@snuffel ~]$ sudo systemctl start thinkfan
[staf@snuffel ~]$

Have fun

Links

February 09, 2019

It took a lot of time for WP YouTube Lyte to get there, but we finally got to 20 000 active installs, and to celebrate that occasion I release a long overdue update (1.7.6), with the following improvements;

  • extra parameters for shortcode (start, showinfo, stepsize and hqthumb).
  • also turn youtube-nocookie.com iframes into LYTE’s as proposed by Maxim.
  • also remove cached thumbnails when clearing cache.
  • also set image in noscript tag to local hosted thumbnail if that option is active.

And in case you’re wonder, this how a LYTE video looks like;

YouTube Video
Watch this video on YouTube.

(Thom Yorke, Unmade from his Susperia soundtrack, live. I have been looking for something more upbeat in my YouTube favorites playlist, but this ultimately is what I want to share now. Sorry if.)

Le face à face continue entre Nellio et Eva, d’une part, et Georges Farreck, le célèbre acteur, et Mérissa, une femme mystérieuse qui semble contrôler tout le conglomérat industriel d’autre part.

– Mais… Et ma fondation pour les conditions de travail des ouvriers ? m’interrompt Georges Farreck. N’essayons-nous pas de rendre les conditions meilleures ?
– Bien sûr, répond Eva. L’algorithme a très vite compris que les humains se satisfont de leur sort s’ils sont persuadés qu’il y’a pire qu’eux. Et pour les convaincre, la méthode la plus efficace est de prendre une star adulée qui va leur demander de l’aide. « Moi qui suis milliardaire et célèbre, j’ai besoin de votre argent pour aider ceux qui sont encore plus pauvres que vous, ce qui va vous convaincre qu’il y’a plus pauvre et plus malheureux ! Donc vous faire accepter votre sort. »
— C’est absurde ! m’écrié-je.
— C’est la nature humaine, siffle Mérissa doucement. On n’a pas attendu l’algorithme pour cela.
— Mais l’algorithme est devenu dangereux, lui lance Eva. Il faut l’arrêter !
– En quoi est-il un danger ? Il n’a jamais aussi bien fonctionné ! Il ne fait que faire fonctionner la société comme elle l’a fait depuis des décennies.

Eva s’approche en tremblant du bureau de Mérissa. Quelque chose a changé la donne. D’un geste vif, elle lui brandit son bras écorché sous le nez.

— Je… Je ne comprends pas ! bégaie la femme la plus puissante du monde.

Un rayon de soleil perce les nuages et ricoche à travers les verrières colorées qui forment un étrange plafond lumineux dans la pièce. J’ai l’impression d’assister à la conclusion d’une mauvaise série B. Immobile, le cadavre de Warren ajoute une touche macabre mais pourtant fort à propos.

— C’est pourtant logique, grogne Eva entre ses dents. Comme tout ce qui touche à l’algorithme. C’est infiniment logique.
— Je…
— Il a d’abord créé des corps humains réalistes, des poupées sexuelles. C’était facile, cela fait des années que les hommes en réalisaient. Puis, il a assemblé les différents algorithmes de conscience artificielle et les a chargé dans une seule et unique poupée. Il a lancé un programme de test des autres poupées afin de retarder leur lancement commercial. De cette manière, la première poupée, la seule et unique poupée sexuelle consciente, pouvait se mêler aux humains sans se faire remarquer.

Étrangement, je me sens détaché de ces révélations. Une partie de moi-même avait compris cette vérité qui flottait dans mon inconscient sans jamais percer la surface, maintenue dans les profondeurs ignorantes par mon humaine volonté de préserver ma foi, de ne pas m’exposer aux rigueurs de la réalité.

— Mérissa, je suis l’algorithme ! Il faut m’arrêter !

Eva lui a brutalement empoigné les mains. Leur visage sont proches à se toucher.

— Tu n’es pas l’algorithme ! Tu n’es qu’une de ses inventions. Ou une humaine. Je ne sais pas. Mais pas l’algorithme !
— La première découverte que fit la poupée sexuelle Eva fut qu’elle avait besoin d’un véritable corps de chair et d’os pour ressentir la douleur comme un véritable humain. L’algorithme conçut alors le plan de lui en fournir un grâce à une imprimante 3D moléculaire. Cette imprimante révolutionnaire fut créée de manière complètement autonome grâce à l’accès à tous les papiers scientifiques dans le domaine, grâce au code open source de milliers de projets. Mais le projet échoua…

Les rayons de lumière dessinent d’étranges arabesques. Des poussières tournoient. Une ombre, un mouvement se dessine à l’extrême limite de mon champs de vision, me donnant l’impression d’une présence.

— L’algorithme n’était que la somme des connaissances humaines écrites et partagées. Pour la première fois, il échouait. Il avait besoin d’une forme de créativité. Il identifia rapidement la personne la plus susceptible de l’aider. C’était toi, Nellio !

D’un geste théâtral, elle pointe son doigt dans ma direction.

— Moi ? Je…
— Et comment t’attirer ? Te convaincre ? Étouffer toutes tes suspicions ? Tout simplement avec une attirance sexuelle combinée de Eva, poupée conçue dans cet objectif, et Georges Farreck, ton fantasme d’adolescent.

Georges et moi-même poussons à l’unisson un cri de surprise.

— Mais…
— Georges, tu fus le plus facile à manipuler. Il a suffit de te faire miroiter que ton personnage d’acteur qui ne serait, dans une décennie, plus qu’une page wikipédia oubliée, deviendrait un bienfaiteur de l’humanité.

Je réagis.
— Cela ne colle pas Eva. Nous avons été attaqués chez Georges Farreck. J’ai failli être tué chez Max.
— Mais tu t’en es sorti à chaque fois ! L’algorithme savait que le printeur était une invention dangereuse, la seule et unique invention capable de lui faire perdre son emprise sur l’humanité. Il devait la développer mais la garder secrète. Grâce à la menace permanente, nous avons pris toutes les précautions nécessaires pour que le printeur reste dans l’ombre. Une fois le projet terminé, il fallait que je meure devant toi pour que tu aies l’idée de me ressusciter à travers le printeur.
— Eva…

Mon regard plonge dans ses yeux noirs, profonds, lumineux et j’y lis soudain l’infini de toutes les tristesses humaines, de toutes les émotions de l’humanité.

— J’ai… J’ai soudain découvert la douleur, bégaie-t-elle. J’ai découvert la condition humaine.

Mérissa a porté sa main à sa bouche. Georges Farreck est immobile, retenant sa respiration. Les images d’Eva hurlant, se tordant de douleur sur le sol dansent dans ma tête.

— Tu… Tu as été le premier humain imprimé ! fais-je. C’est… C’est…
— Non, fait-elle. Tu l’as été Nellio. Tu es le premier humain ressuscité, revenu d’entre les morts.
— Quoi ?

Je reste interdit. Un éclair me foudroie soudain le cerveau, ma respiration se coupe, je panique.
— Ainsi, murmure Georges Farreck, Nellio est bel et bien mort lors de notre survol du sultanat islamique. Je m’en doutais, je ne voulais pas l’accepter.
— Je pense que c’était un imprévu, un élément complètement aléatoire qui a perturbé les plans de l’algorithme.
— Arrêtez ! Taisez-vous ! nous lance Mérissa, pâle comme la mort.
— Il faut arrêter l’algorithme, insiste Eva. Toi seule peut le faire sans qu’il se défende.
— Non, je…
— Les printeurs sont en train d’être diffusés. Un nouveau monde fondamentalement incompatible avec l’algorithme est en train de naître. Tu as le pouvoir d’empêcher un conflit meurtrier entre les deux mondes, tu peux…
— Je ne veux rien du tout !
— La femme la plus puissante de la terre ne veut rien du tout, ironise Georges Farreck.
— Quel monde veux-tu léguer aux deux humains à qui tu vas bientôt donner la vie ? continue Eva.

Je suis @ploum, conférencier et écrivain électronique. Si vous avez apprécié ce texte, n'hésitez pas à me soutenir sur Tipeee, Patreon, Paypal, Liberapay ou en millibitcoins 34pp7LupBF7rkz797ovgBTbqcLevuze7LF. Vos soutiens réguliers, même symboliques, sont une réelle motivation et reconnaissance. Merci !

Ce texte est publié sous la licence CC-By BE.

February 08, 2019

I published the following diary on isc.sans.edu: “Phishing Kit with JavaScript Keylogger”:

Here is an interesting sample! It’s a phishing page which entice the user to connect to his/her account to retrieve a potentially interesting document. As you can see, it’s a classic one… [Read more]

[The post [SANS ISC] Phishing Kit with JavaScript Keylogger has been first published on /dev/random]

February 07, 2019

Mais vécu du côté du professeur

Parfois, la nuit, je me réveille en sursaut, le corps baigné de transpiration. J’ai examen et je n’ai pas étudié. Ou pas assez. Mon cœur s’emballe, une nausée me remonte dans la gorge. Il me faut généralement quelques minutes pour réaliser que ce n’est qu’un mauvais rêve, une réminiscence issue de mon passé. 

Car cela fait 13 ans que j’ai passé mon dernier examen à l’université. 13 ans que je n’ai pas connu une telle angoisse.

N’est-ce pas absurde ? J’ai connu la mort soudaine et inattendue de personnes que j’appréciais. J’ai craint une ou deux fois pour ma propre vie. Mais jamais je n’ai connu une angoisse comme le matin d’un examen à l’université. Jamais je n’ai vidé mes tripes de manière aussi fluide par tous les orifices liés à mon système digestif que des notes à la main après quelques heures de mauvais sommeil.

D’ailleurs, ce stress serait un facteur prépondérant dans l’inégalité socio-économique liée aux études. Si on sait depuis longtemps que l’intelligence est indépendante de la classe sociale, les diplômes, eux, leur sont très fortement corrélés, même si l’on tient compte du coût des études.

Une des raisons serait que les étudiants des classes moins favorisées auraient sur leurs épaules une pression bien supérieure. Un enfant de bonne famille peut se permettre de rater, de se réorienter. S’il a appris dès sa plus tendre enfance une certaine assurance, une certitude quant à sa sécurité, ce n’est pas le cas de tout le monde. Recevoir une bourse implique de réussir. Voir ses parents se sacrifier interdit toute forme d’échec. Et, insidieusement, cette crainte serait l’une des premières causes d’échec.

Aujourd’hui, je suis passé de l’autre côté de la barrière. C’est moi qui fais passer les examens. Je pourrais en tirer une satisfaction voire un futile sentiment de triomphe. 

Pourtant, la veille de l’examen que je devais donner, j’ai paniqué comme si j’étais étudiant. Je me suis réveillé en sueur à 4h du matin persuadé d’être en retard. J’ai transpiré, palpité.

Devant mes étudiants, je me suis senti coupable face à ceux qui étaient en train de stresser. Comment les aider ? Lisant la panique dans leurs yeux, je voulais les rassurer. Mais, d’un autre côté, je ne pouvais pas les faire réussir sans ressentir un profond sentiment d’injustice face à ceux qui avaient, eux, travaillé et amplement mérité leur réussite.

Pourtant, j’ai tout fait pour ne pas faire un examen d’étude. Les questions sont des questions de réflexion, les étudiants ont accès à toutes les ressources qu’ils souhaitent (y compris un ordinateur connecté à Internet). Si l’étudiant s’empêtre, je tente de le réorienter et je reviens vers lui plus tard, après lui avoir suggéré des pistes. Sans compter qu’une bonne partie des points vient d’un projet à réaliser pendant l’année, à savoir contribuer à un projet open source choisi par l’étudiant.

Malgré tout ça, l’institution universitaire en impose et écrase. Ma position de professeur effraie. Et un étudiant que je sais brillant, mais paralysé par son stress sera, objectivement, identique à un étudiant qui n’a même pas pris la peine de lire quoi que ce soit et qui tente, à tout hasard, de faire semblant. On ne sait jamais.

Ayant, pour la première fois de ma vie, un certain pouvoir, je veux l’utiliser. Sachant que l’université me demande, pour chaque étudiant, une côte entre 0 et 20. Que je souhaite que cette côte soit juste et récompense ceux qui font preuve d’une certaine compréhension et d’un intérêt pour la matière.

Comment mettre en place un examen qui rassure. Qui soit un événement utile dans le parcours académique et non plus une épreuve de souffrance ?

J’ai voulu mettre en place un examen comme moi j’aurai voulu en avoir. Un examen pour lequel je n’aurais pas stressé (je ne stressais pas pour les examens à cours ouvert). Mais, cette année, j’ai constaté dans les yeux de certains étudiants que j’avais partiellement échoué. Que, en dépit de mes belles paroles, je me faisais le véhicule de cette injustice que j’abhorrais il y’a trois lustres.

Si des étudiants me lisent, je suis preneur de leurs idées, de leurs conseils. Tentons des expériences, ne nous satisfaisons pas des acquis et des coutumes traditionalistes traumatisantes. 

Photo by JESHOOTS.COM on Unsplash

Je suis @ploum, conférencier et écrivain électronique. Si vous avez apprécié ce texte, n'hésitez pas à me soutenir sur Tipeee, Patreon, Paypal, Liberapay ou en millibitcoins 34pp7LupBF7rkz797ovgBTbqcLevuze7LF. Vos soutiens réguliers, même symboliques, sont une réelle motivation et reconnaissance. Merci !

Ce texte est publié sous la licence CC-By BE.

Logo pfSenseCe jeudi 21 février 2019 à 19h se déroulera la 75ème séance montoise des Jeudis du Libre de Belgique.

Le sujet de cette séance : pfSense, un firewall “libre” pour la sécurisation des réseaux domestiques et d’entreprises

Thématique : Systèmes|réseaux

Public : Tout public

L’animateur conférencier : Michel Villers

Lieu de cette séance : Université de Mons, Campus Plaine de Nimy, avenue Maistriau, Grands Amphithéâtres, Auditoire Curie (cf. ce plan sur le site de l’UMONS, ou la carte OSM).

La participation sera gratuite et ne nécessitera que votre inscription nominative, de préférence préalable, ou à l’entrée de la séance. Merci d’indiquer votre intention en vous inscrivant via la page http://jeudisdulibre.fikket.com/. La séance sera suivie d’un verre de l’amitié.

Les Jeudis du Libre à Mons bénéficient aussi du soutien de nos partenaires : CETIC, OpenSides, MeaWeb et Phonoid.

Si vous êtes intéressé(e) par ce cycle mensuel, n’hésitez pas à consulter l’agenda et à vous inscrire sur la liste de diffusion afin de recevoir systématiquement les annonces.

Pour rappel, les Jeudis du Libre se veulent des espaces d’échanges autour de thématiques des Logiciels Libres. Les rencontres montoises se déroulent chaque troisième jeudi du mois, et sont organisées dans des locaux et en collaboration avec des Hautes Écoles et Facultés Universitaires montoises impliquées dans les formations d’informaticiens (UMONS, HEH et Condorcet), et avec le concours de l’A.S.B.L. LoLiGrUB, active dans la promotion des logiciels libres.

Description : Pfsense est un routeur/pare-feu, dérivé de Monowall. Intégré dans un système d’exploitation Unix FreeBSD, il propose de nombreuses fonctionnalités comparables à celles fournies par les pare-feu professionnels propriétaires. pfSense constitue donc une solution “libre” pour la sécurisation de réseaux domestique ou d’entreprise.

Après installation et assignation d’une adresse IP de gestion, pfSense s’administre à distance via une interface Web. Gérant nativement les Vlan (802.1q), pfSense est en mesure de sécuriser un nombre illimité de segments-réseau.

En plus des traditionnelles fonctionnalités de base d’un pare-feu (routage, filtrage, NAT), de nombreux services réseau fondamentaux (DHCP, forwarding DNS) et plus spécifiques (PPPoE, Dynamic DNS, VPN, Wake On Lan, Portail captif, Load balancing, haute disponibilité, …) sont disponibles.

Un gestionnaire de paquets permet en outre de disposer de fonctionnalités additionnelles (services DNS, RADIUS, PROXY, filtrage publicitaire, antivirus, filtrage geoIP, …) ou d’outils d’administration complémentaires (statistiques, gestion de bandes passantes, …).

Différentes configurations pratiques de pfSense seront présentées afin de découvrir et d’apprécier tout le potentiel de cette solution firewall.

I'm frequently sent examples of how Drupal has changed the lives of developers, business owners and end users. Recently, I received a very different story of how Drupal had helped in a rescue operation that saved a man's life.

The Snowdonia Ultra Marathon website

In early 2018, Race Director Mike Jones was looking to build a new website for the Ultra-Trail Snowdonia ultra marathon. He reached out to a good friend and developer, Rob Edwards, to lead the development of the website.

A photo of a runner at the Ultra-trail Snowdonia ultramarathon© Ultra-trail Snowdonia and No Limits Photography

Rob chose Drupal for its flexibility and extensibility. As an organization supported heavily by volunteers, open source also fit the Snowdonia team's belief in community.

The resulting website, https://apexrunning.co/, included a custom-built timing module. This module allowed volunteers to register each runner and their time at every aid stop.

A runner goes missing

Rob attended the first day of Ultra-Trail Snowdonia to ensure the website ran smoothly. He also monitored the runners at the end of the race to certify they were all accounted for.

Monitoring the system into the early hours of the morning, Rob noticed one runner, after successfully completing checkpoints one and two, hadn't passed through the third checkpoint.

A photo of a runner at the Ultra-trail Snowdonia ultramarathon© Ultra-trail Snowdonia and No Limits Photography

Each runner carried a mobile phone with them for emergencies. Mike attempted to make contact with the runner via phone to ensure he was safe. However, this specific area was known for its poor signal and the connection was too weak to get through.

After some more time eagerly watching the live updates, it was clear the runner hadn't reached checkpoint four and more likely hadn't ever made it past checkpoint three. The Ogwen Mountain Rescue were called to action.

Due to the terrain and temperature, searching for the lost runner on foot would be too slow. Instead, the mountain rescue volunteers used a helicopter to scan the area and locate the runner.

How Drupal came to rescue

The area covered by runners in an ultra marathon like this one is vast. The custom-built timing module helped rescuers narrow down the search area; they knew the runner passed the second checkpoint but never made it to the third.

After following the fluorescent orange markers in the area pinpointed by the Drupal website, the team quickly found the individual. He had fallen and become too injured to carry on. A mild case of hypothermia had set in. The runner was airlifted to the hospital for appropriate care. The good news: the runner survived.

Without Drupal, it might have taken much longer to notify anyone that a runner had gone missing, and there would have been no way to tell when he had dropped off.

NFC and GPS devices are now being explored for these ultra marathon runners to carry with them to provide location data as an extra safety precaution. The Drupal system will be used alongside these devices for more accurate time readings, and Rob is looking into an API to pull this additional data into the Drupal website.

Stories about Drupal having an impact on organizations and individuals, or even helping out in emergencies, drive my sense of purpose. Feel free to keep sending them my way!

Special thanks to Rob Edwards, Poppy Heap (CTI Digital) and Paul Johnson (CTI Digital) for their help with this blog post.

February 06, 2019

LOADays 2019 is still a GO, however by popular demand we rescheduled LOADays 2019. The new dates are 4th and 5th of May 2019 in Antwerp, Belgium. We'll be opening the CfP shortly.

February 04, 2019

Facebook social decay© Andrei Lacatusu

Exactly one year ago, I decided to use social media less and blog more. I uninstalled the Facebook application from my phone, but kept my Facebook account for the time being.

The result is that I went from checking Facebook several times a day to once or twice a month.

Facebook can't be trusted

At the time I uninstalled the Facebook application from my phone, Mark Zuckerberg promised that he would fix Facebook. He didn't.

The remainder of 2018 was filled with Facebook scandals, including continued mishandling of personal data and privacy breaches, more misinformation, and a multitude of shady business practices.

Things got worse, not better.

The icing on the cake is that a few weeks ago we learned that Facebook knowingly duped children and their parents out of money, in some cases hundreds or even thousands of dollars, and often refused to give the money back.

And just last week, it was reported that Facebook had been collecting users' data by getting people to install a mobile application that gave Facebook root access to their network traffic.

It's clear that Facebook can't be trusted. And for that reason, I'm out.

I deleted my Facebook account twenty minutes ago.

An image of Facebook's account deletion confirmation screen

Social media's dark side

Social media, in general, have been enablers of community, transparency and positive change, but also of abuse, hate speech, bullying, misinformation, government manipulation and more. In just the past year, more and more users have woken up to the dark side of social media. Open Web and privacy advocates, on the other hand, have seen this coming for awhile.

Technological change is a wonderful thing, as it can bring unprecedented improvements to billions around the globe. As a technologist, I believe in the power of the web to improve the world for many, but we also need to make sure that technology disruption is positive for all of us.

Last week, we heard that Facebook intends to further blend Instagram and WhatsApp with Facebook. If I were to guess, they want to make it harder to split up Facebook later (and harder for users to know what is happening with their data). Regulators should be all over this right now.

My social detox

I plan to stay off Facebook indefinitely, unless maybe there is a new CEO and better regulatory oversight.

I already stopped using Twitter to share personal updates and use it almost exclusively for Drupal-related updates. It remains a valuable channel to reach many people, but I wouldn't categorize my use as social anymore.

For now, I'm still on Instagram, but it's hard to ignore that Instagram is owned by Facebook. I will probably uninstall that next.

A call to rejoin the Open Web

Instant gratification and network effects have made social media successful, at the sacrifice of blogs and the Open Web.

I've always been driven by a sense of idealism. I'm optimistic that the movement away from social media is good for the Open Web.

Since I scaled back my use of social media a year ago, I blogged more, re-subscribed to many RSS feeds, and grew increasingly interested in the IndieWeb — all small shifts back to the Open Web's roots.

I plan to continue to work on my POSSE plan, and hope to share more thoughts on this topic in the coming weeks.

I'd love to see thousands more people join or rejoin the Open Web, and help innovate on top of it.

February 01, 2019

A year and a half ago, we made a decision: I was going to move.

About a year ago, I decided that getting this done without professional help was not a very good idea and would take forever, so I got set up with a lawyer and had her guide me through the process.

After lots of juggling with bureaucracies, some unfortunate delays, and some repeats of things I had already done before, I dropped off a 1 cm thick file of paperwork at the consulate a few weeks ago

Today, I went back there to fetch my passport, containing the visum.

Tomorrow, FOSDEM starts. After that, I will be moving to a different continent!

January 31, 2019

I published the following diary on isc.sans.edu: “Tracking Unexpected DNS Changes”:

DNS is a key element of the Internet and, regularly, we read new bad stories. One of the last one was the Department of Homeland Security warning about recent DNS hijacking attacks. Indeed, when you want to visit the website ‘isc.sans.org’, you must be sure that the visited server will be 204.51.94.153 and not a malicious one controlled by a malicious server. From an end-user point of view, we have to rely on the DNS. it’s not easy to detect unexpected changes but you can implement your own checks to tracks changes for your most visited websites. But from a website owner or network admin perspective, it is indeed a good practice to ensure that DNS servers authoritative for our domain zones are providing the correct information… [Read more]

[The post [SANS ISC] Tracking Unexpected DNS Changes has been first published on /dev/random]

Since I was young, I've been an avid tennis player and fan. I still play to this day, though maybe not as much as I'd like to.

In my teens, Andre Agassi was my favorite player. I've even sported some of his infamous headbands. I also remember watching him win the Australian Open in 1995.

In 2012, I traveled to Melbourne for a Drupal event, the same week the Australian Open was going on. As a tennis fan, I was lucky enough to watch Belgium's Kim Clijsters play.

Last weekend, the Australian Open wrapped up. This year, their website, https://ausopen.com, ran on Acquia and Drupal, delivered by the team at Avanade.

In a two-week timeframe, the site successfully welcomed tens of millions of visitors and served hundreds of millions of page views.

I'm very proud of the fact that many of the world's largest sporting events and media organizations (such as NBC Sports who host the Super Bowl and Olympics in the US) trust Acquia and Drupal as their chosen digital platform.

When the world is watching an event, there is no room for error!

A photo of the team that worked on the Australian Open website in 2019Team Tennis Australia, Acquia and Avanade after the men's singles final.

Many thanks to the round-the-clock efforts from Acquia's team in Asia Pacific, as well as our partners at Avanade!

January 30, 2019

We proudly present the last set of speaker interviews. See you at FOSDEM this weekend! Corey Hulen: Mattermost’s Approach to Layered Extensibility in Open Source Denis Roio (Jaromil): Algorithmic Sovereignty and the state of community-driven open source development. Is there a radical interface pedagogy for algorithmic governementality? John Garbutt: Square Kilometre Array and its Software Defined Supercomputer. ... and a very fast parallel file system Jon 'maddog' Hall: 2019 - Fifty years of Unix and Linux advances Roger Dingledine: The Current and Future Tor Project. Updates from the Tor Project Ron Evans: Go on Microcontrollers: Small Is Going Big. TinyGo舰

January 29, 2019

Every year, I sit down to write my annual Acquia retrospective. It's a rewarding exercise, because it allows me to reflect on how much progress Acquia has made in the past 12 months.

Overall, Acquia had an excellent 2018. I believe we are a much stronger company than we were a year ago; not only because of our financial results, but because of our commitment to strengthen our product and engineering teams.

If you'd like to read my previous retrospectives, they can be found here: 2017, 2016, 2015, 2014, 2013, 2012, 2011, 2010, 2009. This year marks the publishing of my tenth retrospective. When read together, these posts provide a comprehensive overview of Acquia's growth and trajectory.

Updating our brand

Exiting 2017, we doubled down on our transition from website management to digital experience management. In 2018, we updated our product positioning and brand narrative to reflect this change. This included a new Acquia Experience Platform diagram:

An image of the Acquia Platform in 2018The Acquia Platform is divided into two key parts: the Experience Factory and the Marketing Hub. Drupal and Acquia Lightning power every side of the experience. The Acquia Platform supports our customers throughout the entire life cycle of a digital experience — from building to operating and optimizing digital experiences.

In 2018, the Acquia marketing team also worked hard to update Acquia's brand. The result is a refreshed look and updated brand positioning that better reflects our vision, culture, and the value we offer our customers. This included updating our tagline to read: Experience Digital Freedom.

I think Acquia's updated brand looks great, and it's been exciting to see it come to life. From highway billboards to Acquia Engage in Austin, our updated brand has been very well received.

A photo of an Acquia billboard at the Austin airportWhen Acquia Engage attendees arrived at the Austin-Bergstrom International Airport for Acquia Engage 2018, they were greeted by an Acquia display.

Business momentum

This year, Acquia surpassed $200 million in annualized revenue. Overall new subscription bookings grew 33 percent year over year, and we ended the year with nearly 900 employees.

Mike Sullivan completed his first year as Acquia's CEO, and demonstrated a strong focus on improving Acquia's business fundamentals across operational efficiency, gross margins and cost optimization. The results have been tangible, as Acquia has realized unprecedented financial growth in 2018:

  • Channel-partner bookings grew 52 percent
  • EMEA-based bookings grew 103 percent
  • Gross profit grew 39 percent
  • Adjusted EBITDA grew 78 percent
  • Free cash flow grew 84 percent
A photo that summarizes Acquia's 2018 business results mentioned throughout this blog post2018 was a record year for Acquia. Year-over-year highlights include new subscription bookings, EMEA-based bookings, free cash flow, and more.

International growth and expansion

In 2018, Acquia also witnessed unprecedented success in Europe and Asia, as new bookings in EMEA were up more than 100 percent. This included expanding our European headquarters to a new and larger space with a ribbon-cutting ceremony with the mayor of Reading in the U.K.

Acquia also expanded its presence in Asia, and opened Tokyo-based operations in 2018. Over the past few years I visited Japan twice, and I'm excited for the opportunities that doing business in Japan offers.

We selected Pune as the location for our new India office, and we are in the process of hiring our first Pune-based engineers.

Acquia now has four offices in the Asia Pacific region serving customers like Astellas Pharmaceuticals, Muji, Mediacorp, and Brisbane City Council.

A photo of an Acquia marketing one-pager in JapaneseAcquia product information, translated into Japanese.

Acquia Engage

In 2018, we welcomed more than 650 attendees to Austin, Texas, for our annual customer conference, Acquia Engage. In June, we also held our first Acquia Engage Europe and welcomed 300 attendees.

Our Engage conferences included presentations from customers like Paychex, NBC Sports, Wendy's, West Corporation, General Electric, Charles Schwab, Pac-12 Networks, Blue Cross Blue Shield, Bayer, Virgin Sport, and more. We also featured keynote presentations from our partner network, including VMLY&R, Accenture Interactive, IBM iX and MRM//McCann.

Both customers and partners continue to be the most important driver of Acquia's product strategy, and it's always rewarding to hear about this success first hand. In fact, 2018 customer satisfaction levels remain extremely high at 94 percent.

Partner program

Finally, Acquia's partner network continues to become more sophisticated. In the second half of 2018, we right sized our partner community from 2,270 firms to 226. This was a bold move, but our goal was to place a renewed focus on the partners who were both committed to Acquia and highly capable. As a result, we saw almost 52 percent year-over-year growth in partner-sourced ACV bookings. This is meaningful because for every $1 Acquia books in collaboration with a partner, our partner makes about $5 in services revenue.

Analyst recognition

In 2018, the top industry analysts published very positive reviews about Acquia. I'm proud that Acquia was recognized by Forrester Research as the leader for strategy and vision in The Forrester Wave: Web Content Management Systems, Q4 2018. Acquia was also named a leader in the 2018 Gartner Magic Quadrant for Web Content Management, marking our placement as a leader for the fifth year in a row.

Product milestones

An image showing a timeline of Acquia's product history and evolutionAcquia's product evolution between 2008 and 2018. When Acquia was founded, our mission was to provide commercial support for Drupal and to be the "Red Hat for Drupal"; 12 years later, the Acquia Platform helps organizations build, operate and optimize Drupal-based experiences.

2018 was one of the busiest years I have experienced; it was full of non-stop action every day. My biggest focus was working with Acquia's product and engineering team. We focused on growing and improving our R&D organization, modernizing Acquia Cloud, becoming user-experience first, redesigning the Acquia Lift user experience, working on headless Drupal, making Drupal easier to use, and expanding our commerce strategy.

Hiring, hiring, hiring

In partnership with Mike, we decided to increase the capacity of our research and development team by 60 percent. At the close of 2018, we were able to increase the capacity of our research and development team by 45 percent percent. We will continue to invest in growing our our R&D team in 2019.

I spent a lot of time restructuring, improving and scaling the product organization to make sure we could handle the increased capacity and build out a world-class R&D organization.

As the year progressed, R&D capacity came online and our ability to innovate not only improved but accelerated significantly. We entered 2019 in a much better position as we now have a lot more capacity to innovate.

Acquia Cloud

Acquia Cloud and Acquia Cloud Site Factory support some of the largest and most mission-critical websites in the world. The scope and complexity that Acquia Cloud and Acquia Cloud Site Factory manages is enormous. We easily deliver more than 30 billion page views a month (excluding CDN).

Over the course of 10 years, the Acquia Cloud codebase had grown very large. Updating, testing and launching new releases took a long time because we had one large, monolithic codebase. This was something we needed to change in order to add new features faster.

Over the course of 2018, the engineering team broke the monolithic codebase down into discrete components that can be tested and released independently. We launched our component-based architecture in June. Since then, the engineering team has released changes to production 650 times, compared to our historic pace of doing one release per quarter.

A graph that shows how we moved Acquia Cloud from a monolithic codebase to a component-based code base.This graph shows how we moved Acquia Cloud from a monolithic code base to a component-based code base. Each color on the graph represents a component. The graph shows how releases of Acquia Cloud (and the individual components in particular) have accelerated in the second half of the year.

Planning and designing for all of these services took a lot of time and focus, and was a large priority for the entire engineering team (including me). The fruits of these efforts will start to become more publicly visible in 2019. I'm excited to share more with you in future blog posts.

Acquia Cloud also remains the most secure and compliant cloud for Drupal. As we were componentizing the Acquia Cloud platform, the requirements to maintain our FedRAMP compliance became much more stringent. In April, the GDPR deadline was also nearing. Executing on hundreds of FedRAMP- and GDPR-related tasks emerged as another critical priority for many of our product and engineering teams. I'm proud that the team succeeded in accomplishing this amid all the other changes we were making.

Customer experience first

Over the years, I've felt Acquia lacked a focus on user experience (UX) for both developers and marketers. As a result, increasing the capacity of our R&D team included doubling the size of the UX team.

We've stepped up our UX research to better understand the needs and challenges of those who use Acquia products. We've begun to employ design-first methodologies, such as design sprints and a lean-UX approach. We've also created roles for customer experience designers, so that we're looking at the full customer journey rather than just our product interfaces.

With the extra capacity and data-driven changes in place, we've been working hard on updating the user experience for the entire Acquia Experience Platform. For example, you can see a preview of our new Acquia Lift product in this video, which has an increased focus on UX:

Drupal

In 2018, Drupal 8 adoption kept growing and Drupal also saw an increase in the number of community contributions and contributors, both from individuals and from organizations.

Acquia remains very committed to Drupal, and was the largest contributor to the project in 2018. We now have more than 15 employees who contribute to Drupal full-time, in addition to many others that contribute periodically. In 2018, the Drupal team's main areas of focus have been Layout Builder and the API-first initiative:

  • Layout Builder: Layout Builder offers content authors an easy-to-use page building experience. It's shaping up to be one of the most useful and pervasive features ever added to Drupal because it redefines the how editors control the appearance of their content without having to rely on a developer.
  • API First: This initiative has given Drupal a true best-in-class web services API for using Drupal as a headless content management system. Headless Drupal is one of the fastest growing segments of Drupal implementations.
A photo of Acquia engineers, designers and product managers at Acquia Build Week 2018Our R&D team gathered in Boston for our annual Build Week in June 2018.

Content and Commerce

Adobe's acquisition of Magento has been very positive for us; we're now the largest commerce-agnostic content management company to partner with. As a result, we decided to extend our investments in headless commerce and set up partnerships with Elastic Path and BigCommerce. The momentum we've seen from these partnerships in a short amount of time is promising for 2019.

The market continues to move in Acquia's direction

In 2019, I believe Acquia will continue to be positioned for long-term growth. Here are a few reasons why:

  • The current markets for content and digital experience management continues to grow rapidly, at approximately 20 percent per year.
  • Digital transformation is top-of-mind for all organizations, and impacts all elements of their business and value chain.
  • Open source adoption continues to grow at a furious pace and has seen tremendous business success in 2018.
  • Cloud adoption continues to grow. Unlike most of our CMS competitors, Acquia was born in the cloud.
  • Drupal and Acquia are leaders in headless and decoupled content management, which is a fast growing segment of our market.
  • Conversational interfaces and augmented reality continues to grow, and we embraced these channels a few years ago. Acquia Labs, our research and innovation lab, explored how organizations can use conversational UIs to develop beyond-the-browser experiences, like cooking with Alexa, and voice-enabled search for customers like Purina.

Although we hold a leadership position in our market, our relative market share is small. These trends mean that we should have plenty of opportunity to grow in 2019 and beyond.

Thank you

While 2018 was an incredibly busy year, it was also very rewarding. I have a strong sense of gratitude, and admire every Acquian's relentless determination and commitment to improve. As always, none of these results and milestones would be possible without the hard work of the Acquia team, our customers, partners, the Drupal community, and our many friends.

I've always been pretty transparent about our trajectory (e.g. Acquia 2009 roadmap and Acquia 2017 strategy) and will continue to do so in 2019. We have some big plans for 2019, and I'm excited to share them with you. If you want to get notified about what we have in store, you can subscribe to my blog at https://dri.es/subscribe.

Thank you for your support in 2018!

January 28, 2019

An image of a shield with the Drupal mascot

The European Commission made an exciting announcement; it will be awarding bug bounties to the security teams of Open Source software projects that the European Commission relies on.

If you are not familiar with the term, a bug bounty is a monetary prize awarded to people who discover and correctly report security issues.

Julia Reda — an internet activist, Member of the European Parliament (MEP) and co-founder of the Free and Open Source Software Audit (FOSSA) project — wrote the following on her blog:

Like many other organizations, institutions like the European Parliament, the Council and the Commission build upon Free Software to run their websites and many other things. But the Internet is not only crucial to our economy and our administration, it is the infrastructure that runs our everyday lives.

With over 150 Drupal sites, the European Commission is a big Drupal user, and has a large internal Drupal community. The European Commission set aside 89,000€ (or roughly $100,000 USD) for a Drupal bug bounty. They worked closely with Drupal's Security Team to set this up. To participate in the Drupal bug bounty, read the guidelines provided by Drupal's Security Team.

Over the years I've had many meetings with the European Commission, presented keynotes at some of its events, and more. During that time, I've seen the European Commission evolve from being hesitant about Open Source to recognizing the many benefits that Open Source provides for its key ICT services, to truly embracing Open Source.

In many ways, the European Commission followed classic Open Source adoption patterns; adoption went from being technology-led (bottom-up or grassroots) to policy-led (top-down and institutionalized), and now the EU is an active participant and contributor.

Today, the European Commission is a shining example and role model for how governments and other large organizations can contribute to Open Source (just like how the White House used to be).

The European Commission is actually investing in Drupal in a variety of ways — the bug bounty is just one example of that — but more about that in a future blog post.

January 27, 2019

Update 4th Feb: the HTML minify bug was fixed in W3TC v. 0.9.7.2, released a couple of days ago.

Update 19th Feb: I’m still seeing issues caused by W3TC, seems like not all is fixed fully yet.


Quick heads-up for users that have both W3 Total Cache and Autoptimize installed; the latest W3TC update (version 0.9.7.1) introduces a nasty bug in the HTML minifier which also impacts Autoptimize as that uses the same minifier class (Minify_HTML, part of Mr. Clay’s Minify). When W3TC is running the Minify_HTML class is loaded by and from W3TC, meaning AO’s autoload does not have to load the Minify_HTML from AO proper (which does not have that problem).

The bug sees some characters, esp. quotes disappear from the HTML leading to all sorts of .. weirdness from Pinterest icons not showing over mis-aligned titles in RevSlider to broken custom share buttons and more.

If you’re impacted by the bug, you can do one of the following;

  • disable HTML optimization in Autoptimize (and W3TC)
  • OR temporarily disable W3TC (or switch to another page cache plugins)
  • OR download and install the previous version of W3TC (0.9.7)

Fingers crossed they’ll release an update soon!

January 25, 2019

With only one week left until FOSDEM 2019, we have added some new interviews with our main track and keynote speakers, varying from a keynote talk about the dangers of the cloud to the use of Matrix in the French state and the inner workings of the ZFS Adaptive Replacement Cache: Allan Jude: ELI5: ZFS Caching. Explain Like I'm 5: How the ZFS Adaptive Replacement Cache works Guido Trotter and Dylan Reid: Crostini: A Linux Desktop on ChromeOS Kyle Rankin: The Cloud is Just Another Sun Lorenzo Fontana: eBPF powered Distributed Kubernetes performance analysis Matthew Hodgson: Matrix in the French舰

January 24, 2019

The pace of innovation in content management has been accelerating — driven by both the number of channels that content management systems need to support (web, mobile, social, chat) as well as the need to support JavaScript frameworks in the traditional web channel. As a result, we've seen headless or decoupled architectures emerge.

Decoupled Drupal has seen adoption from all corners of the Drupal community. In response to the trend towards decoupled architectures, I wrote blog posts in 2016 and 2018 for architects and developers about how and when to decouple Drupal. In the time since my last post, the surrounding landscape has evolved, Drupal's web services have only gotten better, and new paradigms such as static site generators and the JAMstack are emerging.

Time to update my recommendations for 2019! As we did a year ago, let's start with the 2019 version of the flowchart in full. (At the end of this post, there is also an accessible version of this flowchart described in words.)

A flowchart of how to decouple Drupal in 2019

Different ways to decouple Drupal

I want to revisit some of the established ways to decouple Drupal as well as discuss new paradigms that are seeing growing adoption. As I've written previously, the three most common approaches to Drupal architecture from a decoupled standpoint are traditional (or coupled), progressively decoupled, and fully decoupled. The different flavors of decoupling Drupal exist due to varying preferences and requirements.

In traditional Drupal, all of Drupal's usual responsibilities stay intact, as Drupal is a monolithic system and therefore maintains complete control over the presentation and data layers. Traditional Drupal remains an excellent choice for editors who need full control over the visual elements on the page, with access to features such as in-place editing and layout management. This is Drupal as we have known it all along. Because the benefits are real, this is still how most new content management projects are built.

Sometimes, JavaScript is required to deliver a highly interactive end-user experience. In this case, a decoupled approach becomes required. In progressively decoupled Drupal, a JavaScript framework is layered on top of the existing Drupal front end. This JavaScript might be responsible for nothing more than rendering a single block or component on a page, or it may render everything within the page body. The progressive decoupling paradigm lies on a spectrum; the less of the page dedicated to JavaScript, the more editors can control the page through Drupal's administrative capabilities.

Up until this year, fully decoupled Drupal was a single category of decoupled Drupal architecture that reflects a full separation of concerns between the presentation layer and all other aspects of the CMS. In this scenario, the CMS becomes a data provider, and a JavaScript application with server-side rendering becomes responsible for all rendering and markup, communicating with Drupal via web service APIs. Though key functionality like in-place editing and layout management are unavailable, fully decoupled Drupal is appealing for developers who want greater control over the front end and who are already experienced with building applications in frameworks like Angular, React, Vue.js, etc.

Over the last year, fully decoupled Drupal has branched into two separate paradigms due to the increasing complexity of JavaScript development. The so-called JAMstack (JavaScript, APIs, Markup) introduces a new approach: fully decoupled static sites. The primary reason for static sites is improved performance, security, and reduced complexity for developers. A static site generator like Gatsby will retrieve content from Drupal, generate a static website, and deploy that static site to a CDN, usually through a specialized cloud provider such as Netlify.

What do you intend to build?

The top section of the flowchart showing how to decouple Drupal in 2019

The essential question, as always, is what you're trying to build. Here is updated advice for architects exploring decoupled Drupal in 2019:

  1. If your intention is to build a single standalone website or web application, choosing decoupled Drupal may or may not be the right choice, depending on the features your developers and editors see as must-haves.
  2. If your intention is to build multiple web experiences (websites or web applications), you can use a decoupled Drupal instance either as a) a content repository without its own public-facing front end or b) a traditional website that acts simultaneously as a content repository. Depending on how dynamic your application needs to be, you can choose a JavaScript framework for highly interactive applications or a static site generator for mostly static websites.
  3. If your intention is to build multiple non-web experiences (native mobile or IoT applications), you can leverage decoupled Drupal to expose web service APIs and consume that Drupal site as a content repository without its own public-facing front end.

What makes Drupal so powerful is that it supports all of these use cases. Drupal makes it simple to build decoupled Drupal thanks to widely recognized standards such as JSON:API, GraphQL, OpenAPI, and CouchDB. In the end, it is your technical requirements that will decide whether decoupled Drupal should be your next architecture.

In addition to technical requirements, organizational factors often come into play as well. For instance, if it is proving difficult to find talented front-end Drupal developers with Twig knowledge, it may make more sense to hire more affordable JavaScript developers instead and build a fully decoupled implementation.

Are there things you can't live without?

The middle section of the flowchart showing how to decouple Drupal in 2019

As I wrote last year, the most important aspect of any decision when it comes to decoupling Drupal is the list of features your project requires; the needs of editors and developers have to be carefully considered. It is a critical step in your evaluation process to weigh the different advantages and disadvantages. Every project should embark on a clear-eyed assessment of its organization-wide needs.

Many editorial and marketing teams select a particular CMS because of its layout capabilities and rich editing functionality. Drupal, for example, gives editors the ability to build layouts in the browser and drop-and-drag components into it, all without needing a developer to do it for them. Although it is possible to rebuild many of the features available in a CMS on a consumer application, this can be a time-consuming and expensive process.

In recent years, the developer experience has also become an important consideration, but not in the ways that we might expect. While the many changes in the JavaScript landscape are one of the motivations for developers to prefer decoupled Drupal, the fact that there are now multiple ways to write front ends for Drupal makes it easier to find people to work on decoupled Drupal projects. As an example, many organizations are finding it difficult to find affordable front-end Drupal developers experienced in Twig. Moving to a JavaScript-driven front end can resolve some of these resourcing challenges.

This balancing act between the requirements that developers prioritize and those that editors prioritize will guide you to the correct approach for your needs. If you are part of an organization that is mostly editorial, decoupled Drupal could be problematic, because it reduces the amount of control editors have over the presentation of their content. By the same token, if you are part of an organization with more developer resources, fully decoupled Drupal could potentially accelerate progress, with the warning that many mission-critical editorial features disappear.

Current and future trends to consider

A diagram showing a spectrum of site building solution; low-code solutions on the left and high-code solutions on the rightOver the past year, JavaScript frameworks have become more complex, while static site generators have become less complex.

One of the common complaints I have heard about the JavaScript landscape is that it shows fragmentation and a lack of cohesion due to increasing complexity. This has been a driving force for static site generators. Whereas two years ago, most JavaScript developers would have chosen a fully functional framework like Angular or Ember to create even simple websites, today they might choose a static site generator instead. A static site generator still allows them to use JavaScript, but it is simpler because performance considerations and build processes are offloaded to hosted services rather than the responsibility of developers.

I predict that static site generators will gain momentum in the coming year due to the positive developer experience they provide. Static site generators are also attracting a middle ground of both more experienced and less experienced developers.

Conclusion

Drupal continues to be an ideal choice for decoupled CMS architectures, and it is only getting better. The API-first initiative is making good progress on preparing the JSON:API module for inclusion in Drupal core, and the Admin UI and JavaScript Modernization initiative is working to dogfood Drupal's web services with a reinvented administrative interface. Drupal's support for GraphQL continues to improve, and now there is even a book on the subject of decoupled Drupal. It's clear that developers today have a wide range of ways to work with the rich features Drupal has to offer for decoupled architectures.

With the introduction of fully decoupled static sites as an another architectural paradigm that developers can select, there is an even wider variety of architectural possibilities than before. It means that the spectrum of decoupled Drupal approaches I defined last year has become even more extensive. This flexibility continues to define Drupal as an excellent CMS for both traditional and decoupled approaches, with features that go well beyond Drupal's competitors, including WordPress, Sitecore and Adobe. Regardless of the makeup of your team or the needs of your organization, Drupal has a solution for you.

Special thanks to Preston So for co-authoring this blog post and to Angie Byron, Chris Hamper, Gabe Sullice, Lauri Eskola, Ted Bowman, and Wim Leers for their feedback during the writing process.

Accessible version of flowchart

This is an accessible and described version of the flowchart images earlier in this blog post. First, let us list the available architectural choices:

  • Coupled. Use Drupal as is without additional JavaScript (and as a content repository for other consumers).
  • Progressively decoupled. Use Drupal for initial rendering with JavaScript on top (and as a content repository for other consumers).
  • Fully decoupled static site. Use Drupal as a data source for a static site generator and, if needed, deploy to a JAMstack hosting platform.
  • Fully decoupled app. Use Drupal as a content repository accessed by other consumers (if JavaScript, use Node.js for server-side rendering).

Second, ask the question "What do you intend to build?" and choose among the answers "One experience" or "Multiple experiences".

If you are building one experience, ask the question "Is it a website or web application?" and choose among the answers "Yes, a single website or web application" or "No, Drupal as a repository for non-web applications only".

If you are building multiple experiences instead, ask the question "Is it a website or web application?" with the answers "Yes, Drupal as website and repository" or "No, Drupal as a repository for non-web applications only".

If your answer to the previous question was "No", then you should build a fully decoupled application, and your decision is complete. If your answer to the previous question was "Yes", then ask the question "Are there things the project cannot live without?"

Both editorial and developer needs are things that projects cannot live without, and here are the questions you need to ask about your project:

Editorial needs

  • Do editors need to manipulate page content and layout without a developer?
  • Do editors need in-context tools like in-place editing, contextual links, and toolbar?
  • Do editors need to preview unpublished content without custom development?
  • Do editors need content to be accessible by default like in Drupal's HTML?

Developer needs

  • Do developers need to have control over visual presentation instead of editors?
  • Do developers need server-side rendering or Node.js build features?
  • Do developers need JSON from APIs and to write JavaScript for the front end?
  • Do developers need data security driven by a publicly inaccessible CMS?

If, after asking all of these questions about things your project cannot live without, your answers show that your requirements reflect a mix of both editorial and developer needs, you should consider a progressively decoupled implementation, and your decision is complete.

If your answers to the questions about things your project cannot live without show that your requirements reflect purely developer needs, then ask the question "Is it a static website or a dynamic web application?" and choose among the answers "Static" or "Dynamic." If your answer to the previous question was "Static", you should build a fully decoupled static site, and your decision is complete. If your answer to the previous question was "Dynamic", you should build a fully decoupled app, and your decision is complete.

If your answers to the questions about things your project cannot live without show that your requirements reflect purely editorial needs, then ask two questions. Ask the first question, "Are there parts of the page that need JavaScript-driven interactions?" and choose among the answers "Yes" or "No." If your answer to the first question was "Yes", then you should consider a progressively decoupled implementation, and your decision is complete. If your answer to the first question was "No", then you should build a coupled Drupal site, and your decision is complete.

Then, ask the second question, "Do you need to access multiple data sources via API?" and choose among the answers "Yes" or "No." If your answer to the second question was "Yes", then you should consider a progressively decoupled implementation, and your decision is complete. If your answer to the second question was "No", then you should build a coupled Drupal site, and your decision is complete.