Azure : /mnt non persistant sur une machine virtuelle

Dans une VM Azure, il est possible de monter des partages créés en passant par un Compte de stockage, permettant d’accéder à des données externes.

Dans le menu du Partage de fichiers de l’interface Azure, lors qu’on sélectionne un partage, il est possible de cliquer sur le bouton Connecter de l’interface pour faire apparaître un volet sur la droite de l’écran :

Ce menu comporte trois onglets dont un « Linux ». Ce dernier fait apparaître un encadré gris contenant un script à exécuter dans la VM qui initialisera le partage. Ce script, qui est fournit par Microsoft, créé le partage dans /mnt et ajoute une entrée dans /etc/fstab, ce qui pose un problème si on le copie/colle dans la VM.

Par convention sous Linux, les points de montages se trouvent dans /mnt, mais il n’est pas sécurisé de les placer ici dans notre cas !

Les machines virtuelles Azure ont un dossier /mnt se comportant comme un /tmp, celui-ci est donc temporaire et est effacé lors de reboot et shutdown de la VM comme en atteste le fichier /mnt/DATALOSS_WARNING_README.txt généré automatiquement :

WARNING: THIS IS A TEMPORARY DISK.

Any data stored on this drive is SUBJECT TO LOSS and THERE IS NO WAY TO
RECOVER IT.

Please do not use this disk for storing any personal or application data.

For additional details to please refer to the MSDN documentation at:
http://msdn.microsoft.com/en-us/library/windowsazure/jj672979.aspx

To remove this warning run:
    sudo chattr -i /mnt/DATALOSS_WARNING_README.txt
    sudo rm /mnt/DATALOSS_WARNING_README.txt

This warning is written each boot; to disable it:
    echo "manual" | sudo tee /etc/init/ephemeral-disk-warning.override
    sudo systemctl disable ephemeral-disk-warning.service

Comme l’indique le contenu du fichier, ce disque est temporaire et toutes données stockées en ces lieux sont soumises à un effacement aléatoire. Ce qui est problématique, c’est que le dossier créé par le script fournit sur le site Azure est supprimé périodiquement, empêchant ainsi les écritures de /etc/fstab de se dérouler correctement.

Un cas pointu apparaît si nous utilisons Docker : il peut être tentant de faire pointer des volumes sur un des partages montés dans /mnt. Dès lors, Docker va créer les dossiers s’ils ne sont pas existants, ce qui masquera notre problème de montage automatique des partages, puisqu’en cas de redémarrage ou extinction, les dossiers seront effacés puis recréés par Docker, sans que /etc/fstab n’ait eu la possibilité de monter les partages correctement.

La solution consiste a modifier le script fournit par Azure, pour faire pointer les partages vers /srv (par exemple).

Rails et Minitest : comment manipuler les résultats de vos tests en Ruby ?

Les développeurs qui ont lancé la commande rails test au moins une fois dans leur vie savent que l’expérience peut durer un moment ! Ils savent aussi qu’il n’est pas réellement possible de retravailler le résultat des tests. Tout au plus une automatisation dans une forge CI/CD type Gitlab permet de détecter le signal écrit sur la sortie standard/err, retournant l’état final du pipeline comme étant valide ou non. Mais jusqu’à aujourd’hui, il n’y a pas de solution proposée dans Rails pour répondre à ce besoin.

C’est là que débarque la gem « minitest-reporters ». Une fois ajoutée à votre Gemfile, elle vous permettra de surcharger le comportement initial de Minitest. Je vous laisse éplucher le dépôt git âprement documenté.

Step 1 : Dans votre test/test_helper.rb, ajouter require "minitest/reporters" après celui de rails/test_help.

Step 2 : Créer un fichier dans lib/minitest/mycustomreporter_plugin.rb (où mycustomreporter est le mot qui vous plait). Compléter de la sorte :

module Minitest
  module Reporters
    class MyCustomReporter < DefaultReporter
      def initialize options
        super
      end

      # Exécuté après chaque test
      def record result
        super
        puts result.location # Nom du test
        puts result.result_code # . F ou E
        puts result.time # En secondes
        if result.failures.any?
          puts result.failures.first.error # Cause de l'erreur
        end
      end
    end
  end
end

Step 3 : Dans votre test/test_helper.rb importer votre fichier via require_relative '../lib/minitest/mycustomreporter_plugin'

Step 4 : Juste après les require et avant la déclaration de la classe ActiveSupport, toujours dans test/test_helper.rb, exécuter votre plugin via :

Minitest::Reporters.use! [Minitest::Reporters::MyCustomReporter.new(:color => false)]

Step 5 : Lancer votre suite de tests exactement comme d’habitude.

Je vous invite à lire un ou deux articles avant de vous lancer et à ne pas hésiter à laisser vos remarques ou questions en commentaire !

Zimbra : ajouter des filtres en zmprov

Depuis le webmail Zimbra, il est impossible de créer un filtre qui transfère automatiquement des mails vers une autre adresse mail. Il est possible de le faire en zmprov. Pour cela, on peut suivre la procédure suivante :

  • Sur un mailstore Zimbra, créer un fichier avec l’extention « sieve » dont le contenu est :
#/bin/bash

zmprov ma account1@domain zimbraMailSieveScript 'require ["fileinto", "reject", "tag", "flag", "variables", "log", "enotify"];

# filtre 1
if anyof (not header :contains ["subject"] "subject") {
    flag "read";
    fileinto "Inbox";
    redirect "account2@domain";
    stop;
}'
  • Ajouter les droits d’exécution sur ce fichier (chmox +x)
  • Exécuter ce fichier avec l’utilisateur zimbra.

Vous pouvez vérifier la bonne création du filtre avec la commande :

