Vue normale

Reçu aujourd’hui — 13 octobre 2025

Spotlight on pdfly, the Swiss Army knife for PDF files

13 octobre 2025 à 08:31

pdfly logo

Project documentation: pdfly.readthedocs.io

pdfly is the youngest project of the py-pdf organization. It has been created by Martin Thoma in 2022.

It's simply a CLI tool to manipulate PDF files, written in Python and based on the fpdf2 & pypdf libraries.

I'm a maintainer of the project 🙂

What can it do & what's next?

Find out by reading the full article


Permalink

pdoc - La documentation Python sans documentation

Par :Korben
13 octobre 2025 à 07:27

Vous avez déjà passé plus de temps à configurer Sphinx qu’à coder votre projet Python ? Bienvenue au club !

Et oui, paradoxalement, parfois documenter son code devient plus compliqué que d’écrire le code… Vous voulez juste afficher vos docstrings joliment, mais avant ça il faut vous taper 200 pages de doc, choisir parmi 47 thèmes, configurer des dizaines d’extensions et comprendre la syntaxe reStructuredText. Breeeef, la flemme !

Heureusement, il existe une alternative qui va vous réconcilier avec la documentation : pdoc.

pdoc, c’est un outil de documentation Python qui ne nécessite pas de documentation. Vous tapez simple pdoc votre_module et c’est tout. Pas de fichier de config interminable, pas de choix existentiels entre différents builders, pas de migration depuis votre version de Sphinx de 2018 qui refuse de compiler.

Ça génère directement une belle doc à partir de votre code existant !!

Si vous avez déjà écrit des docstrings propres et utilisé les type annotations de Python, vous avez déjà fait 100% du boulot car pdoc se contente de prendre ce qui existe et de l’afficher élégamment. Pas de traduction, pas de réécriture, pas de fichiers .rst à maintenir en parallèle de votre code.

Votre code EST la documentation et ça c’est beau !

L’outil comprend les docstrings au format numpydoc et Google-style, fait des liens automatiques entre les identifiants, respecte votre variable __all__ et génère du HTML standalone que vous pouvez héberger n’importe où. Il y a même un serveur web intégré avec live reload pour développer votre doc en temps réel.

Pour mettre ça en place, faut installer pdoc avec

pip install pdoc

Puis vous lancez

pdoc ./votre_projet.py

ou

pdoc nom_de_votre_module

Et c’est tout !

Bien sûr si vous bossez sur un gros projet avec des besoins spécifiques, des guides utilisateurs complexes, des dizaines de pages de tutoriels et une doc multilingue, Sphinx reste le roi, mais pour la grande majorité des projets Python, ceux qui ont juste besoin d’une doc API claire et lisible, pdoc fait ça comme un chef, sans que vous ayez besoin d’un doctorat en outil de documentation.

Bref, si vous en avez marre de passer plus de temps sur votre documentation que sur votre code, pdoc mérite le détour car documenter son code devrait être aussi simple que de le coder, non ?

Pour tester pdoc, direction pdoc.dev ou directement le repo GitHub .

Reçu avant avant-hier

Axelrod-Python/Axelrod: A research tool for the Iterated Prisoner's Dilemma

11 octobre 2025 à 08:29

Une bibliothèque Python avec les principes et objectifs suivants :

  • Permettre la reproduction aussi simple que possible des recherches précédentes sur le dilemme du prisonnier itératif.
  • Créer l'outil de facto pour les futures recherches sur le dilemme du prisonnier itératif.
  • Fournir un moyen aussi simple que possible pour que tout le monde puisse définir et contribuer à de nouvelles stratégies originales pour le dilemme du prisonnier itératif.
    -Mettre l'accent sur la lisibilité ainsi que sur une communauté ouverte et accueillante qui s'adapte aux développeurs et aux chercheurs de différents niveaux de compétence.

Permalien

Le marathon caritatif féministe Et ta cause, c’est ce week-end, voici le programme

10 octobre 2025 à 12:12

Depuis déjà 2021, le marathon caritatif Et ta cause récolte des fonds pour des associations féministes et inclusives. Alors que la nouvelle édition se tiendra du 10 au 12 octobre, sur Twitch, nous faisons le point sur le programme de cette année.

Le marathon féministe Et ta cause, c’est ce week-end : voici le programme

10 octobre 2025 à 12:11

Depuis déjà 2021, le marathon caritatif Et ta cause récolte des fonds pour des associations féministes et inclusives. Alors que la nouvelle édition se tiendra du 10 au 12 octobre, sur Twitch, nous faisons le point sur le programme de cette année.

Apparition de ROMFS dans MicroPython

Bonjour à tous,

ROMFS: une nouvelle fonctionnalité fait son apparition dans MicroPython. 


