Jordi Inglada
17 Apr 2023

Use ChatGPT and feed the technofeudal beast

tl;dr1: Big Tech is deploying AI assistants on their cloud work-spaces to help you work better, but are you sure that what you produce using these tools falls under your copyright and not that of your AI provider?


Unless you have been living under a rock for the last few months, you have heard about ChatGPT and you probably have played with it. You may even make part of those who have been using it for somewhat serious matters, like writing code, doing your homework, or writing reports for your boss.

There are many controversies around the use of these Large Language Models (LLM, ChatGPT is not the only one). Some people are worried about white collar workers being replaced by LLM as blue collar ones were by mechanical robots. Other people are concerned with the fact that these LLM have been trained on data under copyright. And yet another set of people may be worried about the use of LLM for massive fake information spreading.

All these concerns are legitimate2, but there is another one that I don't see addressed and that, from my point of view is, at least, as important as those above: the fact that these LLM are the ultimate stage of proprietary software and user lock-in. The final implementation of technofeudalism.

Yes, I know that ChatGPT has been developed by OpenAI (yes open) and they just want to do good for humankind:

OpenAI’s mission is to ensure that artificial general intelligence (AGI)—by which we mean highly autonomous systems that outperform humans at most economically valuable work—benefits all of humanity. We will attempt to directly build safe and beneficial AGI, but will also consider our mission fulfilled if our work aids others to achieve this outcome.

But remember, ChatGPT is not open source and it is not a common good or a public service, as opposed to Wikipedia, for instance.

The evolution of user lock-in in software

Proprietary software is software that comes with restrictions on what the user can do with it.

A long time ago, software used to come in a box, on floppy disks, cartridges or CD-ROM. The user put the disk on the computer and installed it. There was a time, were, even if the license didn't allow it, a user could lend the disk to friends so they could install it on their own computers. At that time, the only lock-in that the vendor could enforce was that of proprietary formats: the text editor you bought would store your writing in a format that only that software could write.

In order to avoid users sharing a single paid copy of the software, editors implemented artificial scarcity: a registration procedure. For the software to work, you needed to enter a code to unlock it. With the advent of the internet, the registration could be done online, and therefore, just one registration per physical box was possible. This was a second lock-in. Of course this was not enough, and editors implemented artificial obsolescence: expiring registrations. The software could stop working after a predefined period of time and a new registration was needed.

Up to this point, clever users always found a way to unlock the software, because software can be retro-engineered. In Newspeak, this is called pirating.

