Un programme pour apprendre ses tables de multiplications

En primaire on commence à apprendre ses tables de multiplications. Bien sûr on se sert des parents pour les réciter avant le contrôle. Cependant, les parents ça passe leurs temps à faire des commentaires. Alors pourquoi ne pas utiliser la machine pour les réciter sans jugement ?

C’est d’autant plus facile aujourd’hui avec la multitude de langages de haut niveau disponibles. Par exemple en python on peut tartiner un programme vite fait bien fait comme cela :

import random

maxcount = 10
count = maxcount

while count != 0:
    a = random.randint(2, 9)
    b = random.randint(2, 9)
    
    res = input(f"{a} x {b} = ")
    if (int(res) != int(a*b)):
        print(f"NAN! C'était {a*b}")
        count = maxcount
    else:
        print("Bien")
        count = count - 1
    print(f"Encore {count} multiplications à trouver")

print("BRAVO \o/")Langage du code : PHP (php)

Le programme fonctionne plutôt bien, on peut ensuite l’améliorer et ajouter des défis.

Réponse parlée

Là, il faut un clavier pour répondre, ça suppose de savoir s’en servir. Et c’est plus long pour répondre. Si on veut faire un programme basé sur la vitesse et qui évite d’avoir à connaître l’usage du clavier on peut essayer de passer par la reconnaissance vocale avec la bibliothèque open-source Vosk par exemple. Ce logiciel a l’avantage de pouvoir s’utiliser hors ligne.

L’installation de vosk est d’une simplicité biblique :

$ sudo python3 -m pip install vosk
[sudo] Mot de passe de fabien :        
Collecting vosk
  Downloading vosk-0.3.45-py3-none-manylinux_2_12_x86_64.manylinux2010_x86_64.whl (7.2 MB)
     ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 7.2/7.2 MB 22.7 MB/s eta 0:00:00
Collecting tqdm
  Downloading tqdm-4.65.0-py3-none-any.whl (77 kB)
     ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 77.1/77.1 KB 13.6 MB/s eta 0:00:00
Requirement already satisfied: requests in /usr/lib/python3/dist-packages (from vosk) (2.25.1)
Collecting websockets
  Downloading websockets-11.0.3-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl (129 kB)
     ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 129.9/129.9 KB 6.6 MB/s eta 0:00:00
Collecting cffi>=1.0
  Downloading cffi-1.15.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (441 kB)
     ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 441.8/441.8 KB 11.6 MB/s eta 0:00:00
Collecting srt
  Downloading srt-3.5.3.tar.gz (28 kB)
  Preparing metadata (setup.py) ... done
Collecting pycparser
  Downloading pycparser-2.21-py2.py3-none-any.whl (118 kB)
     ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 118.7/118.7 KB 8.2 MB/s eta 0:00:00
Building wheels for collected packages: srt
  Building wheel for srt (setup.py) ... done
  Created wheel for srt: filename=srt-3.5.3-py3-none-any.whl size=22445 sha256=5d6b0eded4562ad3cdb720ee5932cf7a7c377a463690f0cfef649372d3501355
  Stored in directory: /root/.cache/pip/wheels/d7/31/a1/18e1e7e8bfdafd19e6803d7eb919b563dd11de380e4304e332
Successfully built srt
Installing collected packages: websockets, tqdm, srt, pycparser, cffi, vosk
Successfully installed cffi-1.15.1 pycparser-2.21 srt-3.5.3 tqdm-4.65.0 vosk-0.3.45 websockets-11.0.3
WARNING: Running pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager. It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venv
Langage du code : JavaScript (javascript)

On pourra ensuite essayer de convertir un échantillon de voix lisant ’42’ :