ROMFS qui est en développement depuis plusieurs années permet de stocker 

  • des utilitaires (scripts pré-compilé), 
  • des fichiers de données (fonts)
  • des programmes pre-compilés 
Au sein même d'une partition dans la Mémoire Flash (sous forme d'un système de fichiers en lecture seule).  

Le but de ROMFS est d'optimiser l'accès et la rapidité d'exécution de ressources  SANS DEVOIR RECOMPILER MicroPython à chaque fois. 

Jusqu'à maintenant, seule l'inclusion -au sein du firmware- de scripts pré-compilés avec mpy-cross permettait d'atteindre les performances nécessaires à l'exécution de code "time sensitive".

Certes, mpy-cross permet de compiler un script en byte-code (des fichiers .mpy) mais l'accès reste encore conditionné par le système de fichiers pour le chargement (ou chargements multiples). Les fichiers .mpy, bien que pré-compilé, nécessite malgré tout des vérifications de routine et du chargement d'information en RAM.

Avec ROMFS, une partition dans la mémoire Flash permet d'être accédée directement par la VirtualMachine MicroPython. Les ressources sont directement accessibles par le noyaux MicroPython qui peut aussi lancer l'exécution directement en Flash (In-Place execution)... et cela en s'évitant la lourdeur du système de fichiers, les phases de compilations et allocations de RAM. Les routines de vérifications sont elles aussi réduites au stricte nécessaire puisque celles-ci sont opérées majoritairement au moment de l'assemblage/compilation de la ROMFS.

Implémentation restreinte

Au moment de l'écriture de ces ligne (MicroPython v1.25), ROMFS n'est disponible nativement que sur certaines plateformes: PYBD-SFx (Pyboard D), ALIF-Ports, ESP8266_Generic, STM32 boards.

Sinon, il est possible de compiler le firmware en activant la flash_romfs (voir FLASH_2M_ROMFS).

Utilitaire mpremote

L'utilitaire MPRemote de MicroPython a également le nouveau mot clé romfs avec les options:

  • query: pour consulter la romfs dans la flash.
  • build: pour créer une image romfs sur l'ordinateur
  • deploy: pour déployer l'image sur la romfs dans la mémoire flash du microcontroleur.

A noter que la compilation/build d'une image romfs require l'utilitaire mpy-cross .

romfs query

La capture suivante indique le contenu de la romfs sur le microcontroleur.

mpremote romfs query


Comme l'indique le réponse de l'utilitaire, la partition n'est pas encore initialisée. La partition fait 131 Kio (32 blocks de 4 Kio chacun).

romfs build

Prenons l'exemple d'un répertoire "utilities" qui contient les sources. Celui-ci ne contient qu'un script nommé "scan_i2c.py".

L'image de la partition romfs est créé avec la commande suivante:

mpremote romfs -o utilities.img build utilities

Le nom de l'image à créer est spécifié par le paramètre '-o'.
Le contenu du répertoire à compiler est précisé après le paramètre 'build'.

romfs deploy

Une fois l'image prête sur l'ordinateur, l'option deploy permet de copier celle-ci sur le microcontroleur.

mpremote romfs deploy utilities.img


Une fois l'image déployée, il est possible de vérifier une nouvelle fois l'état de la ROMFS avec romfs query . Cette fois, la partition est initialisée.

Exploiter la ROMFS

Une fois romfs initialisé, il est très facile d'utiliser son contenu.
Utiliser Thonny IDE permet d'inspecter le système de fichiers MicroPython. 

La partition romfs est montée dans le système de fichiers MicroPython sous le répertoire 'rom'.
Il est donc possible d'en inspecter le contenu.

Comme le démontre le shell interactif, il est possible de charger et d'exécuter le contenu de scan_i2c.py (compilé en .mpy) en executant un simple "import" sous Python.

ROMFS est un système de fichiers

L'appel de mount() sans paramètre affiche les systèmes de fichiers déjà monté dans MicroPython.

Ainsi les lignes suivantes indique la présence de romfs:

>>> import vfs
>>> print( vfs.mount() )
[ VfsRom('rom'), VfsFat('/flash') ]
>>> 

Toutes les fonctions de manipulation de fichiers sont donc utilisable sur le système de fichiers ROMFS.

Ressources

 

Mises à jour passionnantes sur Marathon : Raisons d’optimisme quant à son retour

6 octobre 2025 à 22:48

Bungie est prêt à raviver l’excitation autour de son jeu d’extraction, Marathon, avec un nouveau test technique fermé prévu pour la fin octobre. Après un retard initial, cette phase de test proposera une gamme de gameplay plus large, permettant à un plus grand nombre de joueurs de découvrir les améliorations apportées depuis la version alpha […]