The next step was to move software to the cloud (i.e. the editor's computers). Now, you didn't install the software on your computer, you just connected to the editor's service and worked on your web browser. This allowed the editor to terminate your license at any time and even to implement pay-per-use plans. Added to that, your data was hosted on their servers. This is great, because you always have access to the most recent version of the software and your data is never lost if your computer breaks. This is also great for the editor, because they can see what you do with their software and have a peek at your data.

This software on the cloud has also allowed the development of the so-called collaborative work: several people editing the same document, for instance. This is great for you, because you have the feeling of being productive (don't worry, it's just a feeling). This is great for the editor, because they see how you work. Remember, you are playing a video-game on their computer and they store every action you do3, every interaction with your collaborators.

Now, with LLM, you are in heaven, because you have suggestions on how to write things, you can ask questions to the assistant and you are much more productive. This is also great for the editor, because they now not only know what you write, how you edit and improve your writing, but they also know what and how you think. Still better, your interactions with the LLM are used to improve it. This is a win-win situation, right?

How do LLM work?

The short answer is that nobody really knows. This is not because there is some secret, but rather because they are complex and AI researchers themselves don't have the mathematical tools to explain why they work. We can however still try to get a grasp of how they are implemented. You will find many resources online. Here I just show off a bit. You can skip this section.

LLM are a kind of artificial neural network, that is, a machine learning system that is trained with data to accomplish a set of tasks. LLM are trained with textual data, lots of textual data: the whole web (Wikipedia, forums, news sites, social media), all the books ever written, etc. The task they are trained to perform is just to predict the next set of words given a text fragment. You give the beginning of a sentence to the system and it has to produce the rest of it. You give it a couple of sentences and it has to finish the paragraph. You see the point.

What does "training a system" mean? Well, this kind of machine learning algorithm is just a huge mathematical function which implements millions of simple operations of the kind \(output = a \times input + b\). All these operations are plugged together, so that the output of the first operation becomes the input of the second, etc. In the case of a LLM, the very first output is the beginning of the sentence that the system has to complete. The very last output of the system is the "prediction" of the end of the sentence. You may wonder how you add or multiply sentences? Well, words and sentences are just transformed to numbers with some kind of dictionary, so that the system can do its operations. So to recap:

  1. you take text and transform it to sequences of numbers;
  2. you take these numbers and perform millions of operations like \(a\times input + b\) and combine them together;
  3. you transform back the output numbers into text to get the answer of the LLM.

Training the model means finding the millions of \(a\) and \(b\) (the parameters of the model) that perform the operations. If you don't train the model, the output is just rubbish. If you have enough time and computers, you can find the good set of parameters. Of course, there is a little bit of math behind all this, but you get the idea.

Once the model is trained, you can give it a text that it has never encountered (a prompt) and it will produce a plausible completion (the prediction). The impressive thing with these algorithms is that they do not memorize the texts used for training. They don't check a database of texts to generate predictions. They just apply a set of arithmetic operations that work on any input text. The parameters of the model capture some kind of high level knowledge about the language structure.

Well, actually, we don't know if LLM do not memorize the training data. LLM are to big and complex to be analyzed to check that. And this is one of the issues related to copyright infringement that some critics have raised. I am not interested in copyright here, but this impossibility to verify that training data can't appear at the output of a LLM will be of crucial importance later on.

Systems like ChatGPT, are LLM that have been fine-tuned to be conversational. The tuning has been done by humans preparing questions and answers so that the model can be improved. The very final step is RLHF: Reinforcement Learning from Human Feedback. Once the model has been trained and fine-tuned, they can be used and their answers can be rated by operators in order to avoid that the model spits out racist comments, sexist texts or anti-capitalist ideas. OpenAI who, remember, just want to do good to humankind abused under-payed operators for this task.

OK. Now you are an expert on LLM and you are not afraid of them. Perfect. Let's move on.


If producing a LLM is not so complex, why aren't we all training our own models? The reason is that training a model like GPT-3 (the engine behind ChatGPT) needs about 355 years on a single NVIDIA Tesla V100 GPU4, so if you want to do this in something like several weeks you need a lot of machines and a lot of electricity. And who has the money to do that? The big tech companies.

You may say that OpenAI is a non profit, but Wikipedia reminds us that Microsoft provided OpenAI with a $1 billion investment in 2019 and a second multi-year investment in January 2023, reported to be $10 billion. This is how LLM are now available in Github Copilot (owned by Microsoft), Bing and Office 365.

Of course, Google is doing the same and Meta may also be doing their own thing. So we have nothing to fear, since we have the choice. This is a free market.

Or maybe not. Feudal Europe was not really a free market for serfs. When only a handful of private actors have the means to build this kind of tools we become dependent on their will and interests. There is also something morally wrong here: LLM like ChatGPT have been trained on digital commons like Wikipedia or open source software, on all the books ever written, on the creations of individuals. Now, these tech giants have put fences around all that. Of course, we still have Wikipedia and all the rest, but now we are being told that we have to use these tools to be productive. Universities are changing their courses to teach programming with ChatGPT. Orange is the new black.

Or as Cédric Durand explains it:

The relationship between digital multinational corporations and the population is akin to that of feudal lords and serfs, and their productive behavior is more akin to feudal predation than capitalist competition.


Platforms are becoming fiefs not only because they thrive on their digital territory populated by data, but also because they exercise a power lock on services that, precisely because they are derived from social power, are now deemed indispensable.5

When your thoughts are not yours anymore

I said above that I am not interested in copyright, but you might be. Say that you use a LLM or a similar technology to generate texts. You can ask ChatGPT to write a poem or the lyrics of a song. You just give it a subject, some context and there it goes. This is lots of fun. The question now is: who is the author of the song? It's clearly not you. You didn't create it. If ChatGPT had some empathy, it could give you some kind of co-authorship, and you should be happy with that. You could even build a kind of Lennon-McCartney joint venture. You know, many of the Beatles' songs were either written by John or Paul, but they shared the authorship. They were good chaps. Until they weren't anymore.

You may have used Dall-E or Stable Diffusion. These are AI models which generate images from a textual description. Many people are using them (they are accessible online) to produce logos, illustrations, etc. The produced images contain digital watermarking. This is a kind of code which is inserted in the image and that is invisible to the eye. This allows to track authorship. This can be useful to prevent deep fakes. But this can also be used to ask you for royalties if ever the image generates revenue.

Watermarking texts seems impossible. At the end of the day, a text is just a sequence of characters, so you can't hide a secret code in it, right? Well, wrong. You can generate a text with some statistical patterns. But, OK, the technology does not seem mature and seems easy to break with just small modifications. You may therefore think that there is no risk of Microsoft or Google suing you for using their copyrighted material. Well, the sad thing is that you produced your song using their software on their computers (remember, SaaS, the cloud), so they have the movie showing what you did.

This may not be a problem if you are just writing a song for a party or producing an illustration for a meme. But many companies will soon start having employees (programmers, engineers, lawyers, marketers, writers, journalists) producing content with these tools on these platforms. Are they willing to share their profits with Microsoft? Did I tell you about technofeudalism?

Working for the man

Was this response better or worse? This is what ChatGPT asks you if you tell it to regenerate a response. You just have to check one box: better, worse, same. You did it? Great! You are a RLHFer6. This is why ChatGPT is free. Of course, it is free for the good of humankind, but you can help it to get even better! Thanks for your help. By the way, Github Copilot will also get better. Bing also will get better. And Office 365 too.

Thanks for helping us feed the beast.




Abstract for those who have attention deficit as a consequence of consuming content on Twitter, Instragram and the like.


Well, at least if you believe in intellectual property, or think that bullshit jobs are useful or that politicians and companies tell the truth. One has to believe in something, I agree.


Yes, they do. This is needed to being able to revert changes in documents.


"My" translation. You have an interesting interview in English here


Reinforcement Learning from Human Feedback. I explained that above!

Tags: open-source free-software programming surveillance-capitalism
15 Apr 2023

Modernisation du SI, suites bureautiques dans le nuage et protection des secrets industriels

Les DSI1 des moyennes et grandes entreprises sont fatiguées de devoir maintenir et mettre à jour des centaines ou des milliers de postes de travail alors que l’informatique n’est pas cœur de métier de la boîte2. En plus, les informaticiens compétents ayant une bonne hygiène corporelle sont difficiles à trouver.

La réponse est évidemment de se tourner vers les « solutions » en ligne, le SaaS (Software as a Service), le cloud. C’est simple : le poste utilisateur peut se limiter à un terminal avec un navigateur internet qui se connectera aux serveurs de Microsoft ou de Google (les 2 fournisseurs principaux). Plus besoin d’installation locale de suite Office, plus besoin de mise à jour ou de montée en version, plus besoin de sauvegardes. C’est le fournisseur qui s’occupe de tout, les logiciels tournent chez lui et les documents produits sont aussi hébergés sur ses machines.

C’est simple, c’est dans le nuage : c’est la modernisation du SI !

Cependant, certaines entreprises sont trop à cheval sur la propriété intellectuelle, la souveraineté numérique et même la PPST ou le RGPD. Elles pourraient donc être réticentes à adopter ce type de solution. En effet, il peut être délicat de stocker des informations confidentielles sur des serveurs que l’on ne maîtrise pas. Mais comment rester compétitif face à ceux qui sont disruptifs, bougent vite et qui ne se laissent pas embêter par des amish ?

D’après les fournisseurs, il n’y a pas de crainte à avoir, car les solutions proposées permettent d’activer le chiffrement côté client. Ceci veut dire que les flux de données entre le poste utilisateur et les serveurs du fournisseur sont chiffrés cryptographiquement par une clé que seulement le client possède. La conséquence est que les documents stockés chez le fournisseur sont illisibles pour lui, car il n’a pas la clé.

Nous voilà rassurés. C’est sans doute pour cela que Airbus utilise Google Workspace3 ou que Thales utilise Microsoft 365. Par ailleurs, Thales est partenaire de Microsoft pour le développement des techniques de chiffrage. Cocorico !

Du coup, les appels d’offres de l’État français pour des suites bureautiques souveraines semblent ne pas avoir de sens. Surtout, qu’il y a aussi des partenariats franco-américains de « cloud de confiance » qui vont bientôt voir le jour. Mais il reste des questions à se poser. Par exemple, on peut lister ces points de vigilance :

Pourquoi le chiffrement côté client n’est-il pas fiable ? Pour commencer, ce chiffrement n’est pas complet : beaucoup d’informations sont accessibles en clair pour le fournisseur. Par exemple, les noms des documents, les entêtes des e-mails, les listes des participants à des réunions, etc. Les flux vidéo et audio seraient chiffrés, mais, même le fournisseur officiel de chiffrement pour Microsoft écrit ça dans les invitations à des visioconférences sur Teams :

Reminder: No content above "THALES GROUP LIMITED DISTRIBUTION” / “THALES GROUP INTERNAL" and no country eyes information can be discussed/presented on Teams.

Petite explication de « country eyes » par ici4.

Mais il y a un autre aspect plus intéressant concernant le chiffrement côté client. Ce chiffrement est fait par un logiciel du fournisseur pour lequel le client n’a pas le code source. Donc il n’y a aucune garantie que ce chiffrement est fait ou qu’il est fait proprement. On pourrait rétorquer que les logiciels peuvent être audités : le fournisseur vous laisse regarder le code ou il vous permet d’étudier le flux réseau pour que vous soyez rassuré. On peut répondre : dieselgate, c’est-à-dire, il n’y a aucune garantie que le logiciel se comporte de la même façon pendant l’audit que le reste du temps. De plus, vu que le fournisseur gère les mises à jour du logiciel, il n’y a pas de garantie que la version auditée corresponde à celle qui est vraiment utilisée.

Il semblerait donc que la vraie « solution » soit d’héberger ses propres données et logiciels et que le code source de ces derniers soit disponible. Le cloud suzerain5 n’est pas une fatalité.



Direction des Systèmes d’Information, le département informatique.


Il y a aussi des entreprises dont l’informatique est le cœur de métier qui font aussi ce que je décris par la suite.


On a fait un long chemin depuis que Airbus portait plainte pour espionnage industriel de la part des USA. Depuis Snowden, on sait que la NSA s’abreuve directement chez les GAFAM.


"A surveillance alliance is an agreement between multiple countries to share their intelligence with one another. This includes things like the browsing history of any user that is of interest to one of the member countries. Five eyes and Fourteen eyes are two alliances of 5 and 14 countries respectively that agree to share information with one another wherever it is mutually beneficial. They were originally made during the cold war as a means of working together to overcome a common enemy (the soviet union) but still exist today."


Non, pas de coquille ici.

Tags: fr open-source free-software cloud GAFAM
27 May 2022


Parcoursup est une machine à frustrations.

Les règles de classement des candidats par chaque formation sont opaques. Dans les formations sélectives, l'écart de notation entre les dossiers des admis et de ceux non admis peut être extrêmement faible. Du fait que les bulletins de notes ont un poids non négligeable, on peut se poser la question de l'équité entre élèves de classes et d'établissements différents.

À cela, il faut ajouter l'angoisse de devoir faire des choix dans un temps limité avant de perdre l'accès à des formations où le candidat est accepté.

Tout cela fait que Parcoursup est un Lotto géant où ceux qui sont mal conseillés risquent de perdre.

J'ai fait un petit programme qui permet de jouer à Parcoursup pour apprendre à gérer le stress auquel élèves et parents serons soumis.

L'interface utilisateur est rudimentaire, mais je ne sais pas faire aussi joli que les EdTech!


C'est une simulation qui utilise le hasard pour générer des scénarios. Ce que vous obtiendrez, même si vous rentrez correctement les données correspondant à vos vœux Parcoursup, ce sont des résultats aléatoires. Cependant, ce n'est pas n'importe quoi!

Le simulateur utilise votre rang dans votre classe pour vous attribuer un rang dans chaque formation. Le taux d'acceptation de chaque formation est aussi utilisé. La simulation de l'évolution des listes d'attente essaie d'être plausible, mais j'ai fait des choix arbitraires. Si cela vous intéresse, regardez le code. J'ai essayé de le documenter avec des explications détaillées.

Entre 2 parties du jeu, même si vous gardez les mêmes données d'entrée, les résultats seront différents. L'idée est que vous puissiez faire plein de simulations pour être confrontés à des choix qui ressemblent à ceux que vous pourriez être amenés à faire.


Vous aurez besoin de Python 3.x. Autrement, il suffit de récupérer le fichier

Vous devez adapter le programme à votre cas à votre cas particulier.

D'abord, vous devez modifier les valeurs suivantes :

# Votre rang dans votre classe

# Nombre d'élèves dans votre classe

Ensuite, vous devez rentrer vos vœux :

# Un voeux est un tuple ("nom", nb_places, rang_dernier_2021, taux_acceptation)
        "MIT - Aerospace",
        "Élite - Youtubeur ",
        "Oxford - Maths",
        "Stanford - Artificial Intelligence",
        "HEC pour fils à Papa",
    ("Fac de truc qui sert à rien", 1500, 145300, 0.9999),
    ("Éleveur de chèvres dans les Pyrénées", 180, 652, 0.1),

Les informations nécessaires (nombre de places, rang du dernier accepté l'année précédente et taux d'acceptation) sont disponibles dans votre espace Parcoursup.

Tuto indispensable

Vous pouvez lancer le programme en ligne de commande comme ceci :


Si vous utilisez un éditeur comme Pyzo ou Spyder, vous pouvez simplement exécuter le programme depuis l'éditeur.

Une fois lancé, vous aurez ceci :

$ python 
Bienvenue dans LottoSup™.
Appuyez sur une touche pour jouer!

Appuyez sur une touche pour lancer la machine infernale et retrouver les résultats du premier jour. Vous pourriez avoir, par exemple, ce résultat :

################# Jour 1 #####################

        ======== Status.ACCEPT ========
6) Fac de truc qui sert à rien
        1500 places - rang 2021 : 145300
        votre rang : 655 - rang dernier : 4929
        date limite : jour 5
        Statut : Status.ACCEPT 🎉

        ======== Status.WAIT ========
