Clément V a écrit 99 commentaires

  • [^] # Re: Distance du tracé

    Posté par  . En réponse à la dépêche SafeCycle - Itinéraire pour vélo, centré sur la sécurité. Évalué à 2.

    Parfois il y a un feu spécial cyclistes qui demande d'appuyer sur un bouton puis d'attendre au moins un cycle complet avant de passer au vert. J'ai pas trouvé la technique pour passez celui-là sans m'arrêter.

  • [^] # Re: It works!

    Posté par  . En réponse à la dépêche SafeCycle - Itinéraire pour vélo, centré sur la sécurité. Évalué à 10.

    les itinéraires proposés et la classification sont pertinents

    Pas chez moi. Je suis plus piéton que cycliste mais j'ai testé un itinéraire qui passe autour de chez moi sur des chemins que je connais bien. Les problèmes que je relève :

    • préfère un (léger) détour par une route à faible trafic plutôt que de suivre la départementale, mais la départementale n'est pas si dangereuse sur cette section alors que le détour fait traverser cette même départementale sur une intersection très dangereuse (sens interdit + peu de visibilité + plus grande vitesse que sur la section évitée).
    • prend un sentier non-cyclable (en haut d'un talus avec plein de branches). J'imagine qu'il faudra que je complète OSM pour celui-ci.
    • prend un bon détour par un sentier pour éviter un chemin carrossable au trafic extrêmement faible (chemin d'exploitation en forêt + accès résidentiel).
    • va faire un circuit absurde sur un parking+promenade au lieu de suivre une route de centre ville (dont un bout au bord d'un quai qui doit bien emmerder les piétons).
    • fait traverser une grande route pour suivre un piste cyclable (double sens, partagée avec les piétons) le long du mauvais coté de la route puis re-traverser après une courte distance.

    J'imagine qu'une grosse partie de ces problèmes vient d'un manque d'informations (et de l'absurdité de certaines pistes cyclables). Mais je me demande si cet algo ne donne pas trop d'importance à la densité du trafic et à la distance parcourue pour être pertinent. Est-il plus dangereux de traverser une route ou de rouler quelques centaines de mètres le long de celle-ci ? Selon tes critères une intersection c'est zéro mètres donc zéro dangers. Est-il plus dangereux de rouler sur une route de centre ville avec beaucoup de trafic mais très lent ou sur une route de campagne sur laquelle un bolide passe de temps en temps ? (la dernière fois que j'ai fait du vélo autour de chez moi, j'ai eu un quasi-accident avec une moto sur une route très faiblement fréquentée, mais j'en fait pas en ville, donc c'est biaisé). Il faudrait peut-être aussi prendre en compte que tourner à droite à une intersection, ce n'est pas comme tourner à gauche. Il faudra aussi laisser quelques chemins pour que les piétons puissent circuler eux aussi en sécurité.

  • [^] # Re: Haiku

    Posté par  . En réponse au journal GrIP2HID: un adaptateur USB pour le Gravis Gamepad Pro. Évalué à 2.

    je ne vois pas en quoi la/le légende/libellé influe sur les quicktime events

    Les QTE te demandent souvent d'appuyer rapidement sur le bouton représenté par son symbole sans que ça ait un rapport avec l'utilisation habituel du bouton en question. Si tu ne connais pas bien les symboles de ta manette, il faut que tu la regardes pour trouver le bouton… et c'est trop tard.

    Si le symbole donne clairement la position du bouton (par exemple ◁△▽▷), on peut trouver le bouton sans regarder la manette et sans devoir la connaître par cœur.

    ◄▲▼► (◁△▽▷)

    La manette de Nintendo 64 avait 4 boutons supplémentaires (en plus de A et B) avec des flèches, mais ils se sont fait remplacés par le second joystick, donc les flèches ne sont pas restées.

    ♠♥♦♣ (♤♡♢♧)

    C'est le même problème que la notation Sony : la position de chaque symbole n'est pas évidente.

  • # sans bash

    Posté par  . En réponse au journal TapTempo en CMake. Évalué à 8.

    Utiliser execute_process c'est un peu triché même s'il n'y a pas le choix. Mais utiliser un interpréteur de script c'est pire. On pourrait remplacer l'appel de bash par un simple commande équivalente comme head -n1 (ça reste un programme externe mais au moins ce n'est pas un langage de programmation).

  • [^] # Re: -march

    Posté par  . En réponse au journal Recherche de valeur dans un tableau et l'écosystème des compilateurs C++. Évalué à 2.

    Il me semble que par défaut GCC cible la plateforme hôte, comme si on passait -march=native.

    Chez moi la valeur par défaut est x86-64 (amd64 avec extensions jusqu'à sse2 si j'ai bien compris).

    Mes résultats plus détaillés sont :

                c       c_unr   cpp     sse2
    default     8.56    5.49    4.39    3.91
    core2       5.42    5.16    4.38    3.89
    sandybridge 5.45    5.51    4.34    3.93
    haswell     5.42    5.47    4.35    3.89
    broadwell   5.42    5.47    4.35    3.86
    skylake     5.39    5.47    4.31    4.70
    

    Je regarde le code désassemblé avec objdump et je n'y comprends rien. Pour find_int_c le code machine est exactement le même entre default et core2, à partir de haswell add $0x1,%rcx est remplacé par inc %rcx mais ce n'est pas ce qui fait la différence. Pareil pour find_int_sse2, à partir de sandybridge les instructions SSE2 sont remplacées par leurs équivalents AVX, mais il n'y a aucune différence entre broadwell et skylake. Des idées sur ce qui peut se passer ?

    Pour la boucle déroulée sur core2, au moins je vois des différences : des instructions sont réordonnées par rapports aux autres architectures.

  • # -march

    Posté par  . En réponse au journal Recherche de valeur dans un tableau et l'écosystème des compilateurs C++. Évalué à 5.

    Je me demandais quelle était l'influence de -march=... pour ce genre d'algo. J'ai testé ton benchmark chez moi (i5-9600k) avec g++ seulement (la flemme d'installer d'autres compilateurs). Sans changer les options, je trouve des résultats similaires aux tiens sauf que benchmark_cpp est plus rapide que benchmark_c_unrolled.

    Avec -march=native ou -march=skylake, benchmark_c devient aussi bon que benchmark_c_unrolled. benchmark_c_unrolled et benchmark_cpp ne bougent pas. benchmark_sse2 devient plus lent ! (plus lent que benchmark_cpp mais toujours plus rapide que benchmark_c_unrolled)

    Avec -march=core2, benchmark_c est tout autant accéléré, benchmark_c_unrolled va encore un peu plus vite, benchmark_cpp et benchmark_sse2 sont aussi rapide que sans l'option.

    Donc -march est bien important, mais g++ ne semble pas très bon pour les architectures récentes et sabote même l'algo sse2.

  • [^] # Re: Réglages des couleurs

    Posté par  . En réponse au journal Clavier Logitech G213 Prodigy. Évalué à 3.

    Le protocole est partiellement documenté : https://drive.google.com/folderview?id=0BxbRzx7vEV7eWmgwazJ3NUFfQ28

    Ça devrait aider pour généraliser, je vois que le code utilise des rapports HID hardcodés avec des index qui peuvent changer pour chaque appareil (mais qu'il te donne si tu lui demandes poliment).

  • [^] # Re: Technologie et utilisation de la technologie

    Posté par  . En réponse au journal Rendez moi mon futur!. Évalué à 10.

    Google et Facebook ne sont pas devenus riches parce que la publicité est efficace, mais parce que ceux qui paient pour l'espace publicitaire pensent qu'elle est efficace. Le meilleur vendeur dans cette histoire c'est celui qui te vend de la publicité, pas celui qui te vend ce que présente la publicité.

  • [^] # Re: Pléonasme

    Posté par  . En réponse au lien Pétition contre le passe sanitaire ET pour la vaccination. Évalué à 1.

    si la mobilisation aux centres de vaccination n'avait pas faibli

    Elle a faibli ? Sur VaccinTracker, je vois un plateau depuis début juin. Au rythme actuel, on aura vacciné tout le monde cet automne, ce qui me semble assez bon en fait.

  • # shared_ptr

    Posté par  . En réponse au journal Alignement chaotic neutre. Évalué à 2.

    Tu peux t'attendre au même genre de problème avec std::shared_ptr puisque s'il est créé avec std::make_shared ou std::allocate_shared, la mémoire pour les données propres au pointeur partagé et celle pour l'objet lui-même sont généralement allouées en un seul bloc. C'est en fait un fonctionnement assez proches des std::string copy-on-write puisque la mémoire était aussi partagée (jusqu'à la première écriture).

  • [^] # Re: Ed(1)

    Posté par  . En réponse à la dépêche LSP (Language Server Protocol). Évalué à 2.

    Tu installe quoi pour l'un comme pour l'autre ? Je n'ai pas ed

    Étrange, c'est souvent dans le système de base. Sur Fedora, c'est le paquet ed.

    ex chez moi pointe sur vim et c'est juste vim lancé en mode ex par défaut

    Normal, ex c'est vi et, de nos jours, vi c'est vim.

    Je ne me souviens plus de ed, mais quel est l'intérêt de ex ?

    À éditer des textes sans s'encombrer de fonctionnalités inutiles comme voir le texte qu'on est en train d'éditer.

  • [^] # Re: et avec les fold-expressions ?

    Posté par  . En réponse au journal Constexpr versus template. Évalué à 3.

    Je tente un petit benchmark vite fait, et au passage je compare aussi variable template vs. fonction.

    #include <utility>
    
    #ifdef USE_TEMPLATE
    template <int N>
    constexpr int count = [](){
        int s = 0;
        for (int i = 1; i <= N; ++i)
            s += i;
        return s;
    }();
    #define COUNT(n) count<n>
    #elif USE_FUNCTION
    constexpr int count(int n) {
        int s = 0;
        for (int i = 1; i <= n; ++i)
            s += i;
        return s;
    }
    #define COUNT(n) count(n)
    #elif USE_FOLD
    template <typename T>
    struct count_impl;
    
    template <int... Ints>
    struct count_impl<std::integer_sequence<int, Ints...>>
    {
        static constexpr int value = (0 + ... + Ints);
    };
    
    template <int N>
    constexpr int count = count_impl<std::make_integer_sequence<int, N+1>>::value;
    
    #define COUNT(n) count<n>
    #endif
    
    int main() {
        { int array[COUNT(1)]; }
        // ...
    }

    Je crée des tableaux de taille COUNT(1) jusqu'à COUNT(800), puis 1000 de plus avec COUNT(100). J'utilise g++ 11.0.1 et clang++ 12.0.0. Les temps sont des moyennes pifométriques calculées après quelques essais.

    • g++: TEMPLATE → 530ms, FUNCTION → 450ms, FOLD → 15s
    • clang++: TEMPLATE → 540ms, FUNCTION → 600ms, FOLD → instantiating fold expression with 257 arguments exceeded expression nesting limit of 256

    Ce genre d'utilisations de fold expressions est clairement une mauvaise idée. Entre variable et fonction, la différence est moins nette et dépend du compilateur, donc pas de vainqueur.

  • [^] # Re: et avec les fold-expressions ?

    Posté par  . En réponse au journal Constexpr versus template. Évalué à 4.

    Comme l'a fait remarquer SChauveau, les fold-expressions utilisent des packs. Il faut donc en créer un, par exemple avec make_integer_sequence :

    template <typename T>
    struct count_impl;
    
    template <int... Ints>
    struct count_impl<std::integer_sequence<int, Ints...>>
    {
        static constexpr int value = (0 + ... + Ints); 
    };
    
    template <int N>
    constexpr int count = count_impl<std::make_integer_sequence<int, N+1>>::value;

    Mais ça utilise des templates avec plein de paramètres, sûrement très lourds. Alors qu'on pourrait simplement utiliser une boucle for.

    template <int N>
    constexpr int count = [](){
        int s = 0;
        for (int i = 1; i <= N; i++)
            s += i;
        return s;
    }();

    Mais je n'ai pas fait de benchmarks pour comparer, peut-être que je me trompe.

  • [^] # Re: question naïve

    Posté par  . En réponse au journal Battle royal et adolescence…. Évalué à 1.

    Donc sur PC, seulement Windows 10. Je veux dire que c'est très relatifs, selon quelles plateformes comptent le plus pour toi. Et, personnellement, pour un jeu comme Minecraft, je n'imagine pas y jouer sur autre chose que PC (clavier/souris).

  • [^] # Re: question naïve

    Posté par  . En réponse au journal Battle royal et adolescence…. Évalué à 9.

    Là je suis curieux, parce que quand tu vas sur le site de Minecraft, il est explicitement mentionné que la version Java (celle qui tourne sous Linux & Mac, mais tout de même dispo sous Windows) te met dans un monde isolé de toutes les autres plateformes, avec des restrictions comparé au multi-plateformes (pas de mini-jeux, par exemple).

    C'est le contraire, c'est la version Windows 10 qui te met dans un monde isolé de toutes les autres plateformes (tu ne peux pas jouer avec ceux sous Linux/Mac/vieux Windows).

    Méfie-toi de la façon dont c'est présenté, Microsoft veut mettre en avant sa version la plus verrouillée.

  • [^] # Re: pas tout seul

    Posté par  . En réponse au journal Nostalgie d'Internet des années 2000.. Évalué à 2.

    Si tu veux aider un projet de RPG à s'améliorer, OpenMW essaie de créer une suite d'exemple. Ce projet à réimplémenté le moteur d'elder scroll III, et est déjà bien meilleur que l'original sur pas mal de points (je suppose qu'il en reste ou il est au maximum equivalent…) notamment graphiques.
    Ils ont également un éditeur de carte de leur cru, qui semble nécessiter encore du travail mais être utilisable (mieux que l'original? Pas sûr), et avec lequel il est prévu de faire cette fameuse suite d'exemple.
    Je n'ai aucun doute que personne n'aura rien contre transformer une telle suite d'exemple en jeu complet, il faut "juste" faire le taf. En attendant, openmw est un bon moyen de jouer à morrowind, en y mettant au passage le contenu de tamriel rebuilt, si la licence des fichiers de jeu ne te dérange pas trop.

    Le moteur de jeu lui-même est largement supérieur au moteur original. C'est par rapport à MGE XE qu'il y a des retards graphiques (post-traitements et, à mon goût, la qualité des effets atmosphériques mais ce dernier est peut-être déjà faisable en modifiant les shaders). Le gros retard d'OpenMW est surtout sur l'éditeur de niveau, qui n'est pas complet. En particulier, il manque un éditeur de dialogue (à moins que ça n'ait été ajouté très récemment).

    Mais que l'état de l'éditeur ne décourage pas ceux qui voudrait créer un RPG libre avec OpenMW, il y a suffisamment de travail d'écriture et de créations d'assets avec ce genre de projet pour être occupé jusqu'à ce que l'éditeur soit complet (mais c'est peut-être justement l'ampleur de ce travail qui décourage beaucoup de libristes).

  • [^] # Re: Beaucoup de "solutions"

    Posté par  . En réponse au journal Jouer à distance avec du logiciel libre. Évalué à 1.

    Steam Link, ce n'est ni payant, ni du cloud. Tu utilises ton propre ordinateur pour lancer le jeu. Mais c'est proprio et nécessite un compte en ligne.

  • # VirtualGL

    Posté par  . En réponse au journal Jouer à distance avec du logiciel libre. Évalué à 5.

    https://www.virtualgl.org/

    C'est du X11 à distance mais le rendu 3D est effectué sur le serveur puis envoyé au client sous forme d'images.

  • [^] # Re: La part des choses...

    Posté par  . En réponse au journal Ados et réseaux sociaux. Évalué à 3.

    Mais si on a un pseudo, c'est plus comme faire un tag sur un mur quelconque. Les passants peuvent le lire mais ne savent pas qui est vraiment l'auteur (à part celui qui a accès à la caméra de surveillance qui t'a filmé en train de taguer : l'admin du site/service).

  • [^] # Re: Mainteneurs

    Posté par  . En réponse au lien Trouver facilement un téléphone compatible avec LineageOS. Évalué à 4.

    Il faut comparer ça à la version d'Android pour le même matériel qui a sûrement 0 mainteneurs.

  • [^] # Re: Fichier mp3 bien « taggé » mais toujours galère à récupérer

    Posté par  . En réponse au lien [Matinale France Culture] Pourquoi les logiciels libres intéressent-ils les Etats ?. Évalué à 1.

    Je m'étais fait un script greasemonkey mais il a cassé. Je l'ai réparé, c'est un peu moche, mais ça marche au moins (pour l'instant) :

    // ==UserScript==
    // @name     Radio france podcast download links
    // @version  1
    // @grant    none
    // @include  https://www.franceculture.fr/*
    // ==/UserScript==
    
    var buttons = document.getElementsByClassName("replay-button");
    for (var i = 0; i < buttons.length; ++i) {
      var download = document.createElement("a");
      download.href = buttons[i].getAttribute("data-url");
      download.text = "Télécharger";
      download.classList.add("duration");
      buttons[i].appendChild(download);
    }
  • [^] # Re: Moui

    Posté par  . En réponse au journal Toujours plus proche du Python avec C++. Évalué à 2.

    Comment passer des paramètres par adresse ?

    J'imagine que reference_wrapper doit passer.

    foo("p"_kw=std::ref(p));
  • [^] # Re: Littéraux non-standard

    Posté par  . En réponse au journal Toujours plus proche du Python avec C++. Évalué à 4.

    J'ai tenté un bricolage en C++20 : https://gcc.godbolt.org/z/MxExbc

    Ça semble possible avec la nouvelle syntaxe mais je ne garantie pas le qualité de ce que j'ai écrit. Ça marche avec GCC et clang, mais MSVC ne semble pas encore supporter la nouvelle syntaxe. Donc en pratique, pour l'instant, c'est pas mieux que l'extension GNU mais ça pourrait être le futur.

  • # Littéraux non-standard

    Posté par  . En réponse au journal Toujours plus proche du Python avec C++. Évalué à 2.

    Il me semble que la syntaxe des littéraux que tu utilises pour _kw est une extension GNU et pas du C++14 standard.

    Je me souviens avoir essayé de créer des littéraux du même genre (chaîne dans un type) et de ne rien avoir trouvé de pratique et standard. Peut-être que C++20 améliore ça, je ne connais pas encore très bien.

  • # LanguageClient

    Posté par  . En réponse au journal Transformer vim en IDE avec LSP et DAP. Évalué à 6.

    J'ai pas essayé coc, ça a l'air un peu trop gros pour moi. Pour pouvoir utiliser LSP, j'ai installé LanguageClient-neovim. Il y a juste à lui dire quel serveur utiliser pour chaque langage, pas besoin d'installer nodejs.