all repos — blog @ a762312db9744da3c53b2c5366b7cc2606d4a309

Code and content for 5ika.ch

content/posts/petits-outils-persos.md (view raw)

  1---
  2Title: Petits outils persos
  3Date: 2026-03-27
  4---
  5
  6En passant sur Arch Linux il y a quelques mois, j'ai voulu aller plus loin en terme d'efficacité sur mon ordi en poussant plus en profondeur mes connaissances de la ligne de commande et en développant mes propres petits outils pour réaliser les tâches courantes. J'ai aujourd'hui un petit panel de programmes qui peuvent être intéressants à d'autres.
  7
  8Ces programmes sont généralement fait en Bash car cela évite d'avoir des choses à compiler et assure un fonctionnement sur quasiment tous les systèmes, notamment les serveurs distants sur lesquels je me connecte. La plupart utilise les outils suivants:
  9- [gum](https://github.com/charmbracelet/gum): un outil pour développer des scripts plus intéractifs et plus jolis facilement
 10- [jq](https://jqlang.org/): un outil pour manipuler du JSON, très pratique et bien connu
 11- [ripgrep](https://github.com/BurntSushi/ripgrep): un `grep` amélioré, plus moderne
 12- [glow](https://github.com/charmbracelet/glow): Un *render* de markdown dans le terminal
 13
 14J'essaye aussi d'utiliser un maximum les choses déjà présentes dans Bash et je passe beaucoupp de temps à lire les docs pour voir s'il n'y a pas une sous-sous-option qui permet de faire ce que je veux sans trop d'effort. C'est aussi l'occasion de pratiquer l'édition de code/script dans le terminal directement. J'ai d'abord utilisé vim, puis neovim pour finalement passer à [helix](https://helix-editor.com/) récemment.
 15
 16Voilà une liste de mes outils les plus utiles:
 17
 18### `brain`
 19
 20Ouvre mon dossier de notes (*second brain*) avec mon éditeur par défaut.
 21
 22```bash
 23#!/bin/bash
 24
 25BRAIN_DIR=${BRAIN_DIR:-"$HOME/5ika/brain/"}
 26cd $BRAIN_DIR
 27$EDITOR .
 28```
 29
 30### `bt` (brain tasks)
 31
 32Liste mes tâches à faire dans mon dossier de note (*second brain*).
 33
 34```bash
 35#!/bin/bash
 36
 37BRAIN_DIR=${BRAIN_DIR:-"$HOME/5ika/brain/"}
 38rg "\- \[ \]" $BRAIN_DIR
 39```
 40
 41### `jrnl` (journal)
 42
 43Dans le dossier *journals* de mon second brain, crée à partir d'un template (ou ouvre si existant) un fichier Markdown nommé selon la date du jour.
 44Cela me permet une prise de note rapide, contextualisé par jour.
 45
 46```bash
 47#!/bin/bash
 48
 49BRAIN_DIR=${BRAIN_DIR:-"$HOME/5ika/brain/"}
 50TEMPLATE_FILEPATH="$BRAIN_DIR/templates/jrnl.md"
 51TODAY_DATE=$(date -I)
 52TODAY_FILEPATH="${BRAIN_DIR}journals/${TODAY_DATE}.md"
 53
 54if [ ! -f "$TODAY_FILEPATH" ]; then
 55  cp "$TEMPLATE_FILEPATH" "$TODAY_FILEPATH"
 56  sed -i s/%DATE%/$TODAY_DATE/g "$TODAY_FILEPATH"
 57  echo "Nouvelle entrée créée pour le ${TODAY_DATE}"
 58
 59  if [ -f "$BRAIN_DIR/CURRENT.md" ]; then
 60    echo -e "## Projets en cours\n" >>$TODAY_FILEPATH
 61    cat "$BRAIN_DIR/CURRENT.md" >>$TODAY_FILEPATH
 62    echo -e "\n" >>$TODAY_FILEPATH
 63  fi
 64fi
 65
 66$EDITOR "$TODAY_FILEPATH"
 67```
 68
 69### `scratch`
 70
 71Crée un fichier Markdown temporaire et l'ouvre avec mon éditeur par défaut.
 72Cela me permet de prendre rapidement des notes quand je suis en réunion sans avoir à me soucier où les stocker.
 73
 74```bash
 75#!/usr/bin/env bash
 76
 77file="$(mktemp --suffix=.md)"
 78echo "Editing $file"
 79exec "$EDITOR" "$file"
 80```
 81
 82### `music`
 83
 84Utilise [rmpc](https://rmpc.mierak.dev/) afin de communiquer avec le serveur MPD sur mon système pour créer et lancer une playlist aléatoire de chansons sur mon ordi:
 85
 86```bash
 87#!/bin/bash
 88
 89rmpc clear
 90rmpc addrandom song 50
 91rmpc consume on
 92rmpc play
 93```
 94
 95### `radio`
 96
 97Inspiré par une découverte sur le Web (que je n'ai pas noté), me permet de choisir parmi une liste de radios et d'en lancer une avec `cvlc`.
 98
 99```bash
100#!/bin/bash
101
102ITEMS=(
103  "lofi lofi@https://live.hunter.fm/lofi_low"
104  "musicforprogrammer MusicForProgrammer@https://datashat.net/music_for_programming_76-material_object.mp3"
105  "vertical Vertical@https://verticalradio.ice.infomaniak.ch/verticalradio-128.mp3"
106  "serenity Paradise Serenity@https://stream.radioparadise.com/serenity?ngsw-bypass=true"
107  "rock Paradise RockIt@http://stream.radioparadise.com/rock-192"
108  "mellow Paradise Mellow@http://stream.radioparadise.com/mellow-192"
109  "global Paradise Globalized@http://stream.radioparadise.com/global-192"
110  "paradise Paradise Main@http://stream.radioparadise.com/ogg-192m"
111)
112
113if [ ! -x "$(command -v gum)" ]; then
114  echo "gum needs to be installed. See https://github.com/charmbracelet/gum."
115  exit 1
116fi
117
118SELECTED_PATH=$(gum choose --label-delimiter=" " "${ITEMS[@]}")
119readarray -d "@" -t PARTS <<<"$SELECTED_PATH"
120
121LABEL=${PARTS[0]}
122URL=${PARTS[1]}
123
124cvlc --meta-artist="Radio" --meta-title="$LABEL" $URL
125```
126
127> J'ai également une alternative à ce script, `radiosonos`, qui me permet de lancer sur mes enceintes Sonos plutôt qu'avec VLC.
128
129### `bookmarks`
130
131> Celui-ci, je l'ai récupéré et adapté à partir de ce dépôt: https://github.com/soulim/bookmarks.txt.
132
133Un script qui permet de lister ou ajouter un bookmark dans un fichier texte simple. Un gestionnaire de marque-pages minimalistes.
134
135```bash
136#!/usr/bin/env sh
137
138# bookmarks [URL] [title]
139#
140# bookmarks prints content of conventional `bookmarks.txt` files.
141# See https://github.com/soulim/bookmarks.txt
142#
143# Usage:
144#
145#   # Print content of `bookmarks.txt` files stored in $HOME and $PWD.
146#   bookmarks
147#
148#   # Add a new URL to `bookmarks.txt` file in $PWD.
149#   bookmarks https://www.example.com
150
151set -o errexit # Always exit on errors.
152set -o nounset # Treat unset variables as errors.
153
154url=${1:-}
155title=${2:-}
156
157if [ -n "$url" ]; then
158  echo "$url $title" >>bookmarks.txt
159else
160  inbrain="$HOME/5ika/brain/bookmarks.txt"
161  cat "$inbrain" 2>/dev/null | fzf | cut -d ' ' -f 1 | xargs xdg-open
162fi
163```
164
165### `swall`
166
167Utilise `hyprctl` (fonctionne donc uniquement avec [Hyprland](https://hypr.land/)) pour changer le fond d'écran avec une image aléatoire prise dans le dossier *Images/wallpapers*.
168Ce script est lancé automatiquement au démarrage de mon ordi afin d'avoir un fond différent d'un jour à l'autre.
169
170```bash
171#!/bin/bash
172
173WALLPAPER_DIRECTORY=~/Images/wallpapers/
174WALLPAPER=$(find "$WALLPAPER_DIRECTORY" -type f | shuf -n 1)
175hyprctl hyprpaper preload "$WALLPAPER"
176hyprctl hyprpaper wallpaper "eDP-1,$WALLPAPER"
177sleep 1
178hyprctl hyprpaper unload unused
179```
180
181`eDP-1` correspond à l'ID de mon écran principal. Pour lister les IDs disponibles: `hyprctl monitors`.
182
183### `tbore`
184
185Utilise [bore](https://github.com/ekzhang/bore) pour créer un tunnel entre mon serveur VPS et mon ordi.
186Cela me permet d'utiliser mon serveur public comme proxy pour qu'un serveur sur mon ordi puisse être accessible depuis le Web.
187C'est très utile pour développer un programme qui a besoin de recevoir des webhooks depuis un service tiers par exemple.
188
189```bash
190#!/bin/bash
191
192hyprctl dispatch exec kitty -- ssh -t ubuntu@5ika.ch scripts/bore server
193sleep 3
194bore local ${1:-5173} --to proxy.5ika.ch -p 6666
195```
196
197Ce script est assez dépendant de mon setup (Hyprland, kitty) et nécessite que *bore* soit installé sur le serveur distant également. Je le mets à titre d'exemple pour inspirer.
198
199---
200
201Cette liste montre uniquement les outils qui me semblent utiles à d'autres et/ou qui peuvent être facilement adapter sur d'autres systèmes.
202J'ai également d'autres scripts plus spécifiques, trop gros ou trop bruts pour être montrés ici.
203Par exemple:
204- Un script qui ouvre plusieurs terminaux avec différents programmes TUI pour surveiller des activités (mails, activités sur GitLab, agenda de la journée, notes du jour,...)
205- Un sous-script `git` pour créer des commit messages qui respectent le standard *conventional commit*
206- Un raccourci pour me connecter à mon réseau VPN Wireguard
207- Un script qui utilise `logcli` et `jq` pour afficher les logs de différentes apps dans le même terminal
208
209J'en discute volontiers si ça intéresse.