Librem 5 et convergence

L’idée de convergence existe depuis bien longtemps. Aujourd’hui, hormis le fait que l’architecture d’un téléphone n’est pas la même que celle d’un ordinateur de bureau, il est parfaitement envisageable de considérer qu’un téléphone puisse faire office d’ordinateur de bureau.

Cela fait maintenant plusieurs années que j’utilise un Raspberrypi, d’abord 3B+, aujourd’hui 4B+, comme poste de travail. Or, l’architecture du Raspberrypi est celle d’un téléphone. Mon raspberrypi est connecté à un écran tactile de 12,5 pouces et relié à un clavier bluetooth récupéré d’une ancienne tablette. Le système est Raspbian, dérivé de Debian.

Avec le Librem 5 en mode convergence, j’ai accès à un écran de 30 pouces simultanément à l’écran tactile du Librem, avec un clavier muni d’un touchpad et une souris, les deux sans fils. Tout cela est relié par l’intermédiaire d’un hub relié au Librem par un connecteur USBC et disposant d’une sortie HDMI pour connecter l’écran, de trois ports USB3 et d’une alimentation (aussi en USBC).

Convergence simple
Premier exemple de convergence.

Sur la capture d’écran ci-dessus se trouve le premier exemple de convergence. À gauche, se trouve l’écran tactile du Librem, avec les deux bandes noires permettant d’accéder au programmes (en bas) et aux différents réseaux et notifications (en haut). À droite, se trouve l’écran principal avec une image de fond prise par mes soins.

La gestion des écrans est intéressante, puisque c’est le bord commun aux deux écrans qui permet le passage du pointeur de la souris d’un écran à l’autre. Remarquez que l’écran tactile du Librem est parfaitement utilisable simultanément à l’utilisation de la souris. Remarquez aussi que la plupart du temps, le lancement d’une application depuis le librem provoquera son affichage sur le Librem, mais pas toujours. Or, en raison de l’adaptation des applications à l’écran du Librem, le bandeau haut de la fenêtre permettant sa saisie peut parfois ne pas être présent. Il peut donc être difficile de déplacer une fenêtre d’un écran à l’autre sans connaître quelques fonctionnalités de déplacement au clavier comme :

  • <SHIFT><WINDOW><Flèche droite ou gauche> pour déplacer la fenêtre qui a le focus d’un écran à l’autre,
  • <WINDOW><Flèche haut ou bas> pour maximiser ou afficher à la taille choisie la fenêtre,
  • <WINDOW><Flèche gauche ou droite> pour placer la fenêtre sur toute la moitié gauche ou droite de l’écran,
  • <WINDOW><A> pour ouvrir le lanceur d’application et
  • <WINDOW><S> pour ouvrir le sélecteur d’application.

Sur la seconde capture de l’écran, on peut voir qu’il est possible de placer l’écran du librem différemment et de lui donner un facteur de zoom particulier. Le panneau des préférences présenté permet aussi de choisir l’écran principal, c’est-à-dire l’écran sur lequel les menus (bandes noire en haut et en bas) seront affichés. Il permet aussi d’effectuer différents réglages propres à la configuration de chaque écran ou de choisir un clonage simple de l’écran du Librem sur l’autre écran. Enfin, il permet de couper l’écran secondaire après avoir remis les menus sur celui du Librem, pour permettre de le débrancher et quitter ainsi la convergence. Or, cela ne fonctionne pas toujours bien. Dans la moitié des cas, après avoir débranché l’écran secondaire, le Librem plante et redémarre. Il s’agit là d’un bug à corriger.

Convergence écran
Second exemple de convergence avec préférences de réglages des écrans.

Cela dit, la convergence fonctionne plutôt bien du point de vue des écrans et il devient vite extrêmement pratique de lancer des logiciels de manières tactile sur l’écran du Librem pour les utiliser sur l’autre écran.

Mais la convergence n’est pas qu’une affaire d’écran. C’est surtout un problème logiciel. Je présenterai dans un autre article, le cas de l’utilisation simultanée d’un logiciel de reconnaissance de caractères (gimagereader) et de LaTeX qui pourrait être considéré comme un exemple fort de convergence. Pour rester ici focalisé sur l’écran, il me faut évoquer les captures d’écrans.

