Résolution du Rubik's Cube

|

La résolution du Rubik’s cube 3x3x3 est relativement simple. Elle nécessite seulement la mémorisation de quelques algorithmes (séquences de mouvements). Je vous présente ici la méthode nécessitant d’apprendre le moins d’algorithmes. Ce n’est certainement pas la plus rapide mais elle vous permettra de résoudre le Rubik’s cube en moins de 3 minutes.

Introduction

Pour comprendre cette méthode, je dois tout d’abord vous présenter la terminologie utilisée.

  • Pièces centrales : Il s’agit des pièces situées au centre de chaque face.
  • Bordures : Ce sont les pièces situées au milieu de chaque arrête du cube. Elles sont composées de deux couleurs.
  • Coins : Ce sont les pièces situées aux sommets du cube. Elles sont composées de trois couleurs.

J’utiliserai la notation “Singmaster” (créée par David Singmaster) pour décrire chaque mouvement à réaliser. A chaque face correspond une lettre :

  • F (Front) : la face du cube qui est face à vous
  • B (Back) : la face du cube qui est à l’arrière
  • U (Up) : la face supérieure
  • D (Down) : la face inférieure
  • L (Left) : la face de gauche
  • R (Right) : la face de droite

Lorsqu’on effectuera une suite de mouvements, il faudra bien veiller à conserver l’orientation globale du cube.

Quand une apostrophe () suit une lettre, celà signifie que la rotation doit être éffectuée dans le sens inverse des aiguilles d’une montre. Par exemple, L signifie qu’il faut faire tourner la face de gauche dans le sens des aiguilles d’une montre, L’ indique la rotation inverse. Attention, il est facile de se tromper de sens, surtout quand on débute.

Etape 1 : La croix blanche sur le dessus

Cette étape ne devrait pas vous poser trop de problème. Il est surtout important que chaque bordure de la croix ait la couleur correspondant à la pièce centrale de chaque face.

Etape 2 : La face blanche et le premier étage

La encore, cette face peut être résolue avec des mouvements simples que je ne présenterai pas en détail.

Etape 3 : On retourne le cube

Etape 4 : Résolution du deuxième étage

Nous devons à présent apprendre nos premiers algorithmes. Le premier nous permettra de basculer la bordure de l’étage supérieur de 90° vers la gauche (sur le second étage, donc), le second nous permettra de faire de même vers la droite. On va donc tourner la face supérieur du cube pour être dans l’un des deux cas suivants.

Bascule vers la gauche

Algorithme : U’ L’ U L U F U’ F’

Bascule vers la droite

Algorithme : U R U’ R’ U’ F’ U F

Autres cas

S’il n’y a plus de bordure disponible sur l’étage supérieur, on peut utiliser un des deux algorithmes pour remplacer une bordure mal placée du second étage.

Etape 5 : Obtenir la croix jaune sur la face supérieure

Cas du “crochet jaune”

Si vous avez un “crochet jaune” (trois cases jaunes entourant un coin) sur la face du dessus, et éventuellement des cases jaunes supplémentaires, placez le au fond à gauche et appliquez l’algorithme suivant.

Algorithme : F U R U’ R’ F’

Cas de la “barre jaune”

Si vous avez une “barre jaune” (trois cases jaunes alignées, dont le centre) sur la face du dessus, et éventuellement des cases jaunes supplémentaires, placez la à l’horizontale et appliquez l’algorithme suivant.

Algorithme : F R U R’ U’ F’

Autres cas

Si vous n’êtes dans aucun de ces deux cas, appliquez un des deux algorithmes et répétez cette étape.

Etape 6 : Terminer la face jaune

A cette étape, un seul algorithme est nécessaire (le “Sune”), mais nous allons orienter la face supérieure en fonction du motif que forment ses cases jaunes. On devra répéter cette étape autant que nécessaire (parfois 5 ou 6 fois dans les pire cas !).

Algorithme “Sune” : R U R’ U R U U R’

Cas du “poisson jaune”

Orientez la face supérieur de manière à ce que le “poisson jaune” pointe vers le coin inférieur gauche. Si vous avez une case jaune face à vous, sur le côté droit du dernier étage, la face jaune devrait être résolue après l’exécution du “corner flipper”. Sinon, orientez la face supérieure pour avoir une case jaune face à vous, sur le côté gauche ou droit du dernier étage et exécute l’algorithme. Répétez ensuite l’étape 6.

Cas de la “croix jaune”

Si vous n’avez qu’une croix jaune sur la face supérieure, orientez cette dernière de manière à avoir une case jaune face à vous, sur le côté droit du dernier étage. Répétez ensuite l’étape 6.

Etape 7 : Placer les boins coins

Si vous avez de la chance, les coins sont bien placés et vous pouvez passer à l’étape 8. Sinon, essayez de trouver une face du dernier étage ayant deux coins de la même couleur, et placez-là à l’arrière. S’il n’y en a pas, exécutez l’algorithme suivant et répétez cette étape.

Algorithme “corner switch” : R’ F R’ B B R F’ R’ B B R R

Etape 8 : Finir la dernière face

La dernière étape consiste à placer correctement le bordures du dernier étage. Si vous avez déjà une face terminée, vous n’êtes plus qu’à un algorithme de la résolution. Sinon, appliquez une des deux algorithmes suivants, et répétez cette étape.

Les deux algorithmes nous permettent de permuter les trois bordures des faces gauche, avant et droite. L’un permet de les faire tourner dans le sens des aiguilles d’une montre, et l’autre en sens inverse. Notez qu’appliquer deux fois de suite le même algorithme revient au même qu’appliquer l’autre. On peut ainsi éviter d’apprendre les deux.

Rotation anti-horaire

Algorithme : R U’ R U R U R U’ R’ U’ R R

Rotation horaire

Algorithme : R R U R U R’ U’ R’ U’ R’ U R’

Etape 9 : Admirez votre oeuvre, améliorez-vous, et reprenez une vie normale !

Conclusion

Mémoriser les algorithmes peut sembler difficile. Le meilleur moyen d’y parvenir et d’inventer des moyens mnemotechniques, basés sur les mouvements à effectuer, ou sur la notation Singmaster.

Il est aussi possible de décomposer les algorithmes en groupes d’opérations. Voici quelques enchaînements fréquents, et leur appelation commune :

  • “Sexy move” : R U R’ U’
  • “Inverse Sexy move” : U R U’ R’
  • “Left Sexy move” : L’ U’ L U
  • “Inverse Left Sexy move”: U’ L’ U L

A l’étape 4, on peut ainsi placer le cube de trois-quarts (et considérer qu’il n’y a plus de face “avant”) et appliquer ces algorithmes :

  • Bascule vers la gauche : “Inverse Left Sexy move” + “Inverse Sexy move”
  • Bascule vers la droite : “Inverse Sexy move” + “Inverse Left Sexy move”

A l’étape 2, l’algorithme du “crocket jaune” devient : F + “Inverse Sexy move” + F’

Celui de la barre horizontale devient : F + “Sexy move” + F’

Si vous connaissez d’autres moyen mnémotechniques, n’hésitez pas à les partager en commentaires !

Annexes

Les cubes 3D de cet article ont été générés grâce à AnimCubeJS

Recyclage d'un NAS Ve-Hotech VHS4 LS

|

VHS4

Le NAS Ve-Hotech VHS4 LS est un NAS 4 baies. Il tourne sous une version modifiée d’Ubuntu 10.04 (obsolète depuis le 9 mai 2013), et n’offre qu’un accès limité au système à l’utilisateur (gestion via une interface web, pas d’accès SSH).

La société Ve-Hotech a été mise en liquidation judiciaire le 04/09/2019, ne proposant de fait plus aucune mise à jour.

Du fait de l’obsolescence de leur système on les trouve à très bas prix sur les sites de petites annonces, malgré leur hardware encore tout à fait adapté à un NAS. Mon objectif était donc de parvenir à installer une distribution Linux récente.

Probléme : le VHS4 a toute l’apparence d’une boîte noire car il n’est pas (de base) possible d’y brancher un écran pour accéder au BIOS et tenter de démarrer sur un autre disque. D’ailleurs, parlons du disque système d’origine du VHS4. Une inspection rapide de la carte mère ne permet pas de l’identifier. Pas de carte SD ou périphérique interne, pas de DOM (Disk on Module)… Une énigme.

On trouve cependant sur la carte mère un connecteur 14 broches (13 en réalité, une est absente) nommé JVGA.

VHS4-Board

En recherchant les références de cette dernière (MSI MS-S0031), j’ai trouvé le mode d’emploi correspondant, indiquant le brochage de ce connecteur.

VHS4-JVGA

Me voilà donc parti pour tenter de réaliser un adaptateur maison.

VHS4-VGA

  • JVGA1 pin 1 -> VGA pin 1
  • JVGA1 pin 3 -> VGA pin 2
  • JVGA1 pin 5 -> VGA pin 3
  • JVGA1 pin 11 -> VGA pin 13
  • JVGA1 pin 12 -> VGA pin 14

La connexion de tous les pins Ground (2, 4, 6, 7 et 9 côté JVGA1 et 5, 6, 7, 8, 10) permet d’avoir une image avec moins d’interférences. Les autres connexions sont optionnelles.

Heureusement j’avais pas mal de composants qui trainaient, notamment un PCB disposant d’un port VGA male. J’ai aussi pu utiliser un vieux connecteur IDE 44 broches male (ceux qui se branchent sur les anciens disques IDE 2’5) qui, une fois coupé, s’avère s’insérer parfaitement sur le connecteur JVGA1 de la carte mère.

VHS4-VGA-Connector

On peut sans doute trouver ce type de connecteur dans toute bonne boutique d’électronique (rechercher embase, 14 voies, 2 rangs, pas de 2mm…).

Restait à faire les soudures, essayer de ne pas se planter dans les correspondances… et trouver un moniteur disposant d’un port VGA.

Au bout de plusieurs heures à essayer de trouver les bonnes correspondances, à souder, désouder, tester… une image apparaît enfin à l’écran. Les couleurs sont mauvaises à cause de mon vieil écran qui est en train de rendre l’âme, mon montage est atroce… mais peu importe, c’est utilisable et je peux accéder au BIOS en tapant sur la touche Del au démarrage.

VHS4-Ugly VHS4-BIOS

Je découvre ainsi qu’il y a bien, quelque part dans le boîtier, un disque USB 4 Go hébergeant l’OS du NAS. Peu importe, je modifie l’ordre de priorité des disques de demarrage et décide de démarrer sur une clé USB branchée sur un des ports à l’arrière de boîtier. Bonne surprise, celà fonctionne parfaitement sur la dernière Debian stable en date (12.4). A des fins de recherche, j’en profite pour faire un dump du disque système d’origine pour l’étudier utltérieurement.

