jeudi 23 février 2023

C++20 - std::source_location

J'ai eu l'occasion d'expérimenter avec la structure std::source_location, qui est très bien fichue puisqu'elle s'initialise avec les informations courantes de fonction, de fichier source, et de ligne et de colonne dans le source.

Là où c'est très sympa, c'est qu'il est possible en utilisant un paramètre par défaut d'obtenir dans une fonction les informations de l'appelant ! C'est particulièrement pratique, par exemple, pour implémenter une fonction de log qui ne soit pas une immonde macro.

#include <source_location>
#include <iostream>
#include <string>

void log(std::source_location location = 
         std::source_location::current())
{
    std::cout << location.function_name() << std::endl;
}

void f()
{
    log();
}

template<typename T>
void g()
{
    log();
}

int main()
{
    f();
    g<std::string>();
    g<int>();
    return 0;
}

Et voilà le résultat :

void f()
void g() [with T = std::__cxx11::basic_string<char>]
void g() [with T = int]

Là où ça devient intéressant, c'est quand on veut le combiner avec une fonction de log variadique, de type std::format. Puisque l'on ne peut pas mettre le paramètre par défaut à la fin, car c'est ambigu, il faut ruser, et transformer le premier paramètre, typiquement la chaîne de formattage, en un objet spécial qui prend en premier paramètre la chaîne de formattage et en deuxième le paramètre std::source_location par défaut. Puis combiner tout cela avec du consteval et l'empaqueter dans un std::identity_type_t afin qu'il ne participe pas à la résolution des types variadiques, sinon ça ne marche pas !

Je posterai à l'occasion un exemple un peu plus complet. D'ici là, compilez bien.

samedi 14 janvier 2023

Un Arduino dans le tiroir

C'est mon côté polarisé qui reprend le dessus - Je viens de ranger les divers composants électroniques de mon Arduino dans des petits casiers, et cela me remplit de joie.

En particulier, je galère moins quand je cherche la bonne résistance. Les anneaux de couleur, c'est sympa, mais à moins de sortir la loupe, je trouve ça tout de même plutôt ardu à déchiffrer.

J'en suis maintenant au montage numéro 6, tout en faisant mes recherches sur la meilleure manière de multiplexer un grand nombre de boutons et d'encodeurs rotatifs. Le hardware, c'est pas facile !

mercredi 4 janvier 2023

Arduino

Et voilà, j'ai commené à jouer avec mon Arduino ! Les projets sont sympa, et permettent de comprendre pas à pas comment interfacer des composants electroniques standard (diodes, interrupteurs, capteurs de température, de position...) avec l'Arduino, et d'écrire le code qui va bien. Je continue à apprendre, avant de me lancer dans mon projet principal de panneau de contrôle pour la simu aérienne. Il faudra que j'aille faire mon marché pour acheter boutons et encodeurs rotatifs. Je me tâte même à tenter d'intégrer un afficheur 7 segments pour l'altitude, le cap, la vitesse ascensionelle... Mais c'est plus compliqué à intégrer ensuite depuis l'ordinateur, donc on verra !

mercredi 14 décembre 2022

Méthodes monadiques sur std::optional

Voilà que C++ se prend pour Haskell ! Maintenant, nous avons une belle interface monadique pour std::optional, les méthodes and_then, transform, or_else, qui permettent de chainer des appels sur un optionel. Je me suis demandé si le compilo pouvait optimiser entre les appels, et j'ai donc demandé au fidèle godbolt ce quí il en pensait. Le résultat est impressionnant. Voici deux fonctions qui font la même chose, l'une utilisant l'approche monadique (g++ 12.2, options -O3 -std=c++23):

#include <optional>

int f(const std::optional<int>& opt)
{
    return opt
    .transform([](auto&& val) { return val + 3;})
    .transform([](auto&& val) { return val - 11;})
    .value_or(7);
}

int g(const std::optional<int>& opt)
{
    if (opt)
    {
        return *opt + 3 - 11;
    }
    else
    {
        return 7;
    }
}

