Planet Grep

Planet'ing Belgian FLOSS people

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

November 23, 2020

Plaidoyer en faveur d’un logiciel de relations épistolaires électroniques, échanges sacrifiés au culte de l’instantanéité.

J’aime l’email. Je ne me lasse pas de m’émerveiller sur la beauté de ce système qui nous permet d’échanger par écrit, de manière décentralisée. D’entretenir des relations épistolaires dématérialisées à l’abri des regards (si l’on choisit bien son fournisseur). Je l’ai déjà dit et le redis.

https://ploum.net/email-mon-amour/.

Pourtant, l’indispensable email est régulièrement regardé de haut. Personne n’aime l’email. Il est technique, laborieux. Il est encombré de messages. Alors toute nouvelle plateforme nous attire, nous donne l’impression de pouvoir communiquer plus simplement qu’avec l’email.

Beaucoup trop d’utilisateurs sont noyés dans leurs emails. Ils postposent une réponse avant que celle-ci ne soit noyée dans un flux incessant de sollicitation. Entrainant, effet pervers, une insistance de l’expéditeur.

Désabusé, la tentation est grande de se tourner vers cette nouvelle plateforme aguichante. Tout semble plus simple. Il y’a moins de messages, ils sont plus clairs. La raison est toute simple : la plateforme est nouvelle, les échanges entre les utilisateurs sont peu nombreux. Dès le moment où cette plateforme sera devenue particulièrement populaire, votre boîte à messages se retrouvera noyée tout comme votre boîte à email. Tout au plus certaines plateformes s’évertuent à transformer vos boîtes en flux, de manière à vous retirer de la culpabilité, mais entrainant une perte d’informations encore plus importante.

https://ploum.net/comment-jai-fui-le-flux-pour-retrouver-ma-boite/

C’est pour cela que l’email est magnifique. Après des décennies, il est toujours aussi utile, aussi indispensable. Nous pouvons imaginer un futur sans Google, un futur sans Facebook. Mais un futur sans email ?

L’email pourrait être merveilleux. Mais aucun client mail ne donne envie d’écrire des mails.

Je rêve d’un client mail qui serait un véritable logiciel d’écriture. Pas d’options et de fioriture. Pas de code HTML. Écrire un email comme on écrit une lettre. En mettant l’adresse du destinataire en dernier, comme on le fait pour une enveloppe.

Un logiciel d’écriture d’email qui nous aiderait à retrouver un contact avec sa correspondance plutôt qu’à permettre l’accomplissement d’une tâche mécanique. Un logiciel qui nous encouragerait à nous désabonner de tout ce qui n’est pas sollicité, qui marquerait des mails les correspondances en attente d’une réponse. Qui nous encouragerait à archiver un mail où à le marquer comme nécessitant une action plutôt qu’à le laisser moisir dans notre boîte aux lettres.

Bref, je rêve d’un client mail qui me redonne le plaisir d’interagir avec des personnes, pas avec des fils de discussions ou des onomatopées.

D’un autre côté, j’abhorre ces tentatives de classement automatique qui fleurissent, par exemple sur Gmail. Outre qu’elles augmentent le pouvoir de ces algorithmes, elles ne font que cacher le problème sans tenter d’y remédier. Si les mails doivent être triés comme « promotions » ou « notifications », c’est la plupart du temps que je n’avais pas besoin de les voir en premier lieu. Que ces emails n’auraient jamais dû être envoyés.

Enfin, un véritable logiciel de correspondance devrait abandonner cette notion de notification et de temps réel. Une fois par jour, comme le passage du facteur, les courriels seraient relevés, m’indiquant clairement mes interactions pour la journée.

De même, mes mails rédigés ne seraient pas envoyés avant une heure fixe du soir, me permettant de les modifier, de les corriger. Mieux, je devrais être forcé de passer en revue ce que ‘envoie, comme si je me rendais au bureau de poste.

En poussant le bouchon un peu plus loin, les mails envoyés pourraient prendre une durée aléatoire pour être remis. Un lecteur de mon blog a même imaginé que cette durée soit proportionnelle à la distance, comme si le courriel était remis à pied, à cheval ou en bateau.

Car l’immédiateté nous condamne à la solitude. Si un mail est envoyé, une réponse reçue instantanément, l’ubiquité du smartphone nous oblige presque à répondre immédiatement. Cela même au milieu d’un magasin ou d’une activité, sous peine d’oublier et de penser paraitre grossier.

La réponse à la réponse sera elle aussi immédiate et la conversation s’achèvera, les protagonistes comprenant que ce ping-pong en temps réel ne peut pas durer plus de quelques mots.

Paradoxalement, en créant l’email, nous avons détruit une fonctionnalité majeure des relations épistolaires : la possibilité pour chacune des parties de répondre quand l’envie lui prend et quand elle est disponible.

Jusqu’au 20e siècle, personne ne s’étonnait de ne pas recevoir de réponse à sa lettre pendant plusieurs jours voire pendant des semaines. Écrire une lettre de relance était donc un investissement en soi : il fallait se souvenir, garder l’envie et prendre le temps de le faire.

Cette temporisation a permis une explosion de la créativité et de la connaissance. De grands pans de l’histoire nous sont accessibles grâce aux relations épistolaires de l’époque. De nombreuses idées ont germé lors d’échanges de lettres. Pouvez-vous imaginer le 21e siècle vu par les yeux des historiens du futur à travers nos emails ?

Une lettre était lue, relue. Elle plantait une graine chez le destinataire qui méditait avant de prendre sa plume, parfois après plusieurs brouillons, pour rédiger une réponse.

Une réponse qui n’était pas paragraphe par paragraphe, mais bien une lettre à part entière. Une réponse rédigée en partant du principe que le lecteur ne se souvenait plus nécessairement des détails de la lettre initiale. Aujourd’hui, l’email nous sert à essentiellement à « organiser un call » pour discuter d’un sujet sur lequel personne n’a pris le temps de réfléchir.

Des parties d’échecs historiques se sont déroulées sur plusieurs années par lettres interposées. Pourrait-on imaginer la même chose avec l’email ? Difficilement. Les échecs se jouent désormais majoritairement en ligne en temps réel.

Pourtant, le protocole le permet. Il s’agit simplement d’un choix des concepteurs de logiciel d’avoir voulu mettre l’accent sur la rapidité, l’immédiateté, l’efficacité et la quantité.

Il ne faudrait pas grand-chose pour remettre au centre des échanges écrits la qualité dont nous avons cruellement besoin.

Nous utilisons le mail pour nous déresponsabiliser. Il y’a une action à faire, mais en répondant à l’email, je passe la patate chaude à quelqu’un d’autre. Répondre le plus rapidement, si possible avec une question, pour déférer le moment où quelqu’un devra prendre une décision. Tout cela au milieu d’un invraisemblable bruit publicitaire robotisé. Nous n’échangeons plus avec des humains, nous sommes noyés par le bruit des robots tout en tentant d’échanger avec des agents administratifs anonymes. Nous n’avons plus le temps de lire ni d’écrire, mais nous croyons avoir la pertinence de prendre des décisions rapides. Nous confondons, avec des conséquences dramatiques, efficience et rapidité.

Pour l’interaction humaine, nous nous sommes alors rabattus sur les chats. Leur format nous faisait penser à une conversation, leur conception nous empêche de gérer autrement qu’en répondant immédiatement.

Ce faisant, nous avons implicitement réduit l’interaction humaine à un échange court, bref, immédiat. Une brièveté et une rapidité émotive qui nous pousse à agrémenter chaque information d’un succédané d’émotion : l’émoji.

Nous en oublions la possibilité d’avoir des échanges lents, profonds, réfléchis.

Parfois, je rêve d’abandonner les clients mails et les messageries pour un véritable client de correspondances. De sortir de l’immédiateté du chat et de la froideur administrative du mail pour retrouver le plaisir des relations épistolaires.

Photo by Liam Truong on Unsplash

Je suis @ploum, ingénieur écrivain. Abonnez-vous pour recevoir mes billets par mail ou RSS, partagez mes écrits autour de vous autour de vous et soutenez-moi en achetant mes livres. Commandez Printeurs, mon dernier roman de science-fiction..

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

When trying to compile WebAssembly (wabt-rs) for a dependent package, it failed on Ubuntu 18.04 LTS due to this error message.
I found this error message when compiling some software from source: It looks like you're compiling on Linux and also targeting Linux.
Ran into this error when compiling some software from source: Could not find directory of OpenSSL installation, and this `-sys` crate cannot proceed without this knowledge.
I was trying to run the following command: $ cargo +nightly install [package] error: no such subcommand: `+nightly` But … that didn’t work.

November 20, 2020

I published the following diary on isc.sans.edu: “Malicious Python Code and LittleSnitch Detection“:

We all run plenty of security tools on our endpoints. Their goal is to protect us by preventing infection (or trying to prevent it). But all those security tools are present on our devices like normal applications and are, therefore, easy to detect. Techniques to detect the presence of such security tools are multiple… [Read more]

The post [SANS ISC] Malicious Python Code and LittleSnitch Detection appeared first on /dev/random.

November 19, 2020

Quelques liens et conseils de lecture pour réfléchir sur nos dépendances à la technologie et à la superficialité.

Couché sur le dos, j’allume des séries. Je zappe. Quand mon attention déraille, je lance des sites d’actualités que je déroule à l’infini. Les actualités évitent de penser. Contrairement à une fiction, il n’y a rien à comprendre, rien à chercher. Il suffit de se laisser happer par l’émotion brute pendant quelques secondes. Puis de continuer à faire défiler le site. Je reprends ensuite une série.

Printeurs, chapitre 9

L’addiction au smartphone, un poncif sur lequel tout semble avoir été dit. Depuis le mode d’emploi simple et efficace pour se libérer écrit par Korben aux analyses poussées de Cal Newport, est-il utile de revenir sur le sujet ?

Oui, car ce n’est pas uniquement le smartphone le problème. Nos addictions sont toutes différentes. Depuis l’addiction physique au fait d’être devant un écran (traitée notamment par Michel Desmurget dans l’excellent « TV Lobotomie »), l’addiction aux contacts sociaux, l’addiction aux actualités, l’addiction aux jeux …

Écrit en 2009, bien avant la vague des réseaux sociaux, le court texte Technology is Heroin offre une formidable analogie pour prendre du recul et comprendre notre dépendance à la technologie. Le point clé est l’inverse de ce que dit le titre : « Heroin is Technology ». En effet, l’héroïne était au départ une solution technologique innovante en vente libre pour se sentir bien. Pourquoi s’en passer ? Ce n’est qu’au fil du temps que certains effets pernicieux ont commencé à se faire sentir.

http://tiny-giant-books.com/Entry1.html?EntryId=recgcpfuOFUesUpRy

Comme l’héroïne, les nouvelles technologies ne font que manipuler un équilibre chimique cérébral issu de millénaires d’évolution pour nous procurer du plaisir facilement. Mais tout plaisir trop facile entraine un comportement morbide : évitement des difficultés, perte d’énergie, refuge dans les paradis artificiels. Ce que Cal Newport appelle « escapism ».

Les fabricants de technologies, tout comme les dealers, ont très vite compris l’intérêt de créer des consommateurs addicts. Cet effet a été renforcé par l’apparition de monopoles technologiques, apparition rendue possible par la politique reaganienne qui a détricoté les lois antitrust pour les rendre le moins efficaces possible.

https://getpocket.com/explore/item/has-dopamine-got-us-hooked-on-tech

Les militants de longue date qui dénoncent l’abus des monopoles technologiques ne manquent pas (et, à ma petite échelle, j’en fais partie). Paradoxalement, ils sont très peu médiatiques. Au contraire d’anciens employés de ces mêmes monopoles qui ont fait fortune grâce à cette addiction et qui, soudain, se lancent dans une seconde carrière de militant. C’est dangereux, car s’ils apportent une vision de l’intérieur, ils ne sont pas neutres, ils découvrent seulement cet aspect de leur ancien métier et ils sont très loin d’être objectifs. Comme le dit Aral Balkan : 
— À tous ceux qui me demandent ce que je pense du film Netflix « The social dilemma », je réponds : que pensez-vous du texte « The prodigal Techbro » ?

Un texte qui, paraphrasant la parabole biblique du fils prodigue, nous montre que nous célébrons souvent quelqu’un qui tente de se repentir en oubliant complètement ceux qui, depuis le début, ont fait attention à ne pas commettre d’actions néfastes.

https://conversationalist.org/2020/03/05/the-prodigal-techbro/

D’ailleurs, la solution la plus souvent préconisée par les « techbros repentis » (essentiellement ce que j’appelle des bliches, des hommes blancs et riches), c’est… « plus de tech ». Le problème ne serait que du design. Il n’y aurait rien de sociologique, politique là derrière. Tu parles Charles…

C’est exactement le danger dénoncé par « The prodigal techbro ». Une personne qui a fait sa fortune dans la tech, qui a l’intuition d’un problème, mais qui ne peut pas imaginer le résoudre autrement qu’en développant une solution technologique.

https://www.fastcompany.com/3051765/how-our-tech-addiction-and-constant-distraction-is-a-solvable-design-problem

Car si on creuse un peu, on se rend compte que la pollution mentale tant dénoncée n’est pas qu’un artefact technologique, un simple problème qu’une « bonne tech » pourrait résoudre. Elle est réellement volontaire et encouragée par les monopoles tech, même dans ses aspects les plus sombres et clairement illégaux. En bref, le problème n’est pas technologique, il est humain à la base.

https://getpocket.com/explore/item/how-facebook-helps-shady-advertisers-pollute-the-internet

Ce concept du prophète techbro repenti et blanchi est souvent aggravé par le syndrome du polymathe. Un polymathe, c’est quelqu’un qui excelle dans plusieurs domaines forts différents. L’exemple que j’aime donner est Bruce Dickinson, chanteur d’Iron Maiden et l’une des plus belles voix de l’histoire du métal, pilote d’avion gros porteur (licence commerciale) et escrimeur olympien. Il est également auteur de romans. Les véritables polymathes de ce genre sont incroyablement rares. Pour la plupart, ce sont des gens avec une spécialité bien précise et des centres d’intérêt vers d’autres domaines. Le problème c’est qu’il est difficile pour un non-expert de faire la différence entre un véritable expert et un amateur qui a lu deux livres sur le sujet. On aura une tendance naturelle à accorder beaucoup de valeur à l’opinion d’une personne spécialiste, même si elle s’exprime sur un domaine qui n’est pas le sien. La pandémie l’a démontré amplement : une certitude en blouse blanche devant une caméra est bien plus médiatique que mille études statistiques démontrant que l’on ne sait pas grand-chose et que la prudence est de mise.

https://applieddivinitystudies.com/2020/09/28/polymath/

Un autre aspect du problème c’est que les personnes qui parlent de ce sujet, à savoir les journalistes web, sont dépendantes des effets néfastes du même web pour vivre. Ils doivent créer des addictions à leur propre site pour vivre ! On a donc une relation symbiotique entre des pseudo-experts qui « ont vu la lumière » après avoir fait fortune en accaparant le cerveau des gens et des journalistes sans le sou qui parlent d’eux pour gagner de quoi (sur)vivre en accaparant les mêmes cerveaux. (le fait que l’article suivant soit sur Medium illustre l’ampleur du problème)

https://medium.com/message/the-hypocrisy-of-the-internet-journalist-587d33f6279e

Le pire ? Tout cela pourrit nos vies et notre cerveau, mais cela ne fait pas spécialement vendre mieux. C’est une sorte de course à l’armement. Faire plus de pubs ne fait pas vendre plus, mais ne pas faire de pub fait perdre des ventes. Lorsque cette bulle va un jour se dégonfler, cela ne risque de ne pas être joli joli.

https://www.wired.com/story/ad-tech-could-be-the-next-internet-bubble/

La publicité pourrit toute notre société. Notre étrange rapport aux stars qui ne sont plus adulées pour des accomplissements, mais parce qu’elles sont… des stars n’en est qu’un exemple parmi tant d’autres. Au Royaume-Uni, 54% des adolescents de 16 ans ont pour plan de vie de « devenir une célébrité ».

https://www.theguardian.com/commentisfree/2016/dec/20/celebrity-corporate-machine-fame-big-business-donald-trump-kim-kardashian

Et ne croyez pas que les populations éduquées soient préservées. La recherche de prestige est même devenue l’ambition majeure des jeunes diplômés qui se ruent dans les entreprises qui sont « prestigieuses ». Si le prestige comme conséquence de l’excellence est peut-être une bonne chose, la recherche du prestige avant l’excellence entraine une course vers la médiocrité où l’apparence est le seul atout.

Le problème, c’est que nous n’avons plus de mesure de l’excellence. Pour faire la différence entre un expert qui a étudié, avec compétence, un domaine pendant 20 ans et un internaute qui a lu des opinions sur des forums, il faut généralement avoir une certaine expertise soi-même. L’excellence est donc une perte de temps et la sélection naturelle nous pousse vers une culture d’apparence, de mensonge et de déconnexion de la réalité qui n’est pas sans rappeler les mouvances religieuses.

https://wesdesilvestro.com/the-prestige-trap

L’exemple est frappant dans mon pays où le parti écologiste a réussi faire voter une loi pour « sortir du nucléaire », entrainant un désinvestissement complet des infrastructures nucléaires alors que le nucléaire est aujourd’hui l’énergie la plus écologique. L’apparence et la médiatisation ont pris le pas sur la compétence et la réalité, avec des résultats dramatiques.

Au final, on en est réduit à s’acheter tout. Même les amis histoire de montrer qu’on est populaire, qu’on a du prestige. Même si c’est un mensonge et que tout le monde le sait.

https://namok.be/blog/?post/2014/04/25/comment-acheter-des-amis

Enfermés dans nos petits plaisirs faciles et addictifs, nous n’avons plus l’énergie ni le temps de cerveau pour la difficulté, étape essentielle à l’excellence. Nous en sommes réduits à simuler, à nous mentir à nous même et à faire du marketing pour tout et n’importe quoi.

D’ailleurs, à propos de faire du marketing : l’addiction à la technologie et la publicité sont des thèmes centraux de Printeurs, mon premier roman de science-fiction à paraître le 24 novembre. Si vous commandez votre exemplaire avant cette date, vous pourrez rejoindre le club très select des lecteurs privilégiés qui recevront chaque chapitre du tome 2 au fur et à mesure de son écriture ! Une opportunité unique et prestigieuse de briller dans les cocktails mondains.

https://www.plaisirvaleurdhistoire.com/shop/29-utopies-p2p

Si la crise du coronavirus a malheureusement impacté votre portefeuille, mais que le cœur y est, j’ai encore des exemplaires suspendus à distribuer (et vous pourrez également bénéficier du tome 2 en exclusivité). Envoyez-moi un mail !

https://ploum.net/le-roman-suspendu/

Je regarde défiler les milliers de messages de ces télépass persuadés de détenir des vérités secrètes pour la simple raison qu’elles leur font du bien et qu’ils se les racontent en groupe. Ils se sentent soudainement importants, ils se sentent exister, ils se créent une identité dans une société qui ne veut même plus d’eux comme simple rouage. Comme eux, je me sens seul, inutile, dans le noir. Comme eux, je ressens le désir, la bouffée d’espoir que représente une information qui me rendrait supérieur, important. Ou, pour le moins, pas complètement, désespérément inutile.

Printeurs, chapitre 9

Photo by engin akyurt on Unsplash

Je suis @ploum, ingénieur écrivain. Abonnez-vous pour recevoir mes billets par mail ou RSS, partagez mes écrits autour de vous autour de vous et soutenez-moi en achetant mes livres. Commandez Printeurs, mon dernier roman de science-fiction..

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

I published the following diary on isc.sans.edu: “PowerShell Dropper Delivering Formbook“:

Here is an interesting PowerShell dropper that is nicely obfuscated and has anti-VM detection. I spotted this file yesterday, called ‘ad.jpg’ (SHA256:b243e807ed22359a3940ab16539ba59910714f051034a8a155cc2aff28a85088). Of course, it’s not a picture but a huge text file with Base64-encoded data. The VT score is therefore interesting: 0/61. Once decoded, we discover the obfuscated PowerShell code. Let’s review the techniques implemented by the attacker… [Read more]

The post [SANS ISC] PowerShell Dropper Delivering Formbook appeared first on /dev/random.

November 18, 2020

I published the following diary on isc.sans.edu: “When Security Controls Lead to Security Issues“:

The job of security professionals is to protect customers’ assets and, even more, today, customers’ data. The security landscape is full of solutions that help to improve security by detecting (and blocking) threats knocking on the organizations’ doors. Sometimes, such solutions have side effects that go to the opposite direction and make customers more vulnerable to attacks… [Read more]

The post [SANS ISC] When Security Controls Lead to Security Issues appeared first on /dev/random.

November 17, 2020

The image reads: 'Breaking news:

When Acquia acquired Mautic Inc (now named Acquia Campaign Studio), we believed that the world needed to move beyond closed, legacy marketing solutions like Marketo.

At the time of the acquisition, Acquia was a Marketo user. As of November 2020, Acquia moved completely off Marketo to Campaign Studio.

While this move probably won't come as a surprise, it still is an important milestone for us. Marketo was a critical part of Acquia's marketing operations.

The freedom to innovate

Our marketing team needed flexibility to experiment with new technologies. Marketo limited them to using integrations within its own ecosystem. With an Open Source solution like Acquia Campaign Studio, we took charge of our own destiny. We can now build all the integrations and customer experiences we want.

Thinking beyond email

Today, almost every interaction with a customer is multi-faceted. Customers may be using mobile, voice, chat or any number of other channels. Marketo still only includes email in its communications offering. With Campaign Studio, Acquia can reach customers and prospects through multichannel communications, including email, direct social messages, SMS, web notifications and more.

Enterprise features without complexity

Many enterprise software tools (Marketo included) lock customers into their proprietary ecosystems. Getting data out of these platforms is much harder than getting it in. This is one of the reasons why it took some time to migrate off Marketo. It feels great to take control back over our own data.

Embracing open marketing

Overall, an open approach to marketing will provide Acquia with many advantages. We're no longer locked into a vendor's roadmap and limited partner ecosystem. Instead, we can move quickly to create the exact solution we need to make our customers' experiences better and more personal.

Many technology solutions shape what you can do for the customer experience. Starting today, we're letting the customer experience shape the solution.

November 16, 2020

Begrip in elektronica krijg je pas door veel elektronische schakelingen uit te proberen en het gedrag te observeren. Dat kan met fysieke elektronische componenten, maar ook met simulaties.

In academische middens en de industrie wordt er veel gebruikgemaakt van de simulatiesoftware Multisim van National Instruments (NI). Dat is propriëtaire software, je hebt er een licentie voor nodig en ze draait alleen op Windows. Gelukkig bestaat er ook opensourcesoftware om elektronische schakelingen te simuleren onder Linux. Een van die programma’s is Qucs (Quite Universal Circuit Simulator).

Het duurde even voor ik doorhad hoe Qucs werkte, want het programma heeft niet de meest gebruiksvriendelijke interface en de documentatie is nogal fragmentarisch, op specialisten gericht en vaak verouderd. Maar zodra je de basis onder de knie hebt, werkt het programma vrij consistent.

In een artikel dat ik voor Linux Magazine schreef, simuleer ik enkele elektronische schakelingen met Qucs:

  • een spanningsdeler, als voorbeeld van een DC-simulatie;

  • een bruggelijkrichter, als voorbeeld van een transiënte simulatie;

  • een RC-filter, als voorbeeld van een Bodediagram om de frequentieafhankelijkheid van schakelingen te bestuderen.

Die laatste ziet er dan zo uit:

/images/qucs-filter.png

Ik ben geen professioneel elektronicus, maar al met al vind ik Qucs heel geschikt om de occasionele elektronische schakeling die ik maak te simuleren, en ik ga het programma zeker nog gebruiken. En dan heb ik nog maar een fractie van de mogelijkheden uitgeprobeerd. Zo ondersteunt Qucs ook heel wat wiskundige functies en laat het je zelfs toe om scripts met GNU Octave uit te voeren.

November 15, 2020

The Micro:bit track of our local Coderdojo went virtual during a COVID-19 peak. This created a challenge: not all kids have Micro:bits at home, and the makecode Micro:bit simulator doesn't simulate all extensions and functions. We provided an e-mail gateway to remotely program Micro:bits, with a live webcam view of the running programs. Our solution runs on a Linux machine, which could be a regular PC or even a Raspberry Pi. Please make sure your Linux box can power the Micro:bits and the extensions you connect, or otherwise use a powered USB hub to connect them.

Create a mailbox 

We created a dedicated mailbox that is accessible via IMAP or POP3. In our case, we used a local mailserver, but an account at an external e-mail provider could be used as well. 

Install fetchmail and procmail 

Fetchmail can poll an IMAP or POP3 mailbox and save the fetched mails locally. Local delivery is done via procmail. Our fetchmail config is

#### .fetchmailrc


 set daemon 60

 set logfile fetchmail.log


 poll mailserver-FQDN proto POP3

  user "mail-username" pass "mail-password" is "pi" postconnect "/home/pi/microbit/munpack-microbit.sh"

  ssl

  fetchall

  no keep

  no rewrite

  mda "/usr/bin/procmail -f %F -d %T";


Our local user is "pi", and we poll our mailbox every 60 seconds. The postconnect script will unpack the attachments and write them to the Micro:bit (see below). We need the mail messages containing the Micro:bit programs as separate files, so we configure procmail to save them in Maildir format. Our .procmailrc

#.procmailrc.

#

SHELL=/bin/bash

LINEBUF=4096

PATH=/bin:/usr/bin:/usr/local/bin:/opt/local/bin

VERBOSE=off

MAILDIR=/home/pi/maildir

DEFAULT=$MAILDIR/inbox/ # See the slash!

LOGFILE=$HOME/procmaillog

FORMAIL=/usr/bin/formail

SENDMAIL=/usr/sbin/sendmail


## save everything in Maildir format in ~/maildir

#

:0

$MAILDIR/

This means the fetched mails will be saved as individual files in ~pi/maildir/new/

Install mpack 

The mpack package provides the munpack command, which saves attachments from mail files. We integrate unpack into a shell script that copies the attached .hex files to the Micro:bit USB mass storage device: munpack-microbit.sh

#!/bin/bash


ls ~pi/maildir/new/???* 2> /dev/null > /dev/null || exit 0


