PROJET AUTOBLOG


Blog de Thomas Kowalski

Archivé

Site original : Blog de Thomas Kowalski

⇐ retour index

Construire votre clavier en deux jours (ou presque)

vendredi 27 octobre 2017 à 18:09

Des fois, on sait pas trop pourquoi, on se retrouve embarqué dans des projets un peu bizarres. Puis, avec du recul, on se demande bien ce qu’on y foutait. En tout cas ça m’arrive.

C’est comme ça qu’un jour je me suis dit “quand je serai en école d’ingénieur, je construirai un clavier mécanique à partir de rien, ce sera trop classe.”
Le temps, l’impatience et la dépression aidant, j’ai finalement pas réussi à attendre l’école d’ingénieur et je me suis lancé dans la construction d’un clavier mécanique en décembre dernier. Sans rien y connaître.

Un peu de contexte. A l’époque, j’avais un SteelSeries 6GV2, clavier fort agréable au demeurant, si ce n’est qu’il est avant tout fait pour jouer à des FPS (par ses switchs linéaires, mais je vais en reparler), et que jouer – à des FPS, ou à d’autre choses – en prépa, ça se fait peu. Comme, par contre, j’écrivais pas mal, bah mes petits doigts étaient rapidement fatigués.

J’avais donc le choix entre acheter un nouveau clavier (à terme, pas forcément immédiatement) et me faire le mien, sans trop tarder. Comme de toute façon ça allait me coûter de l’argent, autant le faire tout de suite. Et c’est ainsi qu’après une soirée de physique, je me suis retrouvé à acheter 110 switches sur eBay. Mais c’est quoi un switch ?

Petit brief. En effet, il existe deux types de claviers : les claviers classiques à dômes et les claviers mécaniques. Les seconds sont les claviers cool, les premiers sont les claviers chiants.
Dans un clavier à dômes, il y a plein de petits dômes en caoutchouc avec un peu de carbone sur le sommet, qui va compléter une piste – elle aussi en carbone – quand vous appuyez dessus. Dans un clavier mécanique, il y a plein de petits interrupteurs, et dans l’idée ça marche pareil. Sauf que c’est bien plus agréable pour taper. L’avantage c’est que les switches peuvent également être de différents type : linéaires (c’est un ressort, et c’est tout : c’est très bien pour jouer à des jeux-vidéo où on veut au maximum que la sensation de frappe s’efface) ou à clic (c’est à dire qu’en appuyant le switch va passer un point où ça va faire clic et s’enfoncer tout seul : c’est très agréable pour taper). Chaque switch peut ensuite avoir différentes forces d’actuation (force nécessaire pour changer l’état physique de l’interrupteur) qui correspondent à si l’on devra appuyer plus ou moins fort.

Voilà l’idée. Sauf que, contrairement à ce qu’on pourrait penser, un clavier ce n’est pas si simple que ça à faire. Il suffit pas de connecter cent boutons.

Première étape : concevoir un layout

L’avantage, quand on fait son propre clavier – en entier – c’est qu’on peut disposer les trucs un peu comme on veut (voire même totalement comme on veut).

Mon objectif, d’une part, était de gagner de la place sur mon bureau (donc pas de clavier full avec pavé numérique). D’autre part, j’avais vraiment besoin des touches de navigation (flèches directionnelles et navigation dans la page), qui prennent beaucoup de place pour rien. Alors j’ai décidé de tout compresser.

Pour continuer, j’avais vraiment envie d’avoir quelque chose de plus : des touches pour des caractères spéciaux. Comme j’écrivais pas mal de maths à des endroits où on n’est pas censé écrire des maths (Discord, Facebook, etc.) j’avais besoin de caractères pas habituels qu’on ne trouvait pas facilement. Donc il fallait aussi trouver comment les placer, comme vous pouvez le voir.

Il existe un outil très pratique pour faire ça : Keyboard Layout Editor. (le mien est ici)

Je précise que ça ne se fait pas en deux jours. Parce que d’une part, il faut que ce soit à peu près rectangle (donc que ce soit droit sur tous les côtés) en prenant en compte le fait que toutes les touches ne font pas la même largeur, et ensuite parce qu’il faut également composer avec le matériel dont vous disposez, d’où la deuxième étape.

Deuxième étape : dépenser de l’argent (trop d’argent)

Je n’ai pas encore fait de liste de courses, mais en bref, il faut les composants suivants :

Troisième étape : la mort les plaques

Si vous êtes un être humain perspicace, vous aurez remarqué que, jusque-là, on a pas mal de composants intéressant, mais rien pour les tenir ensemble. Ce qui est plutôt ballot. C’est là qu’entre en jeu un élément important du clavier : le support.

Dans le cas où vous êtes, comme moi, limité par les moyens et par les connaissances en design de PCB (et le terme limité, dans mon cas, est un euphémisme) il faudra tout relier à la main (en vrai, ça se fait bien, sans devenir fou, avec un peu de patience et de musique). Mais la question n’est pas là.

L’idée est la suivante : quatre éléments, découpés dans ce que vous voulez (aluminium, inox, plastique, bois, MDF, chewing-gum) qui vous agir de la façon suivante.

Ensuite, on assemble le tout avec des vis et des entretoises. Et là, on remercie l’inventeur de l’entretoise. Parce qu’avec nos entretoises dans les couches intermédiaires, on peut visser les plaques haute et basse pour que l’ensemble fasse une boîte relativement compacte et qui tient bah heu… d’un tenant (David Tenant… aha.) 

Vous allez me dire “jusque-là, rien de bien méchant !” Ah ah. C’est beau la naïveté. La vraie question c’est : mais comment qu’on fait ces plaques ?
Deux solutions : soit tout concevoir avec AutoCAD (j’ai essayé, j’ai échoué), soit générer un fichier DXF avec le générateur de SwillKB (en lui donnant votre fichier de Keyboard Layout Generator).

“Mais Thomas, c’est toujours pas très dur !”

Ce qui est dur, en fait, c’est quand vous avez fait tout ça et que vous vous demandez bien qui va vous fournir ces pièces. Généralement, à moins de disposer d’un fablab bien équipé pas loin de chez vous, vous risquez de ne pas pouvoir faire ça vous-même. Et ça va donc engendrer des… des frais.

Pour moi, environ soixante euros (après truandage et réductions), tout ça pour avoir deux plaques en acier inoxydable brossé découpées et deux cadres non pas en inox mais en plastique (il faut pas pousser mémé non plus).

Quatrième étape : l’attente

Alors là vous vous dites “ça y est ! on va recevoir nos pièces, on va monter notre clavier et écrire super bien !” mais non. Non, non, non.

Ca relève peut-être de l’exception, mais j’ai pas eu de chance quant à la découpe de mes pièces.

J’ai tout fait faire par Sculpteo. C’est une entreprise américaine implantée à Villejuif qui fait de la découpe, de l’impression 3D et ce genre de choses à des prix qui ne défient aucune concurrence. Mais ils sont plus ou moins seuls sur le marché, parce que les autres ne proposent généralement qu’un type de matériau (métal ou plastique mais pas les deux) et que ça devient cher en frais de port. Sinon, il y a John Steel (des alsaciens) et LaserGist (des grecs). Je vous laisse faire vos recherches.

Sauf que, Sculpteo a pas dû m’aimer puisque j’ai reçu la première fois mes cadres en plastique cassés (bon, la conception était pas ouf non plus puisque j’avais pas bien pris en compte la taille de la saillie pour la découpe de morceaux aussi épais, mais heu quand même) et surtout des plaques en métal pas alignées. Alors pour visser des trucs je vous laisse imaginer.

Comme vous pouvez le voir, le bord en métal n’est pas bien découpé, ce qui fait qu’on ne peut pas enfoncer le switch.

J’ai donc dû renvoyer tout le matériel et attendre une deuxième version.

La deuxième fois, j’ai reçu des cadres en plastique en bon état, et mieux protégés, mais des plaques en métal moins alignées que la première fois. J’étais un peu colère, mais j’ai quand même re-renvoyé mes pièces (de toute façon, j’avais pas trop le choix…)

Quand, enfin, j’ai re-re-reçu mes pièces, elles étaient cette fois en un morceau et alignées. Enfin alignées, ou presque, mais bon j’avais pas trop envie de leur refaire faire un aller-retour.

