La blockchain de Bitcoin, version hardcode

Ce n'est pas que ce soit très réjouissant quand on connaît la vanité de la spéculation et le désastre écologique qu'il entraîne, mais il faut bien s'intéresser à Bitcoin, ne serait-ce que pour comprendre en quoi consiste concrètement le concept de blockchain dont on nous rebat les oreilles matins et soirs.
Les structures de la blockchain de Bitcoin
Tout le problème pour le développeur, c'est de savoir par quel bout le prendre. C'est que si l'on parle ici de Bitcoin, et non du Bitcoin, c'est bien parce qu'une particularité de la chose, c'est d'être un système avant d'être une cryptomonnaie, que l'on pressent un peu du genre un peu l'oeuf qui fait la poule qui fait l'oeuf, qui plus est. Dès lors, quel est le bon point d'entrée dans ce dernier ?
On trouve pléthore de présentation de Bitcoin sur le Web comme en librairie. Le problème, c'est que leur lecture laisse assez inévitablement le développeur sur le sentiment qu'il n'est pas allé au fond des choses. En fait, pour bien comprendre de quoi il en retourne, l'animal sent bien qu'il faudrait qu'il plonge sa truffe dans les entrailles, manière de dire qu'il faudrait tout simplement prendre un bloc sous sa forme la plus brute, et le disséquer pour comprendre comment il a été produit et inscrit dans la blockchain.
Telle est la démarche adoptée ici. Il s'agit de programmer en Python de quoi désérialiser un bloc existant et valider une transaction qu'il contient. Dans un premier temps, le bloc choisi est le premier bloc, dit "Genesis", car le bon sens impose de partir de celui-là pour comprendre en quoi un bloc consiste. Dans un second temps, le bloc choisi est le 170, car c'est le premier qui contient une transaction véritable - au sens d'un transfert de BTC -, si bien que le bon sens impose de le choisir pour valider une transaction.
Il n'est donc pas question de couvrir le minage, et donc la résolution élégante du problème des généraux byzantins à laquelle est parvenue Satoshi Nakamoto qui constitue la principale innovation de Bitcoin. Encore une fois, l'objectif de cet article reste bien modeste : ce n'est pas de faire comprendre le système Bitcoin, mais de faire comprendre la blockchain de Bitcoin, de la manière la plus efficiente possible pour un développeur.
Continuer la lecture de "La blockchain de Bitcoin, version hardcode"
La blockchain de Bitcoin, version hardcode

Chaîner les promesses en JavaScript

Comme cela a été expliqué dans cet article, l'intérêt des promesses en JavaScript, c'est de permettre au développeur de pratiquer l'asycnhronisme sans tomber dans le "callback hell".
Pour autant, cela suppose de bien comprendre le fonctionnement de ce mécanisme alternatif, tout particulièrement cet aspect essentiel qu'est l'enchaînement, ou le chaînage, de promesses.
Pratique du chaînage de promesses en JavaScript
En cette matière, un examen trop superficiel du mécanisme peut conduire à s'en faire une idée fausse, et de là mal pratiquer le chaînage de promesses via .then () et .catch ().
Pour vous permettre d'honorer vos promesses, voici quelques éclaircissements pratiques...
Continuer la lecture de "Chaîner les promesses en JavaScript"
Chaîner les promesses en JavaScript

Déboguer les promesses en JavaScript

Le développeur adepte du débogueur de Firefox qui s'initie à la programmation asynchrone à l'aide de promesses de JavaScript peut assez rapidement en venir à s'arracher les cheveux.
En effet, le débogueur lui semblera parfois ne pas afficher des exceptions de syntaxe. Dur de localiser une erreur dans l'écriture du code et de la corriger dans ces conditions...
Déboguer les promesses en JavaScript
Cela tient à la manière assez particulière dont ce type d'exception est géré par le débogueur. Fort heureusement, il existe une solution technique... pour autant que l'on veille bien à la mettre en oeuvre !
Continuer la lecture de "Déboguer les promesses en JavaScript"
Déboguer les promesses en JavaScript

Executer une file de tâches asynchrones en JavaScript

Depuis l'introduction des promesses puis du sugar coating qui permet d'en faciliter l'usage, tout développeur JavaScript se doit de maîtriser l'art de la programmation asynchrone. Ce sera tout particulièrement le cas s'il souhaite s'investir dans Node.js, où toute fonction devrait en théorie pouvoir être exécutée de manière asynchrone.
Cela implique de repenser la manière de programmer les choses les plus simples. Par exemple, purger à l'infini une file (FIFO) de tâches asynchrones. Dans le monde asynchrone, il est inconcevable d'écrire une boucle où serait logé le programme principal, au seul prétexte de pouvoir régulièrement consulter l'état de la file et exécuter une tâche, s'il en reste, quand l'exécution de la précédente, s'il y en avait, s'est achevée. En un mot, il est hors de question de faire du polling.
Interface pour exécuter une file de tâches asynchrones
Comment faire ? C'est très simple, et cela constitue un excellent exemple pour s'initier à la programmation asynchrone en JavaScript. Explications dans ce qui suit.
Continuer la lecture de "Executer une file de tâches asynchrones en JavaScript"
Executer une file de tâches asynchrones en JavaScript

Des wrappers de shaders et de programme pour WebGL