J’installe donc l’ISO d’installation de la dernière version d’OpenMediaVault sur ma clé, je fouille dans mes tiroirs pour trouver une autre clé USB, la plus petite possible (en dimensions), qui va devenir de nouveau disque système du NAS, branchée en permanence à l’arrière du boîtier. Je préfère ne pas altérer la partition de 4 Go d’origine du NAS, mais c’est un choix personnel, pour pouvoir éventuellement remettre le NAS dans son état (obsolète) d’origine.

VHS4-Screenshot

A suivre…

Installer une VM Windows avec une carte USB dédiée sous QEMU/KVM

|

Suite à mon article précédent concernant la virtualisation KVM/QEMU avec GPU en passtrough, j’ai utilisé pendant plusieurs mois cette solution sans problème particulier.

Un limitation demeurait cependant pour quelques utilisations très spécifiques, et notamment la MAO (musique assistée par ordinateur). Je dispose en effet d’une carte son USB externe qui, une fois partagée avec une VM, induisait des latences la rendant inutilisable.

Il était donc nécessaire de procéder de la même façon qu’avec la carte graphique, en dédiant un controlleur USB à ma VM. J’ai donc acheté une carte PCI offrant 5 ports USB 3.0 (Inateck KTU3FR-5O2I) pour la dédier à ma VM.

Tout ne s’est malheureusement pas passé comme prévu car en ajoutant l’identifiant de ma carte dans /etc/modprobe.d/vfio.conf puis en la rattachant à ma VM via le partage d’hôte PCI, ma VM refusait tout simplement de booter (“No boot device”).

J’ai trouvé sur un forum un témoignage similaire. Conformément à la réponse donnée qui indique que certaines cartes PCI peuvent poser problème en passthrough, j’ai changé de méthode et décidé de dédier un contrôleur USB de ma carte mère à ma VM, et d’utiliser ma carte USB 3.0 PCI pour l’hôte. Et là, plus aucun problème.

Ma carte son externe fonctionne désormais à merveille dans ma VM, sans aucune latence. Je dispose par ailleurs ne nombreux autres ports USB directement reliés à ma VM si le besoin s’en faisait sentir.

Effectuer un speedtest en ligne de commande sous Linux

|

Attention : cette commande exécute un script externe. Il est impératif de vérifier son contenu avant toute exécution. Il n’est pas nécessaire de l’exécuter en root.

curl -s https://raw.githubusercontent.com/sivel/speedtest-cli/master/speedtest.py | python3 -

Exemple de retour :

Retrieving speedtest.net configuration...
Testing from <fai> (<ip>)...
Retrieving speedtest.net server list...
Selecting best server based on ping...
Hosted by Vialis (Colmar) [321.69 km]: 27.345 ms
Testing download speed................................................................................
Download: 900.21 Mbit/s
Testing upload speed......................................................................................................
Upload: 172.34 Mbit/s

Installer une VM Windows avec un GPU dédié sous QEMU/KVM

|

Le projet

La virtualisation c’est bien beau, mais les performance graphiques des VM sont souvent très limitées, et ne permettent pas certains usages. Dans mon cas, je suis 95% du temps sous Linux, mais il m’arrive parfois de devoir rebooter sous Windows pour quelques tâches très précises : traitement de photos sous Lightroom, création musicale (mon vieux Line6 TonePort KB37 n’est pas supporté sous Linux), et jeu - bien que la situation s’est grandement améliorée de ce côté là sous Linux ces dernières années -.

Concernant le traitement de photos et le jeu, une carte graphique est indispensable pour obtenir des performances correctes. C’est pour cette raison que je préfèrais rebooter sous Windows plutôt que de passer par une VM.

Une solution existe cependant : le PCI passthrough. Il permet de dédier un périphérique PCI (dans notre cas une carte graphique) à une VM, avec des performances quasiment intactes.

Prérequis

  • Deux cartes graphiques (ou une carte + celle intégrée à votre CPU), préférablement de deux marques différentes (NVidia et AMD par exemple)
  • Beaucoup d’espace disque (Windows prend vite ses aises) voire idéalement un SSD dédié
  • Pas mal de RAM (32 Go dans mon cas)
  • Un CPU supportant la virtualisation processeur et chipset (chez Intel, il s’agit des technologies VT-x et VT-d)
  • Deux moniteurs

Mon matériel

  • Carte mère Asus H97-Plus
  • CPU Intel i7 4790k
  • RAM 32 Go
  • GPU 1 : Nvidia K620 (que je souhaite dédier à l’hôte)
  • GPU 2 : AMD Radeon RX480 (que je souhaite dédier à la VM)
  • SSD 256 Go dédié à la VM

Mise en place

Configuration BIOS

Dans mon cas, les deux options à activer se trouvent sous :

  • Advanced > System Agent Configuration > VT-d
  • Advanced > Intel Virtualization Technology

Installation de packages

sudo apt-get install qemu-kvm virt-manager
sudo adduser $USER kvm

Activer l’IOMMU

IOMMU : Input-Output Memory Management Unit

Dans /etc/default/grub :

On remplace :

GRUB_CMDLINE_LINUX=""

Par :

GRUB_CMDLINE_LINUX="intel_iommu=on"

Puis on met à jour grub et on reboot :

sudo update-grub
reboot

Après reboot, le script suivant doit afficher pas mal de choses :

#!/bin/bash
shopt -s nullglob
for g in /sys/kernel/iommu_groups/*; do
    echo "IOMMU Group ${g##*/}:"
    for d in $g/devices/*; do
        echo -e "\t$(lspci -nns ${d##*/})"
    done;
done;

Dans mon cas je répère les deux lignes suivantes, correspondant au GPU que je souhaite dédier à ma VM (et l’interface audio associée):

01:00.0 VGA compatible controller [0300]: Advanced Micro Devices, Inc. [AMD/ATI] Ellesmere [Radeon RX 470/480/570/570X/580/580X/590] [1002:67df] (rev c7)
01:00.1 Audio device [0403]: Advanced Micro Devices, Inc. [AMD/ATI] Ellesmere HDMI Audio [Radeon RX 470/480 / 570/580/590] [1002:aaf0]

Il faut noter les deux identifiants indiqués (dans mon cas 1002:67df et 1002:aaf0)

Bloquer le chargement du GPU à dédier à notre VM

Dans mon cas, je ne souhaite pas charger les modules correspondant à mon AMD Radeon, je vais donc blacklister le module amdgpu (vous devrez peut-être blacklister le module radeon si c’est celui que vous utilisez, cf. lsmod).

Je crée donc le fichier /etc/modprobe.d/blacklist-amdgpu.conf contenant :

blacklist amdgpu

J’active aussi le VFIO (Virtual Function I/O) passthrough en créant le fichier /etc/modprobe.d/vfio.conf contenant :

options vfio-pci ids=1002:67df,1002:aaf0

Les identifiants sont bien évidemment à adapter.

Dernière mise à jour de grub et recontruction de l’initramfs pour prendre en compte ces changements :

sudo update-grub
sudo update-initramfs -u
reboot

Après reboot, cette commande devrait afficher quelques lignes :

dmesg | grep vfio-pci

Création d’une VM Windows

J’utilise pour celà l’outil graphique virt-manager. Je ne rentrerai pas dans les détails de la création, mais le plus important est d’ajouter à notre VM deux hôtes PCI correspondant à la carte graphique (et son interface audio) que l’on souhaite dédier à la VM.

On n’oublie pas de brancher un écran sur notre carte graphique en passthrough, et on lance l’installation de Windows, puis des drivers graphiques de notre carte.

Partage souris clavier entre hôte et VM

On installe logiciel Barrier sur l’hôte et la VM (serveur côté hôte, client côté VM). On pourra ainsi passer la souris d’un écran à l’autre même lorsque les deux écrans ne sont pas connecté au même OS. Barrier permet aussi d’effectuer des copier-coller entre le OS.

TIP : la touche “scroll-lock” (ou “verrou défil.”) du clavier permet de verrouiller la souris à l’écran actuel. Celà permet par exemple de jouer à des FPS sans que la souris ne quitte malencontreusement l’écran du jeu en cours de partie. Dans ce contexte, il est aussi nécessaire d’activer l’option “mouvements de souris relatif” côté serveur Barrier pour ne pas être limité dans ses mouvements de souris (sinon on a parfois l’impression de “buter” sur les bords de l’écran en déplaçant la souris).

Bonus

Je tenais à conserver le dual-screen sous Linux, mais à pouvoir dédier un de mes écrans à la VM Windows lorsque je le souhaitais. Il est possible de brancher un des écrans aux deux cartes puis de changer la source d’entrée au niveau de l’écran, mais celà peut nécessiter un peu de développement côté Linux pour qu’il désactive un des écrans lorsque l’on passe sur notre VM Windows, et n’est pas forcément très érgonomique en fonction de l’écran.

J’ai opté pour une solution beaucoup plus simple : un switch HDMI (ça vaut dans les 10€). De cette manière, lorsque je switch l’entrée connectée au GPU dédié à Windows, mon GPU Linux détecte une déconnection physique d’un l’écran et adapte automatiquement son affichage (même chose à la reconnexion).

Cablage

Quelques photos

Horizon

Horizon Zero Dawn sous Windows à gauche, Linux à droite

Apex

Apex Legends sous Windows à gauche, Linux à droite

Installer une ancienne version de Firefox en mode standalone

|

Il est parfois nécessaire d’avoir à sa disposition une ancienne version de Firefox pour pouvoir administrer certains équipements dont l’interface web n’a pas pu être mise à jour (plus de support par exemple).

Dans mon cas, j’avais besoin d’un Firefox <= 63.0.

mkdir ~/Documents/mon-vieux-Firefox
cd ~/Documents/mon-vieux-Firefox
wget https://gist.githubusercontent.com/rubo77/b999c1bc6d10ab802536/raw/ef97fe0b919507186a969908f4393a99e518766c/download-mozilla-portable.sh

A ce stade, je vous invite fortement a vérifier le contenu du script download-mozilla-portable.sh que vous venez de télécharger. Executer un script inconnu téléchargé sur internet n’est pas du tout une bonne idée.

Le deuxième argument de ce script permet de préciser la version de Firefox que l’on souhaite récupérer.

sh download-mozilla-portable.sh firefox 63.0

On obtient un exécutable de Firefox 63.0 sous ~/Documents/mon-vieux-Firefox/firefox-portable-63.0/firefox-portable.

Pour éviter qu’il se mette à jour automatiquement, ma technique un peu crade consiste à le lancer une première fois, et à le quitter immédiatement (afin qu’il ait le temps de créer un profil utilisateur, mais pas de se mettre à jour).