$ vosk-transcriber -l fr -i vosk/quarante-deux.mp3 -o quarante-deux.txt
vosk-model-small-fr-0.22.zip: 100%|██████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 40.3M/40.3M [00:02<00:00, 20.8MB/s] 
LOG (VoskAPI:ReadDataFiles():model.cc:213) Decoding params beam=13 max-active=7000 lattice-beam=4
LOG (VoskAPI:ReadDataFiles():model.cc:216) Silence phones 1:2:3:4:5:6:7:8:9:10
LOG (VoskAPI:RemoveOrphanNodes():nnet-nnet.cc:948) Removed 0 orphan nodes.
LOG (VoskAPI:RemoveOrphanComponents():nnet-nnet.cc:847) Removing 0 orphan components.
LOG (VoskAPI:ReadDataFiles():model.cc:248) Loading i-vector extractor from /home/fabien/.cache/vosk/vosk-model-small-fr-0.22/ivector/final.ie
LOG (VoskAPI:ComputeDerivedVars():ivector-extractor.cc:183) Computing derived variables for iVector extractor
LOG (VoskAPI:ComputeDerivedVars():ivector-extractor.cc:204) Done.
LOG (VoskAPI:ReadDataFiles():model.cc:282) Loading HCL and G from /home/fabien/.cache/vosk/vosk-model-small-fr-0.22/graph/HCLr.fst /home/fabien/.cache/vosk/vosk-model-small-fr-0.22/graph/Gr.fst
LOG (VoskAPI:ReadDataFiles():model.cc:308) Loading winfo /home/fabien/.cache/vosk/vosk-model-small-fr-0.22/graph/phones/word_boundary.int
INFO:root:Recognizing vosk/quarante-deux.mp3
INFO:root:{'partial': 'quarante-deux'}
INFO:root:{'partial': 'quarante-deux'}
INFO:root:{'partial': 'quarante-deux'}
INFO:root:{'partial': 'quarante-deux'}
INFO:root:{'partial': 'quarante-deux'}
INFO:root:{'partial': 'quarante-deux'}
INFO:root:{'partial': 'quarante-deux'}
INFO:root:File quarante-deux.txt processing complete
INFO:root:Execution time: 0.766 sec; xRT 0.426

$ cat quarante-deux.txt 
quarante-deux
Langage du code : JavaScript (javascript)

Bon pour le «offline» c’est pas tout à fait ça puisqu’il faut quand même télécharger le modèle pour la langue (ici ‘-l fr’ pour français). Mais, une fois téléchargé il n’y a plus à y revenir.

Testé sur d’autre échantillons ça marche relativement bien. Il nous reste quelque problèmes:

  • Nous avons utilisé un échantillon sonore enregistré. Notre objectif est de pouvoir «écouter» la réponse sans avoir à utiliser le clavier.
  • Le résultat est donné en texte, il va donc falloir le convertir en nombre.

test_microphone.py

Le projet Vosk propose un script en python pour tester son microphone. Ce script transcrit en temps réel le texte reconnue.

On peut reprendre le script et modifier la boucle d’affichage du texte pour convertir en nombre le texte reconnue puis vérifier que le calcul est bon.

Ça tombe bien car en python il y a un module qui fait la conversion texte en nombre : text2num

Text2num

Convertir un texte en un nombre est chose facile avec text2num:

$ sudo python3 -m pip install text2num
Collecting text2num
  Downloading text2num-2.5.0.tar.gz (38 kB)
  Preparing metadata (setup.py) ... done
Building wheels for collected packages: text2num
  Building wheel for text2num (setup.py) ... done
  Created wheel for text2num: filename=text2num-2.5.0-py3-none-any.whl size=58681 sha256=fd5ff29e88655c69c08cee37608129ffd7fbbed2cc96ef59ddc9ce4b77443bda
  Stored in directory: /root/.cache/pip/wheels/49/b2/af/5db9aefd179867bbae782e4e1aefa78490377f561b4c97f34e
Successfully built text2num
Installing collected packages: text2num
Successfully installed text2num-2.5.0
WARNING: Running pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager. It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venv
Langage du code : JavaScript (javascript)

L’utilisation se fait de la manière suivante (dans une console ipython):

In [2]: from text_to_num import text2num

In [3]: text2num("quarante-deux", "fr")
Out[3]: 42
Langage du code : JavaScript (javascript)