Le post Mises à jour passionnantes sur Marathon : Raisons d’optimisme quant à son retour est apparu en premier sur Moyens I/O.

Sortie de Crème CRM en version 2.7

6 octobre 2025 à 11:55

Le 2 septembre 2025 est sortie la version 2.7 du logiciel de gestion de la relation client Crème CRM (sous licence AGPL-3.0), un peu plus d’un an après Creme 2.6 (5 août 2024).

Icone de Crème CRM

Au programme notamment, le passage à Django 5.2, les types de fiches personnalisés et un système de processus automatisés. Les nouveautés sont détaillées dans la suite de la dépêche.

Sommaire

Description du logiciel

Crème CRM est un logiciel de gestion de la relation client, généralement appelé CRM (pour Customer Relationship Management). Il dispose évidemment des fonctionnalités basiques d’un tel logiciel :

  • un annuaire, dans lequel on enregistre contacts et sociétés : il peut s’agir de clients, bien sûr, mais aussi de partenaires, prospects, fournisseurs, adhérents, etc. ;
  • un calendrier pour gérer ses rendez‐vous, appels téléphoniques, conférences, etc. ; chaque utilisateur peut avoir plusieurs calendriers, publics ou privés ;
  • les opportunités d’affaires, gérant tout l’historique des ventes ;
  • les actions commerciales, avec leurs objectifs à remplir ;
  • les documents (fichiers) et les classeurs.

Crème CRM dispose en outre de nombreux modules optionnels le rendant très polyvalent :

  • campagnes de courriels ;
  • devis, bons de commande, factures et avoirs ;
  • tickets, génération des rapports et graphiques…

L’objectif de Crème CRM est de fournir un logiciel libre de gestion de la relation client pouvant convenir à la plupart des besoins, simples ou complexes. À cet effet, il propose quelques concepts puissants qui se combinent entre eux (entités, relations, filtres, vues, propriétés, blocs), et il est très configurable (bien des problèmes pouvant se résoudre par l’interface de configuration) ; la contrepartie est qu’il faudra sûrement passer quelques minutes dans l’interface de configuration graphique pour avoir quelque chose qui vous convienne vraiment (la configuration par défaut ne pouvant être optimale pour tout le monde). De plus, afin de satisfaire les besoins les plus particuliers, son code est conçu pour être facilement étendu, tel un cadriciel (framework).

Du côté de la technique, Crème CRM est codé notamment avec Python/Django et fonctionne avec les bases de données MySQL, SQLite et PostgreSQL.

Principales nouveautés de la version 2.7

Voici les changements les plus notables de cette version :

Le passage à Django 5.2

La nouvelle version LTS (Long Time Support, car maintenue pendant 3 ans) du cadriciel Web est sortie en avril 2025.

Pour les personnes qui déploient Creme, cela implique de nouvelles versions minimales :

  • La version minimale de Python est maintenant la 3.10
  • Pour les systèmes de gestion de base de données (SGBD) les versions minimales sont SQLite 3.31, MySQL 8.0.11, PostgreSQL 14 & MariaDB 10.5.

Python 3.13 est désormais géré officiellement.

Les types de fiches personnalisés

Il a bien sûr toujours été possible de créer ses propres types de fiches (entités) via du code (c’est même plutôt simple, notamment grâce aux outils que fournis Django).
Mais ici il s’agit de créer des types de manière visuelle, via l’interface de configuration. Pour créer un nouveau type il suffit de lui donner un nom (genre “Boutique”), ainsi que son nom au pluriel (donc “Boutiques” dans notre exemple). Ensuite des champs personnalisés peuvent être ajoutés, comme pour n’importe quel type de fiche. Et évidemment vous pouvez utiliser derrière tous les outils de configuration classiques pour construire l’interface qui vous convient (blocs, boutons, formulaires, menu…).

Techniquement, les tables correspondant aux types sont en fait toutes créés dès l’installation (mais seuls les types activés sont visibles) ce qui permet de fonctionner sereinement même sur les SGBD ne gérant pas les transactions de schéma. C’est pourquoi le nombre de types personnalisés est limité (à 20 en l’occurrence, cela devrait être largement suffisant en pratique).

Ce nouveau système était attendu depuis longtemps, et devrait encore un peu abaisser la barrière d’entrée en permettant d’éviter d’écrire du code dans pas mal de cas.

Création d’un nouveau type de fiche

Les processus automatisés

Ce nouveau système permet de programmer des actions qui seront effectuées de manière automatique lorsque certains évènements se produisent. Pour mieux comprendre les possibilités offertes, voici un processus créé lors de l’installation de Creme 2.7 : lorsqu’une fiche Opportunité d’affaire est modifiée et que son nouveau statut est un statut considéré comme gagné, alors la société cible de l’Opportunité devient cliente (si elle ne l’était pas déjà évidemment).