On édite ensuite le fichier ~/Documents/mon-vieux-Firefox/firefox-portable-63.0/data/prefs.js pour y rajouter la ligne suivante :

user_pref("app.update.auto", false);

C’est fini !

VirtualBox Ubuntu - Faire reconnaître une webcam dans un Windows virtualisé

|

Il est parfois utile de permettre à un système Windows virtualisé d’accéder à la webcam du Linux hôte (Ubuntu dans notre cas). Pour participer à une visioconférence Skype Entreprise, par exemple.

Dans un premier temps, il faut s’assurer que l’utilisateur courant sur la machine hôte fait bien partie du groupe vboxusers. Si ce n’est pas le cas :

 adduser login_utilisateur vboxusers

Il peut-être nécessaire de redémarrer pour s’assurer que cette modification est bien prise en compte.

Il faut ensuite installer le pack d’extension VirtualBox :

apt-get install virtualbox-ext-pack

On active ensuite cette extension via l’interface de VirtualBox, dans le menu Fichier > Paramètres > Extensions. On ajoute l’extension qui se trouve sous /usr/share/virtualbox-ext-pack.

Ensuite, au niveau des paramètre de notre machine virtuelle Windows, il faut se rendre dans la section USB et activer le Contrôleur USB 2.0 (EHCI). Si la webcam est branchée sur un port USB 3.0, sélectionner Contrôleur 3.0 (xHCI). En cliquant sur le bouton +, une liste des périphériques USB branchés à la machine hôte devrait apparaître. Il suffit de sélectionner celui correspondant à la webcam et le tour est joué.

Si la webcam est bien détectée par Windows mais qu’aucune image n’est visible, vérifier que la bonne version du contrôleur USB est sélectionnée.

Echec d'installation d'un jeu Linux GOG (Full Throttle Resmastered)

|

L’installation d’un jeu Linux via un installer téléchargé sur GOG peut parfois donner lieu à une erreur :

Erreur fatale: la création du fichier a échoué

Cela vient du fait que les installers de GOG Linux utilisent par défaut le dossier /tmp pour décompresser les fichiers du jeu, même si l’espace dans ce dossier est insuffisant.

Le contournement consiste a indiquer un dossier temporaire alternatif :

export TMPDIR="/autre/dossier/tmp";bash ./installer-gog.sh

Pour les curieux, je m’amuse en ce moment avec la version Linux de Full Throttle Resmastered

Concernant Full Throttle spécifiquement, j’ai aussi du installer la version i386 de libudev1 :

sudo apt-get install libudev:i386

Full Throttle

Activation de la lecture des fichiers AAC dans Nextcloud

|

Une application Nextcloud permet la lecture de fichiers audio directement dans le navigateur : https://apps.nextcloud.com/apps/audioplayer

Par défaut, elle ne permet pas de lire des fichiers AAC.

Crée un fichier config/mimetypemapping.json contenant :

{
        "aac": ["audio/mp4"]
}

Lancer ensuite (dans le répertoire NextCloud) :

sudo -u www-data php occ maintenance:mimetype:update-db --repair-filecache
sudo -u www-data php occ maintenance:mimetype:update-js

La lecture est à présent possible.

Challenge

Erreur lors du renouvellement d'un certificat Let's Encrypt

|

Erreur obtenue lors d’un certbot renew :

-------------------------------------------------------------------------------
Processing /etc/letsencrypt/renewal/mon-domaine.fr.conf
-------------------------------------------------------------------------------
Cert is due for renewal, auto-renewing...                       
Renewing an existing certificate                                
Performing the following challenges:                                           
Client with the currently selected authenticator does not support any combination of challenges that will satisfy the CA.
Attempting to renew cert from /etc/letsencrypt/renewal/mon-domaine.fr.conf produced an unexpected error: Client with the currently selected authenticator does not support any combination of challenges that will satisfy the CA.. Skipping.

Résolution (certificat utilisé dans Apache) :

sudo certbot --authenticator standalone --installer apache -d mon-domaine.fr --pre-hook "systemctl stop apache2" --post-hook "systemctl start apache2"

Et si Windows devenait une distribution Linux ?

|

L’idée peut faire sourire, mais quand on y réfléchit bien, elle n’est pas si absurde que ça. Il s’agirait bien évidemment d’une évolution à long terme, peut-être de l’ordre d’une dizaine d’années.

Commençons par regarder la répartition des revenus de Microsoft.

2016 Microsoft revenues

(source: healthventures.info)

On constate en tout premier lieu que 28% des revenus sont générés par Office. En seconde position à 22% sont regroupés Windows Server et Microsoft Azure. Je n’ai pas réussi à obtenir de chiffres plus détaillés de ce côté là, mais je soupçonne Azure de représenter la majeure partie de cette catégorie de revenus. On sait par ailleurs que l’OS le plus hébergé sur Azure est Linux.

Aujourd’hui, même la division XBox rapporte plus à Microsoft que Windows. Ont-ils encore intérêt à assumer la totalité du développement d’un OS pour ces 9% de revenus ? Après tout, ils ont déjà franchi le pas pour leur navigateur web Edge en adoptant Chromium. Qui l’aurait cru il y a encore peu (moins de dix ans), quand Internet Explorer était encore le navigateur le plus utilisé ?

En parallèle, on constate depuis ces dernières années de nombreux signes d’ouverture de Windows vers Linux, et plus largement vers le logiciel libre. Citons, en vrac :

Et tout récemment, Microsoft à annoncé que les prochaines version de Windows contiendraient un noyau Linux maison pour faire tourner WSL (Windows Subsystem for Linux). Celà fait remonter quelques souvenirs de 2011, année ou Microsoft était dans le top 5 des contributeurs au noyau Linux.

On constate aussi que Microsoft pousse très fortement les versions Cloud de ses outils (Office365), effaçant petit à petit la dépendance à Windows. Et c’est bien normal, Windows n’est plus l’OS majoritaire. Certes il le reste sur les ordinateurs personnels (même si MacOS X a pris une part du gâteau), mais la bataille a déjà été perdue au profit de Linux sur les serveurs, et face à Android/iOS sur les devices mobiles qui, ne l’oublions pas, représentent aujourd’hui plus de la moitié du trafic web mondial. On pourrait même voir cette incitation à passer à “Office cloud” comme une manière d’assurer les revenus liés à Office dans l’éventualité d’un changement d’architecture de Windows.

En parallèle, on constate que Windows n’a plus le vent en poupe auprès de développeurs, tant au niveau des plate-formes de développement, que des OS cibles. Ne plus attirer de développeurs, ce n’est généralement pas bon signe sur le long terme.

Bref, Microsoft a-t-il encore intérêt à redoubler d’efforts pour maintenir Windows à flot face à la concurrence, alors que son cœur de métier est désormais dans le cloud ? Est-il temps d’intégrer le noyau Linux dans Windows pour permettre de porter en douceur les outils sur cette nouvelle architecture, petit à petit ? Serait-ce déjà en cours ?

Bitcoin Challenge / 310 BTC cachés dans une image

|

Dans l’esprit du challenge du challenge du logo de l’ANSSI, un anonyme a lancé le 2 octobre sur Reddit et BitcoinTalk une invitation à relever un challenge : trouver la clé privée cachée dans une image donnant accès à un wallet contenant 310 BTC. L’auteur a déjà apporté la preuve cryptographique qu’ils étaient en sa possession en signant l’url du challenge avec la clé privée du wallet.

Je ne me fais pas de faux espoirs, il y a des gens bien plus compétents que moi qui emporteront le prix. Cependant, la résolution de l’énigme reste un défi passionnant. J’indiquerai donc sur cette page l’état de mes recherches. N’hésitez pas à partager les vôtres dans les commentaires. Si vous souhaitez que l’on planche à plusieurs, n’hésitez pas non plus ; on pourrait par exemple se retrouver sur un canal IRC dédié. Bonne chance à tous !

L’image source

Challenge

Les découvertes

Le tableau de 18 valeurs

Cette énigme a été résolue dès le deuxième jour du challenge. Elle permet d’obtenir la clé privée d’un wallet qui contenait initialement 0.1 BTC.

La première étape consiste à repérer une date cachée dans l’image.

Challenge

“OCT 2 2018” nous donne en format propre (= pas américain) : “20181002”.

Nous prenons ensuite les caractères de cette chaîne 1 par 1 (en répétant la chaîne au besoin) et les soustrayons aux caractères du tableau initial (en hexadécimal). En cas de valeur négative, on repart de la valeur maximum (F en hexadécimal) et on soustrait le reste.

Si ce n’est pas clair, imaginez un cadenas à code en hexadécimal (donc des molettes à 16 positions). si vous devez soustraire 4 d’une molette qui se trouve sur 2, vous allez passer de 2 à 1, de 1 à 0, de 0 à F, et enfin de F à E. On peut faire ce calcul en convertissant en décimal et utilisant notre cher modulo : 2 - 4 = -2 et -2 mod 16 = 14 (E en hexadécimal). Le nombre de crans pour chaque molette correspond à ce qu’indique chaque caractère correspondant dans la clé “20181002” : descendre la première molette de 2, la deuxième de 0, la troisième de 1…

On constate ainsi que la première ligne nous donne une série de “310” qui nous suggère que nous sommes sur la bonne piste. Toutes les autres valeurs du tableau donnent des chiffres (une fois la conversion hexadécimal vers décimal effectuée) inférieurs à 2048. Ces valeurs correspondent à un codage possible en BIP-0039 (liste de mots parmi 2048 possibilités).

Challenge

La formule utilisée dans chaque cellule du tableau C (attention les yeux) :

=dec2hex(mod(hex2dec(mid(CELLULE_DE_A;1;1))-mid(CELLULE_CORRESPONDANTE_DE_B;1;1);16)) &
dec2hex(mod(hex2dec(mid(CELLULE_DE_A;2;1))-mid(CELLULE_CORRESPONDANTE_DE_B;2;1);16)) &
dec2hex(mod(hex2dec(mid(CELLULE_DE_A;3;1))-mid(CELLULE_CORRESPONDANTE_DE_B;3;1);16))

On obtient donc 12 mots qui correspondent à la clé privée d’un wallet contenant 0.1 BTC.

cry buyer grain save vault sign
lyrics rhythm music fury horror mansion
  • Adresse : 1446C8HqMtvWtEgu1JnjwLcPESSruhzkmV
  • Clé publique : 0376a376c4c2fc0ffad1a5d87f2100343d2cd29a5f7859458e545857727133e349
  • Clé privée : KzkZxdhRGxB7eX4u1skXkfJ7VB8JfPp7Nfos3jiF7PQUNMh2SHDE

