Planet Asrall

October 25, 2021

Alexandre Bailly

PlayStation 2, Raspberry Pi et lecteur DVD HS

Ou comment continuer d'exploiter sa PS2 quand le lecteur a l'affreuse tendance à rayer les disques.

TL;DR (Trop long, flemme de lire) : FreeMCBoot + OPL OpenPS2Loader + partage SMB/Samba/CIFS sur le Raspberry Pi branché en ethernet sur la PS2.

Remarques

La rédaction de cet article a démarré fin mai début juin 2021, pour publication fin octobre. Il se peut que des choses aient changés, notamment côté raspbian/armbian ou OPL. Ne pas prendre cet article tel quel, veuillez garder un aspect critique/le considérer comme n'étant plus à jour.

La version d'Open PS2 Loader utilisée ici est la version 1.2.0-Beta-DB_all-2158-f8228f2-2021-09-21

Contexte

J'ai installé FreeMCBoot il y a quelques années1 sur la console, essentiellement pour pouvoir exploiter le swap magic sans disque swap magic, pour pouvoir jouer aux jeux imports (et jamais sortis en Europe).

Ça fonctionne bien (très bien, même), mais depuis quelques temps, certains jeux ne passent plus, ou plantent sans raison.

En retournant les disque, je ne put que constater l'horreur.

Deux grosses rayures circulaires, exactement au même endroit, sur plusieurs disques, aussi bien PS1 que PS2.

Voilà qui explique pourquoi il n'est plus possible de jouer à ces jeux.

FreeMCBoot

FreeMCBoot est une méthode de modification logicielle (softmod) de la Playstation 2, s'installant sur une carte mémoire, et permettant d'exécuter du code non signé depuis la console, sans modification matérielle. La principale contrainte de FreeMCBoot, c'est qu'il faut une console modifiée (logiciel ou matériel) pour pouvoir l'installer (problème de l'œuf et de la poule).

Ayant profité d'un démontage de la console pour changer la pile CR2032 dans le passé, j'en avais profité pour installer FreeMCBoot sur une carte mémoire (remplacée depuis), via l'exploitation d'un bug sur le jeu 007 espion pour cible.