Dans cette première version, les évènements qui peuvent déclencher un processus sont :

  • une fiche est créée
  • une fiche est modifiée
  • une propriété (il s’agit d’une sorte de tag) est ajoutée à une fiche
  • une relation est ajoutée entre 2 fiches

Les actions actuellement disponibles sont :

  • ajouter une propriété
  • ajouter une relation
  • envoyer un courriel

Cette version initiale nous a demandé pas mal de travail afin de trouver une conception satisfaisante, mais de nombreuses améliorations sont d’ores et déjà prévues (notamment les évènements temporels & une action qui peut modifier une fiche).

Les processus automatisés étaient, à l’instar des types personnalisés, très attendus ; et combiner ces 2 nouveaux systèmes ouvre pas mal de perspectives.

Un processus automatisé créé par un utilisateur pour les Activités

La version plus détaillée est ici

Quelques autres améliorations notables

  • La génération des numéros des Factures/Devis/Bons de commande a été entièrement revue. Elle se configure maintenant depuis l’interface (là où avant on pouvait juste rentrer des préfixes dans le fichier de configuration) et offre de nombreuses options.
  • La configuration des boutons peut désormais se faire par rôle (comme c’était déjà le cas avec les blocs, formulaires, etc.).
  • Les vues de liste & les filtres peuvent être clonés (afin de gagner du temps, plutôt que de partir de zéro).
  • Le calendrier a été mis-à-jour (version 6.1.18 de la bibliothèque JavaScript FullCalendar), et un nouveau bloc permet d’afficher son calendrier sur la page d’accueil.
  • Pas mal de code de suppression a été amélioré, que ça soit pour empêcher plus souvent la suppression à cause de dépendances (plutôt que supprimer des choses en cascade), ou pour mieux afficher lesdites dépendances bloquantes.

Le futur

La prochaine version devrait être plus courte que la 2.7 (qui a été un peu plus grosse que prévu à la base), afin de mieux coller aux sorties de Django. À l’année prochaine !

Commentaires : voir le flux Atom ouvrir dans le navigateur

Python - « Libre à vous ! » du 23 septembre 2025 - Podcasts et références

255e émission « Libre à vous ! » de l’April. Podcast et programme :

  • sujet principal : le langage de programmation Python
  • La chronique Le truc que (presque) personne n'a vraiment compris mais qui nous concerne toutes et tous de Benjamin Bellamy sur les VPNs
  • Une nouvelle Lecture buissonnière de Vincent Calame sur l'ouvrage d'Éric Sadin, « La vie algorithmique »
  • Quoi de Libre ? Actualités et annonces concernant l'April et le monde du Libre

Rendez‐vous en direct chaque mardi de 15 h 30 à 17 h sur 93,1 FM en Île‐de‐France. L’émission est diffusée simultanément sur le site Web de la radio Cause Commune.

Commentaires : voir le flux Atom ouvrir dans le navigateur

Lue - Lisez vos ebooks en audio dans le terminal

Par :Korben
24 septembre 2025 à 13:17

Pour en avoir testé quelques uns, je trouve que les lecteurs de livres audio, c’est jamais très pratique à utiliser. Heureusement, je viens de découvrir Lue , un lecteur d’e󠄳󠅕󠄐󠅤󠅕󠅨󠅤󠅕󠄐󠅕󠅣󠅤󠄐󠅣󠅟󠅥󠅣󠄐󠅓󠅟󠅠󠅩󠅢󠅙󠅗󠅘󠅤󠄐󠅔󠅕󠄐󠄻󠅟󠅢󠅒󠅕󠅞󠄞󠅙󠅞󠅖󠅟books qui lit vos livres à voix haute directement dans le terminal.

Bah oui, moi j’adore mon terminal.. Pas besoin de cliquer, pas d’interface laggy, pas de pub ni d’abonnement premium… On lance juste une commande et hop, la lecture du livre se lance. C’est ça que j’aime, quand la tech me fout la paix et fonctionne bien !

Le truc cool avec Lue, c’est que l’outil utilise Edge TTS de Microsoft par défaut. Oui, Microsoft qui fait un truc bien et gratuit, c’est foufou, mais en gros, ça permet de récupérer les voix ultra réalistes utilisées dans Edge sans payer un centime et sans même avoir Windows. Après si vous êtes un parano de la vie privée, vous pouvez aussi utiliser Kokoro TTS qui tournera à 100% en local sur votre machine.

Pour installer Lue, il vous faut d’abord FFmpeg, espeak et Antiword. Sous Mac c’est donc brew install ffmpeg espeak antiword``, et sous Linux sudo apt install ffmpeg espeak antiword, et sous Windows… bah vous allez sur le site de FFmpeg, espeak et antiword et vous galérez un peu comme d’hab.

