New instance, so posting a new intro! blobheartcat

I've made it to my 40-something years old era and consider it a privilege.

I'm into slow fashion, human rights, crafting, cats, music, and cult horror and sci-fi movies. My latest obsession is with snails.

A few more of my interests:
#knitting #crochet#python#SlowFashion #folklore #snail #cats #sewing #candles #CozyGames #privacy #nature #introduction#NewHere

🧠💻 A team from the Mind, Brain and Behavior Research Center (CIMCYC, cimcyc.bsky.social) published a #programming guide aimed at students in #psychology and #cognitive #neuroscience. This evolving set of #tutorials offers a curated collection of conceptual reflections, practical examples, and methodological recommendations. The material is available in #Python, #RStats, and #MATLAB.

🌍 https://wobc.github.io/programming_book/
#CognitiveScience #OpenScience

🧠💻 A team from the Mind, Brain and Behavior Research Center (CIMCYC, cimcyc.bsky.social) published a #programming guide aimed at students in #psychology and #cognitive #neuroscience. This evolving set of #tutorials offers a curated collection of conceptual reflections, practical examples, and methodological recommendations. The material is available in #Python, #RStats, and #MATLAB.

🌍 https://wobc.github.io/programming_book/
#CognitiveScience #OpenScience

Bonjour Bignole !

De part mon activité d’administrateur systèmes, je dois régulièrement me connecter en SSH à de nombreuses machines. 216 d’après mon fichier .ssh/config, mais y a des alias et des machines virtuelles de développement dans le tas. Mais je dépasse largement les 150 machines.

J’ai longtemps — depuis que je l’ai découvert, il y a des années — utilisé concierge (écrit en Python) pour gérer ma configuration SSH. Un de ses grands avantages est le support de moteurs de templates, ce qui me permet de faire des boucles du genre :

{% for host in ('foo', 'bar') %}Host {{ host }} HostName {{ host }}.domain.tld User luc{% endfor %}

Le problème de concierge est qu’il n’est plus maintenu depuis plusieurs années, ce qui complique son installation sur des systèmes récents. Entre les dépendances pas bien fixées qui installent une version incompatibles de leurs dépendances à elles et certaines fonctionnalités de la bibliothèque standard qui ont migré dans des modules non listés en tant que dépendances… ça foirait à chaque installation.

Ma solution : forker concierge pour créer Bignole ! (une bignole est un terme d’argot pour… concierge 😁)

Le code est sur https://framagit.org/fiat-tux/bignole.

Au programme du fork :

  • mise à jour des dépendances
  • intégration directe des moteurs de templates sous forme de dépendances optionnelles au lieu de proposer des paquets distincts comme le fait concierge
  • suppression du support de libnotify qui n’a jamais fonctionné chez moi : je voulais avoir rapidement un outil fonctionnel, pas passer des jours à débuguer
  • suite de tests automatisés via Gitlab CI (parce que la CI, c’est mon dada, j’adore ça)
  • modernisation des outils de publication : exit les setup.py et setup.cfg, bonjour pyproject.toml (bon, j’avoue, c’est parce que j’utilise ça dans Argos Panoptès et je sais pas faire autrement 😅)

Pour installer Bignole, avec jinja2 par exemple, c’est simple comme bonjour :

pip install 'bignole[jinja]'

Et si vous utilisez uv (et vous devriez car c’est fort pratique) :

uv tool install 'bignole[jinja]'

Après l’installation, vous aurez deux utilitaires : bignole et bignole-check (celui-ci ne servant qu’à vous indiquer si votre fichier contient une syntaxe correcte).

En faisant bignole --systemd, vous aurez des instructions pour créer un service systemd qui surveillera votre fichier de configuration (~/.bignolerc par défaut) et re-générera automatiquement votre .ssh/config au moindre changement.

Pour le reste de l’utilisation, je vous laisse lire le README sur https://pypi.org/project/bignole/ 🙂

PS : oui, je connais le système des Tag dans la config SSH (j’en utilise), mais une boucle reste pratique même en les utilisant. Par exemple :

{% for host in ('foo', 'bar') %}Host {{ host }} HostName {{ host }}.domain.tld Tag perso{% endfor %}

#Dev #Python #Ssh

