• Li chevron_right

      Port complet de TapTempo en C# 9

      xcomcmdr · pubsub.eckmul.net / linuxfr · Sunday, 10 January, 2021 - 23:02 · 8 minutes

    <h2 class="sommaire">Sommaire</h2> <ul class="toc"> <li><a href="#toc-les-sources">Les sources</a></li> <li><a href="#toc-pourquoi">Pourquoi ?</a></li> <li><a href="#toc-ce-qui-a-%C3%A9t%C3%A9-port%C3%A9">Ce qui a été porté</a></li> <li><a href="#toc-ce-qui-est-propre-%C3%A0-ce-port">Ce qui est propre à ce port</a></li> <li><a href="#toc-ce-que-jai-loup%C3%A9">Ce que j'ai loupé</a></li> <li><a href="#toc-note-%C3%A0-moi-m%C3%AAme">Note à moi-même</a></li> </ul> <p>Bonjour 'nal,</p> <p>Y'a plein de poussière ici dit moi. Faut dire que ça fait longtemps que je ne t'ai plus écrit.</p> <p>Ce WE, j'ai voulu faire honneur à Pierre Tramo avec un langage qui (à ses débuts) était une copie de Java avec quelques améliorations pour pas que le prof voit qu'on a copié sur le voisin.</p> <p>Je veux bien sûr parler de C#.</p> <h2 id="toc-les-sources">Les sources</h2> <p><a href="https://github.com/maximilien-noal/SharpTempo">C'est par là</a></p> <h2 id="toc-pourquoi">Pourquoi ?</h2> <p>Parce que j'en avais envie. Pour le fun. Parce que ça manquait (ou pas), surtout face au port Java.</p> <h2 id="toc-ce-qui-a-été-porté">Ce qui a été porté</h2> <p>Tout. Les traductions, les tests unitaires, le mode jeu, l'aspect orienté-objet, …</p> <h2 id="toc-ce-qui-est-propre-à-ce-port">Ce qui est propre à ce port</h2> <p>J'ai voulu utiliser au plus les possibilités modernes de C# 9 et précédents.</p> <p>Bon y'a pas de <a href="https://docs.microsoft.com/en-us/archive/msdn-magazine/2019/may/csharp-8-0-pattern-matching-in-csharp-8-0">pattern matching</a> ni d'async/await ni de <a href="https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/operators/stackalloc">stackalloc</a>, ni plein d'autres choses, mais c'est pour très une bonne raison : on en a pas besoin.</p> <p>Le point d'entré utilise des <em>top level statements</em> (C# 9) (et une lambda) :</p> <pre><code>using CmdTempo; using CommandLine; using CommandLine.Text; using LibTempo; // Set sentence builder to localizable SentenceBuilder.Factory = () =&gt; new LocalizableSentenceBuilder(); Parser.Default.ParseArguments&lt;Options&gt;(args).WithParsed((options) =&gt; Runner.RunOptions(options)); </code></pre> <p>Comme pour <a href="https://blog.stephencleary.com/2012/02/async-console-programs.html">async dans un point d'entrée de programme console</a>, ce n'est que du sucre syntaxique.<br> Le compilateur s'occupe de rajouter tout la sauce (namespace, classe statique, static void Main (string[] args)).</p> <p>Mais ça fait du bien à mes petits doigts potelés de ne pas avoir à l'écrire, et à mes yeux de ne pas avoir à les lire. Et ça, c'est bon !</p> <p>On utilise parfois des <a href="https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/proposals/csharp-8.0/ranges">ranges</a> sur des chaînes de caractère (C# 8) :</p> <pre><code>return String.Format(Resource.SentenceMutuallyExclusiveSetErrors, names[0..^2], incompat[0..^2]); </code></pre> <p>C'est beaucoup plus rapide à écrire qu'avec <a href="https://docs.microsoft.com/en-us/dotnet/api/system.string.substring?view=net-5.0">SubString</a>, et ça me rappelle <a href="https://ruby-doc.org/core-2.5.1/Range.html">mes années Ruby</a>.</p> <p>Les options sont une classe essayant de forcer l'immutabilité (<a href="https://devblogs.microsoft.com/dotnet/c-9-0-on-the-record/">un record</a>) (C# 9) :</p> <pre><code>namespace LibTempo { using CommandLine; public record Options { public const uint DefaultSampleSize = 5; public const uint DefaultResetTime = 5; public const uint DefaultPrecision = 0; public const uint MaxPrecision = 5; [Option('g', "game", Required = false, Default = false, HelpText = nameof(IsGamingMode), ResourceType = typeof(Resource))] public bool IsGamingMode { get; } [Option('s', "sample-size", Required = true, Default = DefaultSampleSize, HelpText = nameof(SampleSize), ResourceType = typeof(Resource))] public uint SampleSize { get; } [Option('r', "reset-time", Required = true, Default = DefaultResetTime, HelpText = nameof(ResetTime), ResourceType = typeof(Resource))] public uint ResetTime { get; } [Option('p', "precision", Required = true, Default = DefaultPrecision, HelpText = nameof(Precision), ResourceType = typeof(Resource))] public uint Precision { get; } public Options(bool isGamingMode, uint sampleSize, uint resetTime, uint precision) { IsGamingMode = isGamingMode; SampleSize = sampleSize == 0 ? DefaultSampleSize : sampleSize; ResetTime = resetTime == 0 ? DefaultResetTime : resetTime; Precision = precision &gt; MaxPrecision ? MaxPrecision : precision == 0 ? DefaultPrecision : precision; } } } </code></pre> <p>On utilise des extensions pour faire croire que nous aussi on a Back, Front, et IsEmpty dans la classe générique <a href="https://docs.microsoft.com/en-us/dotnet/api/system.collections.generic.queue-1?view=net-5.0">Queue</a> (C# 2 pour les <a href="https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/generics/">Generics</a> et 3 pour <a href="https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/concepts/linq/introduction-to-linq-queries">LINQ</a>, ça nous rajeunit pas) :</p> <pre><code>using System.Collections.Generic; using System.Linq; namespace LibTempo { internal static class QueueExtensions { public static bool IsEmpty&lt;T&gt;(this Queue&lt;T&gt; queue) =&gt; queue.Count == 0; public static T Back&lt;T&gt;(this Queue&lt;T&gt; queue) =&gt; queue.Last(); public static T Front&lt;T&gt;(this Queue&lt;T&gt; queue) =&gt; queue.First(); } } </code></pre> <p>On utilise partout des <a href="https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/statements-expressions-operators/expression-bodied-members"><em>expression body</em></a> pour des méthodes car les {} et return c'est <em>has-been</em> (C# 7) :</p> <pre><code>private double ComputeNewSecretBPM() =&gt; _betterRng.Next(50, 200); </code></pre> <p>On écrit le BPM avec la précision demandée <a href="https://docs.microsoft.com/en-us/dotnet/standard/base-types/standard-numeric-format-strings">en utilisant beaucoup moins le clavier</a> et avec de l'<a href="https://docs.microsoft.com/en-us/dotnet/csharp/tutorials/string-interpolation">interpolation</a> (C# 7) :</p> <pre><code>protected string BPMToStringWithPrecision(double bpm) =&gt; bpm.ToString($"G{_precision}", CultureInfo.CurrentCulture); </code></pre> <p>Et le pattern Fluent pour des tests plus rapidement écrits (mais ça c'est un package Nuget) :</p> <pre><code> [Fact] public void InvalidArsShouldReturnDefaultOptions() { var result = Parser.Default.ParseArguments&lt;Options&gt;(args: new string[] { "0", "0" }); result.Tag.Should().Be(ParserResultType.NotParsed); } </code></pre> <p>On a activé les <a href="https://docs.microsoft.com/en-us/dotnet/csharp/nullable-references">Nullable Reference Types</a> partout, parce que c'est la gueere contre les NullReferenceExceptions depuis C# 8 (comme beaucoup de choses, C# a piqué ça à F# où NULL n'existe pas) :</p> <pre><code> &lt;Nullable&gt;enable&lt;/Nullable&gt; &lt;TreatWarningsAsErrors&gt;True&lt;/TreatWarningsAsErrors&gt; </code></pre> <p>Ainsi, un accès à null (qui provoque un crash) est détecté à la compilation et traité comme une erreur.<br> Mais je n'ai pas eu l’occasion d'utiliser les annotations, donc pas de code à montrer. Le compilateur n'a rien dit.</p> <h2 id="toc-ce-que-jai-loupé">Ce que j'ai loupé</h2> <p>J'aurais pu convertir le projet en <a href="https://marketplace.visualstudio.com/items?itemName=SharpDevelopTeam.CodeConverter">VB.NET en un tour de main grâce au compilateur Roslyn</a>, afficher la console dans le navigateur avec <a href="https://github.com/ardacetinkaya/Blazor.Console">Blazor.Console</a>… Peut-être plus tard ?</p> <p>J'aurais pu aussi utiliser <a href="https://github.com/VitaliiTsilnyk/NGettext">NGetText</a> pour éviter les fichiers RESX et leur intrusion avec leurs clés en <a href="https://wiki.c2.com/?PascalCase">Pascal Case</a> dans le code, ce qui le rend moins lisible. Et ainsi garder le fichier .PO d'origine.</p> <pre><code>Console.WriteLine(Resource.HitEnterForEachTempoOrQToQuit); </code></pre> <p>Enfin, j'ai loupé mon week-end, et j'aurais pu me coucher plus tôt.</p> <p>Sacré Pierre Tramo !</p> <h2 id="toc-note-à-moi-même">Note à moi-même</h2> <p>Ce n'est pas parce que c'est plus facile de compiler et déboguer <a href="https://taptempo.tuxfamily.org/">TapTempo</a> quand on est sous Windows avec <a href="https://doc.ubuntu-fr.org/wsl">WSL</a> qu'il fallait forcément t'y intéresser !</p> <div><a href="https://linuxfr.org/users/xcomcmdr/journaux/port-complet-de-taptempo-en-c-9.epub">Télécharger ce contenu au format EPUB</a></div> <p> <strong>Commentaires :</strong> <a href="//linuxfr.org/nodes/122890/comments.atom">voir le flux Atom</a> <a href="https://linuxfr.org/users/xcomcmdr/journaux/port-complet-de-taptempo-en-c-9#comments">ouvrir dans le navigateur</a> </p>
    • At chevron_right

      Less is more, partie 1.5 : Encore une chose

      raspbeguy · pubsub.gugod.fr / atomtest · Wednesday, 21 December, 2016 - 23:00 · 7 minutes

    Quand vous vous préparez probablement à passer un joyer réveillon de Noël, je suis là à écrire pour votre bon plaisir. Appréciez svp. Pour la suite de cette série d'articles sur l'épuration de votre bureau, j'avais prévu de passer à la présentation d'outils courants pour les tâches quotidiennes, mai...

    Quand vous vous préparez probablement à passer un joyer réveillon de Noël, je suis là à écrire pour votre bon plaisir. Appréciez svp.

    Pour la suite de cette série d'articles sur l'épuration de votre bureau, j'avais prévu de passer à la présentation d'outils courants pour les tâches quotidiennes, mais en continuant ma propre configuration de bureau, je me suis rendu compte qu'il y avais pas mal de choses à ajouter par rapport au dernier article. En tout cas, trop de choses pour essayer de les bourrer dans un coin de marge.

    J'aimerais vous parler plus en détail de py3status qui, si vous vous en rappelez, sert à améliorer la barre d'information d'i3. Ainsi, alors que cette barre par défaut propose assez peu de modules et une personnalisation minimale, la barre améliorée avec py3status propose des fonctionnalités bien plus intéressantes. Outre la plus grande flexibilité des réglages, avec cet utilitaire il est très simple d'écrire ses propres modules, et on peu prendre en compte les clics pour le comportement des modules.

    Parmi tous les modules proposés, il y en a tant d'utiles que je n'avais pas la place au début dans ma barre. Heureusement que j'ai ensuite découvert qu'on avait droit à plusieurs barres dans la configuration i3. De plus, j'ai noté qu'il existe un pull request sur le dépôt de py3status qui permettrait de multiplier les configurations pour une seule barre, donc la possibilité de changer de modules à chaud.

    Ma configuration i3 actuelle

    Une petite description des modules affichés, de gauche à droite :

    En haut :

    • Informations sur le morceau en cours dans un lecteur compatible MPRIS.
    • Mises à jour en attentes (la première valeurs représente le nombre de mises à jours des paquets binaires et la deuxième concerne les paquets AUR).
    • Statut de mon mobile connecté via KDE Connect (peut s'utiliser sans autre composant KDE, grâce au ciel. Et oui, j'ai appelé mon mobile Philippe).
    • Niveau du volume sonore, contrôlable au clic et à la molette. Grâce à ce module, je peux me passer de l'utilitaire pa-systray.
    • Niveau de luminosité, contrôlable à la molette.
    • État de l'extinction d'écran DKMS, contrôlable au clic.
    • Sélectionneur de configuration pour écran externe, contrôlable au clic.
    • Compteur d'articles non lus sur mon instance Tiny Tiny RSS.
    • Compteur de mails non lus (le texte avant le nombre correspond au compte concerné).
    • Date et heure.
    • Icônes de notifications des programmes classiques (ici, NextCloud et nm-applet).

    En bas :

    • Bouton de capture d'écran avec envoi automatique sur un serveur choisi, contrôlable au clic.
    • Vitesse du réseau.
    • Indicateur de VPN.
    • Indicateur de connexion à internet (affiche l'IP publique par défaut, masquée ici pour des raisons évidentes).
    • Indicateur d'IPv6.
    • Indicateur de connexion WiFi (encore ce Philippe...).
    • Indicateur de connexion cablée.
    • Espace libre sur le disque.
    • Utilisation CPU.
    • Mémoire utilisée.
    • Température CPU.
    • Charge CPU.
    • État de la batterie.

    L'écriture d'un module est vraiment simple, pour peu qu'on ait des bases de Python. Si vous le faites, je vous invite à en parler en commentaire ainsi qu'à contribuer au projet en proposant un pull request. Les mainteneurs sont sympas, et pour ceux qui débutent dans la contribution dans des projets open-source, il est très gratifiant de voir son travail en temps qu'amateur se faire valider par un projet qu'on utilise tous les jours.


    Je souhaite également parler des symboles que vous pouvez voir dans mes barres d'information. Ceux qui font du frontend web reconnaîtront les glyphes du projet Font Awesome (pour le coup, rien à voir avec le gestionnaire de fenêtres Awesome). Il s'agit d'une police de caractère qui utilise une plage spéciale de la table unicode afin de mettre à disposition des symboles qu'il est pratique d'utiliser principalement pour des pages web, mais également, comme vous pouvez le voir, sur des interfaces un peu plus personnelles. Lorsque i3 tombe sur un caractère unicode que la police qu'il utilise ne peut pas afficher, il va alors utiliser la police Font Awesome en tant que police de substitution. Afin mettre ce procédé en œuvre, il est nécessaire d'installer la fonte (le paquet AUR otf-font-awesome sous Arch Linux) et de vérifier que le fichier de configuration d'i3 contienne la ligne suivante :

    font pango:monospace 8

    Vous pouvez remplacer monospace par la fonte que vous préférez. Vous serez ensuite libres de choisir une icône Awesome en le précisant dans la configuration des modules py3status (le plus souvent, il faut se tourner vers la variable format).


    J'avais oublié d'expliquer dans mon précédent article, lorsque j'ai parlé de touches de volume et de luminosité sur le clavier, comment utiliser les touches de contrôle des lecteurs de musique. C'était pourtant sur ma liste des choses importantes à dire, j'en suis confus. Laissez moi réparer ça.

    Pour utiliser ces touches, comme pour les touches volume et luminosité, il vous faudra spécifier dans votre configuration i3 que vous souhaitez mapper ces touches médias à un appel de commande. Simplement, le problème est que par défaut, il n'existe pas de commande simple pour contrôler un lecteur MPRIS. Nous avons donc besoin d'installer playerctl, un petit programme en ligne de commande qui va se charger de fournir des commandes lisibles et succinctes. Ensuite, il nous faudra ajouter dans le fichier de configuration i3 les lignes suivantes :

    bindsym XF86AudioPlay exec playerctl play-pause
    bindsym XF86AudioPrev exec playerctl previous
    bindsym XF86AudioNext exec playerctl next

    Notez que si le lecteur que vous utilisez n'est pas compatible MPRIS, il vous faudra trouver une autre astuce. Notamment si vous utilisez cmus en version release et non en version git, vous aurez besoin de faire appel à la commande cmus-remote.


    Enfin, pour terminer cet addendum, je vous parlerai du choix de la console. Entre la publication du dernier article et la rédaction de l'article que vous êtes en train de lire, j'ai fait le test d'une autre console qui s'appelle Termite. C'est une bonne console qui donne la même sensation qu'Urxvt, mais infiniment plus simple à configurer. Ça s'explique par le format du fichier de configuration : Termite se configure avec une syntaxe INI tandis qu'Urxvt se configure via un fichier Xresourses, qui suit une syntaxe vieillotte, pour ne pas dire franchement obsolète. De plus, Termite n'as pas besoin de patchs ésotériques quand on a besoin de fonctionnalités un peu spéciales, comme la prise en compte de la molette dans certains programmes pseudo-graphiques. Au fond, Urxvt n'est déjà rien d'autre qu'un patch du Rxvt original pour gérer les caractères unicodes...

    Cependant, il paraît que Urxvt possède plus de fonctionnalités que Termite. Une vieille légende prétends même que Urxvt supporterait plusieurs polices de caractères à la fois, bien que jamais je n'aie réussi à faire fonctionner ce mécanisme que, j'imagine, seuls les âmes les plus téméraires et les plus courageuses peuvent activer.

    De plus, et c'est ce qui m'a définitivement décidé à rester sur Urxvt, Termite nécessite un compositeur graphique (par exemple xcompmgr) pour gérer la transparence. Rien de très gênant là-dedans, les compositeurs graphiques minimalistes sont très légers, et il m'en coûte très peu d'ajouter une ligne pour en lancer un dans ma configuration i3. Mais malheureusement, i3 a un petit bug lorsqu'on utilise un compositeur graphique avec certaines positions de fenêtre : quelquefois, le fond d'un terminal sera non pas le fond d'écran comme on pourrait s'y attendre, mais le contenu du terminal qu'y s'y trouvait précédemment, ce qui n'empêche pas de travailler mais qui est assez gênant.

    Urxvt, quant à lui, n'a pas besoin de compositeur graphique pour la transparence, car il utilise une "fausse transparence" : pour faire simple, au lieu de demander au serveur X ce qui se trouve derrière lui, il va directement remonter au niveau de l'image de fond et mettre en transparence la portion du fond d'écran qu'il cache. Bon, pour le coup il est impossible, si on a une console Urxvt flottante, de voir une autre fenêtre par transparence, mais personnellement je m'en rappe les marrons, sachant que j'utilise extrêmement rarement les fenêtres flottantes, et absolument jamais pour des consoles. Sinon, à quoi bon utiliser i3 ?


    En espérant que ces commentaires vous seront utiles, je vous souhaite un joyeux Noël, et peut être une bonne année. Tchin tchin.

    • Ha chevron_right

      Less is more, partie 1.5 : Encore une chose

      raspbeguy · pubsub.gugod.fr / hashtagueule · Wednesday, 21 December, 2016 - 23:00 · 7 minutes

    Quand vous vous préparez probablement à passer un joyer réveillon de Noël, je suis là à écrire pour votre bon plaisir. Appréciez svp. Pour la suite de cette série d'articles sur l'épuration de votre bureau, j'avais prévu de passer à la présentation d'outils courants pour les tâches quotidiennes, mai...

    Quand vous vous préparez probablement à passer un joyer réveillon de Noël, je suis là à écrire pour votre bon plaisir. Appréciez svp.

    Pour la suite de cette série d'articles sur l'épuration de votre bureau, j'avais prévu de passer à la présentation d'outils courants pour les tâches quotidiennes, mais en continuant ma propre configuration de bureau, je me suis rendu compte qu'il y avais pas mal de choses à ajouter par rapport au dernier article. En tout cas, trop de choses pour essayer de les bourrer dans un coin de marge.

    J'aimerais vous parler plus en détail de py3status qui, si vous vous en rappelez, sert à améliorer la barre d'information d'i3. Ainsi, alors que cette barre par défaut propose assez peu de modules et une personnalisation minimale, la barre améliorée avec py3status propose des fonctionnalités bien plus intéressantes. Outre la plus grande flexibilité des réglages, avec cet utilitaire il est très simple d'écrire ses propres modules, et on peu prendre en compte les clics pour le comportement des modules.

    Parmi tous les modules proposés, il y en a tant d'utiles que je n'avais pas la place au début dans ma barre. Heureusement que j'ai ensuite découvert qu'on avait droit à plusieurs barres dans la configuration i3. De plus, j'ai noté qu'il existe un pull request sur le dépôt de py3status qui permettrait de multiplier les configurations pour une seule barre, donc la possibilité de changer de modules à chaud.

    Ma configuration i3 actuelle

    Une petite description des modules affichés, de gauche à droite :

    En haut :

    • Informations sur le morceau en cours dans un lecteur compatible MPRIS.
    • Mises à jour en attentes (la première valeurs représente le nombre de mises à jours des paquets binaires et la deuxième concerne les paquets AUR).
    • Statut de mon mobile connecté via KDE Connect (peut s'utiliser sans autre composant KDE, grâce au ciel. Et oui, j'ai appelé mon mobile Philippe).
    • Niveau du volume sonore, contrôlable au clic et à la molette. Grâce à ce module, je peux me passer de l'utilitaire pa-systray.
    • Niveau de luminosité, contrôlable à la molette.
    • État de l'extinction d'écran DKMS, contrôlable au clic.
    • Sélectionneur de configuration pour écran externe, contrôlable au clic.
    • Compteur d'articles non lus sur mon instance Tiny Tiny RSS.
    • Compteur de mails non lus (le texte avant le nombre correspond au compte concerné).
    • Date et heure.
    • Icônes de notifications des programmes classiques (ici, NextCloud et nm-applet).

    En bas :

    • Bouton de capture d'écran avec envoi automatique sur un serveur choisi, contrôlable au clic.
    • Vitesse du réseau.
    • Indicateur de VPN.
    • Indicateur de connexion à internet (affiche l'IP publique par défaut, masquée ici pour des raisons évidentes).
    • Indicateur d'IPv6.
    • Indicateur de connexion WiFi (encore ce Philippe...).
    • Indicateur de connexion cablée.
    • Espace libre sur le disque.
    • Utilisation CPU.
    • Mémoire utilisée.
    • Température CPU.
    • Charge CPU.
    • État de la batterie.

    L'écriture d'un module est vraiment simple, pour peu qu'on ait des bases de Python. Si vous le faites, je vous invite à en parler en commentaire ainsi qu'à contribuer au projet en proposant un pull request. Les mainteneurs sont sympas, et pour ceux qui débutent dans la contribution dans des projets open-source, il est très gratifiant de voir son travail en temps qu'amateur se faire valider par un projet qu'on utilise tous les jours.


    Je souhaite également parler des symboles que vous pouvez voir dans mes barres d'information. Ceux qui font du frontend web reconnaîtront les glyphes du projet Font Awesome (pour le coup, rien à voir avec le gestionnaire de fenêtres Awesome). Il s'agit d'une police de caractère qui utilise une plage spéciale de la table unicode afin de mettre à disposition des symboles qu'il est pratique d'utiliser principalement pour des pages web, mais également, comme vous pouvez le voir, sur des interfaces un peu plus personnelles. Lorsque i3 tombe sur un caractère unicode que la police qu'il utilise ne peut pas afficher, il va alors utiliser la police Font Awesome en tant que police de substitution. Afin mettre ce procédé en œuvre, il est nécessaire d'installer la fonte (le paquet AUR otf-font-awesome sous Arch Linux) et de vérifier que le fichier de configuration d'i3 contienne la ligne suivante :

    font pango:monospace 8

    Vous pouvez remplacer monospace par la fonte que vous préférez. Vous serez ensuite libres de choisir une icône Awesome en le précisant dans la configuration des modules py3status (le plus souvent, il faut se tourner vers la variable format).


    J'avais oublié d'expliquer dans mon précédent article, lorsque j'ai parlé de touches de volume et de luminosité sur le clavier, comment utiliser les touches de contrôle des lecteurs de musique. C'était pourtant sur ma liste des choses importantes à dire, j'en suis confus. Laissez moi réparer ça.

    Pour utiliser ces touches, comme pour les touches volume et luminosité, il vous faudra spécifier dans votre configuration i3 que vous souhaitez mapper ces touches médias à un appel de commande. Simplement, le problème est que par défaut, il n'existe pas de commande simple pour contrôler un lecteur MPRIS. Nous avons donc besoin d'installer playerctl, un petit programme en ligne de commande qui va se charger de fournir des commandes lisibles et succinctes. Ensuite, il nous faudra ajouter dans le fichier de configuration i3 les lignes suivantes :

    bindsym XF86AudioPlay exec playerctl play-pause
    bindsym XF86AudioPrev exec playerctl previous
    bindsym XF86AudioNext exec playerctl next

    Notez que si le lecteur que vous utilisez n'est pas compatible MPRIS, il vous faudra trouver une autre astuce. Notamment si vous utilisez cmus en version release et non en version git, vous aurez besoin de faire appel à la commande cmus-remote.


    Enfin, pour terminer cet addendum, je vous parlerai du choix de la console. Entre la publication du dernier article et la rédaction de l'article que vous êtes en train de lire, j'ai fait le test d'une autre console qui s'appelle Termite. C'est une bonne console qui donne la même sensation qu'Urxvt, mais infiniment plus simple à configurer. Ça s'explique par le format du fichier de configuration : Termite se configure avec une syntaxe INI tandis qu'Urxvt se configure via un fichier Xresourses, qui suit une syntaxe vieillotte, pour ne pas dire franchement obsolète. De plus, Termite n'as pas besoin de patchs ésotériques quand on a besoin de fonctionnalités un peu spéciales, comme la prise en compte de la molette dans certains programmes pseudo-graphiques. Au fond, Urxvt n'est déjà rien d'autre qu'un patch du Rxvt original pour gérer les caractères unicodes...

    Cependant, il paraît que Urxvt possède plus de fonctionnalités que Termite. Une vieille légende prétends même que Urxvt supporterait plusieurs polices de caractères à la fois, bien que jamais je n'aie réussi à faire fonctionner ce mécanisme que, j'imagine, seuls les âmes les plus téméraires et les plus courageuses peuvent activer.

    De plus, et c'est ce qui m'a définitivement décidé à rester sur Urxvt, Termite nécessite un compositeur graphique (par exemple xcompmgr) pour gérer la transparence. Rien de très gênant là-dedans, les compositeurs graphiques minimalistes sont très légers, et il m'en coûte très peu d'ajouter une ligne pour en lancer un dans ma configuration i3. Mais malheureusement, i3 a un petit bug lorsqu'on utilise un compositeur graphique avec certaines positions de fenêtre : quelquefois, le fond d'un terminal sera non pas le fond d'écran comme on pourrait s'y attendre, mais le contenu du terminal qu'y s'y trouvait précédemment, ce qui n'empêche pas de travailler mais qui est assez gênant.

    Urxvt, quant à lui, n'a pas besoin de compositeur graphique pour la transparence, car il utilise une "fausse transparence" : pour faire simple, au lieu de demander au serveur X ce qui se trouve derrière lui, il va directement remonter au niveau de l'image de fond et mettre en transparence la portion du fond d'écran qu'il cache. Bon, pour le coup il est impossible, si on a une console Urxvt flottante, de voir une autre fenêtre par transparence, mais personnellement je m'en rappe les marrons, sachant que j'utilise extrêmement rarement les fenêtres flottantes, et absolument jamais pour des consoles. Sinon, à quoi bon utiliser i3 ?


    En espérant que ces commentaires vous seront utiles, je vous souhaite un joyeux Noël, et peut être une bonne année. Tchin tchin.

    • Ha chevron_right

      Personnalisation du prompt

      raspbeguy · pubsub.gugod.fr / hashtagueule · Wednesday, 9 March, 2016 - 23:00 · 1 minute

    L'être humain aime adapter son environnement à ses propres envies. Cela s'applique aussi à ses outils, et comme vous le savez, l'ordinateur est un outil. C'est pourquoi la personnalisation de l'interface d'un ordinateur est si importante aujourd'hui. Cela ne s'arrête pas à l'interface graphique. Si ...

    L'être humain aime adapter son environnement à ses propres envies. Cela s'applique aussi à ses outils, et comme vous le savez, l'ordinateur est un outil. C'est pourquoi la personnalisation de l'interface d'un ordinateur est si importante aujourd'hui.

    Cela ne s'arrête pas à l'interface graphique. Si vous pratiquez la ligne de commande à haute dose, vous aurez sûrement envie de mettre un peu de fantaisie dans votre quotidien en personnalisant votre prompt, ce petit en-tête à chaque début de commande, montrant souvent votre nom d'utilisateur et le nom de votre machine, parfois d'autres éléments. Pour les "power-users", la personnalisation du prompt est au moins aussi importante que celle du fond d'écran par exemple.

    Malheureusement, la personnalisation du prompt n'est pas chose aisée : elle fait intervenir des variables pas toujours évidentes à connaître, la gestion des couleurs est pour le moins complexe quand on a l'habitude de cliquer sur une interface graphique, et encore...

    N'ayez crainte, des outils sont là pour vous aider. Par exemple pour bash, ce site vous facilite considérablement la tâche en vous proposant des modèles et en vous permettant de les personnaliser par un système de menus assez intuitifs.

    Une fois que vous avez défini votre prompt, tout ce qu'il vous reste à faire est de copier la ligne générée dans la variable PS1 de votre fichier ~/.bashrc.

    Bonne journée !

    • At chevron_right

      Personnalisation du prompt

      raspbeguy · pubsub.gugod.fr / atomtest · Wednesday, 9 March, 2016 - 23:00 · 1 minute

    L'être humain aime adapter son environnement à ses propres envies. Cela s'applique aussi à ses outils, et comme vous le savez, l'ordinateur est un outil. C'est pourquoi la personnalisation de l'interface d'un ordinateur est si importante aujourd'hui. Cela ne s'arrête pas à l'interface graphique. Si ...

    L'être humain aime adapter son environnement à ses propres envies. Cela s'applique aussi à ses outils, et comme vous le savez, l'ordinateur est un outil. C'est pourquoi la personnalisation de l'interface d'un ordinateur est si importante aujourd'hui.

    Cela ne s'arrête pas à l'interface graphique. Si vous pratiquez la ligne de commande à haute dose, vous aurez sûrement envie de mettre un peu de fantaisie dans votre quotidien en personnalisant votre prompt, ce petit en-tête à chaque début de commande, montrant souvent votre nom d'utilisateur et le nom de votre machine, parfois d'autres éléments. Pour les "power-users", la personnalisation du prompt est au moins aussi importante que celle du fond d'écran par exemple.

    Malheureusement, la personnalisation du prompt n'est pas chose aisée : elle fait intervenir des variables pas toujours évidentes à connaître, la gestion des couleurs est pour le moins complexe quand on a l'habitude de cliquer sur une interface graphique, et encore...

    N'ayez crainte, des outils sont là pour vous aider. Par exemple pour bash, ce site vous facilite considérablement la tâche en vous proposant des modèles et en vous permettant de les personnaliser par un système de menus assez intuitifs.

    Une fois que vous avez défini votre prompt, tout ce qu'il vous reste à faire est de copier la ligne générée dans la variable PS1 de votre fichier ~/.bashrc.

    Bonne journée !

    • Ha chevron_right

      Météo dans la console

      raspbeguy · pubsub.gugod.fr / hashtagueule · Monday, 22 February, 2016 - 23:00

    Bonjour les gens, Juste une petite astuce que des collègues m'ont montré. Ça vous sauvera pas forcément la vie mais c'est assez cool pour en faire un petit billet. Il s'agit de la possibilité d'afficher la météo dans son terminal comme un patron. Il s'agit d'un site web qui se charge de ça : wttr.in...

    Bonjour les gens,

    Juste une petite astuce que des collègues m'ont montré. Ça vous sauvera pas forcément la vie mais c'est assez cool pour en faire un petit billet.

    Il s'agit de la possibilité d'afficher la météo dans son terminal comme un patron. Il s'agit d'un site web qui se charge de ça : wttr.in qui affiche une page en ascii art.

    Pour l'avoir directement dans votre terminal, utilisez tout simplement le programme curl :

    curl wttr.in

    Et voilà le résultat :

    La météo de Montréal

    La localisation est trouvée automatiquement à l'aide de l'IP. Si vous souhaitez voir la météo d'une ville, par exemple Paris, procédez comme il suit :

    curl wttr.in/paris

    Et si vous aimez vraiment, vous pouvez l'ajouter à votre fichier .bashrc afin d'avoir la météo à chaque nouveau terminal.

    Voilà, bonne journée !

    • At chevron_right

      Météo dans la console

      raspbeguy · pubsub.gugod.fr / atomtest · Monday, 22 February, 2016 - 23:00

    Bonjour les gens, Juste une petite astuce que des collègues m'ont montré. Ça vous sauvera pas forcément la vie mais c'est assez cool pour en faire un petit billet. Il s'agit de la possibilité d'afficher la météo dans son terminal comme un patron. Il s'agit d'un site web qui se charge de ça : wttr.in...

    Bonjour les gens,

    Juste une petite astuce que des collègues m'ont montré. Ça vous sauvera pas forcément la vie mais c'est assez cool pour en faire un petit billet.

    Il s'agit de la possibilité d'afficher la météo dans son terminal comme un patron. Il s'agit d'un site web qui se charge de ça : wttr.in qui affiche une page en ascii art.

    Pour l'avoir directement dans votre terminal, utilisez tout simplement le programme curl :

    curl wttr.in

    Et voilà le résultat :

    La météo de Montréal

    La localisation est trouvée automatiquement à l'aide de l'IP. Si vous souhaitez voir la météo d'une ville, par exemple Paris, procédez comme il suit :

    curl wttr.in/paris

    Et si vous aimez vraiment, vous pouvez l'ajouter à votre fichier .bashrc afin d'avoir la météo à chaque nouveau terminal.

    Voilà, bonne journée !