Dans un article précédent, il a été question d'un moyen pour faciliter la conception de shaders lors de l'écriture d'applications WebGL en JavaScript.
A l'occasion de la reprise d'un projet fondé sur ces technologies, il est apparu possible de simplifier plus encore non seulement la conception, mais aussi l'utilisation, et ce non seulement des shaders, mais aussi des programmes de WebGL.
Exemple de rendu avec des wrappers de shaders et d'un programme pour WebGL
Comme les helpers, la solution proposée ici s'appuie sur WebGL 2, en mettant notamment à profit ce nouvel objet : le Vertex Array Object, ou VAO pour les intimes.
D'ailleurs, ce sera l'occasion de préciser la manière dont cet objet fonctionne exactement, tant il est vrai que les explications fournies par Khronos peuvent être un peu difficiles à suivre...
Continuer la lecture de "Des wrappers de shaders et de programme pour WebGL"
Des wrappers de shaders et de programme pour WebGL

Un monde en voxels avec ray picking avec WebGL

Avant de me lancer éventuellement dans une nouvelle session de challenges sur Root Me, j'ai opté pour une approche moins humiliante du développement en reprenant quelques projets restés en rade. Entre autres, un projet de jeu d'aventure en vectoriel dans une page Web, à base de JavaScript et de WebGL.
A cette occasion, un petit malin m'a soufflé l'idée qu'il serait amusant de pouvoir passer d'une représentation en vectoriel, donc en 2D, à une représentation en 3D, plus spécifiquement en vue isométrique, sur le modèle de l'impressionnant Voxatron. S'il n'était pas question de prétendre produire une telle merveille, du moins était-il effectivement intéressant de s'y essayer.
Comment donc produire un monde à base de voxels à l'aide de JavaScript et de WebGL, quelque chose qui ressemble grosso modo à cela ? :
Un monde en voxels en JavaScript avec WebGL
Explication du service minimum à assurer pour y parvenir, en mobilisant toutefois du code déjà longuement présenté dans différents articles sur ce blog.
Continuer la lecture de "Un monde en voxels avec ray picking avec WebGL"
Un monde en voxels avec ray picking avec WebGL

Ray casting avec WebGL

Pas d'application en 3D interactive sans ray casting ! Cette technique permet de calculer les coordonnées du point d'une surface 3D dont un pixel est la représentation de la projection. Le ray casting sert de base au ray picking, qui permet de déterminer quelle est la surface 3D en question parmi toutes celles de tous les objets 3D de la scène 3D projetée.
Ray casting avec WebGL
Le ray casting constitue une étape importante dans la progression de la connaissance du développeur qui se lance dans la 3D. En effet, l'implémenter correctement suppose d'avoir les idées claires sur le pipeline de transformation.
Explications à l'appui d'un exemple dans ce qui suit.
Continuer la lecture de "Ray casting avec WebGL"
Ray casting avec WebGL

Projection et projection inverse avec WebGL

La multiplication des coordonnées (Xe,Ye,Ze,1.0) d'un point par la matrice de projection de WebGL produit des coordonnées de clipping (Xc,Yc,Zc,Wc).
Comment en déduire les coordonnées du pixel (Xs,Ys) dans le canvas ? A l'inverse, comment retrouver les coordonnées du point à partir des coordonnées du pixel ?
Continuer la lecture de "Projection et projection inverse avec WebGL"
Projection et projection inverse avec WebGL

Réinstaller et nettoyer Windows 10 pour plus de confidentialité

Windows 10 est un système d'exploitation bien agréable, mais encombré d'un tas de fonctionnalités activées par défaut qui sont proprement insupportables : Cortana, paramètres de confidentialité autorisant la communication de données à Microsoft, affichage variable selon le type du dossier, Edge ne démarrant pas en mode InPrivate, applications Microsoft inutiles ("Cartes", "Xbox Game Bar", etc.), connexion à un compte Microsoft, exécution automatique des périphériques, etc.
Par ailleurs, le système est généralement plus encombré encore quand il a été installé par un constructeur, car ce dernier ne manque jamais d'installer des outils tiers parfaitement inutiles dans l'espoir que le gogo ne voudra pas s'en passer : un antivirus, des jeux, etc.
A l'occasion d'une réinstallation de Windows 10 sur mon portable, j'ai dressé la liste des modifications à apporter pour faire le ménage. Certes, il existe des outils pour cela, comme Privatezilla ou Windows10Debloater, non seulement plus complet mais aussi plus ergonomique, mais s'agissant de modifications sensibles, j'ai pris le temps de prendre la main.
Mise à jour du 08/07/2021 : désactiver le redémarrage automatique après mise à jour
Mise à jour du 20/04/2021 : désactiver les notifications
Mise à jour du 18/04/2021 : désactiver les expériences partagées, désinstaller le protocoles de réseaux Microsoft, désactiver la découverte de réseaux
Continuer la lecture de "Réinstaller et nettoyer Windows 10 pour plus de confidentialité"
Réinstaller et nettoyer Windows 10 pour plus de confidentialité

U.S. Cyber Command Valentine’s Day 2021 Crypto Challenge (Puzzle 2)

Pour la Saint Valentin 2021, l'U.S. Cyber Command propose dans un tweet de résoudre une douzaine de puzzles de cryptographie. Cliquez ici pour les récupérer. Une excellente initiative qui suscitera peut-être des vocations...
Pourquoi ne pas s'y essayer ? Nous verrons bien où cela nous mène... Je publierai sur ce site les solutions auxquelles je serai parvenu, sous la forme des notes prises chemin faisant, rendant donc compte d'éventuels errements, ce qui sera plus vivant.
Aujourd'hui, la solution du puzzle 2.
Continuer la lecture de "U.S. Cyber Command Valentine’s Day 2021 Crypto Challenge (Puzzle 2)"
U.S. Cyber Command Valentine’s Day 2021 Crypto Challenge (Puzzle 2)