Le problème, le vrai, c’est qu’entre le moment où j’ai effectué la première commande et où j’ai reçu des pièces correctes, il s’est passé environ deux mois, les délais de livraison de renvoi, d’admission de leur part qu’ils s’étaient ratés et de “on se prépare à exécuter votre commande” aidant.

Bref.

Mais ça rend quand même bien !

Cinquième étape : être patient

Maintenant que vous avez toutes vos pièces, tous vos composants et surtout tout votre courage, on va passer à la partie pratique.

Je ne l’ai pas précisé avant, mais il nous faut un point central dans ce clavier, et ce point central, de manière relativement standard, c’est un PJRC Teensy. C’est un microcontrôleur excessivement cher pour ce que c’est, mais c’est le seul qui puisse gérer autant d’entrées / sorties (pour un clavier plus petit, un Sparkfun Pro Micro, qui existe en version générique sur AliExpress, serait utilisable ; juste une remarque comme ça). Donc, heu, il en faudra un.

Qu’est ce qui nous attend, donc ? 

Déjà, il va éventuellement falloir coller tous vos switches dans votre plaque à switches.
Ensuite, il faudra souder des diodes entre chaque switch.
Puis, on rajoutera des câbles dans l’autre sens que les diodes (il va falloir les découper pile à la bonne taille, vous allez voir c’est pas du tout relou).
Après, on rajoutera des câbles depuis le début et la fin des lignes et des colonnes jusqu’au microcontrôleur. Ça c’est chiant.
Et pour finir, on ira faire une prière pour ne pas avoir fait de bêtise (dans mon cas, la prière n’a pas été suffisante).

C’est parti.

Voilà, ça c’est le résultat final.

Petite note pratique : il est conseillé, si vous faites une boîte faite de près ou de loin en métal, d’isoler le circuit de la plaque (sinon y’a moyen de faire du mal non seulement au clavier, mais aussi à votre port USB sur lequel il est branché). Pour cela, j’ai acheté du plastique pour couvrir les livres de cours que j’ai collé sur la plaque inférieure. Ça marche très bien.

Sixième étape : le firmware

Pour le firmware, je me suis basé sur QMK Firmware, un programme très complet qui sert de firmware à pas mal de claviers mécaniques personnalisés. Je ne détaillerai pas plus que ça, puisqu’un exemple dans ce cas-là va très bien :

Je précise que cette étape est relativement pas pratique si vous êtes sous Windows, puisque tout se compile sous Linux. Depuis Windows 10, vous pouvez utiliser le bash intégré à Windows (qu’il faut activer dans les paramètres) pour installer gcc et les outils nécessaires à la compilation et faire tout ça sans dual boot ou deuxième ordinateur mais ça reste peu pratique. Cependant ça se fait bien si on reste concentré.

Etape n : six mois plus tard

Déjà, je vous ferai remarquer que si Rome ne s’est pas construite en deux jours, ce clavier non plus. Parce que j’ai fait l’erreur de penser que tout se passerait comme prévu – ce qui, évidemment, ne pouvait pas être le cas.

Mais à part ça, je dois dire que j’en suis extrêmement convaincu.

Il est très confortable (les switches Gateron demandent moins de force que les Cherry MX, donc c’est super agréable de taper dessus), il est honnêtement relativement beau (j’aime beaucoup le style rouge / inox argenté) et surtout je suis le seul à pouvoir taper dessus parce que généralement, les touches sans lettre dessus ça déstabilise les gens.
En plus, mes apports personnels (qui ont eu du mal à fonctionner au début, comme les symboles mathématiques et l’entrée Unicode de manière générale) en font un clavier bien meilleur que la moyenne, et même que la plupart des claviers “personnalisables” (qui permettent d’enregistrer des macros et de personnaliser les touches).
Bref,  si c’était à refaire… je le referais. Je changerais quelques trucs (notamment la façon dont je me débrouille pour la boîte, je pense que ce serait plus facile de m’adapter à un format classique, et ce serait surtout moins cher), mais je resterais sur les mêmes switches et surtout sur la méthode de soudure à la main (parce que c’est quand même très satisfaisant de se dire qu’on a fait tout ça tout seul).

En plus, dire qu’on a construit son clavier fait généralement son petit effet, et les gens m’ont jusque-là dit qu’ils le trouvaient vraiment bien (hormis bien sûr le fait qu’il manque les étiquettes sur les touches, mais bon, on sait taper ou on sait pas).

Statistiques du bac et web scraping

mercredi 19 juillet 2017 à 16:54

Récemment, en voyant un article du Monde sur la répartition des mentions par rapport au prénom des bacheliers j’ai eu envie de faire pareil. Une façon intéressante de faire apparaître des tendances malheureusement facilement prévisibles.

J’ai donc pris Visual Studio Code et mon mal en patience et j’y suis allé. Comme je considère que ça pourrait être utile à des gens, voilà ma démarche, en intégralité.

Si la programmation ne vous intéresse pas, les résultats sont à la fin !

Récupération des liens

Bon, déjà, il faut savoir que personne ne propose de base de données des résultats. J’aurais pensé la trouver sur OpenData.gouv.fr mais il n’y a que les résultats des années précédentes et, en plus, dans des formats bizarres (mettre les résultats de 300 000 bacheliers dans une feuille Excel… ça semble pas une si bonne idée). Comme j’imagine qu’il faut demander ce genre d’informations à l’avance si on souhaite les publier sur son site (et motiver la demande), j’ai décidé de récupérer ces données moi-même.

Pour ça, je me suis tourné vers les nombreux sites qui proposent de connaître ses résultats. L’Etudiant, le Monde, beaucoup de sites de manière générale offrent ce service. Le problème, c’est qu’ils demandent souvent de faire une recherche précise (nom de famille et prénom, nom et académie, etc.) ce qui me prendrait énormément de temps à récupérer avec un script Python. Alors j’ai continué à chercher et j’ai trouvé Studyrama. Rien de particulier, si ce n’est qu’ils proposent une liste d’académie, puis une liste de noms triés par ordre alphabétique. Il ne me resterait donc qu’à récupérer la liste des académies, puis pour chaque académie, récupérer la liste des prénoms pour chaque lettre. C’est pas rien, mais ça se fait tranquillement avec Requests et BeautifulSoup. J’avais prévu de tout stocker dans une base de données SQLite (3).

Bon, alors, faire tout ça est bien gentil, mais ça demande d’y réfléchir un peu à l’avance. Comme je n’ai pas l’habitude de réfléchir, je n’ai pas réfléchi. Résultat : j’ai fait une table avec une colonne Académie et une colonne Lien. En effet, une fois qu’on a la liste de noms, on n’a pas encore les résultats, il faut aller sur une page réservée à chaque candidat pour obtenir les détails (série, mention…)

J’ai décidé de couper le travail en deux. D’abord, je récupérerai tous les liens des résultats, en parcourant d’abord la liste des académies, puis la liste alphabétique pour chaque lettre.
Dans un second temps, je récupérerais tous ces liens dans ma base de données et je parcourrais chacun pour obtenir les résultats précis.

Pourquoi ? C’est bien simple. On a environ 300 000 bacheliers. Récupérer vingt-six fois autant de pages qu’il y a d’académies en France peut se faire sans véritable problème (quelques minutes, vingt au maximum). En revanche, charger les résultats individuels de 300 000 personnes demande beaucoup plus de temps. Et garder un PC allumé assez de temps pour ça, se débrouiller pour ne pas avoir de coupure Internet (d’autant plus que ma box fait des caprices ces derniers temps) et surtout ne pas faire de modification dans le code se révèle assez compliqué. Donc je voulais avoir un programme qui me permettrait d’arrêter le scraping et de le reprendre quand je le veux. Mais on verra ça plus tard.

import sqlite3
import requests
from bs4 import BeautifulSoup

session = requests.session()

baseUrl = "http://resultat.studyrama.com/"
home = baseUrl + "/bac"
home_content = session.get(home).text

soup = BeautifulSoup(home_content, 'lxml')
academieList = soup.find_all("ul", attrs = {'class' : 'large-2 medium-6 columns margin-top academie-list'})

academieLinks = list()
academies = dict()

for ul in academieList: 
    for li in ul.find_all("li"):
        a = li.find("a")
        academies[a.text.replace(">", "").strip()] = baseUrl + a["href"]
        academieLinks.append(baseUrl + a["href"])

