Quelques astuces diverses, dixième
Il serait criminel de terminer l’année sans vous filer une dernière tournée d’astuces à coller sous le sapin numérique que vous avez certainement quelque part 🙂 Comme toujours, à garder dans un coin de votre mémoire ou de votre wiki personnel (ou un simple marque-pages Firefox, ça fonctionne aussi mais c’est moins facile à chercher).
Convertir une vidéo en série d’images
Un petit défi trouvé je ne sais plus où : retrouver une image précise, dans une vidéo où celles-ci défilent très vite. Plutôt que de m’emmerder à lire au ralenti, à repasser 50 fois en espérant voir quelque chose, il « suffit » de convertir et de générer un fichier image par image de vidéo. Pour ça, il faut extraire le nombre de fps de la vidéo en question, et réutiliser ce paramètre pour qu’ffmpeg fasse le boulot :
1 |
ffmpeg -i DMdLcMPW4AUQV9t.mp4 -vf fps=27.5 out%d.png |
On a ensuite autant de fichiers images qu’il y a d’images dans la vidéo, et celle qu’on recherche va forcément apparaître.
L’optimisation d’image rapide pour les pressés
Pour économiser quelques précieux mégaoctets quand on travaille sur un site qui manipule beaucoup d’images, sauf à vouloir faire le traitement au moment de l’upload, on peut le faire après coup :
1 2 3 |
find . -iname "*.png" -exec optipng -o5 -strip all {} \; find . -iname "*.jpg" -exec jpegoptim -m90 --strip-all {} \; |
Les deux logiciels sont à installer et sont disponibles dans la plupart des distributions. Petit test rapide sur le dossier wordpress d’un client, passé de 416 à 322Mo. Après, il faut regarder la qualité finale des fichiers pour les jpg qui seront recompressés…
Yaourt : utiliser la puissance du multicœurs pour la compression
J’ai déjà parlé d’AUR et de la puissance de ce système de gestions de paquets (et de ses risques aussi). En voulant réinstaller MARP, j’ai découvert, au delà de la taille aberrante liée à Electron, que la compression du paquet construit se limitait à un seul cœur, et que c’était en particulier la compression qui était en cause. Pour utiliser tous les cœurs disponibles, c’est dans le fichier /etc/yaourtrc
qu’il faut se rendre :
1 2 3 |
COMPRESSXZ=(xz -c -z - --threads=0) #Si gzip, installer pigz puis COMPRESSGZ=(pigz -c -f -n) |
A la prochaine installation/mise à jour de paquet, ça devrait être bien plus rapide. Sauf quand votre connexion est merdique…
Asciiart
Je cherche à créer un message sympa pour la connexion SSH à mes serveurs, mais et pour ça, rien de tel qu’un peu d’ascii art. Pour afficher du texte décoré, il y a figlet qui permet de faire quelques trucs sympa.
1 2 3 4 5 |
[seboss666@seboss666-ltp ~ ]$ figlet -f smslant Seboss666 ____ __ ____ ____ ____ / __/__ / / ___ ___ ___ / __// __// __/ _\ \/ -_) _ \/ _ \(_-<(_-</ _ \/ _ \/ _ \ /___/\__/_.__/\___/___/___/\___/\___/\___/ |
Vous pouvez vous intéresser à la commande figlist pour avoir une idée des « polices » possibles et faire vos propres tests 🙂
PS : figlet est à installer auparavant évidemment.
REGEX : filtrer only alphanum,_ and –
Celle-là, je la dois en grande partie à Djerfy. Sur le coup, on a pas trouvé mieux, mais ça fonctionne. Je cherchais à filtrer dans un script bash le nom de l’utilisateur saisi pour m’assurer qu’il respecte le format que je voulais, à savoir alphanumérique, underscore et tiret. On a abouti à cette routine :
1 2 3 4 |
ISVALID=$(echo ${NEWUSER} | sed "s/[a-zA-Z0-9-]//g;s/_//g") if [ "x" != "x${ISVALID}" ]; then echo -ne "error" fi |
Si une brutasse a une meilleure méthode, en sachant que sur la partie sed si on essaie de le faire en une seule fois ça merde, je veux bien un petit partage en commentaire 🙂
Docker : changer la plage d’IP du bridge par défaut
J’ai rencontré un souci après l’installation de Docker sur ma VM Linux au boulot, je n’accédais plus au dépot SVN privé sur lequel nous publions notamment nos clés SSH à déployer sur les milliers de serveurs Linux que nous avons sous notre responsabilité. Il s’avère que c’est l’adresse par défaut du bridge docker0 et surtout la route associée qui n’était pas la bonne. Pour corriger ça, j’ai créé le fichier /etc/docker/daemon.json
avec le contenu suivant :
1 2 3 |
{ "fixed-cidr": "192.168.5.0/24" } |
On redémarre ensuite le démon Docker, le bridge a changé d’adresse et de route, joie dans la demeure, les serveurs auront ma nouvelle clé dans la journée 🙂
Remplir un fichier known_hosts pour son service Gogs
Si vous avez lu mon article sur la mise sous Docker de mon service gogs, il ne vous aura pas échappé que le hook du miroir GitHub a un peu été contrarié par le fait que la première fois l’utilisateur git n’a pas enregistré l’identité des serveurs SSH distants. Si j’ai copié un fichier existant, il est également possible, depuis l’hôte Docker, d’utiliser ssh-keyscan :
1 |
ssh-keyscan -t rsa github.com >> /home/docker/gogs/git/.ssh/known_hosts |
À répéter deux/trois fois pour choper les trois serveurs. Et c’est valable pour tous les services sur lesquels votre forge doit se connecter.
Gagner quelques secondes en modifiant légèrement votre Dockerfile
Ça révolutionnera pas votre utilisation de Docker, mais en limitant le nombre de commandes RUN, vous limitez la génération d’images intermédiaires et donc gagnez un peu de temps, toujours appréciable si vous enchaînez les « compilations ». Voici ce que je faisais au départ :
1 2 3 |
RUN apk update RUN add docker RUN pip install --no-cache-dir ovh |
On peut tout regrouper en une seule « étape » :
1 2 |
RUN apk add -U --no-cache docker &&\ pip install --no-cache-dir ovh |
Ça ne change absolument rien à la taille potentiellement délirante de votre image évidemment. Pour ça, je vais essayer d’utiliser j’ai utilisé le module Docker, mais la documentation est affreuse (comme trop souvent).
La météo dans son terminal
Très rapide, en couleur en plus, Et si vous avez besoin d’un peu de précision (genre ça vous répond le mauvais Pays), vous pouvez ajouter un ~ devant le nom de la ville pour qu’il tente une localisation :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
[seboss666@seboss666-ltp ~ ]$ curl wttr.in/Melun Weather report: Melun, France Overcast .--. 0-4 °C .-( ). ↘ 17 km/h (___.__)__) 10 km 0.0 mm ┌─────────────┐ ┌──────────────────────────────┬───────────────────────┤ Sat 16 Dec ├───────────────────────┬──────────────────────────────┐ │ Morning │ Noon └──────┬──────┘ Evening │ Night │ ├──────────────────────────────┼──────────────────────────────┼──────────────────────────────┼──────────────────────────────┤ │ \ / Partly cloudy │ Cloudy │ _`/"".-. Light rain sho…│ _`/"".-. Patchy rain po…│ │ _ /"".-. -1-3 °C │ .--. 1-5 °C │ ,\_( ). 1-4 °C │ ,\_( ). 1-4 °C │ │ \_( ). → 12-20 km/h │ .-( ). → 15-22 km/h │ /(___(__) ↗ 13-21 km/h │ /(___(__) ↗ 11-19 km/h │ │ /(___(__) 19 km │ (___.__)__) 18 km │ ‘ ‘ ‘ ‘ 14 km │ ‘ ‘ ‘ ‘ 18 km │ │ 0.0 mm | 0% │ 0.0 mm | 0% │ ‘ ‘ ‘ ‘ 0.3 mm | 58% │ ‘ ‘ ‘ ‘ 0.1 mm | 19% │ └──────────────────────────────┴──────────────────────────────┴──────────────────────────────┴──────────────────────────────┘ ┌─────────────┐ ┌──────────────────────────────┬───────────────────────┤ Sun 17 Dec ├───────────────────────┬──────────────────────────────┐ │ Morning │ Noon └──────┬──────┘ Evening │ Night │ ├──────────────────────────────┼──────────────────────────────┼──────────────────────────────┼──────────────────────────────┤ │ .-. Light drizzle │ .-. Light drizzle │ .-. Light drizzle │ .-. Light rain │ │ ( ). 0-4 °C │ ( ). 2-5 °C │ ( ). 4-6 °C │ ( ). 2 °C │ │ (___(__) ↗ 17-26 km/h │ (___(__) ↗ 19-28 km/h │ (___(__) ↑ 23-36 km/h │ (___(__) ↑ 23-35 km/h │ │ ‘ ‘ ‘ ‘ 20 km │ ‘ ‘ ‘ ‘ 20 km │ ‘ ‘ ‘ ‘ 19 km │ ‘ ‘ ‘ ‘ 20 km │ │ ‘ ‘ ‘ ‘ 0.6 mm | 69% │ ‘ ‘ ‘ ‘ 1.2 mm | 59% │ ‘ ‘ ‘ ‘ 1.4 mm | 75% │ ‘ ‘ ‘ ‘ 1.7 mm | 88% │ └──────────────────────────────┴──────────────────────────────┴──────────────────────────────┴──────────────────────────────┘ ┌─────────────┐ ┌──────────────────────────────┬───────────────────────┤ Mon 18 Dec ├───────────────────────┬──────────────────────────────┐ │ Morning │ Noon └──────┬──────┘ Evening │ Night │ ├──────────────────────────────┼──────────────────────────────┼──────────────────────────────┼──────────────────────────────┤ │ .-. Light rain │ .-. Light drizzle │ \ / Partly cloudy │ \ / Partly cloudy │ │ ( ). 3-6 °C │ ( ). 2-6 °C │ _ /"".-. 1-5 °C │ _ /"".-. 0-3 °C │ │ (___(__) ↘ 19-27 km/h │ (___(__) ↓ 24-32 km/h │ \_( ). ↘ 14-23 km/h │ \_( ). ↘ 13-21 km/h │ │ ‘ ‘ ‘ ‘ 20 km │ ‘ ‘ ‘ ‘ 20 km │ /(___(__) 17 km │ /(___(__) 17 km │ │ ‘ ‘ ‘ ‘ 0.7 mm | 79% │ ‘ ‘ ‘ ‘ 0.2 mm | 69% │ 0.0 mm | 0% │ 0.0 mm | 0% │ └──────────────────────────────┴──────────────────────────────┴──────────────────────────────┴──────────────────────────────┘ |
Cartographie dans un terminal
Oui, encore un autre service qu’on s’attendait pas à trouver, et pourtant, c’est un truc de dingue :
1 |
telnet mapscii.me |
Ensuite, on utilise a/z pour zoomer/dézoomer, et les flèches pour se déplacer. Bluffant.
Tribute to Star Wars
Fin d’année oblige, on termine avec quelques petites bricoles en bash qui demandent un écran d’une certaine taille en hauteur, et dans le premier cas l’installation d’ack et de lolcat (dispos dans vos dépôts préférés au moins dans Debian depuis Wheezy). On a donc la première commande :
1 |
clear ; while : ; do ack --bar | lolcat --force ; sleep 0.05 ; printf "\e[0;0H" ; done |
Les développeurs doivent s’ennuyer parfois pour cacher ça dans leur code 🙂
Et le bouquet final, la plus délire de ce que j’ai pu voir je pense (après le générique via les reverse IP), raison pour laquelle je vous la donne en dernier, l’épisode 4 en ascii art à portée de telnet :
1 |
telnet towel.blinkenlights.nl |
C’est un boulot de malade !
On se donne rendez-vous l’année prochaine 😉
Pourquoi utiliser
[ "x" != "x${variable}" ]
quand[ -n "$variable" ]
fait exactement la même chose ?Et
clear ; while : ; do ack --bar | lolcat --force ; sleep 0.05 ; printf "\e[0;0H" ; done
ne fonctionne pas chez moi (à moins que je n’ai pas compris), en plus de faire bipper mon terminal en boucle.il n’y a pas d’erreur dans le sed si on finit par le tiret:
echo ${NEWUSER} | sed "s/[a-zA-Z0-9_-]//g"
On peut même utiliser la classe de caractères [:alnum:] pour remplacer a-zA-Z0-9, ce qui donne
echo ${NEWUSER} | sed "s/[[:alnum:]_-]//g"
(cf. https://www.gnu.org/software/sed/manual/html_node/Character-Classes-and-Bracket-Expressions.html )