2) Élite - Youtubeur 
        25 places - rang 2021 : 79
        votre rang : 82 - rang dernier : 27
        date limite : jour 45
        Statut : Status.WAIT ⏳

4) Stanford - Artificial Intelligence
        42 places - rang 2021 : 322
        votre rang : 182 - rang dernier : 64
        date limite : jour 45
        Statut : Status.WAIT ⏳

1) MIT - Aerospace
        60 places - rang 2021 : 296
        votre rang : 259 - rang dernier : 66
        date limite : jour 45
        Statut : Status.WAIT ⏳

7) Éleveur de chèvres dans les Pyrénées
        180 places - rang 2021 : 652
        votre rang : 782 - rang dernier : 191
        date limite : jour 45
        Statut : Status.WAIT ⏳

Acceptation définitive [idx ou 0] :     

On peut voir la liste des formations où vous êtes accepté et celles où vous êtes en liste d'attente. Pour chaque formation, vous avez les informations que Parcoursup est censé vous donner :

  • le nombre de places dans la formation
  • le rang (classement) du dernier qui a été accepté l'année précédente
  • votre rang pour cette formation
  • le rang du dernier à avoir été accepté cette année (si votre rang est inférieur, vous êtes accepté, sinon, vous êtes en liste d'attente)
  • la date limite de réponse pour cette formation avant que l'offre d'acceptation expire (si vous êtes en liste d'attente, cette date correspond au dernier jour de la phase principale, que j'ai fixé à 45)

Ensuite, vous devez faire vos choix. Il faut d'abord répondre si vous voulez accepter définitivement une formation où vous êtes accepté. Rentrez le numéro qui apparaît dans la liste, à gauche du nom de la formation (6 dans l'exemple ci-dessus). Pour ne pas faire de choix, rentrez 0. Si vous acceptez une formation, le jeu est fini.

On vous demande ensuite si vous voulez faire une acceptation temporaire :

Acceptation temporaire [idx ou 0] : 

Si vous faites une acceptation temporaire, vous refusez automatiquement toutes les autres où vous êtes accepté, mais cela n'a pas d'impact sur la liste d'attente.

La question suivante concerne les formations que vous voulez refuser :

Rejets [id1 id2 ... ou 0] : 

Ici, on peut donner une liste d'indices parmi ceux des formations où vous êtes accepté ou en liste d'attente. Elles disparaîtront de la liste le jour suivant. Si vous ne voulez rien refuser, rentrez 0.

Et on passe au jour suivant. Il se peut que rien ne change, mais probablement, le rang du dernier accepté dans les formations va évoluer. Ceci peut vous permettre d'être accepté à d'autres formations.

Quand on arrive au jour 5, c'est la date d'expiration des offres que vous avez reçu jusque là :

################# Jour 5 #####################

        ======== Status.ACCEPT ========
6) Fac de truc qui sert à rien
        1500 places - rang 2021 : 145300
        votre rang : 655 - rang dernier : 42447
        date limite : jour 5
        Statut : Status.ACCEPT 🎉

        ======== Status.WAIT ========
2) Élite - Youtubeur 
        25 places - rang 2021 : 79
        votre rang : 82 - rang dernier : 31
        date limite : jour 45
        Statut : Status.WAIT ⏳

4) Stanford - Artificial Intelligence
        42 places - rang 2021 : 322
        votre rang : 182 - rang dernier : 84
        date limite : jour 45
        Statut : Status.WAIT ⏳

1) MIT - Aerospace
        60 places - rang 2021 : 296
        votre rang : 259 - rang dernier : 91
        date limite : jour 45
        Statut : Status.WAIT ⏳

7) Éleveur de chèvres dans les Pyrénées
        180 places - rang 2021 : 652
        votre rang : 782 - rang dernier : 285
        date limite : jour 45
        Statut : Status.WAIT ⏳

Acceptation définitive [idx ou 0] :   

Ici, si je ne fais pas une acceptation temporaire de la formation no. 6, elle disparaîtra le jour suivant. Si je l'accepte temporairement, sa date limite de réponse est repoussée à la fin de la phase principale de Parcoursup. Voici mes réponses :