Pour pouvoir rédiger cet article, il était nécessaire de pouvoir réaliser des captures d’écrans en mode convergence. Je m’attendais à des difficultés en raison de la présence des deux écrans, mais le problème s’est situé totalement ailleurs.

J’aime et utilise Gimp depuis toujours. Je l’utilise donc pour faire mes captures d’écran. Gimp n’est certainement pas un logiciel adapté à un téléphone et il n’est évidemment pas présent dans la logithèque de PureOS. Mais celle-ci n’est que la partie émergée de l’iceberg Debian. L’utilisation de la console est ici à privilégier. Avec quelques :

apt search terminator
apt search gimp

en utilisant le clavier disponible pour la console, on se rends compte qu’une grande partie des logiciels disponibles sous Debian le sont aussi sous PureOS. Je reparlerai dans un autre article des problèmes rencontrés pour installer certains logiciels comme Merkaartor ou biber. Ainsi, une ligne suffit pour se retrouver avec terminator et gimp :

sudo apt-get install terminator gimp

après éventuellement :

sudo apt-get update
sudo apt-get upgrade
sudo apt-get dist-upgrade

Terminator est alors disponible (avec transparence, excusez du peu) et Gimp aussi.

MAIS, même si Gimp est parfaitement fonctionnel, impossible de réaliser une capture d’écran. Tout se passe apparemment correctement, mais l’image obtenue reste obstinément entièrement noire.

Comme ImageMagick (installé par défaut), par l’intermédiaire de son utilitaire import, permet de réaliser des captures d’écran, j’ai tenté :

import -pause 10 capture.png

et le résultat fut exactement le même qu’avec Gimp.

Il m’a fallu un certain temps et l’article https://puri.sm/posts/easy-librem-5-app-development-take-a-screenshot/ pour me rendre compte que le problème venait du serveur graphique.