# Maintenant on a tous les liens vers les différentes académies dans academieLinks.
# On va parcourir chacun
# Comme les différentes pages s'obtiennet avec [lien]/[lettre] on peut directement parcourir notre alphabet

alphabet = [chr(x) for x in range(ord('a'), ord('a') + 26)]

eleves = dict()

for academie, link in academies.items():
    eleves[academie] = list()

    print("Chargement de {}".format(link))
    for lettre in alphabet:
        print("\tChargement de la page '{}'".format(lettre))

        html = session.get("{}/{}".format(link, lettre)).text

        with open("html.html", "w") as f:
            f.write(html)

        soup = BeautifulSoup(html, 'lxml')
        ul = soup.find('ul', attrs = {'class' : 'list'})
        try:
            for li in ul.find_all("li"):
                lienEleve = li.find("a")["href"]
                nomEleve = li.find("span", attrs = {"class" : "bold name"}).text
                infoComplete = li.find("span").text
                examen = li.find("span", attrs = {"class" : "examen"}).text

                eleves[academie].append(lienEleve)
        
        except AttributeError as e:
            print("\tPas de nom en {} pour {}".format(lettre, academie))

SQL = "CREATE TABLE Eleves (Academie TEXT, Lien TEXT UNIQUE)"
db = sqlite3.connect("bac.s3db")
cur = db.cursor()

try:
    cur.execute(SQL)
except:
    pass

SQL = "INSERT INTO Eleves VALUES (?, ?)"

for academie, liste in eleves.items():
    for i, eleve in enumerate(liste):
        try:
            cur.execute(SQL, (academie, eleve))
        except:
            print("Impossible d'insérer ({}, {}) ({})".format(academie, eleve, i))

db.commit()

La récupération des différentes académies se fait sans aucune peine grâce à l’inspecteur de tout navigateur qui se respecte. On trouve la classe CSS ou l’ID qui va bien et la simplicité de Python couplée à la puissance de BeautifulSoup fait (presque) tout pour nous. On n’a plus qu’à stocker les données.

Récupération des résultats

Bon, on est content, on a toutes nos données. Encore une fois, grâce à notre ami Python et SQLite 3 on stocke tout sans aucun souci et on a nos données de première partie qui sont prêtes. Maintenant, récupérons les résultats.

Ici, l’idée est un peu plus compliquée. Je rappelle que j’ai dit que je voulais pouvoir arrêter la récupération des résultats pour la reprendre plus tard. Du coup… du coup j’ai fait une petite entourloupe qui fonctionne bien. Je précise que j’aurais pu résoudre cette entourloupe en concevant mieux ma base de données depuis le début mais honnêtement… tant pis, j’ai la flemme de corriger.

Au lancement du script, on récupère donc tous les liens qu’on a préparés dans la phase précédente. Puis, on créé une table Résultats dans laquelle iront tout naturellement les véritables résultats. Chaque résultat est identifiable de manière unique par son lien.

Remarque : comme je le craignais, Studyrama n’a pas cherché à avoir cette contrainte d’identification unique. Du coup, si jamais vous vous appelez “Alice Rousseaux” et que vous habitez en Ile de France, vous aurez un résultat de Schrödinger. Comme une autre personne s’appelle comme vous, vous ne saurez jamais si le résultat que Studyrama vous donne est le vôtre ou celui de l’autre Alice… Problème qui pourrait être résolu en demandant en plus la date de naissance, mais justement mon but c’était d’avoir toutes les données facilement. En résumé : il est possible qu’on ait quelques points en moins, mais sur un échantillon de 300 000 personnes… on fera sans.

On insère dans notre nouvelle table autant de lignes qu’on a de liens dans notre première table en remplissant les autres champs (Nom, Prénom, Résultat, Mention) par du vide. On ne peut que compléter l’académie de chaque lien puisqu’on l’a eue à la première étape.

Ensuite, toute l’astuce est là, on refait une sélection des lignes pas encore traitées en demandant à SQLite 3 un truc du genre SELECT Lien FROM Resultats WHERE Prenom = '' AND Nom = ''. C’est peut-être pas la meilleure façon, mais c’est plus simple et plus lisible que de faire une différence symétrique sur une jointure des deux tables. Et ça marche du premier coup.

Ensuite, la démarche est pas bien compliquée : on charge chaque lien de résultat, on l’analyse avec BeautifulSoup (on a vraiment beaucoup de chance : on dirait que Studyrama a tout fait pour que ses pages soient scrapables : par exemple le nom est dans un span séparé du prénom, il y a une classe pour chaque catégorie d’information… bref, c’est super facile).

Après l’analyse de chaque page, on UPDATE la ligne adaptée avec nos nouvelles informations.

En parallèle, on utilise un compteur (que j’ai appelé c) qui nous permet d’appeler db.commit() toutes les cinquante itérations pour sauvegarder nos modifications. Ainsi, si on arrête le script (par un Ctrl + C, une fermeture de console, un redémarrage, une perte de connexion Internet), on perd au maximum cinquante lignes, que l’on devra retélécharger à la prochaine exécution. Il faut juste trouver l’équilibre entre trop de commits (qui peuvent être lents) et pas assez de sauvegarde.

import sqlite3
import requests
from bs4 import BeautifulSoup

session = requests.session()

baseUrl = "http://resultat.studyrama.com/"

# Pour pouvoir arrêter la récupération des données et la reprendre à posteriori (puisqu'il y a beaucoup d'élèves)
# Plutôt que de faire une opération compliquée sur la base de données à base de différence symétrique sur les élèves qui ont pas encore de résultats en faisant une jointure (...)
# On copie lors de la première exécution de ce fichier l'intégralité des élèves à récupérer dans une nouvelle table Resultats
# Ensuite, on met à jour chaque ligne
# Ainsi, pour continuer la récupération de données, il suffit de travailler sur les lignes où Série = '' par exemple.

print("Connexion à la BDD")
db = sqlite3.connect("bac.s3db")
cur = db.cursor()

# On récupère tous les liens (première fois uniquement, mais on le fait à chaque fois, au pire on a une exception rattrapée avec le try)
print("Récupération des liens")
SQL = "SELECT * FROM Eleves"
results = cur.execute(SQL).fetchall()

try:
    SQL = "CREATE TABLE Resultats (Academie TEXT, Nom TEXT, Prenom TEXT, Lien TEXT UNIQUE, Serie TEXT, Resultat TEXT, Mention TEXT)"
    print("Création de la table de données")
    cur.execute(SQL)
except:
    pass

resultats = list()

c = 0

# On copie nos données dans la nouvelle table
print("Initialisation de la table de données")
for academie, lien in results:
    try:
        cur.execute("INSERT INTO Resultats VALUES (?, ?, ?, ?, ?, ?, ?)", (academie, "", "", lien, "", "", None))
    except:
        pass

print("Début de la récupération")
# On récupère que les élèves dont on n'a pas encore les résultats
results = cur.execute("SELECT * FROM Resultats WHERE Prenom = '' AND Nom = ''").fetchall()
for academie, nom, prenom, lien, serie, resultat, mention in results:
    c += 1

    lienBase = lien
    lien = baseUrl + lien
    resultats.append(dict())
    cetEleve = resultats[-1]
    cetEleve["Academie"] = academie
    cetEleve["Lien"] = lien

    html = session.get(lien).text
    # with open("html.html", 'wb') as f:
    #     f.write(html.encode())
    # print("ok")
    # input() 

    soup = BeautifulSoup(html, 'html.parser')
    div = soup.find("div", attrs={"class" : "callout", "id" : "laureat"})
    
    prenom = div.find_all("label", attrs = {"class" : "name black bold"})[1] # le premier label, c'est "FELICITATIONS"
    nom = prenom.find("span", attrs = {"class" : "uppercase"}).text
    prenom = prenom.contents[0].strip()

    verdict = div.find("label", attrs = {"class" : "pink verdict uppercase"})
    if verdict.find("span").text != "ADMIS":
        print(lien)
        input()
    if len(verdict.contents) > 1:
        mention = verdict.contents[1]
    else:
        mention = None
    
    serie = div.find("p", attrs = {"class" : "center black margin-none"})
    serie = " ".join(serie.text.split())
    
    # Permet de supprimer le texte qu'on a toujours : "baccalauréat général série [SERIE] ([Description acronyme]) 2017"
    serie = serie.split()[3]

    # On met à jour la ligne avec les données extraites
    cur.execute("""UPDATE Resultats 
                    SET Academie = ?,
                        Nom = ?,
                        Prenom = ?,
                        Serie = ?,
                        Resultat = ?,
                        Mention = ?
                    WHERE lien = ?""", (academie, nom, prenom, serie, "Admis", mention, lienBase))

    # Tous les 50 élèves, on commit
    if c % 50 == 0:
        print("Sauvegarde... ({} résultats trouvés)".format(c))
        db.commit()