Il reste à ajouter le module json de python pour convertir la sortie texte et nous avons notre squelette de programme de récitation des multiplications :

            rec = KaldiRecognizer(model, args.samplerate)
            count = MAX_OPERATION_NB 
            while count != 0:
                print(f"Courage, plus que {count} opérations")
                a = random.randint(2, 9)
                b = random.randint(2, 9)
                print(f"Combien font {a} x {b} ?")
                while True:
                    data = q.get()
                    if rec.AcceptWaveform(data):
                        res = rec.Result()
                        textvalue = json.loads(res).get("text", None)
                        if textvalue is not None:
                            response = my_text_2_num(textvalue)
                            if textvalue.strip() == "":
                                print("alors ?")
                            elif response < 0:
                                print(f"J'ai pas compris ({textvalue})")
                            else:
                                print(f"(Ta réponse «{textvalue}» -> {response})")
                                if response == a * b:
                                    print("Bien")
                                    count -= 1
                                    break
                                else:
                                    print("Raté")
                                    count = MAX_OPERATION_NB
                                    breakLangage du code : PHP (php)

Le script quick & dirty est disponible sur mon dépot github. Le système fonctionne étonnamment bien, même avec un vieux lenovo Thinkpad T430.

Maintenant que le principe est validé on va pouvoir «gamifier» tout ça et faire de super jeux 🙂

Mais c’est une autre histoire.

Publié dans Non classé | Marqué avec , , , | Laisser un commentaire

.bashrc

# ouvrir un onglet de terminal dans le même répertoire
[[ -s "/etc/profile.d/vte.sh" ]] && . "/etc/profile.d/vte.sh"Langage du code : PHP (php)

Publié dans Non classé | Marqué avec , , | Laisser un commentaire

On devrait graduer les biberons en heures de sommeil et pas en mL.

Publié le par admin | Laisser un commentaire

Publié le par admin | Laisser un commentaire

L’arbre de la résidence voisine est vexé d’avoir été taillé : il fait des fuck à tout le monde !

Fuck humans

Publié le par admin | Laisser un commentaire

Pour la prise en compte du Vélo dans la mise en 2×2 voies du contournement ouest de Colmar

Le CADR Colmar relais l’information d’Exa’Pousse :

——– Message du Cadr Colmar —————-

Amis cyclistes bonjour,

Nous relayons une information du collectif d’Eguisheim « Exa’Pousse », qui concerne tous les habitants de Colmar et environ…

Mardi 14 mars, Réunion publique à l’Arthuss à Wintzenheim à 18h30.

———- Forwarded message ———

Cher(ères) amis(es),

Vous savez que le projet de mise à 2X2 voies de l’axe routier D83 (contournement ouest de Colmar de Logelbach à Ricoh) est maintenant concret, la concertation publique est lancée, même si chacun pourra se poser la question de la cohérence d’une telle réalisation en 2023…

(Voir pour cela l’article DNA du 05/03/2023)

Depuis le début des réflexions sur ce contournement, Exa’Pousse (anciennement Eguisheim en Transition) est présent dans les instances pour faire entendre l’urgence de relier à vélo, de manière sécurisée, Eguisheim à Colmar.

Nous avons proposé un passage souterrain et la CEA, convaincue, a repris notre projet dans ses dernières présentations. Les services techniques de la CEA soutiennent fermement cette option, cependant il n’y a pour l’instant aucune délibération actée et le projet présenté dans les journaux n’indique pas ce passage inférieur pour rejoindre Colmar à Eguisheim à vélo.

C’est à nous tous de nous mobiliser, amis, voisins, famille, piétons, usagers du vélo et acteurs pour un monde avec moins voitures… pour nous faire entendre et appuyer ce projet de souterrain.

Il est indispensable de participer aux actions suivantes  :

de manière collective :

Mardi prochain 14 mars, présence à la réunion publique organisée à l’Arthuss à Wintzenheim à 18h30.

de manière individuelle :

En se présentant à la mairie pour écrire nos doléances dans le registre prévu dans le cadre de l’enquête publique.

(horaires d’ouverture de la Mairie : Lundi, Jeudi, Vendredi : 10h-12h30 / 13h30-15h30, Mardi : 7h45-12h30 / 13h30-17h, Mercredi matin : 10h-12h)

Voici les idées et motivations à développer dans le registre pour défendre le projet du passage souterrain sécurisé :

– favoriser le déplacement à vélo vers Colmar de manière rapide et sécurisée

– franchissement de la RD 83 de manière sécurisée (à la place du rond-point des noyers particulièrement dangereux)