Le masque de transparence

Le PNG d’origine présente des zones légèrement transparentes invisibles à l’œil nu (opacité de 253 sur 255). Voici comment les mettre en évidence avec Gimp :

Le QRcode amène vers une page du site où l’on peut tenter de valider la hash sha256 d’un fichier. La ligne correspond quant à elle à du binaire :

0101010100110010010001100111001101100100010001110101011001101011010110000011000100111001010100010011001101001001001011110010111101010110010000110100100000110000010101010011001101100011010101100111010001001001010101000101101000110011011000110110101101001001010011000100101001101110010101010110001101100100010100000101100000110011010001110111001100110101011100010110101001100100010001100011000101010101011010100101101000110011011011010100000101100110011101000100011101101001011101100111010001000110010110010100010000001010010011100011010101011010010000110101001101101011010000100111100101101110011011100101011001110001010000100110000101110111011011000011010001110000001110000111011101001011010011110011000001001111001110000111101001001001001101100100010000110000010000010011000100101011010101100100010101010110010000110101010101111001010001010111011001000101011001010100111001101111010101010110011001000111011000110101001100110000010001010110110000111001011001000011100100110011011101100111001101010000011110000110001001100111001101110000101001000100001101010110000101110110011101010110011001010001011100110101001101100011011001110111001101101011001100110101000101000101011101000111000100111001001011110100110100110100010001000110111100110011001100100100111101001011010001100110010101110001001100000011000000101111001100110100111001110010011110000101011101001111011100110100110101101101011010000011001101000001010110000110110101000100011110100111010101110101010110100011000001110001011011010101101001100001010010010011011101110010011001010011000100110110000010100100011001100011010110000100100101110010011011010101000001010000011010010101000101000100010011110100100001010010011000110011011101110111011101000011000001101110011001110011011001110001010011000110100101001110011110100011011101010110011100010100010101010011010100100101010001100100011110000101000001001111011000010110100001001011010001100101001001101011010101110101010000111000011100110101010000101011010101010111001000110010011110010010101100110010011010010101101000110010010011000100010101100001011110000100111000001010010011010011011101010101010110100111000101100011010100000111011101011001011001110110110100110110010001100110111101001011010011110101011001101010011011100111000101100100011001010110011100110011001100000101001000110010001101110110101001100011001101100100000101101111010001100101000001111001010100100101101000110010011001110011100000101011010001010100101001001101011100000011001101101110001011110111000001100110001110010011010001101111010100110100001101001100010001010101011101101011011000110011000001101111011100110000101001101010010010000011100101000100011100010110001001001101001101100100010001010101011100000111010001110101001100110100100001001010011000100100000101010110011101110101100001010001001111010011110100001010

Converti en ASCII, cela donne :

U2FsdGVkX19Q3I//VCH0U3cVtITZ3ckILJnUcdPX3Gs5qjdF1UjZ3mAftGivtFYD
N5ZCSkBynnVqBawl4p8wKO0O8zI6D0A1+VEVCUyEvEeNoUfGcS0El9d93vsPxbg7
D5avufQsScgsk3QEtq9/M4Do32OKFeq00/3NrxWOsMmh3AXmDzuuZ0qmZaI7re16
FcXIrmPPiQDOHRc7wt0ng6qLiNz7VqESRTdxPOahKFRkWT8sT+Ur2y+2iZ2LEaxN
M7UZqcPwYgm6FoKOVjnqdeg30R27jc6AoFPyRZ2g8+EJMp3n/pf94oSCLEWkc0os
jH9DqbM6DUptu3HJbAVwXQ==

Si l’on fait un décodage base64, la chaîne obtenue débute par “Salted”. C’est visiblement un fichier de 256 octets chiffré via OpenSSL. Reste à trouver l’algorithme de chiffrement et la clé.

On appellera ce fichier alpha.enc.

Extraction du LSB du canal rouge

LSB : Least Significant Bit (bit de poids faible)

On comparant tout les couches visibles de l’image d’origine, on constate des différences dans la couche rouge, notamment sur la ligne 310.

En extrayant l’inverse du dernier bit de la valeur de chaque pixel de la ligne 310 du canal rouge, on obtient le code binaire suivant :

0100101010111001010011100111101101111011000011001110010100110000010110000011001001111101000100000110011100001000001011110010101010010111100010100010101001110100011001010011001101100011100001101100111100010110001001010111001000100110111011111100100001010011111111011001111101111100001111101001011101010010001100110001000000100000000100110011101011111000111101011100010110001011001111011110010001101110100011100101010110011100011100111111000001001100010000110001111001110101110101001101010011101110101100111010111011100011101010111111000110100110010001101111010011101000010000110111001010111100000001011011011010101100110011111101101010100110101101010110111111111111100110010000111101100001000000100001101011000111111010110110110101100110000111011101011011011001011011011010010000010101001110111010011101100111000111001101010001110111001111001111000000111000110010111101101111000011000010001101110110110111010101111000001010111001011010110001001000100110000011110111100101000010001010010111111000111010110010000010111111110010100101100011010010100000111110000010100111000100111011001110000001101000111110100001101011011111000110010100100111010000001101111100000111110000110010000100010001011010010111011011010111010110110111010111101001101110011100000111001111000000010010110111001010110011011101110111001010101011100110010000111000101000000011101001110001001110101001101000010111111000000101110011011111011010101010111011110010011001111000111100110001010110100111101000001100011100111101101010100000101101101010100111101111101000010000110010000111010111011001011011110110111111011001001011110100110111000110000100011110100000011100100001001010101101110010001100111111010100001110001111111100001101110111100011111101010000101000011001111110110000000010011011011000111100101000101101101010110100001011011111000110100011010000111111001100110100011100110011000111000100100111111001111010100001100111000001100010010100010000110000110101101011110010100101000000101010010101010111001000110010011110010010101100110010011010010101101000110010010011000100010101100001011110000100111000001010010011010011011101010101010110100111000101100011010100000111011101011001011001110110110100110110010001100110111101001011010011110101011001101010011011100111000101100100011001010110011100110011001100000101001000110010001101110110101001100011001101100100000101101111010001100101000001111001010100100101101000110010011001110011100000101011010001010100101001001101011100000011001101101110001011110111000001100110001110010011010001101111010100110100001101001100010001010101011101101011011000110011000001101111011100110000101001101010010010000011100101000100011100010110001001001101001101100100010001010101011100000111010001110101001100110100100001001010011000100100000101010110011101110101100001010001001111010011110100001010111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111

Il inclut notamment cette portion :

010101010111001000110010011110010010101100110010011010010101101000110010010011000100010101100001011110000100111001001101001101110101010101011010011100010110001101010000011101110101100101100111011011010011011001000110011011110100101101001111010101100110101001101110011100010110010001100101011001110011001100110000010100100011001000110111011010100110001100110110010000010110111101000110010100000111100101010010010110100011001001100111001110000010101101000101010010100100110101110000001100110110111000101111011100000110011000111001001101000110111101010011010000110100110001000101010101110110101101100011001100000110111101110011011010100100100000111001010001000111000101100010010011010011011001000100010101010111000001110100011101010011001101001000010010100110001001000001010101100111011101011000010100010011110100111101

Qui convertie en ASCII donne :

Ur2y+2iZ2LEaxNM7UZqcPwYgm6FoKOVjnqdeg30R27jc6AoFPyRZ2g8+EJMp3n/pf94oSCLEWkc0osjH9DqbM6DUptu3HJbAVwXQ==

Elle correspond la fin du fichier chiffré alpha.enc obtenu dans la ligne 310 du canal alpha. Il y a donc une relation entre ces deux lignes.

Si on effectue une opération XOR entre le binaire inversé du canal alpha et le binaire inversé du dernier bit du canal rouge, on obtient :

0001111110001011000010000000100000011111010010111011001101011011000000000000001101000100010000010101010001000001000000000000010111000001110010010110001001000100001100000000000000000000110100001011101101011111011100010010100000010101100011001010001100011010101100011101010100010010011010111111010000110110011000110100100000010011010101000100100111001101100001001010111111101111011110111101010100111011111001000000111110101111000111101011000100101010001101110101100100011100101000101010000010101000111010101110101011101001111001011100010011111100000001011010011110000011000000010000101111010010011010111110000011011101100011011011101111010001110110010101101110001111101000010111100000101010010011010010101010001000110100110001011100101111001010111001001011101001001011001001010100111110011011011110001000110001010111111000000100001110011110011000011001111101101011101001010110101100010111011011101111110000001101001101000110001001001011100111111000011111011010110100000001110001010111110000110101101010101100000100110110010101101000010011111011100100110011010100100010110010100110011000011000111001100010010100100110111100011111100011101010111011000001001001000010110101101111000011010101100011011100101111100011100010100110010001010101011101010000100011110010001011000011010001011111000010010001110100001010000100101010100100000001011010011101101100101100000001110101011100100010010101011111110000010010011011111100111101000111011101100110011011100100100011110001001011001101101101100110111111001001001100111000110100110010011010001001100001000011100001011011111111101111011100001111001111010001000101011101010001011111110000000110110100001111101001100001111000011110000110010110111100100001111010101010100000111100111110110001101010100111000001010001011101111101110010110110001110110111100010010111001011010011110000000100011010011101010000000010110110000110001011111111101111011011101010110110100100101011111111000101000101100101010011101110010000010000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111

Les trois premiers octets correspondent aux code hexadécimal 1F 8B 08. Intéressant car il s’agit de la signature d’un fichier GZip.

Nous créons donc un fichier avec ce code binaire :

echo -n $BINAIRE | perl -lpe '$_=pack"B*",$_' > fichier.gz

La décompression fonctionne et nous obtenons un fichier contenant :

U2FsdGVkX1+WPMJQISUVUvGRg7p4zCX4jIODIGb6b6cAreXFxv0WOxgCeSw9K+im
THiWMkRq45FsPXHs3TjYqcJz7QzQ8HeM340EwWQWXAi0fVy+r6NPmiJRgMgMqLCu
4Q9o/WkNyHxvPScNgG9jf8gskggx10FiTcoyF1KE+nxjmRkEuj7uQQsPrrlRP3sj
ll4KXhAzrGQZi5E4sajQOBGQfaJjei5fHXXO6sxeYsFcuxzo3JdMOF3JFYQtuUDY

On reconnaît la encore la chaîne U2Fs... caractéristique d’un fichier chiffre via OpenSSL.

On appellera ce fichier red-lsb.enc.

Les courbes de Bézier

Appliquer un effet miroir horizontal à l’ensemble des courbes permet de relier plusieurs cellules marquées.