Visualisation des résultats

Voilà, là on arrive à la partie rigolote.
L’avantage, c’est que, comme je l’ai évoqué précédemment, on n’a pas besoin d’attendre que les résultats aient fini d’être téléchargés pour faire des tests sur nos données.

Mon premier objectif était de représenter la répartition des mentions très bien en fonction des prénoms (refaire un peu comme Le Monde mais à ma façon).

Il y a plusieurs façons de le faire, mais le plus important est de savoir éliminer les données induisant de l’erreur (facile) et ne pas en représenter trop, au risque de ne plus rien y voir (cf l’image d’en-dessous).

L’erreur

Pourquoi aurait-on de l’erreur ? C’est bien simple. Admettons qu’on prenne un bachelier au hasard, et qu’il s’appelle “Charles Philippe” (de son prénom). Il est le seul en France à s’appeler comme ça, résultat, s’il a eu mention très bien, on se retrouve avec 100% des Charles Philippe qui ont mention très bien. C’est une tendance qui a un intérêt limité puisque son erreur est assez grossière (ça paraît évident ; de manière plus formelle on peut dire que sur un échantillon de taille \(n\), on a une erreur en \(\frac{1}{\sqrt{n}}\), donc ici… une marge d’erreur de 100%… pas très beau à voir).

Pour résoudre ce problème, on se limite aux prénoms qui sont portés par au moins un certain nombre de gens. Régler ce paramètre est un peu ardu (il faut qu’il soit assez haut pour que les résultats ait du sens, mais assez bas pour que certains prénoms caractéristiques ne se voient pas virés alors qu’ils sont importants) mais ça se fait (grâce au hasard principalement).

La représentation

Le but est de représenter nos résultats sous forme de nuage de points, mais des points avec des légendes sur le graphique (oui parce que si on a cent couleurs différentes, lire la légende va pas être évident). Le problème, c’est qu’à part quelques prénoms qui se distinguent clairement (Emma est très porté et les Joséphine ont l’air plutôt douées avec plus d’un tiers de mention très bien), on se retrouve avec un gros pâté près de l’origine.

Pour résoudre ça (et comme je ne peux / veux pas partager d’image vectorielle ici) je réduis le nombre de points à représenter pour éviter l’effet pâté. Encore une fois, c’est une question de dosage. Mais si vous voulez avoir des données plus complètes, il suffit de lancer le script vous-même.

Pour faire tout ça d’un coup, j’utilise cette ligne absolument atroce :

for c, prenom in enumerate(reversed(sorted(tb.keys(), key = lambda x : tb[x]))):

Le c permet de compter les itérations et de s’arrêter au bon moment, le enumerate de faire apparaître le c, le reversed de parcourir notre liste dans le sens inverse pour avoir les plus grands pourcentages de mention très bien, le sorted permet de trier les prénoms par proportion de mention très bien. Un slicing aurait été sympa pour ajouter de l’exotisme à l’ensemble, mais on ne peut pas slicer sur un générateur 🙁
Enfin, je positionne naturellement mes points sur ma fenêtre graphique avec MatPlotLib. Pour mettre du texte, j’utilise annotate qui a l’avantage d’être simple et efficace.

Cliquez sur l’image, sinon on voit rien.

Autre résultat intéressant, les “sans mention”. En regardant qui sont les prénoms les plus “sans mentionnés” on voit bien que, quoi qu’en dise monsieur Macron, tout n’est pas qu’une question de volonté. Le milieu social aide un peu à la réussite ou à l’échec :

Notons tout de même que ces résultats sont toutes filières (générales) confondues. Il pourrait être intéressant de regarder la répartition des prénoms en fonction des filières (plus pour l’intérêt démographique de la répartition que pour les résultats au bac, qui doivent être sensiblement les mêmes quelle que soit la filière).

Voici le code pour cette première visualisation (ainsi que pour la récupération des données dans la BDD)

import sqlite3
import matplotlib.pyplot as plt

# nombre de personnes qui doivent porter un prénom pour qu'il soit pris en compte
# mettre une valeur trop basse risque de faire apparaître des prénoms rares (Charles Philippe par exemple) 
# ce qui n'a aucun intérêt puisqu'il suffit qu'il ait mention TB pour apparaître en top
# mais ça ne représente pas une tendance (puisqu'il est tout seul)
pallier = 50
# nombre de prénoms à être représentés
# en mettre trop fait une grosse masse vers l'origine
# ça devient lisible qu'à condition de zoomer 
# mais impossible de partager l'image après
nombreDePoints = 100

# On se connecte
db = sqlite3.connect("bac.s3db")
cur = db.cursor()

# On récupère les données dans la base de données !
# comme je fais des tests sur une base pas finie
# j'ai rajouté Prenom != '' pour ignorer les résultats pas récupérés
SQL = "SELECT * FROM Resultats WHERE Prenom != ''"
resultats = cur.execute(SQL).fetchall()

db.close()

# notre variable qui va contenir toutes les données
# je préfère tout charger puis classifier que de faire 30 000 requêtes SQL
# c'est plus rapide et au moins on a terminé avec la base de données
# on stocke dedans le nombre de chaque mention et le nombre de bacheliers qui portent le prénom
prenoms = dict()

# On analyse nos données
for academie, nom, prenom, lien, serie, resultat, mention in resultats:
    if not prenom in prenoms:
        prenoms[prenom] = {"COUNT" : 0}

    if mention != None:
        prenoms[prenom][mention] = prenoms[prenom].get(mention, 0) + 1

    prenoms[prenom]["COUNT"] += 1

# On transforme nos données
# On veut que la proportion de mention TB
# Mais on pourrait faire la même chose avec n'importe quelle mention
tb = dict()
for prenom in prenoms:
    if prenoms[prenom]["COUNT"] >= pallier:
        tb[prenom] = prenoms[prenom].get("MENTION TRÈS BIEN", 0) / prenoms[prenom]["COUNT"]

# On prépare les données pour les représenter
# Ici x     = horizontal = proportion de TB
#     y     = vertical   = nombre de bacheliers avec ce nom
#     label = le prénom en question
x, y, label = list(), list(), list()

# enumerate(reversed(sorted(tb.keys(), key = lambda x : tb[x])))
# - on compte chaque itération (pour sortir, on ne peut pas faire de slicing sur un générateur)
# - on reverse parce qu'on trie les prénoms par proportion de TB et on veut ceux qui en ont le plus
# - on trie selon le nombre de tb avec sorted
# - notre key est tout simplement la proportion de TB, soit tb[x]
for c, prenom in enumerate(reversed(sorted(tb.keys(), key = lambda x : tb[x]))):
    # On se limite à nombreDePoints résultats
    if c >= nombreDePoints:
        break

    # x représente la part de TB pour ce prénom
    x.append(tb[prenom])

    # y représente le nombre de gens qui portent ce prénom
    y.append(prenoms[prenom]["COUNT"])

    # z représente le prénom
    label.append(prenom)

# On affiche
fig, ax = plt.subplots()
ax.scatter(x, y)

for i, txt in enumerate(label):
    ax.annotate(txt, (x[i], y[i]))

plt.show()

Pour ceux que ça intéresse, je mettrai un lien vers la base de données complète quand j’aurai terminé de récupérer tous les résultats.

La momie : les pires six euros cinquante de ma vie

samedi 1 juillet 2017 à 15:10

Rappel des faits : alors que j’avais prévu d’aller à la piscine, je me suis retrouvé au cinéma, et je me suis retrouvé, plus particulièrement, à regarder La Momie. J’aurais préféré Wonder Woman, mais j’ai pas eu le choix, alors ce fut La Momie. Et je crois que j’avais rarement autant regretté d’avoir donné six euros cinquante à un cinéma de ma vie. Alors attention, ça va spoil, de toute façon vous allez pas aller voir ça, quand même.