Bonjour Bignole !

De part mon activité d’administrateur systèmes, je dois régulièrement me connecter en SSH à de nombreuses machines. 216 d’après mon fichier .ssh/config, mais y a des alias et des machines virtuelles de développement dans le tas. Mais je dépasse largement les 150 machines.

J’ai longtemps — depuis que je l’ai découvert, il y a des années — utilisé concierge (écrit en Python) pour gérer ma configuration SSH. Un de ses grands avantages est le support de moteurs de templates, ce qui me permet de faire des boucles du genre :

{% for host in ('foo', 'bar') %}Host {{ host }} HostName {{ host }}.domain.tld User luc{% endfor %}

Le problème de concierge est qu’il n’est plus maintenu depuis plusieurs années, ce qui complique son installation sur des systèmes récents. Entre les dépendances pas bien fixées qui installent une version incompatibles de leurs dépendances à elles et certaines fonctionnalités de la bibliothèque standard qui ont migré dans des modules non listés en tant que dépendances… ça foirait à chaque installation.

Ma solution : forker concierge pour créer Bignole ! (une bignole est un terme d’argot pour… concierge 😁)

Le code est sur https://framagit.org/fiat-tux/bignole.

Au programme du fork :

  • mise à jour des dépendances
  • intégration directe des moteurs de templates sous forme de dépendances optionnelles au lieu de proposer des paquets distincts comme le fait concierge
  • suppression du support de libnotify qui n’a jamais fonctionné chez moi : je voulais avoir rapidement un outil fonctionnel, pas passer des jours à débuguer
  • suite de tests automatisés via Gitlab CI (parce que la CI, c’est mon dada, j’adore ça)
  • modernisation des outils de publication : exit les setup.py et setup.cfg, bonjour pyproject.toml (bon, j’avoue, c’est parce que j’utilise ça dans Argos Panoptès et je sais pas faire autrement 😅)

Pour installer Bignole, avec jinja2 par exemple, c’est simple comme bonjour :

pip install 'bignole[jinja]'

Et si vous utilisez uv (et vous devriez car c’est fort pratique) :

uv tool install 'bignole[jinja]'

Après l’installation, vous aurez deux utilitaires : bignole et bignole-check (celui-ci ne servant qu’à vous indiquer si votre fichier contient une syntaxe correcte).

En faisant bignole --systemd, vous aurez des instructions pour créer un service systemd qui surveillera votre fichier de configuration (~/.bignolerc par défaut) et re-générera automatiquement votre .ssh/config au moindre changement.

Pour le reste de l’utilisation, je vous laisse lire le README sur https://pypi.org/project/bignole/ 🙂

PS : oui, je connais le système des Tag dans la config SSH (j’en utilise), mais une boucle reste pratique même en les utilisant. Par exemple :

{% for host in ('foo', 'bar') %}Host {{ host }} HostName {{ host }}.domain.tld Tag perso{% endfor %}

#Dev #Python #Ssh

Yesterday, for reasons best left unstated, I invented a technique for combining #bash and #Python into a single file.

The motivation was to have something a bit more powerful than the #! to decide which installed Python to use.

The magic is in line two:

#!/bin/bash
""""true"
# bash sees this, python ignores it
if [ -e /path/to/file ]; then
exec python3 "$0" "$@"
else
echo "OMG, something is missing"
exit 1
fi
"""
# begin python fun!
from thing import python_stuff
python_stuff()

@HerraBRE I have decided to call this technique "the shebonk".

Because it's link a shebang, only weird!

I've added shebonk support to my forked zipapp.py, will be using to build even more portable pagekite.py bundles than before!

I wonder if this hurts my chances of getting my enhanced #zipapp merged back into upstream #CPython? :-P

#python #bash #hacks

Yesterday, for reasons best left unstated, I invented a technique for combining #bash and #Python into a single file.

The motivation was to have something a bit more powerful than the #! to decide which installed Python to use.

The magic is in line two:

#!/bin/bash
""""true"
# bash sees this, python ignores it
if [ -e /path/to/file ]; then
exec python3 "$0" "$@"
else
echo "OMG, something is missing"
exit 1
fi
"""
# begin python fun!
from thing import python_stuff
python_stuff()