Quelques trucs sur UNIX/Linux #4

Crontab et 49-3

Crontab : changer l’adresse e-mail de destination

Il est possible de spécifier l’utilisateur destinataire des mails de la crontab en définissant la variable MAILTO en début de fichier.

Remplacement de l’adresse par défaut :

MAILTO=webmaster@mon-site.fake

Désactivation de l’envoi de mail :

MAILTO=""

(source)

Crontab : redirection de la sortie dans un fichier

Par défaut cron envoie par mail l’ensemble des sorties (standard et erreur) des tâches exécutées. Il peut être intéressant d’écrire tout ça dans des fichiers de logs à la place.

Pour ce faire il suffit d’utiliser les mécanismes de redirections de sorties habituellement disponibles dans les terminaux en terminant la ligne par > /path/to/log/file 2>&1. La première partie (> /path/to/log/file) déclenche la redirection de la sortie standard, la seconde partie (2>&1) effectue la redirection de la sortie d’erreur dans la sortie standard.

Exemples :

# Redirection de la sortie standard dans le fichier /path/cron.log et envoi par e-mail de la sortie d'erreur
* * * * * /path/to/script > /path/cron.log

# Redirection des sorties standard et erreur dans le fichier /path/cron.log
* * * * * /path/to/script > /path/cron.log 2>&1

(source)

Rejouer la dernière commande en ajoutant sudo

Il m’arrive de temps en temps de lancer une commande nécessitant les droits root en oubliant de la précéder par sudo. Il est possible de rappeler la dernière commande l’historique mais la syntaxe est un poil longue et compliquée.

La solution que j’ai retenue est donc d’ajouter un alias dans mon fichier .bash_aliases :

# 49.3
alias 49.3='sudo "$BASH" -c "$(history -p !!)"'

Le nom 49.3 est court et facile à retenir puisqu’il fait directement référence à l’article 49 alinéa 3 de la constitution française dont le principe est somme toute assez proche ^^


Carte Magic perso : Zilad l’Endormi / Zilad l’Éveillé

On continue la série de republications de cartes perso avec une autre carte accompagnée du commentaire que j'avais posté dans le forum de l'Assemblée des Funomanciens à l'époque.

Zilad l’Endormi / Zilad l’Éveillé
Zilad l’Endormi (face A) / Zilad l’Éveillé (face B)