Bon alors, qu’est ce que c’est La Momie ? C’est un mauvais film. (On va voir pourquoi juste après.) Mais ça raconte quoi ?

Comme nous l’explique une voix qui a sans doute fumé des gitanes sans filtre pendant quarante ans avant d’en arriver là, et qui dit “Je suis BATMAN” tous les soirs avant de se coucher, tout a commencé avec un mystérieux bracelet durant l’antiquité, où une fille voulait régner sur le royaume mais son père a eu un fils alors elle était pas contente, elle a voulu invoquer Seth (ce qui demandait de poignarder un “élu”) mais on l’en empêche juste à temps et elle se fait momifier vivante (????) et après et on s’en fout voilà c’est tout.

On retrouve également (à notre époque) une crypte d’anciens chevaliers croisés à Londres. Préparez-vous : on ne va plus en entendre parler avant des heures (enfin une heure quinze plutôt). 

Puis, comme souvent, l’intrigue repose sur l’intelligence toute relative des personnages pseudo-principaux : deux éclaireurs (ceci dit ils sont dans l’armée : ça se tient).
Ceux-ci, qui sont plus pilleurs de tombes qu’autre chose, décident d’aller piller le mauvais village et se font attaquer par des autochtones qui ne souhaitent pas se séparer de leurs pièces d’art. Comme ils sont quand même nombreux et qu’ils savent se servir de leurs fusils achetés par les Emirats Arabes Unis, une passionnante fuite dans les escaliers ou les deux personnages principaux crient se conclut par un appel aux renforts, et arrive un bombardier qui défonce l’intégralité du village. Sauf les deux éclaireurs, et c’est bien dommage.

Lorsque, après le bombardement, leur copine chiante archéologue vient les voir pour les engueuler (parce qu’apparemment ils lui ont volé sa carte en papier toute nulle) et pour descendre dans le trou qu’ils ont creusé sans faire exprès, ils décident de tirer partout au fusil d’assaut afin de chasser des araignées (vous trouvez ça con ? Ils sont dans l’armée) et accessoirement pour casser une grande découverte archéologique.
Et là, la momie se réveille. Merci les gars. D’ailleurs, ils ont un nom : Nick (le personnage principal) et Weil son sidekick rigolo. Il s’appelle pas Weil, en fait, mais je connais pas son nom, mais ça ressemble à ça (je précise que l’article a été écrit avant la mort de tata Simone, sorry). Juste pour information, l’archéologue s’appelle Jenny ou un truc du genre. Tout part en sucette et…

C’est la fuite. Ils prennent l’hélicoptère, puis l’avion, et atterrissent mystérieusement en Angleterre (tellement mystérieusement que même eux se demandent ce qu’il se passe). Enfin, atterrissent… question de point de vue. Des corbeaux très mal modélisés les attaquent et l’avion s’écrase (pas très vite) vers le sol. Nick donne un parachute à Jenny, qui s’envole, lui n’en trouve pas, et reste bloqué dans l’avion, et tombe, et meurt.

Si seulement.

On retrouve Jenny un peu assommée à qui on demande d’identifier les corps. Sauf que, surprise, Nick n’est pas en bouillie mais bien en un seul morceau et se réveille. Weil aussi. Lui, il est un peu pâle, parce qu’il s’est fait mordre par une araignée. Détail intéressant : les gens ni maudits, ni mordus, sont aussi en parfait état. La dernière fois que j’ai vu un crash aérien c’était pas comme ça. Bref.

Jenny entre dans la salle et surprise : ils sont vivants. Enfin, pas vraiment, Weil est vivant mais seulement pour Nick. Et heu là c’est l’inquiétude parce que quand même c’est pas commun un crash aérien où le mec survit contre toute attente alors que l’avion fait un angle avec la normale à la Terre de 0°.

En même temps, on suit deux ouvriers qui sont partis effectuer des fouilles sur le site du crash. Comme ils ne sont jamais allés à l’école ni au cinéma, ils ne savent pas que la nuit, tout est noir, et donc qu’on ne voit pas trop ce qu’on fait (ni les éventuels dangers).
La momie se réveille, embrasse les deux ouvriers, qui deviennent ses esclaves zombies ou un truc comme ça. En tout cas ils sont bien faits. Et on coupe la séquence parce que c’est cher les scènes avec des effets spéciaux.

On amène Nick au patron de Jenny, Professeur Inutile. Celui-ci a la particularité d’avoir un très grand bureau avec plein d’instruments d’opération, mais surtout d’être très mal doublé. Il est immunologue, juriste et un autre truc mais ça sert à rien.
Pendant qu’il se présente, il s’injecte un produit bizarre et il guide ensuite Nick vers un grand espace où on retrouve l’égyptienne à qui on est en train d’injecter du mercure (ah.) pour pouvoir la disséquer (ah.) Nick ne trouve pas ça très Charlie et dit “non arrêtez !” avec autant d’autorité d’une prof de maths dans le 93. Professeur Inutile le prend à part et lui explique que “un sacrifice pourrait sauver le monde” (le sacrifice de Nick, évidemment, mais il est con – il est dans l’armée, quand même – donc il comprend pas). Jenny arrive et dit “ah non mais vous le tuez pas, hein !” (avec l’autorité d’une prof de SES dans le 93) sauf que… Nick (qui a compris qu’on parlait de son sacrifice à lui) prend l’injecteur de Professeur Inutile qui se transforme instantanément en son jumeau maléfique.

Bon, heu. Déjà c’est discutable de prendre ses médicaments au dernier moment mais surtout, professeur Inutile, j’ai retrouvé son nom : il s’appelle Jekyll. C’est à ce moment que Stevenson commence à se retourner dans sa tombe, et qu’un combat épique (ou presque) débute entre Professeur Inutile (maintenant connu sous le nom de Hyde) et Nick. Ils se battent, ils se battent, on s’en fout, ils se battent encore, on s’en fout encore, et en parallèle, l’égyptienne prend contrôle d’une araignée de l’antiquité qui traînait dans les égouts et l’envoie prendre le contrôle d’un opérateur radio ou un truc du genre pour la libérer. Elle se libère, et le véritable drame commence : la deuxième partie du film.

Maintenant, tout le monde veut récupérer la dague, d’un côté pour en finir avec la malédiction, et de l’autre pour terminer le rituel. Et c’est chiant. Dieu, que c’est chiant.

Petite story time : j’avais dansé toute la nuit la veille. J’avais sommeil. J’ai failli dormir.

On voit bien que s’il y avait un réalisateur derrière la caméra, il a tenté de rendre la scène vivante mais c’est long, c’est convenu, c’est pas original. Ils sont dans les égouts, la momie prend le contrôle d’à peu près tout, force le passage vers la crypte, prend Jenny sous l’eau, la noie, Nick est triste, il rejoint la momie pour la tuer, enfin tout ça dans un ordre un peu aléatoire, j’ai du mal à me rappeler et on en arrive au duel final.

Réveillez-vous (ou pas, après tout ça change pas grand chose), car Nick alors que la momie possède une force incontrôlable, Nick la joue rusée et récupère le poignard en l’embrassant. Elle le frappe, il s’envole, mais ne meurt pas de la rupture de l’ensemble des os de son corps qui vient d’arriver, elle se rapproche et il tape la dague contre le sol. Elle est pas contente : “oh quand même, c’est pas cool. Ca fait deux mille ans que j’attends et là tu casses tous mes plans… rhoo non s’teuplaît.” Il a l’air de s’en foutre. “Ouais de toute façon ta pote là elle est morte t’y peux rien, si tu casses le caillou tu pourras pas la ramener hein, et je te tuerai.”

Alors de deux choses l’une : soit Jenny connaissait pas son cours sur l’Egypte ancienne et a oublié que casser la pierre était tout à fait inutile, soit elle le savait mais elle a décidé d’aller voir la momie juste pour le plaisir. Dans tous les cas y’a une incohérence. Mais bref.

A ces mots, Nick ne se sent plus de joie, ouvre son large bec, laisse tomber sa proie, comprend que son cas est désespéré, se plante la dague dans le thorax, se lève (puisque maintenant, il est Seth en personne) et va tuer la momie. Et c’est la fin.

Non. Evidemment, non.

On retrouve Nick sur un cheval (ou un chameau, mais l’idée est là) avec Weil juste derrière (que, apparemment, il a ressuscité parce qu’il peut ressusciter les hommes mais pas les femmes (?)), et ils partent à l’aventure.