Et après, c’est tout simple :

pip install git+https://github.com/superstarryeyes/lue.git

Et voilà, vous êtes prêts à transformer votre terminal en studio d’enregistrement de livres audio. Pour lancer la lecture d’un bouquin, c’est aussi simple que :

lue votre-livre.epub

Perso, j’aime beaucoup la synchronisation mot par mot que permet l’outil… Car pendant que la voix lit, le texte se surligne en temps réel dans le terminal. C’est hypnotisant, on dirait un karaoké pour rats de bibliothèques. Après vous pouvez mettre en pause avec p, ajuster la vitesse de lecture, naviguer dans les phrases avec j et k. C’est comme vim mais pour les oreilles.

Alors je sais que le TTS c’est pas toujours foufou, mais je vous invite à en tester plusieurs pour trouver celle qui vous plait le plus. Moi ma préférée, c’est fr-CH-ArianeNeural qui est hyper propre et assez classe. Vous pouvez lancer une lecture avec la voix comme ceci :

lue --voice "fr-CH-ArianeNeural" livre.epub

Voici la liste complète des voix disponibles que vous pouvez utiliser :

  • fr-BE-CharlineNeural (Female) - Belgique
  • fr-BE-GerardNeural (Male) - Belgique
  • fr-CA-AntoineNeural (Male) - Canada
  • fr-CA-JeanNeural (Male) - Canada
  • fr-CA-SylvieNeural (Female) - Canada
  • fr-FR-DeniseNeural (Female) - France
  • fr-FR-EloiseNeural (Female) - France
  • fr-FR-HenriNeural (Male) - France
  • fr-CH-ArianeNeural (Female) - Suisse
  • fr-CH-FabriceNeural (Male) - Suisse

Et Lue lit vraiment tout : EPUB, PDF, TXT, DOCX, HTML, RTF, et même le Markdown. La lecture PDF c’est particulièrement bien foutue parce qu’il retire automatiquement les numéros de page et les en-têtes qui pourrissent toujours la lecture audio.

Voilà, Lue c’est un coup de cœur car on commence vraiment à s’habituer à des services IA avec des technologies de synthèse vocale qui rivalisent avec des vrais humains, mais c’est souvent caché derrière des APIs payantes et des interfaces merdique. Et là arrive un développeur qui dit “non mais attendez, c’est quoi ce bordel ?? Je vais vous faire un truc simple qui marche”.

Et hop !

La progression de lecture est même sauvegardée automatiquement. Vous fermez votre terminal en plein milieu du chapitre 12, vous relancez le lendemain, et hop, ça reprend pile où vous en étiez. Très cool, hein ?

Bref, si vous êtes du genre à préférer la ligne de commande aux interfaces clinquantes, ou si vous voulez juste écouter vos ebooks sans vous prendre la tête, allez tester Lue dispo sur GitHub .

Source

PyConFR 2025, planning et inscriptions

24 septembre 2025 à 06:57

La PyConFR 2025 a lieu du jeudi 30 octobre au dimanche 2 novembre au Campus René Cassin à Lyon. Le planning est en ligne et les inscriptions sont ouvertes !

Comme toujours, l’évènement est gratuit et l’inscription est obligatoire.

Les deux premiers jours de la conférence seront occupés par les sprints. Et les deux jours suivants seront dédiés aux conférences (longues et courtes) et ateliers.

Trois keynotes sont au programme :

  • Embracing Weird Code, d’Ivana Kellyer
  • Le rêve de tout enfant - devenir DBA ?, de Karen Jex
  • Être un·e allié·e du numérique pour tou·te·s en environnement hostile, de Morgane Rozenn Hauguel

Un atelier de programmation pour les enfants (à partir d’environ 7 ans) a lieu le samedi après-midi.

Un espace enfants (de 3 ans à 12 ans) est aussi mis à disposition le samedi et dimanche gratuitement et sur inscription.

Un déjeuner PyLadies a également lieu durant la conférence. Un des objectifs est de tisser des liens entre la communauté PyLadies et le reste de la communauté Python francophone.

En plus du traditionnel repas du samedi soir, des visites guidées de Lyon sont aussi possibles les jeudi et vendredi soir, toujours sur inscription.

Enfin, le dimanche matin, l’AFPy tient son assemblée générale. Si vous souhaitez y voter, assurez-vous d’être à jour de cotisation.

Commentaires : voir le flux Atom ouvrir dans le navigateur

Incident du 26 août 2025 ayant touché les serveurs de production et de développement

Il y a exactement deux mois, un incident était survenu suite à un redémarrage brutal du serveur hébergeant les conteneurs de production et de développement ayant entraîné une attribution inattendue d’adresses IP. Et des réponses techniques 502 Bad Gateway pour notre lectorat.

