tag:linuxfr.org,2005:/users/small_duckLinuxFr.org : les contenus de small_duck2024-02-27T16:44:50+01:00/favicon.pngtag:linuxfr.org,2005:Diary/410312024-01-15T00:23:35+01:002024-01-15T00:23:35+01:00Emacs, le dinosaure fait de la résistanceLicence CC By‑SA http://creativecommons.org/licenses/by-sa/4.0/deed.fr<p>Aujourd'hui, un journal qui encense grave (une fois n'est pas coutume).</p>
<p>Je suis épaté qu'après toutes ces années, Emacs reste pertinent et apparemment tout aussi productif que moults IDE. Et encore, je m'y suis mis sérieusement sur le tard, durant mon 3ème boulot (j'étais un Visual Studio boy depuis mes 15 ans…). Voici donc les raisons qui à mon sens font d'Emacs un outil remarquable encore aujourd'hui.</p>
<ul>
<li><p>Légèreté : même si considéré comme une usine à gaz à ses débuts (Eight Megs And Constantly Swapping), Emacs est maintenant d'une légèreté de gazelle par rapport aux IDE modernes. Je suis toujours surpris en regardant coder mes voisins de bureau à quel point ouvrir un fichier, ou même taper un peu de texte, semble mettre en branle toute une série de mécanismes complexes qui rendent l'utilisation aussi lourde qu'un pachyderme neurasthénique. Avec un IDE, on se traîne, alors qu'Emacs démarre à toute blinde, et taper ou effectuer des opérations sur du texte est toujours rapide</p></li>
<li><p>Mode texte : Grace à son mode texte, il est installé partout sur nos serveurs, et je peux aller bidouiller une config sans avoir à connaitre un autre éditeur de texte. Certes, je n'ai pas alors ma configuration perso, mais c'est déjà très bien d'avoir toutes les commandes standard dans les doigts (et si j'ai vraiment besoin, je peux toujours utiliser Tramps, voir plus bas)</p></li>
<li><p>Un système de greffons qui marche : J'avoue, je me méfie généralement des greffons dans les applications que j'utilise. C'est souvent synonyme de perte de performances, de mauvaise intégration, voire de crashs. Avec Emacs, et sans faire des folies, je trouve que les greffons s'intègrent de manière très stable, et je subodore que c'est grâce à l’interpréteur Lisp qui les empêche de faire trop de bêtises. Et en plus, les greffons se combinent et se complètent très bien. Par exemple…</p></li>
<li><p>Le greffon Tramps : Lui, c'est mon chouchou. Tramps permet non seulement d'ouvrir un fichier à distance, mais permet de chaîner les méthodes d'accès, par exemple d'effectuer de manière transparente un SSH suivi d'un docker exec pour éditer un fichier dans un pod sur un serveur distant. Je peux donc faire tourner Emacs en local sur ma machine du bureau, et éditer n'importe quoi n'importe où. Mais ce n'est que le hors d’œuvre, puisque Tramps permet également d'utiliser le mode Dired à distance (gestionnaire de fichiers), la compilation, et le debuggeur. Voulant me remettre à OCaml récemment et me souvenant du mode Tuareg qui permet de faire tourner un interpréteur dans une fenêtre Emacs, j'ai été épaté de voir que Tramps me permettait d'ouvrir l'interpréteur dans un Docker sur une autre machine, comme si j'avais tout en local. C'est juste magique. Et dernièrement, j'ai découvert les bookmarks de fichiers, qui me permettent d'aller chercher un chemin (parfois complexe quand c'est un chemin Tramps) à travers un simple nom que j'ai défini. "C-x r b moncode" et Emacs va faire un SSH, un Docker exec, et m'afficher le contenu du répertoire de ma base de code.</p></li>
<li><p>Les fenêtres et les buffers : j'ai besoin de voir 2 fichiers côte à côte, en quelques raccourcis claviers, c'est fait. J'en veux un 3ème en dessous, puis je veux refermer le premier, c'est tout aussi facile. C'est vraiment agréable de tuiler son environnement de manière aussi aisée, et je me retrouve à adapter en permanence ma vue à ce que j'essaie de faire.</p></li>
<li><p>Les raccourcis clavier : Alors oui, les C-quelquechose et M-quelquechose, c'est particulier, mais une fois qu'on a pris l'habitude, c'est extrêmement plaisant. Le chercher/remplacer, l'édition par rectangles, on apprend doucement ce dont on a besoin et qui rentre vite dans les doigts. Et l'on ajoute très facilement ses propres raccourcis (par exemple, j'ai F5 pour compiler, F7/F8 pour aller a l'erreur de compile précédente / suivante, et F9 pour passer du fichier source au fichier d'en-tête et vice versa).</p></li>
<li>
<p>Un fichier de config compréhensible : c'est mon autre hantise, la personnalisation soit via clicodrôme et donc difficile à exporter, soit dans d'immenses fichiers de config rapidement incompréhensibles. Je dois avoir une quinzaine de sections dans mon .emacs, souvent de simples lignes, plus rarement de petits scripts, et c'est tout ce dont j'ai besoin pour adapter Emacs aux petits oignons. La plupart des fonctionnalités existent déjà et il suffit de les activer. C'est donc très lisible, facile à copier d'une machine à une autre, facile à partager avec les copains qui peuvent extraire la section de configuration qui leur plait. Pour vous donner une idée de mes personnalisations:</p>
<ul>
<li>Suppression du whitespace à la sauvegarde</li>
<li>Ajustements du mode C++ pour faire coller l'indentation au standard de mon équipe</li>
<li>Raccourcis claviers pour la compilation, pour passer à l'erreur précédente ou suivante, pour passer du fichier source au fichier d'en tête ou inversement</li>
<li>Ajustement des couleurs et de la fonte</li>
<li>Un peu de magie au niveau des buffers de copie afin d'avoir le copier/coller, le yank, et le clic du bouton du milieu de la souris qui utilisent tous le même buffer (probablement la partie la plus moche de ma config)</li>
<li>Affichage du numéro de ligne</li>
<li>Un script qui m'écrit un en-tête de fichier standard pour les sources du boulot (titre et auteur doxygen, #pragma once et tout le toutim)</li>
</ul>
</li>
</ul>
<p>Mais qui aime bien châtie bien, et ce ne serait pas juste de ne pas évoquer la fonctionnalité que les IDEs, à mon sens, font mieux: les sauts dans le code. C'est maintenant standard partout de pouvoir faire un clic droit sur une fonction, une variable, une inclusion, et pouvoir sauter directement à la définition, la déclaration, ou encore à tous les appelants. Là, Emacs fait sentir son manque d'intégration avec le langage, et j'utilise donc un mélange de "grep -r", de "find -name", et de navigateur ouvert sur le Doxygen pour retrouver mes billes. Je m'en accommode, mais je serais curieux si quelqu'un a une solution légère et qui s'intègre avec Tramp. Ayant regardé rapidos, il m'a semblé que de nombreux greffons Emacs tentaient de résoudre ce problème, mais l'utilisation me paraissait pour le coup lourde et complexe, souvent à base de service qui tourne en tâche de fond pour maintenir une liste de tous les tags, de manière souvent complètement syntactique plutôt que sémantique.</p>
<p>Mais ce n'est pas suffisant pour me faire regretter mon éditeur de texte favori, et que j'espère continuer à utiliser durant de longues années.</p>
<p>C-x C-c et à bientôt!</p>
<div><a href="https://linuxfr.org/users/small_duck/journaux/emacs-le-dinosaure-fait-de-la-resistance.epub">Télécharger ce contenu au format EPUB</a></div> <p>
<strong>Commentaires :</strong>
<a href="//linuxfr.org/nodes/134499/comments.atom">voir le flux Atom</a>
<a href="https://linuxfr.org/users/small_duck/journaux/emacs-le-dinosaure-fait-de-la-resistance#comments">ouvrir dans le navigateur</a>
</p>
small_duckhttps://linuxfr.org/nodes/134499/comments.atomtag:linuxfr.org,2005:Diary/409392023-11-12T17:20:49+01:002023-11-12T17:20:49+01:00Le sophisme du meilleur outilLicence CC By‑SA http://creativecommons.org/licenses/by-sa/4.0/deed.fr<p>Aujourd'hui, un journal qui dénonce grave (ça faisait longtemps, tiens).</p>
<p>Je tiens à m'élever, que dis-je, à m'insurger, contre ces ayatollahs qui se drapent dans leurs chevaux et montent sur leurs grands principes pour forcer sur nous autres tout un tas de technos à la mode, peut-être de bonne foi, ou peut-être afin d’étoffer leur CV quand sera venu pour eux le temps de déployer leurs ailes pour semer le chaos dans d’autres équipes avec le sentiment du devoir accompli, et nous laissent avec moult scories fumantes impossibles à extirper, parce qu’elles sont, objectivement et sans aucun contexte, le meilleur outil (oui, je me suis mis à Proust récemment, ça se voit tant que ça ?).</p>
<p>Parce que oui, avoir un script en Perl tout seul dans son coin et qui sort de nulle part pour extraire un rapport depuis logs de tests unitaires (parce que Perl, c'est le meilleur outil pour bidouiller du texte, voyons !), décider d'utiliser <a href="https://en.wikipedia.org/wiki/Kdb%2B">KDB</a> (vade retro !) parce que tu vois, faut faire des requêtes hyper rapides, y'a au moins 10 000 lignes, SQL il sait pas faire, hein, ou encore coller du Java (parce qu'on veut gérer des flux de données, et les flux c'est Flink), du Python (parce que c’est le meilleur outil pour faire des services web), du C++ (parce que la bibliothèque tierce à intégrer est en C++), du C# (parce que de la GUI), du SQL et du noSQL et leurs divers cadriciels afférents dans un bête petit service maintenu par une équipe de 3 personnes, c’est peut-être (je dis bien peut-être) bon pour la productivité immédiate, mais à moyen ou à long terme, c’est la bataille permanente pour modifier un simple truc.</p>
<p>Tenez, encore un exemple : nous avions besoin de construire une petite interface Windows pour un service en C++ tournant sous Unix (accès et modification de données), usage interne, rien de méchant. Ah mais attention, le meilleur outil pour faire des interfaces sous Windows, c’est C#. Alors bonjour, voici un dev C# qui va faire le boulot, faites lui une petite API en managed C++, on galère un peu mais on finit par y arriver. Et puis, mauvais résultats financiers, dégraissage, le type est viré, et on reste avec une GUI que personne ne sait maintenir, et qu’on voit pourrir sous nos yeux au fur et à mesure que l’on change le service. Il en a fallu, des efforts, pour convaincre le management d'utiliser Wt, un cadriciel Web en C++ inspiré de QT, et qui nous a permis de tout intégrer. Alors oui, faut un peu se battre avec, c’est pas hyper joli, et c’est pas hyper mode, mais ça fait le boulot, et les devs C++ backend, comme on dit, arrivent à être autonomes et à garder l'interface alignée. Si je démarrais de zéro, je n’utiliserais certes pas Wt pour faire un site web, mais étant donné la taille et les connaissances de l’équipe, le timing, les priorités, et les contraintes matérielles, c'était une bonne solution, et ça a marché si bien qu'on a oublié à quel point c'était pénible avant.</p>
<p>Il y a un curseur entre cohérence et fonctionnalités, et j'ai tendance à le diriger fermement vers la cohérence. Tant pis s'il me faut écrire un peu plus de code, tant pis si je passe un peu plus de temps à intégrer une nouvelle fonctionnalité : si elle s'intègre de manière cohérente au projet, en utilisant le même langage, les mêmes conventions, les mêmes dépendances, alors elle s'intègrera au CI, aux tests unitaires, au format de logs, elle pourra être maintenue par l'équipe.</p>
<p>Voilà, c'est tout pour moi, je retourne remplacer les 1 liners en python dans des scripts bash par des des 1 liners en bash.</p>
<div><a href="https://linuxfr.org/users/small_duck/journaux/le-sophisme-du-meilleur-outil.epub">Télécharger ce contenu au format EPUB</a></div> <p>
<strong>Commentaires :</strong>
<a href="//linuxfr.org/nodes/133892/comments.atom">voir le flux Atom</a>
<a href="https://linuxfr.org/users/small_duck/journaux/le-sophisme-du-meilleur-outil#comments">ouvrir dans le navigateur</a>
</p>
small_duckhttps://linuxfr.org/nodes/133892/comments.atomtag:linuxfr.org,2005:News/412942022-12-05T19:41:26+01:002022-12-05T19:41:26+01:00VulkanSceneGraph - Un graphe de scène en C++Licence CC By‑SA http://creativecommons.org/licenses/by-sa/4.0/deed.fr<div><p>Ayant parlé <a href="//linuxfr.org/news/le-rendu-3d-retrospective">rendu 3D</a> et <a href="//linuxfr.org/news/les-graphes-de-scene">graphes de scène</a>, nous pouvons nous attaquer à la troisième et dernière partie de cette série et évoquer enfin cette première sortie stable de VulkanSceneGraph.</p>
<p>VulkanSceneGraph (VSG) est donc une bibliothèque fournissant un graphe de scène basé sur Vulkan, écrite par Robert Osfield, qui est aussi le créateur d'OpenSceneGraph (OSG), l'ancêtre de VSG. Avec VSG, c'est une bibliothquèque plus moderne et plus modulaire qui nait. Parmi les <a href="http://www.openscenegraph.com/index.php/gallery/use-cases">utilisateurs d'OSG</a>, on peut citer le simulateur de vol libre <a href="https://www.flightgear.org/">Flightgear</a>, mais également beaucoup de simulations et de rendu de villes et de terrains, ce qui se ressent à l'usage avec des fonctionnalités très complètes de chargement à la volée de textures et de données d'élévation.</p>
</div><ul></ul><div><h2 id="toc-le-coeur-de-la-bibliothèque-vsg">Le coeur de la bibliothèque VSG</h2>
<p>La bibliothèque <a href="https://github.com/vsg-dev/VulkanSceneGraph">VSG</a> en elle-même se concentre sur une collection de nœuds de base (transformations, objets 3D, texte) et sur le moteur de rendu basé sur Vulkan, s'occupant de l'initialisation et du modèle de threading.</p>
<p>C'est déjà un gros morceau : l'initialisation de Vulkan est une usine à gaz, et les exemples les plus simples de programmes peuvent faire des milliers de lignes de code. VSG nous débarrasse de tout ça, et l'on peut afficher un modèle complexe en quelques dizaines de lignes.</p>
<h2 id="toc-vsgxchange---top-modèles">vsgXchange - Top modèles</h2>
<p>La bibliothèque <a href="https://github.com/vsg-dev/vsgXchange">vsgXchange</a> permet l'import de primitives VSG depuis un grand nombre de formats: images, fontes, mais surtout modèles en 3D, via la bibliothèque tierce <a href="https://github.com/assimp/assimp">Assimp</a>.</p>
<p>Grace à cette bibliothèque, ce sont tout un tas de formats qui deviennent tout à coup des nœuds VSG ou encore des textures. Fondamental dès que l'on veut interagir avec un modeleur 3D.</p>
<p>Le bon vieil OSG possédait déjà une solide bibliothèque pour importer diverses ressources, nommée osgDB, munie d'un système de plugins, ce qui donnait des convertisseurs de qualité parfois excellente et parfois médiocre. Avec l'utilisation d'Assimp, on espère que VSG rendra moins aléatoire le support de nombreux formats.</p>
<h2 id="toc-vsgexamples---pour-apprendre">vsgExamples - Pour apprendre</h2>
<p>Enfin, le dépôt <a href="https://github.com/vsg-dev/vsgExamples">vsgExamples</a> propose tout un tas de programmes de base pour afficher un modèle, faire du raytracing, explorer les possibilités de threading, afficher plusieurs vues…</p>
<p>Un exemple parlant : <a href="https://github.com/vsg-dev/vsgExamples/blob/master/examples/app/vsgviewer/vsgviewer.cpp">vsgViewer</a> affichant le modèle <a href="https://github.com/vsg-dev/vsgExamples/blob/master/data/models/openstreetmap.vsgt">openstreetmap.vsgt</a> va, en 375 lignes de code et moins de 30 lignes d'objet, nous afficher une sphère représentant le globe terrestre sur lequel sont plaquées les tuiles d'OpenStreetMap, et va en temps réel au fur et à mesure que l'on zoome charger depuis Internet les tuiles de plus en plus détaillées.</p>
<p><img src="//img.linuxfr.org/img/68747470733a2f2f746563686e6f747572746c652e6e65742f696d616765732f7673675f6f736d2e706e67/vsg_osm.png" alt="L'Australie sur un globe OpenStreetMap" title="Source : https://technoturtle.net/images/vsg_osm.png"></p>
<p>Un autre exemple parlant : prendre une simple capture d'écran, c'est 644 lignes de code avec <a href="https://github.com/vsg-dev/vsgExamples/blob/master/examples/app/vsgscreenshot/vsgscreenshot.cpp">vsgscreenshot</a>, parce qu'il faut gérer un mécanisme complexe de sémaphores et de barrières pour capturer les tampons au bon moment.</p>
<h2 id="toc-enfin-un-workflow-qui-fonctionne">Enfin un workflow qui fonctionne ?</h2>
<p>Une grande frustration dans l'utilisation d'OSG est l'absence d'un workflow complet, en particulier pour la création de jeux, depuis le modeleur 3D jusqu'au rendu. Pendant longtemps, il n'y a pas vraiment eu de format qui soit à la fois complet, bien supporté par les modeleurs 3D tels Blender et bien supportés par OSG. L'on retombait souvent sur le bon vieux <a href="https://fr.wikipedia.org/wiki/Objet_3D_(format_de_fichier)">Wavefront</a> (.obj), lequel était tout de même très limité (pas de multi textures, pas d'animations, obligation de créer ses propres shaders…). Avec VSG et Assimp, c'est le format GLTF qui devient disponible, et c'est un changement fondamental. GLTF, c'est un format particulièrement adapté au rendu réaliste (PBR), et il est possible de créer aisément un objet GLTF muni de sa texture diffuse, normale, métallique, rugosité, qui pourra être chargé directement dans OSG sans avoir à écrire une seule ligne de shader (écrire un shader PBR, c'est un peu sport).</p>
<p><img src="//img.linuxfr.org/img/68747470733a2f2f746563686e6f747572746c652e6e65742f696d616765732f676c74662e706e67/gltf.png" alt="Un casque PBR" title="Source : https://technoturtle.net/images/gltf.png"></p>
<p>Alors les animations GLTF ne sont malheureusement pas encore supportées, ce qui est bien dommage, car le format est très complet, et fournit animation par clés et animation par squelette. Mais les développeurs y travaillent, et on peut espérer que VSG permette bientôt de facilement importer des objets PBR complexes et d'activer leurs animations.</p>
</div><div><a href="https://linuxfr.org/news/vulkanscenegraph-un-graphe-de-scene-en-c.epub">Télécharger ce contenu au format EPUB</a></div> <p>
<strong>Commentaires :</strong>
<a href="//linuxfr.org/nodes/129509/comments.atom">voir le flux Atom</a>
<a href="https://linuxfr.org/news/vulkanscenegraph-un-graphe-de-scene-en-c#comments">ouvrir dans le navigateur</a>
</p>
small_duckJulien Jorgehttps://linuxfr.org/nodes/129509/comments.atomtag:linuxfr.org,2005:News/412772022-11-24T22:13:25+01:002022-11-24T22:13:25+01:00Les graphes de scèneLicence CC By‑SA http://creativecommons.org/licenses/by-sa/4.0/deed.fr<div><p>Deuxième partie de mon triptyque qui prend pour prétexte la sortie du graphe de scène VulkanSceneGraph pour parler un peu 3D. Dans le volet précédent, nous avons évoqué les bonds technologiques qui ont permis le rendu 3D raster, tel que nous le connaissons aujourd'hui, basé sur OpenGL et Vulkan. Aujourd'hui, parlons de <a href="https://fr.wikipedia.org/wiki/Graphe_de_sc%C3%A8ne">graphes de scènes</a>.</p>
<p>Considérant qu'une scène, c'est la définition graphique d'un monde à représenter à l'écran, un graphe de scène, c'est une structure qui hiérarchise les différents éléments de la scène au sein d'un graphe, car cette représentation est particulièrement pertinente.</p>
</div><ul></ul><div><h2 class="sommaire">Sommaire</h2>
<ul class="toc">
<li><a href="#toc-hi%C3%A9rarchiser-la-g%C3%A9om%C3%A9trie">Hiérarchiser la géométrie</a></li>
<li><a href="#toc-%C3%89limination-des-g%C3%A9om%C3%A9tries-non-visibles">Élimination des géométries non visibles</a></li>
<li><a href="#toc-optimisation-du-rendu">Optimisation du rendu</a></li>
<li><a href="#toc-et-bien-dautres">Et bien d'autres</a></li>
<li><a href="#toc-utilisation-avanc%C3%A9e-des-graphes-de-sc%C3%A8nes">Utilisation avancée des graphes de scènes</a></li>
</ul>
<p>En pratique, il existe de nombreuses manières de construire un graphe de scène, qui seront adaptées à l'utilisation que l'on en fait. Le graphe de scène sous-jacent à <a href="https://fr.wikipedia.org/wiki/Blender">Blender</a> n'a par exemple rien à voir avec celui du dernier Call of Duty.</p>
<p>Un graphe de scène commence souvent par un nœud racine, sur lequel sont attachés une hiérarchie de nœuds pouvant représenter des transformations dans l'espace (translations, rotations…), des changements d'état (couleurs, shader courant…), de la géométrie (formes géométriques simples, amas de triangles) et autres types de nœuds plus exotiques, nous y reviendrons.</p>
<p>Rendre la scène à l'écran, c'est donc <a href="https://fr.wikipedia.org/wiki/Parcours_de_graphe">traverser le graphe</a> en profondeur, et appliquer à chaque visite de nœud la transformation à effectuer.</p>
<p><img src="//img.linuxfr.org/img/68747470733a2f2f746563686e6f747572746c652e6e65742f696d616765732f677261706865312e706e67/graphe1.png" alt="Graphe de scene" title="Source : https://technoturtle.net/images/graphe1.png"></p>
<p>Par exemple, en visitant ce graphe, l'on va indiquer à l'API 3D d'effectuer les actions suivantes:</p>
<ul>
<li>Appliquer la matrice m1</li>
<li>Mettre l'attribut couleur à rouge</li>
<li>Afficher une sphère</li>
<li>Enlever l'attribut couleur</li>
<li>Appliquer la matrice m2</li>
<li>Mettre l'attribut couleur à vert</li>
<li>Afficher un cube</li>
<li>Enlever l'attribut couleur</li>
<li>Enlever la transformation m2</li>
<li>Enlever la transformation m1</li>
<li>Afficher un tore</li>
</ul>
<p>Voyons maintenant plus en détail les avantages liés à l'utilisation du graphe de scènes</p>
<h2 id="toc-hiérarchiser-la-géométrie">Hiérarchiser la géométrie</h2>
<p>En structurant sa scène avec des nœuds de transformation auxquels sont ajoutés les géométries, il est bien plus aisé de gérer des transformations complexes d'objets liés les uns aux autres. Prenons par exemple un bras robotique: la position de la main dépend de la position du coude, qui elle même dépend de la position de l'épaule. Plutôt que d'appliquer une transformation complexe à la main qui prendrait en compte tous les paramètres du coude et de l'épaule, il est bien plus simple d'avoir une série de matrices de transformations d'un objet relatif à son parent: le coude est rattaché à l'épaule, et la main au coude. En contrôlant la rotation au niveau de l'épaule, les transformations vont s'appliquer en combinant chaque matrice et la main va suivre le mouvement.</p>
<h2 id="toc-Élimination-des-géométries-non-visibles">Élimination des géométries non visibles</h2>
<p>Vous connaissez peut-être l'aphorisme qui dit que le code le plus rapide est celui que l'on exécute pas. De la même manière, la géométrie la plus rapide est celle que l'on affiche pas, et il est donc très utile de déterminer très tôt quels sont les objets que l'on aura pas besoin d'afficher à l'écran. Les graphes de scène sont particulièrement utiles pour cela.</p>
<p>L'approche générale est, pour chaque nœud, de déterminer <a href="https://fr.wikipedia.org/wiki/Volume_englobant">un volume simple qui l'engloble</a> ainsi que tous ses enfants. On peut utiliser des sphères ou des boites alignés sur les axes, et on les calcule à l'avance. On visite ensuite le graphe : pour chaque nœud enfant de la racine, on calcule l'intersection du volume englobant du nœud avec le <a href="https://en.wikipedia.org/wiki/Viewing_frustum">frustum</a>, la pyramide tronquée représentant ce que la caméra peut voir. Si le volume englobant est complètement à l'extérieur, le nœud (et par extension tous ses enfants) peut être éliminé. Si le volume englobant est complètement à l'intérieur du frustum, le nœud et tous ses enfants doivent être affichés. S'il est à cheval sur le frustum, alors on visite chaque enfant et on applique récursivement la même opération.</p>
<h2 id="toc-optimisation-du-rendu">Optimisation du rendu</h2>
<p>L'optimisation du rendu d'une scène peut certainement faire l'objet d'un livre entier, mais notons cependant qu'à chaque rendu, il est important de réduire au maximum le nombre d'appels vers la carte graphique. Ainsi, il est plus efficace de charger à l'avance les géométries dans les tampons de la carte graphique, et il est plus efficace de changer le moins possible les états comme la position des lumières, le shader courant, et ainsi de suite.</p>
<p>On peut donc analyser le graphe afin de le transformer pour combiner les nœuds qui peuvent l'être. Par exemple, plutôt que de sélectionner le shader approprié pour chaque géométrie, l'on peut grouper les géométries utilisant le même shader, et ne le sélectionner qu'une fois.</p>
<p><img src="//img.linuxfr.org/img/68747470733a2f2f746563686e6f747572746c652e6e65742f696d616765732f677261706865322e706e67/graphe2.png" alt="Combinaison des nœuds shaders" title="Source : https://technoturtle.net/images/graphe2.png"></p>
<p>De même, si l'on permet au graphe d'être un graphe acyclique plutôt qu'un arbre, l'on peut atteindre le même nœud à travers des chemins différents, et donc représenter le même objet avec des transformations différentes (pensez à une forêt qui contient de nombreuses fois le même arbre) permettant par exemple d'économiser de la place dans les tampons de géométrie, voire de permettre certaines formes de cache.</p>
<p><img src="//img.linuxfr.org/img/68747470733a2f2f746563686e6f747572746c652e6e65742f696d616765732f677261706865332e706e67/graphe3.png" alt="Combinaison des nœuds de geometrie" title="Source : https://technoturtle.net/images/graphe3.png"></p>
<h2 id="toc-et-bien-dautres">Et bien d'autres</h2>
<p>Mentionnons encore quelques opérations où un graphe de scène est bien utile.</p>
<ul>
<li><p>Gestion des niveaux de détail : un nœud <a href="https://fr.wikipedia.org/wiki/Level_of_detail">LOD</a> peut avoir une série d'enfants correspondant au même objet plus ou moins détaillé, et afficher l'objet approprié selon la distance à la caméra : inutile d'utiliser des milliers de polygones pour afficher un objet qui fait 2 pixels sur l'horizon !</p></li>
<li><p>Le picking : à partir d'un point à l'écran, on peut appliquer les transformations inverses et trouver la liste d'objets situés sous le point, ce qui permet à l'utilisateur de sélectionner un objet</p></li>
</ul>
<h2 id="toc-utilisation-avancée-des-graphes-de-scènes">Utilisation avancée des graphes de scènes</h2>
<p>Une scène d'un moteur graphique moderne est extraordinairement complexe et nécessite de nombreuses passes : souvent, le moteur va rendre une partie de la scène dans une texture en ayant appliqué des calques ou des shaders, et utiliser ensuite cette texture dans le rendu final, par exemple pour gérer les ombres ou encore les réflexions (pensez à un objet qui se reflète dans de l'eau, par exemple). Le rendu final lui-même est parfois rendu dans une texture avant d'être affiché à l'écran afin d'appliquer des shaders sur l'ensemble de l'écran, par exemple pour émuler une vue à travers des lunettes de vision nocturne, ou encore un affichage flou si le personnage est ivre. Par l'utilisation judicieuse de nœuds spécialisés, comme de nœuds caméra par exemple, ou carrément de nœuds d'effets qui gèrent les ombres automatiquement, il est possible de fournir au développeur une série d'outils de haut niveau, optimisés, et prêts à l'emploi. C'est exactement le but suivi par <a href="http://www.openscenegraph.com/">OpenSceneGraph</a>, et c'est là dessus que nous finirons cette série.</p>
</div><div><a href="https://linuxfr.org/news/les-graphes-de-scene.epub">Télécharger ce contenu au format EPUB</a></div> <p>
<strong>Commentaires :</strong>
<a href="//linuxfr.org/nodes/129389/comments.atom">voir le flux Atom</a>
<a href="https://linuxfr.org/news/les-graphes-de-scene#comments">ouvrir dans le navigateur</a>
</p>
small_duckJulien Jorgehttps://linuxfr.org/nodes/129389/comments.atomtag:linuxfr.org,2005:News/412712022-11-21T15:36:28+01:002022-11-22T08:11:25+01:00Le rendu 3D, rétrospectiveLicence CC By‑SA http://creativecommons.org/licenses/by-sa/4.0/deed.fr<div><p>Le 13 novembre 2022 est sorti Vulkan Scene Graph 1.0.0 (VSG). C'est la première version stable de cette bibliothèque en C++ qui fournit un graphe de scène basé sur l'API graphique Vulkan. Son concepteur, Robert Osfield, avait créé et maintenu OpenSceneGraph (OSG), basé sur OpenGL. Vulkan étant devenu la référence, il était temps de mettre à jour OSG en utilisant les toutes dernières fonctionnalités du C++. Comme c'est un sujet touffu, je vous propose dans cette première dépêche de revenir sur l'histoire des graphismes 3D. Dans une deuxième dépêche, nous verrons ce qu'est un graphe de scènes, et dans une troisième, nous nous pencherons plus spécifiquement sur OpenSceneGraph et VulkanSceneGraph.</p>
</div><ul><li>lien nᵒ 1 : <a title="http://www.openscenegraph.com/" hreflang="en" href="https://linuxfr.org/redirect/111327">Le site d'OpenSceneGraph</a></li></ul><div><h2 class="sommaire">Sommaire</h2>
<ul class="toc">
<li>
<a href="#toc-la-3d-dans-mon-pc">La 3D dans mon PC</a><ul>
<li><a href="#toc-rendu-fil-de-fer">Rendu fil de fer</a></li>
<li><a href="#toc-fausse-3d">Fausse 3D</a></li>
<li><a href="#toc-approches-interm%C3%A9diaires">Approches intermédiaires</a></li>
</ul>
</li>
<li>
<a href="#toc-enfin-le-raster">Enfin, le raster</a><ul>
<li><a href="#toc-les-premi%C3%A8res-cartes-graphiques">Les premières cartes graphiques</a></li>
<li><a href="#toc-les-c%C5%93urs-programmables">Les cœurs programmables</a></li>
<li><a href="#toc-fin-du-pipeline-fixe-et-pbr">Fin du pipeline fixe, et PBR</a></li>
<li><a href="#toc-et-vulkan-dans-tout-%C3%A7a">Et Vulkan, dans tout ça ?</a></li>
</ul>
</li>
</ul>
<h2 id="toc-la-3d-dans-mon-pc">La 3D dans mon PC</h2>
<p>Aux temps anciens et légendaires de l'informatique, très tôt on a voulu tenter de représenter des environnements en 3D, et de nombreuses techniques ont été crées pour cela. L'on peut évoquer les <a href="https://fr.wikipedia.org/wiki/Ray_tracing">raytracers</a>, qui tentent de s'approcher de la réalité physique du rendu en simulant un grand nombre de rayons lumineux et leur trajet dans une scène en 3D avant de frapper l’œil de l'observateur, mais cette technologie a longtemps été beaucoup trop lente pour représenter des environnements en temps réel.</p>
<h3 id="toc-rendu-fil-de-fer">Rendu fil de fer</h3>
<p><a href="https://fr.wikipedia.org/wiki/Battlezone">BattleZone</a>, jeu arcade de 1980, a popularisé la technique du rendu en fil de fer. Le monde est composé de polygones en 3D, et chaque polygone est transformé puis projeté afin de déterminer où l'afficher sur un écran en 2D. L'affichage fil de fer, qui nécessite juste de tracer une ligne entre les sommets, est diablement efficace, ce qui permettait de le faire tourner sur le matériel de l'époque. Ce fut une révolution, avec une immersion qui était inconnue jusque là.</p>
<p><img src="//img.linuxfr.org/img/68747470733a2f2f746563686e6f747572746c652e6e65742f696d616765732f626174746c6574616e6b2e706e67/battletank.png" alt="BattleZone" title="Source : https://technoturtle.net/images/battletank.png"></p>
<h3 id="toc-fausse-3d">Fausse 3D</h3>
<p>De manière diamétralement opposée, certains jeux proposent de la fausse 3D. Par exemple, <a href="https://fr.wikipedia.org/wiki/Dungeon_Master">Dungeon Master</a>, en restreignant les déplacements à du case par case, se contente d'ajuster des éléments en 2D comme un puzzle pour émuler un univers de couloirs et de créatures, avec un rendu extrêmement réaliste pour l'époque.</p>
<p><img src="//img.linuxfr.org/img/68747470733a2f2f746563686e6f747572746c652e6e65742f696d616765732f64756e67656f6e5f6d61737465722e6a7067/dungeon_master.jpg" alt="Dungeon Master" title="Source : https://technoturtle.net/images/dungeon_master.jpg"></p>
<h3 id="toc-approches-intermédiaires">Approches intermédiaires</h3>
<p>D'autres jeux choisissent une approche intermédiaire. Les rendus en 3D précalculée ont longtemps été populaires. Par exemple, les graphistes d'un jeu de combat dans l'espace créent un vaisseau ennemi dans un modeleur 3D et font toute une série de rendus en raytracing pour créer une galerie d'images du vaisseau, les sprites, vu depuis un certain nombre d'angles. Lorsque le jeu tourne, il utilise transformations et projections afin de déterminer où se situe le vaisseau ennemi sur l'écran du joueur, et affiche le sprite le plus proche de l'angle de vue réel. Suivant le même principe, <a href="https://fr.wikipedia.org/wiki/Doom_(jeu_vid%C3%A9o,_1993)">Doom</a> affiche un monde en 3D, mais les créatures sont des sprites.</p>
<p><img src="//img.linuxfr.org/img/68747470733a2f2f746563686e6f747572746c652e6e65742f696d616765732f646f6f6d2e6a7067/doom.jpg" alt="Doom" title="Source : https://technoturtle.net/images/doom.jpg"></p>
<h2 id="toc-enfin-le-raster">Enfin, le raster</h2>
<p>C'est probablement avec <a href="https://fr.wikipedia.org/wiki/Quake">Quake</a> que le monde entre enfin complètement dans le monde du raster. Dans Quake, le monde ainsi que les créatures du jeu sont complètement en 3D, et il est possible de regarder dans toutes les directions, dont le haut et le bas. Une révolution à l'époque ! Le <a href="https://fr.wikipedia.org/wiki/Rast%C3%A9risation">raster</a> a gagné.</p>
<p><img src="//img.linuxfr.org/img/68747470733a2f2f746563686e6f747572746c652e6e65742f696d616765732f7175616b652e6a7067/quake.jpg" alt="Quake" title="Source : https://technoturtle.net/images/quake.jpg"></p>
<p>L'idée derrière le raster est la suivante : le monde est défini comme une liste de triangles. Les coordonnées des sommets de chaque triangle sont transformés via une série de matrices, qui projettent ces sommets sur notre écran. Ensuite, chaque pixel appartenant au triangle va être rendu via un système d'interpolation. Par exemple, je peux interpoler un vecteur normal qui m'indiquera à quel point mon pixel fait face à la source de lumière. Je combine cette information de luminosité avec une coordonnée de texture interpolée, voire de transparence. Enfin, j'affiche le pixel, avec une information supplémentaire de profondeur (l'axe Z), qui me permet de ne pas remplacer un pixel qui se trouverait devant par exemple.</p>
<h3 id="toc-les-premières-cartes-graphiques">Les premières cartes graphiques</h3>
<p>C'est super, mais au fur et à mesure que les concepteurs ont trouvé de nouvelles techniques pour un rendu de plus en plus beau, la quantité de calculs a explosé. Mais ça tombe bien ! Ces calculs sont plutôt répétitifs : il s'agit généralement de faire tourner la même petite routine pour chaque pixel. Et une technologie fait ça très bien: le <a href="https://fr.wikipedia.org/wiki/Single_instruction_multiple_data">SIMD</a>. Les fabricants de matériel ont donc commencé à proposer au grand public des cartes graphiques qui implémentaient de façon matériel ce pipeline graphique, avec de nombreux cœurs de calcul qui travaillaient en parallèle. Plusieurs API tentent de mettre de l'ordre dans ce bazar, en fournissant des primitives de calcul et un accès au matériel, en particulier <a href="https://fr.wikipedia.org/wiki/OpenGL">OpenGL</a> et <a href="https://fr.wikipedia.org/wiki/Direct3D">Direct3D</a>.</p>
<h3 id="toc-les-cœurs-programmables">Les cœurs programmables</h3>
<p>La technologique évoluant, les développeurs ont commencé à vouloir faire des choses de plus en plus folles, et en particulier pouvoir programmer certaines parties du pipeline. Le concept de shader était né. L'idée est de permettre d'injecter des programmes dans chaque petit cœur de calcul. D'un côté, les vertex shaders permettent de contrôler la transformation de chaque sommet. De l'autre, les fragment shaders permettent de contrôler l'affichage de chaque fragment (pixel) de polygone, permettant donc de finement contrôler la lumière et l'assemblage de textures.</p>
<h3 id="toc-fin-du-pipeline-fixe-et-pbr">Fin du pipeline fixe, et PBR</h3>
<p>Finalement, plus personne n'a voulu du pipeline fixe : de nos jours, il est nécessaire de programmer via les shaders.</p>
<p>La nouvelle technologie à la mode, permise par la puissance monstrueuse des cartes graphiques d'aujourd'hui, est le PBR (physics based rendering), autrement dit le rendu basé sur la physique. L'on définit pour chaque objet une série de textures, représentant sa couleur de base, ses normales (permettant de reproduire des surfaces rugeuses ou en creux, ou encore avec des inscriptions gravées), sa rugosité (qui va rendre l'objet plus ou moins brillant ou mat) et une information dite de métal qui indique de quelle couleur doivent être les reflets. Mélangés dans un shader approprié, cela donne un rendu exceptionnel qui s'intègre dans n'importe quel environnement 3D. Là où le graphiste auparavant devait créer plusieurs objets (une poubelle dans la nuit, une poubelle un jour de pluie, une poubelle en plein soleil), il n'en a besoin que d'un seul muni de ses textures PBR. Voyez par exemple ce <a href="https://www.artstation.com/artwork/R3NbRW">colt</a> et ses textures.</p>
<p><img src="//img.linuxfr.org/img/68747470733a2f2f746563686e6f747572746c652e6e65742f696d616765732f67756e2e6a7067/gun.jpg" alt="Colt1" title="Source : https://technoturtle.net/images/gun.jpg"><br>
<img src="//img.linuxfr.org/img/68747470733a2f2f746563686e6f747572746c652e6e65742f696d616765732f67756e5f7062722e6a7067/gun_pbr.jpg" alt="Colt2" title="Source : https://technoturtle.net/images/gun_pbr.jpg"></p>
<h3 id="toc-et-vulkan-dans-tout-ça">Et Vulkan, dans tout ça ?</h3>
<p>L'API OpenGL avait fonctionné de manière exceptionnelle pendant des dizaines d'années, et avait réussi à évoluer, mais elle commençait vraiment à atteindre ses limites. dans un monde où le pipeline fixe n'existe plus, où tout repose sur des shaders, où les ordinateurs sont massivement multi-cœurs, ce n'était juste plus possible. L'API <a href="https://fr.wikipedia.org/wiki/Vulkan_(API)">Vulkan</a> propose des primitives plus modernes, plus bas niveau.</p>
<p>Un exemple : dans OpenGL, c'est l'API qui décide quand envoyer une texture vers la mémoire de la carte graphique et peut l'en retirer si la place manque. À l'affichage d'une trame, si la texture n'est pas chargée, il faudra la chercher dans la mémoire principale, ce qui peut provoquer des saccades dans l'affichage.</p>
<p>Vulkan étant devenu la nouvelle référence, OpenSceneGraph se devait de réagir et de fournir une nouvelle bibliothèque plus appropriée.</p>
</div><div><a href="https://linuxfr.org/news/le-rendu-3d-retrospective.epub">Télécharger ce contenu au format EPUB</a></div> <p>
<strong>Commentaires :</strong>
<a href="//linuxfr.org/nodes/129357/comments.atom">voir le flux Atom</a>
<a href="https://linuxfr.org/news/le-rendu-3d-retrospective#comments">ouvrir dans le navigateur</a>
</p>
small_duckBenoît SibaudJulien Jorgehttps://linuxfr.org/nodes/129357/comments.atomtag:linuxfr.org,2005:Diary/404462022-11-05T20:43:34+01:002022-11-05T20:43:34+01:00Douze facteurs dans ta troncheLicence CC By‑SA http://creativecommons.org/licenses/by-sa/4.0/deed.fr<p>Aujourd'hui, encore un journal qui dénonce grave.</p>
<p>Je voudrais m'insurger contre un nouveau genre de <a href="https://fr.wikipedia.org/wiki/Culte_du_cargo">culte du cargo</a>, le <a href="https://12factor.net/">Twelve Factor App</a>. Ce sont des principes d'architecture logicielle qui seraient adaptés à l'écriture de micro-services et qui promettent performance, qualité, et retour de l'être aimé.</p>
<p>Figurez-vous que j'ai au turbin quelques collègues qui ne jurent que par les 12 facteurs, et qui, en exégètes, font passer ces principes au dessus de tout, à toutes les sauces, et surtout sans réfléchir. Il ont l'impression qu'il leur suffit de déclamer que ce n'est pas 12 factors, et ils s'attendent à ce que je m'agenouille et demande pardon pour mes péchés et que j'aille immédiatement modifier le code scélérat.</p>
<p>Alors, je dis pas, j'aime bien les aphorismes à l'emporte pièce, et je suis le premier à lancer un <a href="https://fr.wikipedia.org/wiki/Principe_KISS">KISS</a> ou un <a href="https://fr.wikipedia.org/wiki/YAGNI">YAGNI</a> voire un petit <a href="https://fr.wikipedia.org/wiki/Ne_vous_r%C3%A9p%C3%A9tez_pas">DRY</a> des familles. Mais, moins que des principes, ce sont des idées, des philosophies, qui nous guident sans nous contraindre. Ces idées sont justifiées et confirmées par l'expérience, mais l'expérience nous apprend aussi quand les laisser de côté.</p>
<p>Avec les 12 facteurs, ce qui m'interpelle tout d'abord, c'est généralement l'absence de justifications: ces principes sont énoncés, un poil développés, et c'est tout, demerden sie sich, comme on dit outre-Rhin. Alors, certains, c'est difficile de pas être d'accord, le <a href="https://12factor.net/dependencies">principe 2</a> sur les dépendances qui doivent être explicites, par exemple, ça se tient.</p>
<p>Mais le 1, qui dit qu'il faut une base de code par application ? Non mais il fume quoi?</p>
<p>Et le 11, qui dit que les logs doivent être des événements ?</p>
<p>Bah laissez moi vous raconter, alors.</p>
<p>Il y a de cela 6 mois, mon collègue revoit mon code de logs, et ça lui plait pas : j'avais mis en place la possibilité de logger vers la sortie standard, vers un fichier, ou vers les deux. "Nan mais tu comprends, c'est pas 12 factors, ça va pas, faut enlever les logs vers les fichiers". Nonobstant le principe pourtant bien établi que qui peut le plus peut le moins, il me court sur le haricot et refuse de fusionner jusqu'à ce qu'on coupe la poire en deux : on garde le code de log vers les fichiers, mais on ne l'expose pas via l'application.</p>
<p>Le temps passe. Mon collègue intègre l'application comme un service systemd. Mais tous les logs dans journalctl, c'est pas très pratique, alors plutôt que de démarrer le service directement, systemd démarre un script bash qui démarre l’application en redirigeant la sortie standard vers un fichier.</p>
<p>Plusieurs semaines après, alors que je me plains que les fichiers générés par l'application ne sont pas finalisés correctement, il se rend compte que systemd envie un sigterm vers le script bash mais pas ses enfants, et le process ne reçoit pas le sigterm au bon moment. Parmi les différentes manières de corriger le problème, il se décide en maugréant à ressusciter le log vers les fichiers, permettant à SystemD de démarrer directement l’application. Et bien sûr, dans le message de commit, il s'est excusé de violer les 12 facteurs (mais mec, je m'en tamponne, de tes 12 facteurs !), et a expliqué que ce n'était que partie remise (puisque tout ça va se déplacer vers Kubernetes).</p>
<p>Alors, on va s'intéresser à un autre principe bien connu, hein ?</p>
<p>"Une taille unique ne convient pas à tous"</p>
<div><a href="https://linuxfr.org/users/small_duck/journaux/douze-facteurs-dans-ta-tronche.epub">Télécharger ce contenu au format EPUB</a></div> <p>
<strong>Commentaires :</strong>
<a href="//linuxfr.org/nodes/129208/comments.atom">voir le flux Atom</a>
<a href="https://linuxfr.org/users/small_duck/journaux/douze-facteurs-dans-ta-tronche#comments">ouvrir dans le navigateur</a>
</p>
small_duckhttps://linuxfr.org/nodes/129208/comments.atomtag:linuxfr.org,2005:Diary/404222022-10-16T18:41:18+02:002022-10-16T18:41:18+02:00Cartes, marqueurs et automatisationLicence CC By‑SA http://creativecommons.org/licenses/by-sa/4.0/deed.fr<p>Coucou à tous !</p>
<p>Petite matinée hack ce matin (et hack du matin, chagrin), que je partage : c'est du rapide et du sale, mais j'ai découvert plusieurs outils intéressants, donc je pose ça là si ça peut inspirer quelqu'un. Je ne met pas de code parce que c'est hyper spécifique (en fait non, j'ai juste honte), mais ça ne devrait poser aucun problème à recréer avec mes explications.</p>
<p>L'école de Mademoiselle Fille organise une distribution de douceurs aux personnes âgées du quartier : la classe sera divisée en 10 groupes, et chaque groupe, accompagné d'un adulte, ira sonner aux portes et offrir une boite à chaussures décorée et contenant chocolats, thé et autres.</p>
<p>Mon rôle, c'est, à partir du listing des-dites 50 personnes âgées identifiées par la mairie / paroisse / assoce locale, de créer 10 cartes avec 5 marqueurs, plus les noms, adresses, et notes additionnelles (ceux chez qui il faut frapper fort et longtemps, ceux à qui il faut se signaler à la fenêtre…).</p>
<p>Les années précédentes, ça a été fait manuellement, avec dans le meilleur des cas un fond de carte Google et des notes rajoutées au stylo. Mais je n'allais pas laisser passer l'occasion d'automatiser un peu la chose et d'utiliser du libre.</p>
<p>J'ai pas mal cherché et j'ai fini par trouver une combinaison qui marche bien. Accrochez vos ceintures.</p>
<p>Étape 1: les coordonnées pour chaque adresse<br>
- Je charge les noms et adresses dans une base Postgres<br>
- J'écris un petit script Bash qui tire chaque adresse de la base de données, va me chercher les coordonnés via un appel à <a href="https://nominatim.openstreetmap.org">nominatim</a>, que j'extrais avec jq, pour le réinjecter dans la base</p>
<p>Étape 2: Faire les groupes<br>
- Re-petit script bash qui tire chaque coordonnée, cette fois ci, et génère un bout de Javascript qui créé un marqueur au format <a href="https://leafletjs.com/">Leaflet</a>, que je réinjecte dans une page HTML locale pour les afficher sur le fond de carte du quartier<br>
- Je ne me sentais pas de sortir les algos de sous-graphes et du voyageur de commerce, donc j'ai imprimé la carte, et avec mes petits doigts fébriles j'ai fait des cercles pour grouper <a href="https://www.la-rache.com/">à la rache</a>, réinjecté mes groupes dans la base</p>
<p>Étape 3: Faire les cartes<br>
- Je créé un template HTML où il ne manque que les marqueurs et la liste des adresses<br>
- Je créé un script bash qui, pour chaque groupe, me génère les blocs HTML et JS correspondant aux adresses et aux marqueurs du groupe, un petit envsubst plus tard et j'ai 10 pages HTML<br>
- J'affiche chaque page HTML dans mon panda roux, je recadre, j'imprime vers un PDF<br>
- Et enfin, un peu de pdftk pour combiner le tout. Prêt à imprimer et à distribuer !</p>
<p>Alors ça reste assez manuel. Je connais très mal le Javascript, mais j'imagine que c'était clairement la solution pour complètement automatiser la chose, avec du JS qui tape directement dans la base, fait sa requête à nominatim, et affiche les 10 sections à imprimer ensuite.</p>
<p>J'espère qu'on ne perdra personne !</p>
<div><a href="https://linuxfr.org/users/small_duck/journaux/cartes-marqueurs-et-automatisation.epub">Télécharger ce contenu au format EPUB</a></div> <p>
<strong>Commentaires :</strong>
<a href="//linuxfr.org/nodes/129038/comments.atom">voir le flux Atom</a>
<a href="https://linuxfr.org/users/small_duck/journaux/cartes-marqueurs-et-automatisation#comments">ouvrir dans le navigateur</a>
</p>
small_duckhttps://linuxfr.org/nodes/129038/comments.atomtag:linuxfr.org,2005:Diary/403542022-08-21T13:12:14+02:002022-08-21T13:12:14+02:00La cochonnerie en boite que sont les systèmes de dépendancesLicence CC By‑SA http://creativecommons.org/licenses/by-sa/4.0/deed.fr<p>Aujourd'hui, un autre journal qui dénonce grave.</p>
<p>Il est de bon ton de nos jours pour chaque langage de programmation qui se respecte de débarquer avec un système intégré de dépendances (ou plusieurs, mais nous y reviendrons) permettant plus ou moins automatiquement de télécharger des paquets logiciels. Souvent, il est possible de faire tourner un dépôt de paquets en interne, où l'on pourra d'une part cacher ses dépendances externes, et d'autre part envoyer ses propres paquets. L'on nommera Maven pour Java, Npm pour Javascript, Cpan pour Perl, Cargo pour Rust, Opam pour Ocaml, et même Conan pour C++ (je vais me laver la bouche au savon et je reviens). Et Pip et Conda pour Python.</p>
<p>J'essaie d'aimer le Python. J'essaie vraiment fort. C'est juste Python qui ne m'aime pas. Et en particulier la daube infecte qu'est Conda, Miniconda, Mamba et tous leurs amis.</p>
<p>Déjà, le concept d'environnement. Alors ça semble vachement malin sur le papier, pouvoir dire "aujourd'hui, je mets ma casquette de data scientist, je veux Panda, Keras, et Numpy, bim, je charge l'environnement kivabien, demain je mettrai ma casquette de webdev, et je voudrai Flask et Selenium". Sauf qu'en pratique, c'est vite le bordel, dans quel environnement je suis, comment j'en change, qu'est-ce qu'il y a dedans, comment je le mets à jour. Au point que Conda décide sans rien me demander d'aller bidouiller mon prompt pour y ajouter le nom de l'environnement courant. Non mais de quoi je me mêle ? Ça va vite être un mélasse sans nom si chaque technologique que j'utilise décide d'aller se torcher dans mon .bashrc !</p>
<p>Ensuite, histoire que ça marche chez tout le monde, mon équipe a mis en place des environnement partagés, c'est à dire que quand je récupère la dernière version de notre code source, régulièrement y'a des scripts qui pètent, et il faut simplement aller faire tourner une bordée de scripts moches qui vont aligner l'environnement sur ma machine. Quand ça marche.</p>
<p>Finalement, bien sûr, ce tas de bouse se retrouve à partir en Prod. Et comme une certaine catégorie de développeurs a décidé que la modernité, c'était d'aller chercher des petites briques partout et de les combiner de manière plus ou moins heureuse parce que ça ressemble furieusement à une compétition de qui aura le plus de dépendances, on se retrouve avec des petits scripts tout simples qui ne peuvent s'empêcher d'aller appeler un obscur paquet Python pour faire quelque chose qui tenait en une ligne de bash. Et qui débarquent avec toutes leur dépendances à la noix. Bon, et puis, ces paquets, ils sont sûrs ? Ils ont des bugs ? Est-ce que la mise à jour risque de causer des problèmes ? On s'en tamponne, #YOLO !</p>
<p>Pouf pouf.</p>
<p>Ne prenons pas les enfants du bon dieu pour des canards sauvages. Les gens qui ont développé ces trucs savaient ce qu'ils faisaient, du moins je l'espère : il s'agit à mon sens d'une approche très monoposte (et monolangage) du développement, justement d'une manière très data scientist, comme on dit. Je bidouille un truc dans mon notebook Jupyter, tiens, je ferais bien tel traitement, une ligne de commande et hop, j'ai téléchargé la chose, je teste, ça marche, super, ça marche pas, je teste autre chose. Mais le raisonnement ne tient plus lorsqu'il s'agit d'utiliser le Python comme langage de script secondaire, en équipe, et de déployer des services un poil stables en production.</p>
<p>Je ne connais pas la solution parfaite. Les paquets système (RPM, deb) sont stables, testés, et mis à jour de manière intelligente, mais parfois on a besoin d'une version plus récente. Faire ses propres paquets systèmes et les charger dans un Docker ou un Puppet semble bien, mais c'est un investissement en temps (et en larmes). Les systèmes de paquets liés à un langage en particulier sont vite invivables, moches et instables et pètent quand ils veulent.</p>
<p>Donc, allez vous faire voir, Mabma, Conda, et tous vos amis. Et non, chef, je refuse catégoriquement d'intégrer Conan à notre base de code C++ juste parce que "les systèmes de dépendances, c'est le futur", parce que là ça juste marche, alors pas touche.</p>
<p>Alors, s'il vous plaît, dites moi comment vous faites pour échapper à l'enfer des dépendances.</p>
<div><a href="https://linuxfr.org/users/small_duck/journaux/la-cochonnerie-en-boite-que-sont-les-systemes-de-dependances.epub">Télécharger ce contenu au format EPUB</a></div> <p>
<strong>Commentaires :</strong>
<a href="//linuxfr.org/nodes/128548/comments.atom">voir le flux Atom</a>
<a href="https://linuxfr.org/users/small_duck/journaux/la-cochonnerie-en-boite-que-sont-les-systemes-de-dependances#comments">ouvrir dans le navigateur</a>
</p>
small_duckhttps://linuxfr.org/nodes/128548/comments.atomtag:linuxfr.org,2005:Diary/403432022-08-06T11:37:46+02:002022-08-06T11:37:46+02:00De l'influence néfaste de Google sur les développeurs C++Licence CC By‑SA http://creativecommons.org/licenses/by-sa/4.0/deed.fr<p>Aujourd'hui, journal qui dénonce grave.</p>
<p>Je voudrais m'élever, non, m'insurger contre cette fascination morbide d'un certain nombre de professionnels pour la firme de Larry Page et Sergey Brin. Une sorte de biais cognitif qui consiste à penser que "Google est prospère, Google fait ça, alors si je fais ça moi aussi je serai prospère". Et Google, qui adore faire la leçon au reste du monde, comme pour s'auto-convaincre que leur réussite ne doit qu'à l'intelligence et la méthode, et surtout pas à un gigantesque coup de bol, non monsieur, se fait un plaisir de répandre la doxa.</p>
<p>Et donc, Google a publié il y a de cela de nombreuses années un <a href="https://google.github.io/styleguide/cppguide.html">guide du C++</a>, très limitant, en particulier sur l'héritage multiple (avec une vision très Java d'héritage simple et d'interfaces multiples) et les exceptions, dont ils disent pis que pendre. Inefficaces, peu lisibles, un Goto moderne. Le chien de Larry a du se faire mordre par une exception quand il était petit, c'est pas possible autrement. Dans la version courante du document, il semblerait que les têtes pensantes de chez Google ont mis un peu d'eau dans leur vin: les exceptions ne sont toujours pas autorisées, mais ils conviennent que c'est plutôt pour des raisons historiques et que si c'était à refaire, bref. N'empêche que le mal est fait, et nombre de middle-managers pressés voulant gonfler leur égo en réunion vont lire la première phrase, "nous n'utilisons pas les exceptions", et ressortir ça à toutes les sauces. Et je vois maintenant de nombreux candidats à l'embauche, jeunes et moins jeunes, qui sont terrifiés par les exceptions.</p>
<p>Si Google ne veut pas utiliser d'exceptions, grand bien leur fasse. Ils peuvent même coder avec une main dans le dos et une pieuvre sur la tête si ça leur fait plaisir. Mais ce qui est bon pour Google ne l'est pas forcément pour d'autres. Mieux, je considère que dans la vaste majorité des cas, si c'est bon pour Google, alors c'est plutôt mauvais pour moi. Lisez, réfléchissez, tentez de comprendre et de justifier avant de vous précipiter une technologie ou un standard parce que Google a dit (s'applique aussi à Facebook, Microsoft, Amazon, et la voisine du 5ème).</p>
<p>Google s'est posé en prosélyte, et ces développeurs influençables s'en font les exégètes, et se persuadent que les exceptions, c'est mal, et que ce que dit Google, c'est bien, avec au sein de leur inconscient le secret l'espoir de devenir à leur tour l'équivalent d'un Google millionnaire et de posséder eux aussi leur gros yacht bien polluant sur lequel <a href="https://www.lefigaro.fr/flash-eco/2015/05/19/97002-20150519FILWWW00464-une-call-girl-plaide-coupable-dans-la-mort-d-un-dirigeant-de-google.php">ils passeront précocement de vie à trépas par le truchement d'une demi-mondaine et d'une seringue d'héroine.</a>.</p>
<p>Et donc, en entretien, je propose au candidat d'écrire une petite fonction, oh, quelque chose de tout bête, qui prend un conteneur quelconque et renvoie le plus grand élément du conteneur. La bonne nouvelle, c'est que la majorité des candidats se rendent compte vite fait qu'il faut faire quelque chose de particulier quand le conteneur est vide. La mauvaise nouvelle, c'est qu'ils sont trop nombreux à murmurer "exception", puis, comme effrayés de leur propre témérité, à rétropédaler et tenter de trouver par tous les moyens une alternative, alors on va passer par référence et renvoyer un booléen, oh non peut-être un pointeur? Ou alors un optionnel. Même les pros s'y mettent: regardez moi donc chez Apache Arrow, une bibliothèque qui propose un format plutôt bien fichu d'ailleurs pour faire du transfert ou de l'analyse de données. Et bien, ces gens, leurs types de retour sont systématiquement un "Result", et ils fournissent des macros pour s'en dépatouiller, qui vont renvoyer Machin si le résultat est correct, en lancer une exception si il ne l'est pas. Regardez moi <a href="https://arrow.apache.org/docs/cpp/examples/row_columnar_conversion.html">ça</a>, c'est moche, c'est inefficace. Mais c'est compatible Google, et c'est l'essentiel.</p>
<p>Alors oui, les exceptions ne sont pas l'alpha et l'oméga, et il y a de nombreuses situations où elles ne sont pas pertinentes. Mais dans mes systèmes financiers, là où on va prendre une donnée, l'enrichir avec quelques appels à une base de données, y rajouter deux trois fichiers, faire mouliner du code de divers paquets fournissant analyses diverses, pour aller sauver le résultat dans un autre fichier, si mes paramètres d'entrée sont mauvais, mon appel à la base foire, ou le disque plein, je ne vais pas "traiter l'erreur là où elle est lancée", et relancer la base ou faire de la place sur le disque depuis mon code. Non, je lance une exception, laquelle va remonter les 30 ou 50 niveaux dans ma pile, je l'attrape presque en haut, je logge, je fais remonter au système d'alerte, et je passe à l’élément suivant.</p>
<p>Alors on explique, on discute, on forme, on justifie. Mais mon calme et ma bonhommie légendaires sont soumis à rude épreuve quand on me rétorque que "Mais regarde, Google le fait !".</p>
<div><a href="https://linuxfr.org/users/small_duck/journaux/de-l-influence-nefaste-de-google-sur-les-developpeurs-c.epub">Télécharger ce contenu au format EPUB</a></div> <p>
<strong>Commentaires :</strong>
<a href="//linuxfr.org/nodes/128438/comments.atom">voir le flux Atom</a>
<a href="https://linuxfr.org/users/small_duck/journaux/de-l-influence-nefaste-de-google-sur-les-developpeurs-c#comments">ouvrir dans le navigateur</a>
</p>
small_duckhttps://linuxfr.org/nodes/128438/comments.atomtag:linuxfr.org,2005:Diary/402312022-04-14T16:49:21+02:002022-04-14T16:49:21+02:00Rions un brinLicence CC By‑SA http://creativecommons.org/licenses/by-sa/4.0/deed.fr<p>Je voudrais tenter de distribuer un peu de bonne humeur en vous parlant de ces livres qui m'ont fait rire aux larmes, auxquels je ne peux pas penser sans me marrer tout seul, bref, les monuments des zygomatiques. Je laisse volontairement de côté le pape de la fantasy comique, Pratchett, qui me semble suffisamment connu, pour plonger du côté de ces bouquins dont vous n'avez peut-être pas entendu parler.</p>
<h2 id="toc-alphonse-allais">Alphonse Allais</h2>
<p>Commençons dans l'ordre chronologique, avec l'un des premiers grands auteurs comiques, Alphonse Allais. Né à Honfleur en Normandie, descendu sur Paris pour y étudier la pharmacie, il délaisse rapidement ses études pour devenir une figure haute en couleurs du Paris de la Belle Époque. Auteur de nouvelles humoristiques dans le journal "Le chat noir", il publie de nombreux recueils d'histoires légères et souvent absurdes, égratignant gentiment ses contemporains.</p>
<p>Ses recueils sont disponibles sur <a href="https://fr.wikisource.org/wiki/Auteur:Alphonse_Allais">WikiSource</a>, donc aucune excuse pour ne pas se jeter dessus.</p>
<h2 id="toc-trois-hommes-dans-un-bateau-sans-oublier-le-chien">Trois hommes dans un bateau (sans oublier le chien)</h2>
<p>Ce chef d’œuvre de Jerome K Jerome retrace la pérégrination de 3 amis qui décident de remonter la Tamise. Récit de voyage et mémoires plus ou moins autobiographiques, c'est une ode à l'absurdité et à "l'esprit de contradiction inhérent aux choses".</p>
<p>La <a href="https://fr.wikisource.org/wiki/Trois_Hommes_dans_un_bateau">traduction française</a> est d'excellente facture, mais allez quand même jeter un coup d’œil sur <a href="https://en.wikisource.org/wiki/Three_Men_in_a_Boat_(1889)">l'original</a> d'abord.</p>
<h2 id="toc-a-lassaut-du-khili-khili-the-ascent-of-the-rum-doodle">A l'assaut du Khili-Khili (The ascent of the Rum Doodle)</h2>
<p>Conversation (en Anglais dans le texte)</p>
<p>Un collègue se retourne. "Hey, small_duck, tu dois avoir entendu parler de l'Ascent of the Rum Doodle, le livre le plus funny au monde ?<br>
- Nonsense! réponds-je. Jamais entendu parler de ce truc. Le livre le plus funny au monde, c'est 3 men in a boat!<br>
- Double nonsense, me rétorque-t-il. Jamais entendu parler de 3 men in a boat"</p>
<p>Après échange culturel, il s'avère qu'il y a deux livres ex-æquo les plus funny au monde.</p>
<p>Clairement inspiré de 3 hommes dans un bateau (auquel il fait d'ailleurs une subtile référence), "À l'assaut du Khili-Khili" est un pastiche de ces livres de montagne dans la veine de Premier de cordée. Là où "3 hommes" est dans la poésie de l'absurde, "À l'assaut" est une farce qui prend à contre-pied tous les stéréotypes du genre. Chaque montagnard est d'une nullité crasse dans sa spécialité, tels le guide qui se perd toujours, le médecin tout le temps malade, le photographe qui rate tous les clichés. Le cuistot est un monument à lui tout seul. Et le narrateur, chef de l'équipe, qui se fait mener en bateau par tout le monde.</p>
<p>C'est d'ailleurs l'occasion de s'intéresser à une variante du <a href="https://fr.wikipedia.org/wiki/Narrateur_non_fiable">narrateur non fiable</a>, le narrateur naif, que l'on retrouve parfois dans certains récits où le narrateur est un enfant : l'on lit un récit apparemment positif où tout semble bien se passer, mais "entre les lignes", l'on perçoit que la réalité est tout autre. En l'occurrence, c'est tordant.</p>
<p>Très drôle, mais sans méchanceté aucune, c'est devenu un incontournable chez les passionnés de montagne. Il n'est pas encore dans le domaine public, mais jetez-vous quand même dessus. Il existe une <a href="https://www.payot-rivages.fr/payot/livre/lassaut-du-khili-khili-9782228915410">édition française</a> que je n'ai pas évaluée.</p>
<h2 id="toc-the-gun-seller">The Gun Seller</h2>
<p>Vous connaissez probablement Hugh Laurie grâce à Dr House. Eh bien, Hugh Laurie a également écrit un bouquin, "The Gun Seller". C'est un thriller bien ficelé, où se mêlent agents secrets, terroristes internationaux et ventes d'armes. Mais le narrateur et personnage principal, Thomas Lang, raconte l'histoire avec un sens de la petite phrase et de l'humour "british" façon pince sans rire, à s'en rouler par terre. Notez qu'il existe une <a href="https://livre.fnac.com/a2516355/Hugh-Laurie-Tout-est-sous-controle">traduction en français</a>, là encore non évaluée par mes soins.</p>
<p>Laurie prépare une suite depuis des décennies, "Paper Soldiers", qui semble malheureusement abandonnée.</p>
<h2 id="toc-maïkole---jean-bon">Maïkole - Jean Bon</h2>
<p>Ça a commencé tout bêtement - Une petite recherche sur Internet pour voir si quelqu'un avait déjà fait une blague avec les massages "shiatsu". Je suis donc tombé sur Permis de Tirer, un pastiche de James Bond à sa sauce San Antonio, auto-publié sur <a href="https://www.thebookedition.com/fr/permis-de-tirer-p-34295.html">The Book Edition</a>, qui retrace les aventures de Jean Bon de l'agence 00 Sète qui, aidé de l'espionne chinoise Tren Pao Li et de l'espion tahitien Paul Inézi, tente de débrouiller une sombre machination. C'est un festival de jeux de mots et autres calembours, de situations délirantes, ça ne s'arrête pas une minute. Je me suis rapidement offert la moitié de la série, et j'en a racheté pour faire des cadeaux. Mention spéciale également au "Service de table de sa majesté", qui en fait des tonnes (littéralement) sur la famille royale et sur les rosbeef. Petit bémol : autant les livres papier sont de bonne facture, autant la version PDF ne passe pas du tout sur une liseuse.</p>
<p>Voilà, c'est votre tour, faites moi découvrir les bouquins et les auteurs qui vous font le plus rire !</p>
<div><a href="https://linuxfr.org/users/small_duck/journaux/rions-un-brin.epub">Télécharger ce contenu au format EPUB</a></div> <p>
<strong>Commentaires :</strong>
<a href="//linuxfr.org/nodes/127479/comments.atom">voir le flux Atom</a>
<a href="https://linuxfr.org/users/small_duck/journaux/rions-un-brin#comments">ouvrir dans le navigateur</a>
</p>
small_duckhttps://linuxfr.org/nodes/127479/comments.atomtag:linuxfr.org,2005:Diary/396432021-03-10T09:20:00+01:002021-03-10T09:20:00+01:00OVH - Le nuage part en fumée ?Licence CC By‑SA http://creativecommons.org/licenses/by-sa/4.0/deed.fr<p>Pas de bol pour OVH, qui a souffert d'un <a href="https://www.lemonde.fr/societe/article/2021/03/10/a-strasbourg-un-important-incendie-sur-le-site-de-l-entreprise-ovh-classe-seveso_6072548_3224.html">incendie</a> dans ses locaux de Strasbourg.</p>
<p>Après, c'est exactement le genre de catastrophes auxquelles un bon admin réseau se prépare, c'est donc un bon test (quoique probablement coûteux). Tous mes services chez OVH semblent fonctionner comme d'habitude, on peut espérer que leurs sauvegardes et autres plans de reprise d'activité ont fonctionné.</p>
<div><a href="https://linuxfr.org/users/small_duck/journaux/ovh-le-nuage-part-en-fumee.epub">Télécharger ce contenu au format EPUB</a></div> <p>
<strong>Commentaires :</strong>
<a href="//linuxfr.org/nodes/123540/comments.atom">voir le flux Atom</a>
<a href="https://linuxfr.org/users/small_duck/journaux/ovh-le-nuage-part-en-fumee#comments">ouvrir dans le navigateur</a>
</p>
small_duckhttps://linuxfr.org/nodes/123540/comments.atomtag:linuxfr.org,2005:Diary/394272020-11-04T14:36:52+01:002020-11-04T14:36:52+01:00Ivre, il tente de réinstaller Windows, ça tourne malLicence CC By‑SA http://creativecommons.org/licenses/by-sa/4.0/deed.fr<p>Ivre de colère, bien entendu. Manquerait plus que je sois bourré.</p>
<p>Du temps du premier confinement, j'avais dû acheter un ordinateur portable pour que mademoiselle fille puisse continuer à suivre ses cours (au Royaume-Uni, pas de questions, c'est Google Classrooms pour tout le monde).</p>
<p>J'avais donné 5 minutes à Windows pour me convaincre de le garder, et ça avait été un échec retentissant. Après avoir refusé d'avoir un compte Microsoft, refusé la télémétrie complète, refusé le contrôle à la voix et j'en passe, j'ai fini par le virer manu militari et installer Ubuntu, qui a la politesse de me poser moins de questions, et que je sais administrer, en particulier à distance.</p>
<p>Petite aparté : connaissez vous <a href="https://fr.wikipedia.org/wiki/Roblox">Roblox</a>? C'est une plateforme de jeux destinée à un public jeune, qui permet de développer et de jouer à des jeux 3D en réseau. Bien que chacun puisse créer son propre jeu, la plupart des joueurs jouent à des jeux développés par des équipes professionnelles. En particulier, le plus gros jeu, Adopt Me, et une sorte de MMO Tamagochi/Minecraft, incroyablement populaire, avec ses joueurs stars Youtube et ses événements réguliers, mais il existe aussi un jeu Harry Potter, des jeux de plateforme, des jeux de tir façon Fortnite, et j'en passe. Le business model se base sur l'achat d'une monnaie virtuelle qui permet d'acheter objets, accessoires, ou encore serveurs privés. Ne vous leurrez pas, c'est gigantesque: 150 millions d'utilisateurs, 4 milliards de dollars de chiffre d'affaire.</p>
<p>Alors voilà, mademoiselle fille et sa bande de copines sont devenues fan de Roblox et de Adopt Me, et elle ne pouvait y jouer que le nez collé à l'écran de mon Android, parce que forcément, ça ne tourne pas sous Linux, même avec Wine. Il fallait faire quelque chose, et j'ai donc essayé de réinstaller Windows sur l'ordinateur portable en me promettant d'être un peu plus patient quand Cortana me crie dessus (n'engueulez pas le patron, c'est la patronne qui s'en charge).</p>
<p>Déjà, quid de mon numéro de licence Windows, vendu avec le Dell ? Il est apparemment codé en dur dans la machine dans un registre du Bios. Quelques recherches plus tard, je trouve comment l'en extraire, et je le note soigneusement, on ne sait jamais (en fait, non, ça ne m'a servi à rien). </p>
<p>Premier réflexe, la restauration intégrée au Bios. Ça démarre, ça veut être branché au secteur. C'est raisonnable, je branche. Ça redémarre, ça veut être branché au réseau via un câble. Pourquoi pas, je déplace la machine, je branche. Ça redémarre, ça télécharge un truc pendant des plombes, ça relance l'installation, je dis, vas-y, écrase tout. Il commence à télécharger l'image, boum, il me dit qu'il y a une erreur. Internet, forums, tout le toutim, personne ne sait.</p>
<p>Bon, je me dis, c'est pas grave, m'en vais télécharger moi-même une image de Windows. Je colle ça sur une clé USB, je boote, l'installeur Windows démarre, et me dit qu'il manque un driver. Driver pour quoi, aucune idée, il ne me le dit pas. Les forums parlent du SSD du portable, proposent des fichiers à mettre sur une autre clé pour les donner à Windows, rien ne marche. J'essaie avec une clé USB2 au cas où, rien non plus.</p>
<p>Finalement, je dégotte l'image officielle Dell de Windows pour ce modèle. Je me dis, là, ça va marcher ! Grave erreur, après téléchargement (à vitesse de tortue), écriture sur la clé, rebootage, toujours le même souci. Je me dis que c'est peut-être à cause de la partition Ubuntu qui désarçonne les installeurs. Je la vire et la remplace par une belle partition NTFS. Toujours les mêmes soucis.</p>
<p>En désespoir de cause, je me dis que je vais essayer la même chose sur mon ordinateur de bureau, et proposer un double boot, puisque j'ai le numéro de licence Windows. Je me bats entre l'USB3 qui ne veut pas démarrer, l'USB2 qui veut bien démarrer mais pas continuer, et les DVD trop petits pour graver l'image, j'installe finalement l'image Windows sur une partition de mon disque pour booter dessus. Miracle, l'installeur apparaît… Pour me baratiner de la même manière avec ces histoires de drivers.</p>
<p>Après jets d'objets divers et quolibets familiaux, je finis par abandonner. Je réinstalle Ubuntu sur le portable en 20 minutes, temps de re-téléchargement de l'image comprise, et j'achète une XBox, qui remplacera avantageusement le lecteur de DVD poussif et permettra de jouer sur grand écran. Mon téléphone, manifestement jaloux, riposte et fait brûler sa prise USB-C. Il mourra doucement, faute de pouvoir le recharger.</p>
<p>Conclusion ? Bah, rien. Manifestement, Ubuntu a mis bien plus d'efforts que Windows dans son installeur. Ce qui est plutôt raisonnable : qui donc installe Windows de nos jours ? À fortiori, qui donc installe Windows par dessus un Linux, de nos jours ?</p>
<p>Je soupçonne également l'installeur Windows d'être un logiciel assez à part, tandis que l'installeur Ubuntu est finalement un Ubuntu Live CD, qui débarque donc avec tous les drivers. L'approche Linux d'avoir tous les drivers dans le noyau est probablement aussi payante dans ce cas.</p>
<p>Au final, je m'accommode de la situation. Avoir Ubuntu sur le portable, c'est mieux séparer le temps de travail du temps d'écran loisirs. Et je repousse ainsi certaines velléités familiales qui voudraient nous voir nous équiper d'un iPad, qui me semble pour le coup ne rien résoudre et coûter beaucoup plus cher pour un confort bien moindre.</p>
<p>Et puis, j'ai découvert l'écosystème XBox, qui me donne plein de nouvelles raisons de m'insurger. Peut-être pour un prochain journal !</p>
<div><a href="https://linuxfr.org/users/small_duck/journaux/ivre-il-tente-de-reinstaller-windows-ca-tourne-mal.epub">Télécharger ce contenu au format EPUB</a></div> <p>
<strong>Commentaires :</strong>
<a href="//linuxfr.org/nodes/122111/comments.atom">voir le flux Atom</a>
<a href="https://linuxfr.org/users/small_duck/journaux/ivre-il-tente-de-reinstaller-windows-ca-tourne-mal#comments">ouvrir dans le navigateur</a>
</p>
small_duckhttps://linuxfr.org/nodes/122111/comments.atomtag:linuxfr.org,2005:Diary/393722020-09-29T00:07:02+02:002020-09-29T00:07:02+02:00Hégémonie et navigateursLicence CC By‑SA http://creativecommons.org/licenses/by-sa/4.0/deed.fr<p>Aujourd'hui, journal qui dénonce grave. Pourquoi, mais oh pourquoi, est-ce que Firefox, mon navigateur préféré depuis 15 ans, est maintenant <a href="https://fr.wikipedia.org/wiki/Parts_de_march%C3%A9_des_navigateurs_web#Tableau_r%C3%A9capitulatif">un produit de seconde zone</a> ?</p>
<p>Premier exemple : mademoiselle fille revient de l'école, me parlant d'un super site qu'ils ont utilisé en classe pour dessiner des BDs. Ni une, ni deux, on essaye, et là, c'est le drame: une page nous explique que le site ne supporte que Chrome, Edge et Safari. Quelle sombre fonctionnalité a donc été utilisée qui plante avec le panda roux ? Quel responsable a donc décidé qu'on allait bloquer Firefox parce que les 3 autres suffisent bien, non mais oh, tester ça coûte des sous, ma bonne dame ? Pourquoi ne pas au moins nous laisser essayer, quitte à avoir un bandeau "Chrome, Edge ou Safari recommandé" ? Bah on a sorti Chromium, et c'est passé. </p>
<p>Deuxième exemple : je désire commander une pizza auprès d'une grande chaîne de restaurants. Le site, moderne, tourne rond. Sûrement, une fonctionnalité d'e-commerce se doit de marcher avec n'importe quel navigateur, on ne va pas s'aliéner 5% des gens qui veulent vous donner de l'argent, non ? Sauf que je n'ai jamais pu créer un compte : le bouton pour soumettre le formulaire reste obstinément grisé. Bah on a ressorti Chromium, parce que l'heure tournait et que si ça continuait, ça serait pizza pour le petit dej', et c'est passé.</p>
<p>Quel crime abominable, quel péché originel a donc commis Firefox pour se faire renvoyer aux tréfonds du Web ? Les atermoiements de la MoFo ? Je n'y crois que moyennement. La plupart des gens, dont moi, s'en tamponnent. Les fonctionnalités ? Il tourne vite et bien, le gestionnaire de mots de passe est une tuerie, je n'arrive pas à me passer de l'AwesomeBar. Le marketing ? Peut-être. Pendant que la MoFo dépense des sous dans des projets foireux, ils ne font pas de pub pour leur produit principal.</p>
<p>Public, arrête de bouder Firefox ! Donne lui une chance !</p>
<div><a href="https://linuxfr.org/users/small_duck/journaux/hegemonie-et-navigateurs.epub">Télécharger ce contenu au format EPUB</a></div> <p>
<strong>Commentaires :</strong>
<a href="//linuxfr.org/nodes/121750/comments.atom">voir le flux Atom</a>
<a href="https://linuxfr.org/users/small_duck/journaux/hegemonie-et-navigateurs#comments">ouvrir dans le navigateur</a>
</p>
small_duckhttps://linuxfr.org/nodes/121750/comments.atomtag:linuxfr.org,2005:Diary/393052020-08-21T00:56:50+02:002020-08-21T00:56:50+02:00X-plane et la simulation de vol sous LinuxLicence CC By‑SA http://creativecommons.org/licenses/by-sa/4.0/deed.fr<p>Nous sommes quelques jours après la sortie de <a href="https://www.jeuxvideo.com/test/1269729/microsoft-flight-simulator-le-monde-comme-vous-ne-l-avez-jamais-vu.htm">Microsoft Flight Simulator 2020</a>, c'est donc le moment idéal de vous parler d'un logiciel qui me tient à cœur: <a href="https://www.x-plane.com/">X-Plane</a>.</p>
<p>Alors, certes, c'est un logiciel propriétaire, mais:</p>
<ul>
<li>Il tourne sous Linux (entre autres)</li>
<li>Il est plutôt ouvert</li>
<li>Il a une <a href="https://www.x-plane.fr/">communauté francophone</a> très active et très sympa.</li>
</ul>
<h2 id="toc-x-plane">X-Plane</h2>
<p><a href="https://fr.wikipedia.org/wiki/X-Plane_(jeu_vid%C3%A9o)">L'histoire de X-plane</a> commence en 1995 avec la sortie d'un simulateur pour Mac, qui sera ensuite porté sous Windows et Linux, et enfin dernièrement sous Android et IOS. Se focalisant sur le réalisme d'un modèle de vol simulé à partir de la géométrie de l'appareil plutôt que sur des tables de correspondance, il propose de plus à partir de X-plane 10 et enfin X-plane 11, des graphismes tout à fait sympathiques.</p>
<h2 id="toc-extensions">Extensions</h2>
<p>Une grande force du logiciel est son extensibilité. Comme tous les logiciels du genre, il existe pléthore de greffons et d'extensions qui permettent à des éditeurs tiers de fournir des scènes ou des avions d'une grande qualité (et souvent à <a href="https://store.x-plane.org/Airbus-A350-XWB-Advanced_p_348.html">un prix supérieur au simulateur de base</a>, mais la simulation de tous les systèmes de vol d'un avion moderne est d'une complexité sans nom).</p>
<p>Cependant, et contrairement à de nombreux ténors du genre, le logiciel est particulièrement ouvert, et il est aisé pour tout un chacun de créer ses propres extensions et de les partager. De nombreux fanatiques se sont lancés dans la modélisation de l'aéroport du coin ou de leur avion favori, à l'aide des logiciels d'édition de scène ou d'aéronefs fournis avec X-plane, souvent combinés avec Blender. Ainsi, le site <a href="https://xpfr.org">xpfr.org</a> regroupe les créations gratuites de nombreux contributeurs francophones, ainsi que des bibliothèques de scène souvent distribuées sous licences CC. L'on notera également le projet <a href="https://forums.x-plane.org/index.php?/forums/topic/138974-b737-800x-zibo-mod-info-installation-download-links/">Zibo</a>, qui fournit gratuitement une extension (non libre) extrêmement pointue du Boeing 737 fourni de base avec le logiciel.</p>
<p>X-Plane permet le chargement d'ortho photos, qui sont les textures de terrain créés à partir d'images satellites. Grace au logiciel <a href="https://github.com/oscarpilote/Ortho4XP">Ortho4XP</a>, distribué sous licence GPL v3, chacun peut télécharger les images satellites de Bing ou Google Map et les traiter pour obtenir des rendus extrêmement réalistes.</p>
<p><img src="//img.linuxfr.org/img/68747470733a2f2f342e62702e626c6f6773706f742e636f6d2f2d724f7242455f576e6c70512f58567367785934706273492f41414141414141414674772f306e767439624c33425367347037463039764d5f524c364b57575335746c737041434c63424741732f73313630302f416c7065735f4436325f312e6a7067/Alpes_D62_1.jpg" alt="Dans les Alpes" title="Source : https://4.bp.blogspot.com/-rOrBE_WnlpQ/XVsgxY4pbsI/AAAAAAAAFtw/0nvt9bL3BSg4p7F09vM_RL6KWWS5tlspACLcBGAs/s1600/Alpes_D62_1.jpg"></p>
<p>Très fort également, le projet <a href="https://simheaven.com/">SimHeaven</a> (gratuit, mais non libre) traite les données OpenStreetMap pour ajouter à la scène les bâtiments, arbres, éoliennes et ainsi de suite.</p>
<p>Cela permet d'avoir un environnement de toute beauté.</p>
<p><img src="//img.linuxfr.org/img/68747470733a2f2f322e62702e626c6f6773706f742e636f6d2f2d6653566638312d734535552f58485844657a3375517a492f41414141414141414670592f684d6168483051743672514357535046755f64736a305f6b316f6c436d63412d77434c63424741732f73313630302f785f706c616e655f6d61785f67726170686963735f322e6a7067/x_plane_max_graphics_2.jpg" alt="En A319 au dessus de l'aéroport d'Orly" title="Source : https://2.bp.blogspot.com/-fSVf81-sE5U/XHXDez3uQzI/AAAAAAAAFpY/hMahH0Qt6rQCWSPFu_dsj0_k1olCmcA-wCLcBGAs/s1600/x_plane_max_graphics_2.jpg"></p>
<h2 id="toc-accessoires">Accessoires</h2>
<p>Côté hardware, il faudra certainement investir au moins dans un manche, voire dans une manette des gaz et un palonnier. Les manches <a href="https://virpil-controls.eu/">très haut de gamme</a> sont souvent réservés à Windows car ils nécessitent d'être calibrés avec un logiciel particulier. En milieu de gamme, Thrustmaster fait du beau matos. Je possède de chez eux le <a href="http://www.thrustmaster.com/products/hotas-warthog">Warthog Hotas</a> manche et manette, et leur palonnier TFRP. Le matos vient en théorie avec un logiciel (appelé TARGET) permettant de le configurer aux petits oignons, mais avec un peu de bidouille on peut le faire fonctionner de manière très honnête avec le système d'exploitation du manchot.</p>
<h2 id="toc-et-les-alternatives-libres">Et les alternatives libres ?</h2>
<p>Il existe un simulateur libre, le projet <a href="https://www.flightgear.org/">FlightGear</a>. C'est un simulateur honnête et sans prétentions, qui souffre un peu d'une interface peu pratique et de graphismes un peu vieillots.</p>
<h2 id="toc-et-la-simulation-militaire">Et la simulation militaire ?</h2>
<p>Si votre truc c'est de vous tirer dessus à coup de canon ou de missile, alors nativement sous Linux, point de salut. En bidouillant, l'excellent simulateur <a href="https://www.digitalcombatsimulator.com/fr/">DCS World</a> et nombre de ses extensions fonctionnent avec Proton, mais il arrive fréquemment qu'une mise à jour casse tout jusqu'à ce qu'un <a href="https://www.protondb.com/app/223750">débrouillard trouve la combine et la partage</a>.</p>
<div><a href="https://linuxfr.org/users/small_duck/journaux/x-plane-et-la-simulation-de-vol-sous-linux.epub">Télécharger ce contenu au format EPUB</a></div> <p>
<strong>Commentaires :</strong>
<a href="//linuxfr.org/nodes/121373/comments.atom">voir le flux Atom</a>
<a href="https://linuxfr.org/users/small_duck/journaux/x-plane-et-la-simulation-de-vol-sous-linux#comments">ouvrir dans le navigateur</a>
</p>
small_duckhttps://linuxfr.org/nodes/121373/comments.atomtag:linuxfr.org,2005:Diary/391502020-05-15T00:54:59+02:002020-05-15T00:54:59+02:00Postgresql, un retour d'expérienceLicence CC By‑SA http://creativecommons.org/licenses/by-sa/4.0/deed.fr<h2 class="sommaire">Sommaire</h2>
<ul class="toc">
<li><a href="#toc-un-petit-peu-de-contexte">Un petit peu de contexte</a></li>
<li><a href="#toc-%C3%87a-se-pr%C3%A9cise">Ça se précise</a></li>
<li><a href="#toc-quelques-remarques-techniques-%C3%A0-lemporte-pi%C3%A8ce">Quelques remarques techniques à l'emporte-pièce</a></li>
<li><a href="#toc-quelques-remarques-non-techniques-tout-autant-%C3%A0-lemporte-pi%C3%A8ce">Quelques remarques non techniques, tout autant à l'emporte pièce</a></li>
</ul>
<h2 id="toc-un-petit-peu-de-contexte">Un petit peu de contexte</h2>
<p>J'ai rejoint une grande banque asiatique, à Londres, il y a de cela 10 ans, pour travailler sur un de leurs systèmes, une grosse application financière en C++. Quelques années plus tard, les affaires n'ayant pas fonctionné comme prévu, ils décident de se débarrasser de l'équipe à laquelle j'appartenais. Heureusement, une petite institution financière européenne s'est montrée intéressée par le système et l'équipe, et plutôt que je devoir payer des indemnités de licenciement, mon ancien employeur était ravi de se débarrasser de nous à l’œil.</p>
<h2 id="toc-Ça-se-précise">Ça se précise</h2>
<p>On me charge de préparer la migration des données. Nous avons 2 bases:</p>
<ul>
<li><p>Une base <a href="https://fr.wikipedia.org/wiki/IBM_Db2">IBM DB2</a>, qui contient surtout des données dites statiques, relatives aux produits financiers. Ça change un petit peu, mais pas tant que ça : quelques mises à jour le matin, et ça restera tel quel durant le jour.</p></li>
<li><p>Une autre base <a href="https://en.wikipedia.org/wiki/Kdb%2B">KDB</a>, utilisée comme persistance pour une interface graphique qui affiche les ordres passés durant la journée. On parle de quelques centaines de milliers de changements durant la journée, et à la fin, on efface tout. Pour ceux qui ne connaissent pas KDB, il s'agit d'une <a href="https://fr.wikipedia.org/wiki/Base_de_donn%C3%A9es_orient%C3%A9e_colonnes">base orientée colonnes</a>. C'est très cher, et c'est horriblement moche : son concepteur avait une idée toute personnelle de la lisibilité du code, et a construit sa base de données autour d'un langage hyper concis, le langage q (le bien nommé). L'interface C de q (vous suivez ?) est une horreur Lovecraftienne bourrée de macros de 1 caractère. Mais tout le monde semble persuadé qu'une base SQL ne peut pas tenir les 200 000 transactions à la journée. Bon.</p></li>
</ul>
<p>Mon nouvel employeur, lui, travaille avec Oracle, et n'est évidemment pas emballé de débourser une petite fortune pour ces technologies. Nous décidons donc de migrer les bases DB2 et KDB vers une base open source, et une fois arrivés de l'autre côté, de convertir depuis la base open source vers Oracle. Et on verra ce qu'il faut optimiser.</p>
<p>Je me lance donc tout d'abord dans la conversion de la base DB2 vers MySQL. Ouh là quelle catastrophe ! J'espère que les choses ont bien changé depuis, mais MySQL manque cruellement à l'époque de fonctionnalités plutôt basiques. J'ai beaucoup lutté avec les clés étrangères, l'indexage, la création de séquences ou les sous-requêtes.</p>
<p>Tournant en rond, je propose à ma hiérarchie d'utiliser Postgres, qui était plutôt plus touffu en termes de fonctionnalités, et que je connaissais mieux. En effet, ça se passe mieux, et j'ai une belle base qui fonctionne.</p>
<p>Pour KDB, c'est aussi facile, et, surprise (ou pas !), c'est tout aussi efficace.</p>
<p>Finalement, quand nous arrivons chez notre nouvel employeur, l'idée d'une base qui ne leur coûtera pas un rond en licences, pour un projet un peu risqué, leur semble une très bonne idée. Leurs DBAs sont réceptifs et prennent un consultant pendant quelques semaines histoire d'apprendre à installer et administrer une base Postgres. Nous décidons d'utiliser la réplication par envoi de journaux de transactions, afin d'avoir une base primaire dans un datacenter, une base secondaire dans l'autre datacenter, et de pouvoir utiliser la base secondaire pour effectuer des opérations en lecture seule.</p>
<p>Ce type de réplication fonctionne très bien, mais souffre d'un défaut: quand on dit que le secondaire de peut effectuer que des opérations en lecture seule, cela interdit la création de tables temporaires. Or, afin de lire rapidement des sous-ensemble de données, nous utilisons beaucoup une approche qui consiste à créer une table temporaire, y pousser les références des données qui nous intéresse, puis à faire une jointure de la table temporaire avec la table principale pour récupérer les lignes qui vont bien.</p>
<p>Or, nos analystes aimeraient bien étudier les donnés et faire tourner de grosses études qui peuvent prendre plusieurs jours, sans impacter les opérations temps réel. On finit par leur créer une base séparée dans laquelle on copie la base principale toutes les nuits, mais cela invalide les requêtes préparées au moment du rafraîchissement et cause des problèmes.</p>
<p>Finalement, après bien des années, nous changeons d'approche et utilisons les tableaux Postgres pour passer au sein de la procédure stockée la liste des données qui nous intéresse. On peut enfin fournir à nous analystes une autre base répliquée. Tout le monde est content !</p>
<p>Au fur et à mesure des années, la base grossit et devient de plus en plus temps réel, car nous l'utilisons pour la persistance de messages transmis entre les services ou avec l'extérieur. On est maintenant entre 500 et 2000 transactions par seconde. L'autre base, remplacement de KDB, fonctionne également sans accrocs. On finit même par manger un petit peu Oracle : nous recommandons Postgres pour la migration d'une gigantesque base <a href="https://fr.wikipedia.org/wiki/Traitement_analytique_en_ligne">OLAP</a>, utilisée pour sauver tous les messages qui passent par le système (plusieurs millions par jour, quand même). C'est un peu de sport, mais la base fait maintenant plusieurs téraoctets, et reste tout à fait administrable.</p>
<h2 id="toc-quelques-remarques-techniques-à-lemporte-pièce">Quelques remarques techniques à l'emporte-pièce</h2>
<ul>
<li><p>Postgres fournit une bibliothèque C, la libpq (la bien nommée), qui permet de transférer les données soit en mode texte, soit en mode binaire. Il existe également une bibliothèque C++, libpqxx, qui ne fonctionne qu'en mode texte. Finalement, et malgré les recommandations de se cantonner au mode texte, ce qui a marché le mieux pour nous est de construire une petite bibliothèque lourdement templatée autour de la libpq qui passe toutes les données au format binaire. C'est plus efficace, et beaucoup plus sûr, surtout avec des types plus complexes comme des types date heure et les tableaux. Certes, le format binaire est mal ou pas documenté, et il faut faire parfois du reverse engineering ou aller lire le source pour comprendre comment les tableaux sont envoyés, mais une fois que ça marche, c'est du solide.</p></li>
<li><p>Postgres est configuré par défaut pour de petites bases, et il nous a fallu pas mal de temps afin de vraiment comprendre quels paramètres changer pour obtenir la performance désirée avec nos volumétries. En particulier, nous avons clairement trop longtemps sous-dimensionné les autovacuum, qui sont les jobs de maintenance des tables. Sur de grosses bases, avec de gros serveurs avec des dizaines de CPU, des centaines de Go de RAM, et une baie de SSD derrière, il ne faut pas hésiter à rendre l'autovacuum bien plus agressif.</p></li>
<li><p>Les types tableaux de Postgres sont vraiment magiques. Ne pas en abuser, car cela casse le modèle relationnel, et l'on peut regretter plus tard de ne pas pouvoir l'indexer, mais parfois, cela permet de beaucoup se simplifier la vie.</p></li>
<li>
<p>Enfin, ce qui est vraiment plaisant, avec Postgres, c'est la cohérence du système, le fait que la base semble faite d'abord pour l'utilisateur:</p>
<ul>
<li>Les changements de schéma sont transactionnels, pour de vrai, pour n'importe quel changement de schéma, et ça, il n'y en a pas beaucoup d'autres qui le font. Cela rend les mises à jour faciles et plaisantes: on lance le script, si on s'est trompé et qu'il s'interrompt avec une erreur, le rollback est complet, on a pas besoin de bidouiller à la main pour rattraper le coup.</li>
<li>Le type text est limité à un confortable 2Go, et marche exactement de la même manière que n'importe quel autre type. Par rapport aux autres bases qui donnent des limites ridiculement basses à leurs types texte et qui nous forcent à utiliser une structure différente genre blob ou bigtext, qui évidemment se gère différemment dans l'API C, ou ne peut pas s'indexer, ou ne peut pas faire partie de la clé primaire, ou que sais-je encore, quel bol d'air !</li>
</ul>
</li>
</ul>
<h2 id="toc-quelques-remarques-non-techniques-tout-autant-à-lemporte-pièce">Quelques remarques non techniques, tout autant à l'emporte pièce</h2>
<p>Postgres nous a donné des résultats incroyables parce que c'est une application d'une qualité rare, mais également parce que nous avons eu le soutien de notre hiérarchie et de l'équipe d'infrastructure, de vrais pros, enthousiastes à l'idée d'essayer quelque chose de nouveau, mais sans naïveté par rapport aux attentes et à l'effort à fournir : nous avons payé des consultants, nous avons pris un contrat de support chez un fournisseur tiers, les serveurs ont été correctement dimensionnés.</p>
<p>J'ai aussi fait attention à ne jamais forcer la main de qui que ce soit : j'ai fourni des prototypes, j'ai tenté de montrer les bons côtés de la solution open source, sans cacher les difficultés, et je ne me suis pas braqué lorsque les décisions sont allées à l'opposé de ce que je proposais. On s'est tous fait confiance, et ça s'est bien passé.</p>
<div><a href="https://linuxfr.org/users/small_duck/journaux/postgresql-un-retour-d-experience.epub">Télécharger ce contenu au format EPUB</a></div> <p>
<strong>Commentaires :</strong>
<a href="//linuxfr.org/nodes/120440/comments.atom">voir le flux Atom</a>
<a href="https://linuxfr.org/users/small_duck/journaux/postgresql-un-retour-d-experience#comments">ouvrir dans le navigateur</a>
</p>
small_duckhttps://linuxfr.org/nodes/120440/comments.atom