Et vous pouvez enfin partir du cinéma.

Et vous pouvez enfin vous faire une petite liste de tout ce que vous auriez pu faire avec ces six euros cinquante (voire malheureusement plus si vous ne bénéficiez pas du tarif réduit), comme :

 Conclusion : on ne va pas voir La Momie. 

Voyage dans les tréfonds de Steam

lundi 5 juin 2017 à 12:00

Parfois les coïncidences vous amènent à faire des choses imprévues. Moi, j’avais besoin de cartes à échanger Steam. Alors je me suis inscrit à des giveaways Steam (des cadeaux de jeux en masse) et j’en ai gagné plein. Et ça m’a permis de faire des découvertes pour le moins intéressantes.

Jusqu’à aujourd’hui, jamais l’idée de tester les jeux qu’on m’avait donnés ne m’était venue à l’idée, et pour cause : c’était principalement des petits jeux, très mal notés sur le magasin Steam et qui donnaient pas trop envie. Mais tout à l’heure, j’avais dix minutes à tuer, alors je me suis demandé ce que je pourrais faire. La réponse est arrivée immédiatement : tester ces jeux.

Du coup, j’en ai pris un au hasard. Wyatt Derp. Un jeu créé par le studio Digital Homicide. Alors déjà c’est intéressant parce que, si vous ne connaissez pas Digital Homicide, ils sont notamment célèbres pour avoir poursuivi en justice des gens qui leur avaient mis des mauvaises évaluations sur Steam, et aussi un blogueur qui teste des jeux. Des gens qui sont donc bien sympa.

Alors qu’est ce que c’est que Wyatt Derp ? Dans Wyatt Derp, vous incarnez un sheriff qui doit défendre sa ville contre des… Méchants. Et des squelettes aussi des fois. Ça pourrait être rigolo, sauf que ne pouvez que vous déplacer sur les côtés et que vous ne pouvez pas avancer. Il y a une musique – une boucle de vingt secondes – les sons semblent sortis tout droit de… Bah je sais même pas. Les modèles sont moches, les animations pas adaptées, les effets d’un rare ridicule.

Petit détail en passant, j’ai la “chance” de posséder Wyatt Derp et Wyatt Derp 2: Peace Keeper (la suite tant attendue). Assez bizarrement, ils ont réussi à sortir les deux jeux le même jour… Je me demande comment c’est possible (après tout, ils n’ont rien à voir).

Non, vous ne rêvez pas : c’est bien le même jeu en vue du dessus. (Je mens : la musique aussi a changé. Mais c’est toujours nul.)

Mais je me suis dit “bon, j’ai pas eu de chance, on va tenter autre chose !” J’étais naïf. Encore au hasard, j’ai testé Devil’s Share, toujours du même studio.

C’est pas beaucoup mieux. C’est toujours aussi moche, les modèles n’ont aucune cohérence (sûrement des trucs gratuits trouvés à droite à gauche), on a aucune indication sur ce qu’on doit faire, c’est mal fait, y’a rien de bon. Rien. Je vous avais fait une petite vidéo, mais malheureusement j’ai eu un problème de micro et il était hors de question de jouer une minute de plus à ce jeu.

Mais je me disais encore que sur les trente-deux jeux que j’avais reçus (je précise qu’ils sont tous sortis à moins de deux ans d’intervalle, et je rappelle que le développeur bosse tout seul : ça en dit long sur la qualité), y’en avait forcément un de bon. Alors j’en ai pris un autre au hasard : Why so Evil. Et la je dois dire que je suis toujours plus époustouflé.

Dans Why so Evil, le but est simple. Vous avez un cube, et vous devez lui faire toucher un autre cube. Le tout en évitant des cubes rouges et des trucs qui veulent vous faire tomber d’une plate-forme sur laquelle vous vous déplacez. Alors oui, on remarque tout de suite que personne ne devrait accepter de payer pour jouer à ça, mais surtout ce qu’on remarque c’est que… J’aurais pu faire la même chose en deux heures. Et c’est même pas une figure de style.

Non, vous n’avez pas vomi sur votre écran, c’est juste Why so Evil.

J’aurais vraiment pu faire la même chose en deux heures puisqu’on reconnaît très rapidement l’un des tutoriels de base de Unity : Roll a ball. Le but de ce tutoriel niveau débutant est de se familiariser avec les différents concepts et primitives du moteur de jeu. A la fin, vous avez une boule capable de se déplacer sur un plan dans le but d’attraper des petits cubes verts. Et c’est tout. Ça tombe bien, c’est à peu près l’intégralité de Why so evil. D’ailleurs petite digression : on se demande pourquoi le jeu s’appelle comme ça, hein, à part que dans le menu y’a du feu (du feu moche, je précise) bah… Ça a aucun rapport. Ils auraient très bien pu appeler leur jeu Pigeon Simulator 2017 ou même Nazi Simulator 2017 redux que ça aurait eu autant de sens.

De même, on a eu le droit à un deuxième Why so Evil qui s’appelle Why so Evil: Dystopia, et dont le but est de déplacer son cube à travers une map tout en changeant de couleur au bon moment pour passer d’une plate-forme à une autre. Un peu comme Color Switch (sur smartphone) sauf que Color Switch c’est assez beau à regarder. Là, c’est juste un jeu moche fait sur Unity.

Le problème de tout ça, mise à part que omg des gens ont vraiment payé pour jouer à ces jeux c’est qu’ils nuisent au jeu vidéo indépendant.

Je pense qu’on est tous d’accord pour dire que – notamment Why so evil – est simplement un énorme fuck envers le client. “Tu veux payer pour te divertir ? Bah tant pis pour toi, va niquer ta mère.” (heureusement que les remboursements Steam existent). Ils n’ont ete conçus que dans le but de gagner de l’argent, peut être peu, mais en quantité, et tout ça avec la connivence non intentionnelle du joueur.

Mais Kowal, comment on fait pour gagner de l’argent en faisant de la merde comme ça ? Surtout si tout le monde se fait rembourser !

Ah. C’est beau la naïveté. C’est là qu’il faut se pencher un peu plus sur la façon de fonctionner du marché de la communauté Steam. Que se passe t-il lorsque vous achetez une carte à échanger ?

Là est l’entourloupe. Bien évidemment, personne va acheter son jeu de merde. Bien évidemment, personne ne va y jouer. Mais s’il propose de le donner gratuitement ? Les gens seront contents, ils auront des jeux gratuits, des cartes à échanger gratuites, et le développeur, lui, pourra continuer de se faire de l’argent sur le dos de Steam d’une part (bon, je pense que niveau comptable ils sont pas à plaindre) mais également sur le dos de la plupart des utilisateurs qui voudront compléter leur collection de cartes. Et là vous pourriez dire

Oui, mais quand même, vendre des cartes ça rapport pas tant que ça !

Think again. En en vendant 100 par jour (un exemple ici) à trois centimes (donc un centime pour le développeur, puisqu’il est hors de question que Steam et le développeur ne gagnent rien) pour chaque carte, bah ça fait déjà un euro par carte, soit une dizaine d’euros si on a dix cartes par jeu (Why so Evil en a huit), soit cent euros par mois. Multipliez ça par le nombre de jeu que vous avez publiés… Même si vous n’en avez qu’un ou deux, ça fait quand même deux cent euros par moi. Deux cents euros par moi, sans rien faire. Vous imaginez que moi je pourrais gagner deux cent euros par mois pour avoir reproduit et légèrement amélioré un tutoriel pour Unity (ce qui prend une bonne journée à tout casser, pour faire différents niveaux) ?
Maintenant imaginez la même chose, sauf que vous n’êtes pas les développeurs de Why so Evil, mais Robert et James Romine (de chez Digital Homicide) et que vous avez développé 21 JEUX. Ça fait une sacrée paye pour ne rien foutre de la journée. Mieux. Je crois que vous comprendrez rapidement pourquoi Steam a voulu couper tous liens avec eux – et encore plus après leur procès envers les joueurs mécontents – et a retiré leurs cartes à échanger du marché de la communauté.

Notez que la plupart des cartes à échanger des jeux Digital Homicide sont composées de Stock Photos et d’images trouvées au hasard sur Internet. On va pas s’emmerder à designer des trucs nous-mêmes, quand même, si ?