Challenge

On se retrouve avec 5 groupes de caractères :

  • L3 (ou 3L)
  • 02 (ou 20)
  • 584 (ou 485)
  • 9F (ou F9)
  • 7

A partir de la, j’ai été un peu bourrin et généré la liste complète des permutations possibles (1920) via un script Python :

import itertools

sets = [ ['L3', '3L'], ['02', '20'], ['584', '485'], ['9F', 'F9'], ['7'] ]
all_item_permutations = []

sets_permutations = list(itertools.permutations(sets, len(sets)))

for sets_permutation in sets_permutations:
    item_permutations = list(itertools.product(*sets_permutation))
    all_item_permutations += item_permutations

for permutation in all_item_permutations:
    print(''.join(permutation))

On finit par déchiffrer les deux fichiers :

$ openssl enc -aes-256-cbc -md md5 -base64 -d -a -k "L379F48502" -in alpha.enc -out alpha.dec
$ cat alpha.dec
Bitcoin Challenge ..... 310 BTC
https://bitcoinchallenge.codes/

---

Well done!
Now find something really interesting here:


511 B20 332 328 410 530
245 651 58F C2C 03A 717
401 9AC 36A 53F 4C6 B26
332 328 410 530 491 312


---
$ openssl enc -aes-256-cbc -md md5 -base64 -d -a -k "02L3F95847" -in red-lsb.enc -out red-lsb.dec
$ cat red-lsb.dec
Bitcoin Challenge ..... 310 BTC
https://bitcoinchallenge.codes/

---

You're either very very close, or working in the wrong direction :)

Here you go : Z465/

---

La concaténation de toutes ces données nous permet d’obtenir un hash sha256 qui est accepté sur la page d’enregistrement sur laquelle pointait le QRcode :

$ (echo "cry buyer grain save vault sign lyrics rhythm music fury horror mansion"; cat decrypted-files/alpha.dec decrypted-files/red-lsb.dec) | tr -d '\n' | sha256sum
273e2b95648fd3cbad0d7fe3ed820e783c0b12fdbe29b57bfb2d1f243d92b1a5  -

Challenge

Déchiffrement du second tableau

En utilisant la même méthode que pour le premier tableau, nous obtenons la liste de mots :

Challenge

En combinant les 12 premiers mots obtenu et ces 12 nouveaux, nous obtenons les 24 mots suivants :

cry buyer grain save vault sign
lyrics rhythm music fury horror mansion
debris slim immune lock actual tide
gas vapor fringe pole flat glance

Il s’agit d’un liste BIP39 valide permettant de déverrouiller un wallet contenant 0.2 BTC :

  • Adresse : 1G7qsUy5x9bUd1pRfhVZ7cuB5cMUP4hsfR
  • Clé publique : 02707e976e321e77c6b301b14f1c64d00b2b67b11963ab739aadccba6ddca05862
  • Clé privée : KxPEUpQ5BE75UGRUVjNmf8dQuWsmP9jqL3FUUjavdRW69MEcmg6C

Pistes non concluantes (pour le moment)

La trame de fond

Une trame de fond est détectable sur l’ensemble de l’image. On peut la mettre en évidence via une solarisation (appliquer un courbe de colorimétrique en triangle).

Challenge

Cette trame est constituée de tuiles de 128x120 pixels. Afin de l’isoler, j’ai extrait des zones sur fond blanc de l’image (principalement en haut à droite du tableau). A coups de copiers-collers et de déplacements au pixel, on obtient :

Challenge

Ensuite, j’ai constitué une image à partir de ce motif (dans Gimp, filtre “Tile”) légèrement supérieure à la taille de l’image de départ. Je l’ai ensuite placée en couche en mode extraction de grain et l’ai calée au pixel près sur l’image de départ. Une normalisation plus tard, on obtient une image débarrassée du motif :

Challenge

En mode fusion de grain, on peut aussi récupérer la texture exacte ayant été appliquée sur l’image d’origine.

Challenge

Appliquée à une image random, cela donne.

Challenge

Cela n’a abouti à rien concernant le challenge, mais c’est un skill toujours bon à prendre.

La couche rouge

On a déjà prouvé que la ligne 310 de la couche rouge contenait un fichier encodé sur le dernier bit de données.

Challenge

Cette image est issue de la comparaison des couches rouge et vert.

Légende :

  • rouge : la valeur du canal rouge est 1 bit inférieure à celle du canal vert
  • vert : la valeur du canal rouge est 1 bit supérieure à celle du canal vert
  • gris : valeur du canal rouge égale à celle du canal vert
  • noir : valeur du canal rouge égale à celle du canal vert, et la valeur du canal vert est à zéro
  • blanc : valeur du canal rouge égale à celle du canal vert, et la valeur du canal vert est à 255 (maximum)

On remarque ici que la valeur du canal rouge varie en +1 et -1 bits par rapport au canal vert. C’est très symptomatique d’une information stockée sur le LSB d’un canal. En effet, le remplacement arbitraire du dernier bit provoque une modification de la valeur décimale comprise entre -1 et 1. En creusant un peu plus, on peut constater que ce remplacement n’est arbitraire : certaines valeurs passant par exemple de 11011111 à 11100000, alors qu’il aurait été plus simple de mettre 11011110).

En analysant en détail, on remarque trois cas :

  • passage du lsb de 0 à 1 : +1
  • passage du lsb de 1 à 0 (si l’octet de départ différent de 11111111) : +1
  • passage du lsb de 1 à 0 (si l’octet de départ vaut 11111111) : -1

Quand on regarde le tableau du bas de l’image, on constate aussi des différences entre les canaux rouge et vert, mais d’une forme très différente :

Challenge

Nous n’avons que des variations de -1 bit pour le canal rouge. Si une information est stockée ici, elle ne l’est pas de la même manière que pour la ligne 310. Le fait qu’il n’y ait pas de variation de +1 par rapport au canal de référence pourrait laisser penser qu’un LSB à 0 n’a jamais été remplacé par un 1 (+1), mais ce n’est pas le cas. On trouve des altérations du type : 10010000 -> 10001111 (qui correspond bien à -1).

On constate aussi que les variations sont beaucoup moins régulières. Ces variations ponctuelles cherchent-elles à mettre en évidence des valeurs particulières sur les pixels du canal de référence ?

Ressources

Réparation d'un vidéoprojecteur Hitachi ED-A101

|

Le vidéoprojecteur Hitachi ED-A101 est un système datant de 2008. Il offre une portée ultra courte permettant un affichage d’une diagonale de 150 cm sur un écran situé à une quarantaine de centimètres. Il a été massivement utilisé vers la fin des années 2000, notamment dans des universités européennes.

Hitachi ED-A101

Ce modèle présente une faille de conception qui a causé la panne de bon nombre d’appareils avant même la fin de vie de la lampe qu’il contient (estimée entre 3000 et 4000 heures). Celle-ci se trouve au niveau du système de motorisation du clapet d’ouverture et de fermeture du miroir.

Au niveau de ce clapet, une roue en plastique sensée entraîner l’axe métallique transversal solidaire du miroir s’use prématurément.

Hitachi ED-A101 roue (source photo: vendeur ebay radadragon)

Hitachi ED-A101 roue (source photo: vendeur ebay radadragon)

Hitachi a partiellement reconnu le vice de conception en permettant aux personnes concernées par le problème d’obtenir un moteur de rechange pendant 5 ans après la date d’achat (la garantie initiale était de 3 ans). D’après mes recherches, le bloc moteur de remplacement était identique à celui d’origine, donc voué à tomber à nouveau en panne.

De ce fait, des milliers de vidéoprojecteurs de ce modèle (et d’autres de la marque équipés du même dispositif d’ouverture) ont été mis à la benne. Des milliers de vidéoprojecteurs vendus initialement autours de 2500 dollars jetés en raison de la défaillance d’une petite roue en plastique de moins d’1 centimètre de diamètre…

Mais en quoi la panne du mécanisme d’ouverture rend-elle le projecteur inutilisable ? Après tout, la trappe pourrait parfaitement être ouverte manuellement. C’est là que l’affaire se corse. Le vidéoprojecteur se met en erreur dès qu’il détecte un problème d’ouverture du miroir, et ce mécanisme est quant à lui extrêmement abouti. Un interrupteur de position va détecter quand le miroir est en début et en fin de course. De plus, le vidéoprojecteur va analyser la charge du moteur pour déterminer que le miroir est en fin de course ; il va détecter quand ça “force” (sans doute une des sources du problème d’usure). Difficile donc de faire croire au vidéoprojecteur que le mécanisme d’ouverture du miroir est fonctionnel en l’ouvrant à la main.

Du fait de la popularité de ce modèle lors de sa commercialisation, beaucoup de personnes se sont penchées sur le sujet. On peut ainsi trouver :

… et surtout, un projet à base d’Arduino pour leurrer le vidéoprojecteur. C’est la solution que j’ai vais explorer pour plusieurs raisons :

  • cela fait pas mal de temps que je voulais réaliser un projet à base d’Arduino
  • faible coût : mois de 10€ de composants, port compris
  • contournement définitif de la faille de conception du vidéoprojecteur (le miroir n’est plus motorisé)
  • possibilité de réutiliser les composant lorsque le vidéoprojecteur sera définitivement HS

A suivre.

Office365 / Fuite de données - Énumération d'adresses mail valides

|

Le service ActiveSync d’Office365 présente une faille permettant de vérifier la validité des adresses mail d’un domaine (si l’adresse mail est utilisée en tant qu’identifiant). Les retours HTTP sont en effet différents en fonction de l’existence ou non d’un identifiant spécifique.

Ce problème a initialement été signalé ici : https://www.sec-1.com/blog/2017/office365-activesync-username-enumeration

Prévenu par l’auteur fin juin 2017, Microsoft n’a pas jugé ce problème suffisamment critique pour prévoir un correctif.