Une autre carte réalisée pour un FCC sur le site de la SMF (je n'ai plus retrouvé de lien qui fonctionne). Cette fois le sujet proposé par Elian Shaâr était :

Je vous propose donc pour cette Xème édition du FCC, où X est le nombre de FCC mis en place depuis que le Dark Mogwaï (Grâce Lui soit rendue) a envoyé Ses disciples porter Sa parole à travers le vaste Multivers, un proverbe de Platon, ma foi assez tordu mais qui m'a fait sourire à la première lecture :

Tout corps couché prend la ligne de l'horizon de l'âme. L'endormi devient le réveillé de l'ombre.

— Platon

Vous êtes libre de choisir l'une des deux phrases, voire les deux si vous le souhaitez ^^

Sachant que je voulais vous proposer à la base une image sur les songes, je ne suis pas loin du sujet escompté :twisted:

La première partie de la citation étant un peu trop nébuleuse à mon goût, je me suis concentré sur la seconde qui met en opposition l'endormi et l'éveillé (je préfère "éveillé" à "réveillé" dans ce contexte, ça sonne mieux, c'est pour ça que je l'ai modifié pour le texte d'ambiance). Du coup ça m'a fait penser à une carte double-face.

N'ayant pas encore de base GIMP pour les cartes double-face, je me suis tourné vers une carte Vanguard dont j'ai fait un design perso dérivé de celui des arpenteurs. J'ai juste intégré les symboles jour et nuit en plus pour l'aspect recto/verso.

Pour ceux qui ne connaissent pas cette variante, une petite description rapide : elle est sortie avec le bloc Tempête qui proposait des cartes de grande taille (comme Planechase ou Archennemy) représentant le personnage incarné par le joueur. Les cartes de personnage sont posées en jeu en début de partie et n'ont donc pas de coût de lancement. Ce ne sont pas des permanents et leur couleur est purement indicative, ceci n'influant pas sur le jeu (dans les cartes originelles il y avait simplement une petite pastille de couleur en bas de la carte). Comme toute les cartes, un personnage a des capacités mais ce qu'elle a de plus ce sont deux valeurs présentes en bas à gauche et à droite qui représentent respectivement le modificateur de main (qui change la main initiale et la taille de main maximale) et le modificateur de points de vie.

L'idée est donc d'avoir pour personnage un vampire qui comme la plupart de ses congénères dort le jour et s'éveille la nuit. On considère là que le jour représente le tour des adversaires et la nuit notre tour, ainsi les conditions de transformation sont tout naturellement l'éveil au début de l'entretien et l'endormissement au début de l'étape de fin.

Un vampire endormi ne peut pas faire grand chose. Comme un humain endormi, somme toute. J'ai donc choisi d'empêcher de jouer des sorts ou des capacités activées. En contrepartie on a une capacité de nuit qui fait que quand une créature d'un adversaire meurt, on récupère un jeton vampire.

A priori, le fait de ne pas pouvoir jouer de sorts ni de capacités durant le tour des adversaires, étant tout de même un handicap assez lourd, j'ai mis un +1 en cartes et un +5 en vie. Ça me semble du coup pas trop fumé à première vue, ni excessivement faible.

Enfin, les crédits :

  • la carte est réalisée sous GIMP à partir de ma base de personnage dérivée du xcf d'arpenteur réalisé par Sovelis et NorthNikko
  • l'illustration de la face A s'intitule The Tomb, par Rado Javo
  • celle de la face B s'intitule simplement vampire, par Vuk Kostic (pas retrouvé de lien fonctionnel)
  • le symbole d'extension vient de la police Fiolex Mephisto Dingbats que j'avais déjà utilisé sur un autre personnage : Tyrael, Archange de la Justice, tiré de l'univers de Diablo

Du coup j'en ai profité pour ré-uploader le fichier de mon design de personnage Vanguard dérivé de celui des arpenteurs, des fois que ça intéresse quelqu'un (même si je ne peux plus trop garantir le niveau de finition...) :


Plugin de groupement des catégories pour Jekyll

Voici mon second plugin pour Jekyll, toujours lié à mon menu de catégories.

Contexte

En plus de 10 ans d’existence de ce blog, j’ai beaucoup varié les thématiques de mes articles. Au début j’étais purement en mode bloc-notes sur des astuces techniques pour pouvoir les retrouver facilement. Puis j’ai pas mal parlé de l’iPhone, de mes développements perso, de mes créations “artistiques” (BD, cartes Magic, etc)… à force ça commence à faire beaucoup de catégories et ce n’est plus très lisible dans une liste en vrac.

Du coup j’ai voulu refaire ce que WordPress proposait via les sous-catégories : grouper les catégories par thématiques. Je n’ai pas trouvé de plugin qui le fasse bien. J’en avais testé un qui avait l’air de faire ce que je voulais mais je n’ai pas réussi à le faire marcher… peut-être que j’aurais dû insister mais je ne l’ai plus retrouvé donc j’ai fini par décider d’en développer un moi-même. Après tout le fonctionnel est simple.

Pour le coup effectivement, rien de bien compliqué, un connaisseur de Ruby y aurait sans doute passé moins d’un quart d’heure. Bon perso je n’y connais rien à Ruby, je l’ai découvert en débugant des plugins ces trois derniers mois, donc forcément ça m’a pris un peu plus de temps mais j’ai finalement ce que je voulais ^^

Le plugin

Ce plugin se résume donc à un nouveau filtre Liquid qui prend en entrée les catégories et renvoie en sortie une un tableau à double-entrée avec pour chaque thématique un sous-tableau contenant l’ensemble de ses catégories.

Les thématiques ou « groupes de catégories » sont définis dans le fichier de configuration _config.yml, avec la liste des groupes et pour chacune la liste des catégories qui la composent. Les catégories non-affectées étant regroupées dans un groupe « Default » (une seconde entrée de configuration permettant de définir son libellé).

Le plugin ainsi qu’une documentation plus détaillée sont accessibles ici : jekyll-group-categories-filter

Utilisation sur ce blog

J’ai donc appliqué ça à ce blog en découpant la liste des catégories en 4 thématiques :

  • jeux : vu que ces derniers temps j’ai posté pas mal de trucs sur Magic et Carcassonne ça ne me semble pas superflu d’en faire une thématique à part
  • réalisations perso : mes diverses réalisations perso que ce soit du dev ou des trucs plus « artistiques »
  • informatique : un peu fourre-tout… j’ai hésité à découper plus mais j’ai du mal à délimiter les choses, donc dans l’immédiat on va rester là dessus
  • autres : tout le reste

Dans chaque thématique j’ai gardé le tri alphabétique grâce à mon précédent plugin, ce qui me donne le code suivant dans la sidebar :

<h2>Catégories</h2>
{% assign groupedCategories = site.categories | group_categories %}
{% for group in groupedCategories %}
  <h3>{{ group[0] }}</h3>
  <ul>
    {% assign categories = group[1] | sort_by_keys %}
    {% for category in categories %}
      <li><a href="/categories/{{ category[0]|slugify:'latin' }}/">{{ category[0] }}</a> ({{ category[1].size }})</li>
    {% endfor %}
  </ul>
{% endfor %}

Voilà, n’hésitez pas à me faire un retour, soit ici, soit dans le bug tracker du plugin s’il s’agit d’un bug ou d’une idée d’amélioration ^^


Carte Magic perso : Masque du démon implacable

On continue la série de republications de cartes perso avec une autre carte que j'aime bien principalement pour son rendu graphique. Je la reposte avec le commentaire que j'avais posté dans le forum de l'Assemblée des Funomanciens à l'époque.

Masque du démon implacable
Masque du démon implacable

Il s'agit là d'une carte que j'ai faite il y a très longtemps... avant même de lancer ce site, c'est dire ! Je l'ai un peu remise à jour en corrigeant la formulation et un certain nombre de détails de réalisation (forcément j'ai un peu appris en un près d'un an et demi) mais sans revenir sur son nom ou les concepts. Ce n'est sans doute pas ma plus grande réussite en terme de nom et d’originalité mais j'aime bien son rendu visuel final ^^

L'idée venait directement de l'illustration, comme souvent. J'y voyais un masque démoniaque permettant de prendre la forme d'une créature morte. L'outil parfait pour un assassin, lui permettant de prendre l'apparence de sa première victime pour s'en prendre plus facilement à la suivante.

Du coup de base elle aurait dû être bleue / noire... sauf que ça ne collait pas avec l'illustration, donc j'ai un peu adapté pour maximiser le côté noir et faire en sorte que la copie puisse passer en capacité pure noire. La carte copiée doit donc se trouver dans un cimetière et la copie n'est que temporaire, la magie noire n'ayant pas l'efficacité de la magie bleu en terme de copie au point d'en faire une copie définitive (d'ailleurs on a bien le Piège à némésis qui fait une copie temporaire en étant pure-noire).

Ensuite on a la seconde capacité qui permet d'attaquer à nouveau, représentant le second meurtre dont je parlais plus haut. Là pas de problème c'est bel et bien rouge une attaque supplémentaire. Il s'agit simplement d'une version atténuée de l'Assaut implacable. Qui a d'ailleurs donné la dernière partie du nom (j'étais en panne d'inspiration).

Côté équilibre, la première capacité ne peut copier qu'une fois une créature donnée puisqu'elle est exilée dans l'opération et la seconde ne concerne que la créature équipée, donc on a un ensemble qui ne me semble pas trop puissant. D'un autre côté on peut faire des choses assez efficaces avec une attaque supplémentaire par tour sur une grosse bête ou bien en transformant un petit jeton en gros thon pour peu d'en avoir mis un au cimetière. Du coup ça me semble viable dans l'ensemble.

Restent les crédits :

  • réalisation sous GIMP avec le XCF habituel de Sovelis et NorthNikko
  • concernant l'illustration, il s'agit de Mask of hatred par Patipat Asavasena alias asuka111

Suppression d'applications préinstallées sur Android

J’ai toujours été embêté avec mes appareils Android, en particulier mon ordiphone actuel (un Xiaomi Redmi Note 3) parce que plein d’applications arrivent par défaut et, selon la « norme » communément admise sur les appareils mobiles où on contrôle de moins en moins la machine, pas désinstallables ni même désactivables (en tous cas pas facilement… rooter l’appareil présente des risques notamment).

Puis hier je tombe sur ce pouet :

Je viens de découvrir comment désinstaller une appli système sans être root ! 😍

#AndroiDeMesDeux

adb shell pm uninstall -k --user 0 com.facebook.system

— Pourrito 🐧 (@pourrito@mastodon.xyz) le 11 août 2018 à 20:34

Et là les portes s’ouvrent pour un nettoyage des saloperies de Google et du fabricant, notamment celles qui tournent en tâche de fond pour rien en cramant la batterie et en bazardant des données on ne sait où.

Mise en place de l’environnement.

En gros on passe par les outils de développement pour Android pour lancer des commandes de suppression de certaines applications.

Pour ça il faut commencer par installer adb (Android Debug Bridge), perso j’ai suivi les indications proposées , en passant par la solution “Minimal ADB and Fastboot” vu que je ne compte pas faire de développement Android.

Ensuite on peut brancher l’appareil en USB et aller activer le mode développeur comme indiqué dans la procédure précédente (forcément dans mon cas la surcouche constructeur faisait que c’était pas sur la même ligne qu’il fallait chercher, en fait il fallait multi-cliquer sur “Version MIUI” plutôt que “Numéro de build”) puis activer le débogage USB (bon là comme j’ai fait les choses dans le désordre, j’avais pas de driver et j’ai pas réussi à redéclencher sa recherche… finalement je suis passé par la procédure décrite ici jusqu’à l’étape où il installe le driver puis j’ai annulé l’installation et tout allait bien).

Grand nettoyage

La principale difficulté est d’identifier les applications à désinstaller (et accessoirement s’assurer un minimum qu’on peut bien les désinstaller sans danger).

Commencez par un petit

adb shell pm list packages

pour connaître le nom exact de l'appli à supprimer.

— Pourrito 🐧 (@pourrito@mastodon.xyz) le 11 août 2018 à 20:41

Dans mon cas comme le terminal sous Windows (oui un jour j’installerai un Linux chez moi mais j’ai pas encore eu le courage) est tout pourri, j’ai préféré envoyer la liste dans un fichier :

adb shell pm list packages > tmp.txt

Puis j’ai foutu tout ça dans un tableur histoire de trier alphabétiquement et pouvoir prendre des notes sur ce que je désinstalle et à quoi ça correspond (ça peut être bien si par la suite on a des problèmes et qu’on veut retrouver ce qu’on a fait).

Bon partant de là reste un point assez chiant : identifier le nom interne des applications dans la liste. Des fois c’est assez ressemblant au nom “publique”, d’autres fois non. Il se trouve qu’il y a longtemps j’avais installé Disable Manager, une application censée permettre justement de désactiver des applications système… mais qui s’est avérée nécessiter des droits root. Il se trouve qu’elle a un intérêt : elle liste toutes les applications en indiquant à la fois le nom technique interne et le nom publique visible, du coup ça permet d’avoir la correspondance.

À ce stade j’ai pu virer les conneries telles que Gmail, Google Photo ou encore l’appli de météo fournie par le constructeur.

adb shell pm uninstall --user 0 com.google.android.gm
adb shell pm uninstall --user 0 com.google.android.apps.photos
adb shell pm uninstall --user 0 com.miui.weather2
...

Après c’est plus compliqué pour les applications un peu plus système, parce qu’on a là dedans des trucs effectivement système, des conneries (genre fonds d’écrans animés) et des trucs nuisibles (genre tracking publicitaires). En fouillant un peu j’ai trouvé plusieurs pages listant des applications non-nécessaires, notamment celle-ci et celle-là (spécifique pour MiUI, la surcouche Xiaomi)… Du coup j’ai viré 2-3 trucs mais avec parcimonie parce que j’ai pas trop envie de flinguer mon appareil, juste d’économiser la batterie et de le rendre un peu moins bavard avec l’extérieure (genre si je pouvais m’éviter d’activer systématiquement le mode économie d’énergie ça m’arrangerait… jusqu’à présent c’était le seul moyen que j’avais trouvé pour empêcher les Gmail et autres de se relancer en tâche de fond).

Voilà, maintenant je croise les doigts en espérant n’avoir rien cassé :smile:


Ajout du 14/08/2018 à 21h35

Je viens de tomber sur un autre article sur le sujet qui fait suite au même pouet avec quelques éléments complémentaires, comme des indications spécifiques à Archlinux (là où moi je suis passé par Windows) ou bien la précision suivante :

Comme il le précise lui-même un peu plus tard, il est à noter que l'argument -k est inutile, car sert exclusivement à conserver les paramètres et données de l'application. Dans un cas de nettoyage avancé, nous pouvons l'omettre pour supprimer complètement les applications visées.

Du coup j’ai enlevé le -k de mon exemple plus haut.