Miamondo "dieu n'a pas voulu autre chose que la liberté" (commandant massoud)
http://miamondo.e-monsite.com

Linux

  • Python: La programmation parallèle avec le module threading

    Bonjour, 

    Aujourd'hui, j'ai envie de vous parler du module threading. Ce dernier gère la programmation parallèle dans le langage Python et il est fort utile. Je l'ai utilisé pour créer un bouton dont la finalité est d'afficher l'heure à la seconde près, et d'ouvrir un calendrier. Ce bouton a donc deux fonctions et pour remplir sa mission, il a besoin de deux boucles:

     

     Clockbutton2

             

    • une boucle qui surveille les événements de l'utilisateur. C'est la boucle mainloop() de l'environnement graphique tkinter. Par exemple, Si le pointeur de la souris survole le widget Button, la couleur de ce dernier change.
    • une boucle infinie de type while, qui tourne toutes les secondes et qui permet d'afficher l'heure exacte sur le bouton.

    Si nous ne lançons pas ces deux boucles en parallèle, alors soit le code affichera le défilement des secondes mais le bouton sera inactif, soit le bouton sera actif mais les secondes seront figées dans l'éternité... Enfin, jusqu'à l'arrêt forcé du programme.

    Voici un exemple de code qui ne fonctionne pas. Il y a dans ce code deux boucles : while 1 qui est une boucle infinie et mainloop() réceptionnaire d'événements du GUI tkinter. Lorsque le programme pénètre dans la boucle infinie, il n'a plus aucun moyen d'en sortir. Certes, il affichera le défilement des secondes jusqu'à la fin des temps, mais comme la boucle mainloop() se trouve en dehors, nous n'avons plus accès aux événements du bouton. Celui-ci est complètement pétrifié. Comme je l'explique plus bas dans la vidéo en lien avec ce billet, il n'est même pas possible de cliquer sur la croix pour fermer le programme.

    Si nous déplaçons la toute dernière instruction (button.mainloop) à l'intérieur de la boucle while, une seule seconde va défiler puis le programme va "sauter" dans la boucle mainloop() et quitter la boucle infinie. Nous aurons accès aux fonctionnalités du bouton mais l'heure restera figée.

    La solution

    Elle est fort simple. Voici le code qui fonctionne. Il suffit de créer deux objets de la classe threading et de les démarrer en parallèle presque simultanément grâce à la méthode start(). Celle-ci va ensuite passer le relais à la méthode self.run(). Les noms de ces deux méthodes sont génériques. Ils ne peuvent pas être remplacés par d'autres termes. Les deux processus ne démarrent pas exactement au même moment. Il y a une différence de 200 millièmes de secondes. Dans ce cas précis, cet intervalle est nécessaire si on ne veut pas que le programme se crashe lamentablement juste après le décollage.

    Une fois lancé, chaque "thread" vit sa vie. Ils ont toutefois la possibilité d'accéder à des instructions communes comme par exemple les variables de classe. C'est le cas dans mon programme. La boucle infinie a besoin de la variable qui stocke l'objet fenêtre principale. Mais pour éviter qu'ils se mélangent les pinceaux et qu'ils modifient au même moment des données vitales pour la stabilité du programme, nous importons la classe Lock() du module threading.

    Lock() signifie verrou. Je déclare donc une variable (lock = Lock()) en tout début de programme, et je verrouille le premier thread grâce à l'instruction with lock. Avec cet outil, le second thread ne ne démarrera que lorsque le premier aura terminé son travail et lui aura passé la main. En clair, le premier thread fait ce qu'il a à faire, tandis que le second qui n'est pas verrouillé, reste sur le seuil de la porte. Lorsque le premier est prêt, il ouvre la porte et laisse entrer le second thread. Si le premier doit reprendre son travail pour modifier je ne sais quel bouton, il prie le second de bien vouloir sortir de la pièce. C'est très pratique! Bien évidemment, comme le second thread est une boucle infinie, il n'est pas possible de le verrouiller. Il ne passerait jamais la main à son collègue. Voilà donc pour le module threading que je vous invite à découvrir. Si vous avez des remarques ou des interrogations, n'hésitez pas. Ma porte est ouverte.

     

  • Un environnement de bureau codé en Python

    1ère partie : la barre des tâches

     

    Taskbar3

    Bonjour,

    Il y a un peu plus d'un an, je m'étais lancé dans un projet ambitieux, en l'occurrence la programmation d'un environnement de bureau en langage Python. Le résultat n'avait pas été à la hauteur de mes espérances. Si j'ai réussi à coder le menu des applications, je n'ai jamais réussi à coder proprement la barre des tâches et le fond d'écran.

    Les boutons de la barre des tâches tremblotaient ou disparaissaient inopinément ce qui n'était pas un signe de stabilité. Mais ça, c'était avant. Aujourd'hui, je peux annoncer que j'ai réussi à coder une barre des tâches stable et fonctionnelle. Voici une petite vidéo pour illustrer mes propos:

     

     

    Vous trouverez le code sur mon dépôt git, à cette adresse.Le fichier qui lance l'application, se nomme miamondo.py. Il est mis à jour quotidiennement.

    Points à corriger ou à améliorer

    • Le placement des fenêtres. Lorsque l'une d'entre elles est maximisée et couvre les autres, je dois iconifier et désiconifier ces dernières pour les faire apparaitre au-dessus. Ce n'est pas satisfaisant.
    • Les icônes des boutons. J'ai prévu une icône par défaut, pour éviter de faire planter l'application. Mais cette icône apparait bien trop souvent à mon goût. Elle signifie que je n'ai pas réussi à automatiser mon système d'icônes de manière satisfaisante. La raison en est que je ne maîtrise pas suffisamment les expressions régulières (regex). Je dois donc travailler ce point en priorité. Les icônes sont toutes présentes dans mon système de fichiers Archlinux, soit sous /usr/share/icons ou bien sous /usr/share/pixmaps. Les applications sont toutes répertoriées sous /usr/share/applications. J'ai tout ce qu'il faut pour bien faire. Le problème vient donc de mes lacunes en regex.

    Points de satisfaction

    • Stabilité du code. Dans la barre des tâches, les boutons des applications ouvertes ne scintillent pas ou pire encore, ne disparaissent pas de manière inopinée. À l'ouverture d'une fenêtre, le bouton se matérialise immédiatement. À la fermeture de cette même fenêtre, le bouton qui lui est lié, disparait immédiatement de la barre des tâches. Cela prouve que les boucles fonctionnent. 
    • Découverte de la programmation parallèle avec le module threading.
    • Découverte et prise en compte de l'importance du module regex.
    • Le nombre de processus zombies ne dépasse pas 2, ce qui est le signe que le programme est plutôt bien codé, me semble-t-il.

    À bientôt pour la deuxième partie qui vous présentera le menu principal.

  • Se connecter au réseau en l'absence de gestionnaire de connexion

    Bonjour,

    Il y a quelque temps, je me suis retrouvé confronté à un problème inattendu. Je m’étais mis en tête de remplacer Network-Manager, mon gestionnaire de connexions réseau, par wicd, autre gestionnaire de connexions dont l’icône me plaisait beaucoup. 

    À l’époque, j’étais encore sous Debian. J’ai donc procédé de la sorte:

     

     sudo apt purge network-manager

     sudo apt-install wicd

     

     

    Et bien évidemment, j’ai obtenu une erreur. Il m’était impossible de télécharger les paquets et d’installer wicd puisque je n’avais plus de connexion au réseau. Je venais de virer network-manager!

    Faut-il être nouille tout de même! Alors comment faire pour rattraper pareille boulette? Dieu soit loué, ce n’est pas bien compliqué. Dans un terminal, il suffit d’éditer le fichier /etc/network/interfaces avec les droits de super administrateur.

     

     sudo nano /etc/network/interfaces

     

     

    Rajoutez les lignes suivantes à la fin du fichier :

     

     allow-hotplug eth0

     iface eth0 inet dhcp

     

    Ctrl + X pour sortir et Yes pour sauvegarder (ou Oui, ou Ja… Tout dépend de votre langue).

    Ensuite, entrez les commandes suivantes dans un terminal avant de rebooter:

     

     sudo ifdown eth0

     sudo ifup eth0

     sudo apt install wicd

     

    Et le tour est joué!

  • A start job is running...

    Introduction

    Quel adorateur du Grand GNU-à-tête-de-Linux n'a jamais été confronté à cette antienne au démarrage de son ordinateur? "A start job is running..." Cet avertissement sybillin s'accompagne d'une suite de chiffres et de lettres ainsi que d'un décompte qui dure en général un peu plus d'une minute trente. Dans le meilleur des cas, ce dernier prend fin par l'apparition de votre écran de connexion, sans autre conséquence... Mais dans le pire des cas, il se peut que vous soyez obligé de vous dépanner en ouvrant une console et en suivant la procédure du dernier paragraphe de cet article.

     

    Origine du disfonctionnement

    Cela est du à une mauvaise configuration du fichier /etc/fstab (File System Table). Ce dernier contient une liste de systèmes de fichiers montés automatiquement à l'initialisation du système d'exploitation. Chaque partition se voit attribuée un identifiant appelé UUID, c'est-à-dire Universal Unique Identifier, qui est normalement reporté dans le fichier /etc/fstab avec le point de montage qui lui correspond ainsi que diverses options.

    • UUID=a8b9ba74-436d-4a54-8d74-cbf75c77a842 /
    • UUID=201c5920-3b1d-450c-9338-4dcde819bf0d /home

    Si, pour une raison quelconque, les informations contenues dans le fichier /etc/fstab ne correspondent pas aux UUID de la table de partitions, alors le message apparaît au démarrage et retarde d'une minute trente l'initialisation de votre système car l'ordinateur cherche quelque chose qu'il ne trouve pas et de guerre lasse, il finit par abandonner.

    Prenons un exemple concret. Fortement alcoolisé, vous décidez de supprimer votre partition de SWAP parce que vous trouvez cet acronyme ridicule. Cela n'a aucune conséquence fâcheuse tant que votre mémoire vive n'est pas remplie. Quelques jours plus tard, pris de remords, vous la recréez... Celle-ci aura un nouvel UUID qui ne correspondra plus à celui qui est reporté dans le fichier /etc/fstab. Conséquence, au prochain démarrage... "A start job is running".

    Quand cela concerne la partition de SWAP, cela ne fait que retarder le démarrage de votre ordinateur d'une minute trente. Ensuite, vous pourrez utiliser votre système tout à fait normalement. Mais par curiosité, je me suis amusé à changer un chiffre dans l'UUID de mes trois autres partitions et à redémarrer l'ordinateur après chaque modification :

    • Partition 1 (/boot) : Décompte d'une minute trente puis démarrage possible mais seulement en root. Matérialisation d'un bureau openbox dénué de toute configuration. 
    • Partition 2 (montée à la racine, avec tous les répertoires nécessaires au bon fonctionnement du système) : Décompte d'une minute trente suivi d'un démarrage possible mais j'ai noté un comportement très bizarre. j'ai voulu effectuer une modification dans un terminal, en mode root. C'était impossible. J'ai redémarré l'ordinateur pour remettre à jour le fichier /etc/fstab dans une console tty. Là encore, je me suis connecté en root et j'ai ouvert le fichier avec l'éditeur nano. Le fichier était toujours protégé en écriture! Impossible de modifier. Il a fallu que je me dépanne avec mon deuxième système d'exploitation présent sur un autre disque dur. J'ai ainsi pu monter la partition et corriger le fichier /etc/fstab avant de redémarrer.
    • Partition 3 (/home séparé) : Décompte d'une minute trente. Impossible de lancer ma session graphique. J'étais coincé à la racine du système sans pouvoir accéder à mon répertoire personnel (miamondo@ordinateur :/$). J'ai corrigé ​le fichier /etc/fstab et j'ai pu redémarrer normalement.
     

    Solution

    Eh bien, elle est toute simple. Il suffit de s'assurer que les UUID du fichier /etc/fstab sont corrects et si ce n'est pas le cas, il faut les mettre à jour. Pour connaître les UUID de vos partitions, vous pouvez utiliser gnome-disks ou bien gparted (en effectuant un clic droit sur la partition voulue et en sélectionnant information, tout en bas du menu déroulant).

     

    Startjob 1

     

    Vous pouvez aussi entrer la commande blkid dans un terminal. Cette dernière va vous lister toutes les partitions avec leur UUID et leur type mais pas les points de montage.

     miamondo@computer: ~$ sudo blkid

     pasvorto por miamondo:

     /dev/sdc1: UUID="e74ea076-d57c-4df0-b94a-ec8e868eff11" BLOCK_SIZE="4096" TYPE="ext4" PARTUUID="ef8cb1e5-01"

     /dev/sdc2: UUID="29a93d94-d4a5-4d68-890d-d906c8e780a6" BLOCK_SIZE="4096" TYPE="ext4" PARTUUID="ef8cb1e5-02"

     /dev/sdc3: UUID="7c4e71e4-5ae4-4f5b-be9d-51003722eba9" TYPE="swap" PARTUUID="ef8cb1e5-03"
     

     

    Vous pouvez également utiliser cette commande:

     miamondo@computer: ~$ ls -l /dev/disk/by-uuid

     lrwxrwxrwx 1 root root 10 Mar  3 11:05 29a93d94-d4a5-4d68-890d-d906c8e780a6 -> ../../sda2

     lrwxrwxrwx 1 root root 10 Mar  3 11:05 7c4e71e4-5ae4-4f5b-be9d-51003722eba9 -> ../../sda3

     lrwxrwxrwx 1 root root 10 Mar  3 11:05 e74ea076-d57c-4df0-b94a-ec8e868eff11 -> ../../sda1
     

      

    Editer le fichier /etc/fstab

    Maintenant, vient le moment de vérifier si les UUID que vous avez récupérés correspondent à ceux du fichier /etc/fstab. Il va donc falloir ouvrir ce dernier et éventuellement l'éditer. Ça se passe dans un terminal en mode superutilisateur (sudo). Vous pouvez l'ouvrir soit avec nano, l'éditeur de console, soit avec un autre éditeur graphique tel que kate ou pluma. Voici donc le contenu d'un fichier /etc/fstab:

     miamondo@computer: ~$ sudo blkid

     pasvorto por miamondo:

     # Static information about the filesystems.
     # See fstab(5) for details.

     # <file system>                              <dir> type>   <options>    <dump>   <pass>
     

     # /dev/sda1
     UUID=e74ea076-d57c-4df0-b94a-ec8e868eff11    /     ext4    rw,relatime  0        1

     # /dev/sda2
     UUID=29a93d94-d4a5-4d68-890d-d906c8e780a6   /home  ext4    rw,relatime  0        2

     # /dev/sda3
     UUID=7c4e71e4-5ae4-4f5b-be9d-51003722eba9   none   swap    defaults     0        0

     

     

    Analysons la ligne qui commence par le commentaire #/dev/sda1. L'UUID de la ligne suivante est celui de la partition /dev/sda1. On constate que le point de montage est à la racine du système (/). Nous trouvons également le type de partition (ext4) et des options de montage. Les deux derniers chiffres correspondent à des indicateurs pour dump et fsck. Je ne rentre pas dans les détails.

    Pour ce qui est de /dev/sda2, on voit que la partition est montée sur /home. Vous pouvez très bien modifier le point de montage directement dans ce fichier.

    Enfin, la partition /dev/sda3 n'a pas de point de montage (none). C'est normal, elle correspond à la swap.

    Vérifiez si tous les UUID sont cohérents. Si ce n'est pas le cas, un simple copier-coller de l'UIID correct suffira à faire disparaître le message d'alerte et à assurer un démarrage carré de votre système d'exploitation. Les quelques instructions d'initialisation qui défileront pendant quelques secondes seront toutes précédées d'un OK.

  • J'ai libér/é/ mon smartphone

    Non, je vous rassure tout de suite concernant le titre. Je n'ai pas cédé à la mode de l'écriture inclusive. Le "é" entouré de slashes signifie que j'ai réussi à installer le système d'exploitation français /e/ sur mon portable. Du reste, nous reviendrons un peu plus tard sur ce drôle de nom qui me chagrine un peu.

     

    En attendant, laissez-moi vous conter ma dernière aventure. J'ai découvert /e/ dans un article de Toolinux. Il s'agit d'un système d'exploitation qui est une version d'Androïd totalement dégouguelisée. Je vous invite à vous rendre sur le site de la e.fondation. La devise de celle-ci est Vos données sont vos données. Personnellement, j'aurais traduit par Vos données vous appartiennent.

    Le créateur de /e/  Le créateur d'/e/ Le cr/é/ateur s'appelle Gaël Duval. Il est bien connu dans le monde du libre pour en être l'un de ses pionniers et pour avoir notamment lancé en 1998 la distribution Mandrake Linux. Cocorico!

    Vous trouverez sur cette page la liste de tous les smartphones qui peuvent basculer sur /e/. Le mien est un Samsoul Galaxy S6. Il est dans la liste. Je me suis donc fait un plaisir de tenter l'expérience. Ça faisait longtemps que j'avais envie de libérer mon smartphone mais je ne savais pas comment m'y prendre. J'ai essayé des trucs plus ou moins foireux qui n'ont jamais abouti. C'est vous dire ma joie en réalisant qu'une alternative sérieuse existait... Je me suis couché tard hier soir, ou plutôt tôt ce matin, car le tutoriel d'installation n'est pas fait pour les débutants, ni même pour les autres d'ailleurs. C'est assez obscur et il m'a fallu une bonne dose de chance avant de voir se dessiner la lettre stylisée /e/ sur la page d'accueil de mon Samsoul. Les ingénieurs et les techniciens ne sont pas de grands pédagogues. J'ai remarqué qu'ils avaient du mal à faire le tri entre les informations importantes qui doivent être communiquées au néophyte et les détails inutiles qui ne font qu'embrouiller ce dernier.

    Heureusement, la fondation /e/ propose deux alternatives à celles et ceux qui ne veulent pas se lancer dans une installation de tous les dangers:

    • Soit vous achetez auprès de la fondation un smartphone déjà équipé d'/e/ équipé de /e/ équip/é/.
    • Soit vous leur envoyez votre smartphone par la poste et l'/é/quipe se charge de vous l'installer.

    C'est sur cette page que ça se passe. Je vous conseille vivement de ne pas vous lancer vous-même dans une installation qui peut se transformer en naufrage. Personnellement, je me suis fait des frayeurs! En attendant que les tutoriels soient plus accessibles, contentez vous d'envoyer votre smartphone à la fondation. Et si vraiment vous tenez à installer vous-même /e/, faites-le à jeûn.

    Le résultat de l'opération, le voici :

     

    E smartphone

     

    Je me retrouve avec un smartphone parfaitement opérationnel, dont les données personnelles sont protégées, un smartphone très agréable à utiliser parce que plus léger. Que du bonheur!

    Vous savez quoi? Lorsque le logo /e/ s'est matérialisé sur mon smartphone, j'ai repensé au moment précis où, en 2010, j'ai vu apparaître pour la première fois, le logo Ubuntu sur mon ordinateur portable. Un moment presque magique, une émotion difficile à contrôler... J'ai éclaté en sanglots.

    Maintenant, passons à ce qui me chagrine, en l'occurrence le nom du système d'exploitation... /e/. C'est juste pas possible! C'est quoi cette langue? Qu'on m'explique comment se prononce un slash!

    Plus grave encore, j'ai tapé /e/ dans le champ de saisie de Qwant, mon moteur de recherche favori. Je n'ai obtenu aucune occurrence, je dis bien aucune. /e/ est complètement invisible! Et compte tenu de la réussite évidente de ce produit, moi je trouve que c'est dommage. Alors, comme je n'aime pas les gens qui ne savent que critiquer et qui ne proposent jamais de solutions, je me lance dans une suggestion :

    Alt/e/r

    Comme cela, on retrouve le /e/ et Alt/e/r fait penser à alternatif. On est en plein dans le sujet!

    Bon... Je vais dormir.