Acceptation définitive [idx ou 0] : 0 
Acceptation temporaire [idx ou 0] : 6
Rejets [id1 id2 ... ou 0] : 0

Et donc le jour suivant j'ai ça :

################# Jour 6 #####################

        ======== Status.ACCEPT ========
6) Fac de truc qui sert à rien
        1500 places - rang 2021 : 145300
        votre rang : 655 - rang dernier : 45414
        date limite : jour 45
        Statut : Status.ACCEPT 🎉

        ======== Status.WAIT ========
2) Élite - Youtubeur 
        25 places - rang 2021 : 79
        votre rang : 82 - rang dernier : 31
        date limite : jour 45
        Statut : Status.WAIT ⏳

4) Stanford - Artificial Intelligence
        42 places - rang 2021 : 322
        votre rang : 182 - rang dernier : 84
        date limite : jour 45
        Statut : Status.WAIT ⏳

1) MIT - Aerospace
        60 places - rang 2021 : 296
        votre rang : 259 - rang dernier : 97
        date limite : jour 45
        Statut : Status.WAIT ⏳

7) Éleveur de chèvres dans les Pyrénées
        180 places - rang 2021 : 652
        votre rang : 782 - rang dernier : 307
        date limite : jour 45
        Statut : Status.WAIT ⏳

J'ai donc assuré une formation et je peux attendre de remonter dans la liste d'attente. Il ne me reste que 51 places pour apprendre à devenir Youtubeur.

Quelques détails de mise en œuvre

J'ai seulement utilisé des modules disponibles dans la bibliothèque standard Python. J'avais fait une première version qui utilisait Numpy pour les tirages aléatoires, mais finalement le module math contient tout, y compris le tirage avec une loi exponentielle.

import math
import random
import sys
from enum import Enum, auto