– poursuivre la piste cyclable venant du sud pour rejoindre Colmar, cohérence du réseau cyclable

– favoriser le tourisme vert

– diminuer la place de la voiture à Eguisheim, Colmar, et par la même la problématique du stationnement

Amicalement

L’équipe Exa’Pousse

Publié dans Non classé | Marqué avec , , , | Laisser un commentaire

[BIS] Déballage du CH32V003, le microcontrôleur à 0.1$

N’ayant pas eu beaucoup de succès avec le kit de développement CH32V003 trouvé sur Tindie, j’ai commandé ce qui semble être le même kit par la voie officielle.

La présentation du colis est assez clean (bon tout est en chinois par contre)

Les avantages de passer par le distributeur officiel (en fait aliexpress !) c’est que c’est nettement moins cher et qu’il n’y a pas de frais de douane surprise à la réception du colis. En plus c’est bien présenté et le debugger est munie d’un beau boîtier transparent.

À voir maintenant si ça marche mieux, parce que c’est tout de même l’essentiel !

Donc si on test le debugger sur le kit tindie avec openocd :

$ ./openocd -f wch-riscv.cfg
Open On-Chip Debugger 0.11.0+dev-02215-gcc0ecfb6d-dirty (2022-10-10-10:35)
Licensed under GNU GPL v2
For bug reports, read
	http://openocd.org/doc/doxygen/bugs.html
Info : only one transport option; autoselect 'jtag'
Ready for Remote Connections
Info : Listening on port 6666 for tcl connections
Info : Listening on port 4444 for telnet connections
Info : WCH-LinkE-CH32V307  mod:RV version 2.8 
Info : wlink_init ok
Info : This adapter doesn't support configurable speed
Info : JTAG tap: riscv.cpu tap/device found: 0x00000001 (mfg: 0x000 (<invalid>), part: 0x0000, ver: 0x0)
Warn : Bypassing JTAG setup events due to errors
Info : [riscv.cpu.0] datacount=2 progbufsize=8
Info : Examined RISC-V core; found 1 harts
Info :  hart 0: XLEN=32, misa=0x40800014
[riscv.cpu.0] Target successfully examined.
Info : starting gdb server for riscv.cpu.0 on 3333
Info : Listening on port 3333 for gdb connections
Langage du code : PHP (php)

Voila qui ressemble à quelque chose !

Pour être bien sûr, si l’on retente avec la version tindie :

$ ./openocd -f wch-riscv.cfg
Open On-Chip Debugger 0.11.0+dev-02215-gcc0ecfb6d-dirty (2022-10-10-10:35)
Licensed under GNU GPL v2
For bug reports, read
	http://openocd.org/doc/doxygen/bugs.html
Info : only one transport option; autoselect 'jtag'
Ready for Remote Connections
Info : Listening on port 6666 for tcl connections
Info : Listening on port 4444 for telnet connections
Info : WCH-LinkE-CH32V307  mod:RV version 2.7 
Error:  WCH-Link failed to connect with riscvchip
Error:  1.Make sure the two-line debug interface has been opened. If not, set board to boot mode then use ISP tool to open it
Error:  2.Please check your physical link connectionLangage du code : JavaScript (javascript)

Il y a clairement un problème avec le debugger en provenance de Tindie 🙁

Schema IOS

Trouvé sur touiteur.

Publié dans Non classé | Marqué avec , , , | Laisser un commentaire

Port du casque à vélo

Trouvé sur Twitter.

Non le port du casque ne réduit pas les risques d’accidents, et il ne réduit pas non plus les conséquences des accidents à vélo

Publié dans Non classé | Marqué avec , , , | Laisser un commentaire

Pull git

Un truc vite fait pour faire un «patron de tricot» à partir d’une image. L’idée est de pouvoir reproduire un dessin/logo sur un pull ou une couverture.

Partons du logo git histoire de pouvoir faire un jeux de mots de geek

Partir d’une image trouvée sur le net ou autre, l’ouvrir avec gimp puis faire une sélection carré (parce que j’ai envie d’un carré et puis voila) :

Perso j’ai utilisé les champs du formulaire à gauche pour modifier la sélection.