zmprov ga account1@domain zimbraMailSieveScript

Différence de rendu PDF avec wkhtmltopdf entre environnement local et production (Rails, Wicked_PDF)

Il m’est arrivé une mésaventure en polissant une fonctionnalité. Je devais réaliser un document PDF en pixel perfect :
– dans l’environnement de développement, le document est prêt, le résultat attendu est obtenu
– passage en pré-production, environnement pourtant réputé identique à la production, le problème présenté ci-dessous survient

À gauche, le rendu wkhtmltopdf sous Ubuntu Server 12.04.
À droite, le rendu sous Ubuntu Desktop 18.04.

Une font est appliquée en CSS sur le texte, la très classique sans-serif. Comment expliquer une telle différence ? La police semble pourtant bien être la même… à quelques exceptions près (observez attentivement le « 1 »). Tirons ça au clair :

$ fc-match sans-serif
DejaVuSans.ttf: "DejaVu Sans" "Book"

Cette commande retourne quelle police sur votre système correspond au mieux. Les deux machines m’ont retourné le même résultat. Sous Ubuntu les fonts sont stockées dans /usr/share/fonts/, et il apparaît que DejaVu date de 2011 d’un côté et de 2016 de l’autre. Il est donc simple de vérifier via un scp si l’évolution de DejaVu explique à elle seule le problème : il s’avère que non.

Côté Wicked_PDF, j’ai essayé de modifier le zoom ou les DPI du document, mais l’écart entre l’environnement local et l’environnement distant était conservé.

J’ai trouvé ici et les traces d’un bug Webkit concernant l’utilisation de polices non-OTF. La solution semble de convertir la police TTF au format OTF. Ça semble incroyable, mais cela a fixé la différence de rendu.

Il existe un tas de convertisseurs de polices TTF vers OTF en ligne qu’on peut trouver sur Google. Une fois convertie, que faire de la police ? Vous pourriez replacer la font dans /usr/share/fonts/ sur les deux environnements, le plus sage reste de l’emporter dans votre projet, cela évitera à un autre développeur de rencontrer la même tuile.

Voici le bout de code à ajouter dans votre fichier CSS :

@font-face {
  font-family: "fixFont";
  src: url('file://<%= Rails.root.join("public", "fonts", "DejaVuSans.otf") %>'), /* Chemin absolu pour le fichier HTML tampon généré par Wicked côté serveur */
       url('/fonts/DejaVuSans.otf'); /* Pour afficher le HTML coté navigateur */
}

L’utilisation de la dernière version en date de wkhtmltopdf (0.12.4) n’a pas résolu ce problème, bien qu’elle semble uniformiser d’autres problèmes de rendus entre différents systèmes d’exploitation.

Modéliser des objets en 3D avec OpenSCAD, un pseudo langage JavaScript-like pour impression 3D

Comment créer un objet quand on ne sait pas utiliser les logiciels de CAO bien connus pour réaliser des modèles 3D ? Si vous savez développer du code informatique, vous allez vous amuser !

Je vous propose de visionner la conférence d’introduction à la création d’objets assistée par ordinateur, que j’ai donné au siège de Cloud Temple en 2017 :

OpenSCAD est un logiciel libre de modélisation disponible sous Linux, Mac et Windows. Il se divise basiquement en deux volets, un éditeur de texte sur la gauche et une visualisation en temps réel de la modélisation sur la droite.
L’API d’OpenSCAD est complète et permet de créer toutes sortes de formes, en 2D comme en 3D, de réaliser toute sorte de combinaisons par ajout ou suppression de formes, et de réaliser des opérations telles que des rotations, translations, agrandissements etc.
On peut ensuite exporter sa création, en 2D ou en 3D, dans un format ouvert et standardisé. La plupart des machines à commandes numériques utilisent des formats tels que le SVG, le DXF ou le STL.

Voici le développement en temps réel d’une maquette de libellule en 3D :

L’objet a été réalisé en impression 3D :

Puis peint pour en recouvrir les aspérités :

Si la création d’objets vous intéresse, n’hésitez pas à réagir sous l’article, à poser vos questions ou à faire part de projets que vous avez réalisé.

Réaliser des tests en navigateur avec Selenium sur Bash for Windows 10 [et sa démo en Ruby/Capybara]

Introduction

Windows 10 propose un Windows Subsystem for Linux (WSL) permettant d’obtenir un terminal Ubuntu sans émulation ni virtualisation. Il s’agit plutôt d’une couche de compatibilité permettant d’exécuter nativement des binaires Linux sous Windows, similaire à ce que fait Wine sous Linux.

En ces termes, vous comprenez rapidement l’intérêt du WSL : tous les outils de développement Unix s’ouvrent à vous sous Windows 10.

Lire la suite

Docker et nettoyage – Libérez la mémoire

L’un des plus gros inconvénients de la dockerisation des projets est le manque d’espace sur les machines de développement. Lorsque l’on est amené à travailler sur plusieurs projets en même temps, la limite se fait vite ressentir et peut devenir handicapante.

De base, un container n’a aucune limite et peut utiliser toute la ressource dont il a besoin. Il est donc possible de résoudre ces problèmes d’espace de plusieurs manières

Lire la suite

Remplacer TeamViewer sous Linux par VNC, SSH et un serveur relais transperceur de NAT

Nous allons étudier une alternative de prise de contrôle à distance à base de logiciels libres permettant d’effacer la plupart des limites réseau.

Supposons que Camille est à Caen et que Paul est à Paris. Camille veut dépanner Paul en prenant le contrôle de son ordinateur. Le problème, c’est que Camille et Paul sont derrière des box ADSL comportant un NAT : ils peuvent sortir sur Internet mais Internet ne peut pas entrer chez eux.

Lire la suite