Ce 26 août, vers 15:22, un message peu engageant est arrivé par pneumatique sur nos téléscripteurs (via Signal pour être précis) : « Tiens c’est bizarre j’ai perdu accès au site. Et au serveur oups. » L’après-midi et la soirée furent longues.

Sommaire

Premier diagnostic

Le serveur répond au ping et permet les connexions TCP port 22, mais pas le SSH. Et les services web ne répondent plus. Souci matériel ? Noyau en vrac ? Attaque en cours ? Les spéculations vont bon train.

La connexion au serveur revient par intermittence, permettant à un moment d’exécuter quelques commandes, à d’autres d’attendre longuement pour l’affichage d’un caractère ou l’exécution de la commande tapée.

Le premier contact réétabli avec le serveur est assez clair (une forte charge) :

$ uptime
15:06:59 up 2 days,  2:54,  1 user,  load average: 50,00, 205,21, 260,83

(dernier redémarrage le week-end précédent, mais surtout une charge système moyenne respectivement de 50, 205 et 261 sur les 1, 5 et 15 dernières minutes)

Initialement on suppose qu’il s’agit d’un trop grand nombre de requêtes ou de certaines requêtes tentant des injections de code sur le site (bref le trafic de fond plutôt habituel et permanent), et on ajoute des règles de filtrage péniblement et lentement pour bloquer les IP qui ressortent le plus dans nos logs.

Le site est alors inaccessible pendant plusieurs périodes. On arrête et relance ensuite plusieurs fois les services en pensant avoir ajouté suffisamment de filtrage, mais rapidement le serveur se retrouve englué. Les services sont alors arrêtés plus longuement le temps d’analyser les logs au calme. Au calme inclut notamment ne pas juste disposer d’une connexion ssh depuis un smartphone, mais plutôt d’un clavier et d’un grand écran par exemple, de l’accès à tous les secrets et toute la documentation aussi.

Finalement le trafic n’est pas énorme (en volume total) et si les requêtes hostiles sont bien présentes, rien ne semble inhabituel. Par contre les processus de coloration syntaxique partent en vrille, consommant chacun un processeur et aspirant allègrement la mémoire disponible. Avant d’être éliminés par le noyau Linux.

La console est remplie d’élimination de processus de ce type :

Le plein d’OutOfMemory

Mais si rien n’a changé niveau logiciel sur le conteneur LXC de production et si les requêtes ne sont pas inhabituelles, qu’est-ce qui peut bien écrouler le serveur et créer ces processus gourmands ?

Eh bien des requêtes habituelles…

Pendant les phases d’attente lorsque le serveur ne répondait plus vraiment, nous avons noté qu'une nouvelle entrée de suivi a été créée (merci BAud et merci RSS/Atom pour nous avoir permis de la voir alors que le serveur ne répondait déjà plus). Elle indique que la coloration syntaxique ne marche plus sur le site. Notamment l’exemple donné dans la documentation.

Pourtant le rendu fonctionne en testant en ligne de commande avec pygmentize.

Mais oui en testant l’exemple donné via le site, il est créé un processus Python2 pygment qui commence à se gaver de ressources.

Et en regardant les différents contenus et commentaires créés sur le site autour de l’incident, en filtrant sur ceux contenant des blocs avec de la coloration syntaxique, la dépêche (alors en préparation) sur G'MIC 3.6 apparaît. Et en testant cette dépêche, il est bien créé quatre processus Python2 pygment qui se gavent de ressources et ne semblent jamais vouloir se terminer. À rapprocher par exemple d’une page qui a été servie en 6785.9978s.

4 processus gourmands

OK, le souci vient de requêtes tout à fait habituelles de coloration syntaxique, reste à comprendre pourquoi ces processus tournent mal.

La boucle sans fin

Un petit strace pour suivre les appels système en cours sur un des processus infernaux relève une boucle assez violente :

(...)
close(623199355)                        = -1 EBADF (Bad file descriptor)
close(623199356)                        = -1 EBADF (Bad file descriptor)
close(623199357)                        = -1 EBADF (Bad file descriptor)
(...)

Il semble y avoir une immense itération sur des descripteurs de fichiers, en vue de les fermer, mais à l’aveugle, sans savoir s’ils existent réellement.

En regardant le code du composant utilisé (pygments), il semble n'y avoir qu'un seul appel à close() :

# close fd's inherited from the ruby parent
        import resource
        maxfd = resource.getrlimit(resource.RLIMIT_NOFILE)[1]
        if maxfd == resource.RLIM_INFINITY:
            maxfd = 65536

        for fd in range(3, maxfd):
            try:
                os.close(fd)
            except:
                pass