Divers homebrews ont été développés, notamment pour pouvoir lancer les backups depuis un disque branché en USB (méthode déconseillée, à cause de la lenteur d'accès, c'est de l'USB 1), ou via un partage réseau SMB/CIFS.

Je n'entrerai pas dans les détails sur comment préparer la carte mémoire/FreeMCBoot, c'est documenté un peu partout ; et il y a même des carte-mémoire avec FreeMCBoot déjà installé en vente, mais attention aux arnaques possibles.

Prérequis

Matériel requis :

  • Un lecteur de carte SD/MicroSD2 (avec ou sans adaptateur) ;
  • Une micro SD vierge, neuve de préférence ;
  • Un Raspberry Pi et un câble ethernet ;
  • Une connexion Internet ;
  • Un lecteur DVD sur le PC.

Pour le Raspberry PI, peu importe le modèle, vu que l'on utilisera que le service Samba (partage de fichiers) et isd dhcpcd (serveur dhcp). Éviter toutefois le Pi Zéro, car on aura besoin d'un port Ethernet. C'est faisable avec, mais il faut dans ce cas un adaptateur USB-OTG et une interface USB-Ethernet.

Installation côté Raspberry Pi

Comme on veut un système minimaliste, on ne va pas installer directement raspbian-desktop ou noobs. À la place, on va utiliser raspberrypi-ua-netinst pour installer raspbian avec le moins de trucs possibles.

Note

En fait, il existe des distribution GNU/Linux pour ARM nettement plus légères, mais j'ai choisi la facilité avec Raspbian.

Télécharger la dernière version (release) sur github, https://github.com/FooDeas/raspberrypi-ua-netinst/releases ; notamment l'une des images compressée en xz.

Lors de la rédaction de cet article, la dernière version fut raspberrypi-ua-netinst-v2.4.0.img.xz. Il faudra remplacer le nom de fichier dans les exemples suivants par le nom du fichier réellement téléchargé.

Une fois l'image disque téléchargée, décompresser cette image.

Sous GNU/Linux, en ligne de commande (ou alors, passez par votre outil de gestion de fichiers compressé favori).

Pour le format xz :

xz -d raspberrypi-ua-netinst-v2.4.0.img.xz

Pour le format bz2 :

bunzip2 raspberrypi-ua-netinst-v2.4.0.img.bz2

Sous Windows

Pas besoin de se prendre la tête, 7-zip3 gère ces formats.

Flasher la micro SD soit via UNetbootin (ou équivalent), soit via la commande dd :

Note

Faire attention à la destination. Ne pas hésiter à vérifier avec la commande lsblk pour vérifier que c'est le bon lecteur et le bon périphérique qui sera flashé. Ici, la moindre erreur entrainera au mieux la perte de données, au pire, rendra le PC inopérable et irrécupérable (réinstallation complète obligatoire).

Pour moi (vérifié et confirmé à plusieurs reprises), c'est /dev/sdb1.

sudo dd if=raspberrypi-ua-netinst-git-caf7423.img of=/dev/sdb status=progress

Quelques instants plus tard (une fois que le lecteur a fini de clignoté), éjecter et réinsérer la micro SD dans le lecteur.

Si la capacité indiquée est de 135 Mo (environ), pas de panique, c'est normal. À la racine se trouvent les différents fichiers pour les différentes version du Raspberry Pi.

Aller dans le répertoire raspberrypi-ua-netinst/config, et ouvrir le fichier installer-config.txt avec un éditeur de texte (notepad, geany, gedit…). Pas un logiciel de traitement de texte comme MS-Word ou LibreOffice Writer.

À la fin du fichier, ajouter les lignes suivantes :

packages=nano,samba
timezone=Europe/Paris
keyboard_layout=fr
system_default_locale=fr_FR.UTF-8

Enregistrer, fermer le fichier, et éjecter (proprement) la micro SD.

Insérer la carte dans le Raspberry Pi, brancher le réseau (accès Internet), brancher le Raspberry pi et patienter. L'installation se fait automatiquement.

Note

il est p̶o̶s̶s̶i̶b̶l̶e̶ recommandé de brancher un écran pour surveiller l'avancement de l'installation.

Note

Si au bout de 5 minutes, l'écran reste sur la palette arc-en-ciel, que les voyants de la carte réseau ne s'allument pas, et le système n'a pas démarré, débrancher le raspberry pi, retirer la micro SD et flasher une autre version de raspberrypi-ua-netinst. J'ai eu ce problème avec la toute dernière version -git, et aucun problème avec la version 2.4.0.

Compter une vingtaine de minutes, en fonction du type de connexion.

Une fois l'installation terminée, le système redémarre, et l'écran affiche simplement :

Raspbian GNU/Linux 10 pi tty1
pi login:

Se connecter au Raspberry (soit en branchant un clavier, soit via ssh, utilisez votre routeur pour trouver l'adresse IP du raspberry pi).

login: root password: raspbian

Configuration de Samba

Créer un répertoire /export/ps2

mkdir -p /export/ps2

Attribuer les droits 777 à ce répertoire.

chmod 777 /export/ps2

Éditer le fichier /etc/samba/smb.conf avec nano

nano /etc/samba/smb.conf

Laisser les paramètres par défaut (ils sont censé être corrects)

À la fin du fichier, ajouter les lignes suivantes :

[jeux]
path = /export/ps2
guest ok = yes
guest only = no
read only = no
browseable = yes
inherit acls = no
inherit permissions = no
ea support = no
store dos attributes = no
vfs objects =
printable = no
create mask = 0777
force create mode = 0777
directory mask = 0777
force directory mode = 0778
hide special files = yes
follow symlinks = yes
hide dot files = no
public = yes
writable = yes

Pour enregistrer et sortir, appuyer sur les touches Contrôle et X Confirmer l'écriture avec O, puis Entrée

Configuration du réseau

Là, il va falloir ruser. En effet, comme on veut pouvoir brancher le raspberry pi sur le réseau local pour accéder au partage smb pour y écrire des fichiers, et que le raspberry pi doit également fonctionner en mode autonome une fois branché sur la console ;on va définir une IPv4 Fixe.

Chez moi, le Raspberry Pi a l'adresse IPv4 192.168.10.35, et la passerelle (routeur) a l'adresse 192.168.10.254.

Avis

Remplacer 192.168.10.35 et 192.168.10.254 par les valeurs que vous avez chez vous !

Si vous ne connaissez pas les valeurs, taper les commandes suivantes :

ip -4 a

Sous eth0, à droite de inet, l'adresse IP du Raspberry Pi est affichée, comme ceci :

root@pi:~# ip -4 a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
        inet 127.0.0.1/8 scope host lo
        valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
        inet 192.168.10.35/24 brd 192.168.10.255 scope global dynamic eth0
        valid_lft 42409sec preferred_lft 42409sec
root@pi:~#

Ici, c'est bien 192.168.10.35.

Pour la passerelle, taper simplement :

route

À droite de default, sous Passerelle, l'adresse IP de la passerelle est affichée, comme ceci :

root@pi:~# route
Table de routage IP du noyau
Destination     Passerelle      Genmask         Indic Metric Ref    Use Iface
default         192.168.10.254  0.0.0.0         UG    0      0        0 eth0
192.168.10.0    0.0.0.0         255.255.255.0   U     0      0        0 eth0
root@pi:~#

C'est bien 192.168.10.254.

Noter aussi la valeur de genmask : 255.255.255.0. On en aura également besoin.

Éditer le fichier /etc/network/interfaces avec nano.

Remplacer

iface eth0 inet dhcp

par

iface eth0 inet static

Puis ajouter en dessous

address 192.168.10.35
netmask 255.255.255.0
gateway 192.168.10.254

Remplacer les valeurs address par l'adresse IP du Raspberry Pi, netmask par le masque trouvé plus haut sous genmask, et gateway par l'adresse IP de la passerelle.

Au final, le fichier devrait ressembler à ça :

# interfaces(5) file used by ifup(8) and ifdown(8)
# Include files from /etc/network/interfaces.d:
source-directory /etc/network/interfaces.d
auto lo
iface lo inet loopback

allow-hotplug eth0
iface eth0 inet static
address 192.168.10.35
netmask 255.255.255.0
gateway 192.168.10.254

Redémarrer le Raspberry Pi pour que toutes les modifications soient prises en compte.

reboot

Le Raspberry Pi a redémarré ? Pas de problème de réseau ? On peut continuer.

Copie des images disque

Préparation

Blablabla taxe copie privée, blablabla piratage, c’est mal, blablabla image disque, blablabla, iso.

Avis

Pour ce qui va suivre, malheureusement, c’est uniquement sous Windows. Les outils utilisés n’existent pas tel quel sous GNU/Linux4.

Il nous faut OPL Manager, disponible sur https://oplmanager.com/site/

L’installer dans C:JeuxPS2OPLManager (par exemple)

Monter le partage PS2 du Raspberry Pi sur le lecteur Z: (ou autre lecteur disponible.)

Ici, le « Dossier » est \192.168.10.35jeux

Note

Remplacer l’adresse IP par celle du Raspberry Pi.

Démarrer OPL Manager.

À l’écran « Changer la langue », sélectionner « Français (French) ». Cliquer sur « Sauvegarder ».

Décocher la case « [ ] Vérifier si des mises à jour sont disponible au d », puis cliquer sur « Sauvegarde ».

Dans la fenêtre « Changer Mode / Dossier OPL », laisser le mode sur « Normal (iso + ul.cfg) ».

Dans « Paramètres normaux », cliquer sur le bouton « Parcourir », déplier le nœud « Ce PC », et sélectionner « jeux (\192.168.10.35) (Z:) ».

Cliquer sur le bouton « Sauvegarde ».

Le message « Aucun dossier CD ou DVD ou ART trouvé dans le dossier OPL sélectionné…  » apparaît. C’est normal. On peut l’ignorer en cliquant sur le bouton « OK ».

Une fenêtre vide avec les boutons « Oui » et « Non » apparaît. Normalement, le message « Les dossiers CD, DVD, ART… n’ont pas été trouvés. Voulez-vous les créer » aurait du apparaître. C’est un bogue connu. Cliquer simplement sur le bouton « Oui ».

Ouvrir l’explorateur Windows, ouvrir le dossier partagé, et vérifier que les dossiers APPS, ART, CD, … ont bien été créés.

On peut maintenant installer les jeux.

Copie

Insérer un disque de jeu PlayStation 2 dans le lecteur DVD du PC, puis cliquer dans le menu « Outil » -> « Disque / Convertir en ISO ».

La fenêtre suivante apparaît :

Laisser sélectionné (ou sélectionner) le mode « CD/DVD -> ISO », vérifier que le jeu est bien reconnu (ici, Gradius V, Game ID SLES_520.95).

Cliquer sur le bouton « Parcourir », la fenêtre « Enregistrer sous » s’affiche. Vérifier que le chemin correspond bien au partage réseau du Raspberry Pi.

Ici, comme le jeu est au format CD-ROM (538 Mo), on va l’enregistrer dans le dossier « CD ».

S’il s’agissait d’un jeu au format DVD (1,2 Go par exemple), il faudrait l’enregistrer dans le dossier « DVD ».

Laisser le nom par défaut, ici "SLES_520.95.GRADIUS V.iso", et cliquer sur le bouton « Enregistrer ».

Cliquer enfin sur le bouton « Démarrer » pour lancer la copie.

Copie en cours…

Une fois terminé, le message suivant apparaît : « Iso créé avec succès ! ».

Cliquer sur le bouton « OK », et fermer la fenêtre « CD/DVD/Image vers ISO », en cliquant sur la croix en haut à droite de la fenêtre.

Retirer le disque du lecteur DVD.

Note

un autre jeu peut être copié. Répéter les opérations.

Dans le menu Fichier, cliquer sur « Rafraichir la liste ».

Note

Parfois, OPL Manager ne voit pas la liste des jeux. Fermer l’application et la relancer.

Le jeu apparaît dans la liste.

Modifier CFG

Ce bouton sert à modifier certains paramètres pour OPL (côté console). En effet, certains jeux nécessitent des hacks ou bidouilles pour fonctionner. C’est ce qui est appelé ici Mode.

Pour paramétrer correctement certains jeux, il faut consulter la liste de compatibilité, vérifier l’absence de problèmes connus (comme pour Gradius V) ou pas (Gran Turismo 4 est assez récalcitrant).

Liste de compatibilité :

https://www.ps2-home.com/forum/page/opl-game-compatibility-list

Liste des modes de compatibilité :

https://www.ps2-home.com/forum/app.php/page/opl_modes

En résumé, la plupart des modes activés sont les modes 2 (lecture synchrone) ou 6 (désactivation de l'IGR5)

Note

Avant de remettre en cause OPL ou le mode de compatibilité, ne pas hésiter à vérifier si le dump effectué est correct, notamment en vérifiant la somme de ccontrôle de l'image avec une source fiable, comme redump http://redump.org/

Artworks

OPL Manager permet le téléchargement des ressources, images, couvertures et autres depuis Internet. Ça serait dommage de gérer ça à la main.

Dans le menu « Actions en lots », cliquer sur « Téléchargement de ART ».

Cocher/décocher les cases suivant ses préférences6.

Cliquer sur le bouton « Démarrer », situé sous les cases à cocher.

Au bout de quelques instants, un message indiquant que l’opération a été effectué apparaît.

Cliquer sur le bouton « OK », puis fermer la fenêtre.

Fermer OPL Manager. On a fini avec.

Côté Playstation 2

Parmi les homebrews installés avec FreeMCBoot, on trouve généralement OPL Open PS2 Loader. Parfois pas. Ou alors, pas à jour. Il faudra alors l'installer.

Installation de Open PS2 Loader

Note

Une clé USB sera nécessaire. J'utilise une vieille clé USB de 250 Mo, formatée en FAT32.

Avis

La clé doit être absolument formatée en FAT32/MBR, et non en ExFAT/NTFS/GPT. La clé USB ne serait pas reconnue.

Télécharger la dernière version d'Open PS2 Loader sur https://www.ps2-home.com/forum/viewtopic.php?f=83&t=3&p=47460#p47460

La version lors de la rédaction de l'article fut : OPNPS2LD-v1.2.0-Beta-DB_all-2158-f8228f2-2021-09-21.zip

Extraire l'archive zip, créer un répertoire APPS sur la clé USB, et copier le répertoire OPL dans ce répertoire APPS.

Brancher la clé USB dans l'un des ports de libre sur la console, brancher le Raspberry Pi sur le port ethernet de la console, brancher le reste (carte mémoire contenant FreeMCBoot, une manette, un câble vidéo, l'alimentation du Raspberry Pi sur une alimentation externe.

Avis

Ne pas brancher le Raspberry Pi sur un port USB de la PS2, la console ne sort que 500 mA, ce qui est insuffisant pour alimenter correctement la carte saveur framboise.

Démarrer la console, puis lancer Free MCBOOT Configurator.

Appuyer sur Croix (de la manette)

L'interface de configuration de FreeMCBoot est alors affiché.

Descendre jusqu'à "Configure OSDSYS PATH...". Appuyer sur Croix

Aller sur Configure Item, puis faire défiler avec les flèches gauche-droite et soit sélectionner un emplacement libre, soit une intreée inutilisée comme HDD Loader. Appuyer sur Croix.

Si nécessaire, changer le nom en OPL Loader (ou tout autre nom de votre choix).

Il nous faut maintenant sélectionner le chemin vers Open PS2 Loader. Sélectionner "Path1:" et appuyer sur Croix.

Sélectionner "mass:/"

Aller dans APPS/OPL/ et sélectionner OPNPS2LD.ELF avec Croix

Si tout va bien, les paramètres devraient ressembler à ça :

Sélectionner "Return" et appuyer sur Croix

Descendre également et sélectionner "Return".

Sélectionner maintenant "Save CNF to MC0" et appuyer sur Croix. Cela enregistrera la configuration sur la carte mémoire 1 (celle de gauche). La carte mémoire 2 est appelée MC1.

Le message "Saved mc0:/SYS-CONF/FREEMCB.CNF" devrait apparaître en haut de l'écran, en rouge.

Une fois la sauvegarde effectuée, sélectionner Exit, puis appuyer sur Croix.

La console redémarre automatiquement.

Une fois sur le menu (OSDSYS) de la PlayStation 2, sélectionner OPL Loader (ou le nom que vous avez saisi plus haut) et appuyer sur Croix (ou Rond, en fonction de la région de la console) pour lancer Open PS2 Loader.

Au bout de quelques instants, l'écran OPL Open PS2 Loader apparaît.

On arrive alors sur cet écran.

Configuration de Open PS2 Loader

Aller dans "Settings".

Si nécessaire, changer le chemin dans "IGR Path".

Note

IGR = In Game Reset, autrement dit, un appui sur L1 + R1 + L2 + R2 + SELECT + START arrête le jeu et lance ce qui est spécifié ici. Comme on veut revenir sur Open PS2 Loader, il faut spécifier son chemin. C'est simple, il s'agit du même chemin que celui spécifié dans Free MCBoot Configurator.

Avis

Une erreur dans le chemin = retour sur OSDSYS dans le pire des cas.

Mettre "HDD Device Start Mode" sur "OFF", "ETH Device Start Mode" sur "Auto", et sélectionner "Default Menu" sur "ETH Games".

Descendre sur "OK", et appuyer sur Croix.

Aller sur "Save Changes" et appuyer sur Croix, pour sauvegarder les paramètres.

Note

Pensez à sauvegarder systématiquement les paramètres au fur et à mesure de la configuration.

Avis

Si un paramètre est erroné et qu'il n'est plus possible de lancer Open PS2 Loader, brancher la clef USB sur un ordinateur, aller dans "APPS/OPL", et renommer ou supprimer le fichier "conf_opl.cfg". Ce fichier contient la configuration de Open PS2 Loader.

Aller ensuite dans "Display Settings".

Changer si besoin la résolution vidéo qui sera utilisée pour Open PS2 Loader. Ici, j'ai sélectionné HDTV 1280x720p @60 Hz 16 bit (HIRES).

Note

Ma PS2 Slim est branchée sur un OSSC (Open Source Scan Converter) ou sur un GBS 8220 moddé GBS Control en YPbPr/Composante/RCA vert rouge bleu. Ces deux interfaces acceptent ce format vidéo sans aucun problème. Ce n'est pas forcément le cas de tous les écrans, notamment cathodique.

Aller sur "OK" et sauvegarder si nécessaire. Ne pas hésiter à redémarrer la console et relancer Open PS2 Loader et vérifier que les paramètres vidéo sont bons.

On arrive au bout. Aller dans "Network Settings"

Laisser "Advanced Options" sur OFF.

Configurer ensuite le réseau -PS2- (la console donc) comme suit :

  • "IP Address Type": "Static" ;
  • "IP Address": "192.168.10.10" ;
  • "Mask": "255.255.255.0" ;
  • "Gateway": "192.168.10.254" ;
  • "DNS Server": "192.168.10.13".

Note

Changer 192.168.10.* par les paramètres réseau que vous avez. Revenir sur la section [Configuration du réseau] si nécessaire.

Note

En général la passerelle (Gateway), plus couramment appelé (machin)Box, sert de serveur DNS. Dans mon cas, c'est un serveur sur mon réseau local qui s'en occupe (PiHole).

Enfin, on arrive sur la configuration du serveur SMB (- SMB Server -)

  • "Address Type": "IP" ;
  • "Address": "192.168.10.35" ;
  • "Port": "445"
  • "Share": "Jeux"
  • "User": laisser sur "<not set>"
  • "Password": laisser sur "<not set>"

Note

Dans Address et dans Share, utiliser les paramètres qui ont été définis dans Samba, et qui ont servi pour la copie des images depuis Windows.

Aller sur "OK", puis enregistrer.

Depuis l'écran présentant tous les paramètres, appuyer sur Rond (Games List)

Après quelques instants (le logo OPL devrait clignoter en bas à droite), la liste des jeux apparaît.

Sélectionner le jeu à lancer, et appuyer sur Croix.

Note

  • Pour revenir au menu précédent, appuyer sur Start (Menu).
  • Pour lancer un jeu, appuyer sur Croix (Run).
  • Pour afficher les informations, appuyer sur Carré (Info).

** Si nécessaire (en fonction des jeux et des problèmes de compatibilité), il faudra aller dans les Options, via le bouton Triangle (Options). Se référer au site https://www.ps2-home.com/forum/page/opl-game-compatibility-list et appliquer les corrections (notamment activer les modes).

Note

Dans les options et dans la liste de compatibilité, "VMC" sera mentionné. VMC signifie Virtual Memory Card. Cela permet de créer une carte mémoire virtuelle, soit commune à tous les jeux, soit pour chaque jeu. Tous les jeux ne sont pas compatibles VMC, vérifier la compatibilité avant d'activer cette option dans les options du jeu. Si cette option est désactivée, les carte-mémoires physique fonctionneront normalement.

Un checksum est vérifié, puis le jeu est lancé.

Note

L'écran peut clignoter en bleu, en vert ou en magenta. Ne pas s'en inquiéter.

Logo PlayStation 2 s'affichant au lancement d'un jeu.

Démarrage de Gradius V. Sélection du format vidéo (PAL ou NTSC).

Écran titre

Menu du jeu.

Pour sortir du jeu et revenir sur Open PS2 Loader, soit appuyer sur L1 + R1 + L2 + R2 + SELECT + START, soit redémarrer la console en appuyant sur le bouton "Reset" puis relancer Open PS2 Loader depuis le menu/OSDSYS.

Conclusion

Un peu long à mettre en place, quelques pièges possible au niveau réseau, mais au final, parfaitement fonctionnel.

Je n'ai pas parlé du lancement des jeux PS1, il faudrait un article à lui tout seul pour cela. Je ne pense pas l'écrire, c'est relativement compliqué à mettre en place. Nettement plus compliqué que pour les jeux PS2.

Les jeux pouvant avoir une taille assez conséquente (DVD9), une petite carte micro SD de 16 ou 32 Go sera très vite remplie. Ne pas hésiter à utiliser une carte de plus grande capacité si nécessaire.

Note

On peut très bien utiliser un NAS à la place d'un Raspberry Pi. Il faudra alors brancher la PlayStation 2 sur le même réseau local que le NAS, et modifier les paramètres réseau - SMB Server - dans Open PS2 Loader, et y mettre ce qui correspond au NAS. Toute la partie installation/configuration du Raspberry Pi sera alors inutile :)

--

  1. https://blog.chibi-nah.fr/bon-ca-c-est-fait
  2. J'utilise un lecteur universel Hama (USB 2.0 Card Reader 35 in 1).
  3. https://www.7-zip.org/
  4. Pour être franc, en fait, je n’ai même pas cherché
  5. In Game Reset ; un appui sur L1 + R1 + L2 + R2 + Select + Start provoque le redémarrage de la Playstation 2.
  6. je coche tout, sauf les cases « Remplacer s’il(s) existe(s) »

by alex at October 25, 2021 10:00 PM

September 07, 2021

Luc Didry

Précau­tion à prendre pour la mise à jour vers Debian Bull­seye d’un clus­ter Ganeti

Géné­ra­le­ment, on fait sa mise à jour vers la nouvelle version de Debian, ça installe la nouvelle version de Ganeti, on fait un petit gnt-cluster upgrade, pis ça roule.

Hélas, pas pour Debian Bull­seye (Debian 11) ! En effet, la mise à jour de Debian dégage les paquets rela­tifs à Ganeti 2.16, ne lais­sant plus en place que les fichiers de Ganeti 3. Or il faut les anciers binaires pour mettre à jour vers les nouveaux !

Donc, avant le passage à Bull­seye, instal­lez ganeti, ganeti-3.0, ganeti-haskell-3.0 et ganeti-htools-3.0 depuis les back­ports de buster et faites l’up­grade du clus­ter ganeti vers la 3.0 (gnt-cluster upgrade --to=3.0).

apt install ganeti ganeti-3.0 ganeti-haskell-3.0 ganeti-htools-3.0 -t buster-backports

Vous pour­rez ensuite mettre à jour les machines vers Bull­seye en toute quié­tude.

NB : il est dit dans les notes de version de Ganeti qu’il faut mettre à jour Ganeti vers la version 2.16.2 pour pouvoir mettre à jour vers la version 3.0. Debian ne four­nit pas de version 2.16.2 (juste 2.16.0–5), mais ils ont fait ce qu’il faut pour que ça passe (c’est dans la liste des chan­ge­ments lors de la mise à jour vers Bull­seye), n’ayez pas d’inquié­tude.

by Luc at September 07, 2021 11:13 AM

July 03, 2021

Alexandre Bailly

mpv, OSD et affichage du nom du chapitre en cours de lecture

TL;DR (trop long, flemme de tout lire) : Un appui sur la touche 'g' affiche le chapitre en cours de lecture dans mpv. Copier le script https://aeka.chibi-nah.net/~alex/brol/showCurrentChapter.lua dans ~/.config/mpv/scripts

Contexte

Tout est parti d'un pouët de @devnull1 sur le Fediverse2. En résumé : Est-il possible d'afficher la piste d'un fichier .cue en cours de lecture dans mpv ? Soit de manière permanente, soit pendant une certaine durée, ou lors de l'appui sur une touche.

Le script

Le moyen le plus simple pour arriver à ce résultat, c'est l'écriture d'un script lua, et de l'enregistrer dans ~/.config/mpv/scripts (sous GNU/Linux et BSD, chemin à adapter sous Windows et Mac OS).

--affichage du chapitre en cours
-- Licence WTFPL v2
-- @alex@social.nah.re

local options = require("mp.options")
local utils = require("mp.utils")

--paramètres par défaut
local cfg = {
        key = 'g',
        osdDuration = 5,
        name = 'showCurrentChapter'
}

options.read_options(cfg, 'showCurrentChapter')

local function showCurrentChapter()
        local chapter = mp.get_property_osd('chapter')
        mp.osd_message(chapter, cfg.osdDuration)

end

if(cfg.key) then
        mp.add_key_binding(cfg.key, cfg.name, showCurrentChapter)
        mp.msg.verbose("key:'"..cfg.key.."' bound to '"..cfg.name.."'")
end

Pas grand-chose à dire en fait.

Définir les paramètres par défaut, notamment la touche sur laquelle il faudra appuyer pour exécuter le script (ici, 'g'), et la durée d'affichage (5 secondes).

Ces options peuvent être redéfinies dans un fichier de configuration externe3, ce qui évite de modifier le script4.

À la fin, si la touche (cfg.key) est définie, alors on demande à mpv de l'ajouter dans sa liste des touches "mappées", et en lui indiquant quelle est la fonction à appeler (showCurrentChapter) lors de l'appui sur cette touche (g).

Et au dessus, la fonction affichant le chapitre.

J'avais d'abord essayé l'appel à mp.get_property('chapter'), mais je récupérais uniquement l'index du chapitre en cours de lecture (par exemple : 5).

J'ai pensé charger la liste des chapitres dans un tableau, via chapter-list, mais cela complexifiait le code. Et en lisant la doc, en fait, le moyen le plus simple, c'était d'appeler mp.get_property_osd('chapter') directement.

Et pour l'affichage, il suffit d'appeler la fonction mp.osd_message(texte à afficher, durée).

La durée étant stockée dans les paramètres, on n'a pas besoin de modifier la valeur dans cette fonction.

Conclusion

Rien de compliqué. Un peu de code, quelques tests, et surtout5 beaucoup de lecture de documentation6.

--

  1. https://mamot.fr/@devnull/106521784534006704
  2. Pour n̶e̶ ̶p̶a̶s̶ changer…
  3. Cf. documentation de mpv -> https://mpv.io/manual/stable/
  4. On peut très bien modifier le script en fait.
  5. On ne peut pas y échapper.
  6. Bon, ça va, je sais à peu près comment fonctionne mpv et comment est organisée la documentation.

by alex at July 03, 2021 10:00 PM

June 19, 2021

Alexandre Bailly

Wallpaper Finer

Wallpaper finer est un petit logiciel libre et open source (GPLv2), permettant de redimensionner et recadrer très facilement et rapidement une image. Son principal défaut ? Il utilise encore Qt 4.

Comment modifier le code de ce logiciel pour utiliser Qt5 ? Réponse dans cet article.

TL;DR (trop long, flemme de tout lire) : le code source du portage vers Qt5 est disponible ici :

https://lab.shelter.moe/nah/wallpaperfiner

Compilation :

mkdir build
cd build
qmake ../WallpaperFiner.pro
make

Vérification que ça utilise bien qt5 :

ldd wallpaperfiner

Exécution :

./wallpaperfiner

Introduction

Tout est parti d'un pouët de @TritTriton1, qui parlait d'un petit logiciel permettant de recadrer et redimensionner une image facilement. Son seul reproche, c'est que c'est en Qt42. Cela impose donc de garder un framework3 ancien sur sa machine.

L'application (une fois le portage vers Qt5 effectué) en action.

Le code source

Note

Tout a été rédigé avec GNU/Linux, notamment Debian, en tête. Rien n'a été testé sous Windows, aucune aide ni support ne sera apporté de ma part pour ce système d'exploitation.

Note

Ici, j'ai utilisé Qt Creator pour des raisons pratiques4. J'aurais pu utiliser geany, vscode, vim, emacs ou autre éditeur de texte.

Le code source de Wallpaper Finer est disponible sur le site du développeur, Péter Deák5, et est sous licence GPL v2. La dernière version date du mois d'août 20126.

Le projet s'ouvre sans souci avec Qt Creator7. Le projet étant créé avec Qt4, il faut modifier la configuration pour utiliser la bonne version de Qt. Lors de la rédaction de l'article, on en était à la version 5.15.28.

Lors de l'ouverture du projet, Qt Creator demande de le configurer, notamment la cible, ici Desktop (Qt5).

Il faut quand même vérifier si c'est bien la bonne version de Qt qui est sélectionnée, pour éviter toute surprise si jamais on a plusieurs versions du framework9.

Liste des kits de développement (SDK) paramétrés. Ayant fait du ménage dedans, il n'y a plus que Desktop (Qt5).

Versions de Qt installées. Version 4.8.7 (Qt4) et version 5.15.2 (Qt5).

Tout est bon ? On peut continuer.

Cliquer sur le bouton "Configure project".

Au bout de quelques instants, le projet s'affiche sous Projets, en haut à gauche.

Par défaut, tous les nœuds de l'arborescence sont repliés.

Adaptations à faire

Projet

Il y a quelques modifications à faire dans WallpaperFiner.pro.

Ajouter widgets à droite, sur la ligne QT :

QT       += core gui widgets

Pour la traduction en français, ajouter wpfiner_fr.ts à droite, sur la ligne TRANSLATIONS :

TRANSLATIONS = wpfiner_hu.ts wpfiner_pl.ts wpfiner_fr.ts

Modifications effectuées dans WallpaperFiner.pro.

Enregistrer et fermer le fichier.

Traduction fr

On va tout de suite ajouter la traduction en français.

  • Ouvrir le nœud Other files.
  • Dupliquer le fichier wpfiner_pl.ts.
  • Nommer le fichier wpfiner_fr.ts.

Duplication du fichier pour la traduction.

Nommage du fichier.

Ouvrir le fichier wpfiner_fr.ts en double-cliquant dessus. On va faire une modification dans ce fichier xml.

Dans TS, changer la langue de pl_PL à fr_FR, pour language et sourceLanguage.

<TS version="2.0" language="fr_FR" sourcelanguage="fr_FR">

Modifications effectuées.

Enregistrer et fermer le fichier.

Ouvrir maintenant le fichier wpfiner_fr.ts avec Qt Linguist (l'outil dédié pour la traduction).

Note

On peut aussi éditer le fichier xml à la main. Mais ce n'est pas forcément pratique et c'est source d'erreurs.

Menu contextuel -> Ouvrir avec

Qt Linguist. Comparé à un outil léger comme PoEdit, l'interface semble compliquée.

Faire la traduction des différents textes et messages. Je ne m'attarderai pas dessus, ce n'est pas très difficile.

Traduction française terminée.

Cliquer sur le menu Fichier -> Publier pour générer le fichier wpfiner_fr.qm. On en aura besoin par la suite.

Menu Fichier -> Publier.

Fermer Qt Linguist.

Dans Qt Creator, ouvrir le nœud Resources, wpfiner.qrc, /

Faire un clic droit sur / -> Ajouter des fichiers existants…

Menu contextuel -> Ajouter des fichiers existants…

Sélectionner le fichier wpfiner_fr.qm et cliquer sur Ouvrir.

Boîte de dialogue de sélection de fichiers.

Entête (wpfiner.h)

Ouvrir le fichier wpfiner.h.

Modifier le numéro de version en 0.95 (la version étant 0.94).

#define VERSION "0.95"

Dans ce fichier, il y a une erreur (indiquée en rouge) :

  • expected class name.

Pour corriger cette erreur, il faut ajouter des #includes supplémentaires.

Note

S'aider de la documentation du SDK Qt, notamment les pages de migration Qt4 vers Qt5.

Les entêtes à ajouter sous #include <QtCore> sont :

#include <QMainWindow>
#include <QFrame>
#include <QMenu>
#include <QMenuBar>
#include <QMessageBox>
#include <QFileDialog>

Modifications effectuées.

Note

il reste un warning (ligne jaune), ne pas en tenir compte pour le moment10

Enregistrer et fermer le fichier wpfiner.h.

C++ (main.cpp)

Ouvrir le fichier main.cpp.

Il y a deux erreurs dans ce fichier :

  • QtGui/QApplication: No such file or directory ;
  • variable has incomplete type 'QApplication'.

Pour corriger ces erreurs, il faut également modifier les includes.

Supprimer cet include :

#include <QtGui/QApplication>

Cet include n'existe plus dans Qt5.

Ajouter les deux includes suivants :

#include <QtWidgets>
#include <QMainWindow>

Profiton-en pour ajouter la traduction française dans la liste des traductions.

Modifier la ligne #define INSTALLED_LANGNUM en remplaçant la valeur 3 par 4

#define INSTALLED_LANGNUM  4

Modifier la liste des langues en remplaçant également [3] par [4], et en ajoutant une ligne supplémentaire référençant la langue française.

char langs[INSTALLED_LANGNUM][4][30] = {
    {"English"  ,"en",""},
    {"French"   ,"fr",":/wpfiner_fr.qm"},
    {"Hungarian","hu",":/wpfiner_hu.qm"},
    {"Polish"   ,"pl",":/wpfiner_pl.qm"}
};

Modifications effectuées.

Enregistrer et fermer le fichier main.cpp.

Note

Comme je ne tiens pas compte de la version Windows11, tout le code défini dans #ifdef Q_WS_WIN n'a pas été modifié. Il y a de fortes chances pour que la traduction française ne fonctionne pas sous Windows. Il faudra modifier le code en conséquence.

C++ (wpfiner.cpp)

Ouvrir le fichier wpfiner.cpp.

Quatre erreurs sont présentes ici (en fait, il n'y en a que deux, les deux autres en découlent) :

  • invalid use of incomplete type class 'QDesktopWidget'
  • class 'QString' has no member named 'toAscii'
  • member access into incomplete type 'QDesktopWidget'
  • no member named 'toAscii' in 'QString'

Pour la première erreur, c'est encore un problème d'include. Remplacer QtGui par QtWidgets.

Supprimer cet include :

#include <QtGui>

Ajouter cet include :

#include <QtWidgets>

Modifications effectuées côté include.

Concernant la seconde erreur, la méthode toAscii() n'existe plus. On va utiliser toLatin1() à la place

Descendre vers la ligne 33912.

Remplacer :

finedImage.save(&finedFile,save_format.toAscii().data());

par :

finedImage.save(&finedFile,save_format.toLatin1().data());

Appel de la méthode corrigée

Enregistrer et fermer le fichier wpfiner.cpp.

Compilation

C'est bon ? On peut compiler le projet.

Pour cela, cliquer sur le petit marteau en bas à gauche, ou passer par le menu Compiler -> Build all projects

Un petit Build devrait apparaître en bas, vers la droite, pour indiquer que le projet est en cours de compilation.

Compilation en cours.

Une fois la compilation terminée, cliquer sur l'onglet Problèmes en bas.

Normalement, si tout a été modifié correctement, il ne devrait pas y avoir d'erreurs en rouge. Juste quelques avertissements (warnings) en jaune, notamment des appels dépréciés qu'il faudrait remplacer.

Liste des problèmes trouvés. Aucune erreur, uniquement des avertissements.

Test

C'est bon ? On peut tester ?

On peut.

Cliquer sur le triangle en bas à gauche (celui du haut, pas celui du bas avec un insecte dessus).

L'application doit se lancer sans problème.

L'application a démarré.

Ouvrir une image ou la glisser-déposer sur la fenêtre, et vérifier le bon fonctionnement du redimensionnement et du recadrage de l'image. Vérifier aussi que l'enregistrement de l'image fonctionne aussi.

Note

Le bouton « Définir comme fond d'écran13 » crée un répertoire WpFiner dans le répertoire $home, enregistre l'image dedans, mais n'effectue pas le changement de fond d'écran. Cela ne fonctionnerait que sous Windows. C'est l'une des limitations de la version GNU/Linux.

Compilation et installation

Pourquoi le titre Compilation ? Pourquoi en plus un changement de niveau de titre alors qu'on vient de compiler et de tester ?

On a compilé via Qt Creator, en Debug. Maintenant, on va compiler en release.

Pourquoi ? Parce que la version de debug, qui se trouve dans ../build-WallpaperFiner-Desktop-Debug pèse 2 Mo, et la version Release ne pèse que dans les 155 ko.

Note

On peut compiler en release avec Qt Creator, en changeant Debug en Release, en bas à gauche. Cependant, la compilation depuis un terminal intéressera plus de personnes, parce que c'est automatisable/plus simple à gérer avec aur/insérer ici une autre raison pour préférer la ligne de commande.

Lancer un terminal. Se déplacer dans le répertoire du projet.

Dans le répertoire du projet, créer un répertoire build, via le terminal ou via un gestionnaire de fichiers.

Création du répertoire build.

Se déplacer dans ce répertoire.

Taper la commande suivante pour générer le fichier Makefile :

qmake ../WallpaperFiner.pro

Création du Makefile.

Pas d'erreur ? Parfait.

Taper simplement make pour compiler l'application. Des lignes vont défiler, c'est normal.

make

Compilation en cours. Les avertissements (warnings) apparaissent à l'écran, c'est normal.

Une fois terminé, vérifier que le fichier wallpaperfiner a bien été généré, et ne fait que 155 ko (environ, tout dépend si c'est compté en ko ou kio).

Ici, c'est bon. Le fichier exécutable (en vert) fait la taille attendue.

On va vérifier que c'est bien Qt5 qui est utilisé, via la commande ldd.

ldd wallpaperfiner

Résultat ?

libQt5Widgets.so.5 => /usr/lib/x86_64-linux-gnu/libQt5Widgets.so.5 (0x00007f0a08314000)
libQt5Gui.so.5 => /usr/lib/x86_64-linux-gnu/libQt5Gui.so.5 (0x00007f0a07c52000)
libQt5Core.so.5 => /usr/lib/x86_64-linux-gnu/libQt5Core.so.5 (0x00007f0a07707000)

C'est bon, c'est bien Qt5.

On peut lancer l'application et refaire quelques tests, pour confirmer le bon fonctionnement.

./wallpaperfiner

Parfait, aucun problème rencontré.

Pour l'installation, il suffit de copier l'exécutable dans un répertoire défini dans $PATH, comme /usr/local/bin

Par exemple via sudo cp

sudo cp wallpaperfiner /usr/local/bin/

Ici, j'ai utilisé en plus la commande whereis wallpaperfiner pour confirmer que wallpaperfiner est bien reconnu et est situé au bon endroit.

Note

On peut créer une entrée de menu.

Pour cela :

  • soit passer par un éditeur comme alacarte, MenuLibre ou équivalent
  • soit modifier le fichier wallpaperfiner.desktop situé dans le répertoire Desktop, notamment changer les chemins et ajouter la traduction en français de la description, le copier dans /usr/local/share/applications et copier l'icône wpfiner.png dans /usr/local/share/pixmaps/.

Conclusion

Concrètement, le portage vers Qt5 se fait en moins d'une demi-heure, lecture de documentation comprise. C'est relativement simple, sans prise de tête.

Remerciements à @TritTriton pour son pouët montrant cet outil, pour avoir pu compiler la version Qt5 et avoir confirmé son bon fonctionnement.

Modification dimanche 11 juillet 2021.

Le code source est désormais versionné et est disponible sur Shelter : https://lab.shelter.moe/nah/wallpaperfiner --

  1. https://shelter.moe/@TritTriton/106436810381701106
  2. qui date quand même de 2005, et dont la dernière mise à jour date de 2012.
  3. En français, on est censé parler de cadriciel, mais personne ne connait ça sous ce nom
  4. Même si je n'aime pas la disposition de l'environnement de développement intégré (IDE), ni sa traduction inconsistente (c'est à moitié traduit en français).
  5. http://hyperprog.com/wpfiner/index.html
  6. ce qui correspond à Qt 4.8, Qt 5 étant sorti après
  7. Ça peut être utile d'installer Qt5, les outils de développement, etc. Se référer à la documentation ou au gestionnaire de paquets de la distribution utilisée. Idem : je n'apporterai aucune aide sur comment installer et ou configurer le tout.
  8. En tout cas, sous Debian GNU/Linux
  9. Cadriciel. Ce terme est barbant, je vais laisser framework partout dans l'article.
  10. En fait, j'ai carrément ignoré tous les warnings dans le code source, cela concerne des fonctions ou des instructions dépréciées.
  11. Comme indiqué au début de l'article
  12. tout dépend de la présence de sauts de lignes supplémentaires côté code.
  13. To Desktop en anglais

by alex at June 19, 2021 10:00 PM

April 23, 2021

Alexandre Bailly

Cell broadcast

Cell broadcast, ou la diffusion d'alerte via le réseau GSM.

TL;DR

Ça fonctionne avec tout téléphone mobile, même tout simple (non "smart"), tout opérateur, sans connexion Internet, sans GPS, et situé dans une zone couverte par (au moins) une antenne.

Pourquoi alerter ?

Tenir informé de la population d'un risque imminent (séisme, tsunami), en cours (incendie, pollution de l'air) est primordial, afin de limiter au maximum les expositions au danger.

Comment alerter ?

En France, un ensemble d'outils, appelé SAIP (Système d'Alerte et d'Information aux Populations1) est en place. Les alertes peuvent être déclenchées par les services du ministère de l'intérieur (préfet, cellules de gestion de crise), par les services de secours (SDIS Services Départementaux d'Incendie et de Secours, les pompiers, donc), la municipalité (maire) et les services des armées.

Plus d'informations : https://www.interieur.gouv.fr/Alerte/Alerte-ORSEC/Qu-est-ce-que-le-SAIP

La sirène

Le système le plus simple pour alerter est la sirène. Cependant, ce système informe juste de la présence d'un danger. Aucune information concernant ce danger, les risques ou la nature ne peut être véhiculé par ce système.

À noter : afin de vérifier le bon fonctionnement de la sirène, un test est fait le premier mercredi de chaque mois, à midi.

Les médias

Les médias dits « traditionnels », comme les journaux papiers, la télévision et la radio, sont utilisés pour la diffusion d'alertes. Des spots TV/Radio notamment lors d'alerte enlèvement furent déjà utilisés par le passé. Pour les journaux, le délai entre l'annonce et la publication (journal disponible) est plutôt important, ce qui rend ce support non adapté dans des situations d'urgence (attentat, accident industriel grave, alerte incendie…)

Même si ce ne sont pas des médias à proprement parler, certains systèmes d'affichage, comme les panneaux informatifs autoroutiers ou municipaux peuvent également être utilisés pour la diffusion d'alertes.

Les applications « smart »

Parmi les autres méthodes, il y a la mode du « smart », qui, comme son nom l'indique, consiste à utiliser des méthodes stupides, avec des technologies absolument pas fiables, sur lesquels les notions de « environnement dégradé » et « réseau saturé » sont simplement oubliés. Gros avantage, cela permet de signer de gros chèques avec de gros éditeurs (300 000€)2.

L'application pour téléphone mobile tournant sur iOS ou Android, s'appelant SAIP (pourquoi faire compliqué), ou « alerte attentat », fut une de ces méthodes « smart ». En pratique, cette application fonctionnait tellement mal que le gouvernement a abandonné le projet et la maintenance de l'application. Les griefs retenus furent :

  • nécessite un téléphone compatible ;
  • nécessite un abonnement Internet fonctionnel ET activé sur le téléphone ;
  • doit fonctionner en permanence (en arrière plan) ;
  • le système de géolocalisation (GPS) doit être actif et la position connue par le téléphone ;
  • le faible déploiement de l'application (seulement 900 000 installations).

En pratique, l'application fonctionnait très mal. Les alertes émises ne concernaient pas forcément la bonne zone, ou alors, avec des délais trop long (2 heures entre l'émission de l'alerte lors de l'attaque à Nice en juillet 2016 et la réception sur les téléphones). Voire, n'arrivaient pas du tout (attaque du Super U à Trèbes).

Les réseau sociaux

Suite à ces échecs, le gouvernement a concentré ses efforts de communication, notamment sur Facebook et Twitter. L'utilisation de Safety Check de Facebook (déjà ultra intrusif au niveau vie privée) ne fait que renforcer le pouvoir de Facebook (encore plus de données fiables, donc valant encore plus cher sur le site web publicitaire avec ses milliards d'abonnés).

Après, le gouvernement préfère les GAFAM aux entreprises locales… rien de nouveau.

La diffusion cellulaire

Et enfin (et le but de cet article), la méthode qui est mise en place depuis une voire deux décennies dans d'autres pays : la diffusion cellulaire (Cell Broadcast).

La diffusion des alertes de ce type est simple : l'alerte est envoyée à tout téléphone "visible" ou "connecté" à une antenne relais, peu importe le type de téléphone (mobile classique ou débilophone3), peu importe le type d'abonnement (actif ou non) ou la nationalité du constructeur ou de la personne en possession du-dit téléphone.

Gros avantage de cette technologie :

  • complètement indépendant du type de téléphone ou de son système d'exploitation ;
  • ne nécessite pas l'utilisation du GPS (qui peut mettre jusqu'à 12-25 minutes suivant les conditions pour télécharger les éphémérides satellites) ;
  • ne nécessite pas de connexion Internet ;
  • prévu pour fonctionner sur un réseau dégradé ou saturé.

Ce dernier point est important.

En cas de séisme, accident technologique (penser Seveso) ou coupures majeures au niveau énergie (électricité) ou réseau (télécom), le premier service pris d'assaut est le réseau téléphonique, qui devient rapidement saturé (appels aux services de secours, ou appels des/aux proches pour rassurer ou non par rapport à la situation).

À noter : dans ces conditions, les stations de radioamateurs peuvent être utilisées pour transmettre les messages de secours4.

Du coup, pour alerter la population sur une zone géographique précise, il faut et il suffit d'envoyer un message d'alerte aux antennes (relais) présentes sur cette zone, ces antennes étant fixes et leur position connue.

En pratique

Pour des raisons de simplification, je parlerai ici de Cell Broadcast pour les SMS-CB (spécification GSM 03.41) et de SMS pour les SMS-PP (spécification GSM 03.40). Ces spécifications sont disponibles sur le site de l'ETSI.

La diffusion cellulaire fonctionne en mode uni-directionnel, de l'antenne (voire plusieurs antennes) vers le téléphone (downlink), en mode diffusion (broadcast), donc sans cibler un téléphone en particulier5. Tous les téléphones allumés présents dans la zone recevront alors le même message, quasiment en même temps.

Pourquoi ce mode broadcast ? Tout simplement parce qu'envoyer un SMS (en mode classique donc), pour chaque téléphone situé dans une zone, c'est long et lent6.

Admettons que dans une zone urbaine, il y ait 1 000 téléphones allumés et vus par une antenne (c'est pour l'exemple), cela signifie qu'il faut alors envoyer 1 000 SMS, un par téléphone. Et chaque téléphone doit alors envoyer un acquitement en retour (peu importe la classe du SMS, même en classe 0 SMS Flash). Donc 1 000 acquitements. Et si un SMS n'a pas pu être délivré, le réseau retente a nouveau, pendant un certain temps. Si le réseau est saturé ou partiellement inutilisable pendant une catastrophe, les SMS non reçus seraient réexpédiés, saturant encore plus7 le réseau.

En mode broadcast, ces problèmes n'existent pas. Tous les téléphones recoivent le même message en même temps (penser réception radio FM/DAB ou réception télévision TNT, où tous les dispositifs de réception ou assimilés orientés vers la même antenne reçoivent la station ou la chaîne en même temps).

Le SMS-CB dispose d'un canal dédié à la diffusion de messages d'urgence (CBCH Cell Broadcast CHannel), et cela a été défini dans les spécifications de la norme GSM phase 2 (2G) en 19958.

Un message peut occuper 82 octets (donc 93 caractères, parce que l'encodage des caractères est sur 7 bits et non 8), et on peut envoyer jusqu'à 15 pages de 82 octets pour former un message complet (1 395 caractères maximum en théorie). Un message peut être répété un certain nombre de fois (jusqu'à 2 880 fois, donc répété toutes les 30 secondes pendant 24 heures), ou indéfiniment jusqu'à ce que l'instruction d'arrêt de l'envoi ne soit envoyé vers les antennes.

Pour plus de détails, lire la spécification GSM 03.419 sur le site de l'ETSI (European Telecommunications Standards Institute).

La première démonstration de cette technologie a eu lieu à Paris, en 1997.

Et en France ?

Aussi absurde que cela puisse paraître, cette technologie pourtant simple et normalisée, n'est pas active/présente en France (à l'heure de la rédaction de cet article, 24 avril 2021). Non pas pour des raisons techniques, mais pour des raisons politiques et financières (l'argument habituel du qui doit payer ? L'opérateur téléphonique ? L'opérateur d'antenne10 ? Le gouvernement ?).

Cependant, le gouvernement a annoncé il y a quelques mois, que cette technologie devrait être (enfin !) déployée entre juillet 2021 et juin 2022, dans toute la France11.

Cela nécessitera l'activation de cette option dans les paramètres du téléphone12, parce que désactivé par défaut.

Capture d'écran d'un téléphone Android (version 6/LineageOS), montrant les paramètres de diffusion cellulaire (cell broadcast).

--

  1. Si je n'avais pas vérifié, j'aurais écrit « à la Population »
  2. Ce qui fut facturé pour « alerte attentat ».
  3. un "smart"phone n'est pas intelligent. Il est juste stupide, mais connecté à Internet.
  4. Fédération nationale des radioamateurs au service de la sécurité civile.
  5. Ce qui est le contraire d'un appel téléphonique ou l'envoi d'un SMS : le téléphone est ciblé, la diffusion se fait dans les deux sens, montant (téléphone -> antenne relais) et descendant (antenne relais vers téléphone).
  6. À noter : ce reproche a également été fait par certains services de secours, médecins ou ambulanciers, qui utilisent toujours un pager compatible POCSAG/Tattoo/e*message, parce que non seulement la diffusion est plus rapide, mais également parce que c'est accepté dans les lieux où les téléphones mobiles doivent être éteints. Et oui, les pagers sont toujours utilisé en 2021, mais plus du tout par le grand-public, pour des raisons de coût et de contraintes.
  7. façon de parler.
  8. ETSI GSM 05.02 Multiplexing and Multiple Access on the Radio Path (version 3.8.0 release 95 phase 1 ~ Radio Sub - system Link Control), section 3.3.5 Cell broadcast channel (CBCH) (gsmts_0502sv030800p.pdf).
  9. Cette doc est complète et compréhensible, cependant, un minimum de connaissances en réseau/télécom peut être requis pour vraiment tout comprendre.
  10. Les antennes, ça coûte cher à déployer et à maintenir, du coup, certains opérateurs ont vendu les antennes et équipement associé à des entreprises spécialisées.
  11. https://www.lemonde.fr/planete/article/2020/09/24/la-france-va-s-equiper-d-un-systeme-d-alerte-a-la-population-par-telephone-mobile-d-ici-a-2022_6053473_3244.html
  12. Une option que j'active systématiquement sur mes téléphones, et ce, depuis 2006.

by alex at April 23, 2021 10:00 PM

March 17, 2021

Pierre Boesch

FreeBSD : Migration ezjail vers iocage

Après plusieurs années à me trainer ezjail, je me suis enfin décidé à migrer vers iocage. Depuis FreeBSD 10, le fonctionnement de l'upgrade de RELEASE était compliqué : il fallait d'abord upgrader la basejail avant le système notamment. Avec iocage, je garde le même fonctionnement de ezjail, à savoir le système de basejail. Pour la migration, j'ai récupèré les datas spécifiques de chaques jails vers les nouvelles.

Installation

$ pkg install py37-iocage
$ iocage activate zroot
ZFS pool 'zroot' successfully activated.

Comme mon système est bloqué sur FreeBSD 10.1 à cause d'ezjail, je récupère les sources de cette version pour iocage.

$ iocage fetch
********************************************************************************
fdescfs(5) is not mounted, performance may suffer. Please run:
mount -t fdescfs null /dev/fd
You can also permanently mount it in /etc/fstab with the following entry:
fdescfs /dev/fd  fdescfs  rw  0  0
********************************************************************************

Creating zroot/iocage
Creating zroot/iocage/download
Creating zroot/iocage/images
Creating zroot/iocage/jails
Creating zroot/iocage/log
Creating zroot/iocage/releases
Creating zroot/iocage/templates
Default configuration missing, creating one
[0] 11.2-RELEASE
[1] 11.3-RELEASE
[2] 11.4-RELEASE
[3] 12.0-RELEASE
[4] 12.1-RELEASE
[5] 12.2-RELEASE

Type the number of the desired RELEASE
Press [Enter] to fetch the default selection: (12.1-RELEASE)
Type EXIT to quit: 4
Fetching: 12.1-RELEASE

Je change le point de montage par défaut pour /usr/iocage :

$ zfs set mountpoint=/usr/iocage zroot/iocage

Pour améliorer les performances, je monte le système de fichier file-descriptor :

$ mount -t fdescfs null /dev/fd
$ echo "fdescfs /dev/fd  fdescfs  rw  0  0" >> /etc/fstab

L'environnement est prêt : j'ai les sources 10.1 pour mes jails.

Migration vers iocage

Création des jails iocage

Je veux récupérer toutes mes jails actuelles avec iocage :

$ for name in $(ezjail-admin list | awk '{ print $4 }' | tail -n +3); do iocage create -r 12.1-RELEASE -n $name -b; done

Récupération des données

Une fois que l'ensemble des jails sont créees, il faut récupérer l'ensemble des datas ezjail vers iocage et commencer par les stopper :

$ service ezjail stop
$ for name in $(ezjail-admin list | awk '{ print $4 }' | tail -n +3); do rsync -va --exclude-from=excludejail /usr/jails/$name/ /usr/iocage/jails/$name/root/ ; done

Le contenu du fichier d'exclusion :

/basejail
/bin
/boot
/dev
/lib
/libexec
/rescue
/sbin
/net
/proc
usr/bin
usr/include
usr/lib
usr/libexec
usr/sbin
usr/share
usr/libdata
usr/lib32
usr/ports
usr/sbin
usr/share
usr/src
usr/tests

Paramétrage spécifiques

Attribution des IPs en gardant celles d'origine :

$ for name in $(iocage list -qh | awk '{ print $1 }'); do ip4=`grep ip= /usr/local/etc/ezjail/$name | cut -f 2 -d '"'` && iocage set ip4_addr="${ip4}" $name; done

Autorisation des raw sockets :

$ for name in $(iocage list -qh | awk '{ print $1 }'); do iocage set allow_raw_sockets=1 $name; done

Désactivation de l'auto création du fichier resolv.conf :

$ for name in $(iocage list -qh | awk '{ print $1 }'); do iocage set resolver=/dev/null $name; done

Activation des jails au boot :

$ for name in $(iocage list -qh | awk '{ print $1 }'); do iocage set boot=on $name; done

Cas plus spécifiques

Certaines jails ont des paramètres un peu plus spécifiques notamment celles de zabbix comme expliqué dans un précèdent article. J'ai également une jail openvpn qui nécessite d'établir une route sur l'host directement et au démarrage de la jail. Pour se faire :

$ iocage set sysvshm=new zabbix
$ iocage set sysvsem=new zabbix
$ iocage set exec_prestart="/sbin/ifconfig tun0 inet 192.168.2.1/32 192.168.2.2 && /sbin/route add -net 192.168.2.0/24 192.168.2.2" openvpn
$ iocage set allow_tun=1 openvpn

Vérification

On peut démarrer ses jails et vérifier le bon fonctionnement.

$ iocage start webfront
$ iocage console webfront
webfront ~ ❯❯❯

Si les services tournent, que les datas sont présentes, c'est tout bon.

Upgrade vers FreeBSD 12.2

Dernière étape, passer sur la dernière RELEASE.

$ iocage fetch -r 12.2-RELEASE
Host: 12.1-RELEASE is not greater than target: 12.2-RELEASE
This is unsupported.

Il faut d'abord mettre à jour l'host cette fois ;-). L'host en 12.2, le fetch fonctionne correctement. Pensez à désactiver ezjail avant reboot de l'host :

$ sysrc -X ezjail_enable

Les sources récupérées, on peut passer à l'upgrade de chaque jails :

$ for j in $(iocage list -qh | awk '{ print $1 }'); do iocage upgrade -r 12.2-RELEASE $j ;done

jailname successfully upgraded from 12.1-RELEASE-p13 to 12.2-RELEASE-p4!
Please reboot the jail and inspect.
Remove the snapshot: ioc_upgrade_2021-03-11 if everything is OK

Comme à l'étape précédente, on vérifie que tout fonctionne. Si c'est le cas, on peut supprimer les snapshots :

$ for j in $(iocage list -qh | awk '{ print $1 }'); do iocage snapremove -n ioc_upgrade_2021-03-11 $j ;done

Ansible/iocage/jailname

J'utilise le connecteur jail avec ansible ansible_connection=jail. Avec iocage, j'obtenais cette erreur :

$ ansible jails -m ping
webfront | FAILED! => {
"msg": "incorrect jail name webfront"
}

Issue ouverte sur le github : il faut rajouter le préfixe ioc- sur chaques jails dans l'inventaire.

Suppression ezjail

Au bout de quelques jours d'uptime, on peut définitivement tout supprimer :

$ for j in $(ezjail-admin list | awk '{ print $4 }' | tail -n +3); do ezjail-admin delete $j; done
$ zfs destroy -r zroot/jails
$ pkg delete ezjail

Seul regret avec iocage, c'est sa lenteur due à python. Ezjail n'étant qu'un gros script sh, le temps d'exécution est incomparable…

by Pierre Boesch at March 17, 2021 11:00 PM

February 11, 2021

Luc Didry

Nouveauté dans le wiki : augmen­ter le score de spam pour une certaine adresse mail avec Rspamd

Exemple d’usage : comme je publie des modules Perl sur le CPAN, j’ai une adresse @cpan.org qui a été auto­ma­tique­ment créée, dont les mails sont trans­fé­rés chez moi, et qui se retrouve spam­mée à longueur de jour­née. Comme il y a quand même une possi­bi­lité d’avoir des mails légi­times dessus, je ne la bloque pas complè­te­ment. Par contre, augmen­ter le score de spam permet de faire passer des mails qui ont déjà un petit score de spam dans la caté­go­rie « Oui, c’est bien du spam ».

Pour voir la marche à suivre, c’est sur https://wiki.fiat-tux.fr/books/admi­nis­tra­tion-syst%C3%A8mes/page/rspamd#bkmrk-augmen­ter-le-score-d.

Crédit : Photo par Posses­sed Photo­gra­phy sur Unsplash

by Luc at February 11, 2021 09:39 AM

February 07, 2021

Luc Didry

Plein de choses à apprendre sur le plai­sir fémi­nin

On m’a récem­ment offert l’ac­cès au site OMGyes1, un site dédié au plai­sir fémi­nin, basé sur des études scien­ti­fiques menées en parte­na­riat avec des cher­cheuses et cher­cheurs de l’Indiana Univer­sity et du Kinsey Insti­tute auprès de 20 000 femmes entre 18 et 95 ans (ça fait pas mal).

Vous croyez vous y connaître en plai­sir fémi­nin ? Vous vous trom­pez lour­de­ment. Et très certai­ne­ment vous aussi, mesdames (si, si !).

« You know nothing, Jon Snow »

En effet, le plai­sir fémi­nin est encore assez tabou (par exemple, un seul manuel scolaire évoque le clito­ris lors des cours d’édu­ca­tion sexuelle, le fait qu’Odile Buis­son et Pierre Foldes ont eu des diffi­cul­tés à faire leurs recherches sur le plai­sir fémi­nin, recherches qui ont donné lieu à la première écho­gra­phie d’un clito­ris… en 2008 ! C’était hier ! Tiens allez hop, un petit lien vers une BD qui parle de ça : Check ta chatte).
En consé­quence de quoi, les femmes doivent apprendre toutes seules, cher­cher par elles-mêmes, expé­ri­men­ter et les hommes… pareil, mais il leur faut déjà commen­cer par s’in­té­res­ser au sujet et écou­ter leurs parte­naires (et mani­fes­te­ment, ce n’est pas une évidence pour tout le monde).
Il n’y a donc que peu de chances que vous sachiez tout…

On découvre sur OMGyes une multi­tude de pratiques que ces femmes utilisent pour avoir du plai­sir, orga­ni­sées par thèmes.

Chaque pratique comprend une ou plusieurs vidéos « théo­riques » où une femme (une par vidéo) va montrer une tech­nique person­nelle reliée au sujet, éven­tuel­le­ment en mimant avec les mains, expliquer pourquoi c’est bon… il y a parfois aussi un moment où elle parle de son expé­rience de la chose (par exemple, sur l’éja­cu­la­tion fémi­nine, une des inter­ve­nantes explique sa première fois, complè­te­ment inat­ten­due et comment son parte­naire l’a rassu­rée — elle croyait avoir uriné — et lui a évité toute honte, toute gène en lui expliquant qu’elle avait éjaculé et que ce n’était pas une chose dont il faut avoir honte2).

Il y a aussi toute une partie texte, avec des dessins, des statis­tiques (toujours inté­res­santes et parfois surpre­nantes !).

Jusque là, et même si c’est très inté­res­sant, on pour­rait se dire que c’est un site de conseils sexo plutôt clas­sique (bien que déjà au-dessus de moyenne en terme d’in­té­rêt)… et bien non ! Il y a deux compo­santes supplé­men­taires qui m’ont énor­mé­ment surpris :

  • encore des vidéos… mais cette fois, côté travaux pratiques : des femmes des vidéos pratiques (pas toutes) qui montrent la tech­nique expo­sée précé­dem­ment, mais en se touchant, la caméra parfois à quelques centi­mètres de leur sexe et, oui, vont parfois jusqu’à l’or­gasme devant nous. Ces femmes se montrent en toute confiance, expriment ce qu’elles ressentent. Il y a là, je trouve, quelque chose de magique et de beau. Bien évidem­ment, la tech­nique est bien plus claire ainsi montrée.
  • quelque chose que j’au­rais bien du mal à décrire autre­ment que « un simu­la­teur de stimu­la­tion ». Imagi­nez la photo du sexe d’une des inter­ve­nantes en gros plan (très gros plan)… qui réagit aux caresses ! L’in­ter­ve­nante nous donne quelques indi­ca­tions (un rappel de la tech­nique) en nous parlant, accom­pa­gnées de quelques flèches animées et c’est à nous de cares­ser ce sexe (pour le coup, vaut mieux utili­ser un smart­phone, la souris rend la chose étrange) selon ces indi­ca­tions. Là où c’est magique, c’est que la photo réagit exac­te­ment3 comme le ferait un véri­table sexe : on voit la peau s’en­fon­cer sous la pres­sion, les lèvres s’ou­vrir sous les cares­ses… Si on s’y prend bien, l’in­ter­ve­nante expri­mera son plai­sir, sinon elle nous guidera.

C’est un vrai plus au niveau didac­tique !

Les inter­ve­nantes sont d’âges divers (jeunes et moins jeunes… voire pas jeunes du tout), de diffé­rentes origines ethniques et de diffé­rentes tailles. Bref, vous n’au­rez pas que des jeunes filles blanches à la taille fine. Je ne sais pas pour vous, mais moi je trouve ça chouette 🙂

Elles ont cepen­dant toutes en commun (pour celles dont j’ai vu les vidéos, bien sûr : je n’ai pas encore tout vu) de déga­ger une certaine éner­gie quand elles parlent de leur plai­sir et sont beau­coup à rire à la fin, que ce soit dans les vidéos de travaux théo­riques ou pratiques. C’est beau à voir, vrai­ment 🤗

Bref : ce site n’est que du bon pour les femmes, pour les hommes, pour les céli­ba­taires, pour les couples et pour celleux qui sont plus nombreuses. Je le recom­mande chau­de­ment !

Vous pouvez visi­ter la page d’ac­cueil de OMGyes sans crainte : il n’y a aucun contenu expli­cite dessus 😉

Crédit : Photo par Yolanda Sun sur Unsplash


  1. et c’est trop chouette 🤗 

  2. moi j’dis « Respect » à ce gars d’avoir réussi à désa­mor­cer la gène aussi bien et aussi vite 

  3. bon, pas tout à fait complè­te­ment exac­te­ment, je pense qu’il y a des limi­ta­tions tech­niques, mais c’est vrai­ment TRÈS impres­sion­nant ! 

by Luc at February 07, 2021 08:20 PM

January 01, 2021

Luc Didry

Contra­cep­tion mascu­line : la vasec­to­mie

Non, ça ne va pas parler de tech­nique aujourd’­hui.

Inéga­li­tés femmes/hommes

On fait trop souvent peser sur les femmes le poids de la contra­cep­tion, ajou­tant ainsi à leur charge mentale déjà bien lourde. Non seule­ment, elle s’en chargent le plus souvent, mais en plus ça n’est pas sans risque pour leur santé.

Les méthodes de contra­cep­tion mascu­line sont très en retard.
Détail « amusant » : la recherche sur une pilule (ou injec­tion, je sais plus) d’hor­mones pour les hommes avait été inter­rom­pue parce que ça avait des effets secon­daires comme la prise de poids, des maux de têtes… tiens, c’est marrant, pile les effets secon­daires de la pilule pour les femmes. C’est que nous, les hommes, sommes des petites choses fragiles (ne parlons pas de la peur de la perte de « viri­lité », y en a qui s’éva­noui­raient).

Je n’ai parlé que de la pilule, mais l’im­plant et le stéri­let ne sont pas sans effets secon­daires non plus… Regar­dez la rubriques « Quels sont ses incon­vé­nients » de cette page pour l’im­plant et de cette page pour le stéri­let (qu’il soit au cuivre ou hormo­nal).

Quand on regarde le tableau compa­ra­tif des méthodes contra­cep­tives sur le site https://www.choi­sir­sa­con­tra­cep­tion.fr (site édité par Santé publique France), on voit… une seule méthode de contra­cep­tion à la charge exclu­sive des hommes (exclu­sive : seul l’homme peut y avoir recours, tout comme seule la femme peut prendre la pilule ou utili­ser un stéri­let), deux méthodes (dont une non-exclu­sive à l’homme) si on ajoute le préser­va­tif mascu­lin (je ne compte pas le préser­va­tif fémi­nin, je vois mal un homme se trim­bal­ler avec ça, déjà qu’on a du mal à en trou­ver).

Il existe pour­tant déjà des méthodes de contra­cep­tion pour les hommes !

Il existe depuis 30 ans un slip qui remonte les testi­cules près du corps, augmen­tant ainsi leur tempé­ra­ture, ce qui bloque la sper­ma­to­ge­nèse. On peut obte­nir le même résul­tat avec un anneau en sili­cone appelé andro-switch (vous pouvez voir l’avis d’un utili­sa­teur de cet anneau en suivant le tag #andros­witch sur Masto­don).

Et puis, il y a la solu­tion radi­cale : la vasec­to­mie. Cette opéra­tion consiste à couper ou bloquer les canaux défé­rents amenant les sper­ma­to­zoides. Rassu­rez-vous, les petites natures qui passe­raient par ici, il ne s’agit pas de couper les testi­cules, non, juste de bloquer la sortie.

Mon expé­rience

J’ai choisi voici près de deux ans (au deuxième semestre 2018) de me faire vasec­to­mi­ser. J’étais alors céli­ba­tai­re… je l’étais toujours lorsque j’ai commencé à écrire ce billet en septembre 2019 (oui, je l’ai un peu beau­coup laissé traî­ner 😅) mais j’ai depuis eu deux rela­tions à long terme.

Je ne vais pas lais­ser planer de suspense quant à la réac­tion de mes parte­naires : j’en ai retiré deux énormes « MERCI ! ».
Parce que ça leur enlève un poids des épaules, parce que ça leur évite d’avoir à subir les effets secon­dai­res… bref, pile deux des raisons qui m’ont fait choi­sir la vasec­to­mie (les autres étant que je ne veux plus d’en­fants et que je n’ai pas envie d’uti­li­ser une méthode qui présente le moindre risque d’inef­fi­ca­cité si j’ou­blie de l’uti­li­ser, je me connais, ça aurait été très risqué).

Mon parcours pour la vasec­to­mie a été long, mais pas compliqué :

  • visite chez le méde­cin trai­tant
  • visite au CHU chez un urologue, où on m’a bien tout expliqué (même si je m’étais déjà bien rensei­gné sur le net) : l’as­pect défi­ni­tif de la chose, le geste effec­tué, etc
  • 4 mois d’at­tente (histoire d’être sûr que je veux y passer)
  • encore une visite au CHU chez l’uro­logue pour dire que je veux vrai­ment le faire (signa­ture d’un accord écrit), prise de rendez-vous pour l’in­ter­ven­tion
  • un petit tour au CECOS histoire d’y conser­ver mes gamètes au cas où (la conser­va­tion des gamètes est payante, le prix dépend de votre CECOS et le rembour­se­ment dépend de votre mutuelle)
  • un sper­mo­gramme (pour voir quel est le niveau normal d’ac­ti­vité de mes sper­ma­to­zoïdes, leur nombre…)
  • inter­ven­tion en ambu­la­toire : j’ar­rive le matin, je repars le soir (atten­tion, quelqu’un doit venir vous cher­cher et il ne faut pas dormir seul chez soi, il faut avoir quelqu’un au cas où). Même si on a donné son accord écrit, on reste libre de dire stop à tout moment 🙂
  • un autre sper­mo­gramme 3 mois après pour voir si ça a bien fonc­tionné

L’in­ter­ven­tion ne m’a laissé que deux toutes petites cica­trices, une sur chaque testi­cule et la gène de la cica­tri­sa­tion n’a pas duré bien long­temps.

Au niveau libido : aucun chan­ge­ment. Au niveau éjacu­la­tion : aucun chan­ge­ment visible (le volume des sper­ma­to­zoïdes dans le sperme est de l’ordre de 3 à 5% d’après mes souve­nirs). Il n’y a aucun effet secon­daire 🙂

Notez que les risques liés à la vasec­to­mie sont toute­fois les mêmes que pour toute inter­ven­tion chirur­gi­cale : infec­tion, saigne­ments, etc.

Conclu­sion

Je ne regrette pas un seul instant ma déci­sion.
C’est rapide (l’in­ter­ven­tion, pas tout le proces­sus, hein !), rela­ti­ve­ment indo­lore (j’ai déjà eu des croûtes aux genoux qui m’ont plus déran­gées que la cica­tri­sa­tion de la vasec­to­mie), gratuit (l’in­ter­ven­tion ne coûte quasi­ment rien, 65€, et c’est pris en charge par la sécu­rité sociale), j’ai une sauve­garde (mes gamètes conser­vés au CECOS, je pense que je les aban­don­ne­rais d’ici quelques années) et surtout, surtout : les remer­cie­ments de mes parte­naires ! 🤗

Crédit : Photo par Annie Spratt sur Unsplash

by Luc at January 01, 2021 11:11 AM

December 29, 2020

Alexandre Bailly

Bilan de 2020

Petit bilan de l'année écoulée.

L'année 2020 fut assez compliquée, entre les confinements, les couvre-feu, et autres soucis IRL.

Bilan de l'année

Au niveau associatif

Cette année fut assez difficile au niveau associatif. L'AGO 2019 de Lorraine Data Network a pu se faire sans problème en février dernier, avec un bilan pas exceptionnel mais pas totalement catastrophique.

Je m'étais posé la question, à savoir : « est-ce que je reste membre du collège solidaire ou bien j'en sors et reste simple membre. » Je suis assez lassé au niveau associatif, et l'année 2020 n'a fait qu'amplifier cette lassitude.

En ajoutant une charge de travail assez lourde, j'en suis au stade où le PC reste éteint quand je rentre. Le monde associatif n'étant plus prioritaire.

Bref, je pense présenter ma démission lors de la prochaine AGO.

Au niveau En ligne

Les services tournent sans trop de problème, et sont a peu près à jour.

Au niveau documentation, c’est simple : je n'ai quasiment rien écrit.

Côté blog, la migration de PluXML vers Pélican s’est faite sans trop de problèmes. Il reste 2-3 pages à corriger. Je pense notamment à l’article sur l’ajout de points sur une carte Open Street Map, avec Leaflet.js. Le thème, simple et sobre me convient, avec la gestion des MediaQueries pour adapter les couleurs en fonction des préférences de la personne visitant le site (thème clair par défaut ou thème sombre).

J'ai quelques articles en cours de rédaction, mais rien de publiable en l'état. La recherche de documentation, la lecture et la compréhension prenant pas mal de temps.

Côté gopher, j'ai ajouté les articles du blog, les fan-fiction de Et La Terre Éclata, plus deux ou trois autres trucs.

Au niveau Hors ligne

Cette année, à cause du confinement, c'est simple, il n'y a pas eu de séance de karaoké. Je n'ai réinstallé que récemment Karaoké Mugen, en version 4.18.

Quelques achats de matériel, comme un lecteur de code barre (article à rédiger) et un NAS (article à rédiger). Quelques pouëts sur le Fediverse concernant ce matériel ont été publiés.

Quelques bidouillages avec ffmpeg (documentation à mettre à jour).

Quelques mises à jour et bidouillages sur le téléphone sous SailfishOS 3.4 (idem, à documenter).

Entre deux périodes de confinement, j'ai fini par changer de FAI, me revenant au final moins cher, avec plus de services, et un débit montant (théorique) multiplié par un peu plus de deux (300 Mbps -> 700 Mbps), et un débit descendant multiplié par beaucoup (synchro 300 Mbps -> 5 Gbps).

L'ajout d'un bouton RESET, prévu de longue date, et enfin en place sur mon Tandy 1000 HX. Un article de blog a été publié à ce sujet.

Au niveau IRL

Quasiment pas d'activité sportive, uniquement de la marche à pieds et de la trottinette (pas électrique) quasiment au quotidien.

Prévisions pour 2021

Quand le gros projet IRL me laissera un peu de temps…

Client KM pour SailfishOS

Pour l'instant, c'est toujours au point mort. J'espère juste pouvoir reprendre le projet et avancer dessus.

Projet LYAN

Pareil, de l'écriture à faire dessus. J'ai quelques idées, mais pas suffisamment de temps pour rédiger le tout.

ffmpeg/mpv

Ajouter de nouveaux trucs et astuces dans la doc.

Projet V

Aucune annonce officielle par rapport à ce projet. Juste une idée qu'il me faudra implémenter.

Projet E

Un petit projet d'électronique pour l'instant en suspens.

Projet M

Idem, un autre petit projet d'électronique démarré en 2020 et également en suspens.

Blog

Finir d'écrire les articles en cours, et en rédiger de nouveaux.

Migrer les services sur un nouveau serveur

Présentement, cela me coûte ~450€ par an pour deux serveurs dédiés qui commencent à accuser leur âge. Du coup, j'hésite entre rapatrier certains services chez moi, ou a migrer sur un autre serveur dédié, nettement plus puissant (mais pas au même tarif).

Si je les rapatrie chez moi, il me faudra regarder ce que je peux utiliser comme micro-serveur.

Conclusion

Un petit paquet de projets pour 2021. On verra bien si j'arrive à les mener à bien.

by alex at December 29, 2020 11:00 PM

October 03, 2020

Alexandre Bailly

Fibre optique - épisode 3

Contexte

J'ai changé de FAI¹ courant juillet (après le confinement), pour diverses raisons :

  • quelques problèmes de Peering bien agaçants avec Orange, notamment avec des serveurs dédiés situés en Allemagne ;
  • l'option appels vers les téléphones mobiles qui me rajoute +5€ sur la facture par mois sur la ligne fixe ;
  • l'immeuble couvert par d'autres opérateurs Fibre ;
  • un concurrent proposant mieux² pour moins cher³.

Après deux semaines d'attente et l'intervention d'un techicien à domicile (+ intervention dans le point de mutualisation pour changer de porte parce que FAI différent), la nouvelle liaison fibre fut opérationnelle. Seul point négatif : il a fallu douze jours supplémentaires pour porter le numéro de téléphone fixe, et l'assistance de ce nouveau FAI ne fut clairement pas à la hauteur, donnant ce genre de réponse :

  • ça sera porté quand ça sera porté ;
  • ça sera opérationnel prochainement ;
  • bientôt.

Bref, une journée de plus d'attente et je demandais l'annulation de la portabilité du numéro et résiliation de l'abonnement (jusqu'à 14 jours pour changer d'avis).

J'ai rudement bien fait d'attendre la fin du confinement pour changer de fournisseur, parce qu'étant en télétravail pendant cette période difficile, le téléphone était absolument indispensable.

Bref, abonnement fonctionnel début août.

Et accessoirement, je passe d'une Livebox Play poussive avec l'ONT Huawei séparé à une Freebox Pop avec l'ONT au format SFP, inséré directement dans sa cage prévue sur la Freebox. Un truc en moins à brancher sur la multiprise, ce n'est pas plus mal.

Et comme toujours : pas de télévision ni de player/décodeur TV. Juste un abonnement Internet + téléphone.

La Freebox Pop (blanche), avancée (normalement, elle est plus loin dans le meuble) pour la photo, avec les informations sur les débits affichés à l'écran.

À noter : j'ai imprimé des petits patins circulaires (pas visibles sur la photo) pour la surélever pour améliorer le refroidissement de la box.

Débits (synchro) 5 Gbit/s descendant, 700 Mbit/s montant. L'ONT supportant jusqu'à 10 Gbit/s descendant et 1 Gbit/s montant.

Limitations ?

La Freebox disposant de deux ports à 1 Gbit/s et de un port à 2,5 Gbit/s, plus le wifi, il n'est malheureusement pas possible de relier un PC avec une liaison de 5 Gbit/s.

Interface d'administration de la Freebox. Mon Pihole (Akira) est raccordé en ethernet 100 Mbit/s (amplement suffisant pour le serveur DNS). À noter : Ryoko est (déjà) en 2,5Gbit/s, la capture d'écran fut faite après la rédaction de l'article.

Dans la pratique, une connexion 300 Mbit/s est largement suffisante pour afficher des pages web. la différence est flagrante plutôt en téléchargement, à condition que le serveur en face ait une connexion Internet qui soit suffisamment élevée.

Sur la carte mère de mon PC, la carte réseau Realtek est de « seulement » 1 Gbit/s. Ce qui est déjà bien, mais c'est dommage de ne pas pouvoir utiliser ce que la Freebox propose.

Nouvelle carte réseau

Après quelques recherches, mon choix s'est porté sur une carte générique basée sur un chipset Realtek RTL8125, supportant les liaisons ethernet 10 Mbit/s, 100 Mbit/s, 1 Gbit/s et 2,5 Gbit/s. Modèle générique m'ayant coûté moins de 30 €, frais de port compris.

À noter : la présence d'un dissipateur thermique sur le chipset Realtek.

Ce chipset étant supporté dans le noyau Linux (mainstream), il n'y aura donc pas de surprises. En fait, je n'ai même pas eu besoin de le compiler, le driver Realtek 8169/8168/8101/8125 supportant ce chipset (vérifié et validé avec le noyau 5.8.5 utilisé actuellement).

Installation de la carte

Bon, pas de grosses surprises à ce niveau là, vu que j'ai monté cette tour.

Sauf que niveau emplacements libres sur le boîtier, il n'y en a pas tant que ça.

Emplacements libres. À noter : l'équerre au niveau du port PCIEX-16-2 a été retirée.

Je préfèrerais laisser l'équivalent d'un slot libre au niveau des ventilateurs de la carte graphique, pour le refroidissement (elle a atteint les 70°C lors de benchmarks).

Le truc avec la nappe, c'est le port série (connecteur DB9), mais pas envie de le déplacer.

Du coup, le plus simple, c'est d'utiliser le port PCIEX-16-2 (c'est parfaitement compatible), le PCIEX-1-1 étant trop bas et le PCIEX-1-2 étant masqué/occupé par l'équerre avec le DB9.

La carte, installée. Plus qu'à visser l'équerre et refermer le capot.

Lors du démarrage du PC, j'ai pensé à désactiver la carte ethernet sur la carte-mère ; étant inutilisée, cela ne sert à rien de la laisser active.

Une fois sous GNU/Linux, vérifions si la carte est bien reconnue.

lspci | grep Ethernet

05:00.0 Ethernet controller: Realtek Semiconductor Co., Ltd. RTL8125 2.5GbE Controller

Ok, là, c'est bon.

Plus qu'à corriger le nom de la carte réseau dans /etc/network/interfaces, la carte étant enp5s0 et non plus enp3s0.

Ne pas oublier de relancer le service networking pour que cela soit pris en compte.

Et maintenant, place aux tests.

Test

Alors, là, ça se passe de commentaires…

Capture vidéo du test de débit

Résultat :

2 291,37 Mbit/s descendant, 675 Mbit/s montant. La latence varie entre 5 et 20 ms en fonction du serveur de destination.

Verdict

Sans surprise, la carte fonctionne parfaitement. La connexion est stable, aussi bien au niveau PC comme au niveau Freebox.

On verra ce que ça donnera sur la durée.

---

¹ : Fournisseur d'Accès à Internet.

² : Débit plus élevé, appels vers les fixes ET mobiles inclus et non en option, meilleur matériel, IPv4 fixe, avec les 65 536 ports disponibles, préfixe IPv6 pas dynamique, port 25 déblocable, configuration DNS non verrouillée au niveau routeur, meilleure couverture wifi, etc.

³ : 29,90€ par mois la première année, puis 39,90€ par mois. Mais avec une réduction de 10€ sur l'abonnement mobile (qui passe donc de 19,90€ à 9,90€ par mois). Soit passer de 34,90 + 19.90€ par mois à 29,90 + 9,90€ par mois. Même à 39,90€ + 9,90€ après la première année me revient toujours moins cher que ce que me proposait Sosh/Orange.

by alex at October 03, 2020 10:00 PM

September 13, 2020

Alexandre Bailly

Reset sur Tandy 1000 HX

Comment ajouter un bouton reset sur ce compatible PC-XT datant de 1987.

Un article pour le #septandy 2020.

TL;DR

Trop long, flemme de lire.

Souder un bouton poussoir sur le condensateur C132. L'appui sur ce bouton doit court-circuiter le condensateur pour provoquer le RESET de la machine.

La machine

Tandy 1000 HX

Ce compatible IBM PC, sorti en 1987, est doté d'un processeur Intel 8088, cadencé à 7,16 MHz (mode turbo, la fréquence de 4,77 MHz étant accessible via une combinaisons de touches au démarrage de la machine ou pouvant être définie dans les paramètres du BIOS). Le Bios est celui de Phoenix Technologies. 256 ko de RAM sont présents (extensible à 640 ko de RAM au total via la carte d'extension Tandy Memory Expansion Board 25.1062). Un lecteur de disquettes 3"½ simple densité (720 ko) est présent, avec un emplacement pour un second lecteur de disquettes dans le même format, et un connecteur d'extension pour un troisième lecteur, cette fois, externe, pouvant être un lecteur 3"½ ou 5"¼.

Particularité de cette machine : MS-DOS 2.11 est présent sur une ROM dans la machine, et il est alors possible de démarrer sans disquette de démarrage.

Autres particularités : pas de possibilité d'ajouter un disque dur (pas d'emplacement pour), et les connecteurs ISA ne sont pas dans le format standard (on peut aujourd'hui utiliser des adaptateurs).

Carte d'extension mémoire Tandy originale.

Les deux ports d'extension sont visibles en haut sur la photo.

Le RESET

Aussi bizarre que cela puisse paraître, il n'y a pas de bouton RESET présent sur les Tandy 1000 EX et HX. Ce bouton est bel et bien présent sur d'autres modèles de Tandy 1000.

Le RESET sur les processeurs 808x

À savoir : le reset ne s'effectue pas au niveau du processeur, mais au niveau du générateur d'horloge, pour les machines à base de processeur 8088 et 8086.

Schéma d'illustration :

Source : https://www.csee.umbc.edu/courses/undergraduate/CMPE310/Spring05/cpatel2/slides/html_versions/chap9_lect03_8086_chipset.html

Ici, la broche /RES est reliée à un bouton RESET (relié à la masse, normalement ouvert), et au 5V (via une résistance de 10kΩ et un condensateur de 10 μF). À l'allumage, la broche /RES est à l'état bas (0V). Le condensateur de 10 μF se charge via la résistance de 10 kΩ (ce qui prend environ 100 ms). Une fois chargé, la broche /RES est alors à l'état haut. Cette temporisation permet d'être sûr que la tension délivrée par l'alimentation est stable. Tant que cette broche est à l'état bas, c'est comme si le bouton RESET restait enfonçé.

L'état RESET sur le processeur (et autres chipsets/puces) est alors géré via la broche RESET du générateur d'horloge.

Bon, ça, c'est la théorie.

Le RESET sur le Tandy 1000 HX

En pratique, ça donne quoi sur le Tandy 1000 HX ?

Tout d'abord, après une observation attentive, de la carte-mère, il n'y a pas de chipset Intel autre que le 8088.

Les seuls chipsets potentiels générant les signaux d'horloge et dont le quartz 16.0-28.6 MHz est à proximité sont ceux de NEC et de Texas Instruments.

La lecture du manuel technique est alors obligatoire. Heureusement, cette doc est très facile à trouver.

Après une lecture longue et fastidieuse de "Tandy 1000 HX Technical Reference", le schéma à la page 69, Timing and CPU est à analyser.

Notamment cette partie du schéma, en haut à gauche.

Se pourrait-il que ?

La broche 21 de U20 – Light Blue – est appelée RSTIN, et sur cette broche, on retrouve la même disposition que celle plus haut, avec ici, une résistance de 47 kΩ et deux condensateurs de 10 µF et 0,1 µF. Soit un temps de charge des condensateurs de l'ordre de ~470 ms. Le bouton RESET, ici, n'est ni câblé, n'est ni présent sur le schéma.

Concrètement, ce bouton serait à câbler au niveau du point de liaison entre la résistance de 47 kΩ (R29) et le condensateur de 10 µF (C132) ; et la masse. Ou plus simplement : shunter (court-circuiter) le condensateur C132.

Montage de test

Après vérification, re-vérification, et relecture de la doc (notamment des diagrammes), il est temps de câbler.

À noter : sur ce diagramme, il y a bien une section au milieu à droite pour le RESET (RSTIN).

Ayant des bouton poussoir (de type NO, Normalement Ouvert) sous la main, et des câbles DuPont, j'ai soudé deux fils sur un bouton (et isolé avec de la gaine thermorétractable), et les ai relié à deux mini grip-fil, et les ai branchés sur le condensateur C132 (à noter, ça fonctionne aussi avec C131 qui est monté en parallèle).

Le montage temporaire étant en place, faisons les tests.

Smoke test

N'arrivant plus à remettre la main sur le moniteur Tandy (RGBI), j'ai utilisé la sortie vidéo composite de la machine via un upscaler CVBS basique pour pouvoir brancher un écran moderne (en HDMI) dessus. C'est pas top, mais ça fonctionne.

Donc branchement sur la prise de courant, puis allumage.

Point positif : rien n'a explosé et pas de libération de fumée magique.

Après quelques secondes d'attente, un appui sur le bouton, et… ça fonctionne ! Le RESET est bel et bien opérationnel.

Démo en vidéo

Tout fonctionne. Retirons le montage temporaire.

Choix de l'emplacement, perçage et soudures

Concrètement, rien de compliqué. Prendre deux fils, torsadés ou non (j'ai utilisé une chute de câble réseau), couper à la bonne longueur (ça ne sert à rien de faire passer des fils de 3 mètres de long), ne pas oublier de passer de la gaine thermo avant de souder le bouton.

Le plus compliqué fut en fait le perçade du boîtier, en partie à cause du blindage (que je voulais laisser en place), et aussi et surtout parce qu'il y a très peu d'endroits possibles où placer le bouton poussoir. Accessoirement, le boîtier en plastique étant courbé et non plat, ça n'arrange pas les choses.

L'emplacement qui me semblait le plus pratique (pour moi, en tout cas), c'est entre la prise jack 3,5 mm et le potentiomètre servant à régler le volume audio.

Un coup de Dremel fut nécessaire pour "aplatir" le bord intérieur, la courbure empêchant de visser correctement le bouton. Le perçage en lui-même à été fait à la main, avec un alésoir conique (utilisé notamment en modélisme).

Au niveau du chemin des fils, il faudra faire attention à la position du blindage, du support pour les lecteurs de disquette et des différents connecteurs pour le clavier. Ne pas hésiter à faire des tests avant de couper et souder les fils.

Au niveau soudures, concrètement, rien de compliqué. Si c'est fait correctement, il n'y a pas besoin de mettre de la colle chaude, ni même de l'epoxy.

Si jamais vous avez besoin de mettre de la colle chaude ou de l'epoxy pour faire tenir une soudure ou la "renforcer", c'est qu'il y a un problème. Bref, ne faites jamais ça.

Pour le blindage, il m'a fallu couper une partie à la cisaille, pour que je puisse le remettre en place.

Remontage de la machine

Normalement, rien ne doit gêner, à aucun moment.

Le fait d'avoir mis de la gaine thermo au niveau du bouton permet d'empêcher tout court-circuit intempestif avec le blindage (et provoquant voire bloquant le RESET).

Plus qu'à remettre le capot et la carte d'extension mémoire. Rien de compliqué.

Conclusion

Finalement, le plus long fut surtout la lecture de la doc et la recherche de LA solution, celle présentée ici.

Ce qui est surprenant en fait, c'est que tout a été prévu pour ajouter un bouton RESET sur cette machine, mais celui-ci n'a jamais été câblé. Pourquoi ? On ne le saura probablement pas.

À noter : la raison pour laquelle je voulais ajouter un bouton RESET, c'était pour comprendre pourquoi la machine plantait aléatoirement, ou ne détectait pas toute la ram, voire foirait le test mémoire à l'allumage/redémarrage de la machine.

En fait, c'était tout simplement le cavalier sur la carte d'extension mémoire qui avait sauté. Celui qui indique quels sont les emplacements mémoire remplis (une partie ou la totalité).

Une fois un cavalier (le truc bleu sur la photo) placé sur la carte, plus aucun problème.

by alex at September 13, 2020 10:00 PM

September 09, 2020

Luc Didry

Nexi, un nouveau logi­ciel de gestion de listes

Le besoin

Je cher­chais un logi­ciel me permet­tant de gérer la liste des bandes dessi­nées que je souhaite ache­ter.

Le cahier des charges des éléments des listes était rela­ti­ve­ment simples :

  • un nom ;
  • éven­tuel­le­ment un numéro, pour indiquer le tome de la série à ache­ter, incré­men­table en un clic (une fois que j’ai acheté un tome, je vais logique­ment avoir envie d’ache­ter le suivant) ;
  • un état publié / pas encore publié, pour garder trace des livres dont j’at­tends la publi­ca­tion.

Voilà qui est rela­ti­ve­ment simple… mais pas moyen de trou­ver exac­te­ment ce que je voulais ! Le plus proche était Carnet qui en plus avait l’avan­tage d’être synchro­ni­sable avec un serveur Next­cloud et d’avoir une appli­ca­tion Next­cloud, mais il ne faisait pas les numé­ros, et le passage d’une liste à l’autre est un peu lent (reve­nir à l’écran des listes, retrou­ver l’autre liste, cliquer dessus).

Bref, ça me déman­geait. Et quand ça démange un libriste, le libriste se gratte.

Le déve­lop­pe­ment

N’ayant pas envie d’ap­prendre à déve­lop­per une appli­ca­tion Android (Java ? Non, merci, ça ira), j’ai commencé à coder un site web simple (HTML/CSS/JavaS­cript) en me disant que je pour­rais toujours la trans­for­mer en progres­sive web app (PWA) par la suite.

Une PWA est une page web qui s’ins­talle sur votre télé­phone comme une appli­ca­tion native. Les éven­tuelles données sont stockées de façon locale si vous êtes hors ligne et synchro­ni­sées lors du retour en ligne.

J’ai donc déve­loppé mon appli­ca­tion, que j’ai commencé par appe­ler « Next Book », puisque le but était de garder la trace de mes livres à ache­ter.
Cepen­dant, après discus­sion avec quelques amis, je me suis rendu compte que je pouvais utili­ser cette appli­ca­tion pour n’im­porte quel type de liste : une liste de courses, avec le nombre d’ar­ticles à ache­ter par exemple.
Je l’ai donc renom­mée en Nexi (pour NEXt Item, « élément suivant » en français).

Au menu, donc :

  • appli­ca­tion en javas­cript avec Alpi­neJS ;
  • CSS généré avec Tail­windCSS ;
  • données stockées en local via IndexedDB grâce à JsStore ;
  • utili­sa­tion de l’ex­ten­sion de navi­ga­teur WAVE pour m’as­su­rer de l’ac­ces­si­bi­lité de Nexi.

À mon cahier des charges, j’ai ajouté quelques petites choses :

  • gestion des thèmes clairs et sombres grâce à la fonc­tion­na­lité CSS prefers-color-scheme ;
  • multi-langue avec détec­tion du langage du navi­ga­teur mais avec possi­bi­lité de choi­sir la langue que l’on souhaite (code large­ment repris de celui de WemaWema) ;
  • possi­bi­lité de décré­men­ter le nombre (pour une liste de course, ne pouvoir qu’in­cré­men­ter le nombre n’est pas très pratique) ;
  • export et import des données.

L’ap­pli­ca­tion

Une application de gestion de liste, avec une liste remplie de différents éléments
Voici à quoi ressemble Nexi

Aucune donnée n’est envoyée à un quel­conque serveur, tout reste dans le navi­ga­teur. J’avoue que j’avais envie d’al­ler vite et pas du tout envie de devoir déve­lop­per un serveur en plus.

Vous pouvez utili­ser Nexi sur https://nexi.fiat-tux.fr/ (qui est une Gitlab Page sur Frama­git, j’avais la flemme de rajou­ter un site sur mon serveur).

S’il y en a qui ont utilisé l’adresse que j’ai diffusé sur Masto­don ces derniers jours, https://fiat-tux.fr/nexi, je vous conseille d’ex­por­ter vos données et d’al­ler sur la nouvelle adresse pour les y impor­ter : je ne sais pas pendant combien de temps je garde­rais l’an­cienne adresse active.

Pour ceux qui se demandent quel est l’ori­gine de logo, c’est fort simple : Nexi me permet de passer rapi­de­ment un élément de la sous-liste « En cours » du dessus à la sous-liste « Suivant » du dessous. Le logo est donc une repré­sen­ta­tion de cette fonc­tion­na­lité : ce sont deux flèches, l’une poin­tant vers le haut et l’autre vert le bas 🙂

Une flèche verte pointant vers le haut, sur une flèche mauve claire pointant vers le bas, sur un fond mauve foncé
Le logo de Nexi

Pour instal­ler Nexi sur votre smart­phone, allez sur le site puis regar­dez dans le menu de votre navi­ga­teur : Fire­fox me propose un simple mais effi­cace « Instal­ler » (j’ignore comment font les autres navi­ga­teurs).

Le code

Nexi est publiée sous les termes de la GNU Affero Gene­ral Public License v3.0.

Le dépôt git de Nexi est sur Frama­git : https://frama­git.org/fiat-tux/hat-soft­wares/nexi, n’hé­si­tez pas à créer des tickets et à contri­buer, ou à instal­ler Nexi chez vous : c’est aussi simple que de dépo­ser les fichiers du dépôt sur le serveur web 🙂
Il est aussi possible de contri­buer en tradui­sant Nexi sur https://weblate.frama­soft.org/projects/nexi/fron­tend/.

EDIT 10/09/2020 : ajout de la licence.

Crédit : Photo par David Ballew sur Unsplash

by Luc at September 09, 2020 05:19 PM

July 18, 2020

Alexandre Bailly

Déploiement terminé du nouveau blog

La mise en place de la nouvelle version du blog est terminée.

Ancienne version du blog

L'ancienne version du blog est toujours accessible à cette adresse : https://blog.chibi-nah.fr/oldblog/ Les commentaires sont bien entendu désactivés.

Nouvelle version du blog

Bien entendu, le déploiement de la nouvelle version ne s'est pas produite sans erreur :

remote: rsync: open "blog/deploiement-termine.html" failed: Permission denied (13)
remote: rsync error: some files/attrs were not transferred (see previous errors) (code 23) at main.c(1207) [sender=3.1.3]
To blog: blog.chibi-nah.fr.git
   da63214..4194076  master -> master

Là, c'est bon, c'est corrigé.

Il ne me reste "plus" qu'à écrire de nouveaux articles… mais ça, c'est une autre histoire.

Flux RSS/Atom

"Normalement", ça devrait être bon avec de la réécriture d'URL (RewriteRule) et une redirection 302 vers la nouvelle adresse du flux RSS (il n'y a plus de flux par catégorie).

by alex at July 18, 2020 10:00 PM

July 04, 2020

Alexandre Bailly

Nouveau blog (2020)

Le nouveau blog est maintenant en place. À la place de PluXML, c'est maintenant au tour de Pelican de gérer le contenu.

Changements

Au niveau changement, le plus visible est probablement le changement du thème. Cependant, le procédé pour la rédaction des articles est complètement différent.

Les articles sont désormais stockés au format Markdown (pour ceux écrits par le passé), au format reStructuredText pour les nouveaux articles, et cette fois, tout est versionné et géré avec git.

Par exemple, pour écrire cet article, je tape présentement dans Visual Studio Code, sur mon PC, dans un fichier texte au format rst. Pour la publication, c'est Pelican qui s'en charge automatiquement dès que j'ajoute l'article dans git (git hook). Simple, rapide, et avec peu de contraintes.

Anciens articles

Pour les anciens articles, le script d'import a pu convertir le contenu des articles, mais pas les métadonnées (date de publication, url). J'ai du repasser sur tous les articles pour ajouter ces informations, de manière à ne pas casser les liens existants vers les articles du blog. Cependant, certaines pages avaient du contenu supplémentaire, sous forme de son ou de vidéo, le script ne les a pas importés. Il me faudra donc repasser sur chacune de ces pages et ajouter le code supplémentaire pour gérer ces médias.

Commentaires

Concernant la gestion des commentaires, ça va être très simple : je ne vais plus m'embêter avec. Les anciens commentaires n'ont pas été repris, et je n'ai pas l'intention ; dans un premier temps, en tout cas ; de les reprendre.

Pour tout commentaire, le plus simple sera de passer par le Fediverse (vous savez comment me joindre).

Conclusion

En n'ayant plus de grosses contraintes au niveau écriture me permettra d'écrire plus d'articles de blog dans les prochains mois ? Je ne m'avancerai pas trop dessus, mon emploi du temps (professionnel) étant bien chargé jusqu'à février 2021.

by alex at July 04, 2020 10:00 PM

June 28, 2020

Luc Didry

Γνῶθι σεαυτόν, mais avec des logi­ciels libres

Γνῶθι σεαυτόν, Gnothi seau­ton, « Connais-toi toi-même » en français (hop, lien Wiki­pé­dia).

Les grecs ne pensaient sans doute pas au quan­ti­fied self (mesure de soi), mais moi, oui.

Je ne suis pas un foufou de la mesure de soi, mais ces derniers temps… disons que j’ai des raisons de m’y inté­res­ser.
Le problème, récur­rent de nos jours, est que quand on a un truc qui prend des mesures, on doit géné­ra­le­ment les refi­ler (les mesures) à une appli­ca­tion ou un site, bref, on s’en dépos­sède allè­gre­ment.

Mais nous avons de la chance, il existe des logi­ciels libres qui nous permettent de garder nos mesures pour nous.

Petit tour des logi­ciels et appli­ca­tions libres que j’uti­li­se…

Gadget­bridge

Il y a de cela plusieurs années, j’ai souhaité une montre connec­tée pour comp­ter mon nombre de pas quoti­diens : ayant un mode de vie très séden­taire, je souhai­tais m’as­su­rer que je me bougeais suffi­sam­ment les fesses.

J’ai acheté un brace­let Angel sensor car il était open source. Je vous la fais courte : j’ai eu le machin (cher pour ce que c’était), une appli­ca­tion de test (vrai­ment pas utile, c’était pour montrer les possi­bi­li­tés du SDK) et peu de temps après, la boîte a cessé tout déve­lop­pe­ment et toute commu­ni­ca­tion. Bref, c’est tombé à l’eau.
Cepen­dant, ce projet m’a fait connaître Gadget­bridge, une appli­ca­tion Android libre qui commu­nique avec de nombreux brace­lets connec­tés.

J’ai jeté mon dévolu sur un Xiaomi MiBand 2 : petit, pas cher (± 20€), basique, avec les fonc­tion­na­li­tés qui m’in­té­res­saient mais guère plus.

Ça a très bien fonc­tionné : Gadget­bridge me permet de modi­fier la confi­gu­ra­tion du MiBand, d’y mettre des alarmes, de choi­sir si je veux être averti quand je suis statique trop long­temps (le but : faire quelques exer­cices après être resté trop long­temps sur l’ordi), de récu­pé­rer le nombre de pas, l’ac­ti­vité détec­tée et le rythme cardiaque. Tout ça en gardant les données sur le télé­phone et non en les envoyant aux serveurs de Xiaomi. Et si je gardais le blue­tooth allumé sur le télé­phone, les noti­fi­ca­tions du télé­phone sont trans­mises au brace­let (ça peut être pratique).

Bref, ça fonc­tion­ne… sauf pour l’as­pect « ça va m’ai­der à me bouger », je n’ai pas réussi à me moti­ver bien long­temps 😅

Slee­pyHead

En octobre dernier, j’ai eu de très gros problèmes de sommeil, je ne dormais au mieux que 3 heures par nuit, sauf excep­tions, et ça a duré des mois 🙁

J’ai passé un examen du sommeil en mars (ouaip, pas top les délais de prise de rendez-vous) et il s’avère que je fais des hypo­pnées. Mais genre bien : 50 à 55 par heure, c’est très violent. La page Wiki­pé­dia de l’Index Apnées Hypo­pnées indique « les sujets ayant un IAH supé­rieur à 30 sont extrê­me­ment rares ». C’est violent au point qu’il m’est décon­seillé de conduire (parce qu’in­ci­dem­ment, je suis moins alerte et plus sujet aux endor­mis­se­ments que norma­le­ment).

Le remède est assez simple : un appa­reil à pres­sion posi­tive conti­nue (PPC) pendant la nuit. Un machin qui m’en­voie de l’air sous pres­sion dans le nez et/ou la bouche.

Apparté, si on vous équipe d’un machin comme ça :

  • deman­dez direc­te­ment qu’on vous donne le module qui humi­di­fie l’air, ça vous évitera d’avoir les muqueuses dessé­chées et de vous réveiller à cause de dès que l’air ambiant devient sec ;
  • si vous avez l’im­pres­sion que l’air que vous expi­rez reste dans le masque (et donc que vous respi­rez votre CO₂), resse­rez les sangles du masque. Ma barbe qui repous­sait (je l’avais rasée pour l’exa­men) faisait des mini-fuites non détec­tées par l’ap­pa­reil, m’em­pê­chant de souf­fler suffi­sam­ment fort pour ouvrir les clapets d’ex­pi­ra­tion.

L’en­tre­prise médi­cale qui m’a four­nit l’ap­pa­reil peut le confi­gu­rer et récu­pé­rer les mesures à distance. Par contre, rien n’est prévu pour que je puisse accé­der à celles-ci : les utili­sa­teurs les contac­taient dès que le résul­tat de la nuit n’était pas le même que celui de la veille alors ils ont arrêté de permettre aux utili­sa­teurs de voir leurs données. Bon, OK, mais moi je ne suis pas comme ça, et je veux pouvoir consul­ter mes données : être capable de voir si je dors plus ou moins long­temps (parce que bon, si je me contente de regar­der l’heure de réveil, je vais vite oublier), voir si j’ai eu plus d’hy­po­pnées les nuits où je dors peu, etc. Et puis tant qu’à produire des données, il me paraît natu­rel de pouvoir y accé­der.

Il existe un logi­ciel fait pour accé­der aux données des appa­reils à PPC : Slee­pyHead. Le projet est malheu­reu­se­ment à l’aban­don car le déve­lop­peur a lâché l’af­faire face aux casse-pieds. Je n’ai pas les détails, mais c’est malheu­reux de réus­sir à dégoû­ter un déve­lop­peur d’un tel logi­ciel libre.

Heureu­se­ment, il est encore possible de télé­char­ger Slee­pyHead. La version GNU/Linux propo­sée étant pour Ubuntu 15.04 (une distri­bu­tion d’il y a 5 ans, donc), j’ai préféré compi­ler le logi­ciel depuis les sources. Je n’ai pas eu trop de soucis (à savoir, instal­ler des dépen­dances au fur et à mesure des plan­tages de la compi­la­tion), le README étant clair et les instruc­tions simples.

Next­cloud et GpxPod

Je dors bien mieux depuis que j’ai mon appa­reil à PPC mais depuis à peu près un mois, quelque soit l’heure à laquelle je me couche, je me réveille tôt. Très tôt. Trop tôt : entre 4 et 5 heures du matin.

Ça m’est arrivé l’an­née dernière, pendant l’été (sans doute à cause de la chaleur) et j’en avais profité pour marcher tous les matins. Comme c’est plutôt une bonne chose de faire de l’exer­cice et que j’ai (encore) pris du poids, je me suis (re)mis à marcher tous les matins.

Afin de voir combien de kilo­mètres je faisais, en combien de temps, et si c’était à un rythme régu­lier, j’ai souhaité utili­ser mon smart­phone et Next­cloud avec l’ap­pli­ca­tion PhoneT­rack.
Pour le smart­phone, j’ai essayé l’ap­pli­ca­tion conseillée : PhoneT­rack. Zéro pointé : sur près d’un km, ça loguait à peine deux points (par contre, ça les envoyait direc­te­ment au serveur Next­cloud, c’était bien pratique). Je ne sais pas si c’était un mauvais réglage de ma part, mais c’était déce­vant.
J’ai ensuite essayé l’ap­pli­ca­tion OpenT­racks : bien meilleur suivi ! Par contre il fallait expor­ter les trajets vers le serveur Next­cloud (j’avais mis une synchro­ni­sa­tion du dossier d’ex­port vers le serveur) et impor­ter les trajets dans PhoneT­rack. Il y avait encore un souci : le suivi n’était pas très précis. En regar­dant le trajet, on avait l’im­pres­sion de suivre un homme ivre au dernier degré.

C’est à ce moment que l’en­vie d’une montre GPS m’a titillé. Pour la préci­sion et aussi pour un appa­reil moins encom­brant.
Entre prix élevés et coûts envi­ron­ne­men­taux des appa­reils neufs, je me suis tourné vers l’oc­ca­sion et j’ai trouvé une montre Garmin Fore­run­ner 110 à 30€. Pas cher, je lui offre une deuxième vie et en plus non connec­tée. Bingo !
L’as­pect « non connec­tée » est inté­res­sant car il y a moins de chances de se retrou­ver obligé de la connec­ter à une appli­ca­tion parti­cu­lière pour récu­pé­rer les données. J’avais véri­fié le modèle avant l’achat : elle est détec­tée comme clé USB sur un ordi­na­teur… Parfait, donc 🙂
Et bonus : la montre vient avec un moni­teur de fréquence cardiaque.

Petit point à noter, toute­fois : les Garmin crachent des fichiers .fit là où le stan­dard pour les traces GPS est le .gpx. Une petite recherche plus tard et je décou­vrais gpsbabel qui permet de conver­tir les .fit en .gpx (et je peux même ajou­ter au fichier .gpx les rele­vés de fréquence cardiaque).

Il me fallait récu­pé­rer les fichiers de la montre, les conver­tir avec gpsbabel, les envoyer au serveur Next­cloud et les impor­ter dans PhoneT­rack. Pas très pratique. J’ai commencé à écrire un script pour auto­ma­ti­ser tout ça avec Next­cloud work­flow : il m’au­rait alors suffi de dépo­ser les fichiers sur Next­cloud. Mais le pilo­tage d’ap­pli­ca­tions n’est pas simple depuis un script…

J’ai regardé les autres appli­ca­tions Next­cloud pour le suivi GPS dans l’es­poir d’en trou­ver une qui ne néces­si­te­rait pas d’im­por­ter manuel­le­ment les fichiers .gpx et j’ai trouvé GpxPod, du même déve­lop­peur que PhoneT­rack. Non seule­ment, cette appli­ca­tion peut lire les fichiers .gpx d’un dossier mais en plus elle peut conver­tir elle-même les fichiers .fit en .gpx (pour peu que gpsbabel soit installé sur le serveur) et permet de compa­rer les diffé­rentes traces !
Bref, tout bénéf : je monte la clé, je dépose les fichiers sur Next­cloud et c’est tout bon, pas besoin de faire un script 😊

Je vais quand même faire un script pour Next­cloud work­flow pour extraire la fréquence cardiaque des traces .gpx et utili­ser ces données avec l’ap­pli­ca­tion Analy­tics, histoire de voir s’il y a des chan­ge­ments avec l’ha­bi­tude.

OpenS­cale

Je l’ai dit : j’ai pris du poids. Encore (la dernière fois, c’était en septembre).

Ce n’est pas que je cède aux sirènes du « Sois mince pour être beau » ou que je n’aime pas mon corps, mais :

  • j’ai­me­rais beau­coup ne pas devoir rache­ter des fringues, ça me gonfle d’avoir plein de fringues dans mon armoire que je ne peux plus mettre ;
  • le poids influe sur mon sommeil (si je suis moins lourd, je ronfle moins, donc je pense que ça peut influer sur mes hypo­pnées).

Donc je veux surveiller mon poids (et tant qu’à faire, en perdre). Là-dessus, l’ap­pli­ca­tion openS­cale est nickel : elle me permet de noter mon poids, mais aussi le tour de taille et d’autres mesures, et calcule des trucs toute seule (comme l’IMC).

Elle fonc­tionne parfai­te­ment bien toute seule mais peut commu­niquer avec des balances connec­tées.

Depuis près de 3 semaines que je marche 8 kilo­mètres au petit matin et à jeun, je ne vois guère de résul­tat (et sans augmen­ter ma consom­ma­tion de nour­ri­ture, je précise). Souhai­tant savoir si je prenais de la masse muscu­laire ou si, à tout le moins, je perdais de la masse grais­seuse, j’ai acheté une balance impé­dan­ce­mètre suppor­tée par openS­cale : une Sani­tas SBF70 (je n’ai pas trouvé d’oc­ca­sion quand je l’ai ache­tée mais j’en ai trouvé une à l’ins­tant sur ebay (donc on peut en trou­ver d’oc­ca­sion, pour ceux que ça inté­resse)).

Ça fonc­tionne très bien : je me pèse, et de temps en temps, alors que la balance est encore active, je lance l’ap­pli­ca­tion qui va aller cher­cher l’his­to­rique des pesées.

Ça ne fait que 3 jours que j’ai la balance, donc je ne sais pas encore s’il y a des varia­tions (les varia­tions que je constate sont minimes, je pense qu’il n’y a rien à en tirer pour l’ins­tant).

Et si je souhaite exploi­ter les données d’openS­cale, je peux faire une sauve­garde des données et utili­ser la base de données SQLite qui en résulte comme bon me semble 🙂

Aver­tis­se­ment

Bien évidem­ment, je n’ai été payé par aucune des marques citées dans cet article. Je les ai citées parce qu’il est impor­tant de connaître les marques et modèles exact·es qui fonc­tionnent avec les logi­ciels libres : autant, au niveau ordi­na­teur, ça va plutôt bien main­te­nant, peu de compo­sants posent problème, autant les bidules connec­tés, il y en a beau­coup (la très grande majo­rité) qui sont verrouillés de partout et inex­ploi­tables par des logi­ciels libres.

Crédit : Photo par Theme Inn sur Unsplash

by Luc at June 28, 2020 11:18 AM

April 26, 2020

Luc Didry

J’ai retrouvé mon flow de déve­lop­peur

Le flow, c’est quand vous êtes à fond sur une tâche. Neil Jomunsi l’ex­plique fort bien dans son article Une méthode simple pour écrire vite et bien : le « flow » de l’écri­vain :

Concept popu­la­risé par le psycho­logue Mihály Csíks­zent­mihá­lyi, le flow est cet état d’in­tense concen­tra­tion qui permet à n’im­porte quel spor­tif, artiste, joueur, moine boud­dhiste, etc de rester foca­lisé sur l’ins­tant présent et d’ou­blier le monde qui l’en­toure pour ne se consa­crer qu’à une chose : l’ac­com­plis­se­ment de sa tâche. Quand on atteint l’état de flow, on s’ou­blie soi-même et on ne fait plus qu’un avec ce que l’on est en train de faire. Les barrières entre la personne et l’ac­tion s’ef­facent, les deux s’im­briquent pour ne plus faire qu’un.

Cela fait plusieurs mois, voire plus d’un an que j’ai perdu ma capa­cité à entrer dans un flow de déve­lop­peur. Si je pouvais toujours coder, c’était plutôt par petites touches, un bugfix par ci, une petite amélio­ra­tion par là… mais rien de consé­quent, alors qu’il m’ar­ri­vait fréquem­ment par le passé de coder comme un dément.

Or cela fait main­te­nant plusieurs semaines qu’elle est reve­nue 🙂
Elle est reve­nue lorsque j’ai décou­vert Alpi­neJS et que j’ai décidé de l’uti­li­ser pour réécrire WemaWema (la réécri­ture n’est pas encore termi­née). Cette semaine, il s’est mani­festé lorsque j’ai codé le support du stockage objet Swift dans Lufi pour les besoins de Frama­soft1 et hier quand j’ai ajouté de l’in­té­gra­tion conti­nue à Lufi-cli pour construire et publier des paquets binaires de Lufi-cli.

Concrè­te­ment, ça fait de très grosses jour­nées de travail, dans un état quasi second. Une transe. Et quand on sort du flow, on se sent épuisé, vidé, mais heureux (je pense qu’il doit y avoir une sacrée pous­sée d’endor­phine qui rentre en jeu)… et ça fait du bien au moral de façon géné­rale ! 🤗

Bref : I’m back in the game, baby!

Crédit : Photo par Enrique Ortega sur Unsplash


  1. D’ailleurs s’il y en a qui veulent tester cette fonc­tion­na­lité, je suis preneur de retours 

by Luc at April 26, 2020 07:32 AM

April 24, 2020

Pierre Boesch

FreeBSD : pkg: PRE-INSTALL script failed

Lors d'un pkg upgrade, j'ai eu cette erreur :

# pkg upgrade
[...]
===> Creating groups.
Using existing group '_tss'.
===> Creating users
Creating user '_tss' with uid '601'.
pw: user '_tss' disappeared during update
pkg: PRE-INSTALL script failed

D'après ce thread, l'erreur pkg: PRE-INSTALL script failed survient lorsque la db password n'est plus synchronisée. Pour corriger cela, il faut re-générer la db avec pwd_mkdb :

pwd_mkdb -p /etc/master.passwd

Puis on peut relancer pkg :

# pkg upgrade
[...]
[1/39] Installing tpm-emulator-0.7.4_2...
===> Creating groups.
Using existing group '_tss'.
===> Creating users
Using existing user '_tss'.
[1/39] Extracting tpm-emulator-0.7.4_2: 100%
[2/39] Installing libtasn1-4.15.0...

by Pierre Boesch at April 24, 2020 10:00 PM

April 19, 2020

Luc Didry

March 27, 2020

Luc Didry

« Le confi­ne­ment ? Ça va pas te chan­ger grand chose ! Ha ha ! »

Cette formule, je l’ai pas mal enten­due ces derniers jours. Pour être honnête, j’ai blagué dessus aussi. Au début.

Ça fait main­te­nant presque deux semaines que nous sommes confi­nés. Et main­te­nant, cette blague me gonfle.

Alors oui, c’est vrai que je bosse en télé­tra­vail depuis plus de 4 ans. Et c’est vrai que ma tenue de travail est un pyjama et une robe de chambre. De même, il est vrai qu’il m’ar­rive de ne pas sortir de chez moi plusieurs jours d’af­fi­lée.

Donc oui, je suis peut-être mieux préparé au confi­ne­ment que la plupart des gens. Mais dire que ça ne me pèse pas serait mentir.

Déjà parce que, bossant de chez moi, j’ap­pré­cie les sorties hors de ma tanière. Comme j’ha­bite à deux pas d’un super-marché, je ne fais pas de grandes courses : y aller ache­ter deux ou trois trucs tous les deux jours, ça me fait une coupure, une sortie, un bol d’air. J’ai aussi la chance d’avoir une média­thèque toute aussi proche, où je vais régu­liè­re­ment. Et le marché bio/local du vendredi. Et le marché du dimanche. Il y a aussi les cours hebdo­ma­daires de langue japo­naise, les cours mensuels de cuisine japo­naise. Et aller boire des coups avec les amis. Et aller en ville pour passer à la librai­rie. Bref les occa­sions de sortir, que ce soit pour 5 minutes ou plusieures heures ne manquent pas.

Ensuite, il y a une immense diffé­rence entre rester chez soi par choix (ou flemme) et ne pas pouvoir le faire libre­ment.

Il y a aussi le fait que mon fils n’ha­bite chez moi qu’une semaine sur deux. Ça veut dire être seul une semaine sur deux. Et actuel­le­ment, quasi­ment sans sortir.

J’ai la chance d’avoir un balcon, et quand je me fais un café (plusieurs fois par jour donc), je commence par en boire quelques gorgées accoudé à la rambarde. Le calme du quar­tier (dû au confi­ne­ment et à sa consé­quence sur la circu­la­tion) et, cette semaine, le soleil qui revient et les oiseaux qui gazouillent rendent encore plus dur le fait de ne pas pouvoir sortir pour en profi­ter. Je ne peux que regar­der du haut de ma tour de béton.

Donc, si, le confi­ne­ment, ça change beau­coup de choses pour moi aussi.

Crédit : Photo par Erda Estre­mera sur Unsplash

by Luc at March 27, 2020 06:24 PM

March 07, 2020

Alexandre Bailly

Nouvelles du blog

Ça fait un moment que j'hésitais à lâcher PluXML. Non pas parce que j'aime pas ce CMS (bien au contraire), mais à cause de certains détails agaçant.

Je l'utilise depuis 2010 (quasiment une décennie), mais depuis, ma procédure de rédaction des articles a pas mal évolué.

Mes derniers articles sont rédigés en ReStructuredText (rst), un langage de balisage léger, dans le même style que Markdown ou Textile, via ReText, suivi d'un export au format html, et enfin copier-coller dans l'éditeur html de PluXML.

Cela fait donc plusieurs étapes entre la rédaction et l'aperçu dans le blog, avec la répétition de toute la procédure si je veux éditer ou corriger un truc.

À noter : j'utilise la même procédure pour nv, qui tourne aussi sous PluXML.

Par exemple, la dernière fiction du mercredi a été rédigée en reStructuredText, à partir d'une idée tenant sur une ligne, puis exportée en html, etc.

https://nouvelles.chibi-nah.fr/controle-z-d

Par contre, pour mes pages de docs, j'utilise une procédure totalement différente. Là, je passe par Sphinx-doc, git, et quelques hooks.

Pour la rédaction, j'utilise aussi bien ReText, Geany ou Visual Studio Code (pas de troll, merci).

Je génère les pages en local pour contrôler le contenu. Le suivi des révisions étant géré par git, cela signifie donc que je peux aussi bien bosser avec Ryoko comme avec Yue. Et pour la publication ? Un simple git push, et c'est tout. Les pages sont générées sur le serveur puis copiés vers le répertoire de destination. Pas de copie via ftp ou scp. Pas de prise de tête.

Un processus totalement différent par rapport au blog.

Mon occupation actuelle est de reprendre tous les articles du blog (un peu moins d'une centaine), que j'ai converti en Markdown, via un script python, dont David Revoy a parlé récemment.

https://www.davidrevoy.com/article756/moving-to-markdown

https://github.com/KillianKemps/Pluxml-to-Markdown

Cependant, le contenu du blog étant essentiellement statique (les commentaires étant modérés, voire carrément désactivés), l'intérêt d'un CMS générant dynamiquement les pages est discutable. Je pense m'orienter vers un générateur statique. Pas Sphinx-doc, qui ne correspond pas à mes prérequis pour un blog (pour de la documentation, c'est juste génial). Plutôt Pelican (que je teste en ce moment).

Cela nécessite pas mal de travail. Notamment insérer toutes les métadonnées dans chacune des pages (date de publication, auteur, tags). Et chose importante : essayer de garder les mêmes URL que celles générées avec PluXML.

La migration du blog s'effectuera dans les prochaines semaines, une fois les articles corrigés et le thème mis en place.

by alex at March 07, 2020 11:00 PM

January 16, 2020

Luc Didry

La tech en grève

C’est un fait marquant dans l’his­toire du secteur infor­ma­tique français : des « tech » râlent et appellent à la grève (il y a eu un autre appel mais je ne le retrouve pas).

TL; DR: on bosse dans l’info, on aime auto­ma­ti­ser des trucs, mais c’est pas pour foutre des gens au chômage. Non, c’est pour libé­rer du temps de loisir, bosser moins, mieux vivre.

L’au­to­ma­ti­sa­tion peut et doit servir l’hu­ma­nité. Elle permet­trait de travailler moins, de partir en retraite plus tôt, et dans d’ex­cel­lentes condi­tions de vie, de déga­ger à tous du temps libre pour étudier, expé­ri­men­ter, pratiquer les sports, les arts, passer du temps en famille ou entre amis ; de vivre.

Bref, je me retrouve beau­coup dans cet appel, que j’ai signé.

Il y a sur https://onestla.tech/ des ressources graphiques pour des affiches, des bannières. Géné­ra­le­ment à base de l’émoji « poing levé » : ✊

Je ne trou­vais pas cet émoji assez vindi­ca­tif à mon goût, donc j’ai été cher­ché un poing levé sur https://freesvg.org/ (lien vers celui que j’ai choisi). Étant une quiche1 en graphisme, j’ai lancé un petit appel sur Masto­don et JCFrog a bien voulu mettre des câbles RJ45 dans le poing levé.

Après ça, un peu d’inks­cape pour mettre de la couleur et du texte, et hop :


Affiche rouge au format portrait avec, en noir, un poing levé tenant des câbles RJ45, le texte « La tech en grève » et l'adresse https://onestla.tech Affiche rouge au format paysage avec, en noir, un poing levé tenant des câbles RJ45, le texte « La tech en grève » et l'adresse https://onestla.tech


Cliquez ici pour une archive conte­nant les fichiers PNG et SVG des affiches.

Édouard Lafon en a fait une version bannière.

Et parce qu’une pancarte en carton, ça s’abîme vite, j’ai peint l’af­fiche sur une toile avec des marqueurs pein­ture et je n’au­rais plus qu’à l’ac­cro­cher à un manche à balai pour en faire une pancarte 🙂


Tableau rouge avec, en noir, un poing levé tenant des câbles RJ45, le texte « La tech en grève » et l'adresse https://onestla.tech

On se retrouve à la manif’ tout à l’heure, cama­rades ?


  1. lorraine, what else? 

by Luc at January 16, 2020 06:30 AM

December 21, 2019

Pierre Boesch

Zabbix Server et Proxy dans une jail FreeBSD

Situation

J'ai récemment débuté un mini projet pour superviser mes serveurs et services avec Zabbix sur FreeBSD, le tout dans des jails. Un serveur chez kimsufi sera le Zabbix Server (dans un jail) et sur mon serveur principal chez OneProvider, j'ai mis en place un Zabbix Proxy (toujours dans une jail). J'ai rencontré deux problèmes bloquants avec la partie serveur et proxy : l'impossibilité de démarrer le serveur et d'importer le schéma de db pour le proxy.

Zabbix Server

Jail : cannot allocate shared memory

Dans une jail FreeBSD, j'ai donc installé le serveur Zabbix. Après avoir configuré la db, et crée le fichier de configuration du serveur (/usr/local/etc/zabbix42/zabbix_server.conf) lorsque je lançais le service, il ne démarrait simplement pas :

# /usr/local/etc/rc.d/zabbix_server start
# /usr/local/etc/rc.d/zabbix_server status
zabbix_server is not running.

Un coup d'œil dans les logs Zabbix : zabbix_server [2691]: cannot create locks: cannot allocate shared memory for locks

Après une recherche, je tombe sur une page du wiki de Zabbix qui explique qu'il faut augmenter des paramètres du kernel (shmall et shmmax) qui sont par défauts trop bas. Rapidement, je m'aperçois que leur documentation est trop vieille : les valeurs qu'ils conseillent d'appliquer sont plus bas que celles appliquées par défaut sur FreeBSD 12. Pour la pérennité, les valeurs par défaut :

# ipcs -M
shminfo:
    shmmax:    536870912    (max shared memory segment size)
    shmmin:            1    (min shared memory segment size)
    shmmni:          192    (max number of shared memory identifiers)
    shmseg:          128    (max shared memory segments per process)
    shmall:       131072    (max amount of shared memory in pages)

Celles conseillées par le how to :

 kern.ipc.shmall=2097152
 kern.ipc.shmmax=134217728

On voit clairement, comme dit plus haut, que les paramètres en place ont une valeurs bien plus élevés.

SYSV IPC

En continuant mes recherches, j'arrive par hasard sur la documentation PostgreSQL fait état des mêmes remarques que celle de Zabbix à un détail près : un paramètre spécifique à appliquer sur une jail dont je ne connaissais pas l'existence :

En cas d'exécution dans une cage FreeBSD en activant security.jail.sysvipc_allowed de sysctl, les postmaster exécutés dans différentes cages devront être exécutés par différents utilisateurs du système d'exploitation

Je tente en activant le paramètre allow.sysvipc dans la jail zabbix :

# vim /usr/local/etc/ezjail/zabbix
-export jail_zabbix_parameters="allow.raw_sockets=1"
+export jail_zabbix_parameters="allow.raw_sockets=1 allow.sysvipc=1"
# ezjail-admin restart zabbix

Et le service zabbix_server s'est lancé sans erreur :

# /usr/local/etc/rc.d/zabbix_server status
zabbix_server is running as pid 5815.

Après lecture d'un blogpost très intéressant SYSV IPC correpond au Shared Memory, Semaphores and Message Queue. Les jails se partageant le même kernel, quand elles ont besoin de SYSV IPC elles doivent demander l'autorisation de l'utiliser. Avant FreeBSD 11, on pouvait soit accorder les droits complets soit les refuser totalement via le paramètre que l'on a vu précédemment allow.sysvipc. Si deux jails ont ce partage de ressources, si l'une d'elle est comprise, elle peut compromettre l'autre également. Depuis FreeBSD 11 donc, on peut utiliser les paramètres sysvshm et sysvsem avec la valeur new (créer un nouveau namespace SYSV pour la jail). J'ai modifié la configuration de ma jail de cette façon :

# vim /usr/local/etc/ezjail/zabbix
-export jail_zabbix_parameters="allow.raw_sockets=1 allow.sysvipc=1"
+export jail_zabbix_parameters="allow.raw_sockets=1 sysvshm=new sysvsem=new"
# ezjail-admin restart zabbix

Le service démarre toujours et avec de la sécurité :).

Zabbix Proxy

Import SQL Row size too large (> 8126)

Une fois le paquet installé et la db crée, il faut importer les données sql du fichier schema.sql. Pas de bol une nouvelle fois :

# mysql -h 192.168.0.4 -uzabbix zabbix_proxy < /usr/local/share/zabbix42/proxy/database/mysql/schema.sql
mysql: [Warning] Using a password on the command line interface can be insecure.
ERROR 1118 (42000) at line 1284: Row size too large (> 8126). Changing some columns to TEXT or BLOB may help. In current row format, BLOB prefix of 0 bytes is stored inline.

Ce problème est connu : MariaDB ne calcule pas correctement la taille des lignes pendant l'exécution. Les calculs sont censés être corrigés entre autre en 10.4.7, j'ai pourtant la 10.4.11… :

# pkg info | grep mariadb
mariadb104-client-10.4.11      Multithreaded SQL database (client)
mariadb104-server-10.4.11      Multithreaded SQL database (server)

Le lien ci-dessus renvoie vers le bugreport MDEV-19292 où, mis à part désactiver innodb_strict_mode=OFF, passer la taille des varchar à 255 de la table host_inventory serait la solution :

Keep InnoDB strict mode enabled, but change some of those varchar(N) columns to varchar(N >= 256 bytes). If the table's default character set is utf8mb4, then that means that N would have to be 64 or more. i.e. this also succeeds in MariaDB 10.2.26.

Un coup de sed dans schema.sql :

$ cd /usr/local/share/zabbix42/proxy/database/mysql/schema.sql
$ sed -i.bak '/CREATE TABLE `host_inventory`/,/PRIMARY KEY/s/varchar([0-9]\{1,\})/varchar(255)/' schema.sql

Et effectivement l'import fonctionne sans faute !

by Pierre Boesch at December 21, 2019 11:00 PM

December 06, 2019

Pierre Boesch

Thinkpad fixer le mapping des touches de luminosité

Sur archlinux après une mise à jour du kernel, à priori depuis la 5.3, les touches de réglages de la luminosité de mon Thinkpad X200 ne fonctionnaient plus.

xev (permet d'afficher les évênements de X), me confirme que les touches ne sont plus reconnues :

$ xev
MappingNotify event, serial 32, synthetic NO, window 0x0,
    request MappingKeyboard, first_keycode 8, count 248

MappingNotify event, serial 32, synthetic NO, window 0x0,
    request MappingKeyboard, first_keycode 8, count 248

Le wiki d'archlinux donne plusieurs solutions dont celle d'ajouter une section Device de x11 pour utiliser l'option intel-backlight du driver intel (sur certains modèles il faudra charger acpi_backlight).

$ cat /etc/X11/xorg.conf.d/10-intel-backlight.conf
Section "Device"
    Identifier "Card0"
    Driver "intel"
    Option "Backlight" "intel_backlight"
EndSection

Après un reboot, les touches de luminosités fonctionnent de nouveau et sont effectivement reconnues par xev :

KeyRelease event, serial 41, synthetic NO, window 0xc00001,
    root 0xc4, subw 0x0, time 50185961, (-160,432), root:(484,469),
    state 0x10, keycode 232 (keysym 0x1008ff03, XF86MonBrightnessDown), same_screen YES,
    XLookupString gives 0 bytes:
    XFilterEvent returns: False

Pour information, avant la solution précédente, rajouter l'option --release des bindings XF86MonBrightnessUp/Down dans ma configuration i3 a fonctionné également :

-bindsym XF86MonBrightnessUp exec --no-startup-id xbacklight -inc 5
+bindsym --release XF86MonBrightnessDown exec --no-startup-id xbacklight -dec 5

by Pierre Boesch at December 06, 2019 11:00 PM

November 21, 2019

Pierre Boesch

Pacman 5.2 breaks dependency required by yay

Récemment lorsque j'ai tenté de mettre à jour ArchLinux avec yay je me suis retrouvé bloqué sur des dépendances cassées avec pacman :

$ yay
:: Synchronizing package databases...
 core is up to date
 extra is up to date
 community is up to date
 multilib is up to date
:: Starting full system upgrade...
resolving dependencies...
looking for conflicting packages...
error: failed to prepare transaction (could not satisfy dependencies)
:: installing pacman (5.2.1-1) breaks dependency 'pacman<=5.1.3' required by yay

Donc impossible de mettre à jour pacman en 5.2 parce que yay est dépendant de la version 5.1. La solution rapide pour résoudre ce problème de dépendance entre yay et pacman est de supprimer yay, de mettre à jour son système avec pacman et réinstaller yay.

$ sudo pacman -R yay
$ sudo pacman -Syu
$ sudo pacman -S yay

yay fonctionne à nouveau :

$ yay
:: Synchronizing package databases...
 core is up to date                                                            135,6 KiB  2,50 MiB/s 00:00 [----------------------------------------------------------------]
 extra is up to date                                                          1645,9 KiB  2,79 MiB/s 00:01 [----------------------------------------------------------------]
 community is up to date                                                         4,7 MiB  2,46 MiB/s 00:02 [----------------------------------------------------------------]
 multilib is up to date
:: Starting full system upgrade...
resolving dependencies...
looking for conflicting packages...
Packages (183) […]

by Pierre Boesch at November 21, 2019 11:00 PM

October 24, 2019

Simon Florentin

Fermeture du blog

Salut, Petit message de service pour annoncer la fermeture du blog. En effet, je n’y poste plus rien. Je vais

Read more »

by Simon at October 24, 2019 08:07 AM

October 21, 2019

Luc Didry

Pous­ser ses filtres SIEVE en ligne de commande et sans mot de passe (avec Kwal­let)

Les filtres Sieve sont des régles de filtrage de mails exécu­tées par le serveur de messa­ge­rie (NB : tous ne le proposent pas). C’est à mon sens l’op­tion la plus propre pour filtrer ses mails : quelque soit mon logi­ciel de consul­ta­tion de mes mails (webmail, client graphique ou textuel sur ordi­na­teur, client sur smart­phone…), le filtrage sera toujours le même, sans avoir besoin de reco­pier les règles.

Pour éditer ces règles, il y a plusieurs solu­tions. La solu­tion de group­ware Blue­mind, que j’uti­lise à titre person­nel et profes­sion­nel four­nit un éditeur graphique sur le webmail, mais il est trop limité pour mon usage : je ne peux que cumu­ler des règles et non pas les mixer, créer des sous règles, etc. Un exemple de sous-règle : si je souhaite que les mails prove­nant de l’adresse foo@example.org soit rangés dans un dossier foo, et que si, parmi ces mails, le sujet contient bar, le mail soit marqué comme lu, je peux écrire en Sieve :

if allof ( address :contains "from" ["foo@example.org"] ) {
    if allof ( header :contains "Subject" "bar" ) {
        setflag "\\Seen";
    }
    fileinto "foo";
    stop;
}

Mais Blue­mind ne permet pas cela, les règles seront plus basiques (ah, les limi­ta­tions des inter­faces graphiques !). Thun­der­bird peut utili­ser une exten­sion, Sieve pour gérer les filtres Sieve, mais je ne sais plus trop ce que ça vaut, ça fait long­temps que je n’uti­lise plus Thun­der­bird. Kmail, le client de messa­ge­rie de KDE et que j’uti­lise, permet de gérer (nati­ve­ment) les filtres Sieve de façon graphique mais pous­sée ou… de les écrire direc­te­ment. Voilà qui est top ! Ah mais… c’est pas ouvert dans Vim. Dommage, j’ai mes petites habi­tudes et j’ai horreur d’uti­li­ser un autre éditeur de texte.

La ligne de commande : sieve-connect

Donc, person­nel­le­ment, j’uti­lise Vim pour écrire mes scripts Sieve et sieve-connect pour les envoyer à mon serveur de messa­ge­rie. Exemple :

sieve-connect -s serveur.example.org -p 2000 -u luc@example.org \
 --localsieve /home/luc/filter.siv --upload --remotesieve mes_regles.sieve

Expli­ca­tion des options :

  • -s serveur.example.org : l’adresse du serveur ;
  • -p 2000 : le port utilisé par le serveur pour l’in­ter­face de gestion des filtres Sieve ;
  • -u luc@example.org : mon login ;
  • --localsieve /home/luc/filter.siv : l’adresse du fichier à pous­ser ;
  • --upload : l’ac­tion à entre­prendre, donc l’en­voi au serveur ;
  • --remotesieve mes_regles.sieve : le nom du fichier distant dans lequel je vais pous­ser mes règles. On peut effec­ti­ve­ment avoir plusieurs fichiers de règles, mais un seul sera actif. Pratique pour avoir des règles spéciales pour les vacances : il n’y a qu’à acti­ver le fichier qui les contient et zou 🙂

Là-dessus, sieve-connect va me deman­der mon mot de passe et hop, c’est poussé !

Sieve-connect permet d’en­voyer des règles, de les récu­pé­rer, de lister les fichiers de règles, d’ac­ti­ver l’un ou l’autre. Bien pratique donc !

Et le mot de passe ?

Pour ne pas avoir à donner mon mot de passe à chaque fois sans pour autant le mettre dans un script, je vais profi­ter de KWal­let, le gestion­naire de mot de passe de KDE contient déjà le mot de passe de mon compte mail, puisque j’uti­lise Kmail. Donc autant le lui deman­der !

Je peux deman­der l’ac­cès au porte­feuille de mot de passe via D-Bus :

qdbus org.kde.kwalletd5 /modules/kwalletd5 open kdewallet imap "Sieve push"

La chaîne "Sieve push" est le nom que je déclare pour mon « appli­ca­tion ». Kwal­let me deman­dera si j’au­to­rise l’ap­pli­ca­tion « Sieve push » à accé­der au porte­feuille. Cette commande va me retour­ner un handle que je vais utili­ser dans mes demandes ulté­rieures. En allant voir dans l’ap­pli­ca­tion graphique de gestion Kwal­let, KWal­letMa­na­ger, je vois que le mot de passe de mon compte de messa­ge­rie est akonadi_imap_resource_1rc du dossier imap. Donc pour en deman­der le mot de passe, je fais :

qdbus org.kde.kwalletd5 /modules/kwalletd5 readPassword le_handle_obtenu_avant \
 imap akonadi_imap_resource_1rc "Sieve push"

NB : on notera que je répète le nom de mon appli­ca­tion, "Sieve push", dans la commande. C’est néces­saire.

Plus qu’à donner le mot de passe à sieve-connect. Pour simpli­fier, je combine tout ça dans une fonc­tion que je vais mettre dans mon ~/.zshrc :

sievepush() {
    ID=$(qdbus org.kde.kwalletd5 /modules/kwalletd5 open kdewallet imap "Sieve push")
    echo $(qdbus org.kde.kwalletd5 /modules/kwalletd5 readPassword $ID imap akonadi_imap_resource_1rc "Sieve push") | sieve-connect -s serveur.example.org -p 2000 -u luc@example.org --localsieve /home/luc/filter.siv --upload --remotesieve mes_regles.sieve
}

Et voilà ! Plus qu’à lancer sievepush depuis mon termi­nal et ça enverra mon fichier de filtres à mon serveur de messa­ge­rie. Si mon porte­feuille KWal­let est ouvert, ça partira direct, sinon, ça me deman­dera le mot de passe du porte­feuille.

Crédit : Photo par Tyler Nix sur Unsplash

by Luc at October 21, 2019 02:34 PM

October 12, 2019

Luc Didry

Scan­ner et impor­ter faci­le­ment ses livres sur Inven­taire.io

J’ai des livres. Plein. Peut-être trop. On s’en fout. Le truc, c’est qu’une belle collec­tion comme ça, c’est mieux quand elle est cata­lo­guée.

D’où mon inté­rêt pour inven­taire.io : c’est un plate-forme (libre !) sur laquelle on peut impor­ter ses livres, les marquer comme dispo­nibles au don ou au prêt, se connec­ter avec des gens, regar­der les inven­taires des uns et des autres, faire une demande de prêt…

C’est très simple d’em­ploi et si on four­nit l’ISBN d’un livre, la plate-forme va essayer de récu­pé­rer les données (auteur, couver­ture, synop­sis, etc) toute seule via wiki­data et d’autres sources de données. Très pratique donc. Le site propose même un scan­ner de code-barres ! Pile-poil avec un smart­phone, mais ça devrait même aussi fonc­tion­ner avec une webcam. On peut aussi utili­ser une appli­ca­tion de scan­ner de code-barres, on n’est pas obligé d’uti­li­ser celui du site.

Par contre, si scan­ner des codes-barres avec un télé­phone est pratique, véri­fier et vali­der les livres qui résultent du scan­nage sur le télé­pho­ne… c’est un peu bof. Surtout si comme moi vous scan­nez les livres par paquets de 50. L’idéal est donc de scan­ner avec son télé­phone et de vali­der sur l’or­di­na­teur…

KDECon­nect pour la liai­son télé­phone — ordi­na­teur

KDECon­nect est un outil très pratique pour contrô­ler son ordi­na­teur depuis son télé­phone : y envoyer des fichiers, gérer le lecteur multi­mé­dia… Et dans l’autre sens, on peut accé­der à l’es­pace disque de son télé­phone depuis son ordi­na­teur. Mais surtout, la killer feature, pour moi, c’est le partage du presse-papier : je copie un truc sur le télé­phone ou sur l’ordi et son contenu se retrouve dans le presse-papier de l’autre appa­reil.

Pour utili­ser KDECon­nect, il faut l’ap­pli­ca­tion KDECon­nect (dispo­nible sur F-Droid, je ne sais pas si elle est sur le play store) et sur l’or­di­na­teur, il faut instal­ler le paquet kdeconnect et lancer les appli­ca­tions (/usr/lib/x86_64-linux-gnu/libexec/kdeconnectd pour lancer la version ordi­na­teur depuis la ligne de commande pour une Debian). Il y a aussi une version pour Gnome : gscon­nect.

Ensuite, il faut que les deux appa­reils soient dans le même réseau. Après, il n’y a plus qu’à appa­reiller les appa­reils.

Barcode scan­ner sur le télé­phone

Instal­lez Barcode scan­ner (dispo­nible sur F-Droid) sur votre télé­phone et confi­gu­rez-le pour qu’il copie ce qu’il scanne dans le presse-papier.

On y est presque : avec ces deux outils, l’or­di­na­teur peut d’ores et déjà rece­voir dans son presse-papier les codes-barres que vous allez scan­ner.

Surveiller le presse-papier avec Clip­no­tify

J’ai trouvé un projet, Clip­no­tify qui permet de surveiller le contenu du presse-papier. Télé­char­gez la dernière version sur https://github.com/cdown/clip­no­tify/releases.

Enre­gis­trer les codes-barres dans un fichier

Vous aurez aussi besoin de xsel pour accé­der au contenu du presse-papier (Clip­no­tify ne donne pas le contenu de celui-ci, il se contente de regar­der s’il change), ainsi que de tee.

Ensuite vous n’au­rez plus qu’à lancer cette petite commande :

while clipnotify
do
    ISBN=$(xsel)
    echo $ISBN | tee -a /tmp/clip.log
done

Faites Ctrl+C pour arrê­ter.

NB: Je ne pipe pas direc­te­ment xsel vers tee car xsel ne fait pas de retour à la ligne. Notez aussi que vous pouvez vous passer de tee en faisant echo $ISBN >> /tmp/clip.log, mais j’aime bien voir direc­te­ment sur le termi­nal ce qui écrit dans /tmp/clip.log.

Pour une raison que j’ignore, chaque contenu de press-papier se retrouve écrit plusieurs fois dans le fichier /tmp/clip.log. Corri­ger le fichier n’est pas diffi­cile :

uniq /tmp/clip.log  | grep "^97"

Ou (au cas où on scanne le même livre deux fois par inad­ver­tance) :

sort -u /tmp/clip.log  | grep "^97"

Le grep est là pour se déba­ras­ser des codes-barres mal scan­nés : un ISBN comment toujours par 978 ou 979. Pensez à regar­der le numéro que vous indique avoir scanné Barcode scan­ner !

Voilà. Vous avez main­te­nant une belle liste d’ISBN qu’il nous suffit désor­mais de coller sur https://inven­taire.io/add/import 🙂

Et si vous voulez voir ce que j’ai dans ma biblio­thèque, vous pouvez aller voir sur https://inven­taire.io/inven­tory/framasky (mais je suis encore en train d’im­por­ter mes bouquins, j’ai pas fini de tout scan­ner).

EDIT (12/10/2019) : ajout du grep pour enle­ver les codes-barres mal scan­nés.

Crédit : Photo par Eli Fran­cis sur Unsplash

by Luc at October 12, 2019 03:06 PM

October 11, 2019

Alexandre Bailly

Visual Studio, clavier TypeMatrix™ bépo et underscore

Ou comment se prendre la tête pour pouvoir taper le caractère _

Lors de la migration vers les nouvelles versions des outils en environnement professionnel, on peut rencontrer des problèmes complètement inattendus, et non documentés. D’autant plus s’il s’agit de produits Microsoft, où le support est absolument incapable de trouver l’origine du problème. Je ne parlerai pas des “experts” certifiés MSVP¹, pour qui le problème vient du clavier.

Là où c'est amusant, c’est que la touche fonctionne dans le champ de recherche mais pas dans l'éditeur.

J’avais rencontré ce problème avec Microsoft SQL Server Management Studio pour SQL Server 2017 (basé sur vs2015), et mon contournement était de taper l’underscore dans le bloc-note, puis de faire un copier-coller à chaque fois que j’en avais besoin, c’est-à-dire en permanence.

L’utilisant nettement moins souvent dans Visual Studio et ayant également Visual Studio Code (j’utilise plus ce dernier que la solution ultra lourde, d’ailleurs, et la touche underscore fonctionne, elle, sur VS Code), et les recherches de la solution s'avérant infructueuses, j’allais abandonner, jusqu’au moment, où au détour d’un message sur Stack Overflow, quelqu’un en Allemagne semblait avoir un problème similaire, mais avec un autre caractère ; sauf que là, une piste était donnée.

Les raccourcis claviers

Certes, très utiles (enlevez-moi mon Ctrl + B et je pète un câble), mais parfois problématiques.

Après quelques tests stupides que je ne détaillerai pas, il s’avère que VS (depuis 2012 ? 2015 ?) détermine d’abord la séquence de touches, exécute le raccourci-clavier si celui-ci correspond, sinon insère le caractère pouvant correspondre à la même séquence.

Sur un TypeMatrix™ bépo, le caractère underscore _ s'obtient via Alt gr + espace. Sauf que Alt gr sous Windows, c’est un raccourci pour Ctrl + Alt. Donc, le caractère underscore _ correspond donc à Ctrl + Alt + Espace. Vous voyez venir la blague ?

Cette séquence de touches est attribuée à un raccourci clavier dans le mode éditeur. Et donc, prend le pas sur l’insertion du caractère tant désiré. Les raccourcis clavier ne s’appliquant pas dans le champ de recherche, cela explique pourquoi le _ peut être saisi sans aucun problème.

On a maintenant l’explication, du coup, corrigeons le problème.

Les captures d’écrans proviennent de Visual Studio 2017, mais c’est la même démarche dans MS SQL Server Management Studio.

Aller dans le menu « Outils », puis cliquer sur « Options… ».

Dans la fenêtre, cliquer sur « Clavier » sur la gauche.

La liste des raccourcis clavier s’affiche. Comme celle-ci est trop longue, on ne va pas les vérifier un par un.

Cliquer dans le champ texte sous « Appuyer sur les touches de raccourci : » puis appuyer les touches Alt gr + Espace. Cela insère bien le raccourci clavier Ctrl + Alt + Espace, ici en 1 sur la capture d’écran.

Le nom de la commande utilisant ce raccourci clavier apparaît alors sous « Raccourci actuellement utilisé par : », ici en 2 sur la capture d’écran.

Cliquer dans le champ texte sous « Afficher les commandes contenant : ».

Taper ensuite le nom de la commande (même partiellement) pour filtrer l’affichage.

Cliquer ensuite sur le nom de la commande, ici, la sélection en bleu sur la capture d’écran.

Cliquer sur le bouton « Supprimer », ici en 1 sur la capture d’écran.

Vérifier que le raccourci est bien supprimé, ici en 2 sur la capture d’écran.

Cliquer sur « OK », ici en 3 sur la capture d’écran pour valider et fermer la fenêtre.

Essayez de taper le caractère underscore. Cela devrait fonctionner.

Normalement, il y a un seul raccourci clavier avec cette séquence de touches. Si la touche n’est toujours pas reconnue, recommencer les manipulations pour trouver les autres commandes utilisant également cette séquence de touches.

---

¹ : Il suffit d’apprendre par cœur les annales et de réciter le tout par cœur² pour avoir la certification. Des gamins de 12 ans sont tout à fait capables (et certain·e·s l’ont obtenu).

² : La raison pour laquelle je n’ai pas ces certifications. Celles et ceux me connaissant IRL savent pourquoi.

by alex at October 11, 2019 10:00 PM

August 19, 2019

Luc Didry

Instal­ler l’ex­ten­sion Netflix sur Kodi

Bon… j’aime pas Netflix parce que ça utilise des DRM et que ça pue du cul mais la mère de mon gamin a pris un abon­ne­ment (à deux écrans, pour elle et lui) et comme j’ai pas envie qu’il s’use les yeux à regar­der Netflix sur son télé­phone quand il est chez moi… j’ai installé l’ex­ten­sion Netflix sur le Kodi du rasp­berry pi du salon, qui est relié à un vidéo-projec­teur.

J’ai utilisé ce tuto­riel : https://kwar­tix.word­press.com/2019/05/13/netflix-rasp­berry-et-kodi/. Bien fait, mais j’ai rencon­tré des diffi­cul­tés, donc je refais un article avec tout ce que j’au­rais voulu savoir.

Pré-requis

  1. avoir Kodi en version 18 mini­mum. Ça ne m’a pas posé de problème puisque c’était déjà le cas pour moi, mais c’est bon à savoir ;
  2. avoir au moins 2Gio d’es­pace libre : pour choper le bazar de DRM qui va bien, l’ex­ten­sion va télé­char­ger une image Chrome OS, et c’est volu­mi­neux.

Ce qui va nickel dans le tuto

On installe des dépen­dances :

sudo apt install python-pip python-crypto build-essential \
  python-all-dev python-setuptools python-wheel \
  python-crypto-dbg python-crypto-doc python-pip-whl
pip install pycryptodomex
sudo ln -s /usr/lib/python2.7/dist-packages/Crypto /usr/lib/python2.7/dist-packages/Cryptodome

NB : j’ai fait le pip en root, vu que quand j’ai plusieurs commandes sudo à taper, je m’em­bête pas et je me mets en root. Je ne sais pas si ça peut faire une diffé­rence quel­conque.

Une petite typo

Ça, je l’ai dit en commen­taire de l’ar­ticle : une URL n’est pas bonne. Ça arrive.

wget https://raw.githubusercontent.com/sonpero/Netflix/master/repository.castagnait-1.0.0.zip

L’URL de l’ar­ticle pointe sur la page github du fichier et non sur le fichier lui-même.

Après cela, on installe ce fichier dans Kodi comme une exten­sion via l’ins­tal­la­tion par fichier zip. Ce n’est cepen­dant pas une exten­sion : c’est un dépôt d’ex­ten­sion qu’on installe là.

Les problèmes commencent

Il est tout à fait possible que l’au­teur de l’ar­ticle origi­nel n’ait pas rencon­tré les soucis suivants, mais moi si, ce qui justi­fie cet article.

  1. au moment d’ins­tal­ler l’ex­ten­sion Netflix via le nouveau dépôt, j’ai eu droit, comme sous Android, à un message indiquant que l’ins­tal­la­tion d’ex­ten­sion via des sources incon­nues n’était pas auto­risé. Un petit tour dans les para­mètres (le message a la bonne idée d’in­clure un bouton pour s’y rendre direc­te­ment) et c’est réglé ;
  2. une fois l’ex­ten­sion instal­lée et les iden­ti­fiants rentrés, impos­sible de lire une vidéo : il me manquait l’ex­ten­sion InputS­tream Adap­tive, et impos­sible de la trou­ver dans les dépôts. En fait, ayant installé Kodi à partir des dépôts Deb Multi­me­dia, il me fallait l’ins­tal­ler depuis les paquets Debian (et j’en ai installé un autre avec, il me semble qu’ils sont rela­ti­ve­ment liés) :

    apt install kodi-inputstream-adaptive kodi-inputstream-rtmp

    Puis un petit redé­mar­rage de Kodi pour qu’il voit ces nouvelles exten­sions ;

  3. Après, au lance­ment (enfin !) d’une première vidéo, l’ex­ten­sion m’a proposé l’ins­tal­la­tion de wide­vine… et c’est là que j’ai été averti qu’il fallait 2Gio d’es­pace libre. J’ai du faire un peu de place ;
  4. La place faite, Kodi se plai­gnait du fait qu’il fallait fdisk ou parted sur la machine pour pouvoir extraire wide­vine. Deux outils pour­tant bien instal­lés. J’ai lancé Kodi avec l’uti­li­sa­teur root après avoir fait ln -s /home/kodi/.kodi /root/.kodi (oui, j’ai un utili­sa­teur dédié) et j’ai enfin pu termi­ner l’ins­tal­la­tion de wide­vine ;
  5. Les vidéos ne se lançaient pas pour autant, pour des problèmes de permis­sions d’après les messages d’er­reur. L’ins­tal­la­tion de wide­vine via l’uti­li­sa­teur root mais son utili­sa­tion par l’uti­li­sa­teur kodi avait laissé des traces, en l’oc­cu­rence un lien symbo­lique dont la cible était dans /root/. Pour y remé­dier :
    cd /home/kodi/.kodi/cdm
    rm libwidevinecdm.so;
    ln -s /home/kodi/.kodi/userdata/addon_data/script.module.inputstreamhelper/cdm/libwidevinecdm.so

Et voilà, après ça, ça fonc­tionne 🙂

Bonus

Je suis chez un FAI asso­cia­tif (LDN, pour ne pas le nommer) via un VPN. Ce qui veut dire que :

  1. j’ai un pres­ta­taire qui me permet de monter le VPN, en l’oc­cu­rence Orange ;
  2. si je pompe trop de bande passante, c’est mon FAI qui est péna­lisé.

Enfin mon Turris Omnia, qui monte le VPN et redis­tri­bue Inter­net chez moi, n’a pas un proces­seur de folie : le chif­fre­ment/déchif­fre­ment du trafic VPN ne me permet pas de profi­ter de la pleine puis­sance de la connexion fibre Orange (ça reste plus que correct quand même hein !).

Du coup, pour éviter de péna­li­ser mon FAI et de bour­ri­ner mon Turris, je route direc­te­ment le trafic Netflix via la box Orange avec un simple :

ip route add 45.57.49.131 via 192.168.2.1 dev eth1

La première IP est celle d’un serveur Netflix, la deuxième est celle de la box Orange et eth1 est l’in­ter­face du Turris connec­tée à la box.

Bien sûr, il y a plus d’une adresse IP à router ainsi. J’ai fait une compi­la­tion de ce que j’ai trouvé sur un snip­pet Frama­git : https://frama­git.org/snip­pets/3739.

EDIT : On a porté à ma connais­sance la commande bgpq3 -J AS-NFLX, qui permet de connaître les adresses IPv4 de l’AS de Netflix. Je ne sais pas s’il faut toutes les dévier vers la box orange (j’ai eu des soucis sur certaines adresses que j’avais détec­tées) mais en tout cas ça va simpli­fier le boulot ! Pour les IPv6, il faut utili­ser bgpq3 -6 -J AS-NFLX.

Crédit : Photo par Alex Litvin sur Unsplash

by Luc at August 19, 2019 05:12 PM