Ouvrir ensuite le filtre motif-grille :

Le menu est bien planqué

Et vous pouvez ensuite régler votre grille en fonction du nombre de maille désirées :

Prêt à tricoter

Il n’y a plus qu’à tricoter, mais ça faut pas trop me demander comment. Je ne sais faire que les carrées uni voir alterner une ligne sur deux avec deux couleurs. Mais ça s’arrête là 😉

Quelques œuvres :

Bon c’est pas moi qui tricote, mais je suis sur que le lecteur meure d’envie d’avoir des exemples :

Le «patron» imprimé de bob l’éponge
Le résultat avec Bob
Le logo du célèbre club de kayak
Patrick l’étoile de mer

Publié dans Non classé | Marqué avec , , , | Laisser un commentaire

Colmar, la piste cyclable de la honte.

Bien sûr c’est un peu prétentieux de parler de LA piste cyclable de la honte tant il y a de points noir à Colmar concernant la cyclabilité. Mais cet axe est un point symptomatique du traitement des cyclistes colmarien par la ville. C’est un axe massivement emprunté pour se rendre à la gare par toute la partie sud-est de la ville.

Avenue de Fribourg, George Clémenceau puis Raymond Pointcarré (sources openstreetmap)

On va parler ici de l’axe qui part du carrefour tueur d’enfants au commencement de l’avenue de Fribourg pour aller jusqu’à la gare en passant par l’avenue George Clemenceau et Raymond Poincaré.

Pourquoi parle-t-on du carrefour «tueur d’enfants» ? Sur ce carrefour, les feux piétons passent au vert alors que les feux voitures sont encore au vert. De cette manière, les automobilistes arrivent «pleine balle» sur les passages piétons remplis d’enfants qui traversent correctement au vert et risque la mort à chaque fois.

Départ

Départ

Ici, la piste est à sens unique et la bande de roulement est presque correcte \o/ mais on remarque tout de suite le problème : Comment passent les piétons ? Les artistes qui ont décorés ce trottoir ont-ils pensé à eux ? Comment la cohabitation piétons/cyclistes peut-elle bien se passer ici ?

Croisement route de Bâle et début George Clemenceau

Entrée dans l’avenue Georges Clémenceau

Ici nous avons donc 4 voies réservées aux engins motorisés et deux voies vélos mise sur le trottoir. On a de la chance, la voie cyclistes est en sens unique quand elle passe derrière l’arrêt de bus sans laisser de place aux piétons !

Piste tchétchène

Difficile de représenter le délabrement du trottoir en photos, mais sachez que cette piste donne l’impression de rouler sur une route tchétchène fraîchement bombardée par les Russes.

Elle est toute belle sur le plan la piste cyclable.(openstreetmap)
La réalité est beaucoup moins reluisante

Sans parler de toutes les sorties de garage d’où les bagnoles sortent pour se mettre en travers du trottoir et tout bloquer.

Cour d’appel

Le passage devant la cour d’appel n’est pas beaucoup mieux.

À noter qu’à cet endroit la piste cyclable est à double sens
Le revêtement pour les piétons est en meilleur état que pour les cyclistes

Mon passage préféré

Notez bien qu’ici, la piste cyclable est à double sens
On sert les fesses pour passer.

Ici nous avons donc 4 voies pour les motorisés, un arrêt de bus qui réduit la taille de la piste cyclable qui est … À DOUBLE SENS ! Alors que la largeur ne laisse même pas passer un seul cycliste adulte…

L’apothéose : l’arrivée à la gare

J’aurais voulu vous montrer ici la piste cyclable qui se fait couper par les voitures tournant à droite (au vert tout les deux en même temps), mais un camion de déménagement me bouchait la vue !

J’aimerai bien voir la gare mais je peux pas.

C’est bien connu à Colmar que les pistes cyclable sont en fait des places de parking pour voitures et camions (parce qu’à Colmar, on s’y gare !). Tant qu’on met les warnings d’immunitay y a pas de problème.

À noter également que vu son stationnement, il devait être là depuis un certain temps. La police municipale n’a pas l’air de s’être dérangée pour si peu…

Publié dans Non classé | Marqué avec , , , , | Laisser un commentaire