Attention, je dis pas que c’est pas normal. Si les gens sont cons et qu’ils achètent et les paient en même temps, c’est leur problème pas le mien. Là où ça me dérange plus, c’est à quoi ce genre de comportements amène.

Je sais pas ce que je déteste le plus : leurs pratiques ou leur logo.

Il faut savoir que le “marché du jeu-vidéo gratuit”, avec ses nombreux giveaways et ses clés-CD par milliers, est assez bien établi et, en fait, presque mafieux. On en connaît quelques uns qui reviennent souvent : Loot Toot, Grab the Games, et REX Network (je sais pas si je déteste le plus leurs pratiques ou leur logo…). Pourquoi presque mafieux ? On sait notamment que certains des administrateurs de REX Network on menacé des développeurs de jeux indépendants (je parle pas de studios comme Mojang ou Klei Entertainement, mais de vrais petits développeurs). Le marché est simple : vous acceptez de faire un giveaway, et en échange… bah en échange on ne vous bombarde pas d’avis négatifs. Dans les deux cas, le développeur est coincé : d’un côté il risque de faire baisser ses ventes à zéro (un petit jeu c’est difficile à vendre, un petit jeu avec des avis négatifs, c’est invendable), de l’autre il va tout simplement perdre des centaines d’euros en distribuant ses jeux gratuitement. Qu’est ce que REX Network y gagne ? Déjà, de la notoriété, et une communauté énorme. En outre, ils peuvent faire payer – ou “sponsoriser” d’autres développeurs de jeux. Par exemple, en ajoutant comme condition d’obtention d’une clé-CD de voter pour un jeu sur Greenlight (service qu’ils peuvent faire payer à un développeur qui peine à se faire remarquer) ils se font éventuellement de l’argent, et dans tous les cas grandissent leur empire.

Notez la “popularité” du groupe.

Mais on pourrait presque dire que tout ça, on s’en fout. Ce serait inacceptable, mais finalement on a bien fait avec jusqu’à présent. Le vrai problème se trouve ailleurs.

Depuis mi-2012, tout développeur indépendant – de jeu-vidéo ou de logiciels – pouvait ajouter ses créations à Greenlight. En gros, c’était une sorte de liste de jeux qui pourraient éventuellement sortir sur Steam. Pour ça, il suffisait qu’assez de gens votent pour. Ça permettait aux petits développeurs de passer outre l’absence d’éditeurs, et à n’importe qui – en théorie – de devenir développeur professionnel (donc de gagner sa vie en faisant des jeux). Plus maintenant. Suite à de nombreux abus – notamment des faux votes enregistrés à cause des groupes précédemment cités – Steam a décidé d’arrêter Greenlight, en le remplaçant par Steam Direct. C’est la même chose, sauf qu’il faut payer 100$ pour être dessus. Par exemple, si moi je faisais un jeu vidéo, je ne pourrais désormais plus accéder à la plateforme de Steam pour le vendre, parce que j’aurais pas les moyens de placer 100$ là-dedans. C’est une énorme régression pour le jeu-vidéo indépendant. Là où Steam se présentait comme son sauveur et son ambassadeur, cette nouvelle barrière anti-fraude se présente avant tout comme un filtre à relativement grosses productions. Exit les petits jeux comme Thomas Was Alone, comme 140, ou comme tant d’autres petits jeux qui ont pourtant une grande place dans mon coeur. Et pour autant ça ne va pas forcément empêcher les forceurs de forcer.

Les gens responsables de tout ça, qu’ils soient développeurs, “lobbyistes”, ou mêmes joueurs, ne se rendent sans doute pas compte de leur influence dans ce qui s’est passé. Et c’est bien triste. Bien triste de se rendre compte que ceux qui devrait aider le jeu-vidéo, et même l’aimer plus que n’importe qui, ne sont au fond qu’attirés par la soif du profit. Je ne dis pas qu’il ne faut pas espérer faire du bénéfice quand on fait un jeu – je ne suis pas inconscient, et surtout pas aveugle : développer un jeu prend du temps et de la passion – simplement que ce serait bien de ne pas être un connard.

Je rajoute une petite note : il faut savoir que le site de Digital Homicide est devenu LootTootGames.com, que les développeurs de Why So Evil sont tout simplement hébergés chez GrabTheGames et que REX Network a pas mal de liens avec beaucoup de jeux (que je ne trouve plus). Il n’y a même pas à chercher pour trouver la complicité extrême entre développeurs et lobbyistes. 

L’enfer est pavé de sorties du nucléaire

mardi 30 mai 2017 à 10:21

Fut un temps où la vapeur, c’était l’avenir. Sauf que pour faire de la vapeur, il fallait du charbon. Alors, on a cherché du charbon. En grandes quantités. On a envoyé des gens mourir sous la terre, dans d’atroces conditions, on a laissé Zola écrire Germinal, mais la science a fait un énorme pas en avant. On a même inventé la thermodynamique (ce qui me fait demander si c’était si bien que ça, la révolution industrielle).

Et puis un jour, on a inventé (enfin, inventé) l’électricité. Certains disent que c’est Edison. Moi je crois pas. Mais on s’en fout. L’électricité est devenue l’avenir. On a commencé à en faire avec du charbon, sauf qu’on s’est rapidement rendu compte que y’avait moyen de faire mieux. Parce qu’une centrale à charbon, ça demande du charbon. Et que faire brûler du charbon, c’est pas forcément tip top. Alors, on a inventé plein de façons de l’électricité : avec de l’eau, avec du soleil (bon, ça c’était un peu après), avec des programmes d’Emmanuel Macron (c’est à dire avec du vent) et avec une propriété physique sacrément pratique qui permet également d’éclater la gueule à son voisin et à dissuader celui qui se sentirait pousser des ailes de conquérant : la radioactivité.

Sauf que le problème de la radioactivité, pas besoin d’avoir inventé l’eau chaude pour le comprendre, c’est que c’est dangereux. La preuve, c’est qu’en parcourant Internet, on peut voir à tous les coins de rues des gens qui ont apparemment fait des études très supérieures dans des domaines très poussés de la physique nucléaire, mais qui pour une raison ou une autre ont oublié d’apprendre à parler français. Il y a souvent une corrélation. Mais bref, j’y reviendrai.
Le nucléaire, donc, c’est mal. On l’aura compris. Les politiques nous l’ont fait comprendre. Mélenchon. Hamon. Macron. Ca faisait d’ailleurs partie intégrante du projet de VIème république que voulait instaurer notre papi préféré de la France Insoumise. Et pourtant, je crois, et même si ça me fait mal d’être du même avis que des gens comme Fillon ou Le Pen, que la sortie du nucléaire a beau être une idée gentille et bienveillante, c’est pas demain la veille que ça arrivera. Alors démagogie ou réelles possibilités de changement ? Voyons tout ça.

Je précise que, contrairement aux physiciens nucléaires de YouTube, je n’ai que fait Math Spé, et que donc, mes connaissances en physique atomique sont relativement limitées. C’est pour ça que je parlerai pas trop du côté scientifique, histoire de pas dire de conneries 🙂

Je dois dire qu’habituellement, voir des gens débattre de sujets auxquels ils ne connaissent rien avec le même véhémence que s’ils avaient tous les deux un doctorat dans le domaine, ça m’en touche une sans faire bouger l’autre, mais là… je sais pas.

C’est en regardant la dernière vidéo du Grand JD sur YouTube (que je connais pas plus que ça, mais ça avait l’air intéressant) que j’ai eu l’occasion de rencontrer dans les commentaires de véritables combattants du nucléaire. Présentations.

Remarquez qu’en rageux de base, j’ai mis mon pouce en bas. Vive la démocratie.

Lui, c’est Gibu 1999. L’histoire ne dit pas s’il s’agit de son année de naissance ou son QI, mais il a des idées assez arrêtées sur le nucléaire. Pour lui, le nucléaire, c’est mal. Point. Même si ça ne se voit pas immédiatement dans son commentaire, dès qu’on lui oppose un commentaire qui ne le satisfait pas tout à fait, il s’excite et… oh.

En lisant ses commentaires et ses réponses, on se rend rapidement compte qu’il a une idée : une éolienne et un panneau solaire par maison et tada, problème réglé. En plus, on a plein d’argent à jeter par les fenêtres et puis le renouvelable, c’est magique. Tout va bien dans le monde du renouvelable. Mais encore une fois, j’y reviendrai.