Précisons que non seulement la carte graphique du Librem 5 est libre, mais que le serveur graphique n’est pas X11, classiquement utilisé sous Debian, mais Wayland (https://fr.wikipedia.org/wiki/Wayland). Ce serveur qui va probablement remplacer X11 est déjà présent sous Debian, mais pas installé par défaut. Comme il est semble-t-il plus performant et plus léger que X11, c’est lui qui a été embarqué sur le Librem 5. Or, toutes les applications ne fonctionnent pas bien avec lui.

Grim et capture d’écran

Ainsi, pour obtenir une copie d’écran sous Wayland, il faut utiliser un logiciel du nom de « grim ». Pour le faire simplement, en suivant l’article cité précédemment, il faut simplement installer grim et ce qu’il faut pour notifier l’utilisateur qu’une capture d’écran va être faite :

sudo apt-get install grim libnotify-bin notify-send

Puis, il faut créer un script, qu’on peut nommer « screenshot », contenant :

#!/bin/bash
SCREENSHOT="/home/purism/Pictures/$(date +%Y-%m-%d-%H%M%S).png"
notify-send -t 1000 screenshot "Taking a screenshot in 5 seconds"
sleep 5
grim "$SCREENSHOT"
notify-send screenshot "Screenshot stored at ${SCREENSHOT}"

dont le code est évident et qu’il ne faut pas oublier de rendre exécutable par :

chmod a+x /home/purism/bin/screenshot

On peut ensuite le lancer pour le tester en étant dans le répertoire dans lequel il se trouve par :

./screenshot

Et là, normalement vous devriez obtenir une belle copie des deux écrans simultanément dans le répertoire « Pictures ».

Finalement, on peut créer un lanceur permettant de réaliser une copie d’écran à partir du script « screenshot » en plaçant le fichier « screenshot.desktop » dans le répertoire du lien : /home/purism/.local/share/applications/screenshot.desktop. Il doit contenir :

[Desktop Entry]
Name=Screen Shot
Type=Application
Icon=applets-screenshooter
Exec=screenshot
Categories=Utility;

Ainsi, au prochain redémarrage du téléphone, apparaîtra une jolie petite icone dans les applications permettant de réaliser la capture d’écran.

Vous trouverez dans l’article mentionné ci-dessus, une amélioration de ce script permettant notamment de régler le délai avant que la capture soit réalisée.

Voilà pour cette première présentation de la convergence. Deux autres articles vous en diront plus en vous présentant la convergence liant caméra, reconnaissance de caractères et publication sous LaTeX.

Librem 5 et localisation

Je suis toujours en admiration vis-à-vis de la capacité de certains hommes à gérer la différence. Ici, il s’agit de différences linguistiques : la gestion des langues sur un système d’exploitation.

À priori, le problème est simple : on veut que son ordinateur ou téléphone parle comme nous. Prenons le français par exemple. On peut croire qu’il suffit d’indiquer à sa machine que notre langue est le français pour que tout soit réglé. Mais le problème n’est pas si simple. Voici ce que le Librem propose dans son panneau des préférences, sous « Pays et langue » :

Il y a non seulement la langue, mais divers formats, c’est-à-dire différentes variantes de la langue française. Ici on a la langue française avec une variante suisse (mais cela pourrait être du canadien, par exemple). Les variantes sont importantes non seulement pour des spécificités linguistiques, mais pour la gestion des claviers. Je dis « des », car non seulement la convergence va impliquer l’utilisation d’un clavier physique qui doit être correctement configuré (ici un clavier suisse romand : QWERTZ), mais aussi pour la configuration du clavier virtuel. Avec le Librem, pas moins de trois claviers virtuels sont nécessaires : le clavier suisse, le clavier français et un clavier virtuel dit de « Terminal » qui permet d’utiliser au mieux une console avec des flèches directionnelles et une touche « esc », notamment.

Dès le départ, le Librem demande la configuration de la langue. Or, le problème que j’ai rencontré est qu’après avoir spécifié le français suisse, j’ai voulu retirer l’anglais. Ce fut une mauvaise idée, puis alors toutes les langues qui m’étaient connues ont soudainement disparu. Ce genre de bugs est classique et il peut être difficile d’y remédier sous Android par exemple. Sous PureOS, les commandes propre à un système d’exploitation tels que Debian, permettent de le faire sans difficultés en reconfigurant les locales. Ainsi, un très classique :

sudo dpkg-reconfigure locales

permet de re-générer les locales souhaitées et de spécifier la locale principale (ici le français suisse en UTF8 : fr_CH-UTF8). Mais pour sélectionner les locales au clavier, encore faut-il savoir qu’un clavier de terminal est disponible à gauche de la touche d’espace du clavier virtuel. De plus, non seulement il faut bien savoir qu’il ne faut pas supprimer l’anglais, mais pas non plus le français, car le clavier virtuel suisse romand ne dispose pas de caractères accentués, pour une raison encore inconnue.

Une fois cela fait, il faut finalement ne pas oublier de mettre le clavier suisse romand tout en haut des sources de saisie et qu’il est possible qu’il se déplace parfois vers le bas lors d’un redémarrage.

Tout cela ne fut pas bien problématique pour moi qui suis habitué à régler ces problèmes en ligne de commande, mais cela peut constituer une difficulté pour un néophyte. Une fois tout cela bien configuré, il faut reconnaître que les claviers virtuels sont agréables, ni trop grands ni trop petits, qu’on ne peut rapidement plus se passer du clavier du terminal et qu’en mode de convergence (voir l’article éponyme) le clavier physique fonctionne parfaitement. Relevons aussi que le clavier du terminal et présent par défaut et qu’il est très convainquant, contrairement aux différents claviers de terminaux sous Android qui embarquent quasiment tous des traceurs et sont souvent peu praticables. Par contre, évidemment le swipe n’est pas au rendez-vous.

30. Systemd utilisateur

Ceci n’est pas un article sur systemd, mais la présentation d’une utilisation très pratique de systemd par un utilisateur pour lancer une commande avec systemd au lancement de la session de l’utilisateur. L’article sur lequel je me suis basé pour réaliser ce que je voulais est : https://medium.com/@alexeypetrenko/systemd-user-level-persistence-25eb562d2ea8

Mon problème était le suivant : je dispose d’un clavier bluetooth récupéré d’une tablette obsolète. Or ce clavier ne dispose pas de la touche backslash (\). C’est extrêmement désagréable pour quelqu’un qui pratique intensivement LaTeX.

Il s’agissait donc de lancer une modification du clavier à chaque lancement de session. Pour cela il fallait d’abord savoir comment affecter la touche backslash à l’une des touches libre de mon clavier. Après quelques recherches, le logiciel permettant cette modification a été trouvé et la commande suivante testée fonctionnelle :

xmodmap -e 'keycode 202=backslash' & 

Xmodmap permet d’affecter une touche physique, ici la touche 202, à un caractère, ici backslash. Pour déterminer le code de la touche, la commande suivante est nécessaire :

xev -event keyboard

Une fois lancée, en pressant sur une touche, on obtient un retours comme :

KeyPress event, serial 25, synthetic NO, window 0x3a00001,
    root 0x389, subw 0x0, time 5876177, (922,180), root:(924,260),
    state 0x0, keycode 202 (keysym 0x5c, backslash), same_screen YES,
    XLookupString gives 1 bytes: (5c) "\"
    XmbLookupString gives 1 bytes: (5c) "\"
    XFilterEvent returns: False

dans lequel figure « keycode 202 » (ici déjà affectée à backslash). L’esperluette (&) de la fin de commande permettait de lancer la commande pour une session, ce que systemd va nous permettre de faire automatiquement et cela sans aucun droits de superutilisateur.

Venons en donc à systemd. À l’instar des services lancés par systemd pour root, l’idée est de mettre dans le répertoire (à créer au besoin) :

.config/systemd/user/

un fichier de service à lancer au démarrage de la session. Dans mon cas, le nom de ce fichier sera évidemment « backslash.service » puisque ce service va me permettre de disposer de la touche backslash. Son contenu sera le suivant :

[Unit]
Description=Just for backslash character

[Service]
ExecStart= /usr/bin/xmodmap -e 'keycode 202=backslash'
Restart=always
RestartSec=60

[Install]
WantedBy=default.target

Les lignes de restart signifient qu’en cas de problème le démon est relancé au bout de 60 secondes.

Pour installer le service, il faut alors utiliser la commande :

systemctl --user enable backslash.service

Un certains nombre de liens seront créé pour que systemd puisse lancer le service au démarrage de la session.

Pour démarrer le démon sans relancer la session, il faut classiquement faire :

systemctl --user start backslash.service

Si cela ne fonctionne pas, comme ce fut le cas pour moi, lancez :

systemctl --user status backslash.service

L’état du service vous sera retourné et vous verrez apparaître un « Failure » si la commande de votre service est mauvaise. En l’occurrence, pour moi, ce fut le fait qu’il fallait mettre le chemin complet vers xmodmap, soit /user/bin/xmodmap.

Enfin, après avoir corrigé les problèmes, un :

systemctl --user restart backslash.service

ne suffit pas. Il faut encore recharger l’ensemble des démons de l’utilisateur par :

systemctl --user daemon-reload
Voilà. Systemd peut donc être très utile au niveau utilisateur pour remettre en place des fonds d'écran par exemple ou tout autre commande à lancer au démarrage de la session utilisateur.

Raspberrypi : mise-à-jour stretch-buster

Voici un petit memo pour réaliser la mise-à-jour d’un raspberrypi tournant sous Raspbian stretch vers Raspbian buster.

Tout d’abord, il faut savoir que le téléchargement des paquets nécessaires à la mise-à-jour ne peut se faire que si la place nécessaire pour les stocker est disponible. Pour un système complet, il faut prévoir 8Go. Ainsi, vérifiez avec la commande :

df -h

que celle-ci est bien disponible. Cette commande signifie « disk free -human », soit en français « quelle est la place libre sur le disque, dans un langage humain ». Vous verrez alors apparaître une colonne vous donnant la mémoire disponible directement en Go.

Il faut ensuite réaliser un audit des paquet permettant de savoir si ceux-ci sont dans un état correct pour la mise-à-jour :

sudo dpkg --audit

Puis, il faut voir si des paquet sont bloqués :

sudo dpkg --get-selections | grep hold

L’argument de dpkg permet de récupérer la liste des paquets installés dont on recherche avec grep le motif « hold ». Ce motif signifie que l’utilisateur ne veut pas modifier (mettre-à-jour) le paquet. Comme cela peut poser problème, il faut qu’aucun paquet ne soit dans cet état à moins d’une bonne raison.

Il faut ensuite mettre à jour le système à partir duquel on va faire la mise-à-jour :

sudo apt-get update
sudo apt-get upgrade
sudo apt-get dist-upgrade

La première commande fait une mise-à-jour de la liste des paquets. La seconde mets à jour les paquets non vitaux et la troisième fait la mise-à-jour des paquets vitaux.

Il faut ensuite changer le nom des dépôts pour passer les faire pointer vers la nouvelle distribution Buster :

sudo sed -i /deb/s/stretch/buster/g /etc/apt/sources.list
sudo sed -i /deb/s/stretch/buster/g /etc/apt/sources.list.d/*.list

Ce deux lignes sont complexes. L’idée est de changer toutes les ocurences « strech » en « buster » dans plusieurs fichiers. Comme avec Debian, le fichier « source.list » du répertoire /etc/apt/ est touché. Mais en plus tous les fichiers .list du répertoire /etc/apt/source.list.d/, ce qui est propre à Raspbian.

L’utilitaire permettant ces modifications automatiquement est sed. Dans le cas présent, on utilise -i pour spécifier qu’on va écraser le fichier original. Puis, on spécifie que toutes les lignes (/g) commençant par deb se verront substituer (s) le motif stretch par buster.

Cela fait, on met à jour la liste des paquets de buster :

sudo apt-get update

Puis, on met à jour la distribution :

sudo apt-get upgrade
sudo apt-get dist-upgrade

Des questions vous seront posées auxquelles il faudra répondre Y dans la plupart des cas, à moins de savoir ce que vous faites.

Reste à effacer les paquets qui ne sont plus nécessaires :

sudo apt autoremove -y
sudo apt autoclean

Normalement tout devrait bien se passer. Mais, il arrive que ce ne soit pas le cas. Lisez bien alors les messages d’erreurs, car parfois ils permettent de forcer l’installation de quelques paquets récalcitrants qui peuvent bloquer la mise-à-jour.

La machine est ton seigneur et ton maître

Un ouvrage incroyable.

Les machines ne libéreront jamais l’Homme. Les machines ne seront jamais à la hauteur de ce que peut faire ou penser un être humain.

Par contre, elles sont déjà et seront certainement de plus en plus un outil d’asservissement au service de tous les pouvoir, quels qu’ils soient.

Ce livre retrace l’histoire des esclaves d’aujourd’hui qui sont opprimés pour donner l’illusion que les machines pourraient mener à un monde meilleur. Pour une infime minorité d’exploiteurs à la tête de multinationales voyous comme les GAFAM, elle permettrons certainement d’exprimer une cupidité sans aucune limite, mais sans aucun doute au détriment du reste du monde, au mépris de toute humanité.

Ce petit livre devrait être pour chacun le rappel que les machines tuent et que ceux qui tuent pour les vendre sont à la tête de nos sociétés.

Raspberrypi : bureaux virtuels

Le monde linux connaît bien les bureaux virtuels. Sur Raspberrypi, ils ne sont pas actifs par défaut. Pour les activer, il faut avoir recours à l’interface graphique de gestion du bureau « Open Box Configuration Manager » ou « Obconf » de son petit nom, qui n’est pas présente par défaut dans le menu framboise. Pour la faire apparaître, il faut se rendre dans le préférences de ce menu pour y sélectionner « Main Menu Editor ». Ensuite, dans cet éditeur de menu, il faut sélectionner les « Préférences » est cocher l’item « Open Box Configuration Manager ». Celui-ci apparaît alors dans les préférences du menu framboise.

En s’y rendant, sous l’onglet Bureau, on peut choisir le nombre de bureaux virtuels désirés et éventuellement les nommer.

Pour pouvoir les utiliser, il faut ensuite mettre un widget dans la barre de menus permettant de sélectionner celui sur lequel on veut se trouver. Pour cela, il faut cliquer-droit sur la barre de menus et choisir « Ajouter / Enlever des éléments au tableau de bord ». Ensuite, sous l’onglet « Appliquettes du tableau de bord », il faut choisir à gauche « Ajouter » et ajouter « Gestionnaire de bureaux virtuels ». On peut ensuite, en remontant l’appliquette dans la liste, la déplacer dans le tableau de bord pour une utilisation facilitée.

Reste que la sélection du bureau virtuel doit se faire avec la souris, ce qui n’est pas très agréable. Sous Debian, par exemple, choisir des équivalents claviers pour se déplacer d’un bureau virtuel à l’autre est facilité par un interface graphique. Sous Raspberry, il va falloir passer par l’édition d’un fichier de configuration d’Open Box. Il s’agit de :

~/.config/openbox/lxde-pi-rc.xml

Si ce fichier n’est pas présent, il faut créer dans le répertoire « .config » le répertoire « openbox » et y placer une copie du fichier :

/etc/xdg/openbox/lxde-pi-rc.xml

Ne travaillez pas directement dans le fichier sous etc, car il peut être mis-à-jour. Rendez-vous donc dans celui sous « .config ». Ce fichier contient énormément de choses. Notamment la liste des équivalents claviers. Cherchez-y donc la première ligne du code qui suit :

  <keyboard>
    <chainQuitKey>C-g</chainQuitKey>
    <!-- Keybindings for desktop switching -->
    <keybind key="C-A-Left">
      <action name="GoToDesktop"><to>previous</to><wrap>no</wrap></action>
 <!-- <action name="UnmaximizeFull"/>
      <action name="MaximizeVert"/>
      <action name="MoveResizeTo">
        <width>50%</width>
      </action>
      <action name="MoveToEdge">
        <direction>west</direction>
	    </action> -->
    </keybind>
    <keybind key="C-A-Right">
      <action name="GoToDesktop"><to>next</to><wrap>no</wrap></action>
<!--  <action name="UnmaximizeFull"/>
      <action name="MaximizeVert"/>
      <action name="MoveResizeTo">
        <width>50%</width>
      </action>
      <action name="MoveToEdge">
        <direction>east</direction>
            </action> -->
    </keybind>

Comme vous pouvez le voir, il s’agit de la partie consacrée au clavier. Oubliez les trois premières lignes. La quatrième définit l’équivalent clavier Ctrl-Alt-Left, c’est-à-dire ce qui va se passer quant on va presser simultanément sur Ctrl, Alt et la flèche gauche. En commentaire (<!– … –>) se trouve que que vous pouvez effacer, soit les actions prédéfinies pour cet équivalent clavier. À la place mettez la ligne :

<action name="GoToDesktop"><to>previous</to><wrap>no</wrap></action>

qui définit l’action du changement de bureau virtuel. Pour la flèche gauche, il s’agit de revenir sur le bureau précédent. C’est pourquoi l’action est « previous » et quelques lignes plus bas pour la flèche droite, l’action est « next ». Ainsi, au final, vous devriez avoir :

  <keyboard>
    <chainQuitKey>C-g</chainQuitKey>
    <!-- Keybindings for desktop switching -->
    <keybind key="C-A-Left">
      <action name="GoToDesktop"><to>previous</to><wrap>no</wrap</action>
    </keybind>
    <keybind key="C-A-Right">
      <action name="GoToDesktop"><to>next</to><wrap>no</wrap></action>
    </keybind>

En enregistrant ces modifications, vous pourrez alors changer de bureau directement au clavier, ce qui est très pratique.