Donc on itère sur tous les descripteurs entre 3 et le maximum déterminé…

>>> import resource
>>> print(resource.getrlimit(resource.RLIMIT_NOFILE)[1])
524288
>>> print(resource.RLIM_INFINITY)
-1

Un demi-million de fois ici donc. L’objectif initial de la boucle est de fermer les descripteurs de fichiers provenant du processus Ruby père, issue du fork via Open3.popen3. La version suivante du composant la remplace d’ailleurs par un ajout de l'option :close_others, qui précisément « modifie l’héritage [des descripteurs de fichiers du processus parent] en fermant les non-standards (numéros 3 et plus grands) ».

Sur une Debian 12, la limite du nombre de fichiers par défaut, c’est 1 048 576. C’est déjà probablement bien plus que la valeur qui prévalait à l’époque où a été écrit la boucle Python (on avait des limitations à 4096 à une époque reculée). Mais il s’avère que durant le week-end l’hôte du conteneur de production a été migré en Debian 13. Sans modification du conteneur de production pensions-nous. Sans modification directe du conteneur de production. Mais quid d’une modification indirecte ? Par exemple si la limite par défaut des « Max open files » était passée à 1 073 741 816 sur l’hôte, soit 1024 fois plus que quelques jours auparavant. Et donc des boucles nettement plus longues voire sans fin, sans libération de mémoire.

On ne peut mettre à jour le composant pygments dans l’immédiat, mais on peut limiter les dégâts en abaissant la limite du nombre de descripteurs de fichiers à quelque chose de raisonnable (i.e. on va gaspiller raisonnablement des cycles CPU dans une boucle un peu inutile mais brève…). Une édition de /etc/security/limits.conf, un redémarrage du conteneur de production et on peut vérifier que cela va nettement mieux avec cette réparation de fortune.

Une dernière page d’epub ?

Le conteneur LXC portant le service epub de production a assez mal pris la surcharge du serveur, et vers 20h08, systemd-networkd sifflera la fin de la récré avec un eth0: The interface entered the failed state frequently, refusing to reconfigure it automatically (quelque chose comme « ça n’arrête pas d’échouer, débrouillez-vous sans moi »). Le service epub est resté en carafe jusqu’au 27 août vers 13h31 (merci pour l’entrée de suivi).

Voir ce commentaire sur la dépêche de l’incident précédent expliquant la séparation du service epub et du conteneur principal de production (en bref : dette technique et migration en cours).

Retour en graphiques sur la journée

Le serveur était très occupé. Au point de n’avoir pas le temps de mettre à jour les graphiques de temps en temps.

Rétrospectivement les processeurs du serveur ont travaillé dur : 140 de charge sur le graphique (mais avec des pics jusque 260 d’après la commande uptime), contre moins de 5 en temps normal (un petit facteur de 28 à 52   ô_Ô)

Charge CPU

Et l’utilisation de la mémoire montre aussi de brutaux changements de comportement : libération intempestive de mémoire (Free, en vert), utilisation mémoire plus importante que d’habitude (Used, en jaune), là où le comportement normal est d’avoir le maximum en cache (Cached, en orange) et des processus tellement peu consommateurs en RAM que cela n’apparaît normalement pas.

Utilisation mémoire

Mesures préventives et correctives

Dans les actions en cours ou à prévoir :

  • mettre à jour la documentation pour disposer facilement et rapidement des informations pour les connexions aux cartes d’administration ou les procédures de blocages d’IP
  • procéder à la montée de version des composants (yapuka, épineux sujet de la dette technique à éponger)
  • vérifier l’efficacité des limitations CPU/mémoire mises sur certains conteneurs LXC et les étendre aux autres
  • mettre des limites sur des processus particuliers (comme ceux de pygments)
  • ajouter le déploiement des limites par utilisateur dans le code Ansible
  • corriger la collecte rrd des métriques concernant les interfaces réseau
  • remonter les alertes OOM qui ne sont pas normales
  • comprendre la surconsommation mémoire ? (les boucles actives expliquent la consommation processeur, mais pour la mémoire ?)

Bonus inattendu pour l’incident précédent du 26 juin 2025

De façon cocasse, ce nouvel incident et le temps passé à parcourir les différents logs ont permis de retrouver les infos de la carte d’administration distante et d’expliciter l’origine du redémarrage serveur intempestif. À quelque chose malheur est bon, si on peut dire. Ceci n’est pas une invitation pour un prochain incident.

Commentaires : voir le flux Atom ouvrir dans le navigateur

Note: Utiliser python dans un Virtual Env

19 août 2025 à 08:16

Créer / Utiliser python3 avec venv, afin de ne pas pourrir votre système par l'ajout de packages pip