G++, sans broncher, nous sort, dans les deux cas, le même code optimisé aux petits oignons:

        cmpb    $0, 4(%rdi)
        movl    $7, %eax
        je      .L1
        movl    (%rdi), %eax
        subl    $8, %eax
.L1:
        ret

À noter que clang, encore mieux, nous débarasse carrément du saut conditionnel !

        movl    (%rdi), %ecx
        addl    $-8, %ecx
        cmpb    $0, 4(%rdi)
        movl    $7, %eax
        cmovnel %ecx, %eax
        retq

Ils sont forts, ces concepteurs de compilos. La conclusion, c'est donc que oui, le compilo peut optimiser à travers les appels monadiques. Mangez-en donc !

mercredi 7 décembre 2022

VulkanSceneGraph version 1.0

Je ne me souvenais pourtant pas de m'être abonné aux sorties de VulkanSceneGraph, mais j'avais la hype quand j'ai reçu un e-mail annonçant la version 1.0 de la nouvelle mouture du graphe de scène, mais basé sur Vulkan.

J'étais tellement enthousiaste que j'ai pondu une petite trilogie d'articles sur linuxfr.org : tout d'abord, une petite retrospective des techniques de rendu, moment nostalgie avec tous ces vieux jeux, puis un petit aperçu sur les graphes de scène, et enfin la présentation de VulkanSceneGraph.

Avec un support gltf aux petits oignons, je n'ai plus qu'à espérer un rapide développement des fonctionnalités d'animation, et je n'aurai plus d'excuses pour ne pas faire un truc avec tout ça.

dimanche 20 novembre 2022

Arduino

J'ai déjà fait ma liste au père Noël : je rêve d'un kit Arduino, comme par exemple celui là.

Mon but, c'est tout d'abord de me familiariser avec ce genre de matériel, puis de me lancer dans la création d'un panneau de contrôle de pilote automatique inspiré de celui de l'Airbus A320 (le FCU, placé au centre juste en dessous de la verrière). Lors de mon expérience sur simulateur, j'avais vraiment trouvé ça top de tourner les molettes pour aller chercher l'altitude et le cap, et revenir dans X-Plane à la chasse au bouton via la souris était plutôt déprimant. Électroniquement, rien de compliqué, et pas beaucoup plus côté code, du moins tant que je reste simple et que je me contente d'ajouter molettes et boutons (pour les affichages, ça sera nettement plus complexe, mais ce sera une étape 2, si je réussis l'étape 1).

jeudi 10 novembre 2022

Un petit peu de Mastodon

Connaissez-vous Mastodon ? C'est une alternative à Twitter, suivant un principe de fédération : chaque utilisateur choisit un serveur qu'il veut rejoindre, et à partir de ce serveur peut s'abonner à n'importe quel utilisateur du réseau, sachant que chaque serveur est administré indépendamment, en particulier en ce qui concerne la modération. Les changements un poil bruteaux d'Elon Musk, le nouveau patron de Twitter, ont poussé des centaines de milliers d'utilisateurs à chercher d'autres solutions, et Mastodon a vu un nombre important de nouveaux utilisateurs.

Par curiosité, j'ai décidé de rejoindre le réseau, en particulier via l'application libre tooot sur iPhone (mon téléphone est trop vieux pour faire tourner le client officiel). Après avoir commencé à suivre ceux auxquels j'étais déjà abonné sur Twitter et qui ont des comptes Mastodon, ça me plait : interface épurée, pas de pubs, atmosphère plutôt sympa, même si c'est finalement un peu vide : avec seulement 1 million d'utilisateurs comparés au 350 millions de Twitter, il se passe forcément moins de choses. J'ai tenté pour voir de me mettre sur le fil de mon "instance", c'est à dire de voir les autres utilisateurs qui passent par le même serveur. Comme c'est un serveur généraliste, ce n'est pas particulièrement pertinent au regard de mes intérêts, mais c'est toujours ça.

J'adorerais que ça décolle, mais je ne me fais pas trop d'illusions !