Ensuite, dès qu’on commence à lui opposer des arguments un peu plus construits, il part dans un délire bizarre sur l’énergie libre de Tesla (théorie conspirationniste comme quoi il existe une énergie récupérable gratuitement mais que – oh – ça nuit au pouvoir du lobby du nucléaire et que donc, bah, on l’utilise pas, eh !)

J’ai ensuite posé quelques questions, notamment sur la possibilité d’une prochaine fusion nucléaire contrôlée. Le principe – pour simplifier beaucoup – c’est qu’au lieu de casser des noyaux lourds pour libérer de l’énergie (ce qui demande des noyaux lourds fragiles, donc de l’uranium enrichi qui a été au préalable miné par des enfants exploités par Areva en Afrique) on balance deux noyaux l’un sur l’autre pour les fusionner. L’avantage, c’est que ça libère beaucoup plus d’énergie, en plus de n’avoir pour déchets que des trucs du genre de l’eau – ou de l’eau lourde – qu’on a pas besoin d’enterrer pendant des centaines d’années. L’inconvénient c’est que… heu… on sait pas trop le faire. C’est en version alpha on pourrait dire. Mais ça avance, et à une vitesse assez étonnante (je me souviens qu’en première on me disait “la fusion nucléaire ? Jamais, on n’y arrivera pas.” Et pourtant, les premiers tests – primaires, certes, mais il faut un début à tout – se font actuellement – et en Europe ! Pour en revenir à Gibu, il répond soit à côté en restant dans son idée d’éoliennes (notamment quand je demande comment il compte mettre des éoliennes dans une ville, vu le bruit que ça fait et l’espace que ça demande…), soit en disant que “certains le font, alors pourquoi pas tout le monde ?” Aucun vrai argument. Au final, après une autre réponse de ma part, il met fin au débat :

Ah. On verra ce que l’avenir te donne. J’ai peur qu’il te donne une place à pôle emploi, personnellement (eh oui ça clash, faut bien faire de l’audimat).

Le fait est que le problème est un peu plus profond que ça. Le problème ne concerne pas deux abrutis qui débattent d’un sujet qu’ils ne comprennent pas sur une vidéo d’un mec qui va visiter les ruines de Fukushima. Le problème est de vendre aux gens quelque chose qui n’a pas forcément de sens.
Je suis peu renseigné sur les programmes des candidats. Je sais en particulier que Mélenchon a fait une vidéo de cinq heures que tout le monde cite mais que sans doute personne n’a regardée, expliquant (avec des économistes) comment son programme peut être appliqué en cinq ans, et pourquoi ce n’est pas économiquement utopiste, mais économiquement possible. Et je dois dire que je suis assez impressionné par ça. Trump n’a pas encore expliqué comment il allait faire son mur, lui.

Mais peut-être qu’en fait, la question de l’énergie au vingt-et-unième siècle est un peu plus complexe que de dire “ouais, on va supprimer le nucléaire, et mettre des trucs verts à la place !” N’oublions pas que que le nucléaire représente près de 80% de l’électricité consommée en France. Et que ce qu’on produit avec la fission, c’est un peu plus que ce qu’on peut produire avec tous les autres moyens. Le Monde consomme de l’énergie. Beaucoup d’énergie. Tellement d’énergie que c’est difficile de réellement se rendre compte. Et on est face à une impasse. Il n’existe pas de moyen miracle de produire assez d’énergie en 2017 (pas même l’énergie libre de Tesla !). Et la transition énergétique n’est peut-être pas la meilleure idée, en ce moment.

Parce que penser qu’un panneau solaire ou une éolienne, c’est cool et ça ne pose pas de problème, c’est être utopiste, pour ne pas dire faire l’autruche. C’est difficile à produire, c’est cher à produire. Ça produit moins que la fission. Et surtout, ça dépend beaucoup de la météo. Si vous avez pas pile le bon vent, votre éolienne tourne pas. Si vous avez pas assez de soleil, les déjà maigres quinze pour cents de rendement de votre panneau de vous aideront pas. Mais on a qu’à en faire autant que possible et l’utiliser plus tard ! Sauf qu’admettre que c’est possible est oublier un fait : les batteries sont un problème presque aussi gros que le nucléaire. Produire des batteries – ou des piles – coûte cher à la Terre. C’est difficile à fabriquer, c’est difficile à entretenir, c’est dangereux à sa façon (tapez sur une batterie au lithium un coup pour voir) et ça a du mal à tenir la longueur. Combien de temps votre téléphone a t-il eu l’autonomie annoncée par le constructeur ? Ce serait pareil avec les maisons. Sauf que ce serait des batteries beaucoup plus grosses, beaucoup plus chères, donc beaucoup plus difficile à recycler. Et ça coûterait plus que le nucléaire, parce que ça nous limiterait très rapidement en ressources naturelles. Voilà une première raison pour laquelle le “tout vert” ce n’est pas aussi facile que ça en a l’air.

Surtout que la science avance. On a presque envie de dire que c’est pas de chance, mais la fusion nucléaire n’est pas loin. Je sais que c’est mon leitmotiv depuis le début de l’article, mais la fusion ne tardera pas. Peut-être moins de dix ans avant d’avoir une fusion contrôlée. Quinze pour avoir des bons rendements. Peut-être que dans vingt ans on aura le premier réacteur à fusion nucléaire civil (et si vous ne vous rendez pas compte de que ça veut dire… dites vous seulement que c’est… exceptionnel). Et du coup, est ce que c’est pas un peu dommage d’investir des milliards dans des énergies “renouvelables” qu’il faudra remplacer quand la fusion sera là ? Parce que dès lors, et malgré les possibles défauts qu’elle aura – parce que rien ne se passe jamais comme prévu – elle sera plus rentable sur le long terme que ne l’auront jamais été éoliennes et panneaux solaires.

Le problème, le voici. On est face à une décision difficile, décision dont les résultats sont très difficilement imaginables, puisqu’il est impossible de prévoir ce que l’avenir nous prédit en matière de fusion. Soit investir dans les énergies vertes, produire énormément, tout pour sortir du nucléaire maléfique. Mais prendre le risque que ça ait été inutile quand on aura un réacteur à fusion.
Ou alors, on attend. On reste pareil. Avec autant, voire plus, d’inconvénients (que ce soit par rapport aux risques, à l’argent que ça coûte à l’état ou à la question de la fission toujours remise sur le tapis).

On pourrait dire “on reste comme ça, après tout, ça ne coûte pas grand chose, et on ne prend que le risque que tout explose.” (C’est ce que je me disais au début.) Mais c’est plus compliqué que ça : les réacteurs nucléaires demandent un entretien plus ou moins régulier, qui fait qu’en ce moment, on est censé rénover des centrales. Et ça coûte cher. Plus cher que Pénélope Fillon. Est ce que ce serait pas mieux d’investir dans quelque chose de durable ? Ça créerait de l’emploi mais en parallèle, bah… ça demanderait de produire tout ces trucs. Dans tous les cas, on va polluer. Polluer beaucoup.

Et c’est bien ce message que je veux faire passer au travers de cet article : sortir du nucléaire, non seulement ce n’est pas aussi simple qu’on peut vouloir nous le faire croire, mais surtout c’est pas aussi miraculeux qu’on pourrait le penser. Comment produire cinq fois plus d’énergie avec les moyens dits écologiques (et je n’ai pas parlé du fait, par exemple, que les stations marémotrices ont un impact négatif sur les populations de poissons, ou aussi du fait que construire des barrages n’a jamais fait du bien à l’écosystème autour) alors qu’ils dépendent des conditions météo ? Dire que “de toute façon la nuit on dort” serait trop rapidement oublier le fait que les humains ne sont pas les seuls utilisateurs de l’électricité. Le nucléaire, aujourd’hui, permet de “lisser” les variations de production des moyens annexes pour qu’on puisse regarder la télé la journée comme la nuit sans se poser de questions. Mais comment faire un jour de pluie où il ne vente pas ? Comment faire le jour où une tempête décide de décimer toutes les éoliennes d’une région ?

Le nucléaire a beau être dangereux, le nucléaire a beau être polluant, le nucléaire reste un mal nécessaire. Au moins tant que Gibu et son équipe de chercheurs en énergies renouvelables ne nous sortent un moyen d’exploiter l’énergie libre de Tesla.