Le site arthur.bebou.netlib.re - retour accueil
git clone git://bebou.netlib.re/arthur.bebou
Log | Files | Refs |
commit 86275b2465a729940391c78cee0dc7b510f1b217 parent 682d4500a466401f925f6bd3d469b98c94e90945 Auterice: Arthur Pons <arthur.pons@unistra.fr> Date: Tue, 11 Jun 2024 17:27:31 +0200 Finalement sup-sonore Bug connus : Le calcul du temps de lecture est cassé quand on ferme et ouvre des sections Les details mettent de l'html dans la sortie <- ce souci peut être corrigé, voir ce que j'ai fait sur le site des techdays 15 Diffstat:
M | contents/services-sobres/index.sh | | | 15 | ++++++++------- |
M | contents/sup-sonore/index.sh | | | 192 | ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++------- |
2 files changed, 184 insertions(+), 23 deletions(-)
diff --git a/contents/services-sobres/index.sh b/contents/services-sobres/index.sh @@ -232,13 +232,14 @@ Ce qui donnera côté client $ nc bebou.netlib.re 1234 Ils prirent les armes -Ah, ça ne fonctionne pas. En effet sed, comme pleins d'autres commandes, ne -traite pas les lignes une à une mais en stocke quelques une avant de les faire -passer à la moulinette. Il constitue un "buffer", on dit parfois en franglais -qu'il "buffer" son entrée. Pour résoudre ce problème deux solutions. Soit -l'outil intègre une option pour ne pas bufferiser (`--unbuffered` pour GNU sed) -soit on utilise la commande `stdbuf` qui dira à la commande qui lui est passée -en argument qu'il ne faut rien bufferiser : +Ah, ça ne fonctionne pas. En effet sed, comme pleins d'autres commandes pour +des raisons de performance, ne traite pas les lignes une à une mais en stocke +quelques une avant de les faire passer à la moulinette. Il constitue un +"buffer", on dit parfois en franglais qu'il "buffer" son entrée. Pour résoudre +ce problème deux solutions. Soit l'outil intègre une option pour ne pas +bufferiser (`--unbuffered` pour GNU sed) soit on utilise la commande `stdbuf` +qui dira à la commande qui lui est passée en argument qu'il ne faut rien +bufferiser : $ cat /tmp/f | stdbuf -o0 sed 's/armes/fleurs/g' | nc -l 127.0.0.1 1234& > /tmp/f $ nc bebou.netlib.re 1234 diff --git a/contents/sup-sonore/index.sh b/contents/sup-sonore/index.sh @@ -6,6 +6,8 @@ publication: 2024-06-11 sectionmd: main +Cet article n'a pas encore été relu, un peu d'indulgence svp :) + ## But et outillage Une fois n'est pas coutume, faisons quelque qui n'implique pas *que* du texte. @@ -13,9 +15,9 @@ Quelque chose d'un peu plus fun. De la supervision de serveurs web avec du son. Cette expérimentation n'a pas vocation à se substituer à ce que serait de la supervision plus sérieuse. Elle a pour but : - * d'être un moyen ludique de garder un œil (ou une oreille huhu) sur l'activité des sites du serveur - * de favoriser les -interactions avec les utilisateur·ices + * d'être un moyen ludique de garder un œil (ou une oreille huhu) sur + l'activité des sites du serveur + * de favoriser les interactions avec les utilisateur·ices * d'être un outil pédagogique autour du web * apprendre quelques trucs au sujet du son sur linux @@ -71,9 +73,15 @@ internet : ffplay -f lavfi -i "sine=frequency=440:duration=1" -> ffplay est un lecteur audio/vidéo qui utilise ffmpeg sous le capot. Cette -> commande a les mêmes arguments que si l'on avait voulu enregistrer l'audio -> généré dans un fichier avec ffmpeg plutôt que de directement le lire. +endsection + +<<. ./details "ffplay ?" | save_html main +ffplay est un lecteur audio/vidéo qui utilise ffmpeg sous le capot. Cette +commande a les mêmes arguments que si l'on avait voulu enregistrer l'audio +généré dans un fichier avec ffmpeg plutôt que de directement le lire. +. + +sectionmd: main Cette commande utilise de device `lavfi` et prend un entrée des commandes comprises par lavfi qui ici génèrent une fréquence de 440Hz pendant une seconde. @@ -82,21 +90,173 @@ Ici `sine` est un "filtre" documenté particulier puisque contrairement à la plupart des filtres il n'a pas pour objet de modifier une source mais d'un créer une. Il n'a donc pas d'entrée. -> Au passage je joue avec d'autres filtres et du bruit marron avec un sample -> rate très bas donne un côté "bruit qui vient du tréfond des océans assez -> flippant et lovecraftien[^2]. Essayez -> -> $ ffplay -f lavfi -i "anoisesrc=c=brown:r=1000:a=1" -> -> Le visuel généré par ffplay donne une dimension encore plus angoissante. +endsection + +<<. ./details "du bruit lovecraftien horrifique avec anoisesrc" | save_html main + +Au passage je joue avec d'autres filtres et du bruit marron avec un sample +rate très bas donne un côté "bruit qui vient du tréfond des océans assez +flippant et lovecraftien. Essayez + + $ ffplay -f lavfi -i "anoisesrc=c=brown:r=1000:a=1" + +Le visuel généré par ffplay donne une dimension encore plus angoissante. +Le saviez vous ? Lovecraft [était très raciste et antisémite](https://fr.wikipedia.org/wiki/H._P._Lovecraft#Race,_ethnie_et_classe) + +. + +sectionmd: main Plutôt que de directement jouer le son nous pouvons utiliser ffmpeg pour le stocker dans un fichier (ogg par exemple) : - ffmpeg -f lavfi -i "sine=frequency=440:duration=1" big.ogg + ffmpeg -f lavfi -i "sine=frequency=440:duration=1" bip.ogg On peut rejouer le fichier avec ffplay ou tout autre lecteur : - mpv big.ogg + mpv bip.ogg + +Pour l'article crééons quatre sons différents, quatre bip de fréquences +différentes : + + ffmpeg -f lavfi -i "sine=frequency=440:duration=1" bip.ogg + ffmpeg -f lavfi -i "sine=frequency=640:duration=1" bip-640.ogg + ffmpeg -f lavfi -i "sine=frequency=240:duration=1" bip-240.ogg + ffmpeg -f lavfi -i "sine=frequency=540:duration=1" bip-540.ogg + +endsection + +<<. ./details "faire des bips à la fréquence aléatoire" | save_html main +On peut générer un entier aléatoire entre N et M en faisant : + + $ seq N M | shuf | head -n1 + +Par exemple : + + $ seq 200 1000 | shuf | head -n1 + 529 + +Si l'on veut générer quatre bip aléatoires on peut donc faire : + + seq 200 1000 | + shuf | + head -n4 | + xargs -I {} -r ffmpeg -f lavfi -i "sine=frequency={}:duration=1" bip-{}.ogg + +qui exécutera : + + ffmpeg -f lavfi -i sine=frequency=479:duration=1 bip-479.ogg + ffmpeg -f lavfi -i sine=frequency=812:duration=1 bip-812.ogg + ffmpeg -f lavfi -i sine=frequency=281:duration=1 bip-281.ogg + ffmpeg -f lavfi -i sine=frequency=624:duration=1 bip-624.ogg + +. + +sectionmd: main + +## Déclencher du son au bon moment + +L'idée d'origine est de déclencher un son à chaque visite du site. On commence +d'abord par récupérer les logs du serveur en local : + + $ ssh host "tail -f /chemin/vers/logs" + 130.79.96.42 - - [11/Jun/2024:15:48:23 +0200] "GET /style.css HTTP/1.1" 200 170 "http://zinzine.bebou.netlib.re/" "Mozilla/5.0 (X11; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/115.0" + 130.79.96.42 - - [11/Jun/2024:15:48:23 +0200] "GET /cssVarFilledCookies.css HTTP/1.1" 200 975 "http://zinzine.bebou.netlib.re/" "Mozilla/5.0 (X11; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/115.0" + 213.16.110.236 - - [11/Jun/2024:16:05:20 +0200] "GET / HTTP/1.0" 200 1068 "-" "-" + [...] + +On peut boucler dessus avec un `while` : + + ssh host "tail -f /chemin/vers/logs" | + while read line;do + [...] + done + +endsection + +<<\. ./details "ssh, les commandes et les pipes" | save_html main + +Si vous êtes étonné·es de voir ssh utilisé de la sorte j'explique. L'usage +"habituel" d'ssh est de `ssh host`, on récupère un shell interactif et c'est en +argument d'ssh n'importe quelle commande à exécuter sur la machine distante. +Ici on récupère donc les log du serveur à l'aide d'un `tail`. Deuxième surprise +éventuelle, le fait de piper le résultat de la commande ssh dans la suite de +notre script. Ca peut paraître un peu magique (ou au contraire tout à fait +logique selon les personnes) mais ssh "connecte" les entrées et sorties des +commandes locales et distantes. Ainsi dans : + + $ seq 10 | ssh host "paste -s -d '+'" | bc -l + + * `seq 10` est exécuté sur la machine locale, sa sortie est branchée à + l'entrée de la commande `ssh` + * `ssh` est exécuté en local et lance `paste -s -d '+'` sur la machine + distante. Au passage ssh branche son entrée (la sortie de seq) sur l'entrée + de la commande `paste` sur la machine distante. ssh récupère également la + sortie du paste sur la machine distante pour la transmettre au pipe sur la + machine locale. + * `bc -l` est exécuté en local, son entrée étant la sortie de la commande ssh + qui est la sortie de la commande paste distante. + +Tout ça pour dire qu'ssh branche les pipes les un avec les autres pour qu'ils +se comportent comme si la commande distante était exécutée en local. +. + +sectionmd: main + +En se basant sur le contenu de la variable `$line` on devrait pouvoir détecter +(à la va vite on fait simple) quel site est visité : + + ssh host "tail -f /chemin/vers/logs" | + while read line;do + site=$(echo "$line" | grep -oE '/(arthur|doublezip|zinzine)\.') + case "$site" in + (/arthur.) [...] ;; + (/doublezip.) [...] ;; + (/zinzine.) [...] ;; + (*) [...] ;; + esac + done + +Et jouer un son différent selon le site avec deux dixième de seconde entre +chacun : + + ssh host "tail -f /chemin/vers/logs" | + while read line;do + site=$(echo "$line" | grep -oE '/(arthur|doublezip|zinzine)\.') + case "$site" in + (/arthur.) + ffplay -autoexit -nodisp -loglevel panic -i bip-arthur.ogg & ;; + (/doublezip.) + ffplay -autoexit -nodisp -loglevel panic -i bip-doublezip.ogg & ;; + (/zinzine.) + ffplay -autoexit -nodisp -loglevel panic -i bip-zinzine.ogg & ;; + (*) + ffplay -autoexit -nodisp -loglevel panic -i bip.ogg & ;; + esac + sleep 0.2 + done + +On emballe tout ça dans un script et on le lance ! On peut ajuster le sleep pour +accélérer ou ralentir la lecture. On peut également retirer les `&` des lignes +ffplay pour que chaque son soit joué l'un après l'autre de manière strictement +séquentiel. Si un très grand nombre de requêtes arrivent dans un petit laps de +temps ça risque de prendre un long moment pour tout dépiler. + +## Des idées + + * Streamer le son sur une radio. Parfois c'est live sur la radio + [sup-sonore](http://bebou.netlib.re:1111/sup-sonore.ogg) + * Demander à chaque personne qui rejoint le serveur un fichier audio d'une + seconde pour que ce soit le son associé à leur site + * L'explication de ce script en atelier CESAR démontre que pour une personne + avec un niveau moyen en Unix c'est un projet assez pédagogique + * On pourrait utiliser ce système pour créer des pièces sonores basées sur + l'interaction avec un public lors d'un concert par exemple. On peut imaginer + des interactions plus sobres (et accessibles, pleins de personnes n'ont pas + de smartphone) que de sortir son smartphone et spammer un site + mais plus facile à mettre en place sans matériel dédié je suis pas sûr. + * On peut imaginer n'importe quel truc à la place de balancer du son. Des + idées en vrac : générer ou dévoiler une image (merci + [Miguel](https://mig-ap.com)), générer une mosaïque, que les sons soient des + notes... -[^2]: *fun* fact, Lovecraft était très raciste et antisémite : https://fr.wikipedia.org/wiki/H._P._Lovecraft#Race,_ethnie_et_classe