# Création des répertoires et scripts
python3 -m venv ./project
# Activation pour votre shell
. ./project/bin/activate
# Désactivation pour votre shell
deactivate

Vous pouvez désormais utiliser pip, les packages seront localisés dans votre projet.

Utiliser requirements.txt pour faciliter l'instalation des packages

# Setup du fichier normalisé requirements.txt
pip freeze > requirements.txt
# Installation des packets
pip install -r requirements.txt

Note: Sous debian, il vous faudra le packet python3-venv

Il existe d'autres outils similaires pyenv et pyenv:

# Avec virtualenv:
python3 -m virtualenv ./venv
. ./venvbin/activate
deactivate
# Avec pyenv
# Il s'agit d'une gestion plus avancée vous permettant de basculer entre versions de python
# Voir https://github.com/pyenv/pyenv?tab=readme-ov-file

Permalink

ConFoo Montreal 2026: L'appel aux conférenciers est ouvert

La conférence ConFoo est de retour pour sa 24 e édition, du 25 au 27 février 2026 à l’Hôtel Bonaventure de Montréal! Que vous soyez un développeur junior ou un CTO, venez découvrir pourquoi ConFoo est devenu l’un des événements phares pour les professionnels en hautes technologies.

Nous sommes présentement à la recherche d’experts d’expérience souhaitant joindre notre équipe de conférenciers pour l’édition 2026! De PHP à JavaScript, en passant par tous les enjeux liés à la sécurité et au développement de l’IA, ConFoo couvre chaque année l’ensemble des sujets qui font bouger l’industrie.

Offertes en français ou en anglais, nos présentations sont généralement d’un format de 45 minutes, incluant un 10 minutes de questions des participants. Nos conférenciers invités profitent aussi d’un traitement privilégié; comprenant la couverture de leurs frais de déplacement et d’hébergement, en plus de l’accès à l’expérience complète de l’événement (présentations, repas, etc.).

Vous avez jusqu’au 21 septembre prochain pour soumettre votre projet de présentation!

Vous cherchez simplement à vous inscrire? Profitez dès maintenant d’un rabais de 300$ en réservant votre place d’ici le 17 octobre!

Faites partie de l’aventure avec nous et découvrez comment l’intelligence humaine est en train de façonner le milieu des hautes technologies!

Commentaires : voir le flux Atom ouvrir dans le navigateur

Cansat v2 : Raspberry-Pi Pico et MicroPython

Bonjour à tous,

Nombre d'entre-vous savent que nous sommes impliqué dans le projet CanSat (voir précédents articles sur le sujet CanSat). 

Nous poursuivons les travaux sur Kit CANSAT version 2, l'occasion de faire le point.
Pour rappel, notre kit utilise un Raspberry-Pi Pico et du code Python sur microcontrôleur (MicroPython).


Documentation Open-Source disponible sur le Wiki de MCHobby.

A propos de CanSat

CanSat est un concours visant a stimuler l'apprentissage des sciences dans le domaine de l'AéroSpatial en réalisant un mini-satellite (la CanSat) pas plus grande qu'une boîte de Soda. Ce satellite est envoyé et éjecté à 3000m d'altitude à l'aide d'une roquette. C'est à partir de ce moment que votre projet capture les données et les envois au sol.

Si vous voulez en apprendre plus sur le concours CanSat, je vous invite à visiter la page d'accueil CANSAT sur EseroBelgium.be .

Cansat V2 : le point

100% compatible avec la version précédente (câblage code), nous avons terminé le premier round de test du prototype Alpha. Les correctifs nécessaires sont apportés et aux cartes et le prototype Beta arrive prochainement.

Outre les aspects mécaniques déjà abordés au précédent article, nous allons pouvoir nous attarder sur les caractéristiques électroniques.

Je vous présente Cansat-Pico V2

Cansat Pico V2 (source: MCHobby Wiki)

 
Cansat Pico V2 (source: MCHobby Wiki)
Note: connecteur d'antenne manquant.

Et le visite ne serait pas complète sans inspecter le dessous de la carte.

Cansat Pico V2 (source: MCHobby Wiki)

Quelques détails croustillants

Comme annoncé, nous avons cherché à faciliter les connexions en utilisant des connectiques populaires (Qwiic/StemmaQt et Groove).

LA sérigraphie reprend également de nombreuses informations pour permettre

Cansat Pico V2 (source: MCHobby Wiki)
Note: le connecteur d'antenne est manquant sur la photo

Cansat Pico V2 (source: MCHobby Wiki)

Les autres cartes permettant de créer une CANSAT complete sont également prêtes...

Cansat Pico V2 (Lettuce, Onion et Bun)

Pour l'instant, nous consacrons les efforts sur:

Bonne lecture,
Dominique

❌