L’url ActiveSync d’Office365 (https://outlook.office365.com/Microsoft-Server-ActiveSync) ne semble par ailleurs pas être protégée par un système de throttling permettant d’éviter les requêtes trop nombreuses sur une période donnée, ce qui laisse la porte ouverte à une exploitation massive.

Exemples

Adresse e-mail valide (prenom.nom@mondomaine.fr)

$ auth=$(echo -n 'prenom.nom@mondomaine.fr:motdepassebidon' | base64); curl -v -X OPTIONS \
-H "OPTIONS /Microsoft-Server-ActiveSync HTTP/1.1" -H "Host: outlook.office365.com" \
-H "Connection: close" -H "MS-ASProtocolVersion: 14.0" -H "Content-Length: 0" \
-H "Authorization: Basic $auth" https://outlook.office365.com/Microsoft-Server-ActiveSync \
2>&1 | grep "X-CasErrorCode"
<pas de retour>

Adresse e-mail inexistante (prenom.nom.bidon@mondomaine.fr)

$ auth=$(echo -n 'prenom.nom.bidon@mondomaine.fr:motdepassebidon' | base64); curl -v \
-X OPTIONS -H "OPTIONS /Microsoft-Server-ActiveSync HTTP/1.1" -H "Host: outlook.office365.com" \
-H "Connection: close" -H "MS-ASProtocolVersion: 14.0" -H "Content-Length: 0" \
-H "Authorization: Basic $auth" https://outlook.office365.com/Microsoft-Server-ActiveSync \
2>&1 | grep "X-CasErrorCode"
< X-CasErrorCode: UserNotFound

Bitcoin / Installation d'un nœud Lightning mainnet avec bitcoind et lnd 0.4-beta

|

Installation d’un noeud lightning mainnet bitcoind (au lieu de btcd) + lnd 0.4-beta sous Ubuntu 16.04.3 server

Pour n’oublier aucune étape, je suis parti d’une machine virtuelle avec une installation vierge et à jour de la distribution. Rien d’autre n’a été installé hormis les groupes logiciels :

  • standard system utilities
  • OpenSSH server

Bitcoind

Installation

sudo apt-add-repository ppa:bitcoin/bitcoin
# appyer sur entrée pour accepter l'avertissement
sudo apt-get update
sudo apt-get install bitcoind

Configuration

mkdir ~/.bitcoin

Création du fichier ~/.bitcoin/bitcoin.conf :

txindex=1
server=1
daemon=1
zmqpubrawblock=tcp://127.0.0.1:18501
zmqpubrawtx=tcp://127.0.0.1:18501
rpcuser=mon_login
rpcpassword=mon_password

Lancement et synchronisation de la blockchain

On peut désormais lancer bitcoind et attendre que la chaîne se synchronise.

bitcoind

On peut suivra l’avancement de la synchro via :

tail -f ~/.bitcoin/debug.log

On peut aussi récupérer la blockchain d’un autre bitcoind déjà synchronisé. Il s’agit des répertoires suivants :

  • ~/.bitcoin/chainstate/
  • ~/.bitcoin/blocks/

Lnd

Prérequis

Installation de Go et git :

sudo apt-get install golang-1.10 git

Mise à jour du PATH :

echo 'export GOPATH=~/gocode' >> $HOME/.profile
export GOPATH=~/gocode
echo 'export PATH=$PATH:$GOPATH/bin:/usr/lib/go-1.10/bin' >> $HOME/.profile
export PATH=$PATH:$GOPATH/bin:/usr/lib/go-1.10/bin

Installation de dep :

go get -u github.com/golang/dep/cmd/dep

Installation

git clone https://github.com/lightningnetwork/lnd $GOPATH/src/github.com/lightningnetwork/lnd
cd $GOPATH/src/github.com/lightningnetwork/lnd
dep ensure
go install . ./cmd/...

Configuration

mkdir ~/.lnd

Création d’un fichier ~/.lnd/lnd.conf :

[Application Options]
debuglevel=info
debughtlc=true
maxpendingchannels=10
externalip=mon_ip_externe:9735
listen=localhost:9735
alias=mon node lightning

[Bitcoin]
bitcoin.active=1
bitcoin.node=bitcoind
bitcoin.mainnet=1

Pas besoin de préciser les paramètres de connexion à bitcoind, lnd va automatiquement les récupérer depuis ~/.bitcoin/bitcoin.conf.

On doit d’assurer que le port 9735 est bien accessible depuis internet (redirection de port à mettre en place si nécessaire).

Lancement

lnd

Création d’un wallet Bitcoin (on doit choisir un mot de passe) :

lncli create

Notez la seed.

Si on relance lnd par la suite, il faudra déverrouiller le wallet via :

lncli unlock

Génération d’une adresse Bitcoin

lncli newaddress np2wkh

Bien noter cette adresse car elle ne sera pas affichée ultérieurement.

Alimenter l’adresse en BTC

Vous savez comment.

Connexion à un autre nœud

lncli connect 03f113414ebdc6c1fb0f33c99cd5a1d09dd79e7fdf2468cf1fe1af6674361695d2@51.15.213.104:9735

Création d’un channel

On alloue dans cet exemple 300000 satoshis au nouveau channel.

lncli openchannel 02464bfaaae78b98268a6a6d7e8f6a110c60dd1293811d6029b11ee9edb4bbf869 --local_amt 300000

A partir d’ici, on peut effectuer des paiements, se connecter à d’autres nœuds, ouvrir de nouveaux channels etc.

Ressources

Zimbra / Supprimer un store d'une infrastructure Zimbra

|

La méthode la plus souple pour mettre à jour une infra Zimbra consiste généralement à installer de nouveaux stores sous la nouvelle version, et à migrer progressivement les boîtes mail vers ces nouveau stores. Dans mon cas d’usage, cette méthode à permis de migrer un peu plus de 12000 comptes de stores en version 8.6.0 GA vers la version 8.7.11 GA, en période de production, sans qu’aucun utilisateur ne s’en rende compte.

Comment procéder une fois que les stores d’origine sont vides ?

Dans cet exemple, nous allons supprimer un store nommé zstoreX, sur le domaine domaine.tld.

Préalable

  • S’assurer que le store n’est pas dans le “pool de serveurs” d’une des COS existantes.
  • Vérifier qu’il n’y a plus aucun compte sur le store via une recherche : ‘‘(zimbraMailHost=zstoreX.domaine.tld)’’
  • Vérifier qu’il n’y a plus de sauvegardes utiles sur le store concerné (on a donc laissé le store vide actif le temps que toutes les sessions de sauvegarde en rétention soient vides).

Suppression des références à zstoreX

On va vérifier, sur chaque serveur de l’infra, s’il y a des reférences à zstoreX dans les configurations locales :

Config locale

zmlocalconfig | grep zstoreX

Config serveur

zmprov gs $(zmhostname) | grep zstoreX

On regarde ensuite dans la configuration du domaine :

Config domaine

zmprov gd domaine.tld | grep zstoreX

Ensuite on regarde dans la config globale :

zmprov gacf | grep zstoreX

On découvre normalement que les attributs concernés sont :

  • zimbraReverseProxyAvailableLookupTargets
  • zimbraReverseProxyUpstreamLoginServers

Celà va evidemment varier selon l’infra.

Notons que zmprov gs remonte les attributs serveurs et ceux hérité de la config globale, mais on va quand meme s’assurer de supprimer une éventuelle config locale de ces attributs, sur toutes les machines de l’infra :

zmprov ms `zmhostname` -zimbraReverseProxyAvailableLookupTargets zstoreX.domaine.tld
zmprov ms `zmhostname` -zimbraReverseProxyUpstreamLoginServers zstoreX.domaine.tld

Ensuite on modifie la config globale, uniquement sur un serveur :

zmprov mcf -zimbraReverseProxyUpstreamLoginServers zstoreX.domaine.tld
zmprov mcf -zimbraReverseProxyAvailableLookupTargets zstoreX.domaine.tld

La modif est visible immédiatement sur le serveur où la commande a été lancée. On vérifie qu’il n’y a plus rien :

zmprov gacf | grep zstoreX; zmprov gs $(zmhostname) | grep zstoreX

Pour les autres, on doit d’abord flusher le cache de la config (la doc recommande de la faire serveur par serveur, successivement) :

zmprov flushCache config; zmprov gacf | grep zstoreX; zmprov gs $(zmhostname) | grep zstoreX

Désactivation des services du store à supprimer

Sur zstoreX, récupérer la liste des services activés :

zmprov gs `zmhostname` zimbraServiceEnabled

et les désactiver (adapter cette liste au retour de la commande précédente) :

zmprov ms `zmhostname` -zimbraServiceEnabled service
zmprov ms `zmhostname` -zimbraServiceEnabled zimbra
zmprov ms `zmhostname` -zimbraServiceEnabled zimbraAdmin
zmprov ms `zmhostname` -zimbraServiceEnabled zimlet
zmprov ms `zmhostname` -zimbraServiceEnabled mailbox
zmprov ms `zmhostname` -zimbraServiceEnabled convertd
zmprov ms `zmhostname` -zimbraServiceEnabled stats
zmprov ms `zmhostname` -zimbraServiceEnabled spell

Suppression du store

A lancer sur un serveur de l’infra :

zmprov deleteServer zstoreX.domaine.tld

La commande retournera une erreur si le store n’est pas totalement vide.

Il devrait avoir disparu de tous les stores/serveurs quand on effectue un :

zmprov getAllServers

Mise à jour des clés ssh

Sur tous les serveurs restants, lancer :

zmupdateauthkeys

Linux / Effectuer des captures d'écran de sites web en console via cutycapt

|

Cutycapt est un outil basé sur Qt qui permet d’effectuer des captures d’écran de sites web. Par défaut il capture l’intégralité de la page mais on peut facilement cropper et redimensionner l’image générée pour obtenir une vignette de prévisualisation d’un site web.

while read a
do
        cutycapt --url=http://$a --out=$a.png
        convert -resize 240 -crop 240x180+0+0 $a.png $a.png
done < url-list.txt

Bitcoin / Installation d'un nœud Lightning testnet bitcoind/lnd

|

Installation d’un nœud lightning bitcoind (au lieu de btcd) + lnd sous Ubuntu 16.04.3 server

Pour n’oublier aucune étape, je suis parti d’une machine virtuelle avec une installation vierge et à jour de la distribution. Rien d’autre n’a été installé hormis les groupes logiciels :

  • standard system utilities
  • OpenSSH server

Bitcoind

Installation

sudo apt-add-repository ppa:bitcoin/bitcoin
# appyer sur entrée pour accepter l'avertissement
sudo apt-get update
sudo apt-get install bitcoind

Configuration

mkdir ~/.bitcoin

Création du fichier ~/.bitcoin/bitcoin.conf :

testnet=1
txindex=1
server=1
daemon=1
zmqpubrawblock=tcp://127.0.0.1:18501
zmqpubrawtx=tcp://127.0.0.1:18501
rpcuser=mon_login
rpcpassword=mon_password

Lancement et synchronisation de la blockchain

On peut désormais lancer bitcoind et attendre que la chaîne se synchronise.

bitcoind

On peut suivra l’avancement de la synchro via :

tail -f ~/.bitcoin/testnet3/debug.log

On peut aussi récupérer la blockchain d’un autre bitcoind déjà synchronisé. Il s’agit des répertoires suivants :

  • ~/.bitcoin/testnet3/chainstate/
  • ~/.bitcoin/testnet3/blocks/

Lnd

Prérequis

Installation de Go et git :

sudo apt-get install golang-1.9 git

Mise à jour du PATH :

echo 'export GOPATH=~/gocode' >> $HOME/.profile
export GOPATH=~/gocode
echo 'export PATH=$PATH:$GOPATH/bin:/usr/lib/go-1.9/bin' >> $HOME/.profile
export PATH=$PATH:$GOPATH/bin:/usr/lib/go-1.9/bin

Installation de Glide :

go get -u github.com/Masterminds/glide

Installation

git clone https://github.com/lightningnetwork/lnd $GOPATH/src/github.com/lightningnetwork/lnd
cd $GOPATH/src/github.com/lightningnetwork/lnd
glide install
go install . ./cmd/...

Configuration

mkdir ~/.lnd

Création d’un fichier ~/.lnd/lnd.conf :

[Application Options]
debuglevel=info
debughtlc=true
maxpendingchannels=10
externalip=mon_ip_externe:9735
listen=localhost:9735
alias=mon node lightning

[Bitcoin]
bitcoin.active=1
bitcoin.node=bitcoind
bitcoin.testnet=1

Pas besoin de préciser les paramètres de connexion à bitcoind, lnd va automatiquement les récupérer depuis ~/.bitcoin/bitcoin.conf.

On doit d’assurer que le port 9735 est bien accessible depuis internet (redirection de port à mettre en place si nécessaire).

Lancement

lnd

Création d’un wallet Bitcoin (on doit choisir un mot de passe) :

lncli create

Si on relance lnd par la suite, il faudra déverrouiller le wallet via :

lncli unlock

Génération d’une adresse Bitcoin

lncli newaddress np2wkh

Bien noter cette adresse car elle ne sera pas affichée ultérieurement.

Alimenter l’adresse en tBTC (testnet bitcoins)

Via ce faucet par exemple : https://testnet.manu.backend.hamburg/faucet

Connexion à un autre nœud

On peut trouver des adresses de nœuds sur https://explorer.acinq.co

lncli connect 03f113414ebdc6c1fb0f33c99cd5a1d09dd79e7fdf2468cf1fe1af6674361695d2@51.15.213.104:9735

Création d’un channel

On alloue dans cet exemple 300000 satoshis au nouveau channel.

lncli openchannel 02464bfaaae78b98268a6a6d7e8f6a110c60dd1293811d6029b11ee9edb4bbf869 --local_amt 300000

A partir d’ici, on peut effectuer des paiements, se connecter à d’autres nœuds, ouvrir de nouveaux channels etc.

Ressources

Windows - Lancer l'économiseur d'écran en un clic via un raccourci

|

Une fois n’est pas coutume, une petite astuce Windows pour pouvoir créer dans la barre de lancement rapide un raccourci qui lance l’économiseur d’écran (un écran noir). Un simple mouvement de souris permettra de sortir de ce mode.

Ce besoin m’a été communiqué par une orthophoniste qui souhaitait pouvoir éteindre temporairement son écran (déporté) lorsqu’il n’était pas nécessaire, pour ne pas déconcentrer ses patients.

Le fichier permettant de lancer l’économiseur d’écran est :

C:\Windows\System32\scrnsave.scr

Petite subtilité cependant : Windows n’accepte pas que l’on place un raccourci vers un fichier .scr dans la barre de lancement rapide.

On choisit donc de créer un nouveau raccourci sur le bureau, et d’indiquer la cible :

C:\Windows\explorer.exe “C:\Windows\System32\scrnsave.scr”

Ce raccourci peut ensuite être copié via un glisser-déposer dans la barre de lancement rapide (on peut aussi modifier son nom et l’icône associée).

La raccourci du bureau peut ensuite être supprimé.

Bitcoin / Installation d'un nœud Lightning testnet bitcoind/lnd (obsolète)

|

Installation d’un nœud lightning bitcoind (au lieu de btcd) + lnd sous Ubuntu 16.04.3 server

17/01/2018 : Le support bitcoind ayant été intégré à la branche MASTER de lnd, cette doc n’est plus à jour. Une nouvelle version est disponible ici.

Pour n’oublier aucune étape, je suis parti d’une machine virtuelle avec une installation vierge et à jour de la distribution. Rien d’autre n’a été installé hormis les groupes logiciels :

  • standard system utilities
  • OpenSSH server

Bitcoind

Installation

sudo apt-add-repository ppa:bitcoin/bitcoin
# appyer sur entrée pour accepter l'avertissement
sudo apt-get update
sudo apt-get install bitcoind

Configuration

mkdir ~/.bitcoin

Création du fichier ~/.bitcoin/bitcoin.conf :

testnet=1
txindex=1
server=1
daemon=1
zmqpubrawblock=tcp://127.0.0.1:18501
zmqpubrawtx=tcp://127.0.0.1:18501

Lancement et synchronisation de la blockchain

On peut désormais lancer bitcoind et attendre que la chaîne se synchronise.

bitcoind

On peut suivra l’avancement de la synchro via :

tail -f ~/.bitcoin/testnet3/debug.log

On peut aussi récupérer la blockchain d’un autre bitcoind déjà synchronisé. Il s’agit des répertoires suivants :

  • ~/.bitcoin/testnet3/chainstate/
  • ~/.bitcoin/testnet3/blocks/

Lnd

Prérequis

Installation de Go et git :

sudo apt-get install golang-1.9 git

Mise à jour du PATH :

echo 'export GOPATH=~/gocode' >> $HOME/.profile
export GOPATH=~/gocode
echo 'export PATH=$PATH:$GOPATH/bin:/usr/lib/go-1.9/bin' >> $HOME/.profile
export PATH=$PATH:$GOPATH/bin:/usr/lib/go-1.9/bin

Installation de Glide :

go get -u github.com/Masterminds/glide

Installation

git clone https://github.com/lightningnetwork/lnd $GOPATH/src/github.com/lightningnetwork/lnd
cd $GOPATH/src/github.com/lightningnetwork/lnd
git fetch origin pull/447/head:bitcoind-backend
git checkout bitcoind-backend
glide install

go get -u github.com/roasbeef/btcwallet
cd $GOPATH/src/github.com/roasbeef/btcwallet
git fetch origin pull/9/head:bitcoind-backend
git checkout bitcoind-backend

cd $GOPATH/src/github.com/lightningnetwork/lnd/vendor/github.com/roasbeef
rm -rf btcwallet
ln -s $GOPATH/src/github.com/roasbeef/btcwallet .

sudo apt-get install libzmq3-dev

cd $GOPATH/src/github.com/lightningnetwork/lnd
go install . ./cmd/...

Configuration

mkdir ~/.lnd

Création d’un fichier ~/.lnd/lnd.conf :

[Application Options]
debuglevel=info
debughtlc=true
maxpendingchannels=10
externalip=mon_ip_externe
peerport=9735

[Bitcoin]
bitcoin.active=1
bitcoin.rpcuser=mon_login
bitcoin.rpcpass=mon_password

[Core]
core.active=1

On doit d’assurer que le port 9735 est bien accessible depuis internet (redirection de port à mettre en place si nécessaire).

Lancement

lnd --bitcoin.active --bitcoin.testnet

Création d’un wallet Bitcoin (on doit choisir un mot de passe) :

lncli create

Si on relance lnd par la suite, il faudra déverrouiller le wallet via :

lncli unlock

Génération d’une adresse Bitcoin

lncli newaddress np2wkh

Bien noter cette adresse car elle ne sera pas affichée ultérieurement.

Alimenter l’adresse en tBTC (testnet bitcoins)

Via ce faucet par exemple : https://testnet.manu.backend.hamburg/faucet

Connexion à un autre nœud

On peut trouver des adresses de nœuds sur https://explorer.acinq.co

lncli connect 03f113414ebdc6c1fb0f33c99cd5a1d09dd79e7fdf2468cf1fe1af6674361695d2@51.15.213.104:9735

Création d’un channel

On alloue dans cet exemple 300000 satoshis au nouveau channel.

lncli openchannel 02464bfaaae78b98268a6a6d7e8f6a110c60dd1293811d6029b11ee9edb4bbf869 --local_amt 300000

A partir d’ici, on peut effectuer des paiements, se connecter à d’autres noeuds, ouvrir de nouveaux channels etc.

Ressources

Bitcoin / Installation d'un nœud Lightning sur Raspberry Pi 1

|

Cette procédure a été réalisée sur un Raspberry Pi 1 Modele B+ tournant sous Raspian stretch lite.

Ce Raspberry est doté d’un CPU mono-cœur cadencé à 700 MHz, et de 512 Mo de RAM.

Il s’agit plus ici de s’amuser que d’obtenir un nœud Lightning fonctionnel ; nous sommes aux limites de ce que peut supporter un machine aussi modeste.

La blockchain a été au préalable téléchargée depuis une autre machine, puis mise à disposition du Raspberry via un partage NFS.

Prérequis

Augmentation de la swap à 1 Go via /etc/dphys-swapfile :

CONF_SWAPSIZE=1000

Prise en compte du changement :

sudo /etc/init.d/dphys-swapfile restart

Allocation de mémoire GPU au minimum via /boot/config.txt :

gpu_mem=16

Installation de Go et git :

sudo apt-get install git
wget https://storage.googleapis.com/golang/go1.8.linux-armv6l.tar.gz
sudo tar -C /usr/local -xzf go1.8.linux-armv6l.tar.gz

Mise à jour du PATH :

echo 'export PATH=$PATH:/usr/local/go/bin' >> $HOME/.profile
export PATH=$PATH:/usr/local/go/bin
echo 'export GOPATH=~/gocode' >> $HOME/.profile
export GOPATH=~/gocode
echo 'export PATH=$PATH:$GOPATH/bin' >> $HOME/.profile
export PATH=$PATH:$GOPATH/bin

Installation de Glide :

go get -u github.com/Masterminds/glide

Installation de lnd

git clone https://github.com/lightningnetwork/lnd $GOPATH/src/github.com/lightningnetwork/lnd
cd $GOPATH/src/github.com/lightningnetwork/lnd
glide install
go install . ./cmd/...

Ca va prendre un bon bout de temps…

Installation de btcd

git clone https://github.com/roasbeef/btcd $GOPATH/src/github.com/roasbeef/btcd
cd $GOPATH/src/github.com/roasbeef/btcd
glide install
go install . ./cmd/...

Là aussi, il faudra être patient…

Démarrage de btcd

btcd --testnet --txindex --rpcuser=mon_login --rpcpass=mon_password

Le démarrage va être très long. Dans mon cas, cela a pris trois heures :

2018-01-03 01:54:46.270 [INF] CHAN: Loading block index.  This might take a while...
2018-01-03 05:01:28.493 [WRN] CHAN: Unknown new rules activated (bit 1)

Création d’un fichier ~/.lnd/lnd.conf

Cela simplifiera le lancement le lnd :

[Application Options]
debuglevel=info
debughtlc=true
maxpendingchannels=10
externalip=<mon_ip_externe>
peerport=9735

[Bitcoin]
bitcoin.active=1
bitcoin.rpcuser=mon_login
bitcoin.rpcpass=mon_password

On doit d’assurer que le port 9735 est bien accessible depuis internet (redirection de port à mettre en place si nécessaire).

Lancement de lnd

lnd --bitcoin.active --bitcoin.testnet

Il lui faudra un petit bout de temps pour réussir à se caler avec btcd.

Création d’un wallet Bitcoin

lncli create
Input wallet password:
Confirm wallet password:

On doit choisir un mot de passe.

Durant mes multiples essais, j’ai obtenu à plusieurs reprises une erreur out of memory à ce moment précis. L’augmentation de la swap (détaillée en début d’article) a corrigé le problème. Avec un Pi doté d’un Go de RAM, il n’y a sans doute pas de problème.

Si on relance lnd par la suite, il faudra déverrouiller le wallet via :

lncli unlock

Génération d’une adresse Bitcoin

lncli newaddress np2wkh

Bien noter cette adresse car elle ne sera pas affichée ultérieurement.

Alimenter l’adresse en tBTC (testnet bitcoins)

Via ce faucet par exemple : https://testnet.manu.backend.hamburg/faucet

Connexion à un autre nœud

On peut trouver des adresses de nœuds sur https://explorer.acinq.co

lncli connect 03f113414ebdc6c1fb0f33c99cd5a1d09dd79e7fdf2468cf1fe1af6674361695d2@51.15.213.104:9735

BTCD + LND sur Pi1

Introduction à tmux

|

Tmux est un multiplexeur de terminaux ; il permet d’afficher plusieurs terminaux virtuels dans un seul terminal. Tmux peut par ailleurs être détaché d’une session pour fonctionner en arrière-plan (à la manière de screen).

Quelques commandes à connaître

Commande Action
tmux lancer tmux
CTRL-b d se détacher de tmux
tmux -a se rattacher un tmux détaché
CTRL-b “ diviser un terminal horizontalement
CTRL-b % diviser un terminal verticalement
CTRL-b flèche changer de fenêtre (dans la direction indiquée)
CTRL-b c créér un nouvel onglet
CTRL-b p aller à l’onglet précédent (previous)
CTRL-b n aller à l’onglet suivant (next)
CTRL-b ‘ aller à un onglet en fonction de son numéro
CTRL-b , nommer un onglet
CTRL-b x fermer une fenêtre
CTRL-b z Zoom sur le terminal actif (et en sortir)
CTRL-b espace changer la disposition des fenêtres (essayer plusieurs fois de suite)
CTRL-b page-haut remonter dans l’historique de la fenêtre
CTRL-b page-bas descendre dans l’historique de la fenêtre
CTRL-b ! déplacer le terminal actif dans un nouvel onglet
Echap sortir du défilement de l’historique

Astuce perso

Je rajoute dans mon fichier ~/.tmux.conf la configuration suivante :

unbind s
bind s set -g synchronize-panes

Ainsi, il me suffit de taper CTRL-b s pour activer la saisie simultanée dans toutes les fenêtres affichées.

On peut ensuite la désactiver en retapant CTRL-b s

Démo en vidéo

(vidéo réalisée par Candyapplebone)

Bitcoin / Lightning - Installation du client lnd web

|

Procédure d’installation sous Ubuntu 16.04.3 LTS.

Le client lncli-web a été développé par Francois Mably

Installation de node et npm

sudo apt-get install npm
curl -sL https://deb.nodesource.com/setup_8.x | sudo -E bash -
sudo apt-get install nodejs

Clonage du repository

git clone https://github.com/mably/lncli-web
cd lncli-web

Installation des dépendances

npm install

Configuration par défaut

"./node_modules/.bin/gulp" bundle

Certificats lnd

Génération de certificats lnd compatibles avec NodeJS gRPC

pushd
cd ~/.lnd
openssl ecparam -genkey -name prime256v1 -out tls.key
openssl req -new -sha256 -key tls.key -out csr.csr -subj '/CN=localhost/O=lnd'
openssl req -x509 -sha256 -days 3650 -key tls.key -in csr.csr -out tls.cert
rm csr.csr
popd

Copie du certificat :

cp ~/.lnd/tls.cert lnd.cert

Serveur lnd

Si ce n’est pas déjà fait, lnd doit être démarré avec l’option --no-macaroons

lnd --bitcoin.active --bitcoin.testnet --no-macaroons

Démarrage du serveur

node server

L’interface web devrait être visible à l’adresse http://localhost:8280

GitHub / Un blog Jekyll en 5mn chrono

|

Fork de Jekyll-now

Forker le repository GitHub suivant, sous le nom “votrenom.github.io” : https://github.com/barryclark/jekyll-now

Le site est presque immédiatement visible sur https://votrenom.github.io

On peut rajouter des posts en créant des fichiers au format Markdown dans le dossier _posts (s’inspirer de la syntaxe du fichier existant).

Développement local

Pour pouvoir développer le site web en local, on doit cloner le repository précédemment créé, puis installer quelques packages :

sudo apt-get install ruby ruby-dev
sudo gem install bundler

A la racine du repository local, on crée un fichier Gemfile contenant :

source 'https://rubygems.org'
gem 'github-pages', group: :jekyll_plugins
bundle install

Enfin, on lance Jekyll en mode --watch :

bundle exec jekyll serve --watch

Le site est visible à l’adresse http://127.0.0.1:4000/ et se met automatiquement à jour à chaque modification (pas besoin de relancer Jekyll).

GitHub / Authentification par clé SSH

|

Copier la clé publique sur la page SSH Keys de GitHub.

On peut ensuite tester la connexion via :

ssh -T git@github.com

Le serveur doit répondre :

Hi <username>! You've successfully authenticated, but GitHub does not provide shell access.

Dans le répertoire d’un dépôt local, il suffit de configurer :

git remote set-url origin git@github.com:username/depot.git

Les prochains git push utiliseront l’authentification par clé SSH.

Bitcoin / Installation d'un nœud Lightning sur testnet - Partie 2

|

Création d’un fichier ~/.lnd/lnd.conf

Cela simplifiera le lancement le lnd :

[Application Options]
debuglevel=info
debughtlc=true
maxpendingchannels=10
externalip=<mon_ip_externe>
peerport=9735

[Bitcoin]
bitcoin.active=1
bitcoin.rpcuser=mon_login
bitcoin.rpcpass=mon_password

On doit d’assurer que le port 9735 est bien accessible depuis internet (redirection de port à mettre en place si nécessaire).

Lancement de lnd

lnd --bitcoin.active --bitcoin.testnet

Création d’un wallet Bitcoin

lncli create

On doit choisir un mot de passe. Si on relance lnd par la suite, il faudra déverrouiller le wallet via :

lncli unlock

Génération d’une adresse Bitcoin

lncli newaddress np2wkh

Bien noter cette adresse car elle ne sera pas affichée ultérieurement.

Alimenter l’adresse en tBTC (testnet bitcoins)

Via ce faucet par exemple : https://testnet.manu.backend.hamburg/faucet

Connexion à un autre nœud

On peut trouver des adresses de nœuds sur https://explorer.acinq.co

lncli connect 03f113414ebdc6c1fb0f33c99cd5a1d09dd79e7fdf2468cf1fe1af6674361695d2@51.15.213.104:9735

Mémoriser des identifiants Git

|

Mise en cache des identifiants de connexion a GitHub (par exemple) dans le cas d’une connexion via un couple identifiant / mot de passe (et non par clé SSH)

git config --global credential.helper cache

Par défaut, le mot de passe est mis en cache pendant 15 minutes. Pour augmenter ce délai à une heure :

git config --global credential.helper 'cache --timeout=3600'

Créer une partition exFAT sous Linux

|

Le système de fichier exFAT a l’avantage de fonctionner correctement sur tous les OS, sans trop de bricolage. Sous Linux, il sera notamment bien moins gourmand en CPU que NTFS, et il acceptera aussi parfaitement les fichier de plus de 4 Go.

Installer les outils exfat

sudo apt-get install exfat-fuse

Créer la partition avec fdisk, et choisir le type de partition 11 (Microsoft basic data)

fdisk /dev/sdN

Formater la partition et lui attribuer une étiquette (label), ici “NomDuDisque” :

mkfs.exfat -n NomDuDisque /dev/sdNX

Bitcoin / Installation d'un nœud Lightning sur testnet - Partie 1

|

Cette procédure a été effectuée sur un Linux Ubuntu Server 16.04.3 LTS. Prévoir assez d’espace disque pour héberger un full node Bitcoin testnet (le 27/12/2017, la blockchain prenait 15,3 Go). Il s’agit globalement d’une traduction très épurée de cette documentation.

Prérequis

Installation de Go et git :

sudo apt-get install golang-1.9 git

Mise à jour du PATH (potentiellement à rajouter dans ~/.bashrc):

echo 'export GOPATH=~/gocode' >> $HOME/.profile
export GOPATH=~/gocode
echo 'export PATH=$PATH:$GOPATH/bin:/usr/lib/go-1.9/bin' >> $HOME/.profile
export PATH=$PATH:$GOPATH/bin:/usr/lib/go-1.9/bin

Installation de Glide :

go get -u github.com/Masterminds/glide

Installation de lnd

git clone https://github.com/lightningnetwork/lnd $GOPATH/src/github.com/lightningnetwork/lnd
cd $GOPATH/src/github.com/lightningnetwork/lnd
glide install
go install . ./cmd/...

Par la suite, il sera possible de mettre à jour lnd via :

cd $GOPATH/src/github.com/lightningnetwork/lnd
git pull && glide install
go install . ./cmd/...

Installation de btcd

git clone https://github.com/roasbeef/btcd $GOPATH/src/github.com/roasbeef/btcd
cd $GOPATH/src/github.com/roasbeef/btcd
glide install
go install . ./cmd/...

Démarrage de btcd

btcd --testnet --txindex --rpcuser=mon_login --rpcpass=mon_password

La synchronisation de la blockchain va débuter. Ce processus peut prendre plusieurs heures.

On peut obtenir le numéro du dernier block synchronisé via :

btcctl --testnet --rpcuser=mon_login --rpcpass=mon_password getinfo | grep blocks

La suite : Bitcoin / Installation d’un noeud Lightning sur testnet - Partie 2