Chaque formation a un état différent (acceptation, liste d'attente, etc.). Je modélise ça avec des énumérations. Ce sont des ensembles de valeurs restreintes :

class Status(Enum):
    ACCEPT = "🎉"  # la formation a accepté
    WAIT = "⏳"
    REJECT = "☠️"  # la formation a rejeté
    DROP = "💪"  # le candidat a rejeté
    EXPIRED = "⌛"  # date limite dépassée
    CHECK = "☑️"  # le candidat a accepté définitivement

Les réponses des candidats aux propositions d'acceptation ou de liste d'attente, sont modélisées de la même façon :

class Choix(Enum):
    WAIT = auto()  # le candidat maintient l'attente
    DROP = auto()  # le candidat a rejeté
    CHECK = auto()  # le candidat a accepté définitvement
    ACCEPT = auto()  # acceptation non définitive

Cela peut sembler redondant, mais les valeurs ne sont pas les mêmes et, surtout, elles n'ont pas la même signification. Par exemple, ACCEPT de la part du candidat veut dire qu'il réserve une place, tandis qu'un ACCEPT de la part d'une formation, ne veut pas dire que le candidat accepte.

Ensuite, je modélise chaque formation par une classe. Le candidat a un rang dans la formation et les acceptations se font en fonction du nombre de places disponibles et le rang du candidat. On gère une liste d'attente qui s'actualise chaque jour en fonction des refus des autres candidats.

class Formation:
    def __init__(self, idx, nom, places, rang_dernier_2021, taux_accept):
        self.nom = nom
        self.idx = idx
        self.total_places = places
        self.rang_dernier_2021 = rang_dernier_2021
        self.rang_dernier = self.total_places
        self.taux_acceptation = taux_accept
        self.votre_rang = self.compute_rang()
        self.date_limite = DUREE_PS  # jour limite pour répondre
        self.places_disponibles = self.total_places
        self.status = None  # statut du candidat dans la formation

La méthode __init__ est le constructeur de la classe. Elle initialise la formation à partir des paramètres suivants :

un indice unique pour chaque formation qui nous permettra de gérer les réponses de l'utilisateur
le nom de la formation (pour l'affichage)
nombre de places disponibles
rang du dernier candidat admis l'année précédente
le taux d'acceptation de la formation

Afin de pouvoir afficher une formation avec print(), nous définissons la méthode =__repr__= :

    def __repr__(self):
        """ Pour un affichage avec print()"""
        return (
            f"{self.idx}) {self.nom}\n"
            f"\t{self.total_places} places -"
            f" rang 2021 : {self.rang_dernier_2021}\n"
            f"\tvotre rang : {self.votre_rang} -"
            f" rang dernier : {self.rang_dernier}\n"
            f"\tdate limite : jour {self.date_limite}\n"
            f"\tStatut : {self.status} {self.status.value}\n"

Plus intéressante est la façon de définir le rang du candidat (son classement) dans la formation. Avec le nombre de places et le taux d'acceptation, on calcule le nombre de candidats. Le rang du candidat parmi tous les autres est calculé à partir du rang dans sa classe par une simple règle de trois. Pour donner un peu de réalisme, on fait un tirage aléatoire avec une loi gaussienne de moyenne égale à ce rang et un écart type de 10 (parce que!). La gaussienne étant à support non borné, on coupe entre 0 et le nombre de candidats.

    def compute_rang(self):
        nombre_candidats = self.total_places / self.taux_acceptation
        rang_moyen = RANG_CLASSE / TAILLE_CLASSE * nombre_candidats
        tirage = random.gauss(rang_moyen, 10)
        rang = int(min(nombre_candidats, max(tirage, 0)))
        return rang

Cette méthode est appelée par le constructeur lors de l'initialisation de la formation.

À chaque fois que le candidat reçoit une offre de formation, elle est accompagnée d'une date limite de réponse :

    def update_date_limite(self, jour):
        if jour < 5:
            self.date_limite = 5
            self.date_limite = jour + 1

Pour simuler l'évolution de la liste d'attente chaque jour, on calcule simplement le rang du dernier accepté dans la formation. Cela nous évite de devoir simuler les refus de candidats (c'est des adolescents, ils sont imprévisibles).

La position du dernier admis avance avec selon une densité de probabilité exponentielle (il est plus probable que la position du dernier avance de peu de places que de beaucoup) :

\[p(x) = \lambda e^{-\lambda x}\]

La moyenne de cette loi (λ), décroît avec les jours qui passent (davantage de candidats se désistent les premiers jours que par la suite).

Pour fixer λ, on part du 99è quantile (la valeur de la variable pour laquelle on a 99% de chances d'être en dessous). Pour la distribution exponentielle, la fonction quantile est : \[q = -\ln(1-p)/\lambda\]

De façon arbitraire, on prend q égal à un dixième de la longueur de la liste d'attente.

    def update_rang_dernier(self, jour):
        longueur_attente = max(
            self.rang_dernier_2021 - self.rang_dernier + 1, 1
        jours_restants = DUREE_PS - jour + 1
        q = longueur_attente / 10
        p = min(
            0.999, float(jours_restants / DUREE_PS) * 0.99
        )  # on fixe le max à 0.999 pour éviter des exceptions dans le log
        lam = max(-(math.log(1 - p) / q), 1e-15)
        tirage = random.expovariate(lam)
        self.rang_dernier += int(tirage)

Le statut du candidat dans la formation est actualisé chaque jour. On utilise la méthode suivante dans 2 cas :

  1. la mise à jour automatique du système chaque nuit,
  2. la mise à jour après choix du candidat.

La mise à jour du lotto Parcoursup est faite de la façon suivante. Au départ, un candidat est accepté par une formation si son rang est inférieur ou égal au nombre de places de la formation. Les jours suivants, il est accepté si son rang est inférieur au dernier admis cette année. Un candidat est refusé par une formation si son rang es de 20% supérieur à celui du dernier admis l'année dernière (je ne pense pas que ce soit la règle utilisée par les formations, mais j'aime bien être sévère avec ces jeunes …). On gère aussi l'expiration des délais d'attente de réponse. Si le délai est dépassé, l'offre expire.

La gestion des choix du candidat consiste à mettre à jour le statut de la formation en fonction de sa réponse.

    def update_status(self, jour, choix: Choix = None):
        if choix is None:
            if self.votre_rang <= self.rang_dernier and (
                self.status == Status.WAIT or self.status == Status.ACCEPT
                if self.status != Status.ACCEPT:
                    self.status = Status.ACCEPT
            elif self.votre_rang >= self.rang_dernier_2021 * 1.2:
                self.status = Status.REJECT
                self.status = Status.WAIT
            if self.status == Status.ACCEPT and jour > self.date_limite:
                self.status = Status.EXPIRED
        elif choix == Choix.CHECK:
            self.status = Status.CHECK
        elif choix == Choix.DROP:
            self.status = Status.DROP
        elif choix == Choix.WAIT:
            self.status = Status.WAIT

Et c'est tout pour les formations.

On passe ensuite à la simulation des actualisation journalières du système. On crée aussi une classe pour cela.

class Parcoursup:
    def __init__(self, voeux):
        self.voeux = voeux
        self.jour = 0
        for v in self.voeux:

La classe est construite avec les vœux du candidat le jour 0. Pour chaque vœux, on fait une mise à jour définies par les formations.

Ensuite, on a une méthode pour l'itération journalière du système. C'est simple :

  • on commence par mettre à jour en chaque formation pour le jour courant,
  • on affiche les résultats de l'algo PS®,
  • on demande au candidat de faire ses choix et
  • on élimine les formations refusées par le candidat.
    def iteration(self):

        self.jour += 1
        for v in self.voeux:

Pour faire tout ça, on aura besoin de quelques petites méthodes. D'abord, il nous faut pouvoir récupérer un voeu à partir de son identifiant unique :

    def get_voeu(self, idx):
        for v in self.voeux:
            if v.idx == idx:
                return v

Si le candidat accepte temporairement une formation, il refuse automatiquement toutes les autres où il a été accepté. That's life. Bienvenue au monde des adultes …

    def drop_all_accept_except(self, accept_tmp):
        for v in self.voeux:
            if v.idx != accept_tmp and v.status == Status.ACCEPT:
                v.update_status(self.jour, Choix.DROP)

Une petite fonction pour poser une question à l'utilisateur et récupérer sa réponse :

    def get_input(self, message, single_value=False):
        print(message, end=" ")
        resp = input()
        if single_value:
                val = int(resp)
                return val
            except ValueError:
                self.get_input(message, True)
            return resp.split()

Ici, on fait l'interaction avec l'utilisateur pour gérer les choix. On commence par lui demander s'il veut accepter définitivement une formation, on passe ensuite à l'acceptation temporaire et on finit par récupérer les formations refusées. En cas d'acceptation (définitive ou temporaire) on vérifie qu'il choisit des formations pour lesquelles il a été accepté! Si vous avez des ados à la maison, vous comprendrez que c'est une bonne précaution à prendre …

    def choice(self):
        accept_def = self.get_input(
            "Acceptation définitive [idx ou 0] :", True
        while accept_def != 0:
            v_accept = self.get_voeu(accept_def)
            if v_accept.status == Status.ACCEPT:
                v_accept.update_status(self.jour, Choix.CHECK)
                    "Félicitations, vous avez accepté définitivement"
                    " la formation\n"
                    "Vous n'avez pas été accepté dans la formation\n"
                accept_def = self.get_input(
                    "Acceptation définitive [idx ou 0] :", True

        accept_tmp = self.get_input(
            "Acceptation temporaire [idx ou 0] :", True
        while accept_tmp != 0:
            v_accept = self.get_voeu(accept_tmp)
            if v_accept.status == Status.ACCEPT:
                v_accept.date_limite = DUREE_PS
                    "Vous n'avez pas été accepté dans la formation\n"
                accept_tmp = self.get_input(
                    "Acceptation temporaire [idx ou 0] :", True
        rejets = self.get_input("Rejets [id1 id2 ... ou 0] :", False)
        if rejets[0] == "0":
            return None
        for rejet in rejets:
            v_rejet = self.get_voeu(int(rejet))
            if v_rejet is not None:
                v_rejet.update_status(self.jour, Choix.DROP)

Il y a quelques doublons dans le code qui auraient pu être factorisés dans une autre méthode, mais ça fait l'affaire.

Voici la méthode pour éliminer les formations qui ne sont ni acceptées ni en liste d'attente :

    def clean(self):
        self.voeux = {
            for v in self.voeux
            if (v.status == Status.ACCEPT or v.status == Status.WAIT)

Et finalement, une fonction pour afficher les résultats du lotto journalier. Seulement les formations où le candidat est accepté ou en liste d'attente sont affichées. Il ne faut pas remuer le couteau dans la plaie!

    def print(self):
        print(f"################# Jour {self.jour} #####################\n")
        for s in [Status.ACCEPT, Status.WAIT]:
            print(f"\t======== {s} ========")
            for v in self.voeux:
                if v.status == s:

Nous avons terminé avec la classe Parcoursup.

La fonction principale pour faire tourner la simulation. On lit les veux du candidat et on initialise la simulation. On simule (DUREE_PS = 45 par défaut) jours d'agonie et de stress.

def main():
    voeux = {
        Formation(idx, n, p, r, tr)
        for idx, (n, p, r, tr) in enumerate(VOEUX, start=1)
    ps = Parcoursup(voeux)
    print("Bienvenue dans LottoSup™.\n" "Appuyez sur une touche pour jouer!\n")
    for it in range(DUREE_PS):

Le code est relativement simple et court, ce qui permet d'en changer le comportement relativement facilement.

Tags: fr programming python education politics
30 Jan 2022

SFR & Moi, et mon transit

tl;dr1 : Soudainement, il y a quelques semaines, ma connexion internet par câble coaxial a commencé à souffrir de constipation intermittente. La solution de mon opérateur : manger de la fibre pour améliorer le transit moyennant une augmentation de 25% du prix de l'abonnement.

SFR & moi, une longue histoire

Je suis client de SFR pour l'accès à internet depuis plus de 10 ans, ce qui pour ce genre de service est une éternité. Je suis donc très fidèle. C'est sans doute pour cela que SFR prend autant soin de moi. Depuis 2016, j'ai une connexion haut débit par câble coaxial qui vient d'un nœud optique (la vraie fibre, à ne pas confondre avec la fibre2) sur un poteau en face de chez moi. En général, la connexion a été toujours fiable, sauf un incident il y a environ 2 ans suite au branchement d'un voisin.

Malheureusement, depuis quelques mois, il y a des pertes de connexion intermittentes : pendant quelques minutes, plus de connexion à internet, mais une ré-initialisation de la box semblait résoudre le problème. Cela arrivait une fois par jour au maximum. La situation s'est dégradée depuis quelques semaines. Les pertes de connexion ont lieu presque toutes les heures et réinitialiser la box n'a pas d'effet sur le problème.

Un service technique à votre écoute

Début janvier, j'ai donc appelé le service technique pour leur faire part de mon problème. La première proposition qu'on m'a faite, avant toute autre chose, a été de «passer sur la vraie fibre, car la connexion est plus stable». Je leur ai expliqué que ma connexion a été très stable pendant des années et qu'il devait y avoir un autre problème. Ils ont été suffisamment gentils pour me proposer le vaudou habituel : réinitialiser la box, débrancher le câble, souffler dedans, rebrancher et ajouter une patte de poulet. Après cela, la connexion marchait! J'ai essayé d'expliquer que, comme les coupures sont intermittentes, on n'était pas vraiment surs que le problème soit résolu. Mon interlocuteur m'a fait comprendre qu'il ne pouvait rien d'autre pour moi. Fin du premier acte.

Deux jours plus tard, je me suis permis de rappeler le service technique, car la situation était la même qu'avant mon premier appel. J'ai passé l'étape habituelle de l'identification (numéro de téléphone fixe, nom et prénom, numéro de portable), ce qui est cocasse, car en appelant avec mon portable, on me demande d'appuyer sur 1 si ma demande concerne ma ligne 05.67.XX.XX.XX. Ils savent bien que je suis, quel est mon numéro de portable et de fixe. Mais bon, je suppose que ça leur donne le temps d'ouvrir mon dossier. J'explique à nouveau mon problème (même si mon interlocuteur a mon dossier devant les yeux) et on me propose de … «passer sur la vraie fibre, car la connexion est plus stable». Je leur explique à nouveau que le problème n'est pas là (ça marchait correctement avant) et que je n'ai pas envie d'augmenter ma facture de 25%. Réponse : on peut me faire une réduction de 25% la première année. J'insiste pour une solution technique et non pas commerciale et on accède finalement à m'envoyer un technicien dans quelques jours.

Le jour J, le technicien arrive chez moi, je lui explique le problème et il regarde la qualité du signal qui arrive dans mon salon, juste avant la box. Tout est OK. Son verdict : il y a un problème réseau, soit sur le branchement sur le poteau dans la rue (là où la fibre dérive vers le coaxial), soit plus loin. Évidemment, il n'a pas le droit de sortir son échelle et regarder le poteau, parce qu'il ne fait pas partie de l'équipe réseau, même s'il saurait faire le boulot. Mais, pas de panique, une personne habilité interviendra dans les 48h.

Le lendemain, ou le surlendemain (désolé, je commence à fatiguer), je reçois un SMS de SFR en me disant que le compte-rendu d'intervention est disponible sur mon espace client. Chouette! Le technicien réseau est passé et a réparé la panne. Je regarde mon espace client et je vois ceci :


Passée la déception de constater qu'il s'agissait de l'intervention du monsieur qui est venu chez moi et non pas de McGyver 🛠 habilité à intervenir sur le poteau, il y a eu une surprise. Je n'ai rien signé lors de la visite du technicien. Même pas un gribouillis avec le doigt sur une tablette. C'est sans doute à cause des gestes barrière pour me protéger, mais ça fait bizarre de n'avoir même pas été interrogé sur le fait que j'étais d'accord sur ce compte rendu. Je ne vais pas appeler la répression des fraudes pour un simple malentendu!

Un service technique très cohérent

Pour lever l'ambiguïté sur ce compte rendu et savoir si Monsieur Réseau allait passer, j'ai encore appelé le service technique. Je suis toujours aussi bien reçu : déclaration de mon identité avec toutes les coordonnées, au cas où ça aurait changé depuis 2 jours, explication du problème, car à chaque fois c'est un interlocuteur différent qui doit m'occuper le temps d'ouvrir le dossier, et puis la proposition de «passer sur la vraie fibre, car la connexion est plus stable». J'essaie d'expliquer à nouveau que leur forfait 25% plus cher ne m'intéresse toujours pas et que je n'ai pas besoin de doubler mon débit (de toute façon, le double de 0 n'est pas énorme non plus). Je veux juste avoir le service qui correspond à mon abonnement (qui d'ailleurs fait toujours partie des offres en cours) et qui marchait très bien jusqu'à il y a quelques mois.

Je ne regarde pas les chaînes d'info en continu, mais si les lois de la physique avaient changé depuis peu, je pense que je l'aurais appris. La technologie par câble coaxial, doit être toujours utilisable!3

J'insiste donc pour qu'une solution au problème technique soit apportée. On me propose le passage d'un technicien chez moi. Je leur rappelle que ça c'est fait et qu'on attend l'équipe réseau. La dame perd patience et devient désagréable et me dit que si j'ai la solution, je n'ai qu'à résoudre le problème moi-même.

Je la remercie pour sa suggestion. Je raccroche et je me connecte sur l'interface d'administration de la box pour regarder les journaux (les logs). C'est très facile, il suffit d'utiliser un navigateur et aller sur et on peut voir ça, par exemple :

 1/23/2022, 11:37:28 AM 	 Dynamic Range Window violation 
 1/23/2022, 11:37:28 AM 	 Unicast Ranging Received Abort Response - Re-initializing MAC;... 
 1/23/2022, 12:57:00 PM 	 Dynamic Range Window violation 
 1/23/2022, 12:57:00 PM 	 Unicast Ranging Received Abort Response - Re-initializing MAC;...

Génial. Ça colle avec les dernières coupures. Et une recherche sur internet confirme que cela peut venir du splitter du poteau d'en face. Mais ça, le service technique le sait déjà, parce qu'ils ont accès aux journaux de ma box et à plein d'autres informations. Si personne d'autre dans mon secteur a le problème, c'est bien de la dernière dérivation que cela doit venir (sous hypothèse que le technicien qui est venu chez moi ait fait correctement son travail).

J'attends 2 jours de plus (je suis vachement patient) et je rappelle le service technique pour voir s'ils savent quand est-ce que Monsieur Réseau va passer. Je suis hyper-rodé : numéro de ligne fixe, nom et prénom, numéro de portable, passe vaccinal, je leur donne tout. J'explique mon problème, ils consultent mon dossier et me confirment qu'ils ont demandé le passage d'un technicien réseau, mais ils sont incapables de me donner une date. Mais vraiment, je devrais «passer sur la vraie fibre, car la connexion est plus stable» … Je sens que ma tête tourne … J'essaie de leur montrer la cohérence de ma demande : ça marchait, ça ne marche plus, il n'est pas nécessaire de changer la box, de faire une tranchée qui traverse la rue et augmenter le prix de mon abonnement. Il suffit de réparer la panne!

On ne parle pas la même langue. C'est peut-être mon accent?

Community Managers empathiques et utiles

Puisque je ne suis pas bon à l'oral, je me dis que «La communauté SFR», le forum en ligne des utilisateurs modernes reste ma dernière chance. De plus, j'y vois pas mal de messages de vaches à lait clients qui ont des problèmes très similaires au mien.

Je suis au bon endroit. Il y a même des SFR Community Managers qui donnent des réponses certifiées par SFR! Je suis sûr qu'il s'agit de jeunes de la génération Z empathiques, qui ne parleront pas de technicien mais de et qui me donneront la solution (certifiée par SFR).

Avant de poser la question, je lis quelques échanges, histoire de m'imprégner de la nétiquette du lieu. Je repère quelques débuts de réponse (certifiée par SFR, car ce sont des Community Managers) qui me font sentir bien : «Je comprends votre ressenti devant cette situation qui dure». Ah, j'ai envie de m'asseoir en tailleur et boire du thé. ☮

Par contre, je suis un peu déçu par «Il faudrait en effet qu'un technicien se déplace pour pouvoir investiguer», car technicien au masculin ne fait pas trop Community Manager inclusif, végan et vélotaffeur.

Je continue à lire et je trouve ceci : «Pour rappel, nous ne pouvons pas agir sur ce genre de problématique sur la Communauté SFR, sans lien avec les services client et technique.»

Ah bon? Pas de lien avec les services client et technique? J'ai compris! La Communauté SFR sert à ce que les clients trouvent des solutions entre eux, et les Community Managers sont là pour … euh … en fait, je ne comprends pas.

Je vois que SFR a aussi une présence sur les réseaux dits sociaux, mais toutes leurs réponses ressemblent à ça :

Je vous présente toutes mes excuses pour cette mésaventure. Pouvez-vous passer en message privé juste ici svp? 👉 Notre conseiller va vous venir en aide sans plus tarder.

Faut-il râler sur Twitter pour être finalement entendu?

Une relation humaine et respectueuse du client

Si on résume, on a :

  1. un service technique qui propose un changement d'abonnement (plus cher) à chaque appel au lieu de résoudre le problème technique;
  2. un technicien qui diagnostique un problème, mais qui n'a pas le droit d'intervenir;
  3. une équipe réseau qui n'intervient pas et qui ne peut pas être contactée par le service technique;
  4. un forum d'aide avec des Community Managers de SFR qui font des réponses (certifiées par SFR) dont l'utilité est douteuse.

Je ne sais pas juger s'il s'agit de mauvaise foi ou de simple incompétence. C'est peut-être une combinaison des deux, ou encore autre chose.

Je comprends bien que les personnes auxquelles j'ai eu à faire ne sont pas à la cause du problème, mais elles pourraient être à la source d'une solution. Il ne doit pas être agréable de se prendre en pleine figure la frustration des clients, dont certains sont sans doute méprisants (j'avoue avoir perdu patience au moins une fois).

Mais les travailleurs qui acceptent de se cantonner à répéter un script imposé ou un logigramme de questions-réponses risquent de se faire remplacer par des machines très rapidement.

C'est peut-être naïf de ma part, mais je pense qu'il serait sans doute plus utile pour les clients, mais aussi pour le bien-être au travail des employés en première ligne, de sortir des procédures inefficaces, prendre un peu d'initiative et trouver de vraies solutions.

En tout cas, le régime alimentaire que SFR veut m'imposer ne me convient pas. Et il est bien connu que l'excès de fibres produit des flatulences.


Notes de bas de page:


Résumé pour ceux souffrant d'un déficit d'attention dû à la consommation de contenu sur Twitter, Instagram et autres réseaux dits sociaux.


SFR a été condamné à 2 reprises pour vendre de la fausse fibre optique.


Je ne leur ai pas dit qu'à une époque, je connaissais la formule pour calculer la fréquence de coupure en fonction du coefficient de réfraction de la fibre.

Tags: fr internet sfr rant
07 May 2021

Comment mon banquier veut m'obliger à me faire surveiller par les GAFAM et tuer des ours polaires

tl;dr1 : Le nouvel mécanisme d'authentification des paiements en ligne risque de déclencher des achats massifs de smart-phones dotés des dernières versions d'Android et iOS, et ceci, parce que les banques le veulent bien.

Quand on fait des achats en ligne et qu'on paye par carte bancaire, la sécurité de la transaction est primordiale. Actuellement, après avoir rentré les informations de la carte bancaire sur le site marchand, on reçoit un SMS avec un code que l'on doit ensuite rentrer sur le site de la banque pour finaliser la transaction. Ce système nous protège en cas de vol de la carte, car le malfrat devrait aussi être en possession de notre téléphone portable pour réaliser le paiement. Cependant, ce système n'est pas infaillible, car on peut se faire voler le téléphone et la carte. Il suffit que le téléphone n'ait pas de système de verrouillage fiable pour que le voleur puisse consulter le SMS avec le code nécessaire pour la transaction. Il est aussi possible d'intercepter des SMS si on s'y connaît un peu.

Afin de rendre la procédure plus robuste, à partir du 15 mai, le code reçu par SMS ne suffira plus et il faudra utiliser un mode d'authentification forte. Cela veut dire qu'il faudra une étape supplémentaire dépendant de quelque chose plus difficile à voler.

La plupart des banques vont privilégier l'utilisation de l'application mobile sur smart-phone. Lors de l'installation de l'application, l'utilisateur rentrera un code fourni par la banque qui active le service de paiements. Ensuite, lors d'un achat, il recevra une notification sur l'application qui lui demandera un mot de passe (que seul l'utilisateur connaît et qui est permanent). Puis l'application enverra la validation à la banque pour confirmer la transaction. De cette façon, si la carte et le téléphone sont volés, la transaction ne peut pas être validée sans connaissance du mot de passe. Certaines versions des applications mobiles pourront permettre l'utilisation de biométrie (empreinte digitale, par exemple) à la place du mot de passe.

Cette solution semble très appropriée, mais elle suppose que les utilisateurs disposent d'un smart-phone adapté. On peut se dire que la plupart de clients de services bancaires qui font des achats en ligne sont équipés du téléphone approprié. Cependant, il s'agit d'une hypothèse grossière, car un smart-phone adapté est un dispositif équipé de la bonne version d'Android ou de iOS (les systèmes d'exploitation – OS – de Google et d'Apple respectivement). Que se passe-t'il si vous avez choisi d'être sobre numériquement et que votre appareil a une version un peu trop ancienne le l'OS? Que se passe-t'il si vous avez choisi de ne pas vous soumettre à la surveillance numérique des GAFAM et que vous avez un appareil équipé d'un OS alternatif (et libre, de préférence)?

Je suis dans un de ces cas. Comme tout un chacun, j'ai cherché conseil sur internet et j'ai trouvé ça :

«Que faire si vous ne souhaitez pas télécharger l’application mobile de votre banque ?

Il conviendra de contacter votre conseiller bancaire qui pourra vous renseigner sur les solutions alternatives mises en place par votre banque : achat d’un appareil pour lire un QR Code ou envoi d’un code par SMS doublé d’un code permanent comme celui pour accéder à son compte en ligne par exemple.»

Je me suis donc retourné (virtuellement, évidemment, gestes barrière obligent) vers mon conseiller bancaire (il n'a pas encore été remplacé par un chat-bot) et lui ai posé la question. Il m'a très gentiment répondu que ma banque allait proposer une alternative pour les clients ne disposant pas de smart-phone adapté. Après plusieurs relances de ma part, il est revenu vers moi avec une solution : ma banque me propose d'acheter (à ma charge!) un boîtier dans lequel on insère la carte bancaire et qui génère un code à rentrer sur le site de la banque lors de chaque paiement.

Au premier abord, j'étais plutôt satisfait. Le boîtier ressemble à une GameBoy et ce côté mi-hipster mi-cyberpunk m'a plu. Le coût modique (à ma charge!!) serait acceptable. Mais plus tard, je me suis dit que ça n'allait pas : je garde le même smart-phone depuis des années pour réduire ma pollution numérique, je me rends ridicule en roulant à vélo non électrique pour protéger la biodiversité, j'utilise du shampooing solide pour être économe en emballages plastiques (et je suis chauve!!!). Je ne vais donc pas être complice de la fabrication d'encore un machin électronique qui n'est pas vraiment nécessaire.

Parce que, en fait, il y a d'autres solutions que ce boîtier ou que l'achat d'un nouveau téléphone qui aurait la bonne version de l'OS espion de Google ou d'Apple.

Une première solution est de coupler le code reçu par SMS à un mot de passe seulement connu de l'utilisateur et que l'on rentre sur le site de la banque lors de l'achat2. Mais on pourrait aussi imaginer que la banque fournisse une application installable sur n'importe quel ordiphone. Ça peut sembler fou, mais, si, c'est possible de faire des applications que marchent sur tous les systèmes d'exploitation, sur ordinateur, sur tablette.

Je suis donc revenu vers mon conseiller de la banque pour lui demander confirmation du fait que seulement l'application sur smart-phone et le lecteur GameBoy étaient proposés par son entité.

«Je suis surpris que la seule solution proposée par [le nom de ma banque] soit l'achat d'un dispositif électronique supplémentaire et à la charge du client.

De nombreuses banques proposent aussi l'authentification par mot de passe couplée au code reçu par SMS.

Pouvez-vous me confirmer que [le nom de ma banque] ne propose pas cette solution? Ce serait vraiment dommage, car elle est plus écologique (pas de dispositif électronique supplémentaire) et plus économique.»

C'est là où je me suis dit que j'avais à faire à un chat-bot, parce que sa réponse a été complètement à côté de la plaque :

«Justement, les banques sont dans l'obligation de renforcer la sécurité sur les opérations sensibles, l'envoi de SMS ne suffira plus à partir de fin juin.

D’où la nécessité d'avoir un smartphone ou d'un lecteur»

Il n'a donc pas répondu à la question et m'a donné une argumentation fallacieuse : nécessité de smart-phone ou lecteur de cartes. S'il y a une 3ème option, par définition, les 2 autres ne sont pas nécessaires.

Comme j'avais à faire à un chat-bot, je me suis dit que je pouvais insister sans qu'il se sente harcelé (banker lifes matter, tout de même) :


Apparemment, ma question n'était pas claire.

Il y a 3 options proposées par les banques :

  1. une application sur smart-phone qui demande un mot de passe permanent (qui ne change pas à chaque achat) et qui valide la transaction
  2. un lecteur pour la carte qui, après avoir rentré le code de la carte, génère un code à utilisation unique, l'utilisateur rentre ce code sur le site de paiement pour valider la transaction
  3. réception par SMS d'un code à utilisation unique + utilisation d'un mot de passe permanent (que l'utilisateur choisit sur son espace client sur internet, par exemple), les 2 informations sont à rentrer sur le site de paiement pour valider la transaction

J'ai bien compris que [le nom de ma banque] propose les options 1 et 2. Dans mon message précédent, je vous demandais de me confirmer que vous ne proposez pas l'option 3. Vous n'avez pas répondu à cette question.

J'espère que cette fois-ci ma question est claire et que vous pourrez la transmettre au service concerné. Je conçois parfaitement que le sujet de la sécurité informatique ne soit pas de votre ressort.

L'avantage de la 3è option est qu'elle ne nécessite pas de démarche particulière de la part des clients. Je suis persuadé que, à degré de sécurité égal, la satisfaction des clients est sans doute le souci principal de [le nom de ma banque].»

Le dernier paragraphe, était mon test de Turing, car j'avais toujours le doute concernant le chat-bot. La réponse a été claire, ce n'est pas un chat-bot, mais quelqu'un qui se soucie bien peu des clients et qui pourrait donc être facilement remplacé par une IA bon marché :

«Bonjour ,

comme dit précédemment, les deux solutions proposées sont :

Rien d'autre»

Donc, les «solutions» proposées par ma banque (bon, OK, c'est la Caisse d'Épargne) sont, soit l'achat forcé du lecteur GameBoy, soit l'installation d'une application qui demande un smart-phone très récent contrôlé par les GAFAM. Une alternative économe, écologique et non intrusive n'est pas à l'ordre du jour.

On pourrait se dire que le développement logiciel n'est pas le métier d'une banque et donc qu'il est normal qu'ils soient incompétents dans le domaine. Mais en fait, ce serait faux. Les banques ne font que du logiciel, ne vivent que grâce au logiciel. Le monde financier n'est que du logiciel. Et ceux qui développent du logiciel savent qu'il est plus simple de faire un logiciel qui tourne chez soi, dans une infrastructure maîtrisée, plutôt que de faire du logiciel qui tourne chez le client (le smart-phone ici). Donc la raison pour ne pas proposer d'alternative logicielle à l'appli ne peut être qu'un choix délibéré avec des objectifs précis.

Comme le signale 60 millions de consommateurs dans son article récent sur le sujet

«Beaucoup de banques ne communiquent pas sur cette option du code SMS couplé à un mot de passe, et semblent inciter par tous les moyens au téléchargement de leur appli.»

Quel est l'intérêt de nous forcer à utiliser l'application mobile? Nous surveiller? Remplacer complètement les agences? Faire que l'usager s'occupe personnellement de tout gérer au lieu d'embaucher des «conseillers»? Tiens, c'est cohérent avec le remplacement de mon cher conseiller par un chat-bot.

Ou s'agit-t'il simplement de proposer des solutions qui donnent une impression de sécurité (un smart-phone dernier cri, ou un bidule où on insère sa carte pour ceux atteints d'illectronisme) tout en sachant que la plupart d'usagers sont habitués à accepter des technologies qu'ils ne comprennent pas et sur lesquelles ils n'ont aucune prise?

En tout cas, la conséquence de tout ça est l'obsolescence programmée systémique. C'est la même logique qui fait que les anciennes versions de Windows et des OS d'Apple et de Google ne sont plus maintenues, et que les nouvelles versions ne tournent que sur des machines plus puissantes. Et nous en sommes tous complices parce que nous acceptons ça comme si c'était une fatalité.

Et le 16 mai, on changera de smart-phone, parce que grâce aux confinements répétés (et en prévision de ceux à venir), nous avons pris goût aux courses en ligne3 et les ours polaires, ça commence à bien faire.

Merci mon banquier.

Édition du [2021-05-16 Sun]

Quelqu'un d'averti en sécurité informatique m'a expliqué que la solution code SMS + mot de passe permanent est moins sécurisée que la solution basée sur l'application mobile, car le code SMS ne voyage pas par un canal chiffré. Ceci remet en question une des solutions que je demandais à mon banquier. Mais cela remet aussi en question la solution GameBoy, car les boîtiers actuels ne sont pas conformes non plus. En conséquence, la seule solution serait bien une application qui ne soit pas liée à une version particulière d'un OS.

Il est important de noter que les applications mobiles des banques n'ont pas forcément besoin d'accès au réseau mobile. Cette fois-ci, je ne me suis pas limité à lire sur le net et j'ai fait le test. J'ai emprunté un dispositif équipé d'Android 5.04, mais sans carte SIM. J'y ai installé l'application mobile de ma banque, je l'ai configurée pour accéder à mes comptes et ai activé l'option magique pour les paiements méga-sécurisés. Ça a marché. Si je comprends bien, l'application identifie la machine sur laquelle elle est installée et la banque n'acceptera que les validations des paiements issus de cette machine. La même fonctionnalité peut donc être fournie par une application installée sur l'ordinateur sur lequel l'utilisateur fait ses achats en ligne (là on peut supposer que quelqu'un qui fait des achats en ligne a un ordinateur).

Il y a donc bien une solution logicielle qui ne nécessite pas de mettre à la poubelle le matériel actuel. Il suffit un peu de bonne volonté des banques. On peut toujours rêver.



Résumé pour ceux souffrant d'un déficit d'attention dû à la consommation de contenu sur Twitter, Instagram et autres réseaux dits sociaux.


Comme précisé dans l'édition du [2021-05-16 Sun] cette solution n'est pas compatible avec la nouvelle réglementation. La seule vraie solution est donc un outil multi-plate-forme (Android, iOS, Linux, Windows, MacOS) et qui ne soit pas lié à une version trop récente de ces OS.


Oui, je sais, c'est limite. Mais je me dévoue pour la science et je me suis désinfecté les mains avec du gel hydro-alcoolique à la fin de l'opération.

Tags: fr freesoftware internet banque
Other posts
Creative Commons License by Jordi Inglada is licensed under a Creative Commons Attribution-ShareAlike 4.0 Unported License. RSS. Feedback: info /at/ Mastodon