for mailfile in ~pi/maildir/new/*; do 

        munpack -C ~pi/microbit/ $mailfile ; 

        mv $mailfile ~pi/maildir/cur/ ;

done


disklist=""

for disk in $(echo "sda sdb sdc sdd sde sdf sdg sdh sdi sdj sdk sdl sdm sdn sdo"); do

        [[ -L /sys/block/$disk ]] && [[ "$(cat /sys/block/$disk/size)" -le "131200" ]] && disklist="$disklist $disk"

done


for disk in $(echo $disklist); do

        if [[ -L /sys/block/$disk ]]; then

                #[[ "x$(cat /sys/block/$disk/size)" -eq "x16512" ]] || continue #flash size old Micro:bit firmware

                #[[ "x$(cat /sys/block/$disk/size)" -eq "x131200" ]] || continue #flash size new Micro:bit firmware

                [[ "$(cat /sys/block/$disk/size)" -le "131200" ]] || continue # only continue on small disks

                [[ -d /tmp/$disk ]] || mkdir /tmp/$disk

                [[ -e /tmp/$disk/MICROBIT.HTM ]] || sudo mount -t vfat /dev/$disk /tmp/$disk

        fi

done

ls ~pi/microbit/*.hex 2> /dev/null > /dev/null || exit 0


for hexfile in ~pi/microbit/*.hex ; do

        #echo $hexfile | grep -iq scroll && disklist="sdh sdi sdj" # use fixed disklist for scroll:bit

        #echo $hexfile | grep -iq halo && disklist="sdg" # use fixed disklist for Kitronik ZIP Halo

        [[ -d ~pi/microbit/used ]] || mkdir ~pi/microbit/used

        for disk in $(echo $disklist); do

                [[ -e /tmp/$disk/MICROBIT.HTM ]] && sudo cp $hexfile /tmp/$disk/

                sudo sync

        done

        mv $hexfile ~pi/microbit/used/

done

exit 0


Note that some actions like mount require root privileges, so the user running this (pi, in our case) needs passwordless sudo privileges. 

Run it

Now start fetchmail: fetchmail -f ~pi/.fetchmailrc . You can monitor the fetchmail log file (see fetchmailrc) using tail -f. Fetchmail will run as a daemon until you stop it using fetchmail -q. 


In 2018 werd het schilderij Edmond de Belamy verkocht bij veilinghuis Christie’s in New York. De koper betaalde maar liefst 432.500 dollar, veel meer dan de 7.000 tot 10.000 dollar die men voor de veiling verwachtte. Was het omdat het Parijse kunstenaarscollectief Obvious zo goed was? Nee, het was omdat de werkelijke kunstenaar een computer was, zoals te zien aan de handtekening rechts onderaan het schilderij.

Edmond de Belamy (bron: Obvious)

Edmond de Belamy was het resultaat van een generative adversarial network (GAN) en de handtekening maakte onderdeel uit van het algoritme. Het werd getraind op een verzameling van 15.000 portretten van de 14de tot de 19de eeuw uit de online kunstencyclopedie WikiArt. Daarna kon je met het systeem naar believen kunstwerken creëren in dezelfde stijl. Een van die resultaten was een wat vaag portret van een man in iets wat een kostuum lijkt, met een misvormd gezicht. Edmond de Belamy was het eerste door AI (artificial intelligence) gecreëerde kunstwerk dat bij Christie’s werd geveild. Obvious maakte nog andere portretten op dezelfde manier, in de collectie La Famille de Belamy.

In een artikel dat ik voor PC-Active schreef in mijn rubriek Denkwerk ga ik dieper in op computerprogramma's die schilderijen maken in deze kenmerkende stijl die GANisme genoemd wordt. Ik kijk ook naar enkele kunstenaars die neurale netwerken trainden op hun eigen kunstwerken om zo nog betere kunst te maken. Het levert fascinerende resultaten op!

updated @ Mon Nov 16 08:16:30 PM CET 2020: Corrected the version when OPNsense dropped 32 bits support.

FreeBSD on alix

I used OPNsense on my pcengines Alix 2d13 firewall.

The Alix 2d13 is a nice motherboard with a Geode CPU 32 bits x86 CPU.

I migrated to OPNsense after pfSense dropped support for 32 bits. Unfortunately, OPNsense also dropped support for 32 bits CPUs in the 19.1.7 release 20.7 release. I decided to install FreeBSD on my Alix to use it as my firewall.

To make it possible to reinstall my Alix firewall, I installed FreeBSD on my Raspberry Pi 2 to use it as my firewall during the installation of FreeBSD on my Alix.

You’ll find my journey to install FreeBSD my an Alix firewall below.

Install FreeBSD on the Alix 2d13

All the step below are executed on a FreeBSD system.

Partition

I plug the cf card of the Alix into a card reader of my FreeBSD laptop. The easiest way to find the device name of the disk on FreeBSD is to use the geom utility. Use geom disk list to find the cf card.

root@snuffel:~ # geom disk list

<snip>

Geom name: da0
Providers:
1. Name: da0
   Mediasize: 4017807360 (3.7G)
   Sectorsize: 512
   Mode: r0w0e0
   descr: Generic Compact Flash
   ident: 00000000000006
   rotationrate: unknown
   fwsectors: 63
   fwheads: 255

Geom name: da1
Providers:
1. Name: da1
   Mediasize: 0 (0B)
   Sectorsize: 512
   Mode: r0w0e0
   descr: Generic SD/MMC
   ident: 00000000000006
   rotationrate: unknown
   fwsectors: 0
   fwheads: 0

Geom name: da2
Providers:
1. Name: da2
   Mediasize: 0 (0B)
   Sectorsize: 512
   Mode: r0w0e0
   descr: Generic microSD
   ident: 00000000000006
   rotationrate: unknown
   fwsectors: 0
   fwheads: 0

Geom name: da3
Providers:
1. Name: da3
   Mediasize: 0 (0B)
   Sectorsize: 512
   Mode: r0w0e0
   descr: Generic MS/MS-PRO
   ident: 00000000000006
   rotationrate: unknown
   fwsectors: 0
   fwheads: 0

Geom name: da4
Providers:
1. Name: da4
   Mediasize: 0 (0B)
   Sectorsize: 512
   Mode: r0w0e0
   descr: Generic SM/xD-Picture
   ident: 00000000000006
   rotationrate: unknown
   fwsectors: 0
   fwheads: 0

root@snuffel:~ # 

I wanted to clear the partition on the cf card.

User dd to clear the partition table.

root@snuffel:~ # dd if=/dev/zero of=/dev/da0 bs=1k count=1
1+0 records in
1+0 records out
1024 bytes transferred in 0.035529 secs (28821 bytes/sec)
root@snuffel:~ #

As this is a dedicated FreeBSD system, I choose not to create a partition table. But created a BSD slice with bsdlabel on the disk directly as described in the FreeBSD handbook.

root@snuffel:~ # bsdlabel -B -w /dev/da0
root@snuffel:~ # gpart show
=>       40  224674048  ada0  GPT  (107G)
         40       1024     1  freebsd-boot  (512K)
       1064        984        - free -  (492K)
       2048    4194304     2  freebsd-swap  (2.0G)
    4196352  220477440     3  freebsd-zfs  (105G)
  224673792        296        - free -  (148K)

=>      0  7847280  da0  BSD  (3.7G)
        0       16       - free -  (8.0K)
       16  7847264    1  !0  (3.7G)

root@snuffel:~ # 

Create the UFS filesystem, I also use the -i 1 option to create a filesystem with more inodes, because I ran out of inodes on OPNsense.

root@snuffel:~ # newfs -i 1 /dev/da0a 
density increased from 1 to 4096
/dev/da0a: 3831.7MB (7847264 sectors) block size 32768, fragment size 4096
	using 8 cylinder groups of 479.00MB, 15328 blks, 122624 inodes.
super-block backups (for fsck_ffs -b #) at:
 192, 981184, 1962176, 2943168, 3924160, 4905152, 5886144, 6867136
root@snuffel:~ # 

Mount the slice to /mnt.

root@snuffel:~ # mount /dev/da0a /mnt
root@snuffel:~ # df -h
Filesystem                       Size    Used   Avail Capacity  Mounted on
zroot/ROOT/default                87G     21G     66G    24%    /
devfs                            1.0K    1.0K      0B   100%    /dev
procfs                           4.0K    4.0K      0B   100%    /proc
zroot/usr/home                    70G    4.1G     66G     6%    /usr/home
zroot/tmp                         66G    1.5M     66G     0%    /tmp
zroot                             66G     88K     66G     0%    /zroot
zroot/var/log                     66G    2.3M     66G     0%    /var/log
zroot/usr/src                     67G    733M     66G     1%    /usr/src
zroot/var/crash                   66G     88K     66G     0%    /var/crash
zroot/var/audit                   66G     88K     66G     0%    /var/audit
zroot/var/mail                    66G    112K     66G     0%    /var/mail
zroot/usr/ports                   67G    740M     66G     1%    /usr/ports
zroot/var/tmp                     66G     88K     66G     0%    /var/tmp
zroot/usr/home/backup             66G     88K     66G     0%    /usr/home/backup
zroot/usr/home/backup/snuffel     67G    1.1G     66G     2%    /usr/home/backup/snuffel
/dev/da0a                        3.5G    8.0K    3.2G     0%    /mnt
root@snuffel:~ # 

Label the slice, this will make it easier to mount the root filesystem.

root@snuffel:~ # tunefs -L freebsd /dev/da0a

Install FreeBSD

Download

Download the kernel and the base tarball.

[staf@snuffel ~/Downloads/freebsd/i386]$ wget https://download.freebsd.org/ftp/releases/i386/i386/12.2-RELEASE/kernel.txz
--2020-11-11 17:57:11--  https://download.freebsd.org/ftp/releases/i386/i386/12.2-RELEASE/kernel.txz
Resolving download.freebsd.org (download.freebsd.org)... 139.178.72.202, 139.178.72.202, 213.138.116.78, ...
Connecting to download.freebsd.org (download.freebsd.org)|139.178.72.202|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 36979076 (35M) [application/octet-stream]
Saving to: 'kernel.txz'

kernel.txz                     100%[===================================================>]  35.27M  2.00MB/s    in 15s     

2020-11-11 17:57:27 (2.31 MB/s) - 'kernel.txz' saved [36979076/36979076]

[staf@snuffel ~/Downloads/freebsd/i386]$ wget https://download.freebsd.org/ftp/releases/i386/i386/12.2-RELEASE/base.txz
--2020-11-11 17:57:56--  https://download.freebsd.org/ftp/releases/i386/i386/12.2-RELEASE/base.txz
Resolving download.freebsd.org (download.freebsd.org)... 213.138.116.78, 139.178.72.202, 139.178.72.202, ...
Connecting to download.freebsd.org (download.freebsd.org)|213.138.116.78|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 170520220 (163M) [application/octet-stream]
Saving to: 'base.txz'

base.txz                       100%[===================================================>] 162.62M  1.95MB/s    in 97s     

2020-11-11 17:59:34 (1.67 MB/s) - 'base.txz' saved [170520220/170520220]

[staf@snuffel ~/Downloads/freebsd/i386]$ ls -ltr
total 202789
-rw-r--r--  1 staf  staf   36979076 Oct 23 09:39 kernel.txz
-rw-r--r--  1 staf  staf  170520220 Oct 23 09:39 base.txz
[staf@snuffel ~/Downloads/freebsd/i386]$ 

Extract

Extract the kernel to /mnt.

root@snuffel:/mnt # tar -xzpvf /home/staf/Downloads/freebsd/i386/kernel.txz -C /mnt

Extract the base.

root@snuffel:/mnt # tar -xzpvf /home/staf/Downloads/freebsd/i386/base.txz -C /mnt

Sync…

root@snuffel:~ # sync
root@snuffel:~ # 

Chroot

Chroot into /mnt.

root@snuffel:/mnt # uname -a
FreeBSD snuffel 12.2-RELEASE FreeBSD 12.2-RELEASE r366954 GENERIC  amd64
root@snuffel:/mnt # chroot /mnt
root@snuffel:/ # uname -a
FreeBSD snuffel 12.2-RELEASE FreeBSD 12.2-RELEASE r366954 GENERIC  i386
root@snuffel:/ # 

Set the root password.

root@snuffel:/ # passwd root
Changing local password for root
New Password:
Retype New Password:

Add a user to the system, make sure to add the user to the wheel group, you’ll not be able to become root on BSD unless the user is in the wheel group.

root@snuffel:/ # adduser
Username: staf
Full name: 
Uid (Leave empty for default): 
Login group [staf]: 
Login group is staf. Invite staf into other groups? []: wheel
Login class [default]: 
Shell (sh csh tcsh nologin) [sh]: 
Home directory [/home/staf]: 
Home directory permissions (Leave empty for default): 
Use password-based authentication? [yes]: 
Use an empty password? (yes/no) [no]: 
Use a random password? (yes/no) [no]: 
Enter password: 
Enter password again: 
Lock out the account after creation? [no]: 
Username   : staf
Password   : *****
Full Name  : 
Uid        : 1001
Class      : 
Groups     : staf wheel
Home       : /home/staf
Home Mode  : 
Shell      : /bin/sh
Locked     : no
OK? (yes/no): yes
adduser: INFO: Successfully added (staf) to the user database.
Add another user? (yes/no): no
Goodbye!
root@snuffel:/ # 

Create fstab with the root filesystem, the root filesystem is mounted with the label that we created before.

# Device                Mountpoint      FStype  Options         Dump    Pass#
/dev/ufs/freebsd       /               ufs     rw              1       1
root@snuffel:/etc # 

Set the console out to the serial port.

root@snuffel:/ # echo 'console="comconsole"' >> /boot/loader.conf
root@snuffel:/ # 

Umount the cf card.

root@snuffel:/ # sync
root@snuffel:/ # exit
root@snuffel:/mnt # 
root@snuffel:~ # umount /mnt
root@snuffel:~ # 

First boot

Put the cf card into the Alix system.

Connect to the serial port with the cu command.

[staf@snuffel /usr/home/staf]$ sudo cu -l /dev/ttyU0

Power the Alix system, and enjoy the boot screen.

\  ______               ____   _____ _____  
  |  ____|             |  _ \ / ____|  __ \ 
  | |___ _ __ ___  ___ | |_) | (___ | |  | |
  |  ___| '__/ _ \/ _ \|  _ < \___ \| |  | |
  | |   | | |  __/  __/| |_) |____) | |__| |
  | |   | | |    |    ||     |      |      |
  |_|   |_|  \___|\___||____/|_____/|_____/ 
                                                 ```                        `
 +-----------Welcome to FreeBSD------------+    s` `.....---.......--.```   -/
 |                                         |    +o   .--`         /y:`      +.
 |  1. Boot Multi user [Enter]             |     yo`:.            :o      `+-
 |  2. Boot Single user                    |      y/               -/`   -o/
 |  3. Escape to loader prompt             |     .-                  ::/sy+:.
 |  4. Reboot                              |     /                     `--  /
 |  5. Cons: Video                         |    `:                          :`
 |                                         |    `:                          :`
 |  Options:                               |     /                          /
 |  6. Kernel: default/kernel (1 of 1)     |     .-                        -.
 |  7. Boot Options                        |      --                      -.
 |                                         |       `:`                  `:`
 |                                         |         .--             `--.
 +-----------------------------------------+            .---.....----.
   Autoboot in 0 seconds, hit [Enter] to boot or any other key to stop  

Have fun!

Links

November 13, 2020

Ge kent die Vlaamse naturalistische romans uit vervlogen tijden? Wel, dit zou daar een moderne Ierse variant op kunnen zijn;

Rijke, norse oude boer zit aan een toog in een chique hotel en kijkt -al drinkend- terug op zijn leven en de mensen die er niet meer zijn.

Vrolijk is “Als alles is gezegd” misschien niet, maar het is een wel sterk verhaal over liefde en de onmogelijkheid om die te uiten.

I published the following diary on isc.sans.edu: “Old Worm But New Obfuscation Technique“:

Yesterday I found an interesting JavaSvript script delivered through a regular phishing campaign (SHA256:70c0b9d1c88f082bad6ae01fef653da6266d0693b24e08dcb04156a629dd6f81) and has a VT score of 17/61. The script obfuscation is simple but effective: the malicious code is decoded and passed to an eval() function to be executed… [Read more]

The post [SANS ISC] Old Worm But New Obfuscation Technique appeared first on /dev/random.

November 10, 2020

D’Ostende à Louvain-la-Neuve à vélo, en passant par le célèbre mur de Grammont. Comme je prends beaucoup de plaisir à lire les miniaventures cyclistes de Thierry Crouzet, je me suis dit que j’allais raconter les miennes également.

Je suis tellement mal après un trajet en voiture que la moindre escapade familiale est le prétexte à une aventure en vélo. Nous partons passer le week-end à la mer ? Pourquoi ne rentrerais-je pas en vélo me propose ma tendre épouse ?

Excellente idée sauf que le trajet est de 165km, une distance que je n’ai encore jamais couverte d’une seule traite. Ma dernière miniaventure m’avait également laissé un goût amer à cause d’une double crevaison.

J’étais donc assez stressé, particulièrement sur le matériel. Quant à ma condition, on verra bien. Je suis également conscient que les dernières heures se rouleront dans la nuit. Prévoyant, je monte déjà mes phares. J’ai également prévu une veste de pluie, une doudoune, une casquette d’hiver et des jambières au cas où la température chuterait trop. Le tout occupe mon sac de cadre et justifie l’appelation « bikepacking » pour ce trip même si je ne l’ouvrirais finalement pas.

Il faut reconnaitre ce miracle des vêtements de cyclisme moderne : je passerai la journée sans enlever n’y rajouter la moindre couche, sans éprouver le moindre inconfort dans un sens ou dans l’autre durant 10h passant de 20°C à 6°C, alternant les efforts et les pauses.

Après un petit-déjeuner copieux, je m’élance donc de la digue ostendaise, un peu tardivement. Je me retrouve sur une voie verte, une piste cyclable rectiligne qui traverse la campagne flamande. Elle est pleine à craquer de cyclistes et de joggeurs, le vent est fort et j’ai du mal à rouler à plus de 22km/h.

J’aperçois, au loin, un couple de cyclistes plus sportifs. Je tente de les rattraper, ce qui me mettra plus d’un kilomètre de quasi-sprint. Une fois dans leurs roues, je profite pour me laisser emporter pendant…à peine 300m avant qu’ils ne bifurquent. Avec un vent comme celui-là, l’effet d’aspiration est incroyablement fort.

Au bout de 30km de lignes droites, durant lesquelles je ne peux m’empêcher d’imaginer Thierry Crouzet pestant sur la Floride, mon compteur marque un dénivelé de … 8m !

Il faudra attendre le 50e kilomètre pour escalader la toute première côtelette, toute mignonne : le Poelberg. Au « sommet » (ce qui est un bien grand mot) se trouve un centre de repos/cafétéria pour les cyclistes qui semble fermé à cause du confinement. L’idée est sympathique !

Le sommet du Poelberg. Vertigineux… ou pas !

La voie verte est terminée et la trace alterne entre des chemins boueux au milieu des champs, quelques rares bocages et, surtout, de longues pistes cyclables bordées par des routes nationales.

Heureusement, nous sommes en Flandres et les pistes cyclables sont sur site propre, très sécurisées. À aucun moment le cycliste ne se sent en danger. Il n’empêche que c’est moche, bruyant. Les villages traversés sont tous identiques, alternants concessionnaires automobiles et friteries.

La trace fait de son mieux pour m’éloigner des nationales, mais comme j’ai encore plus de cent bornes à faire, je ne suis pas toujours d’humeur à aller rouler 2km dans la boue plutôt que de faire 500m en ligne droite sur une nationale.

Nationale qui se révèlera bloquée par un combi de policiers qui m’avait dépassé toute sirène hurlante quelques kilomètres plus tôt. Je comprends qu’il y’a un incendie un peu plus loin (j’avais d’ailleurs observé la fumée depuis la colline en face), mais le détour ne m’arrange pas. C’est l’un des rares endroits où il n’y a pas de chemins parallèles. Je m’éloignerai alors un peu au pif pour découvrir quelques kilomètres d’un petit chemin boisé, un des plus beaux tronçons du parcours.

J’essaie de faire des arrêts réguliers, mais encore faut-il trouver un lieu propice. C’est amusant comme certains endroits s’imposent pour faire une pause alors que dans un autre décor, on peut rouler plus de 30 bornes sans vouloir s’arrêter malgré la fatigue.

Après 75km, je débouche sur la place d’Oudernaade, sous un soleil éclatant. Un jeune cycliste de l’équipe Trek Segafredo fait un photo shoot. Les bancs sont accueillants. Je me pose. Avant d’aviser un kebab. J’ai déjà consommé 3 barres d’énergie, mon estomac réclame du gras et du salé. Je prends un burger de poulet et quelques frites, pile poile ce qui me fallait. Je repars. D’après mon roadbook, le mur de Grammont ne devrait pas tarder.

À l’ombre de l’hôtel de ville d’Oudenaarde

Je n’ai jamais vu le mur de Grammont, mais ayant plusieurs expériences du mur de Huy, je sais à quel point ces difficultés peuvent couper les jambes. Je stresse un peu, je me prépare psychologiquement.

Il s’avère que je m’étais trompé dans mon roadbook. Je passe 25km à attendre que Grammont apparaisse au moindre virage. C’est au kilomètre 100 que j’arrive enfin sur la place du célèbre village.

Tout est propre et décoré en l’honneur du fameux mur. Dans les vitrines, des panneaux retracent les exploits historiques des cyclistes. Je fais une micropause, j’avale un bonbon et je découvre en enfourchant mon vélo que je m’étais garé sur une ligne gravée dans le sol qui indique le début du segment « Mur de Grammont » sur Strava.

Depuis la place, je gravis une petite montée en pavés bien plats et propres, je tourne à gauche en suivant les flèches. La route est bordée de panneaux célébrant le mur. Elle monte légèrement, je garde un rythme calme, je tourne à droite dans un petit chemin qui monte entre les arbres.
— On y est, me dis-je !

Je suis dépassé par une cycliste que je laisse partir, ne souhaitant pas présumer de mes forces. J’ai pas mal de poids sur mon vélo chargé et 100km dans les pattes.

La montée tourne brusquement à gauche puis encore à gauche. Sans forcer, il me reste encore deux vitesses et mon rythme cardiaque ne dépasse pas le 155. Je continue et j’aperçois la fameuse chapelle alors que je rattrape ma cycliste de tout à l’heure qui semble avoir un peu coincé.

J’arrive à la chapelle, étonné, pas du tout essoufflé. Il y’a plein de touristes.

Le sommet du fameux mur. C’est tout ?

Je ne peux m’empêcher de comparer avec le mur de Huy qui est autrement plus difficile. Dans le mur de Huy, impossible de mouliner. Je suis toujours à la limite de mettre le pied à terre, en poussant comme un forcené avec ma vitesse la plus facile. Quand j’arrive au sommet du mur de Huy, je m’écroule généralement. J’explose mes pulsations, je suis vidé.

Par contre, d’un point de vue marketing, le mur de Huy est une petite ruelle obscure bien cachée dans un coin de la ville. Il est très difficile à trouver si on ne connait pas. Au sommet, rien n’indique qu’on est arrivé. Il s’agit plus d’un plateau et d’une route qui continue.

Quant aux pavés ? À Grammont ils sont propres, lisses. C’est un plaisir de rouler dessus. Rien qu’autour de chez moi, je peux citer cinq montées plus abruptes et aux pavés bien défoncés qui sont un enfer à gravir.

Je suis tellement surpris qu’une fois la photo faite, je continue immédiatement mon chemin. Pas besoin de pause. Alors que le soleil commence à se coucher, je me dirige vers Hal. J’apprécie les couleurs du crépuscule sur les champs à peine bosselés à perte de vue.

Hal est une ville très moche, remplie de magasins. Je fais une halte dans un square sous le buste de Léopold II qui regarde avec bienveillance des nègres stylisés lui apporter une représentation du Congo. Je m’étonne que ce square n’ait pas encore été vandalisé avant de me rappeler que je suis en Flandre, pas à Bruxelles.

Je m’échappe de Hal par de petites montées sèches, de celles que j’apprécie particulièrement, et gagne le bois de Hal, bois où j’ai longuement couru lorsque je travaillais à proximité.

Il fait nuit noire, mais le chemin forestier est rectiligne et dégagé. Mon phare fait des merveilles. J’apprécie d’être dans les bois la nuit. Un vrai moment de plaisir trop vite passé avant de déboucher à Colipain, un endroit que je connais bien. Je suis en Wallonie. Je traverse le zoning industriel où j’ai travaillé pour gagner l’ancienne ligne de chemin de fer qui va m’amener à la gare de Braine-l’Alleud.

À partir d’ici, je connais la région par cœur. Et, psychologiquement, cela se révèle un calvaire. Je connais en effet toutes les difficultés qui m’attendent. Il fait nuit noire, j’ai 130km dans les jambes et, surtout, je commence à avoir un mal de ventre affreux.

À chaque fois que je fais des longues distances, je me tape un mal de ventre. Je ne sais pas si c’est l’abus des sucres des barres d’énergie, le fait que je bois trop ou que je ne supporte pas les électrolytes. Chaque coup de pédale est un enfer que je n’arrive pas à soulager. Je ne peux surtout plus boire ni manger, mais, du coup, je n’ai plus d’énergie.

Je traverse Braine-l’Alleud puis le champ de bataille de Waterloo par Hougoumont sous l’œil du lion illuminé. Je descends vers la vallée de Lasne. Ma trace m’a fait prendre des chemins pavés qui secouent mon estomac. Qu’ils viennent un peu voir à Lasne ceux qui disent que les pavés de Grammont sont une épreuve.

Pour sortir de la vallée, ma trace passe par la rue de la gendarmerie, une côte assez fameuse dans la région. Je me dis que je préfère cette côte-là à l’escalade par Couture-Saint-Germain ou par Chapelle-Saint-Lambert. La rue de la gendarmerie fait une grande boucle que je coupe par un petit chemin pentu, en pavé. Encore une fois, je rigole en songeant au mur de Grammont.

Je continue ensuite vers Céroux. Un chemin que j’ai parcouru des centaines de fois. Mais, la fatigue aidant, les pavés me semblent effroyablement durs, mon estomac est retourné. Et ce n’est pas fini, d’autres chemins pavés se succèdent sur les hauteurs d’Ottignies. Je sais bien que ce sont les derniers. À partir de là, je me laisse descendre jusqu’au bois des rêves, que je traverse dans le noir, je contourne le lac de Louvain-la-Neuve avant la dernière escalade jusqu’à mon lit. De manière étonnante, celle-ci se passera très bien. Si l’on excepte mon mal de ventre, les jambes tournent parfaitement alors que mon compteur affiche 165km et 10h en selle. Je sonne pour qu’on m’ouvre le garage et réveille mon fils qui était en train de s’endormir. Mais je suis content de le voir, de serrer ma femme dans mes bras avant d’aller prendre ma douche.

Je suis dans cet état que j’appelle « au bout de la fatigue ». Tellement crevé que dormir est difficile. Je soulage instantanément mon mal de ventre grâce à deux remèdes miracles : de la tisane et du fromage blanc. Le fromage blanc m’apaise, comme s’il absorbait l’excès de sucre et d’acidité. Je soupçonne que l’effet de la tisane ou du thé est essentiellement de la chaleur. Lors de mon trip avec Thierry, j’avais également éprouvé cette envie fulgurante d’un thé chaud.

Je dois peut-être apprendre à manger et boire moins. Je devrais tenter de me passer d’électrolytes.

Quoiqu’il en soit, j’adore ces miniaventures, ces journées hors du temps sur un vélo à parcourir un pays, à sentir chaque mètre de paysage, à croiser des visages que l’on re reverra jamais, à connecter avec mon histoire tout ce qui n’est que points sur une carte. J’aime me retrouver le nez dans mon cockpit, les pieds sur les pédales.

J’aime aussi d’avoir un objectif, d’être forcé d’arriver quelque part, sans raccourci possible pour dépasser la douleur et la fatigue. En temps normal, je n’aurais jamais été de Braine-l’Alleud à chez moi en pleine nuit. Avec 130km dans les jambes et pas d’autres options, cela devient tout simplement une évidence.

Le bikepacking, ce sont avant tout des rencontres, des nouveaux visages…

Je suis @ploum, ingénieur écrivain. Abonnez-vous pour recevoir mes billets par mail ou RSS, partagez mes écrits autour de vous autour de vous et soutenez-moi en achetant mes livres. Commandez Printeurs, mon dernier roman de science-fiction..

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

November 09, 2020

Signing e-mails and PDFs with Belgian EID on Linux luc Mon, 09/11/2020 - 21:34

With the current Covid-19 lockdown, more and more transactions are getting handled remote. In Belgium we have the possibility to legally sign documents with a certificate stored on our eID (smartcard). However... when I started looking for information on how to do that on Linux, I could only find partial info. Mainly on how to use LibreOffice to sign a document, but not on how to use your Belgian eID there. Or information on how to sign a PDF with eID on Windows or Mac with Adobe reader, but not on Linux. It took me a while to figure out how to get it working, so I'll try to glue all parts together in this blog post. :)

Prerequisites

I suppose you already have the eID middleware installed, a working smartcard reader and opensc installed.

Your eID should be in the smartcard reader while configuring and you should know your PIN.

 

Configure Thunderbird

LibreOffice is using the Thunderbird Security Modules and Devices manager. To use your Belgian eID in Thunderbird, you have to add some configuration.

Import the Belgium root CA into Thunderbird

You have to trust the root CA from Belgium to be able to sign and check signatures. I tried to google for a download, but couldn't find a correct and up to date version. The most secure way to get it, is probably to export it from your eID.
List the objects on your smartcard to find the CA object (you'll be prompted for the eID pin for every pkcs11-tool command here):

$ pkcs11-tool --login --list-objects
Using slot 0 with a present token (0x0)
Logging in to "BELPIC (Basic PIN)".
Please enter User PIN:
Private Key Object; RSA
  label:      Authentication
  ID:         02
  Usage:      sign
  Access:     sensitive, always sensitive, never extractable, local
Certificate Object; type = X.509 cert
  label:      Authentication
  subject:    DN: C=BE, CN=Luc Stroobant (Authentication), SN=Stroobant, GN=Luc/serialNumber=XXXXXXXXXXXX
  ID:         02
Public Key Object; RSA 2048 bits
  label:      Authentication
  ID:         02
  Usage:      encrypt, verify
  Access:     local
Private Key Object; RSA
  label:      Signature
  ID:         03
  Usage:      sign, non-repudiation
  Access:     always authenticate, sensitive, always sensitive, never extractable, local
Certificate Object; type = X.509 cert
  label:      Signature
  subject:    DN: C=BE, CN=Luc Stroobant (Signature), SN=Stroobant, GN=Luc/serialNumber=XXXXXXXXXXXX
  ID:         03
Public Key Object; RSA 2048 bits
  label:      Signature
  ID:         03
  Usage:      encrypt, verify
  Access:     local
Certificate Object; type = X.509 cert
  label:      CA
  subject:    DN: C=BE, CN=Citizen CA/serialNumber=201510
  ID:         04
Public Key Object; RSA 4096 bits
  label:      CA
  ID:         04
  Usage:      encrypt, verify
  Access:     local
Certificate Object; type = X.509 cert
  label:      Root
  subject:    DN: C=BE, CN=Belgium Root CA3
  ID:         06
Public Key Object; RSA 4096 bits
  label:      Root
  ID:         06
  Usage:      encrypt, verify
  Access:     local

 

The CA is ID 06 in my case (and I suppose this will be the case on all cards, but didn't check :)).
Export the root CA from your card and convert it to a pem:

$ pkcs11-tool --login --read-object --id 06 --type cert --output-file ca.der
$ openssl x509 -inform DER -in ca.der > ca.pem

In Thunderbird, go to Preferences > Account Settings and select Security for an account.

Thunderbird: account settings > security

To import the certificate, select Manage Certificates.

Thunderbird certificates window

There select Import to import the CA we just exported (use the pem file).

A window should appear where you can select to trust the CA to idenitfy websites and e-mail users. Select both options and hit OK.

Trust Belgium's root CA

Also close the Certificate Manager by hitting OK once more. (keep the account settings window open)

 

Configure Security Device

In the account security settings, click on the last button Security Devices.

Thunderbird security devices screen

There you have to add a new security device for your E-ID. Click Load to configure our security device:

Configure security device for Belgian EID

Add a free description and for Module filename the path to beidpkcs11.so on your system. On my Ubuntu laptop with eid-mw 4.4, this is /usr/lib/x86_64-linux-gnu/pkcs11/beidpkcs11.so .

Confirm with OK and also click OK to close the device manager. (and again: keep the account settings open)

 

Select the certificate for signing

Now for each account where you want to sign with your EID, in the Security settings go to the field Digital Signing and click Select. You should get a pop-up where you select the Signature certificate in the dropdown on the top. (make sure to check, the default is probably the authentication certificate).

Selection of the EID certificate

Click OK.

You'll probably be prompted to select an encryption certificate too. Select No there, since the EID certificates can't be used for encryption.

Finally close the account settings window by clicking OK.

 

Test with a signed e-mail

Create a new mail to yourself and in the Security dropdown, select Digitally Sign This Message. Now Send the message. You'll get a pop-up that prompts for your eID pincode.

Enter eID pin code

Enter the pin and click OK.

The message you receive should have a sealed letter with a question mark on it on the right. That's because your e-mail address is not included in the eID certificate, so Thunderbird is not able to verify the security on it's own.

eID signed message

Check certificate.

Check eID certificate

 

Use LibreOffice to sign PDF documents

Now the e-mail signing is nice and fine, but probably not all that useful. You should be aware that your social security number ("rijksregister nummer"), is included in all signed messages and documents. So I personally don't really recommend to spread that info with all your e-mails since you never know where it ends after a few forward of virusses on the receiving end. :)

But as I already mentioned before, you have to configure Thunderbird to be able to sign documents in LibreOffice and that should work now. I'm not gone include all steps there, digital signatures in LibreOffice is properly documented here. When you try to sign a document now, you should have the option to select the signature certificate from your eID:

LibreOffice select eID certificate to sign

If you select the signature certificate and sign, you'll get the pop-up that prompts for your pin again. Afterwards the signature will be listed on the document:

LibreOffice: eID signed document

 

Dat was interessant, Luc. Bedankt! Dat komt nog van pas...

Add new comment

I published the following diary on isc.sans.edu: “How Attackers Brush Up Their Malicious Scripts“:

On Friday, I received a bunch of alerts from one of my YARA hunting rules. Several samples were submitted from the same account (through the VT API), from the same country (US), and in a very short period of time. All the submitted files were OLE2 files containing a malicious macro. All of them had a low VT score so it deserved some investigations. I downloaded the samples and had a look at them… [Read more]

The post [SANS ISC] How Attackers Brush Up Their Malicious Scripts appeared first on /dev/random.

For the past few years, I've examined Drupal.org's contribution data to understand how the Drupal project works. Who develops Drupal? How diverse is the Drupal community? How much of Drupal's maintenance and innovation is sponsored? Where do sponsorships come from?

The report might be of interest even if you don't use Drupal. It provides insights into the inner workings of one of the largest Open Source projects in the world.

This year's report shows that:

  • The recorded number of contributions increased year over year.
  • More and more contributions are sponsored, but volunteer contributions remain important to Drupal's success.
  • Drupal's maintenance and innovation depends mostly on smaller Drupal agencies and Acquia. We don't see many contributions from hosting companies, multi-platform digital agencies, system integrators or end users.
  • Drupal's contributors have become more diverse, but are still not diverse enough.

You can also look at the 2016 report, the 2017 report, the 2018 report, and the 2019 report.

Methodology

What data did we analyze?

We looked at all Drupal.org issues marked "closed" or "fixed" in the 12-month period from July 1, 2019 to June 30, 2020. This for Drupal core and all contributed projects, across all major versions of Drupal.

What are Drupal.org issues?

Each "Drupal.org issue" tracks an idea, feature request, bug report, task, or more. It's similar to "issues" in GitHub or "tickets" in Jira. See https://www.drupal.org/project/issues for the list of all issues.

What are Drupal.org credits?

In the spring of 2015, I proposed some ideas for how to give credit to Drupal contributors. A year later, Drupal.org added the ability for contributors to attribute their work to an organization or customer sponsor, or mark it the result of volunteer efforts.

Example issue credit on drupal org
A screenshot of an issue comment on Drupal.org. You can see that jamadar worked on this patch as a volunteer, but also as part of his day job working for TATA Consultancy Services on behalf of their customer, Pfizer.

Drupal.org's credit system is unique and groundbreaking within the Open Source community. It provides unprecedented insights into the inner workings of a large Open Source project. There are a few limitations with this approach, which we'll address at the end of this report.

What is the Drupal community working on?

In the 12-month period between July 1, 2019 and June 30, 2020, 31,153 issues were marked "closed" or "fixed", a 13% increase from the 27,522 issues in the 2018-2019 period. This averages out to 85 issues marked "closed" or "fixed" each day. This is compared to 75 issues in 2018-2019.

In total, the Drupal community worked on 4,195 different Drupal.org projects this year compared to 3,474 projects in the 2017-2018 period — a large 20% year-over-year increase. I attribute the larger than normal growth to the Drupal 9 release.

Time period Number of issues "fixed" or "closed" by day Number of projects worked on
2017 - 2018 67 3,229
2018 - 2019 75 3,474
2019 - 2020 85 4,195

The majority of the credits are the result of work on contributed modules:

A pie chart showing contributions by project type: most contributions are to contributed modules.

Compared to the previous period, contribution credits increased across all project types:

A graph showing the year over year growth of contributions per project type: contributions to modules grew the most.

It is nice to see the "non-product credits" grow. More and more members in the community track credits for non-product contributions. These include organizing Drupal events, presenting at Drupal events, promoting Drupal, mentoring, and more. While some of these increases reflect new contributions, others are existing contributions that are newly reported. The fact that the credit system is becoming more accurate in recognizing more types of Open Source contributions is both important and positive.

Who is working on Drupal?

For this report's time period, Drupal.org's credit system received contributions from 8,303 different individuals and 1,216 different organizations. We saw a 2.5% decline in individual contributors, but a 7% increase in organizational contributors.

A graph showing the number of individual and organizational contributors year over year.

Consistent with previous years, approximately 50% of individual contributors received one credit. Meanwhile, the top 30 contributors (the top 0.4%) account for 20% of the total credits. In other words, a small number of individuals do the majority of the work.

Starting last year, I weighted each credit based on the adoption of the project the credit is attributed to. For example, each contribution credit to Drupal core is given a weight of 10 because Drupal core has about 1 million active installations. Credits to the Webform module, which has over 470,000 installations, get a weight of 4.7. And credits to Drupal's Commerce project get 0.6 points, as it is installed on around 60,000 sites.

The idea is that these weights capture the end user impact of each contribution, but also act as a proxy for the effort required to get a change committed. Getting a change accepted in Drupal core is both more difficult and more impactful than getting a change accepted to a much smaller, contributed project.

This weighting is far from perfect, but so is the unweighted view. For code contributions, the weighted chart may be more accurate than a purely unweighted approach. I included both charts:

A graph showing the top 30 individual contributors ranked by the volume of their contributions.
A graph showing the top 30 individual contributors ranked by the impact of their contributions.

No matter how you look at the data, all these individuals put an incredible amount of time and effort into Drupal.

It's important to recognize that most of the top contributors are sponsored by an organization. We value the organizations that sponsor these remarkable individuals. Without their support, it could be more challenging to contribute.

How much of the work is sponsored?

When people contribute to Drupal, they can tag their contribution as a "volunteer contribution" or a "sponsored contribution". Contributions can be marked both volunteer and sponsored at the same time (shown in jamadar's screenshot near the top of this post). This could be the case when a contributor does paid work for a customer, in addition to using unpaid time to add extra functionality or polish.

For those credits with attribution details, 15% were "purely volunteer" (8,429 credits). This is in stark contrast to the 69% that were "purely sponsored" (37,399 credits). Put simply, roughly two-thirds of all contributions are "purely sponsored".

A graph showing how many contributions are voluntary vs sponsored: two-thirds of the contributions are sponsored.

This is the first time in Drupal's history that "purely volunteer" contributions stayed flat year over year. This might be related to COVID-19; coding sprints are harder to organize, people may have lost income, parents are busy home-schooling their children, people have Zoom-fatigue, and times are generally stressful. In contrast, we did see a very large increase in "purely sponsored" contributions.

Volunteer contribution remains very important to Drupal. Volunteers contribute across all areas of the project. A lot of volunteer time and energy goes towards non-product related contributions such as event organization, mentoring, and more.

A graph showing how many of the contributions are volunteered vs sponsored.

Who is sponsoring the work?

Now that we've established that the majority of contributions are sponsored, let's study which organizations contribute to Drupal. While 1,216 organizations contributed to Drupal, 50% of them received four credits or less. The top 30 organizations (roughly the top 2.5%) account for approximately 30% of the total credits. This means that the top 30 companies play a crucial role in the health of the Drupal project.

Similar to the individual contributors, I've ranked organizations by both "unweighted contributions" and "weighted contributions". Unweighted scores are based solely on volume of contributions, while weighted scores also try to take into account both the effort and impact of each contribution.

A graph showing the top 30 organizational contributors ranked by the volume of their contributions.
A graph showing the top 30 organizational contributors ranked by the impact of their contributions.

If you are an end user looking for a company to work with, these are some of the companies I'd work with first. Not only do they know Drupal well, they also help improve your investment in Drupal. If you are a Drupal developer looking for work, these are some of the companies I'd apply to first.

A variety of different types of companies are active in Drupal's ecosystem:

Category Description
Traditional Drupal businesses Small-to-medium-sized professional services companies that primarily make money using Drupal. They typically employ fewer than 100 employees. Because they specialize in Drupal, many of these companies contribute frequently and are a huge part of our community. Examples are Third & Grove, Srijan, PreviousNext, MD Systems, etc.
Digital marketing agencies Larger full-service agencies that have marketing-led practices using a variety of tools, typically including Drupal, Adobe Experience Manager, Sitecore, WordPress, etc. Many of these larger agencies employ thousands of people. Examples are Wunderman, Possible, and Mirum.
System integrators Larger companies that specialize in bringing together different technologies into one solution. Example system integrators are Accenture, TATA Consultancy Services, EPAM Systems, and CI&T.
Hosting companies Examples are Acquia, Pantheon, and Platform.sh, but also Rackspace or Bluehost.
End users Examples are Pfizer or bio.logis Genetic Information Management GmbH.

A few observations:

  • Most of the sponsors in the top 30 are traditional Drupal businesses with fewer than 50 employees. With the exception of Acquia, Drupal's maintenance and innovation largely depends on these small Drupal businesses.
  • The larger, multi-platform digital marketing agencies are barely contributing to Drupal. Only one digital marketing agency shows up in the top 30: Intracto. Hardly any appear in the entire list of contributing organizations. I'm frustrated that we have not yet found the right way to communicate the value of contribution to these companies. We need to incentivize these firms to contribute with the same commitment that we see from traditional Drupal businesses.
  • The only system integrator in the top 30 is CI&T. CI&T is a smaller system integrator with approximately 2,500 employees. We see various system integrators outside of the top 30, including EPAM Systems, Globant, Capgemini, Publicis Sapient, Accenture, and TATA Consultancy Services. Accenture and Wipro, despite doing quite a bit of Drupal work, did not receive any credits.
  • Various hosting companies make a lot of money with Drupal, yet only Acquia appears in the top 30 with 1,823 credits. The contribution gap between Acquia and other hosting companies remains very large. It was great to see that Pantheon tripled its contributions from 43 to 122 this period. Platform.sh earned 23 credits compared to 22 in the last period. In general, there is a persistent problem with hosting companies not contributing back.
  • We only saw two end users in the top 30 this year: Thunder (815 credits) and Pfizer (201 credits). Many end users contribute though: European Commission (290 credits), bio.logis (219 credits), Google (144), University of Waterloo (111 credits), Johnson & Johnson (93 credits), University of British Columbia (91 credits), University of Texas at Austin (74 credits), NBCUniversal (48 credits), Workday (38 credits), PayPal (17 credits), and many more.
A graph showing that Acquia is by far the number one contributing hosting company.
A graph showing that CI&T is by far the number one contributing system integrator.

I often recommend end users to mandate contributions from their partners. Pfizer, for example, only works with agencies that contribute back to Drupal. The State of Georgia started doing the same; they made Open Source contribution a vendor selection criteria. If more end users took this stance, it could have a big impact on Drupal. We'd see many more digital agencies, hosting companies, and system integrators contribute to Drupal.

While we should encourage more organizations to sponsor Drupal contributions, we should also understand and respect that some organizations can give more than others — and that some might not be able to give back at all. Our goal is not to foster an environment that demands what and how others should give back. Instead, we need to help foster an environment worthy of contribution. This is clearly laid out in Drupal's Values and Principles.

How diverse is Drupal?

Supporting diversity and inclusion is essential to the health and success of Drupal. The people who work on Drupal should reflect the diversity of people who use the web.

I looked at both the gender and geographic diversity of Drupal.org contributors.

Gender diversity

Only 10-11% of the recorded contributions were made by contributors who do not identify as men. This is a very small improvement compared to last year. The gender imbalance in Drupal is profound. We need to continue fostering diversity and inclusion in our community.

A graph showing contributions by gender: 72% of the contributions come from people who identify as male.

Two years ago I wrote a post about the privilege of free time in Open Source. It made the case that Open Source is not a meritocracy. Not everyone has equal amounts of free time to contribute. For example, research shows that women still spend more than double the time as men doing unpaid domestic work, such as housework or childcare. This makes it more difficult for women to contribute to Open Source on an unpaid, volunteer basis. Organizations capable of giving back should consider financially sponsoring individuals from underrepresented groups to contribute to Open Source.

A graph that shows that compared to males, female contributors do more sponsored work, and less volunteer work.
Compared to men, women do more sponsored work, and less volunteer work. We believe this is because men have the privilege of more free time.

Free time being a privilege is just one of the reasons why Open Source projects suffer from a lack of diversity. Other reasons include hostile environments and unconscious biases. We should consider collecting data on other systemic issues beyond gender. The Drupal Association is currently working to update demographic data collected at DrupalCon, and beyond, with the goal of better understanding our community. Knowing more about these trends could help us close existing gaps.

Geographic diversity

We saw individual contributors from six continents and 117 countries. The top countries:

A graph showing the top 20 contributing countries in 2020.
The top 20 countries from which contributions originate. The data is compiled by aggregating the countries of all individual contributors behind each issue. Note that the geographical location of contributors doesn't always correspond with the origin of their sponsorship. Wim Leers, for example, works from Belgium, but his funding comes from Acquia, which has the majority of its customers in North America. Wim's contributions count towards Belgium as that is his country of residence.

Europe contributes more than North America in both absolute and relative terms.

A graph that shows most contributions in 2020 come from Europe and North America.
A graph showing which continent contributes the most by looking at the number of inhabitants.
Contribution credits per capita calculated as the amount of contributions per continent divided by the population of each continent. 0.001% means that one in 100,000 people contribute to Drupal. In North America, almost 4 in 100,000 people contributed to Drupal the last year.

Asia, South America, and Africa remain big opportunities for Drupal; their combined population accounts for 6.3 billion out of 7.5 billion people in the world.

Limitations of the credit system

It is important to note a few of the current limitations of Drupal.org's credit system:

  • The credit system doesn't capture all code contributions. Parts of Drupal are developed on GitHub rather than Drupal.org. Contributions on GitHub usually aren't credited on Drupal.org. For example, Drush is maintained on GitHub instead of Drupal.org, and companies like Pantheon don't get credit for that work.
  • The credit system is not used by everyone. There are many ways to contribute to Drupal that are still not captured in the credit system. Technically, that work can be captured. But because using the credit system is optional, many contributors don't. For example, not all event organizers and speakers capture their work in the credit system. As a result, contributions often have incomplete or no contribution credits. Where possible, we should automatically capture credits. For example, translation efforts on https://localize.drupal.org are not currently captured in the credit system, but could be automatically.
  • The credit system doesn't accurately value complexity and quality. One person might have worked several weeks for just one credit, while another person might receive a credit for 10 minutes of work. Each year we see a few individuals and organizations trying to game the credit system. In this post, I used a basic weighting system based on project adoption. In future, we should consider refining that by looking at issue priority, patch size, number of reviews, etc. This could help incentivize people to work on larger and more important problems and save smaller issues such as coding standards improvements for new contributor sprints.

Because of these limitations, the actual number of contributions and contributors could be much higher than what we report.

Like Drupal itself, the Drupal.org credit system needs to continue to evolve. Starting this year, the Drupal Association, with the direction of the newly formed Contribution Recognition Committee, will start to evolve and leverage the credit system in new ways.

Conclusions

Our data confirms that Drupal is a vibrant community full of contributors who are constantly evolving and improving the software. It's amazing to see that just in the last year, Drupal welcomed more than 8,000 individual contributors and over 1,200 corporate contributors. It's especially nice to see the growing number of contributions year over year.

To grow and sustain Drupal, we should support those that contribute to Drupal and find ways to get those that are not contributing involved in our community. Improving diversity within Drupal is critical, and we should welcome any suggestions that encourage participation from a broader range of individuals and organizations.

November 07, 2020

November 06, 2020

Met clouddiensten zoals Google Docs, Office 365 of Collabora Online kun je met meerdere personen tegelijk aan een document werken, maar de server heeft toegang tot de inhoud van het document. Dat is nodig voor de werking, zou je denken, maar niets is minder waar: met CryptPad kan het ook zonder dat de server kan meekijken.

CryptPad gebruikt end-to-end encryptie

CryptPad is een opensource (AGPLv3) realtime collaborative editor voor het web. Je kunt hiermee dus samen met anderen aan teksten werken, maar uniek is dat dit end-to-end encryptie gebruikt. Daardoor kan zelfs de server waarop CryptPad draait je data niet inzien: alle encryptie gebeurt client-side in de webbrowser van de gebruikers. Dat betekent ook dat CryptPad je documenten niet kan herstellen als je je wachtwoord vergeet.

Je kunt gratis gebruikmaken van de server op cryptpad.fr om de software te evalueren. Een gratis account aanmaken volstaat; je hoeft zelfs geen e-mailadres op te geven. De beschikbare opslag is in principe beperkt tot 50 MB, maar momenteel is dat tijdelijk verhoogd tot 1 GB om thuiswerken vanwege COVID-19 te ondersteunen. Voor meer opslagruimte kun je bijbetalen, waarmee je dan ook de ontwikkeling van het project steunt, die gebeurt door het Franse bedrijf XWiki SAS. Uiteraard kun je ook je eigen CryptPad-server opzetten, al dan niet via Docker.

De functionaliteit is uiteraard niet te vergelijken met de hierboven vermelde clouddiensten, maar voor eenvoudige documenten werkt CryptPad verrassend goed. CryptPad ondersteunt ook Markdown-syntax, en daarmee kun je tekst, presentaties en zelfs polls aanmaken. Allemaal volledig end-to-end versleuteld. Wil je meer weten? Lees dan mijn artikel over CryptPad in Linux Magazine waarin ik meer aandacht schenk aan de mogelijkheden.

As mentioned earlier here, Google checks YouTube API usage and can cancel a project/ API key if there are no API requests for 90 days. Based on the fact that earlier post received more hits the last week and people asking on the WordPress support forum, I went back to the drawing board code editor and added logic for LYTE’s cached YouTube API responses to expire after 2 months, causing somewhat regular requests to YouTube which should keep Google happier with the API usage.

Obviously if you have page caching (which you should) this can have an impact as well, as a cached page will not result in LYTE “seeing” the request, so the cached YouTube data would not get refreshed even if older then 2 months. Then again having such aggressive page caching would likely cause other issues (nonces in forms becoming invalid and such), so I *think* the one month margin (results cached for 2 months whereas Google wants activity in 90 days) should suffice.

For those who don’t like the cache to expiry of if you want more or less then 2 months; I added  2 filters allowing you to tweak with a bit of code. Returning false to lyte_ytapi_check_cache will make LYTE function as before (no cache expiry) and the cache expiry threshold can be changed using the lyte_ytapi_cache_gracetime filter.

And like blogposts concerning LYTE, here’s a video to show it action: Yves Tumor with “Gospel for a New Century”. Weird stuff I admit (you have been warned), but good weird really …

YouTube Video
Watch this video on YouTube.

November 05, 2020

I published the following diary on isc.sans.edu: “Did You Spot “Invoke-Expression”?“:

When a PowerShell script is obfuscated, the deobfuscation process is, most of the time, performed through the Invoke-Expression cmdlet. Invoke-Expression evaluates the string passed as an argument and returns the results of the commands inside the string… [Read more]

The post [SANS ISC] Did You Spot “Invoke-Expression”? appeared first on /dev/random.

November 03, 2020

... Why do you have to be so effing difficult about a YouTube API project that is used for a single event per year?

FOSDEM creates 600+ videos on a yearly basis. There is no way I am going to manually upload 600+ videos through your webinterface, so we use the API you provide, using a script written by Stefano Rivera. This script grabs video filenames and metadata from a YAML file, and then uses your APIs to upload said videos with said metadata. It works quite well. I run it from cron, and it uploads files until the quota is exhausted, then waits until the next time the cron job runs. It runs so well, that the first time we used it, we could upload 50+ videos on a daily basis, and so the uploads were done as soon as all the videos were created, which was a few months after the event. Cool!

The second time we used the script, it did not work at all. We asked one of our key note speakers who happened to be some hotshot at your company, to help us out. He contacted the YouTube people, and whatever had been broken was quickly fixed, so yay, uploads worked again.

I found out later that this is actually a normal thing if you don't use your API quota for 90 days or more. Because it's happened to us every bloody year.

For the 2020 event, rather than going through back channels (which happened to be unavailable this edition), I tried to use your normal ways of unblocking the API project. This involves creating a screencast of a bloody command line script and describing various things that don't apply to FOSDEM and ghaah shoot me now so meh, I created a new API project instead, and had the uploads go through that. Doing so gives me a limited quota that only allows about 5 or 6 videos per day, but that's fine, it gives people subscribed to our channel the time to actually watch all the videos while they're being uploaded, rather than being presented with a boatload of videos that they can never watch in a day. Also it doesn't overload subscribers, so yay.

About three months ago, I started uploading videos. Since then, every day, the "fosdemtalks" channel on YouTube has published five or six videos.

Given that, imagine my surprise when I found this in my mailbox this morning...

Google lies, claiming that my YouTube API project isn't being used for 90 days and informing me that it will be disabled

This is an outright lie, Google.

The project has been created 90 days ago, yes, that's correct. It has been used every day since then to upload videos.

I guess that means I'll have to deal with your broken automatic content filters to try and get stuff unblocked...

... or I could just give up and not do this anymore. After all, all the FOSDEM content is available on our public video host, too.

November 02, 2020

Toen ik de laatste letter van de laatste pagina van “De Opwindvogelkronieken” had gelezen, vroeg ik me af wat ik nu eigenlijk gelezen had.

Toen Haruki Murakami begin 1992 als gastdocent in Princeton in de Verenigde Staten ging wonen, had de herdenking van 50 jaar Pearl Harbor net plaatsgevonden, was het land onder Bush Sr. in de eerste video-spelletjes oorlog met Irak verwikkeld en werd het 2de seizoen van Twin Peaks uitgezonden (waar de schrijver, zo bevestigde hij in het nawoord, elke dinsdagavond naar keek).

In die bijzondere context begon Murakami aan wat “De Opwindvogelkronieken” zou worden, een 3-delige roman van meer dan 800 pagina’s over een gewone man die eerst zijn kat en dan zijn vrouw moet zoeken in verschillende werkelijkheden/ dromen, die daarbij in contact komt met vreemde personages wiens verhalen raakvlakken vertonen met zijn leven en die zo hoofdrolspeler wordt in een strijd tussen goed en kwaad.

Wat ik nu eigenlijk precies heb gelezen weet ik nog steeds niet 100% zeker, maar dat het een (magisch-realistische) trip was staat buiten kijf. Zelfs de feitjes-mens in mij was tevreden, want ik had een hele kluif aan de hoofdstukken die over de Japanse bezetting van Mantsjoerije (China) en de oorlogen met China en de USSR in de jaren ’30 van de 20ste eeuw gingen.

Une dizaine de votes. C’est ce qui a permis à Georges Bush de devenir président face à Al Gore, vice-président sortant, en 2000. Que serait devenu le monde si la dizaine de votes avait, au contraire, fait peser la balance en faveur d’Al Gore ? Aurions-nous eu Obama et Trump ? Google et Facebook ?

En 2000, dans certains cantons de Floride, la méthode de vote consiste à percer un trou à côté de son candidat. Malheureusement, les trous ne sont parfois pas clairement marqués (un morceau de papier reste attaché, les fameux « hanging chads »). De plus, les trous ne sont parfois pas alignés avec le bon candidat. Certains candidats anecdotiques feront des scores étonnants, car leur trou se révèle très proche du nom « Al Gore ». Face à ces incertitudes, un recomptage est inévitable.

Naïve et tellement sûre de sa victoire en Floride (ce qui s’avérera mathématiquement exact), l’équipe d’Al Gore choisit de la jouer en « gentleman », faisant confiance au recomptage et au processus démocratique. L’équipe de Georges Bush décide de ne pas respecter ces règles tacites, intimidant les recompteurs, jouant de la pression médiatique pour empêcher le recomptage. Le recomptage doit être interrompu pour éviter une escalade dans les tensions que déchainent les républicains. Georges Bush est déclaré vainqueur des petits cantons contestés et donc de la Floride et donc des États-Unis d’Amérique ! L’histoire est incroyablement racontée par Jane Mcalevey qui était justement chargée du recomptage et qui a vu la situation déraper, a tenté d’agir, mais s’est fait reprendre à l’ordre, car Al Gore voulait garder de la dignité.

https://jacobinmag.com/2020/10/trump-coup-florida-2000-recount

L’élection de Georges Bush marque peut-être la fin d’un semblant de dignité dans le débat politique. Elle démontre que l’on peut mentir, tricher et gagner sans scrupules. Le CEO de Diebold, fournisseur de machines de votes électroniques, avait d’ailleurs déclaré qu’il ferait tout ce qui était en son pouvoir pour faire gagner Bush. Dans certains endroits où le vote électronique était de mise, Bush devait même obtenir plus de votes que d’habitants. Al Gore a préféré perdre dignement que de se lancer dans un combat acharné. Au grand désarroi d’une jeunesse acquise à Al Gore et qui manifestera sa déception sur Internet avec le slogan « Not My President » (20 ans plus tard, la comparaison avec Trump ferait passer Bush pour un intellectuel progressiste !).

Tout les coups sont permis. Une leçon que les démocrates n’avaient toujours pas assimilée en 2016, année où Trump remporta la même Floride alors que les votes anticipés avaient donné à Hillary Clinton un avantage mathématiquement insurmontable.

https://www.palmerreport.com/opinion/rigged-election-hillary-clintons-early-voting-lead-florida-mathematically-insurmountable/114/

Les démocrates semblent accepter un jeu de dupes où la seule manière de l’emporter n’est pas de gagner l’élection, mais de la gagner suffisamment pour que les tricheries républicaines ne soient pas suffisantes. Seul Obama y parviendra. Notons que 2004 est la seule élection où les républicains remportent le vote populaire depuis 1988. Mais l’équipe de Biden ne se laissera certainement pas faire en cas de résultat serré entre lui et Trump.

https://fivethirtyeight.com/features/a-contested-2020-election-would-be-way-worse-than-bush-v-gore/

Al Gore président

Imaginons un moment qu’Al Gore ne se soit pas laissé faire. Qu’il soit devenu président. Le monde aurait-il été fondamentalement différent ?

Devenu président en janvier 2001, Al Gore décide de lancer l’économie des États-Unis sur les rails du développement durable : panneaux solaires, éoliennes. Il veut faire des États-Unis la première puissance mondiale sur le marché de l’écologie.

Les attentats du 10 septembre 2001 modifient largement l’ambiance qui règne dans le pays. Le cabinet d’Al Gore déclare un programme militaire appelé : « Peace on Earth ». L’objectif ? Pacifier les zones où naissent les pulsions terroristes. Des militaires américains débarquent en Afghanistan. Certains conseillers proposent une présence militaire accrue au Koweït et en Irak, mais Al Gore veut étouffer économiquement ces pays en faisant baisser le prix du baril de pétrole. Certains conseillers militaires se désolent. Ils veulent une « War on Terror » et pensent que les militaires ne sont pas là pour appliquer un programme de hippie.

Cette stratégie n’a pas les effets escomptés : le pétrole se consomme comme jamais. La classe moyenne américaine souffre d’une économie qui n’est pas entièrement prête pour la transition. Certes, l’emploi est au beau fixe, mais les républicains entretiennent l’idée que les taxes n’ont jamais été aussi hautes. De plus, la popularité des démocrates chez les militaires est en chute libre.

En 2003, l’entreprise Google fait faillite. Sous la conduite de la secrétaire d’État Hillary Clinton, le gouvernement américain a déclaré inconstitutionnelle l’exploitation des données privées à des fins publicitaires. Hillary Clinton n’a pas eu le choix : des journalistes ont en effet révélé qu’elle était en pourparlers secrets pour que Google aide le gouvernement américain à mettre en place un système d’espionnage généralisé des citoyens afin de lutter contre le terrorisme. Dans l’opposition, le parti républicain n’a pas laissé passer cette opportunité de démontrer que les démocrates sont un parti de riches qui espionne et exploite les pauvres. La bulle Internet de 2000 finit de se dégonfler pour que les démocrates puissent se racheter une conscience morale. Seules les entreprises Amazon et Microsoft semblent tirer leur épingle du jeu.

En 2004, Al Gore se fait réélire de justesse, mais la popularité des démocrates est en chute libre. La baisse d’émission du CO2 s’est accompagnée d’une baisse de l’emploi. Les Américains n’ont jamais été aussi endettés.

En 2008, un républicain d’à peine 50 ans devient le premier président noir des États-Unis. Michael Steele est conservateur, opposé à l’avortement et, surtout, il nie le réchauffement climatique. Il a mené sa campagne sur Twitter, un réseau social par SMS qui a réussi à négocier avec Apple pour obtenir une place sur l’écran du tout nouvel iPhone. Steve Jobs ne veut pas d’installation d’applications non Apple, mais un accord a été trouvé : Apple est devenu un actionnaire majoritaire de Twitter. Twitter est automatiquement fourni avec chaque iPhone.

https://en.wikipedia.org/wiki/Michael_Steele

Comme vice-président, Steele a choisi un autre républicain conservateur, plus expérimenté et plus âgé : Herman Cain.

https://fr.wikipedia.org/wiki/Herman_Cain

Deux hommes noirs à la maison blanche. Le parti républicain devient le parti de l’intégration. Le parti démocrate est perçu comme un parti de riches blancs qui militent pour l’écologie au détriment de l’économie et du bien être des classes populaires. En 2012, Hillary Clinton tente de faire basculer l’élection en jouant sur le droit des femmes et le féminisme. L’idée est bonne, mais Hillary Clinton n’est pas la bonne personne. Le féminisme devient, comme l’écologie, une forme de blague récurrente, une manière pour les républicains de pointer du doigt ces démocrates déconnectés de la réalité. Michael Steele le clame lors d’un discours de campagne un peu avant sa réélection :

« Mesdames, êtes-vous vraiment à plaindre en Amérique ? Que voulez-vous de plus ? Nous vous adorons ? Vous avez le meilleur rôle près de nos enfants ! Je vous le demande : qu’est-ce qui est plus important ? Empêcher la température d’augmenter d’un dixième de degré et faire en sorte que les homosexuels se marient ? Ou bien s’assurer que chaque Américain et chaque Américaine aie un travail, un salaire et de quoi nourrir ses enfants ? Chaque parti a ses priorités, vous connaissez les miennes… »

En 2016, le parti démocrate poursuit son virage à gauche avec Bernie Sanders et Elizabeth Warren qui s’affrontent durant les primaires. Bernie Sanders est plus populaire sur Internet, mais le parti pousse Warren, plus modérée et plus jeune. Elle devient la première femme présidente des États-Unis.

https://fr.wikipedia.org/wiki/Elizabeth_Warren

Warren l’emporte face à un Mitt Romney qui peine à sortir d’une image d’homme blanc riche, exactement la caricature que Steele faisait des démocrates. Romney a fait l’erreur de miser une grosse partie de sa campagne sur le réseau social TheFacebook qui est très populaire dans les universités. Mais, contrairement à Twitter, il n’est pas disponible sur l’iPhone, uniquement sur les BlackBerry. Il touche donc beaucoup moins les classes populaires. TheFacebook a également des soucis de trésorerie. Le projet n’est pas rentable, le précédent Google enterre toute tentative de monétisation des données. Les investisseurs sont sur le point de quitter le bateau. La startup Instagram a été rachetée par Apple qui semble étendre son hégémonie sur tout l’Internet mobile. Un procès pour abus de position dominante est en cours.

https://fr.wikipedia.org/wiki/Mitt_Romney

En 2020, Elizabeth Warren joue sa réélection dans une situation tendue. L’épidémie de COVID-19 a fait plus de 80.000 morts et les républicains l’accusent de ne pas avoir géré la crise correctement. Elle a hérité du bourbier afghan, passé sous silence dans les médias durant les années Steele, et n’est pas du tout populaire face aux militaires qui réclament un recentrage sur le pays. D’un point de vue économique, le monopole Apple a été démantelé comme AT&T en son temps. La Silicon Valley est remplie de petites entreprises qui fonctionnent bien. Le chômage diminue chaque année. Mais peu de ces entreprises sont cotées en bourse. Le SP500, qui reste noyauté par les grosses industries du passé, est en chute libre. Les démocrates ont beau tenter d’expliquer que le SP500 est un indicateur du passé, peine perdue. Warren a face à elle un Paul Ryan aux dents particulièrement longues. Présenté comme le « Kennedy républicain », ce catholique fait des ravages chez les immigrés, les noirs et les populations plus religieuses. Il promet de redresser l’économie et de sortir de ce qu’il appelle une « présidente hippie déconnectée des réalités ».

https://fr.wikipedia.org/wiki/Paul_Ryan

En filigrane, la planète retient son souffle. Ryan va-t-il mettre à mal les décennies d’effort pour sensibiliser les nations au réchauffement climatique ? Les États-Unis vont-ils abandonner complètement leur rôle de gendarme du monde, laissant les Russes et les Chinois se développer en Afrique ?

La question est importante. Comme tous les quatre ans, le destin de la planète semble se jouer entre une poignée d’électeurs dans un obscur canton de Floride…

Photo par JD Lasica.

Je suis @ploum, ingénieur écrivain. Abonnez-vous pour recevoir mes billets par mail ou RSS, partagez mes écrits autour de vous autour de vous et soutenez-moi en achetant mes livres. Commandez Printeurs, mon dernier roman de science-fiction..

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

November 01, 2020

bsdbike

I recently installed FreeBSD on my raspberry-pi 2 to use it as my firewall.

The FreeBSD version that I installed was a FreeBSD 12.2 Pre-Release. FreeBSD 12.2 has been released this week.

ARM is a Tier-2 on FreeBSD. This means that freebsd-update doesn’t work on a Raspberry Pi.

Freebsd-update wouldn’t work on a Pre-Release anyway. So I was looking for a way to update my Raspberry Pi to FreeBSD 12.2.

Lucky I found this blog post on how to install/update FreeBSD on a Raspberry Pi from the source code.

I never did the famous “make world” on FreeBSD, so this was a nice excuse to try it out. Compiling FreeBSD 12.2 on a Raspberry Pi 2 will probably take forever, so I’ll use an x86 system to cross-compile FreeBSD for the Raspberry Pi.

I decided to first update my test x86 FreeBSD test system to 12.2 from the source code. This system was outdated anyway still running FreeBSD 12.0.

If the upgrade went fine, I’d continue with the upgrade on my Raspberry Pi 2 using my FreeBSD test system to cross-compile FreeBSD.

Prepare host

Bootenv

It is always a good idea to create a new boot environnment before an upgrade if you use OpenZFS as your filesystem on FreeBSD.

Create a new boot environment.

root@freebsd:/usr/src # bectl create 12.0-RELEASE-p13
root@freebsd:/usr/src # 

List.

root@freebsd:/usr/src # bectl list
BE               Active Mountpoint Space Created
default          NR     /          2.94G 2019-05-07 19:53
12.0-RELEASE-p13 -      -          8K    2020-10-31 10:53
root@freebsd:/usr/src # 

Upgrade /usr/src

To compile the FreeBSD source code … you need the source. FreeBSD uses subversion as the source code management system.

Try to update it…

My test system has “/usr/src” installed, but this didn’t seem to be an svn repository.

root@freebsd:/usr/src # svnlite info /usr/src/
svn: E155007: '/usr/src' is not a working copy
root@freebsd:/usr/src # 

Snapshot and remove

So I decided to create a ZFS snapshot (just in case) and remove the directory.

root@freebsd:/usr # cd /usr/src/
root@freebsd:/usr/src # ls
.arcconfig		README.md		rescue
.arclint		UPDATING		sbin
.gitattributes		bin			secure
.gitignore		cddl			share
COPYRIGHT		contrib			stand
LOCKS			crypto			sys
MAINTAINERS		etc			targets
Makefile		gnu			tests
Makefile.inc1		include			tools
Makefile.libcompat	kerberos5		usr.bin
Makefile.sys.inc	lib			usr.sbin
ObsoleteFiles.inc	libexec
README			release
root@freebsd:/usr/src # rm -rf * .*
root@freebsd:/usr/src # ls -la
root@freebsd:/usr/src # 

Checkout

Checkout the FreeBSD version that you want to compile.

root@freebsd:/usr/src # svnlite checkout https://svn.freebsd.org/base/releng/12.2/ .

Compile

make world

Run make world.

root@freebsd:/usr/src #  make -j4 buildworld buildkernel

Install

Install the new kernel.

root@freebsd:/usr/src # make installkernel

Reboot your system.

root@freebsd:/usr/src # reboot
Connection to freebsd closed by remote host.
Connection to freebsd closed.
[staf@vicky ~]$ 

Install the new userland.

root@freebsd:/usr/src # make installworld

And reboot your system.

root@freebsd:/usr/src # reboot
Connection to freebsd closed by remote host.
Connection to freebsd closed.
[staf@vicky ~]$ 

merge config

Mergemaster is a tool to merge the configuration files on FreeBSD.

root@freebsd:/usr/src # mergemaster -Ui

The upgrade on the x86 system went fine, so let’s continue to use it to cross-compile FreeBSD for the Raspberry Pi.

Raspberry pi

backup

I created a backup of the sd-card, before the upgraded.

[root@vicky pifire001]# dd if=/dev/sdg of=pifire001_16g_freebsd12_prelease.dd bs=1M  status=progress
15917383680 bytes (16 GB, 15 GiB) copied, 739 s, 21.5 MB/s 
15193+1 records in
15193+1 records out
15931539456 bytes (16 GB, 15 GiB) copied, 741.519 s, 21.5 MB/s
[root@vicky pifire001]# sync
[root@vicky pifire001]# 

make world

make clean

I already used “/usr/src” to compile FreeBSD for x86. For this reason, a make cleanworld is probably a good idea.

root@freebsd:/usr/src # make cleanworld
rm -rf /usr/obj/usr/src/amd64.amd64/*
chflags -R 0 /usr/obj/usr/src/amd64.amd64/
rm -rf /usr/obj/usr/src/amd64.amd64/*
root@freebsd:/usr/src # 

build world

We will cross-compile FreeBSD.

The Raspberry Pi 2 uses the armv7 32 bits architecture.

The UBLDR_LOADADDR=0x2000000has to be setup, this is a requirement for the U-boot bootloader on the Raspberry Pi.

root@freebsd:/usr/src # make -j4 TARGET_ARCH=armv7 UBLDR_LOADADDR=0x2000000 buildworld

build kernel

root@freebsd:/usr/src # make -j4 TARGET_ARCH=armv7 KERNCONF=RPI2 buildkernel

mount sdcard

find

Plugin your sd-card and try to find it.

root@freebsd:~ # geom disk list
Geom name: vtbd0
Providers:
1. Name: vtbd0
   Mediasize: 21474836480 (20G)
   Sectorsize: 512
   Mode: r2w2e3
   descr: (null)
   ident: (null)
   rotationrate: unknown
   fwsectors: 63
   fwheads: 16

Geom name: cd0
Providers:
1. Name: cd0
   Mediasize: 0 (0B)
   Sectorsize: 2048
   Mode: r0w0e0
   descr: QEMU QEMU DVD-ROM
   ident: (null)
   rotationrate: unknown
   fwsectors: 0
   fwheads: 0

Geom name: da0
Providers:
1. Name: da0
   Mediasize: 15931539456 (15G)
   Sectorsize: 512
   Mode: r0w0e0
   descr: Generic STORAGE DEVICE
   ident: (null)
   rotationrate: unknown
   fwsectors: 63
   fwheads: 255

root@freebsd:~ # 

Mount

Mount the root slice to /mnt.

root@freebsd:~ # mount /dev/da0s2a /mnt
root@freebsd:~ # 

Install kernel

Install the kernel to the sd-card

root@freebsd:/usr/src # make -j4 TARGET_ARCH=armv7 KERNCONF=RPI2 DESTDIR=/mnt installkernel

Install the required configuration files, that are required for a make install.

root@freebsd:~ # mergemaster -p -A armv7 -D /mnt

install world

root@freebsd:/usr/src # make -j4 TARGET_ARCH=armv7 DESTDIR=/mnt installworld

Install the new configuration file on sd-card ( -i will install the files that don’t exit automatically, -F will install the new file if only the FreeBSD header is different).

root@freebsd:~ # mergemaster -iF -A armv7 -D /mnt

Umount and boot

Umount the sd-card, and put it into your Raspberry Pi.

root@freebsd:~ # umount /mnt

Boot the Raspberry Pi and verify that it’s running the correct FreeBSD version.

staf@pifire001:~ $ uname -a
FreeBSD pifire001 12.2-RELEASE FreeBSD 12.2-RELEASE r367195 RPI2  arm
staf@pifire001:~ $ freebsd-version
12.2-RELEASE
staf@pifire001:~ $ 

Have fun!

Links

October 30, 2020

I published the following diary on isc.sans.edu: “Quick Status of the CAA DNS Record Adoption“:

In 2017, we already published a guest diary about “CAA” or “Certification Authority Authorization”. I was curious about the status of this technique and the adoption level in 2020. Has it been adopted massively since this diary? The initial RFC describing CAA has been issued in 2013 (RFC6844). Since 2019, it is obsolete and has been replaced by RFC8659. Just a quick reminder about the purpose of this DNS record. It is used to specify which certificate authority(ies) (CAs) is(are) allowed to issue certificates for a domain… [Read more]

The post [SANS ISC] Quick Status of the CAA DNS Record Adoption appeared first on /dev/random.

If you follow my blog for a while, you probably noticed that I’m not really active with new content. Most articles are published through the SANS ISC Website but it does not mean I don’t have content to publish. It’s just a question of time like many of us!

Recently, I listened to an interesting conversation in a SOC (“Security Operation Center“). The topic was about assigning more development time to the SOC engineers to process the number of pending alerts. In a SOC, it’s important to rotate tasks across available people like first-line, ongoing investigations, hunting, and… development/maintenance of the platform (tools, processes, playbooks, etc)

About automation, it’s a key element in processing data collected by the SOC. We are all lazy people and recurrent tasks are boring to perform. After all, we are facing huge amounts of data generated by computers, why not use computers to handle it? I like “automation”! I like the fact that you can automate everything to, while drinking your morning coffee, review what has been processed during the night and, more important, what deserves more investigation. A perfect example of this process is malware triage. You collect samples from multiple sources, parse them, extract the payload, perform basic checks, label it, and notify only if something “juicy” is detected:

Example of Automation Flow

Another scenario to implement more automation is the processing of “Alerts”. When an alert is received, you have to acknowledge it and start investigating it. Let’s take a practical example with TheHive, a popular tool used in SOCs. When an alert is received and relevant, a case is created with many observables (IP addresses, hashes, domains, files, etc). The key feature of TheHive is the link to Cortex instance that allows us to search for observables across a long list of analyzers that query online services. For example, an IP address will be tested against blocklists, passive DNS services. The first automation that can be implemented here is to automatically run analyzers against freshly added observables. TheHive can do this perfectly through webhooks. Great! When the SOC engineer opens the case, observables have already been enriched:

Example of IP address Enrichment

This kind of automation is nice because it speeds up the investigations, optimizes the engineer’s time, and avoids “fatigue”.

Problems arise when an extension of automation is suggested to face a (too) huge amount of data to process. If you need more automation to process alerts received daily in your SOC then you’re facing an issue. If you have one rule in your SIEM that generates 150 alerts/day (just an example), the rule is probably not optimized and should be reviewed.

Do we need to automate or to reduce the noise? Both! Automation is a key point and must be used but the noise reduction must be applied as soon as possible in the data flow. Automation should not be used as a counter-measure to manage a flood of alerts…

The post To Automate or To Reduce the Noise? appeared first on /dev/random.

October 29, 2020

Quelques liens et conseils de lecture pour réfléchir sur notre rapport à l’autre, à la peur et à notre désir de sécurité.

La peur et la fiction

Moi qui n’accroche que rarement à la fantasy, je suis en train de dévorer une préversion d’« Adjaï aux mille visages » dont le crowdfunding se termine bientôt (et qui a grand besoin de votre soutien). Je le conseille chaudement !

https://fr.ulule.com/adjai/

D’ailleurs, si vous avez raté la campagne Printeurs, vous pouvez en profiter pour vous rattraper. 20€ pour le livre Printeurs en version papier et les versions électroniques d’Adjaï et de Printeurs, tome 2 (que je dois encore écrire). Vous aurez aussi la possibilité de recevoir les chapitres de Printeurs 2 par mail au fur et à mesure de l’écriture !

https://fr.ulule.com/adjai/?reward=660832

Sous le couvert d’une palpitante histoire de voleuse amorale qui change d’apparence et de sexe à volonté, Adjaï explore le concept d’identité, de fluidité de genre et de parentalité. Mais un autre aspect revient régulièrement (notamment dans une scène qui fera sourire les rôlistes chevronnés) : celui de la peur de l’autre, de la peur de l’inconnu et de l’insécurité.

Une peur complètement irrationnelle qui nous pousse vers les comportements les plus dangereux. Une peur le plus souvent attisée par les auteurs de fiction, car… c’est plus facile pour faire avancer l’histoire.

https://slate.com/technology/2020/10/cory-docotorow-sci-fi-intuition-pumps.html

Un exemple parmi tant d’autres : notre peur du nucléaire est complètement absurde, surtout quand on compare le nombre de morts et les dégâts causés par les alternatives au nucléaire (le charbon, notamment, mais le solaire et l’éolien restent beaucoup plus dangereux que le nucléaire). Mais c’est une peur qui a été nourrie par une quantité impressionnante de science-fiction au sortir d’Hiroshima.

https://sceptom.wordpress.com/2014/08/25/la-vraie-raison-pour-laquelle-certains-detestent-le-nucleaire-brave-new-climate/

Comme le souligne Cory Doctorrow plus haut, les auteurs de science-fiction ont une réelle responsabilité. Ursula Le Guin enfonçait le clou il y a quelques années : on a besoin d’écrivains qui savent faire la différence entre écrire et faire un produit qui se vend bien. Je pense qu’Adjaï est un exemple magnifique de livre qui nous ouvre à la différence.

https://parkerhiggins.net/2014/11/will-need-writers-can-remember-freedom-ursula-k-le-guin-national-book-awards/

L’intuition et la peur

Il faut bien avouer qu’il est difficile de lutter contre une peur intuitive (prendre l’avion) tout en risquant notre vie tous les jours sans réfléchir (prendre la voiture). C’est le piège de l’intuition.

https://ploum.net/mon-second-velo-et-le-piege-de-lintuition/

Karl Popper le résume magnifiquement dans son « Plaidoyer pour l’indéterminisme ».

« Je considère l’intuition et l’imagination comme extrêmement importantes : nous en avons besoin pour inventer une théorie. Mais l’intuition, précisément parce qu’elle peut nous persuader et nous convaincre de la vérité de ce que nous avons saisi par son intermédiaire, peut nous égarer très gravement : elle est une aide dont la valeur est inappréciable, mais aussi un secours qui n’est pas sans danger, car elle tend à nous rendre non critiques. Nous devons toujours la rencontrer avec respect et gratitude, et aussi avec un effort pour la critique très sévèrement. »

La sécurité et l’intuition

L’intuition est rarement aussi mise à mal que lorsqu’on parle de sécurité.

Pour tenter d’analyser les mesures de sécurité, j’ai mis en place un framework dit des « 3 piliers ». Le principe est simple : toute mesure qui n’améliore pas l’un des piliers n’est pas sécuritaire. Elle est au mieux inutile, au pire nuisible.

https://ploum.net/les-3-piliers-de-la-securite/

L’exemple le plus frappant : les militaires en rue ? Phénomène dont je me moquais à outrance dans la nouvelle « Petit manuel d’antiterrorisme ».

https://ploum.net/petit-manuel-dantiterrorisme/

Une autre mesure absurde qui fait pire que bien ? Les contrôles dans les aéroports.

https://www.vox.com/2016/5/17/11687014/tsa-against-airport-security

Oh, et vous savez quoi ? L’espionnage de toutes nos communications pendant plus d’une décennie, un espionnage dénoncé par Snowden et qui lui vaut, aujourd’hui encore, de devoir se cacher. Et bien ça n’a servi à rien. Pas un prout de terroriste n’a été empêché.

https://tutanota.com/blog/posts/nsa-phone-surveillance-illegal-expensive/

Les abus et la sécurité

Servi à rien ? C’est vite dit. Parce que c’est notamment grâce à ce programme et cette volonté politique post-11 septembre que Google existe. Comme le raconte Shoshana Zuboff dans « The Age of Surveillance Capitalism », les pratiques de Google, qui préfiguraient l’analyse des données à des fins publicitaires, ont failli être interdites en 2001. Puis le 11 septembre a eu lieu. Et les services secrets américains se sont tournés vers Google en disant : « On vous laisse espionner tout le monde à la condition que vous nous aidiez à faire pareil. »

https://en.wikipedia.org/wiki/The_Age_of_Surveillance_Capitalism

Le tout grâce à des recherches financées par les mêmes institutions publiques quelques années plus tôt.

https://qz.com/1145669/googles-true-origin-partly-lies-in-cia-and-nsa-research-grants-for-mass-surveillance/

Dans un tout autre registre, la bande dessinée « Inhumain », du trio Bajram/Mangin/Rochebrune illustre à quel point la sécurité absolue est le pire des cauchemars. Des navigateurs spatiaux s’écrasent sur une planète occupée par une tribu humaine amicale, bienveillante et totalement soumise au « Grand Tout ». Sans être un chef-d’œuvre, la lecture est plaisante (je suis un homme simple. Je vois Bajram sur la couverture, j’achète sans discuter).

https://www.bajram.com/livres/inhumain/

La résistance et les abus

Lire, c’est résister. C’est peut-être pour cela que les plateformes qui promeuvent réellement la lecture sont désormais illégales. Heureusement, Orel Auwen vous invite pour une petite visite guidée.

https://serveur410.com/dans-lombre-dinternet-des-bibliotheques-illegales/

J’espère de tout cœur que Printeurs et Aïdja aux mille visages seront rapidement disponibles sur ces plateformes !

Bonne fin de semaine et bonnes lectures. Car, si vous ne prenez pas le temps de lire, vous n’avez pas le temps de résister.

Photo by Apollo Reyes on Unsplash

Je suis @ploum, ingénieur écrivain. Abonnez-vous pour recevoir mes billets par mail ou RSS, partagez mes écrits autour de vous autour de vous et soutenez-moi en achetant mes livres. Commandez Printeurs, mon dernier roman de science-fiction..

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

October 27, 2020

This should be a very short blog post, but long enough to justify a blog post instead of a 'tweet' : I had myself a small issue with mitogen plugin in our Ansible infra.

To cut a long story short, everybody knows that ansible relies on ssh as transport. So one can use traditional ~/.ssh/config tuning to declare ProxyJump for some hosts, etc

But when you use mitogen (we do), in the official doc there is a mention of specific parameter for connection delegation : mitogen_via

The simple example on the webpage seems trivial and if you have multiple hosts that need to be configured from remote ansible+mitogen combo, using mitogen would speed things up as it would know about the host topology.

That's what I thought when having a look at the simple inventory on that web page:

[dc2]
web1.dc2
web2.dc2
web3.dc2

[dc2:vars]
mitogen_via = bastion.dc2

Sounds easy but when I tried quickly to use mitogen_via , something that I thought would be obvious in fact wasn't. My understanding was that mitogen would automatically force agent forwarding when going through the bastion host. A simple ansible -m ping (let's assume web1.dc2 in their example) returned me :

web1.dc2 | UNREACHABLE! => {
    "changed": false,
    "msg": "error occurred on host bastion.dc2: SSH authentication is incorrect",
    "unreachable": true
}

Well, we can see from the returned json that it was trying to pass through bastion.dc2 and that's confirmed on web1.dc2 :

Oct 28 15:52:36 web1.dc2 sshd[12913]: Connection closed by <ip_from_bastion.dc2> port 56728 [preauth]

Then I thought about something that was obvious to me but that mitogen (just reusing underlying ssh) doesn't do automatically : Forwarding the ssh agent to the nodes behind.

We can easily solve that with one simple ansible parameter : ansible has the ansible_ssh_common_args and ansible_ssh_extra_args parameters, specific to the SSH connection

So what about we force Agent Forward just on that bastion host and see how that works ? That means that in our inventory (but can go to host_vars/bastion.dc2 too) we just have to add parameter:

bastion.dc2 ansible_ssh_extra_args='-o ForwardAgent=yes'

Let's try again :

web1.dc2 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    },
    "changed": false,
    "ping": "pong"
}

Good, so we can push that for our bastion hosts (used in inventory for mitogen_via) in host_vars or group_vars and call it a day. The reason why I prefer using ansible_ssh_extra_args is that it will merge and add settings, in case you have already something like this in your ansible.cfg :

[ssh_connection]
ssh_args =

I like the logic that we don't need to modify ~/.ssh/config with all exceptions to reflect the infra layout but we can just reflect it in ansible inventory

Acquia Engage took place last week. For the first time in seven years, it was an all-virtual event.

Dries standing in a virtual conference lobby.
The virtual conference lobby of Acquia Engage, modeled after our Boston office's lobby.

The best way to learn about what Acquia has been up to, is to watch the recording of my opening keynote. In 30 minutes, I cover 10 major updates to Acquia's Digital Experience Platform. We packed the presentation with short product demos. You can also download a copy of my slides (65 MB), but you won't get to see the demos.

Acquia Drupal Cloud updates

First, I talked about new features for Acqiua's Drupal Cloud. All features are focused on helping developers migrate, develop, design and launch Drupal sites faster.

I covered the following new features for Acquia's Drupal Cloud:

  • Acquia Migrate: A family of products that help you migrate to Drupal 9 five times faster and easier.
  • Acquia Cloud IDE: A cloud-based development environment optimized for Drupal and Acquia.
  • Acquia CMS: An easy, out-of-the-box distribution of Drupal 9. It comes pre-integrated with Acquia's products.
  • Acquia Site Studio Page Builder: A new page builder for Acquia's low-code/no-code website building tool. It's optimized for marketers and content creators.
  • Acquia Cloud Next: A container-based cloud hosting environment optimized for speed, scale and security.

Acquia Marketing Cloud updates

Next, I covered new Marketing Cloud features. Marketers today are using more and more tools to get their jobs done. Unfortunately, many of these tools are not well-integrated. This lack of integration results in siloed customer information and inefficient marketing. Ultimately these silos lead to poor customer experiences. Acquia Marketing Cloud solves these problems by eliminating these silos. We combine or unify customer data profiles, segments, analytics, and machine learning capabilities into a single, easy-to-use platform.

Dries delivering his presentation in front of a virtual audience

New announcements for Acquia's Marketing Cloud include:

  • Unified real-time user profiles: Aggregates customer actions across platforms into profiles in real-time. Use them instantly in marketing campaigns.
  • Universal segments: Use consistent segments across every tool within Acquia Marketing Cloud. A segment created in our Customer Data Platform (CDP) automatically becomes available in our website personalization product and multi-channel marketing automation solution.
  • 360ยบ marketing analytics: Measures marketing campaign effectiveness across the Acquia Marketing Cloud.
  • "Predictive sends" machine learning model: Uses machine learning to predict the best time to send campaign emails.
  • COVID-19 dashboard: Helps you understand your customers' shift from offline to online, as well as changes in channel preferences, product preferences and opportunities for growth.

Closing words

I'm proud that Acquia is innovating faster than ever before. I want to thank our product and engineering teams for working incredibly hard in the midst of a pandemic.

October 26, 2020

Ce que la crise du coronavirus exemplifie à l’extrême est un problème qui gangrène nos institutions depuis plusieurs années : le fait que les décisions sont prises à l’intuition par une minorité. Que la communication et l’affect aient désormais plus d’importance que la rationalité et les faits. Bref, que tout se décide désormais au doigt mouillé.

Contre cette tendance, les spécialistes et les scientifiques ne peuvent pas lutter. En effet, un véritable scientifique commencera toujours par affirmer qu’il y’a beaucoup de choses qu’il ne sait pas. Qu’il n’est certain de rien. Qu’il faut tester des hypothèses. Bref, qu’il faut faire preuve d’humilité.

Humilité qui nécessite une érudition, une expertise : la seule chose que je sais c’est que je ne sais rien. Humilité qui peut permettre de convaincre les individus, mais qui n’est malheureusement pas « médiatique ».

https://cenestquunetheorie.wordpress.com/2020/05/27/methode-4-lhumilite-epistemique-la-clef-pour-convaincre-ethiquement/

Au contraire, lorsqu’on n’a pas étudié un domaine pendant des années, il est tellement simple d’avoir l’impression que l’on sait, de confondre intuition, opinion et décision. De croire que la réalité se plie face à nos certitudes. La certitude est l’apanage des ignorants.

C’est, depuis des millénaires, le fonds de commerce des religions. Enseigner qu’une croyance a plus d’importance que l’observation de la réalité. C’est la raison pour laquelle j’affirme haut et fort que les discours « anti-science » et toutes les formes de foi sont d’une prétention infinie : cela revient à dire que l’on est détenteur d’une vérité unique et absolue. Bref que l’on est plus intelligent que tous les humains passés, présents et futurs.

https://ploum.net/la-science-na-pas-reponse-a-tout/

Cette perversion mentale est particulièrement flagrante chez les politiciens qui n’essaient même pas de prendre des décisions sensées, mais pour qui, de par le fonctionnement de nos démocraties, jaugent toute action à l’aulne de sa popularité, entrant de ce fait dans une boucle de résonnance avec leur propre public, attisant les idéologies extrêmes.

Cette victoire de l’idéologie sur la philosophie, nous en avons un exemple historique sous les yeux avec le déclin intellectuel de l’Islam aux alentours de l’an 1200. Alors que l’Europe nageait dans l’obscurantisme religieux, le monde arabe, concentré sur son expansion commerciale plutôt que militaire, brillait par ses philosophes, ses scientifiques. Jusqu’au jour où d’obscures sectes musulmanes ont pris le pouvoir et ont décidé que le Coran (où du moins l’interprétation qu’en faisait une clique de potentats) était la seule source de vérité.

https://www.thenewatlantis.com/publications/why-the-arabic-world-turned-away-from-science

La crise du coronavirus nous démontre à quel point nos politiciens sont, par construction de notre système, ineptes. Les réseaux sociaux les trompent en leur faisant croire qu’ils sont en contact avec la population, qu’ils comprennent les gens, qu’ils sont populaires. Ce mensonge n’est qu’un artefact technologique qui, sous prétexte d’optimiser les revenus publicitaires de quelques entreprises, enferme une minorité dans une bulle de résonnance hyperaddictive, mais décorrélée de la réalité.

https://ploum.net/le-mensonge-des-reseaux-sociaux/

Une réalité qui est qu’aujourd’hui encore, une quantité non négligeable de la population (principalement paupérisée et peu connectée) ne sait pas ce qu’est le covid. Bien sûr, on préfère oublier cela. La bulle médiatique n’est pas le reflet de la réalité, mais ses addicts, dont l’immense majorité des politiciens, tentent de transformer la réalité pour qu’elle corresponde à leurs croyances. Un phénomène qui n’est rien d’autre qu’une forme de religiosité, nourrissant l’idéologie plutôt que la raison.

Mais le coronavirus n’est qu’un révélateur. Et les politiciens ne sont qu’un exemple des plus extrêmes. Dans les entreprises privées, la majorité des managers et des CEO prend désormais des décisions intuitives, rapides et sans aucun moyen d’en mesurer les effets. Une mesure ne semble pas avoir l’effet escompté ? Plutôt que de la remettre en question on prend cela comme un signal qu’il faut l’appliquer encore plus fort. Un effet positif se dégage ? On prend cela comme un confirmation qu’il faut l’appliquer… encore plus fort.

Sans les réseaux sociaux et les médias de masse, les décisions devraient être pensées et réfléchies, car il serait hors de question de les modifier trop souvent. Nul n’est censé ignorer la loi. Chaque loi devrait donc également être diffusée, atteindre la population.

L’ère de la connexion donne aux politiciens la croyance qu’ils peuvent changer d’avis plusieurs fois par jour. Le nombre de likes leur fait croire qu’une multitude les soutient, que tout le monde est au courant. Pire : que pour continuer à être visible, il est souhaitable de changer les règlements régulièrement, d’apporter de la nouveauté.

Nous gérons nos pays et nos entreprises sur le modèle des sites web rentabilisés par la publicité : faire du clic, faire du buzz, faire de statistiques. Il n’est plus un commerce, plus une association qui ne cherche à optimiser son nombre de visiteurs et ses likes sur Facebook sans que cela soit positivement corrélé avec son chiffre d’affaires.

Les CEOs des très grosses entreprises n’ont d’ailleurs rien à craindre. Ils font tout pour ne pas mesurer l’impact de leurs décisions. La société fait de l’argent ? C’est grâce à eux et ils auront un bonus. La société n’en fait pas : c’est une mauvaise exécution des employés. Au pire, le CEO sera démis de ses fonctions avec un parachute doré. Il est désormais avéré que les CEOs ne font pas mieux que des décisions aléatoires. Leurs bonus mirobolants ne récompensent donc aucun risque, aucune compétence, mais sont de facto une rente sur le copinage.

Les scientifiques ne sont évidemment pas en reste. La recherche s’est transformée en une course à la publication. Les résultats incertains sont immédiatement transformés en titres sensationnalistes. Les codes sources sont très rarement partagés, la reproductibilité est nulle. Quand, tout simplement, l’idéologie ne prend pas le pas sur la méthode scientifique.

Exemple frappant : deux économistes à tendance très conservatrice ont choisi de démontrer que l’endettement d’un pays arrêtait sa croissance. Ce papier, incroyablement influent, inventa le concept d’austérité dont les Grecs et de nombreux Européens furent les victimes.

Mais afin d’établir le lien entre déclin de croissance et endettement, les auteurs se contentèrent d’établir une moyenne de plusieurs pays. Méthodologiquement, le principe de tirer une généralité sur une moyenne est complètement faux. Pour s’en convaincre, il suffit de s’imaginer que si Jeff Bezos rentre dans un stade bondé, chaque spectateur est en moyenne multimillionnaire.

La méthodologie est donc fausse. Mais même en l’admettant, le résultat ne démontre rien. En moyenne, les pays endettés de plus de 90% ont une croissance de près de 3%. C’est en revoyant les calculs que des chercheurs ont découvert qu’une erreur de la formule dans Excel ne prenait pas tous les pays en compte.

https://theconversation.com/the-reinhart-rogoff-error-or-how-not-to-excel-at-economics-13646

Mais nul ne s’est trop penché dessus, car, idéologiquement, la décision de l’austérité était intuitive. L’austérité ne fonctionne pas et n’est justifiée que par une erreur de calcul. On continue de l’appliquer car personne n’osera prendre la décision inverse.

Aujourd’hui, on découvre que la manière la plus efficace et la moins chère de lutter contre la pauvreté est de… donner de l’argent aux pauvres. De fournir un logement décent aux sans-abris. Cela fonctionne. Au Canada, une étude a montré que donner 7500$ à des sans-abris était en moyenne suffisant pour les tirer de la misère. Que ceux qui avaient reçu de l’argent dépensaient 34% en moins que les autres en drogues et alcools. Que ça coutait moins cher que de les héberger dans un centre.

https://edition.cnn.com/2020/10/09/americas/direct-giving-homeless-people-vancouver-trnd/index.html

Malheureusement, tout cela va à l’encontre de l’idéologie selon laquelle « tout salaire doit être mérité par un travail » (nonobstant le fait que les riches « font travailler leur argent »). Naïvement, on pourrait croire que lutter contre la pauvreté fait l’unanimité. Ce n’est pas le cas.

Les gauchistes et écologistes ne sont pas épargnés par ce misérabilisme intellectuel. Un exemple des plus frappants en est le rejet du nucléaire. Le nucléaire est, à ce jour l’énergie la plus propre, la plus sûre jamais inventée. L’effet nocif des radiations en cas d’accident est des millions de fois moins important que l’effet nocif, avéré et permanent, de la pollution de l’air par les centrales à charbon. Cependant, ces 20 dernières années, nous avons augmenté notre dépendance au charbon par simple rejet irrationnel du nucléaire. Et je n’aborde même pas la mouvance antivaccins.

Comme le résume Vaclav Smil : « Les gens n’ont rien à faire du monde réel ».

https://www.transitionsenergies.com/vaclav-smil-les-gens-nen-ont-rien-a-faire-du-monde-reel/

L’idéologie avant la raison et l’intuition avant les faits sont les pires des gestions. Le monde s’en accommodait grâce à une tendance naturelle au progrès. Mais la pandémie fait éclater au grand jour l’incompétence épistémique de nos institutions politiciennes.

Mais plutôt que de rejeter tout en bloc, de tomber dans le populisme, je vous invite à réfléchir à la voie de la modération. Oui, le port du masque partout est absurde. Mais le masque reste utile. Le couvre-feu est une atteinte à nos libertés. Mais peut-être que c’est une mesure qui peut avoir un impact important. Apprenons l’humilité que nos décideurs ne peuvent pas se permettre d’afficher.

Le 21ème siècle doit être le siècle de la prise de décision rationnelle et consciente. De l’acceptation que toute mesure doit être mesurée, doit être remise en question régulièrement et qu’il n’est pas de posture morale plus élégante pour un politicien que de dire « Je me suis trompé, changeons de cap ».

À ce titre, je me réjouis de lire « Vaincre les épidémies » de Didier Pittet et Thierry Crouzet.

https://tcrouzet.com/2020/10/22/la-voix-de-la-sagesse-dans-la-crise-covid/

Et n’oubliez pas que consulter les malheurs du monde en boucle peut avoir un impact néfaste sur votre santé. C’est justement ce qui arrive dans la dernière nouvelle (drôle) de Valéry Bonneau que je vous invite à lire en guise de conclusion.

https://www.valerybonneau.com/nouvelles-noires/tako-tsubo

Si nous pouvons retenir une chose des milliers de morts du Coronavirus c’est que la politique du doigt mouillé ne fonctionne pas et que les certitudes idéologiques sont les premières causes de mortalité et de souffrance. Que l’éducation est notre seul espoir. Que les immenses progrès scientifques et philosophiques de notre époque sont nés de la lecture des livres, pas des tweets.

https://www.calnewport.com/blog/2020/06/27/on-the-exceptionalism-of-books-in-an-age-of-tweets/

Vous savez ce qui vous reste à faire : coupez Facebook, Twitter et la presse. Entrez dans la résistance, ouvrez un livre !

Bonnes lectures et bonne semaine.

Photo by Karl JK Hedin on Unsplash

Je suis @ploum, ingénieur écrivain. Abonnez-vous pour recevoir mes billets par mail ou RSS, partagez mes écrits autour de vous autour de vous et soutenez-moi en achetant mes livres. Commandez Printeurs, mon dernier roman de science-fiction..

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

October 25, 2020

We now invite proposals for developer rooms for FOSDEM 2021. Invitations to submit proposals for other elements of the event will follow in the next couple of weeks. FOSDEM offers open source and free software developers a place to meet, share ideas and collaborate. Renowned for being highly developer-oriented, the event brings together some 8000+ geeks from all over the world. The twenty-first edition will take place Saturday 6th and Sunday 7th February 2021, online. Developer rooms are assigned to self-organising groups to work together on open source and free software projects, to discuss topics relevant to a broader舰

Updated @ Mon Nov 16 08:16:30 PM CET 2020: Corrected the version when OPNsense dropped 32 bits support.

pifire

I was using OPNsense on my pcengines alix firewall and was quite happy with it.

The alix 2d13 is a nice motherboard with a Geode CPU, it has a 32 bits x86 instruction set. I migrated to OPNsense from pfSense when pfSense dropped 32 bits support.

Unfortunately, OPNsense also dropped support for 32 bits CPU’s in the 19.1.7 release 20.7 release. I decided to install FreeBSD on the alix to use it as my firewall. But I need a temporary firewall solution so I can install FreeBSD on my alix board. I have a Raspberry PI 2 that I wasn’t using.

You’ll find my journey to use my RPI2 as my firewall below.

flashingw500

Install FreeBSD

ARM is a Tier 2 architecture on FreeBSD. Tier 2 architectures are less mature and aren’t supported as well. FreeBSD-update isn’t supported on a Tier 2 architecture for example.

Pkgbase can be an alternative to update FreeBSD on ARM. But I didn’t try this (yet).

Download FreeBSD

Links to latest downloads are available at: https://wiki.freebsd.org/arm/Raspberry%20Pi. Download the latest image and verify the checksum.

[staf@snuffel ~/Downloads]$ sha256 FreeBSD-12.2-PRERELEASE-arm-armv7-RPI2-20200910-r365545.img.xz
SHA256 (FreeBSD-12.2-PRERELEASE-arm-armv7-RPI2-20200910-r365545.img.xz) = e2987f1ae57db48719d484af293fbcc80e944c2dd30c7d3edfae4ac62d8dc3e3
[staf@snuffel ~/Downloads]$ grep e2987f1ae57db48719d484af293fbcc80e944c2dd30c7d3edfae4ac62d8dc3e3 CHECKSUM.SHA256-FreeBSD-12.2-PRERELEASE-arm-armv7-RPI2-20200910-r365545
SHA256 (FreeBSD-12.2-PRERELEASE-arm-armv7-RPI2-20200910-r365545.img.xz) = e2987f1ae57db48719d484af293fbcc80e944c2dd30c7d3edfae4ac62d8dc3e3

Write the image to your sdcard

After downloading the image, you need to write the image to a sdcard. I execute the steps below on a FreeBSD system.

Find your sdcard

The easiest way to find your sdcard is the geom utility. Execute geom disk list to find the device name of your sd card.

root@snuffel:~ # geom disk list
Geom name: cd0
Providers:
1. Name: cd0
   Mediasize: 0 (0B)
   Sectorsize: 2048
   Mode: r0w0e0
   descr: MATSHITA DVD-RAM UJ862A
   ident: (null)
   rotationrate: unknown
   fwsectors: 0
   fwheads: 0

<snip>

Geom name: da0
Providers:
1. Name: da0
   Mediasize: 7948206080 (7.4G)
   Sectorsize: 512
   Mode: r0w0e0
   descr: Generic STORAGE DEVICE
   lunname: Generic STORAGE DEVICE-4
   lunid: Generic STORAGE DEVICE-4
   ident: 000000000903
   rotationrate: unknown
   fwsectors: 63
   fwheads: 255

root@snuffel:/home/staf/Downloads # 

Write the image to your sdcard

root@snuffel:/home/staf/Downloads # xzcat FreeBSD-12.2-PRERELEASE-arm-armv7-RPI2-20200910-r365545.img.xz | dd of=/dev/da0 status=progress bs=1M
  3220176896 bytes (3220 MB, 3071 MiB) transferred 694.026s, 4640 kB/s
0+370017 records in
3072+0 records out
3221225472 bytes transferred in 694.681604 secs (4636981 bytes/sec)
root@snuffel:/home/staf/Downloads # sync
root@snuffel:/home/staf/Downloads # 

Boot your raspberry-pi

Boot your raspberry-pi.

Update password

The default password for the root account is root. Always a good idea to change the default password.

Changing local password for root
New Password:
Retype New Password:
root@generic:~ # 

Remove the freebsd user

There is default user freebsd, I’ll set my own user. Use rmuser to remove it.

root@pifire001:~ # rmuser freebsd
Matching password entry:

freebsd:******:1001::0:0:FreeBSD User:/home/freebsd:/bin/csh

Is this the entry you wish to remove? y
Remove user's home directory (/home/freebsd)? y
Removing user (freebsd): mailspool home passwd.
root@pifire001:~ #

Create user

Create a user to administer your firewall. Make sure that you add the user to the wheel group. Only users that are in the wheel group are able to use su on FreeBSD.

root@generic:~ # adduser 
Username: staf
Full name: 
Uid (Leave empty for default): 
Login group [staf]: 
Login group is staf. Invite staf into other groups? []: wheel 
Login class [default]: 
Shell (sh csh tcsh nologin) [sh]: 
Home directory [/home/staf]: 
Home directory permissions (Leave empty for default): 
Use password-based authentication? [yes]: 
Use an empty password? (yes/no) [no]: 
Use a random password? (yes/no) [no]: 
Enter password: 
Enter password again: 
Lock out the account after creation? [no]: no
Username   : staf
Password   : *****
Full Name  : 
Uid        : 1002
Class      : 
Groups     : staf wheel
Home       : /home/staf
Home Mode  : 
Shell      : /bin/sh
Locked     : no
OK? (yes/no): yes
adduser: INFO: Successfully added (staf) to the user database.
Add another user? (yes/no): no
Goodbye!
root@generic:~ # 

Set your hostname

On FreeBSD system settings are configure in /etc/rc.conf. sysrc is a handy utility to manage it. Use sysrc hostname=your_hostname to change it.

root@generic:~ # sysrc hostname=pifire001
hostname: generic -> pifire001
root@generic:~ # 

To make hostname active without a reboot use hostname your_hostname.

root@generic:~ # hostname pifire001

Install packages

Install the packages that are required to manage your system. I use ansible to manage my systems; sudo and python are required for ansible.

Install pkg
root@generic:~ # pkg
The package management tool is not yet installed on your system.
Do you want to fetch and install it now? [y/N]: y
Bootstrapping pkg from pkg+http://pkg.FreeBSD.org/FreeBSD:12:armv7/quarterly, please wait...
Verifying signature with trusted certificate pkg.freebsd.org.2013102301... done
Installing pkg-1.15.10...
Extracting pkg-1.15.10: 100%
pkg: not enough arguments
Usage: pkg [-v] [-d] [-l] [-N] [-j <jail name or id>|-c <chroot path>|-r <rootdir>] [-C <configuration file>] [-R <repo config dir>] [-o var=value] [-4|-6] <command> [<args>]

For more information on available commands and options see 'pkg help'.
root@generic:~ # 
Install packages
root@generic:~ # pkg install -y python3 sudo 

sudo

The ansible user will become a member of the wheel group on my network. Use visudo to grant execute permissions to execute commands as root.

root@generic:~ # visudo

I still use passwords for sudo even for the ansible user.

## Uncomment to allow members of group wheel to execute any command
%wheel ALL=(ALL) ALL

Configure the network

Network interfaces

I use two network interface on my firewall. I use the a usb network adapter for the second interface. Please note the internal network interface on the

The network interfaces are - like all system settings configured in /etc/rc.conf on FreeBSD. User sysrc to configure them.

raspberry-pi is also connected over USB.

  • ue0 is connected to my internet router. I use a fixed IP address.
  • ue1 is my internal interface.
root@pifire001:~ # sysrc ifconfig_ue0="inet 192.168.xxx.xxx netmask 255.255.255.0"
ifconfig_ue0: inet 192.168.xxx.xxx netmask 255.255.255.0 -> inet 192.168.xxx.xxx netmask 255.255.255.0
root@pifire001:~ # sysrc ifconfig_ue1="inet 192.168.yyy.yyy netmask 255.255.255.0"
ifconfig_ue1: inet 192.168.yyy.1 netmask 255.255.255.0 -> inet 192.168.yyy.1 netmask 255.255.255.0

There is ifconfig_DEFAULT variable set in the /etc/rc.conf. Remove it with sysrc.

root@pifire001:~ # sysrc ifconfig_DEFAULT=""

Set the default route

Set the default route to your internet connection.

defaultrouter: NO -> 192.168.yyy.1
root@pifire001:/etc # 

restart the network services

Restart netif service to make the network connection active.

root@pifire001:~ # /etc/rc.d/netif restart

Restart the routing to get the default route configured.

root@pifire001:~ # /etc/rc.d/routing restart
delete host 127.0.0.1: gateway lo0
route: route has not been found
delete net default: gateway 192.168.xxx.xxx fib 0: not in table
delete host ::1: gateway lo0
delete net fe80::: gateway ::1
delete net ff02::: gateway ::1
delete net ::ffff:0.0.0.0: gateway ::1
delete net ::0.0.0.0: gateway ::1
add host 127.0.0.1: gateway lo0
add net default: gateway 192.168.xxx.xxx
add host ::1: gateway lo0
add net fe80::: gateway ::1
add net ff02::: gateway ::1
add net ::ffff:0.0.0.0: gateway ::1
add net ::0.0.0.0: gateway ::1
root@pifire001:~ # 

Enable routing

FreeBSD doesn’t route the network by default, the net.inet.ip.forwarding system variable needs to be set. This can be enabled with the gateway_enable variable in /etc/rc.conf, execute sysrc gateway_enable="YES"` to set it.

root@pifire001:~ # sysrc gateway_enable="YES" 
gateway_enable: NO -> YES

To enable routing set the net.inet.ip.forwarding variable to 1 with sysctl.

root@pifire001:~ # sysctl net.inet.ip.forwarding
net.inet.ip.forwarding: 0
root@pifire001:~ # sysctl net.inet.ip.forwarding=1
net.inet.ip.forwarding: 0 -> 1
root@pifire001:~ # sysctl net.inet.ip.forwarding 
net.inet.ip.forwarding: 1
root@pifire001:~ # 

pf

I use pf as my firewall.

Enable pf & logging

To enable pf when the system starts up we need to pf_enable=yes and pflog_enable=yes in /etc/rc.conf. pflog is the logging daemon for the pf firewall.

root@pifire001:~ # sysrc pf_enable=yes
pf_enable: NO -> yes
root@pifire001:~ #  sysrc pflog_enable=yes
pflog_enable: NO -> yes
root@pifire001:~ # 

And start the pflog daemon.

root@pifire001:~ # /etc/rc.d/pflog start
Starting pflog.

firewall rules

Create /etc/pf.conf with your firewall rules. You’ll find the firewall rule I use below.

Some remark on my firewall rules:

  • It’s possible to set a network variable automatically with localnet=$int_if:network but if the interface isn’t configured when pf is started during the setup startup. The firewall rules will not be loaded.
# set external / internal interface
ext_if="ue0"
int_if="ue1"

# set network ranges
# localnet=$int_if:network
localnet="{ 192.168.xxx.0/24 }"
private_addresses="{10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16}"
mgmt_systems="{192.168.xxx.10/32}"
firewall_internal_ips="{ 192.168.xxx.xxx/32}"
firewall_external_ips="{ 192.168.yyy.4}"
none_routeable="{127.0.0.0/8, 192.168.0.0/16, 172.16.0.0/12, \
	      10.0.0.0/8, 169.254.0.0/16, 192.0.2.0/24, \
	      0.0.0.0/8, 240.0.0.0/4 }"

firewall_tcp_services = "{ }"
firewall_udp_services = "{ 53, 67, 68 }"

# default block policy, allow lo traffic
set block-policy drop
set skip on lo

# Nat rules need to be defined first
nat on $ext_if from $localnet to any -> ($ext_if)

# block everything by default 
block in log all
block out log all

# dont block the mgmt systems ( - for now -)
pass in quick from $mgmt_systems to any 
pass out quick from $mgmt_systems to any 
pass in quick from $firewall_internal_ips to any 
pass out quick from $firewall_internal_ips to any 
pass out quick from $firewall_external_ips to any 

# allow firewall services
block in quick on $ext_if
block in log quick to $firewall_external_ips
pass in quick on $int_if proto udp to $firewall_internal_ips port $firewall_udp_services
pass in quick on $int_if inet proto icmp icmp-type echoreq
block in log quick to $firewall_internal_ips

# block all access to private_addreses 
block in quick log from any to $private_addresses
block out quick log from any to $private_addresses

# block all non-routeable traffic on the external interface 
block in log quick on $ext_if from $none_routeable to any
block out log quick on $ext_if from any to $none_routeable

# allow outgoing (all allowed - for now - )
pass out quick all keep state

pass in quick on $int_if inet all keep state

# allow localnet traffic
pass from { lo0, $localnet } to any keep state

# allow ping
pass inet proto icmp icmp-type echoreq

Start the pf service

To active the firewall you need to start the pf service.

root@pifire001:~ # /etc/rc.d/pf start

Verify

To display the firewall rules:

  • pfctl -s rules will display the firewall rules
  • pfctl -s nat will display the nat rules.
  • ```pfctl -s states will display the current stateful table.

Firewall rules with logging enabled can be analyzed by monitoring the pflog0 interface with tcpdump.

root@pifire001:~/scripts # tcpdump -n -e -ttt -i pflog0

DNS

I’ll use unbound as my dns server, unbound is a nice dns server/resolver and support dns over tls by default.

install unbound

root@pifire001:/etc # pkg install -y unbound ca_root_nss

Enable sysrc

root@pifire001:/etc # sysrc unbound_enable="YES"

first start

root@pifire001:/etc # /usr/local/etc/rc.d/unbound start

config

# cd /usr/local/etc/unbound/
# 

You’ll need set the interface where unbound will run on.

# vi unbound.conf
        # interface: 2001:DB8::5

        interface: 0.0.0.0

Allow your localnetwork to query the dns server.

        # access-control: ::ffff:127.0.0.1 allow

        access-control: 192.168.xxx.0/24 allow

Enable dns-over-tls, I’ll use quad9 as my dns provider with dns-over-tls.

#       forward-host: fwd.example.com

forward-zone:
  name: "."
  forward-ssl-upstream: yes
  forward-addr: 9.9.9.9@853

Restart ubound to active the settings.

# /usr/local/etc/rc.d/unbound restart
Stopping unbound.
Waiting for PIDS: 61238.
Obtaining a trust anchor...
Starting unbound.

dhcpd

install isc-dhcpd

root@pifire001:~ # pkg install -y isc-dhcp44-server
Updating FreeBSD repository catalogue...
FreeBSD repository is up to date.
All repositories are up to date.
The following 1 package(s) will be affected (of 0 checked):

New packages to be INSTALLED:
	isc-dhcp44-server: 4.4.2_1

Number of packages to be installed: 1

The process will require 6 MiB more space.
1 MiB to be downloaded.
[1/1] Fetching isc-dhcp44-server-4.4.2_1.txz:  24%  312 KiB 319.5kB/s    00:03 E[1/1] Fetching isc-dhcp44-server-4.4.2_1.txz:  87%    1 MiB 835.6kB/s    00:00 E[1/1] Fetching isc-dhcp44-server-4.4.2_1.txz: 100%    1 MiB 659.6kB/s    00:02    
Checking integrity... done (0 conflicting)
[1/1] Installing isc-dhcp44-server-4.4.2_1...
===> Creating groups.
Creating group 'dhcpd' with gid '136'.
===> Creating users
Creating user 'dhcpd' with uid '136'.
[1/1] Extracting isc-dhcp44-server-4.4.2_1: 100%
=====
Message from isc-dhcp44-server-4.4.2_1:

--
****  To setup dhcpd, please edit /usr/local/etc/dhcpd.conf.

****  This port installs the dhcp daemon, but doesn't invoke dhcpd by default.
      If you want to invoke dhcpd at startup, add these lines to /etc/rc.conf:

	    dhcpd_enable="YES"				# dhcpd enabled?
	    dhcpd_flags="-q"				# command option(s)
	    dhcpd_conf="/usr/local/etc/dhcpd.conf"	# configuration file
	    dhcpd_ifaces=""				# ethernet interface(s)
	    dhcpd_withumask="022"			# file creation mask

****  If compiled with paranoia support (the default), the following rc.conf
      options are also supported:

	    dhcpd_chuser_enable="YES"		# runs w/o privileges?
	    dhcpd_withuser="dhcpd"		# user name to run as
	    dhcpd_withgroup="dhcpd"		# group name to run as
	    dhcpd_chroot_enable="YES"		# runs chrooted?
	    dhcpd_devfs_enable="YES"		# use devfs if available?
	    dhcpd_rootdir="/var/db/dhcpd"	# directory to run in
	    dhcpd_includedir="<some_dir>"	# directory with config-
						  files to include

****  WARNING: never edit the chrooted or jailed dhcpd.conf file but
      /usr/local/etc/dhcpd.conf instead which is always copied where
      needed upon startup.
root@pifire001:~ # 

update rc.conf

dhcpd_chuser_enable="YES"		# runs w/o privileges?
dhcpd_withuser="dhcpd"		# user name to run as
dhcpd_withgroup="dhcpd"		# group name to run as
dhcpd_chroot_enable="YES"		# runs chrooted?
dhcpd_devfs_enable="YES"		# use devfs if available?
dhcpd_rootdir="/var/db/dhcpd"	# directory to run in
dhcpd_enable="YES"

configure

Edit /usr/local/etc/dhcpd.conf and update it for your network.

dns

option domain-name "intern.stafnet.local";
option domain-name-servers 192.168.xxx.xxxx, 192.168.xxx,xxx, 192.168.xxx,xxx;

subnet

subnet 192.168.xxx.0 netmask 255.255.255.0 {
  range 192.168.xxx.100 192.168.xxx.254;
  option routers 192.168.xxx.1;
}

fixed ip addresses

host snuffel {
   hardware ethernet XX:XX:XX:XX:XX:XX;
   fixed-address 192.168.xxx.zzz;
}

start

root@pifire001:/usr/local/etc # /usr/local/etc/rc.d/isc-dhcpd start

Have fun!

Links

October 24, 2020

Most home automation systems have a web interface that you can use on your computer or smartphone. However, having to open your laptop or unlock your smartphone before navigating to the right web page creates unnecessary friction. What if you quickly want to see the temperature outside or close the blinds?

The solution is a dedicated device that shows a dashboard. Two years ago I bought a M5Stack Core BASIC Kit: a modular, stackable, ESP32 board with a 2 inch LCD screen, all in a package that doesn't look bad in your living room. I wrote an Arduino sketch to turn it into a dashboard for my MQTT-based home automation system: it could read the temperature and humidity of various sensors in my home by subscribing to the corresponding MQTT messages and showing them on the screen.

However, the result was quite basic, and I never really found some time to expand the system to something more usable. Recently I discovered Homepoint: open source firmware for the ESP32 microcontroller that turns your device into an MQTT dashboard, and one of the devices that it supports is the M5Stack Core. 1

Flashing Homepoint

Just download the latest release of Homepoint, unpack the ZIP file, connect your M5Stack Core to your PC using a USB-C cable and flash the firmware with esptool:

$ esptool.py write_flash -fs 4MB -fm dout 0x0 homepoint_m5stack_full.bin

Once you have flashed the device, it starts a wireless access point, so you can visit its web interface and configure the Wi-Fi settings so it connects to your own network. After this, you just put a JSON file with the configuration of your dashboard on its internal storage, and this can be done using a web interface. So no need to reflash it every time you want to change its configuration. It also supports OTA (over-the-air) updates.

You can add sensors, but also switches and lights that you control with the buttons of the M5Stack Core. All in all, it's just what I needed. I now have my M5Stack Core on a shelf in my living room, showing the temperature and humidity outside, of the bedroom and storage room, of the freezer, cooler and fridge:

/images/homepoint-m5stack-core.jpg

Configuration

The above configuration looks like this:

homepoint/config.json (Source)

{
  "wifi": "SSID",
  "password": "PASSWORD",
  "login": "admin",
  "webpass": "WEBPASSWORD",
  "mqttbroker": "mqtt://192.168.0.125",
  "mqttusername": "MQTTUSER",
  "mqttpasswd": "MQTTPASSWORD",
  "timezone": "CET-1CEST-2,M3.5.0/02:00:00,M10.5.0/03:00:00",
  "scenes": [{
    "name": "Freezer",
    "type": "Sensor",
    "devices": [{
      "name": "Temperature",
      "type": "singleValue",
      "jsondata": false,
      "firstIcon": "temperature_small",
      "getTopic": "rtl433/Oregon-THGR122N/1/218/temperature_C"
    },
    {
      "name": "Humidity",
      "type": "singleValue",
      "jsondata": false,
      "firstIcon":"humidity_small",
      "getTopic": "rtl433/Oregon-THGR122N/1/218/humidity"
    }]
  },
  {
    "name": "Cooler",
    "type": "Sensor",
    "devices": [{
      "name": "Temperature",
      "type": "singleValue",
      "jsondata": false,
      "firstIcon": "temperature_small",
      "getTopic": "rtl433/Prologue-TH/2/151/temperature_C"
    },
    {
      "name": "Humidity",
      "type": "singleValue",
      "jsondata": false,
      "firstIcon":"humidity_small",
      "getTopic": "rtl433/Prologue-TH/2/151/humidity"
    }]
  },
  {
    "name": "Fridge",
    "type": "Sensor",
    "devices": [{
      "name": "Temperature",
      "type": "singleValue",
      "jsondata": false,
      "firstIcon": "temperature_small",
      "getTopic": "rtl433/Oregon-THGR122N/1/175/temperature_C"
    },
    {
      "name": "Humidity",
      "type": "singleValue",
      "jsondata": false,
      "firstIcon":"humidity_small",
      "getTopic": "rtl433/Oregon-THGR122N/1/175/humidity"
    }]
  },
  {
    "name": "Outside",
    "type": "Sensor",
    "devices": [{
      "name": "Temperature",
      "type": "singleValue",
      "jsondata": false,
      "firstIcon": "temperature_small",
      "getTopic": "rtl433/Oregon-THGR122N/1/106/temperature_C"
    },
    {
      "name": "Humidity",
      "type": "singleValue",
      "jsondata": false,
      "firstIcon":"humidity_small",
      "getTopic": "rtl433/Oregon-THGR122N/1/106/humidity"
    }]
  },
  {
    "name": "Bedroom",
    "type": "Sensor",
    "devices": [{
      "name": "Temperature",
      "type": "singleValue",
      "jsondata": false,
      "firstIcon": "temperature_small",
      "getTopic": "rtl433/Prologue-TH/1/159/temperature_C"
    },
    {
      "name": "Humidity",
      "type": "singleValue",
      "jsondata": false,
      "firstIcon":"humidity_small",
      "getTopic": "rtl433/Prologue-TH/1/159/humidity"
    }]
  },
  {
    "name": "Storage room",
    "type": "Sensor",
    "devices": [{
      "name": "Temperature",
      "type": "singleValue",
      "jsondata": false,
      "firstIcon": "temperature_small",
      "getTopic": "rtl433/Prologue-TH/3/128/temperature_C"
    },
    {
      "name": "Humidity",
      "type": "singleValue",
      "jsondata": false,
      "firstIcon":"humidity_small",
      "getTopic": "rtl433/Prologue-TH/3/128/humidity"
    }]
  },
  {
    "name": "Raspberry Pi",
    "type": "Sensor",
    "devices": [{
      "name": "Temperature",
      "type": "combinedValues",
      "jsondata": true,
      "firstIcon": "temperature_small",
      "secondIcon": "wattage_small",
      "firstKey": "temperature",
      "secondKey": "disk_use",
      "getTopic": "system-sensors/sensor/pi-red/state"
    }]
  },
  {
    "name": "Bathroom",
    "type": "Light",
    "icon": "door",
    "devices": [{
      "name": "Bathroom light",
      "setTopic": "zwave/Bathroom/Bathroom_light/38/1/0/set",
      "getTopic": "zwave/Bathroom/Bathroom_light/38/1/0",
      "onValue": "99",
      "offValue": "0"
    }]
  }]
}

The first six sensors are all wireless temperature/humidity sensors that transmit their data on the 433.92 MHz frequency band. I use an RTL-SDR stick connected to a Raspberry Pi to receive their transmissions, together with the rtl_433toMQTT project that translates these transmissions to MQTT messages. This uses the rtl_433 project that has more than 150 protocol decoders for various devices.

I have also added an example of another MQTT sensor that shows the temperature and disk usage of one of my Raspberry Pis, collected by the system_sensors project. The last component in the configuration file above is an example of a light switch: it enables me to switch my bathroom light on and off (using ZWave2Mqtt). The setTopic is the MQTT topic to set the value of the light and the getTopic is the MQTT topic to get the value of the light. The values for the on and off states are defined in onValue and ofValue, respectively.

The picture above only shows the six sensors, but with the buttons of the M5Stack Core you can walk through each component until it shows a second screen with the two other components. You can even group components, for instance a group with all devices in a specific room. 2

The perfect MQTT dashboard

All in all I'm quite happy with Homepoint. When I want to see the temperature of one of the sensors defined in the dashboard, I just have to push on one of the buttons to wake up the screen and I can immediately see all sensors. If you're using an MQTT-based home automation system, an M5Stack Core with Homepoint is the perfect companion.

1

The M5Core2 is currently not supported.

2

Homepoint only supports a group with all lights/switches; you can't create a group that contains both lights/switches and sensors.

October 23, 2020

October 21, 2020

Several years ago, I created a list of ESXi versions with matching VM BIOS identifiers. The list is now complete up to vSphere 7.
Your Linux runs on a VMware VM, but on which ESXi version? Even without access to the host nor vCenter, you can see for yourself: run "dmidecode" and look at lines 10, 11 and 12. The BIOS release date, the address and the size are unique for each ESXi version. Look up your result in the following table:
ESXi version  BIOS release date  Address  Size
ESX 2.504/21/20040xE848097152 bytes
ESX 3.004/17/20060xE7C7099216 bytes
ESX 3.501/30/20080xE7910100080 bytes
ESX 408/15/20080xEA6C088384 bytes
ESX 4U109/22/20090xEA55088752 bytes
ESX 4.110/13/20090xEA2E089376 bytes
ESXi 501/07/20110xE72C0101696 bytes
ESXi 5.106/22/20120xEA0C089920 bytes
ESXi 5.507/30/20130xEA05090032 bytes
ESXi 609/30/20140xE9A4091584 bytes
ESXi 6.504/05/20160xEA58088704 bytes
ESXi 6.707/03/20180xEA52088800 bytes
ESXi 6.7 U212/12/20180xEA49088944 bytes
ESXi 7.012/09/20190xEA48088960 bytes
NB These DMI properties are set at boot time. Even if your VM gets live-migrated to a host running a different vSphere version, your VM will keep the values it got from the host it booted on. What you see is the vSphere version of the host your VM booted on. It is the VM power-on that matters, so a guest OS reboot will not regenerate the DMI properties. A guest OS shut down on the other hand will also power off the VM, and the next power-on will regenerate the DMI properties.

October 20, 2020

I published the following diary on isc.sans.edu: “Mirai-alike Python Scanner“:

Last week, I found an interesting Python script that behaves like a Mirai bot. It scans for vulnerable devices exposing their telnet (TCP/23) interface in the wild, then tries to connect using a dictionary of credentials. The script has been uploaded to VT and has a low score of 2/59. Indeed, it does not contain suspicious strings nor API calls. Just a simple but powerful scanner.

Here are the commands injected when a device is found with vulnerable credentials… [Read more]

The post [SANS ISC] Mirai-alike Python Scanner appeared first on /dev/random.

October 17, 2020

I’ve never been into iTunes or Spotify, tuning into online radio-stations instead to satisfy my constant need for musical discovery, excitement and/ or entertainment. For a long time I was an avid KCRW listener, but times change and their eclecticism does not necessarily match mine the way it used to, so over the last couple of years many online streams (Worldwide FM, Nova, TSF Jazz, KCSN, Laurent Garnier’s PBB, …) were added to my favorites which I stored in a draft mail in Gmail of all places, accessing that file on my different devices and -where available- using VLC to play them.

But VLC isn’t available everywhere (hello “smart” TV), it is not great to manage a collections of streams and copy/pasting URL’s from that draft mail is clumsy, so after creating a simple webpage with an HTML5 audio element for my wife to listen to the local “Radio 1 classics” stream on our TV, I decided to extend that to display a list of streams to choose from with a minimum of vanilla JavaScript to do the actual switching and just a dash of CSS (still struggling with vertically aligning multiline titles in those inline-blocks, but I don’t mind that too much. No really, I’m not nervous about that whenever I see it, not at all!).

The result (at https://futtta.be/r/) is an unattractive but pretty usable mp3 stream player that I use on 4 different locations and which I can update easily to accommodate my wife’s knack for doo-wap and xmas-music. Maybe I should add falling snow-flakes to surprise her when we put up the Christmas tree? :-)

October 15, 2020

Dilemma; 3 of 4 sterren? De Bekeerlinge is een verslag van Hertmans’ ontdekkingsreis doorheen de waar gebeurde geschiedenis van een 11de-eeuwse Normandisch meisje dat zich omwille van de liefde bekeerde tot het Jodendom en met haar David op de vlucht slaat temidden van de woelige tijd van de (aanzet tot de) eerste kruistochten. De basis is een bijzonder sterk verhaal, de historische context ook erg interessant, het boek prikkelt de nieuwsgierigheid, maar toch … het geheel is niet meeslepend gebracht, eerder zakelijk. Ik heb De Bekeerlinge graag gelezen, maar vond het niet … virtuoos genoeg, dus toch “slechts” 3 misschien?

Recently I bought a new laptop. The first time I was attending a videoconference with this laptop, my network connection (using a USB Gigabit Ethernet adapter) was very flaky and my external microphone turned itself off all the time. It took me a while before I figured out that both issues had the same cause: USB autosuspend.

Apparently both devices had USB autosuspend enabled, so they turned off after a while. I'm not sure why this is, because I used the same devices on my previous laptop with the same operating system (Ubuntu 20.04 LTS) and I never saw this behaviour. Luckily USB autosuspend can be easily disabled for specific devices.

There are multiple ways to do this, for instance with udev rules. However, in my opinion the power management tool tlp offers the easiest way. If you don't have it already, install it:

$ sudo apt install tlp

Then have a look at the vendor ID and product ID of the USB devices you don't want to autosuspend:

$ lsusb
Bus 002 Device 002: ID 0bda:8153 Realtek Semiconductor Corp. RTL8153 Gigabit Ethernet Adapter
Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 001 Device 002: ID 04f2:b684 Chicony Electronics Co., Ltd Chicony USB2.0 Camera
Bus 001 Device 006: ID 0556:0001 Asahi Kasei Microsystems Co., Ltd AK5370 I/F A/D Converter
Bus 001 Device 003: ID 8087:0029 Intel Corp.
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

Here you see the Gigabit Ethernet adapter (with ID 0bda:8153) on the first line, and the microphone (with ID 0556:0001) on the fourth line.

Now create the file /etc/tlp.d/50-usb-autosuspend-blacklist.conf and add both IDs to the USB_BLACKLIST parameter:

USB_BLACKLIST="0bda:8153 0556:0001"

Then restart the tlp service:

$ sudo systemctl restart tlp

After reconnecting the USB devices, they won't autosuspend anymore and you can happily enjoy your videoconferences again without hardware-related interruptions.

Quelques liens en lien avec ma quête d’écrire pour tracer ma voie, pour laisser ma trace. Mais au fond, quelles traces voulont nous laisser ?

Être écrivain

Orel Auwen m’a interviewé pour son blog. Au menu, quelques explications sur l’historique du projet Printeurs, sur ma vision de l’écriture, mais également sur les projets d’écriture que j’aimerais réaliser dans le futur. Si jamais vous connaissez un éditeur intéressé, faites-moi signe !

https://serveur410.com/ploum-transforme-des-billets-en-roman/

Je viens de terminer la toute dernière relecture sur épreuve de Printeurs. Et, c’est le cas de le dire, c’est éprouvant. Je touche mon rêve d’être écrivain. Et comme je le disais.

C’est lorsqu’on touche un de ses rêves du bout des doigts, lorsqu’il nous semble accessible qu’il nous apparait soudainement dans sa réalité crue, dans son imperfection.

https://ploum.net/le-cauchemar-dune-vie-de-reve/

Mais Margueurite Duras le dit beaucoup mieux que je ne le ferai jamais dans son livre « Écrire ».

Dans la vie, il arrive un moment, et je pense que c’est fatal, auquel on ne peut pas échapper, où tout est mis en doute : le mariage, les amis, surtout les amis du couple. Pas l’enfant. L’enfant n’est jamais mis en doute. Et ce doute grandit autour de soi. Ce doute, il est seul, il est celui de la solitude. On peut déjà nommer le mot. Je crois que beaucoup de gens ne pourraient pas supporter ça que je dis là, ils se sauveraient. C’est peut-être pour cette raison que chaque homme n’est pas écrivain. Oui. C’est ça, la différence. C’est ça la vérité. Rien d’autre. Le doute, c’est écrire. Donc c’est l’écrivain, aussi. Et avec l’écrivain tout le monde écrit. On l’a toujours su.

Le paradoxe académique

Encore un témoignage d’un universitaire qui a quitté le milieu académique. Mais cette fois-ci, ce n’est pas à cause de la surcharge administrative, c’est à cause de la « course à la publication ». Un témoignage qui illustre à quel point la motivation de publier peut aller à l’encontre des intérêts de la science.

https://reyammer.io/blog/2020/10/03/the-good-the-bad-and-the-bye-bye-why-i-left-my-tenured-academic-job/

Aventures

J’ai toujours autant de plaisir à lire les aventures cyclistes de Thierry. Et toujours aussi jaloux. Devrais-je écrire les miennes plus souvent ?

https://tcrouzet.com/2020/10/06/mini-aventure-teleportation-dans-laude-par-le-train/

Cela me rappelle cette réflexion que j’avais sur le besoin d’être dehors à l’heure où l’air conditionné a bouleversé le monde moderne :

https://ploum.net/la-boue-ou-lair-conditionne/

Mon besoin d’être dehors rentre malheureusement en conflit avec mon besoin d’écrire. C’est peut-être cela le secret de Thierry : il fusionne les deux activités. Il crée ses traces à vélo pour laisser sa trace.

Ergonomie et Bépo

Je n’ai vraiment commencer à écrire qu’après avoir appris le Bépo. Je peste chaque jour contre l’ergonomie des claviers de laptop. Je rêve d’un laptop ou d’un Freewrite avec un clavier orthogonal. Je ne suis pas le seul, mais certains vont vraiment très très loin dans leur recherche d’une solution idéale :

https://blog.scottlogic.com/2020/10/09/ergo-rabbit-hole.html

Pour ceux qui ne connaissent pas, j’avais raconté l’histoire du Bépo sur le Framablog en 2011 :

https://framablog.org/2011/12/19/bepo-clavier-libre-ploum/

Écologie et bagnoles

Honda annonce se retirer de la Formule 1 en 2021 pour consacrer ce budget à développer des technologies permettant d’arriver à la neutralité carbone. Il est vrai que la F1 n’est pas un sport très écologique (notez que, quand vous voyez le nombre de voitures et motos sur une course, le cyclisme professionnel ne l’est guère non plus).

https://arstechnica.com/cars/2020/10/honda-shocks-f1-says-it-will-quit-the-sport-after-2021/

Le spécialiste belge de la F1, Gaetan Vigneron, relativise l’annonce. Ce n’est pas la première fois que Honda quitte la F1 et l’annonce écologique n’est certainement que la façade marketing pour une décision politico-financière. Ceci dit, Gaetan Vigneron revient sur l’aspect écologique avec une phrase malheureuse qui en dit très long sur la psychologie d’une partie de sa génération :

Bien sûr c’est bien de lorgner vers les technologies du futur et la neutralité zéro carbone, mais tout cela ne va-t-il pas trop vite… (sic)

Non Monsieur Vigneron ! On ne peut pas aller « trop vite ». Il y’a une urgence absolue. Cette simple phrase renforce mon idée que la F1 reste un symbole de l’automobile machiste, virile et polluante. Elle doit changer rapidement ou disparaitre. Il y’a des traces qu’on aimerait ne pas laisser…

https://www.rtbf.be/sport/moteurs/f1/detail_formule-1-honda-tire-la-prise-une-bonne-chose-pour-personne?id=10599173

Mes recommandations BD

J’étais un peu effrayé par le pitch de « Traquemage », par Lupano et Relom. J’avais peur de tomber dans la parodie fantasy facile type Donjon de Naheulbeuk, genre propice aux blagues d’intiés et à l’humour scatologique. Mais Traquemage tient ses promesses : une véritable aventure contant les péripéties d’un jeune berger, de sa chèvre couillonne Myrtille et de Pompette, la fée alcoolique. C’est drôle, délirant, bien rythmé sans tomber trop souvent dans la facilité. Après deux albums, j’ai envie de savoir la suite !

Belle découverte également, « Soleil Froid », par Pécau et Damien. Une aventure post-apocalyptique en 3 volumes qui se passe dans une France ravagée par une grippe aviaire particulièrement mortelle. L’originalité est le parti pris délicieusement amoral et les décors familiers (pour une fois qu’on n’est pas aux États-Unis). Les personnages ne cherchent qu’une chose : survivre, peu importe le prix (la scène de l’hôpital est splendide de simplicité). La survie finira néanmoins par se transformer en quête, avec révélations et rédemptions finales qui rendent la facture de l’ensemble un peu plus classique, mais qui a le bon goût de se clôturer efficacement.

Enfin, j’ai finalement pris le temps de lire un classique qui encombrait ma liste de lecture depuis longtemps : « Aâma », de Frederik Peeters. Un chef-d’œuvre onirique, à mi-chemin entre les mondes d’Aldébaran et l’Incal. Comme toutes les œuvres de ce genre, Aâma souffre un peu vers la fin, lorsque la frontière entre l’onirisme psychédélique et le portnawak se brouille. À titre personnel, j’appelle ce moment fait de sensations pures dans lequel tombent énormément d’histoires de SF la « zone Jodorowsky ». Une zone dont Aâma se sort plutôt bien, conférant à l’œuvre globale une saveur toute particulière et un statut culte mérité.

Photo by RetroSupply on Unsplash

Je suis @ploum, ingénieur écrivain. Abonnez-vous pour recevoir mes billets par mail ou RSS, partagez mes écrits autour de vous autour de vous et soutenez-moi en achetant mes livres. Commandez Printeurs, mon dernier roman de science-fiction..

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

I published the following diary on isc.sans.edu: “Nicely Obfuscated Python RAT“:

While hunting, I found an interesting Python script. It matched one of my YARA rules due to the interesting list of imports but the content itself was nicely obfuscated. The script SHA256 hash is c5c8b428060bcacf2f654d1b4d9d062dfeb98294cad4e12204ee4aa6e2c93a0b and the current VT score is only 2/59! The script is simple, after a bunch of imports and an if/then condition to detect if it is executed on Windows or Linux, we have this piece of code (slightly beautified)… [Read more]

The post [SANS ISC] Nicely Obfuscated Python RAT appeared first on /dev/random.

October 14, 2020

cover image

Imagine going to a restaurant. The food is amazing, and you're having a great time. You tell the waiter, "Compliments to the chef!", who dutifully reports the news to the kitchen.

Only the chef is crazy. He runs out and snatches your plate while you're still eating, saying "If you liked this one, wait until you try my next recipe!" He doesn't return for two days, so you leave hungry and dissatisfied.

When you write a letter in complaint, the chef considers you entitled and refuses to acknowledge you, because he discovered you put some extra salt and pepper on the food he served.

Welcome to Beat Saber, by Beat Games.

A chef carefully pouring oil on a salad

Nerds Trying To Dance

For a few months now, I've been enjoying this game in VR. It's a fantastic intersection of rhythm game, exercise and rave culture. It solves the biggest problem I've always had with going to clubs: that most people are there for the meat market instead of just dancing and having fun.

In fact, I would say Beat Saber is not a video game, but rather a sport. It is also a sport that many people have put significant time and effort into getting good at, myself included. We have the muscles and missing body fat to prove it:

This doesn't just take practice, it takes training.

The game is popular in large part because of numerous mods and player-created levels. The devs however refuse to play nice with all this. Every time the game updates, all that breaks. Most of your custom songs stop working, i.e. the ones you actually like. The UI goes back to being terrible, with lists not even sorted alphabetically, so you can't find anything. The last update completely changes the UI, which will require significant re-investment by mod authors. There are plenty of other complaints in comments and review bombs, ranging from graphical bugs to misaligned sabers. What I personally noticed is that the new effects make it harder to see what you're doing on the Expert+ levels.

It's like taking a tennis player's racket collection, bending them all by, say, 5 degrees, and then calling that person entitled if they explain that they can't hit the balls correctly this way.

Steam auto-update options: 1) keep this game up to date, 2) keep this game up to date when I start it, 3) keep this game up to date with high priority

Naturally, you can't turn off auto-updates... that would be too simple for Steam, which only offers a choice of "Yes.", "Yes?" and "Harder, daddy." You can't revert back to an older version of the game, because the developer doesn't let you. What you can do is:

It took hours just to get it back to what it was the day before, and which I was perfectly happy with. If other people hadn't already done the heavy lifting, it would've taken days, maybe weeks. Regardless, I would've tried to escape the update treadmill, because it would be absurd to have a hobby I can't enjoy when I want to.

$100 Bills

I have spent thousands of dollars on VR equipment now, and specifically bought a new set of Index controllers for this game, at ~$300 for the pair. I am the ideal customer for Beat Games, someone who is willing to spend a lot of money on their niche. Initially I bought a few music packs just to support them, even if the songs were meh. Several forced updates later, I hate them with the burning passion of a thousand suns and refuse to buy anything else these people make, because I hate being cockblocked by my own purchases. It's infuriating.

I'm sure the devs think it's the users who are entitled, expecting them to support our modded copies forever. But this is a case of Sinclair's Maxim in action: it is hard to get a developer to understand that customers don't want auto-updates, when his salary depends on not understanding it.

In this case, Beat Games appears to be following two incentives. First, they can only get more money out of existing customers by pushing new song packs on them through the game. Second, they can attract more mainstream customers by making the game more "accessible." So they think that's what they need to do, and think it outweighs the downsides. In reality, each forced update teaches a new cohort of the most engaged fans that the game they love doesn't love them back, and probably isn't worth spending any money on at all. The devs keep doing this.

This isn't just "this is slightly different and therefor I hate it," because I can easily compare now. It's different in a game-altering way. My muscle memory and visual cortex are honed for a sport that no longer officially exists. Maybe it will come back, I don't know. They think just because I liked one of their ideas once, that therefor I will like every new idea they have, and like it more than the last one. That the bugs they introduced simply don't exist and that their creation is perfect. That I will be willing to waste hours of my time, and then days more to adjust, when the net change is worse to me. Who feels entitled to whose time in this transaction?

Let's be honest, this problem is universal in software, and reflects the average developer's attitudes today: they force their users into accepting updates, without backwards compatibility or the choice of old vs new. They then interpret their users' reluctant resignation as a ringing endorsement. If you do this, I wish you a thousand stubbed toes forever, for you are a hare-brained prima donna who does not even consider what your customers experience when they try to use your work in the field.

Trainwreck Of Electro Swing

In the community, a common refrain is that this is just a temporary issue, and that in a few days the modders will have caught up. Ironically, this assumes that the good will of modders is endless, and that they won't tire of having to update their work over and over just to stay current. Anyone who has worked in open source knows this is a lie. As soon as the selfless contributor stops feeling the work is inherently rewarding, you have a pile of abandoned code on your hands that almost nobody knows, but a lot depends on.

Beat Saber's own success depends on it too. If you look on Youtube, you will see almost everyone is playing unofficial songs. Players use mixed reality set-ups to put themselves in the game, and even mod in entirely custom environments. It's purely there to look cool, so it looks nothing like it in-game. This level doesn't actually transform into an epileptic seizure:

It also reveals a choice Beat Games has, and which they seem be leaning into. Is Beat Saber a game that feels great to play, or is it a game that looks amazing to play? That is, is it for playing, or for watching? The latest update is notable for its rather obnoxious restyling of the entire UI, which replaces the relatively sober title screen with illustrations of people partying. Call me a grouch, but this is normie stuff, for one very simple reason: the people who only show up to the party when it's already banging... those are not the people who actually make great parties happen. This is trying to ensure people have fun by asking them, with a megaphone to their ear, "Are you having FUN yet???"

To me it's a text-book case of David Chapman's Geeks, MOPs and Sociopaths model, of trying to make something "cooler" while diminishing what made it work in the first place. It's not the pro-youtubers with their meticulously green screened performances... it was everyone else who vindicated the Star Wars Kid by shamelessly pretending to be a Jedi in their living room. You see, it is very rare when somebody who isn't Valve does what they do best: they give people a super-power and carefully teach them how to use it.

Star Wars Kid - 1
Star Wars Kid - 2
Star Wars Kid - 3

At the very least Beat Games should let the uncool, smelly nerds keep their hobby as it is, because that's how we liked it, and that's what we actually paid for when we bought it. Subscribing to software was supposed to help us keep our software secure and reliable, and allow users to benefit sooner from new functionality. If those updates break people's set ups for days, disrupt muscle memory even if it does work, and target a different audience, you are doing it completely wrong. Because the correct answer to that is product differentiation, dickbrains.

The Only Thing They Fear Is You

When faced with a community of enthusiasts eager to hack your game to bits, you have a choice. You can push back hard and say "no, we are the devs, we control this thing." Or you can realize you have a luxury of free talent, man-hours and passion at your disposal and figure out how to work best with it, instead of giving them the middle finger and cold shoulder.

You can see mods as free prototypes, already validated in the market, and try to integrate their functionality natively. You can plan and implement smooth support for legacy content. You can set up a Discord to act as a recruiting pipeline. You can identify the modders that would make a good addition to your team, who know your code from angles you never considered. You can use modding guides to figure out what the typical end-user's copy actually looks like in the wild, and try to handle the 90% case, to cut down on hate mail. You can also use it as a spec for the modding API you probably should've built but didn't.

Yes, you can actually have specs, and automated tests. This is a thing people sometimes do when they want to engineer reliable and reproducible behaviors in a collaborative environment, without increasing the amount of things they have to keep track of in their head. I know, it's wild.

If Beat Games keeps it up, then they are basically attributing all their success only to their own efforts, instead of what their customers did with it. The devs are outnumbered, so some humility is advised. In 10 years nobody will remember a "Linking Park DLC." But there will probably be an OpenBeatSaber, created by one or more passionate fans, motivated by love for their hobby and spite for the people who mismanaged it. Unless they change their approach.

If you want an example of how to do this right, learn from Line Rider creator, Boštjan Čadež. You'd be amazed what happens when somebody understands the value of a deterministic physics engine.

October 12, 2020

C’est une question que j’entends souvent lorsque je parle de cryptomonnaie : ne pourrait-on pas déplacer la virgule pour avoir plus de bitcoins ?

Peut-on déplacer la virgule du Bitcoin ? Oui !

Le code du logiciel Bitcoin étant Open Source, n’importe qui peut le modifier pour en déplacer la virgule. Il affichera alors que vous avez 100 ou 1000 bitcoins au lieu d’un seul. Bien entendu, il ne s’agit que d’un affichage. Au moment du premier paiement, seule la valeur originale sera comptée. Vous pouvez rajouter des zéros au crayon sur votre billet de 10€ et prétendre que vous avez 1000€. Mais le premier magasin venu vous ramènera à la réalité.

Il est par contre possible de se mettre d’accord pour que tous les utilisateurs du Bitcoin déplacent la virgule ensemble. C’est exactement ce qu’on fait les Français en 1958, en passant de l’ancien au nouveau franc (même si eux ont décidé de déplacer la virgule dans l’autre sens pour avoir moins de francs).

En juin 2011, je militais activement sur le célèbre forum Bitcointalk pour un déplacement de la virgule de trois décimales vers la droite. Un autre utilisateur, MoonShadow, lança même un sondage, mais, cette fois-ci, proposant un déplacement de la virgule de six décimales vers la droite. Notre raisonnement commun était clair : alors qu’un bitcoin vaut environ 10 dollars, si on déplace la virgule, il y’aura un effet psychologique de garder le « nouveau bitcoin » entre 1 et 10 dollars, augmentant la valeur de « l’ancien bitcoin ». Ce raisonnement très naïf se révèle entièrement faux, mais nous ne le savions pas.

https://bitcointalk.org/index.php?topic=13144.0;topicseen

Cependant, l’idée de déplacer la virgule n’était pas neuve. En avril 2009, Satoshi lui-même parlait déjà de bouger la virgule pour rendre l’unité bitcoin plus simple à échanger.

https://nakamotostudies.org/emails/satoshi-reply-to-mike-hearn/

Ce déplacement aurait-il changé les choses ?

Techniquement, il s’agissait en tout et pour tout d’afficher la virgule sur une autre place dans le logiciel. D’un point de vue du code, tout resterait exactement pareil. La seule différence étant que ceux qui possédaient un bitcoin en auraient désormais un million.

L’idée derrière cette réflexion était qu’en dépassant la valeur nominale de un dollar par bitcoin, l’usage du bitcoin risquait de devenir peu pratique pour les paiements courants. On se retrouverait en permanence à gérer de très petits nombres, de types 0,001 bitcoin.

Malgré l’avis initial de Satoshi et le soutien de la communauté de l’époque (plus de deux tiers des 150 participants à ce sondage ont répondu en faveur du déplacement de la virgule), les développeurs n’en ont pas tenu compte et le prix d’un bitcoin s’est envolé, atteignant 1000$ en 2013 et 19000$ en 2017 avant de revenir à 10000$ en 2020, suscitant un incroyable battage médiatique et un intérêt du grand public.

Dirigeons-nous un instant dans l’univers parallèle 40bz2. Dans cette galaxie, la virgule a bel et bien été déplacée. Ce n’est qu’une question d’affichage et tout le reste, absolument tout le reste est resté identique : les mineurs, les échanges, les altcoins. Une seule ligne dans un logiciel change l’affichage d’un chiffre. C’est tout !

Pourtant, ce simple déplacement de la virgule a entrainé des différences profondes. Malheureusement, la communication entre univers parallèles n’est pas parfaitement au point. L’image est floue. Tout au plus peut-on tenter de deviner. En 2011 et 2012, les premiers participants se sont retrouvés millionnaires en bitcoins. Le prix du bitcoin a peut-être monté un peu plus vite, atteignant 1$ pour 1000 bitcoins dès 2012. Par contre, les médias n’ont pas pu titrer sur le caractère « cher » ou « bon marché » d’un bitcoin. C’est trop petit, pas assez intéressant. La bulle est sans doute arrivée plus tardivement. Est-ce que le prix est monté plus fort ou moins fort ? Mon Einsteinphone ne permet pas de le dire.

Tout ce que l’on peut faire est revenir dans notre bon vieil univers familier.

Bitcoinnaires et millionnaires en satoshis

Tout naturellement, la communauté s’est adaptée et parle désormais de satoshis pour les transactions courantes. Le prix d’un bitcoin semble désormais beaucoup trop cher pour le grand public. À chaque conférence, je dois rappeler que l’on peut acheter des fractions de bitcoins, qu’il n’est pas nécessaire d’en acheter un entier. Je me retrouve également à expliquer que les prix d’un ether, d’un litecoin ou d’un bitcoin ne sont en rien comparables. Les modes d’émission de la monnaie sont très différents. L’important n’est pas le prix, mais la fraction de l’économie totale que vous achetez. Mathématiquement, le nombre de bitcoins ne pourra jamais excéder 21 millions. Le nombre d’ether n’est, lui, en théorie pas limité. Les deux économies sont donc complètement différentes. L’un n’est pas « plus cher » que l’autre.

Quoiqu’il en soit, mon espoir de devenir un jour millionnaire en bitcoins s’est bel et bien envolé. Il ne reste que la possibilité de devenir millionnaire en satoshis (il y’a 100 millions de satoshis dans un bitcoin, en octobre 2020, un million de satoshis coûtent donc 110$).

Peut-être que, dans pas tellement longtemps, on ne parlera plus de milliardaires ou millionnaires, mais de bitcoinnaires. Mais si, vous savez bien : ces personnes tellement riches qu’elles possèdent un bitcoin tout entier. Les veinardes !

L’idée n’est pas complètement saugrenue lorsqu’on sait que la limite théorique de 21 millions de bitcoins sera atteinte en 2140. Le nombre d’êtres humains possédant un capital d’au moins 1 million de $ (patrimoine immobilier compris) varie entre 20 et 35 millions selon les estimations. Cela signifie que si vous connaissez quelqu’un dont la fortune globale personnelle est au moins de 1 million de dollars, il fait partie des 35 millions les plus riches de la planète, les 0,5%. En Europe, près de 2,5% de la population est millionnaire.

En comparant les chiffres, on se rend compte que même si l’usage du Bitcoin était réservé aux millionnaires en dollars, il n’y aurait pas assez de bitcoins pour tout le monde. Pire, en tenant en compte des bitcoins irrémédiablement perdus, on arrive à moins d’un demi-bitcoin par millionnaire.

À ce titre, utiliser le mot « bitcoinnaire » pour désigner une personne très riche fera peut-être bientôt partie du vocabulaire courant. Ou peut-être que le Bitcoin aura rejoint depuis longtemps le cimetière des projets précurseurs inutilisés comme Napster. Bitcoin va-t-il disparaitre ou créer un monde de bitcoinnaires ? C’est la question à devenir bitconnaire, seul le futur nous le dira. 

Une chose est certaine : une simple virgule dans un logiciel peut changer le monde. En fait, elle l’a déjà fait.

Photo by Ramiro Mendes on Unsplash

Je suis @ploum, ingénieur écrivain. Abonnez-vous pour recevoir mes billets par mail ou RSS, partagez mes écrits autour de vous autour de vous et soutenez-moi en achetant mes livres. Commandez Printeurs, mon dernier roman de science-fiction..

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

October 09, 2020

You probably have heard about AVIF already, but if not; it is a new image format which is based on the AV1 video format and generally has superior compression than the better-known WebP, JPEG, PNG and GIF formats. Avif is currently supported by Chrome & Opera and can be enabled by setting the image.avif.enabled flag in Firefox.

So now you know what it is you may want to use it on your WordPress site? In that case -and the title kind of gives it away- the freshly released Autoptimize 2.7.8 now has support for AVIF if you have image optimization active. Just as for WebP Autoptimize hooks into the lazyload JavaScript to detect if your visitor’s browser supports AVIF and will switch the requests to the ShortPixel CDN to that format if so. If AVIF is not support but WebP is, the requests will be for WebP images and if those are not supported old-fashioned JPEG’s will be loaded.

So there you have it, AVIF is now available in WordPress!

October 08, 2020

Als je je computer inschakelt, je smartphone ontgrendelt of je thermostaat bijstelt, treedt er op de achtergrond een heel proces in werking. Iemand (meestal een heel team) heeft de processor die in deze apparaten zit geprogrammeerd: minutieus aan de processor uitgelegd welke instructies die moet uitvoeren.

Computers en algoritmes overheersen steeds meer ons leven. Er gaan zelfs stemmen op om kinderen op de lagere school al te leren programmeren. Maar hoe begin je daaraan? En welke van de vele programmeertalen kies je?

De Arduino Uno, een gebruiksvriendelijk bordje om microcontrollers te leren programmeren. (Bron: Arduino)

Voor Linux Magazine schreef ik het artikel Zet je eerste stappen in programmeren. Ik bespreek er machinetaal, computationeel denken, visuele programmeertalen zoals Scratch en Node-RED, algemene programmeertalen zoals JavaScript en Python en hun ecosystemen, en tot slot het Arduino-platform voor wie meer met microcontrollers en elektronica aan de slag wil.

Uiteindelijk is de beste manier om te leren programmeren het in de praktijk doen en veel oefenen. Zoiets houd je alleen vol als je het interessant vindt. Ik raad dan ook niet aan om een specifieke programmeertaal te kiezen omdat ze populair is of veel gevraagd is op de arbeidsmarkt.

Kies gewoon een taal die goed geschikt is voor iets waarin je geïnteresseerd bent, of dat nu games ontwikkelen, websites bouwen of mobiele apps maken is. En begin dan gewoon al lerend dit te programmeren. Nadat je de basis van een eerste taal onder de knie hebt, leer je heel snel een andere programmeertaal.

October 06, 2020

Primo Levi was een jonge Joods-Italiaanse chemicus die de bergen introk om bij het verzet te gaan maar in 1943 werd opgepakt en naar Auschwitz werd gedeporteerd.

“Is dit een mens” gaat over leven, overleven, sterven en al dan niet mens zijn in een concentratiekamp. Over grote gruwel en het kleine leven, over diefstal, handel en pikorde tussen de verschillende slachtoffergroepen. Over de laatste stap van de ontmenselijking, in zijn meest extreme vorm. Over Dante’s Inferno, geschreven door iemand die de hel van Auschwitz overleefde.

Ik wil alleszins het vervolg “Het respijt” over zijn tocht terug naar Turijn ook lezen.

October 04, 2020

After a long hiatus, I'm ready to take up blogging again on my public blog. With my day job becoming more intensive and my side-job taking the remainder of the time, I've since quit my work on the Gentoo project. I am in process of releasing a new edition of the SELinux System Administration book, so I'll probably discuss that more later.

Today, I want to write about a task I had to do this year as brand new domain architect for infrastructure.

Transitioning to domain architect

While I have been an infrastructure architect for quite some time already, my focus then was always on specific areas within infrastructure (databases, scheduling, big data), or on general infrastructure projects or challenges (infrastructure zoning concept, region-wide disaster recovery analysis and design). As one of my ex-colleagues and mentors put it, as infrastructure architects you are allowed to piss on each other's area: you can (and perhaps should) challenge the vision and projects of others, of course in a professional way.

I heeded the advice of this person, and was able to get a much better grip on all our infrastructure services, their designs and challenges. I mentioned earlier on that my day job became more intensive: it was not just the direct responsibilities that I had that became more challenging, my principle to learn and keep track of all infrastructure evolutions were a large part of it as well. This pays off, as feedback and advice within the architecture review boards is more to the point, more tied to the situation.

Furthermore, as an architect, I still try to get my hands dirty on everything bouncing around. When I was focusing on big data, I learned Spark and pySpark, I revisited my Python knowledge, and used this for specific cases (like using Python to create reports rather than Excel) to make sure I get a general feel of what engineers and developers have to work with. When my focus was on databases, I tried to get acquainted with DBA tasks. When we were launching our container initiative, I set up and used Kubernetes myself (back then this was also to see if SELinux is working properly with Kubernetes and during the installation).

While this does not make me anything near what our engineers and experts are doing, I feel it gives me enough knowledge to be able to talk and discuss topics with these colleagues without being that "ivory tower" architect, and better understand (to a certain level) what they are going through when new initiatives or solutions are thrown at them.

End of 2019, the company decided that a reorganization was due, not only on department and directorate level, but also on the IT and Enterprise Architecture level. One of the areas that improved was to make sure the infrastructure in general was also covered and supported by the EA team. Part of that move, two of my infrastructure architect colleagues and myself joined the EA team. One colleague is appointed to tackle a strategic theme, another is now domain architect for workplace/workforce, and I got the task of covering the infrastructure domain. Well, it is called infrastructure, but focus on the infrastructure related to hosting of applications and services: cloud hosting, data center, network, compute, private cloud, container platform, mainframe, integration services, middleware, etc. Another large part of what I consider "infrastructure" is part of the workplace domain, which my colleague is pushing forward.

While I was still handing over my previous workload, coaching the new colleague that got thrown in to make sure both him and the teams involved are not left with a gap, the various domain enterprise architects got a first task: draft up the strategy for the domain… and don't wait too long ;-)

Tackling a domain strategy

Now, I've drafted infrastructural strategies quite a few times already, although those have most focus on the technology side. The domain view goes beyond just the technological means: to be able to have a well-founded strategy, I also have to tackle the resources and human side of things, the ability of the organization to deal with (yet another?) transformation, the processes involved, etc.

Unlike the more specific area focus I had in the past, where the number of direct stakeholders is limited, the infrastructure domain I now support has many more direct stakeholders involved. If I count the product managers, system architects, product owners (yes we are trying the Scaled Agile approach in our organization) and the managerial roles within the domain, I have 148 people to involve, spread across 7 Agile Release Trains with different directorate steering. The consumers of the infrastructure services (which are more part of business delivery services rather than on IT level) are even much larger than that, and are the most important ones (but also more difficult) to get in touch with.

Rather than just asking what the main evolutions are in the several areas of the domains, I approached this more according to practices I read in books like "Good Strategy, Bad Strategy" by Richard Rumelt. I started with interviews of all the stakeholders to get to learn what their challenges and problems are. I wanted our strategy to tackle the issues at hand, not focus on technological choices. Based on these interviews, I grouped the issues and challenges to see what are the primary causes of these issues.

Then I devised what action domains I need to focus on in the strategy. An action domain was an area that more clearly describes the challenges ahead: while I had close to 200 challenges observed from the interviews, I can assign the huge majority of them to one of two action domains: if we tackle these domains then we are helping the organization in most of their challenges. After validating that these action domains are indeed covering the needs of the organization, I started working on the principles how to tackle these issues.

Within the principles I want to steer the evolution within the infrastructure domain, without already focusing on the tangible projects to accomplish that. The principles should map to both larger projects (which I wanted to describe in the strategy as well) as well as smaller or more continuity-related projects. I eventually settled with four principles: - one principle covering how to transform the environment, - one principle covering what we offer (and thus also what we won't be offering anymore), - one principle which extends our scope with a major area that our internal customers are demanding, and - one principle describing how we will design our services

Four principles are easy enough to remember for all involved, and if they are described well, they are steering enough for the organization to take up in their solutions. But with principles alone the strategy is not tangible enough for everyone, and many choices to be made are not codified within those principles. The next step was to draw out the vision for infrastructure, based upon current knowledge and the principles above, and show the major areas of work that lays ahead, as well as give guidance on what these areas should evolve to.

I settled for eight vision statements, each worked out further with high level guidance, as well as impact information: how will this impact the organization? Do we need specific knowledge or other profiles that we miss? Is this a vision that instills a cultural change (which often implies a slower adoption and the need for more support)? What are the financial consequences? What will happen if we do not pursue this vision?

Within each vision, I collaborated with the various system architects and other stakeholders to draft out epics, changes that support the vision and are ready to be taken up in the Scaled Agile approach of the organization. The epics that would be due soon were fully expanded, with a lean business case (attempt) and phasing. Epics that are scheduled later (the strategy is a 5-year plan) are mainly paraphrased as expanding those right now provides little value.

While the epics themselves are not fully described in the strategy (the visions give the rough approach), drafting these out is a way to verify if the vision statements are feasible and correct, and is a way to check if the organization understands and supports the vision.

From the moment I got the request to the final draft of the strategy note, around 2 months have passed. The first draft was slideware and showed the intentions towards management (who wanted feedback within a few weeks after the request), after which the strategy was codified in a large document, and brought for approval on the appropriate boards.

That was only the first hurdle though. Next was to communicate this strategy further…

Communication and involvement are key

The strategic document was almost finalized when COVID-19 struck. The company moved to working at home, and the way of working changed a lot. This also impacted how to approach the communication of the strategy and trying to get involvement of people. Rather than physically explaining the strategy, watching the body language of the people to see if they understand and support it or not, I was facing digital meetings where we did not yet have video. Furthermore, the organization was moving towards a more distributed approach with smaller teams (higher agility) with fewer means of bringing out information to larger groups.

I selected a few larger meetings (such as those where all product managers and system architects are present) to present and discuss the strategy, but also started making webinars on this so that interested people could get informed about it. I even decided to have two webinars: a very short one (3 minutes) which focuses on the principles alone (and quickly summarizes the vision statements), and an average one (20-ish minutes) which covers the principles and vision statements.

I also made recordings of the full explanations (e.g. those to management team), which take 1 hour, but did not move those towards a webinar (due to time pressure). Of course, I also published the strategy document itself for everyone, as well as the slides that accompany it.

One of the next steps is to translate the strategy further towards the specific agile release trains, drafting up specific roadmaps, etc. This will also allow me to communicate and explain the strategy further. Right now, this is where we are at - and while I am happy with the strategy content, I do feel that the communication part received too little attention from myself, and is something I need to continue to put focus on.

If a strategy is not absorbed by the organization, it fails as a strategy. And if you do not have sufficient collaboration on the strategy after it was 'finalized' (not just communication but collaboration) then the organization cannot absorb it. I also understand that the infrastructure strategy isn't the only one guiding the organization: each domain has a strategy, and while the domain architects do try to get the strategies aligned (or at least not contradictory to each other), it is still not a single, company-wide strategy.

Right now, colleagues are working on consolidating the various strategies on architectural level, while the agile organization is using the strategies to formulate their specific solution visions (and for a handful of solutions I'm also directly involved).

We'll see how it pans out.

So, do you think this is a sensible approach I took? How did you tackle communication and collaboration of such initiatives during COVID-19 measures?

October 03, 2020

cover image

Let me tell you a tech story.

Many years ago, I was working on an app with real-time collaboration built into it. It was a neat experimental stack, using early React and CouchDB to their full potential. It synced data live over JSON OT. It was used to do actual work internally, but the general applicability and potential for re-use was evident.

Trying to sell potential customers on this technology, we ran into an unexpected wall. Our tech looked and worked great in the demo video, no problem there. It showed exactly how it worked, and nothing was faked. We had come up with and coded a credible field scenario.

Two users interacting through a mobile app

That was in fact the problem. Our demo worked exactly the way everyone else always pretended their apps worked. Namely that information would flow instantly from A to B, even large media files. That everyone would see new records as they came in. That by adopting an app, users could just work together without friction on the exact same things, even if they had a spotty internet connection in the middle of nowhere. This is the sort of thing every After Effects-product-video does implicitly.

Despite the fact that everyone knew what a Refresh button was for, it didn't register at all that the web apps they were asking us to build would normally be subject to its limitations. Or that it would be an entirely different experience if you stopped needing it altogether. What they mainly noticed was that you could "chat" by leaving notes between people, so they wondered how this was different from, say, Slack. Oof.

The Design of Everyday Syncs

If you've been working in software for a while, it can be a bit jarring to remember that most people cannot look at a picture of an interface and infer what it will do when they interact with it. Let alone know what's going to happen behind the scenes. Knowing what can happen is largely a result of knowing what cannot happen, or should not happen. It requires a mental model not just of what the software is doing, but how its different parts are arranged and can communicate.

A classic example is the user who is staring at a spinner.gif for 20 minutes, wondering when the work will finally be done. The developer would know the process is probably dead and that the gif will never go away. Its animation mimes that work is happening, but it's not connected to the state of the work. This is the sort of thing where some techies like to roll their eyes at just how misinformed a user can be. Notice though, which one of them is pointing at a spinning clock and saying it's actually standing still?

An animated activity spinner

This is the value proposition of real-time in a nutshell. These days real-time databases are still mostly underused, and still regarded with suspicion. Most of them lean heavily into NoSQL style, which tend to bring up Mongo-fueled benders people would rather forget. For me though, it meant getting comfy on the CouchDB, as well as learning to design schemas that somebody other than a bureaucrat could correctly fill in. I think my time was better spent.

The real topic of this post is what I'm using these days. Not by choice, but through uncaring and blindly applied corporate policy. Hence a Totally Fair and Unbiased comparison of two closely related Real-Time Database Products By Googleâ„¢.

Firebase Real-Time Database + Firebase Cloud Firestore = Firebase

Anyone need more stickers?

They both have fire in their name. One I regard with fondness. The other is a different kind of fire. If I'm hesitant to name them, it's because once I do, you will run into the first big problem, their names.

One is called the Firebase Real-Time Database and the other is the Firebase Cloud Firestore. They are both products in Google's Firebase suite. The APIs are respectively firebase.database(…) and firebase.firestore(…).

This is because Real-Time Database is just the original Firebase, before Google bought it in 2014. They then decided to build a copy of Firebase on their big data whatsit, as a parallel offering, and named it Firestore with a cloud. Hope you're still following. If not, no worries, I have tried to rewrite this part a dozen times already.

Cos really you have a Firebase in your Firebase, and a Firestore in your Firebase, or at least you do if you want to be able to make sense of Stack Overflow from a few years ago.

If there is a Raspberry award for worst naming in software products, this surely qualifies. The mental hamming distance between these names is so small it will trip up even seasoned engineers, whose fingers will type one thing as their lips speak another. It will royally fuck up plans made with the best of intentions, fulfilling the prophecy of having your database be on fire. I'm not joking in the slightest. The person who came up with this naming scheme has blood, sweat and tears on their hands.

I will call them Firebaseâš¾ï¸� and Firestore🧯. The baseball is for Firebase, and the fire extinguisher is for Firestore, because you need one.

A man chasing bugs with a butterfly net in a forest that's on fire

Pyrrhic Victory

You might think Firestore🧯 is the replacement for Firebaseâš¾ï¸�, a next-generation successor, but that would be false. Firestore🧯 is patently unsuitable as a Firebaseâš¾ï¸� replacement. Somebody has seemingly engineered away almost everything that is interesting about it, and messed up most of the rest in various ways.

A cursory glance at the two offerings will confuse you though, because it seems they do the same thing, through mostly the same APIs and even the very same DB session. The differences are subtle and will only be discovered after careful comparative study of the sparse docs. Or when you're trying to port code that works perfectly fine on Firebaseâš¾ï¸� over to work with Firestore🧯. When you discover that your database interface catches fire as soon as you try to do a mouse drag in real-time. Again, not kidding.

Firebaseâš¾ï¸�'s client is polite in that it buffers changes and auto-retries with last-write-wins best-effort consistency. Firestore🧯 however has a throttle of 1 write per document per user per second, enforced by the server. It's up to you to implement a rate limiter around it yourself when you use it, even though you're just trying to build your app. So Firestore🧯 is a real-time database without a real-time client, wearing the API of one as a skin suit.

This is also where you start to see the first hints of the reason for Firestore🧯's existence. Those words "best-effort consistency" tend to make Grumpy Database Admins' few remaining hairs stand up. I could be wrong about this, but I suspect that somebody high up enough at Google looked at Firebaseâš¾ï¸� after they bought it and simply said: "No. Dear God, No. This is unacceptable. Not on my watch."

A gray beard monk reading from a tome

They emerged from their chambers and declared:

"One big JSON document? No. You will split your data into separate documents, each no more than 1MB in size."

This seems like a limit that will not survive first encounter with any sufficiently motivated user base. You know it's true. Like, we have a few 1500+ slide presentations at my current job, which is Perfectly Normal.

Under this constraint, you will be forced to accept that one "document" in your database bears no resemblance to anything a user might refer to as a document. This is the kind of thing that will cause subtle misery from day 1 in attempting to match end-user requirements, and never cease.

"Arrays of arrays that can contain other things recursively? No. Arrays will contain only objects, or numbers of a fixed size, as God intended."

So if you were hoping to put GeoJSON in your OnFirestore🧯, you will discover that's not possible. With anything remotely not 1-dimensional. Hope you like Base64 and/or JSON inside JSON.

"Import and Export JSON via HTTP, command line tools or the admin panel? No. You will only export and import data to and from Google Cloud Storage. At least I think that's what it's called these days. When I say 'you', I am only talking to those of you with Project Owner permissions. Everybody else go away and file a ticket."

You see, FireBae🤵⚾�'s data model is straightforward to describe. It contains one big enormous JSON document, which maps JSON keys to URL paths. If you HTTP PUT this to your ⚾� at /:

{
  "hello": "world"
}

Then GET /hello will return "world". For the most part this works as you'd expect. A ⚾� collection of objects /my-collection/:id is equivalent to a JSON dictionary {"my-collection": {...}} at the root, whose contents are available at /my-collection:

{
  "id1": {...object},
  "id2": {...object},
  "id3": {...object},
  // ...
}

This works fine as long as each insert has a non-colliding ID, which you are provided a standard solution for.

In other words, âš¾ï¸� is 100% JSON compatible (*) and plays nice with HTTP, like CouchDB. But you mostly use it through its real-time API, which abstracts away the websockets, auth and subscriptions. The admin panel does both, allowing real-time edits and JSON import/export. If you embrace the same in your code, it's quite astonishing how much specialized code disappears once you realize JSON patch and diff can solve 90% of your persistent state handling chores.

🧯's data model is JSON-like, but diverges in a few critical ways. No arrays of arrays was already mentioned. The model for sub-collections is to have them be first class concepts, separate from the JSON document holding them. Because there is no readily available serialization for this, getting data in and out requires a specialized code path. You must build your own scripts and tools to handle your own collections. The admin panel only allows you to make small edits, one field at a time, and does not have any import/export.

They took a real-time NoSQL database and turned it into a slow, auto-joined not-SQL with a dedicated not-JSON column. Something something GraftQL.

A developer sitting at a computer that's on fire

Hot Java

If 🧯 was supposed to be more reliable and scalable, then the irony is that the average developer will end up with a less reliable solution than if they had just used âš¾ï¸� out of the box. The kind of software that Grumpy Database Admin has designed for requires a level of effort, and caliber of engineering, that just isn't realistic for the niche they are supposedly good at. It's similar to how HTML5 Canvas is not at all a Flash substitute, if the tools and player aren't there. What's more, it is steeped in an attitude towards data purity and sterile validation that simply doesn't match how the average business user actually likes to get work done, which is that everything is optional because everything is a draft until the very end.

The main flaw in âš¾ï¸� is that the client was created a few years too soon, before you could reasonably expect most web developers to know what immutability was. As a result, âš¾ï¸� assumes you are mutating your data, and will not benefit from any immutability you feed it. It will also not reuse data in the snapshots it gives you, making diffs much harder. For larger documents, its mutable-diff based transactional mechanism is just inadequate. C'mon guys, we have WeakMap in JavaScript now. It's cool.

If you give your data the right shape, and keep your trees shallow, you can work around this. But I do wonder whether âš¾ï¸� wouldn't get a whole lot more interesting to people if they just released a really good client API based on leveraging immutability, coupled with serious practical advice on schema design. Instead it's like they tried to fix what wasn't broken, and made it worse.

A developer on fire

I don't know the full intent behind building 🧯. Speculating about motives inside the Borg cube is part of the fun. The juxtaposition of these two extremely similar but discapable databases is a relative rarity in the scene. It's almost as if somebody thought "âš¾ï¸� is just a feature we can emulate on <Google â˜�ï¸�>" but hadn't yet discovered the concept of gathering real-world requirements, or coming up with useful solutions for all of them. "Let the developers worry about that. Just make the UI pretty... Can we add more fire?"

I do know a thing or two about data structures. I can certainly see that "everything is one big JSON tree" is attempting to abstract away any sense of large-scale structure from a database. Expecting the software to just cope with any kind of dubious schema fractal is madness. I really don't need to imagine how bad these things can get, for I have done hostile code audits, and seen things you wouldn't believe. But I also know what good schemas look like, how you can leverage them, and why you should. I can imagine a world where 🧯 seemed absolutely like the right thing to do and where the people who did it think they did a good job. But it's not the one I live in.

âš¾ï¸�'s support for querying is poor by anyone's standards, borderline non-existent. It certainly could have used improvement, or even a rethink. But 🧯 isn't much better, as it is limited to the same 1 dimensional indices you get in basic SQL. If you want the kinds of queries humans like to do on messy data, that means full text search, multi-range filters, and arbitrary user-defined ordering. Anything that's basic SQL if you squint is itself too limited. Besides, the only SQL queries people can run in production are the fast ones. What you want is a dedicated indexing solution with grown up data structures. For everything else, there ought to at least be incremental map-reduce or something.

If you ask Google's docs about this, you will be helpfully pointed in the direction of things like BigTable and BigQuery. All these solutions however come with so much unadulterated enterprise sales speak, that you will quickly turn back and look elsewhere.

The last thing you need with a real-time database is something made by and for people who work on an executive schedule.

(*) Just kidding, there is no such thing as 100% JSON compatible.

October 02, 2020

Quelques liens en vrac que vous pouvez lire sans vous connecter aux réseaux sociaux. Je reçois de nombreux mails enthousiastes pour ce type de billets au format « brêves ». C’est donc un format qui semble apporter de la valeur, mais qui, ironiquement, n’a aucune chance de « faire le buzz ». Tant mieux, ce n’est pas ce que vous et moi cherchons. On n’est pas bien là, entre nous ? Au fait, vous préférez des billets plus courts et plus fréquents ? Ou on continue ?

Minimalisme numérique

J’en parle souvent, mais c’est important de ne pas l’oublier : même quand on ne les utilise pas, nos smartphones nous rendent bêtes. Le simple fait d’avoir un smartphone à portée de main nous déconcentre.

https://www.calnewport.com/blog/2020/09/22/do-smartphones-make-us-dumber/

Le problème chez les adultes, c’est que pour se concentrer, il faut induire un certain sentiment d’urgence, sentiment qui produit des hormones qui nous donnent envie de passer à l’action et donc de nous déconcentrer. Il faut apprendre à passer outre ce cap pour approcher la concentration profonde et efficace.

https://www.calnewport.com/blog/2020/09/29/on-the-neurochemistry-of-deep-work/

Un bon exemple en la personne de Trump. En analysant ses tweets, on peut découvrir qu’il dort de moins en moins longtemps et que cela a un impact direct sur… ses tweets eux-mêmes ! Moins il dort, moins ses tweets sont positifs et moins ils génèrent de l’engagement. Trump ne m’intéresse pas, mais on peut facilement généraliser cette observation à soi-même.

https://www.psychnewsdaily.com/analysis-of-trumps-tweets-show-hes-sleeping-less-and-getting-angrier/

Il faut dire qu’il y’a de quoi être énervé, car, quand on prend du recul, notre technologie mirobolante fonctionne mal. Très mal. Ça clignote partout, mais faîtes un peu l’exercice de noter tout ce qui « ne va pas » dans une journée. Je suis ingénieur en informatique et j’ai passé plus d’une heure de ma matinée à tenter de me connecter à un site du gouvernement avec ma carte d’identité électronique.

https://tonsky.me/blog/tech-sucks/

Ce n’est pas un hasard si je me tourne de plus en plus vers le minimalisme numérique.

https://ploum.net/series/distraction-free/

Mais je suis loin d’être le seul. Exemple très proche du mien avec l’écrivaine Florie Vine.

https://florieteller.com/minimalisme-numerique/

Personnellement, je tente de ne plus créer de compte nulle part, de les supprimer (je vous en reparlerai), de ne plus télécharger de logiciels, de réduire mes besoins. Malheureusement, ceux qui conçoivent certains de mes logiciels ne font pas toujours pareil. Mozilla est actuellement sur la sellette. Alors que Firefox dégringole dans les parts de marché, que les seules sources de revenus proviennent, indirectement, du capitalisme de surveillance, le salaire des exécutifs n’a fait qu’augmenter. Comme dans les banques.

http://calpaterson.com/mozilla.html

Fierté

Beaucoup d’écrivains ont des pages Wikipédia. Mais combien sont cités dans les exemples du Wiktionnaire ? J’ai découvert que j’en fais partie. J’en suis très fier.

https://fr.wiktionary.org/wiki/salvation

Imaginaires & Vélo

J’aime beaucoup les nouvelles noires de Valéry Bonneau. Du coup, j’ai été content de découvrir qu’il sortait un recueil papier. Pas forcément pour les relire immédiatement, mais parce qu’elles méritent une place dans ma bibliothèque. Souvenez-vous d’Umberto Eco : une bibliothèque n’est pas la liste de ce qu’on sait, c’est une mine de ce qu’on ne connait pas encore.

https://www.valerybonneau.com/bibliographie/dans-la-foule-nouvelles-noires-pour-se-rire-du-desespoir-volume-5

Et même si je ne suis pas fan du format podcast, je n’ai pas pu résister de contribuer modestement au projet d’Antoine et Léa.

https://www.kisskissbankbank.com/fr/projects/nos-spheres-le-podcast-qui-interroge-nos-imaginaires-sociaux-et-politiques/tabs/description

Thierry Crouzet a organisé un tour en vélo de l’Hérault au mois d’avril. J’avais très envie de participer, mais le covid est passé par là. Finalement, ils ont été deux à le faire en septembre. Et c’est un régal à lire.

https://tcrouzet.com/2020/09/28/bikepacking-dans-la-tourmente/

Un régal et à la fois une frustration intense de ne pas avoir été présent. Mon expérience de 2019 me donne encore des fourmis dans les jambes. Je ne sais pas encore comment ni où ni avec qui, mais, en 2021, j’espère remettre le couvert.

https://ploum.net/de-la-mediterranee-a-latlantique-en-vtt/

J’avais séparé les sections « Imaginaires » et « Vélo ». Puis je suis retombé sur ce billet de Thierry :

https://tcrouzet.com/2019/02/15/le-velo-comme-ecriture/

Effondrement

Le problème du Covid ne serait pas la contagiosité, mais la variabilité de cette contagiosité. Les mesures à prendre pour une maladie à contagiosité variable sont très différentes. Continuez à éviter les réunions de famille, les sorties cinéma et les restaurants bondés.

https://www.theatlantic.com/health/archive/2020/09/k-overlooked-variable-driving-pandemic/616548/

De toute façon, si vous craignez un effondrement civilisationnel, j’ai une bonne nouvelle. Il ne va pas arriver. Nous sommes tout simplement en plein dedans. Avec de la chance, on y survit.

https://gen.medium.com/i-lived-through-collapse-america-is-already-there-ba1e4b54c5fc

Pour maximiser nos chances de survies, cependant, il faut peut-être accepter de prendre des décisions rationnelles. Notamment sur le fait que l’énergie nucléaire est la plus propre, la plus sûre et la plus efficace que nous ayons sous la main. Et que les radiations sont certainement beaucoup moins dangereuses que ce l’on peut croire.

https://www.bbc.com/news/science-environment-54211450

Journalisme

Le procès pour l’extradition de Julian Assange est l’occasion de condamner le fait de… faire du journalisme, tout simplement.

https://www.jonathan-cook.net/blog/2020-09-22/guardian-silent-assange-trial/

Le tout en l’accusant de broutilles techniques parce qu’il n’y a pas grand-chose d’autre dont on peut accuser Assange sans immédiatement accuser l’ensemble de la profession des journalistes.

https://dissenter.substack.com/p/prosecutors-password-cracking-conspiracy

Aucun média ne prend la défense d’Assange. Normal, les « journalistes » modernes sont désormais payés par les subventions publiques et par les grands groupes industriels.

https://ploum.net/la-mort-de-la-presse-tant-mieux/

L’imprimerie

Dans un billet que j’estime extrêmement important, je défendais l’idée selon laquelle l’imprimerie était un véritable tournant civilisationnel.

https://ploum.net/il-faudra-la-construire-sans-eux/

C’est avec surprise que j’ai découvert, au détour d’un roman très célèbre, que je bredouillais des idées défendues avec autrement de talent par un illustre prédécesseur. Je vous laisse deviner :

Chapitre 2 : Ceci tuera cela

À notre sens, cette pensée avait deux faces. C’était d’abord une pensée de prêtre. C’était l’effroi du sacerdoce devant un agent nouveau, l’imprimerie. C’était l’épouvante et l’éblouissement de l’homme du sanctuaire devant la presse lumineuse de Gutenberg. C’était la chaire et le manuscrit, la parole parlée et la parole écrite, s’alarmant de la parole imprimée ; quelque chose de pareil à la stupeur d’un passereau qui verrait l’ange Légion ouvrir ses six millions d’ailes. C’était le cri du prophète qui entend déjà bruire et fourmiller l’humanité émancipée, qui voit dans l’avenir l’intelligence saper la foi, l’opinion détrôner la croyance, le monde secouer Rome. Pronostic du philosophe qui voit la pensée humaine, volatilisée par la presse, s’évaporer du récipient théocratique. Terreur du soldat qui examine le bélier d’airain et qui dit : La tour croulera. Cela signifiait qu’une puissance allait succéder à une autre puissance. Cela voulait dire : La presse tuera l’église.

[…]

L’invention de l’imprimerie est le plus grand événement de l’histoire. C’est la révolution mère. C’est le mode d’expression de l’humanité qui se renouvelle totalement, c’est la pensée humaine qui dépouille une forme et en revêt une autre, c’est le complet et définitif changement de peau de ce serpent symbolique qui, depuis Adam, représente l’intelligence.

[…]

En même temps que les arts, la pensée s’émancipe de tous côtés. Les hérésiarques du moyen âge avaient déjà fait de larges entailles au catholicisme. Le seizième siècle brise l’unité religieuse. Avant l’imprimerie, la réforme n’eût été qu’un schisme, l’imprimerie la fait révolution. Ôtez la presse, l’hérésie est énervée. Que ce soit fatal ou providentiel, Gutenberg est le précurseur de Luther.

Vous avez bien entendu reconnu la plume de Victor Hugo dans « Notre-Dame de Paris ». Je ne résiste pas à vous donner un dernier extrait, issu du chapitre : « Gringoire a plusieurs bonnes idées de suite rue des Bernardins ».

– Qu’avez-vous donc tant qui vous attache à la vie ?
– Ah ! mille raisons !
– Lesquelles, s’il vous plaît ?
– Lesquelles ? L’air, le ciel, le matin, le soir, le clair de lune, mes bons amis les truands, nos gorges chaudes avec les vilotières, les belles architectures de Paris à étudier, trois gros livres à faire, dont un contre l’évêque et ses moulins, que sais-je, moi ? Anaxagoras disait qu’il était au monde pour admirer le soleil. Et puis, j’ai le bonheur de passer toutes mes journées du matin au soir avec un homme de génie qui est moi, et c’est fort agréable.

Je vous souhaite le même bonheur que Gringoire, d’excellentes lectures et un bon week-end !

Photo by Pedro Lastra on Unsplash

Je suis @ploum, ingénieur écrivain. Abonnez-vous pour recevoir mes billets par mail ou RSS, partagez mes écrits autour de vous autour de vous et soutenez-moi en achetant mes livres. Commandez Printeurs, mon dernier roman de science-fiction..

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

I published the following diary on isc.sans.edu: “Analysis of a Phishing Kit“:

Sometimes, attackers make mistakes and allow security researchers to access interesting resources. This time, it’s another phishing kit that was left in the wild on the compromised server. The file is called ‘2019Amex.zip’ (SHA256:269ab3970ef8997a61b1b14eebe5a2beb1348b2dcc5358ccd4314ad19a41daf5)… [Read more]

The post [SANS ISC] Analysis of a Phishing Kit appeared first on /dev/random.

October 01, 2020

Over moederliefde, gemengde relaties, vervreemding, Israël, Palestina, bezette gebieden, de Joodse identiteit, het Israëlisch leger … en zoveel meer. Een ietwat fragmentarisch maar zeer sterk verhaal, ondanks de emotioneel-filosofische stukken over de relatie tussen het Vlaamse hoofdpersonage en haar Joodse partner en zijn zoon. Het boek slaagt er in om de rol van het Israëlische militarisme en de bezetting (gevoelsmatig) te verklaren maar laat ook de donkere kant (verveling, willekeur, pesterijen, de scheve machtsverhoudingen) een grote rol spelen.

Israël/ Palestina is geen eenvoudige materie en dit boek is geen poging tot feitelijke beschrijving, maar het slaagt erin om een gevoel over te brengen zonder expliciet grote morele oordelen te vellen. Een aanrader!

September 29, 2020

I published the following diary on isc.sans.edu: “Managing Remote Access for Partners & Contractors“:

Yesterday, I wrote a quick diary about a potential security issue that some Tyler customers faced. Some people reacted to my diary with interesting comments in our forums. Two of them were interesting and deserve some review… [Read more]

The post [SANS ISC] Managing Remote Access for Partners & Contractors appeared first on /dev/random.

September 28, 2020

Nous interagissons avec l’information de deux façons : à travers une boîte, inbox, ou un flux. Mais le choix de ce mode d’interaction est loin d’être anodin !

Historiquement, nos interactions avec l’information se sont modelées sur celles du monde physique. L’information arrive dans une boîte que nous devons vider régulièrement. La fameuse inbox. Tout ce qui arrive dans une boîte doit être traité, même si cela est fait rapidement.

Il suffit de penser à une boîte aux lettres : si on ne la vide pas régulièrement, elle déborde et cesse de remplir son office. La boîte aux lettres remplie informe d’ailleurs le facteur et les voisins que le courrier délivré n’a plus d’effet.

En conséquence, le fonctionnement en boîte demande une certaine rigueur et régularité. Jusqu’au début du 21e siècle, le fonctionnement du courriel était similaire.

Cependant, deux innovations font subitement perturber cet état de fait. La généralisation du spam et l’apparition de GMail, offrant 1 Go d’espace pour nos emails là où les fournisseurs traditionnels oscillaient entre 10Mo et 100Mo.

Ces deux innovations combinées vont rendre le fait de vider sa boîte mail de plus en plus difficile, mais, surtout, de moins en moins nécessaire.

L’apparition du flux

Si la quantité d’informations est telle qu’il est impossible de la traiter, un nouveau paradigme mérite d’être exploré. Ce paradigme, popularisé par Facebook et Twitter à quelques mois d’écarts en 2006, c’est le flux.

Contrairement à la boîte, les éléments ne s’entassent pas dans le flux. Ils ne font que passer. Le flux donne une impression d’inéluctabilité, de soulagement. Avec le flux, je ne dois pas tout traiter, car c’est impossible. Je peux me contenter de picorer, de m’abreuver selon mon envie. Du moins, en théorie.

Le flux ne demande plus de rigueur, plus de volonté.

Le modèle est tellement puissant que le succès des messageries reposant sur ce concept est immédiat (Whatsapp, Messenger, Telegram et d’autres). On ne reçoit plus un message. On consulte une discussion infinie et permanente qu’on ne peut plus quitter.

Si l’avantage du flux est qu’il n’oblige pas de traiter l’information de manière structurée, qu’il permet d’être passif, son désavantage est qu’il oblige à être passif, qu’il empêche d’être structuré. Toute personne souhaitant reprendre le contrôle sur les informations qu’elle reçoit se voit noyée. Si le flux voulait nous libérer de devoir en permanence vider nos boîtes, il est impossible d’en décrocher. Il est permanent, il nous enchaîne et souligne toute l’information qui nous échappe.

La tentation de reprendre le contrôle

Le flux est infini. Il souligne donc l’infinité d’informations qui aurait pu nous être utile, nous amuser, nous intéresser. Il ne nous permet pas de dire « J’ai traité tout mon courrier, j’ai lu tout mon journal ». Il crée une angoisse permanente de rater des opportunités (FOMO, Fear Of Missing Out).

Pour certains, la solution est de continuer à suivre le flux jusqu’au moment où l’on retrouve une information connue. Cela revient à se surcharger mentalement pour tenter d’utiliser le flux comme une boîte.

Outre la surcharge mentale et le stress que crée ce mode d’utilisation, il a également le défaut de n’être plus applicable dès le moment où les créateurs du flux décident de rendre ce dernier imprévisible. Il est prouvé qu’une dose d’aléatoire est extrêmement addictive. Cerise sur le gâteau, sous couvert d’aléatoire il est désormais possible de personnaliser les informations que chacun va trouver dans son flux.

Alors que l’utilisateur naïf croit picorer dans une rivière, s’abreuver à une fontaine infinie de sérendipité, il rend en fait son jugement disponible à des algorithmes qui choisissent expressément ce qui a le plus de chances de le faire rester sur le site, de le faire réagir voire de le rendre plus sensible à la publicité d’un annonceur.

Le retour à la boîte

Après plus d’une décennie à tenter de transformer mon univers informationnel en un flux, je ne peux que constater l’étendue des dégâts. Le retour à la boîte n’est pas seulement souhaitable, il m’est indispensable. C’est une question de survie.

Certes, la boîte nécessite une rigueur. Une rigueur qui devient vite une habitude, un réflexe. Trouvez-vous difficile de vous assurer que votre boîte aux lettres physique ne déborde pas ? Et bien ce n’est pas plus difficile avec la boîte aux lettres virtuelles une fois que la machine est enclenchée.

Si une boîte mail contient 3432 mails avec un subtil jeu de lu/non lu et d’étoiles pour savoir ce qui est important et ce qui ne l’est pas, ce n’est plus une boîte, c’est devenu un flux. En étant très strict avec mon inbox 0, ma boîte mail est une réelle boîte qui m’a redonné le plaisir de communiquer par mail.

En ce qui concerne les informations que je souhaite consulter, les articles que je souhaite lire, j’utilise le RSS. Si l’on parle souvent de « flux RSS », le nom est trompeur. Tout comme l’email, le RSS apporte des éléments dans une de mes boîtes, mon lecteur RSS.

Le fait de garder séparées mes boîtes informationnelles « mail » et « RSS » a plusieurs avantages. Premièrement, je sais que ce qui est dans le RSS n’est pas urgent. Je peux ne pas le consulter si je n’en éprouve pas l’envie. Deuxièmement, je sais que ce n’est pas important. Si mon lecteur RSS déborde, par exemple au retour de vacances, je peux tout marquer comme lu sans arrière pensée. Enfin, là où le mail me force (et c’est une bonne chose) à prendre une action, le simple fait de lire un élément de mon lecteur le fait sortir de ma boîte. Le lecteur RSS se vide donc très rapidement en appuyant sur la touche « J » (raccourci pour « élément suivant » dans flus.io).

Si je ne peux pas « perdre » un élément passé dans mon flux RSS, je le rajoute dans Pocket. Pocket qui est mon inbox d’articles à lire. Une de plus.

D’ailleurs, dans un monde parfait certains flux RSS arriveraient directement dans Pocket, car je sais que je ne veux en rater aucun article. J’ai tenté de le faire avec Zappier, mais ce ne fut guère concluant.

En résumé, je dispose d’une boîte mail qui est importante et urgente, d’une boîte RSS qui n’est ni importante ni urgente et d’une boîte Pocket qui est importante, mais pas urgente.

Et les flux dans tout ça ?

Je cherche désormais à fuir les flux comme la peste. Si je veux suivre un compte Twitter, je le fais via Nitter dans mon lecteur RSS. Idem pour les comptes Mastodon. Je reste néanmoins exposé aux flux sur Whatsapp, Signal et pour les interactions sur Mastodon.

Je rêve de me débarrasser totalement des flux.

Mais cela n’est pas sans conséquence. Car les boîtes se vident. Et une fois mes boîtes vides, je suis confronté à ce que le flux tente de nous ôter : la solitude, la clarté d’esprit voire l’ennui. Un ennui salutaire qui n’est pas toujours facile alors qu’une partie de mon cerveau réclame à grands cris des gratifications rapides que seul le flux peut m’apporter.

Photo by Abdulla Abeedh on Unsplash

Je suis @ploum, ingénieur écrivain. Abonnez-vous pour recevoir mes billets par mail ou RSS, partagez mes écrits autour de vous autour de vous et soutenez-moi en achetant mes livres. Commandez Printeurs, mon dernier roman de science-fiction..

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

I published the following diary on isc.sans.edu: “PowerShell Backdoor Launched from a ShellCode“:

When you need to perform malicious actions on a victim’s computer, the Internet is full of resources that can be reused, forked, slightly changed to meet your requirements. After all, why reinvent the wheel if some pieces of code are available on GitHub for free? If you developed some offensive tools for good reasons (because you’re a pentester, a red teamer of just doing some research), chances are high that your code will be reused… [Read more]

The post [SANS ISC] PowerShell Backdoor Launched from a ShellCode appeared first on /dev/random.

September 26, 2020

In tegenstelling tot sommige van zijn andere boeken werd ik niet omvergeblazen door “Het Winterpaleis” van John Boyne. Het is weliswaar vlot geschreven fictie met flarden Russische geschiedenis, maar “de clou” was enigszins voorspelbaar en de aanwezigheid van het hoofdpersonage bij een aantal sleutelmomenten van het einde van de heerschappij van de Russische Tsaren nogal ongeloofwaardig.

Drie-en-half sterren, of ben ik te streng?