Mot-clé - Blog note

Fil des entrées - Fil des commentaires

vendredi 9 janvier 2026

Compter les lignes d'un projet git

Ceci est un blog-note, il serait donc dommage de ne pas en profiter pour... Prendre des notes !

J'ai récemment voulu voir où j'en étais quant à la quantité de code produite pour un projet. Simple curiosité, pour me rendre compte.
Comment faire ? Comme ceci :

git ls-file | xargs wc-l

Bien sûr, si vous voulez plus de détail, comme le nombre de lignes des fichiers php, vous pouvez rajouter un grep.

git ls-file | grep '.php' | xargs wc -l

C'est tout.

Edit du 17 janvier 2026 : On me souffle dans l'oreillette que Tokei fait aussi très bien le boulot ! Merci à Ollivier Robert pour la découverte.

jeudi 5 juin 2025

Comprendre les RegExp - Exemple d'un feed BlueSky

Les RegExp ont tendance à faire peur à toute personne qui n'est pas familiarisée avec celles-ci. Pourtant, lorsqu'on connaît quelques points précis, on peut déjà aller assez loin.
Ainsi, sans avoir la prétention de couvrir tout l'usage des expressions régulières (loin s'en faut), je pense que celle qui illustre ce billet est une bonne entrée en matière.

Celle-ci est celle qui construit le feed TND(FR) que je décris dans ce billet. Prenons un peu de temps pour la décortiquer.

L'expression est donc la suivante :

