Ici on expérimente avec Anki : tables de multiplications, régions, trucs appris lors d'une visite, … tout y passe.
J'aime beaucoup le côté « il ne t'embête pas avec ce que tu sais déjà ».
J'ai testé moi-même : j'ai appris les départements (nom, numéros, préfectures, emplacement), à coup d'une séance par jour (plus des révisions si je m'ennuie pendant les transports), ça marche juste. Bon au début ça m'a fait des séances de plus de 15mn (20 nouvelles informations à apprendre par jour par défaut), mais maintenant j'y passe moins de 3mn par jour (c'est de la révision pour éviter d'oublier).
Les plus : c'est packagé Debian (et oui ça marche sur téléphone avec Mobian, l'app est tout juste suffisamment responsive pour que ce soit tout à fait utilisable).
Les moins : le package Debian est un peu vieux, mais je ne m'en rends pas trop compte. J'ai juste voulu ouvrir une issue une fois mais le bug était corrigé depuis belle lurette…
un programme en Python consomme 30x plus d'énergie qu'un programme en Java
C'est seulement vrai si on oublie volontairement cython, numba, pythran, pypy, mypyc, …
Pierre Augier et al. ont fait un papier intéressant à ce sujet ici et ici.
Où on peut voir un même algorithme, implémenté en Python, tourner sur différents interpréteurs/jit/… et s'étaler très largement d'un ordre de grandeur plus performant que Java à un ordre de grandeur moins performant que Java.
TL;DR :
Our work shows that the performance of scientific programs depends less on languages than on the time spent on optimization and the developer skills to correctly use the right tools.
Par exemple :
https://img.linuxfr.org/img/68747470733a2f2f636c6f75642e616e7469706f756c2e66722f732f4a7471397878576371505764396d342f70726576696577/preview ☹
Je suis étonné de voir des sudo pip : je ne l'utilise jamais et le déconseille toujours : pour moi ça ressemble à un aimant à problèmes, ai-je raté quelque chose ?
Chez moi tout ce qui est hors de mon home c'est apt qui s'en occupe (seul, et donc sans problèmes), et pip se cantonne à des venv ou à ~/.local/ : pas de problèmes.
Il ne faut pas trop se plaindre, avant lorsqu’on appuyait sur Esc avec la sélection d’émoji ouverte, le commentaire qu’on rédigeait se fermait sans être sauvegardé : https://gitlab.com/gitlab-org/gitlab/-/issues/20262.
Pour avoir utilisé les deux (coverage -m pytest, tout simplement, et en utilisant pytest-cov), j'ai finalement eu moins de soucis avec coverage -m pytest, surtout avec des tests parallèles.
Où un tox -m all lance des tests sur 3 versions de Python en parallèle et agrège les résultat de coverage à la fin. Faire la même chose avec pytest-cov est un enfer ☹.
L'agrégation est particulièrement utile dès qu'on a quelque chose comme :
ifsys.version_info>(3,8):...else:...
sans agréger à la fin, soit le if soit le else sera compté comme non couvert, alors qu'en agrégeant le if et le else peuvent être couverts (et atteindre le fameux 100%, ha, ha).
Le souci de python3 -m venv .venv c'est qu'il crée un venv qui s'appelle .venv, donc le prompt ressemble à (.venv) mdk@seraph:/tmp.
Ça se personalise avec --prompt mais je trouve ça lourd python3 -m venv --prompt nom_du_projet .venv, on pourrait écrire python3 -m venv --prompt "$(basename "$PWD")", l'avantage c'est que ça traîne dans l'historique, mais je préfère encore m'en faire une fonction bash, comme ça je peux activer le venv en même temps :
Les petits $1 qui traînent c'est parce que j'ai plusieurs version de Python (3.4, 3.5, 3.6, 3.7, 3.8, 3.9, et 3.10 là), installés avec make altinstall donc je peux toucher le Python de ma Debian via python ou un Python compilé à la main via python3.x.
Demo time :
$ mkdir petitprojet
$ cd petitprojet/
$ venv
(petitprojet)(py3.9.4) $
ou
$ venv 3.6
(petitprojet)(py3.6.12) $
Pour ceux qui veulent comme moi plein plein de versions de Python, j'avoue aussi utiliser des fonctions bash pour ça. Elle est plus compliquée qu'elle pourrait : j'aime bien me compiler des beta, et j'aime bien avoir --with-pydebug mais uniquement après la 3.8, car avant la 3.8 le build de debug n'est pas compatible avec le build normal (pas pratique pour les extensions compilées).
compile_python (){localPY_VERSION="$1";localBETA="$2";localFLAGS="";if dpkg --compare-versions "$PY_VERSION" ge 3.8.0;thenFLAGS="--with-pydebug";fi;localURL="https://www.python.org/ftp/python";(cd /tmp;
wget -qO- $URL/$PY_VERSION/Python-$PY_VERSION$BETA.tgz | tar -xzf - ||(echo"Version not found, check on $URL.");[ -d Python-$PY_VERSION$BETA]&&(cd Python-$PY_VERSION$BETA;
./configure $FLAGS --prefix=$HOME/.local/ && make -j $(nproc)&& make altinstall )&& rm -r Python-$PY_VERSION$BETA)}
L'approche de correction est en fait celui des « tests » donc : vérification de sorties attendues pour des entrées données.
Oui complètement, ça ressemble parfois comme deux gouttes d'eau à des tests unitaires. Sauf qu'au lieu de sortir un AssertionError j'essaye de rédiger un message qui explique pourquoi c'est faux, de manière à ce qu'un utilisateur ne soit jamais bloqué (utopique peut être).
Si j'ai bien compris la fin de la présentation, il faut un bot pour la correction automatique de l'exercice mai je n'ai pas bien compris s'il en faut un différent par exercice ou s'ils utilisent tous le même.
J'écris un "correcteur" par exercice. Pour 72 exercices ça fait 5049 lignes de Python, soit en moyenne 70 lignes par "correcteur" (avec bien sur un peu de redondance : les imports toujours pareil, le setup de gettext, le main …). Je trouve ça plus propre et maintenable comme ça : quand je veux améliorer la correction de tel ou tel exercice, je sais rapidement où c'est (le script fetch.py me crée un dossier par exercice avec dedans : wording-fr.md, wording-en.md le texte présenté à droite, check.py le code de correction, …
D'après le gabarit de code posté, ce bot prend la saisie effectuée par l'élève et s'attend à ce que ça ne renvoie pas d'erreur en l'exécutant. Du coup, on peut mettre n'importe quel code Python pourvu que ça ne fasse pas d'erreur ?
Chaque "code de correction" prend l'approche qu'il veut, parfois j'exécute le code de l'élève avec subprocess.run(), parfois une seule fois, parfois plusieurs fois si je veux tester plusieurs paramètres. Sinon j'importe les fonctions de l'élève et je les exécute avec différents paramètres pour vérifier leur résultats. Dans le code d'exemple que j'ai mis, qui teste la bonne implémentation d'une fonction bencode par l'élève :
J'itére d'abord sur une collection de "messages à tester"
J'utilise ma fonction "de référence" bencode, pour encoder le message de test
J'exécute la fonction bencode de l'étudiant
Si nos deux résultats divergent, je lui forge une erreur. La fonction fail est celle qui print l'erreur, l'exercice sera donc considéré faux.
Dans tous les cas si quelqu'un rend une fonction de trop, innutilisée, mais que son programme fonctionne, je ne pourrai pas m'en rendre compte. Par contre s'il se met à print en trop, ça risque de déplaire au bot.
Exact, j'utilise firejail (comme ça) pour exécuter le code des étudiants avec le moins de droits possible, même pas d'accès internet. J'imagine qu'avec du talent on doit pouvoir trouver des choses à faire, mais pour le moment (et j'en suis étonné) je n'ai vu personne tenter de contourner la sandbox.
# Challenge accepté
Posté par JulienPalard . En réponse au journal Programme qui se vérifie lui-même pour voir s'il a été modifié. Évalué à 1.
Ma version, inspirée des checksums IP qui calculent leur checksum en mettant leur checksum à zéro :
# Anki
Posté par JulienPalard . En réponse au journal Comment laisser l'ordinateur faire réciter les leçons de ses enfants. Évalué à 4.
Ici on expérimente avec Anki : tables de multiplications, régions, trucs appris lors d'une visite, … tout y passe.
J'aime beaucoup le côté « il ne t'embête pas avec ce que tu sais déjà ».
J'ai testé moi-même : j'ai appris les départements (nom, numéros, préfectures, emplacement), à coup d'une séance par jour (plus des révisions si je m'ennuie pendant les transports), ça marche juste. Bon au début ça m'a fait des séances de plus de 15mn (20 nouvelles informations à apprendre par jour par défaut), mais maintenant j'y passe moins de 3mn par jour (c'est de la révision pour éviter d'oublier).
Les plus : c'est packagé Debian (et oui ça marche sur téléphone avec Mobian, l'app est tout juste suffisamment responsive pour que ce soit tout à fait utilisable).
Les moins : le package Debian est un peu vieux, mais je ne m'en rends pas trop compte. J'ai juste voulu ouvrir une issue une fois mais le bug était corrigé depuis belle lurette…
[^] # Re: Panique un peu vite?
Posté par JulienPalard . En réponse au journal RIP Gandi.net. Évalué à 4.
J'ai deux projets sponsorisés chez Gandi, j’essaye donc de suivre ça de près.
Les informations que j’ai jusque-là sont très rassurantes, pas de panique.
[^] # Re: Energie
Posté par JulienPalard . En réponse à la dépêche Programme de la PyConFR 23. Évalué à 6.
C'est seulement vrai si on oublie volontairement cython, numba, pythran, pypy, mypyc, …
Pierre Augier et al. ont fait un papier intéressant à ce sujet ici et ici.
Où on peut voir un même algorithme, implémenté en Python, tourner sur différents interpréteurs/jit/… et s'étaler très largement d'un ordre de grandeur plus performant que Java à un ordre de grandeur moins performant que Java.
TL;DR :
# Images 404
Posté par JulienPalard . En réponse à la dépêche Ecolyo pour gérer ses consommations d’eau et d’énergie. Évalué à 1.
J'ai les images qui … 404 :
Par exemple :
☹https://img.linuxfr.org/img/68747470733a2f2f636c6f75642e616e7469706f756c2e66722f732f4a7471397878576371505764396d342f70726576696577/preview
# sudo pip
Posté par JulienPalard . En réponse à la dépêche Environnement moderne de travail Python. Évalué à 6.
Je suis étonné de voir des
sudo pip
: je ne l'utilise jamais et le déconseille toujours : pour moi ça ressemble à un aimant à problèmes, ai-je raté quelque chose ?Chez moi tout ce qui est hors de mon home c'est
apt
qui s'en occupe (seul, et donc sans problèmes), etpip
se cantonne à des venv ou à~/.local/
: pas de problèmes.# Haha, cette issue me parle étrangement
Posté par JulienPalard . En réponse au journal Voter pour virer les emojis de Gitlab. Évalué à 3.
Il ne faut pas trop se plaindre, avant lorsqu’on appuyait sur
Esc
avec la sélection d’émoji ouverte, le commentaire qu’on rédigeait se fermait sans être sauvegardé : https://gitlab.com/gitlab-org/gitlab/-/issues/20262.Mais oui, votez pour moi ♥
# Attention à pytest-cov
Posté par JulienPalard . En réponse à la dépêche Python — partie 9 ― formateur de code, analyse statique. Évalué à 2.
Pour avoir utilisé les deux (
coverage -m pytest
, tout simplement, et en utilisant pytest-cov), j'ai finalement eu moins de soucis aveccoverage -m pytest
, surtout avec des tests parallèles.J'ai un exemple ici :
https://github.com/JulienPalard/oeis/blob/main/tox.ini
Où un
tox -m all
lance des tests sur 3 versions de Python en parallèle et agrège les résultat decoverage
à la fin. Faire la même chose avec pytest-cov est un enfer ☹.L'agrégation est particulièrement utile dès qu'on a quelque chose comme :
sans agréger à la fin, soit le if soit le else sera compté comme non couvert, alors qu'en agrégeant le
if
et leelse
peuvent être couverts (et atteindre le fameux 100%, ha, ha).# Le message de kline
Posté par JulienPalard . En réponse au journal Multiple démissions dans l'équipe du réseau IRC Freenode. Évalué à 5.
https://www.kline.sh/
# Nommer ses venv, c'est bien
Posté par JulienPalard . En réponse à la dépêche Python — partie 7 — Environnements virtuels. Évalué à 3. Dernière modification le 08 mai 2021 à 09:54.
Le souci de
python3 -m venv .venv
c'est qu'il crée un venv qui s'appelle.venv
, donc le prompt ressemble à(.venv) mdk@seraph:/tmp
.Ça se personalise avec
--prompt
mais je trouve ça lourdpython3 -m venv --prompt nom_du_projet .venv
, on pourrait écrirepython3 -m venv --prompt "$(basename "$PWD")"
, l'avantage c'est que ça traîne dans l'historique, mais je préfère encore m'en faire une fonction bash, comme ça je peux activer le venv en même temps :Les petits
$1
qui traînent c'est parce que j'ai plusieurs version de Python (3.4, 3.5, 3.6, 3.7, 3.8, 3.9, et 3.10 là), installés avecmake altinstall
donc je peux toucher le Python de ma Debian viapython
ou un Python compilé à la main viapython3.x
.Demo time :
ou
Pour ceux qui veulent comme moi plein plein de versions de Python, j'avoue aussi utiliser des fonctions bash pour ça. Elle est plus compliquée qu'elle pourrait : j'aime bien me compiler des beta, et j'aime bien avoir
--with-pydebug
mais uniquement après la 3.8, car avant la 3.8 le build de debug n'est pas compatible avec le build normal (pas pratique pour les extensions compilées).et tant qu'a faire :
# Exercices Python
Posté par JulienPalard . En réponse à la dépêche Librecours propose une initiation à la programmation informatique. Évalué à 1.
Côté exercices Python n'hésitez pas à squatter d'une manière ou d'une autre https://hackinscience.org.
(Je l'avais présenté ici : https://linuxfr.org/news/hackinscience-automatiser-l-enseignement-de-python)
[^] # Re: précisions sur le(s) bot(s)
Posté par JulienPalard . En réponse à la dépêche HackInScience : automatiser l'enseignement de Python. Évalué à 3.
Oui complètement, ça ressemble parfois comme deux gouttes d'eau à des tests unitaires. Sauf qu'au lieu de sortir un
AssertionError
j'essaye de rédiger un message qui explique pourquoi c'est faux, de manière à ce qu'un utilisateur ne soit jamais bloqué (utopique peut être).[^] # Re: précisions sur le(s) bot(s)
Posté par JulienPalard . En réponse à la dépêche HackInScience : automatiser l'enseignement de Python. Évalué à 1.
J'écris un "correcteur" par exercice. Pour 72 exercices ça fait 5049 lignes de Python, soit en moyenne 70 lignes par "correcteur" (avec bien sur un peu de redondance : les imports toujours pareil, le setup de gettext, le main …). Je trouve ça plus propre et maintenable comme ça : quand je veux améliorer la correction de tel ou tel exercice, je sais rapidement où c'est (le script
fetch.py
me crée un dossier par exercice avec dedans :wording-fr.md, wording-en.md
le texte présenté à droite,check.py
le code de correction, …Chaque "code de correction" prend l'approche qu'il veut, parfois j'exécute le code de l'élève avec
subprocess.run()
, parfois une seule fois, parfois plusieurs fois si je veux tester plusieurs paramètres. Sinon j'importe les fonctions de l'élève et je les exécute avec différents paramètres pour vérifier leur résultats. Dans le code d'exemple que j'ai mis, qui teste la bonne implémentation d'une fonctionbencode
par l'élève :bencode
, pour encoder le message de testbencode
de l'étudiantfail
est celle quiprint
l'erreur, l'exercice sera donc considéré faux.Dans tous les cas si quelqu'un rend une fonction de trop, innutilisée, mais que son programme fonctionne, je ne pourrai pas m'en rendre compte. Par contre s'il se met à print en trop, ça risque de déplaire au bot.
[^] # Re: Sécurité ?
Posté par JulienPalard . En réponse à la dépêche HackInScience : automatiser l'enseignement de Python. Évalué à 3.
Exact, j'utilise firejail (comme ça) pour exécuter le code des étudiants avec le moins de droits possible, même pas d'accès internet. J'imagine qu'avec du talent on doit pouvoir trouver des choses à faire, mais pour le moment (et j'en suis étonné) je n'ai vu personne tenter de contourner la sandbox.