(^|\s|\b|#)(ritaline|concerta|tda(h)?|tsa|autisme|
autistique(s)?|bipolaire(s)?|autiste(s)?|tnd
neurodéveloppement(aux)?|synesthésie|méthylphénidate|
hyperactivité|hyperacti(f|ve)(s)?|asperger|trouble de l'attention|
trouble déficit de l'attention)($|\s|\b)

Note : Elle diffère en effet de celle de l'illustration, puisque je me suis rendu compte d'erreurs et l'ai corrigée.

On peut ici la séparer en trois éléments distincts, chacun entre parenthèses (pour prioriser et regrouper, comme en mathématiques). Le premier est (^|\s|\b|#). Il correspond au début de l'expression recherchée, et contient plusieurs éléments intéressants.

  • ^ indique qu'il s'agit d'un début de ligne
  • \s indique un espace ou une tabulation
  • \b indique la position de début ou de fin de mot
  • # n'est ici que le caractère # lui-même, utilisé pour les hashtags sur la plupart des réseaux sociaux (coucou Threads)
  • | est quant à lui un simple OU qui sépare deux éléments

Ce bloc peut donc être lu comme : Un début de ligne OU un espace ou une tabulation OU un début ou une fin de mot OU le caractère #. Et c'est exactement ce que nous recherchons. Nous voulons que l'expression qui sera détectée commence (étant donné que c'est le premier bloc) par un début de ligne OU un espace ou une tabulation OU un début ou une fin de mot OU le caractère #.
Ceci empêche par exemple de chercher le mot vent sans variation, et d'avoir en retour éventuel qui contient bien vent mais n'est pas l'expression souhaitée, puisqu'il ne commence pas par vent.

Le second bloc est le plus long : (ritaline|concerta|tda(h)?|tsa|autisme|autistique(s)?|bipolaire(s)?|autiste(s)?|tnd|neurodéveloppement(aux)?|synesthésie|méthylphénidate|hyperactivité|hyperacti(f|ve)(s)?|asperger|trouble de l'attention|trouble déficit de l'attention)

On définit ici l'ensemble des termes que nous voulons sélectionner avec notre expression régulière, tous séparés par un | qui veut dire OU. Nous voulons donc retenir les termes ritaline OU concerta OU autisme OU tsa, etc.
Une spécificité ici est que certains mots sont regroupés en quelques caractères. Par exemple, pour regrouper à la fois hyperactif, hyperactive, hyperactifs et hyperactives, j'ai utilisé hyperacti(f|ve)(s)?. Attardons-nous là-dessus. Nous avons ici, à nouveau, trois bloc :

  • hyperacti est le début du mot que nous cherchons, juste après les critères du premier bloc vu plus haut
  • (f|ve) indique qu'après le début du mot, nous voulons le masculin (f) OU le féminin (ve)
  • (s)? permet d'inclure le pluriel - ici le s- tout en le rendant facultatif, ce que permet le point d'interrogation

Ainsi, nous devons avoir un mot qui commence par hyperacti, suivi du masculin f ou ve. Ces points sont obligatoires. Nous pouvons aussi avoir le pluriel s à la fin, mais le mot sera retenu même s'il ne contient pas le s, et ce grâce au ?.

Enfin, le dernier bloc est à l'image du premier, et indique ce que nous devons rencontrer à la fin de notre expression recherché : ($|\s|\b)

  • $ indique une fin de ligne
  • \s indique un espace ou une tabulation
  • \b indique un début ou une fin de mot

Là encore, directement après les termes que nous voulons rechercher, nous devons avoir une fin de ligne OU un espace ou une tabulation OU un début ou une fin de mot. Pour reprendre le même exemple que pour le premier bloc, ceci empêche que soit retenu venteux alors que nous ne voulons que le mot vent.

Voilà, j'espère qu'avec ce court billet vous aurez de quoi construire quelques petites expressions régulières, et pourquoi pas construire un feed BlueSky ;) Moi je les construis avec SkyFeed

Pour une liste plus exhaustive des différents opérateurs d'expressions régulières, je ne peux que vous renvoyer à la page wikipedia correspondante.

lundi 27 mai 2024

Une seconde vie pour le vieux MacBook Air

Comme toute machine vieillissante, mon MacBook Air début 2015 est devenu inutilisable au fil du temps.

Le matériel fonctionne pourtant correctement et comme toujours j'ai du mal à me dire qu'il faut que je le jette. J'ai donc décidé d'essayer de lui donner une seconde vie avec une distribution Linux (Manjaro ici) et un environnement léger, i3wm.

Regardons comment faire.


On récupère l’image iso depuis le site voulu :

$ cd ~/Downloads
$ wget https://download.manjaro.org/i3/23.0.1/manjaro-i3-23.0.1-230921-linux65.iso

On liste les disques présents pour identifier la clé usb concernée, ainsi que son identifiant :

$ diskutil list
/dev/disk0 (internal, physical):
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:      GUID_partition_scheme                        *500.3 GB   disk0
   1:             Apple_APFS_ISC Container disk1         524.3 MB   disk0s1
   2:                 Apple_APFS Container disk3         494.4 GB   disk0s2
   3:        Apple_APFS_Recovery Container disk2         5.4 GB     disk0s3

/dev/disk3 (synthesized):
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:      APFS Container Scheme -                      +494.4 GB   disk3
                                 Physical Store disk0s2
   1:                APFS Volume Macintosh HD            13.5 GB    disk3s1
   2:              APFS Snapshot com.apple.os.update-... 13.5 GB    disk3s1s1
   3:                APFS Volume Preboot                 12.3 GB    disk3s2
   4:                APFS Volume Recovery                1.9 GB     disk3s3
   5:                APFS Volume Data                    405.8 GB   disk3s5
   6:                APFS Volume VM                      4.3 GB     disk3s6

/dev/disk5 (external, physical):
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:                                                   *8.0 GB     disk5

Une fois identifiée, on efface la clé usb. Dans mon cas, il s'agit de disk5.

$ diskutil secureErase 1 disk5
Started erase on disk5
Finished erase on disk5

L'option secureErase permet, comme son nom l'indique, d'effacer le disque en utilisant une méthode sécurisée avec un niveau qui peut être défini. Ici, 1 signifie qu'il y aura une passe unique d'écriture de données aléatoires.

On crée ensuite l'image au format .dmg qui ira sur la clé USB :

$ hdiutil convert ~/Downloads/manjaro-i3-23.0.1-230921-linux65.iso -format UDRW -o ~/Downloads/manjaro-i3
Lecture de Master Boot Record (MBR : 0)…
Lecture de MANJARO_I3_2301                  (Apple_ISO : 1)…
.....................................................................................................................................
Lecture de  (Type EF : 2)…
.....................................................................................................................................
Temps écoulé :  3.926s
Vitesse : 870.3 Mo/s
Compression : 0.0%
created: /Users/xakan/Downloads/manjaro-i3.dmg

Notez que l'extension de l'image de sortie n'est pas définie dans le nom du fichier à générer.

Dans notre cas, UDRW signifie qu'on veut une image UDIF avec la possibilité de lire/écrire. UDIF signifiant Apple Mac OS X Universal Disk Image Format.

On démonte ensuite la clé :

$ diskutil unmountDisk /dev/disk5
Unmount of all volumes on disk5 was successful

Enfin, on copie le .dmg sur la clé avec la commande dd.

$ sudo dd if=/Users/xakan/Downloads/manjaro-i3.dmg of=/dev/disk5 bs=1m
Password:
3416+1 records in
3416+1 records out
3582824448 bytes transferred in 970.109954 secs (3693215 bytes/sec)

Alors oui, l'écriture a été très longue, mais c'est pas le sujet, la clé est très vieille !

Maintenant, on redémarre en restant appuyé sur Alt et le tour est joué.

samedi 2 mars 2024

Se réapprendre : les schémas

Voilà un peu plus ou un peu moins de deux ans que le diagnostic a été officiellement posé. Deux ans, c’est long, et ce n’est rien en même temps. Suffisamment pour commencer à s’écouter et se comprendre mais pas assez pour vraiment savoir s’adapter.

Deux ans de diagnostic, de thérapie et de travail au quotidien me permettent désormais de comprendre différents schémas, sans pour autant réussir à mettre des actions en face.

Voilà quelques temps que les migraines sont davantage présentes. Elles sont fortes, elles sont longues, mais elles apparaissent surtout souvent à la suite des mêmes événements. Intéressant.

La période est plutôt compliquée avec beaucoup d’interrogations et des décisions à prendre. Le moral est en baisse. Je finis les journées sur les rotules et je subis tous les stimuli sensoriels. Le moindre geste des filles peut déclencher des douleurs intenses si elles ont le malheur de m’effleurer, sans un contact franc et appuyé. C’est un premier point très difficile à gérer. Elles n’y sont pour rien si je dysfonctionne ainsi, et elles sont encore petites pour vraiment comprendre ce qu’il se passe. Et puis avouons-le, ce n’est pas chouette pour elles de voir leur papa se raidir et crier, parfois de douleur, lorsqu’elles ont le malheur de m’effleurer. Elles ne font rien de mal, et pourtant c’est d’une violence difficile à croire. Y compris pour moi.

De ces éléments découle une gestion sensorielle difficile. Je suis toujours à la limite de l’explosion. Mais je fais au mieux, même si le résultat n’est pas satisfaisant. Le quotidien de papa, le télétravail et la vie en milieu très rural font que j’ai aussi besoin de voir du monde, d’avoir une vie sociale. Mais ça rajoute une charge et une fatigue que je ne peux pas vraiment me permettre. Alors je serre les dents, je prends le meilleur de ces moments. Mais quand je rentre chez moi après avoir pris mon shoot de vie sociale, que l’animal grégaire est rassasié, que je me retrouve seul à « décharger » de ce que je viens de vivre, le corps relâche et manifeste son mécontentement.

Ainsi, un des schémas qui semble se dégager pourrait être résumé par : Sociabilisation = surcharge sensorielle = migraine. C’est très simplifié, mais l’idée est bien là.

Voilà, faire quelque chose qui devrait nous faire du bien en rajoute, et fait souffrir aussi en contrepartie. Le schéma se répète, et je le comprends désormais, mais je n’ai pas de solution satisfaisante à mette en face. Je dois réussir à définir ce que m’apportent ces interactions sociales par rapport à ce qu’elles me coûtent. Le calcul est complexe.

Deux ans, ce n’est pas assez pour aller vraiment mieux. Patience.

lundi 28 août 2023

Désinstaller Node.js sur MacOS

Pour un projet personnel, j'ai dû installer Node.js. Mais j'ai eu la mauvaise idée de l'installer à partir du fichier .pkg fourni sur le site de Node.js.


Ce fichier .pkg ne propose aucune option de désinstallation, et l'application de se retrouve pas dans le dossier Applications qui permet de procéder à une désinstallation par glisser/déposer dans la corbeille.

Ainsi, j'ai dû creuser un peu pour pouvoir désinstaller correctement Node.js et npm. Voici les étapes à suivre :

$ sudo npm uninstall npm -g
$ sudo rm -rf /usr/local/lib/node /usr/local/lib/node_modules /var/db/receipts/org.nodejs.*
$ sudo rm -rf /usr/local/include/node /Users/$USER/.npm
$ sudo rm /usr/local/bin/node
$ sudo rm /usr/local/share/man/man1/node.1
$ sudo rm /usr/local/lib/dtrace/node.d

Ceci permet ensuite de l'installer avec Homebrew, le gestionnaire de paquets pour MacOS que je déteste :

$ brew install node