SChauveau a écrit 389 commentaires

  • # Même pas étonné.

    Posté par  . En réponse au journal Avoir l'alarme à l'oeil. Évalué à 10. Dernière modification le 25 septembre 2023 à 14:52.

    J'ai acheté un petit NAS fin juin. J'aurai probablement du faire comme tout le monde et prendre un Synology ou un QNAP mais je me suis finalement décidé pour un outsider ; appelons le Dellzeus.

    J'ai reçu la bête le 28 juin et le 10 juillet j'avais déjà soumis 7 tickets et plusieurs emails à l'équipe «security» de Dellzeus. Je ne vais pas donner trop de détails car tout n'est pas résolu mais par exemple mon premier ticket contenait le commentaire suivant "Folder encryption can be broken with a paper clip!".

    La première réponse à mon 1er ticket, donc celui concernant le chiffrage des dossiers, contenait «Notre OS n'est pas une solution Linux complète. Il n'est possible d'utiliser toutes les mêmes commandes et de raisonner entièrement comme sur Linux. Nous utilisons busybox.» C'est cela oui … Le ton avait légèrement changé après une semaine d'échanges. La réponse à mon dernier ticket juste avant que le support ne me demander de contacter directement l'équipe security était «Énorme merci à vous. je vais voir avec notre CEO ce qu'on peut faire».

    L'impression que tout cela ma laissé est qu'ils ont utilisé Linux pour leur NAS mais que leurs développeurs n'y comprennent pas grand chose. C'est un NAS quand même! Par exemple, une des failles corrigées récemment concernait le dossier /dev dans lequel TOUT les fichiers devices était rwxrwxrwx. Si si c'est possible. Je n'en croyais pas mes yeux. Plus généralement, il y avait, et il y a encore, de nombreux fichiers et dossiers systèmes accessibles en écriture pour tous. C'est de loin la pire machine Linux que j'ai pu rencontrer (pire que le mini NAS acheté au début des années 2000 avec un port telnet non désactivable et sans mot de passe root. J'ai pas de bol avec mes NAS!).

    Autant dire que pour le moment, je ne met rien de critique sur ce NAS.

  • # Le 404 ne me dérange pas ...

    Posté par  . En réponse au journal Pourquoi la page 404 ne peut être trouvée. Évalué à 10.

    Le 404 «Not Found» ne me dérange pas car je n'arrête pas d'égarer des trucs.

    Par contre, je n'en dirais pas autant de ces autres codes d'erreur HTTP:

    • 402 «Payment Required» … tu peux te brosser!
    • 406 «Not Acceptable» … c'est pas un simple serveur web qui a juger mes actions.
    • 410 «Gone» … repose en paix.
    • 418 «I’m a teapot» … pardon?
    • 425 «Too Early» … on croirait entendre ma copine.
    • 451 «Unavailable For Legal Reasons» … dois je appeler mon avocat?
    • 444 «No Response» … et ça c'est pas une réponse peut être?
    • 527 «Railgun Error» … et pourquoi pas un sabre laser tant qu'on y est?
  • [^] # Re: sans tricher

    Posté par  . En réponse au journal Perles de C. Évalué à 3.

    Si je ne dit pas de bêtises, en C, les paramètres des fonctions n'ont pas besoin d'être déclarés dans les pointeurs sur les fonctions.

    C'est en effet possible avec une liste de paramètres vides '()' mais ici le '(void)' implique une fonction sans aucuns paramètres.

    *d[2] = {&a} : tableau d (2 éléments) de pointeurs int initialisés avec l'adresse a qui est indéfinie à ce stade.

    Le premier élément de d est effectivement initialisé avec l'adresse de a mais le second est initialisé à 0.

    elle est indéfinie mais représente la première variable locale si on est dans le corps d'une fonction. Du coup indirectement on peut modifier la valeur du pointeur "b" qui est déclaré constant par exemple comme cela

    En fait, non. Le compilateur n'a aucune obligation de conserver l'ordre des variables locales ou globales. Pour les variables locales (ou static), il n'est même pas obligé de leur affecter une adresse sauf si cette adresse est utilisée dans le code (par exemple avec &b). En pratique, la variable b peut très bien exister dans un registre ou ne pas exister du tout. Pour les variables globales, la situation est encore plus complexe car les elles sont typiquement rangées dans des zone mémoires différentes en fonction de leur nature (read-only, read-write, initialisé avec des 0, …). Le compilateur peut aussi décider de réordonner les variables pour diverses raisons (alignements, tailles, optimisations, …)

  • [^] # Re: Formats non destructifs indispensables

    Posté par  . En réponse à la dépêche Des formats d'image. Évalué à 2.

    Il ne faut pas oublier que TIFF signifie "Thousands of Incompatible File Format" :-)
    Plus sérieusement, c'est «Tag Image File Format» mais sa «plâtrée d'options» n'a probablemnt pas aidé à faire accepter le format auprès du grand public. Entre les tags baseline, les tags d'extension et les tags propriétaires, c'est un peu la jungle non?

    Dans le même genre mais encore plus spécialisé, il y a FITS «Flexible Image Transport System», un format d'image très utilisé en astronomie. Il permet de stocker des informations très diverses comme des spectres lumineux ou des images non RBG (infrarouge, rayons-X, …)

  • # Les caches d'instructions sont parfois capricieux

    Posté par  . En réponse au journal Prise de poids et perte de perf. Évalué à 9. Dernière modification le 23 juillet 2023 à 12:15.

    Chose étonnante, j'observe cette perte quand mon binaire passe de 12,1 Mo à 12,6 Mo (tailles obtenues en activant LTO), mais pas de perte en passant de 13,2 à 13,7 Mo (tailles obtenues en désactivant LTO). Cette énigme restera de côté pour l'instant.

    Pour comprendre cela il faut peut être se pencher sur les détails techniques des caches d'instructions.

    Considérons par exemple le processeur Intel Core i7-12700F.

    https://www.cpu-world.com/CPUs/Core_i7/Intel-Core%20i7%20i7-12700F.html

    Cette page nous indique que dans le "CPU core complex #1 - Performance cores", les 8 cores disposent de 8 caches L1 de taille 32 KB pour les instructions. Je suppose que chaque core a son propre cache. De plus le petit bouton triangulaire sur la droite indique aussi que "The level 1 instruction cache is an 8-way set associative cache with a line size of 64 bytes".

    J'en déduis donc que chaque cache d'instruction de 32KB gère 32KB/64B = 512 lignes de caches organisée en 64 groupes (=512/8) de 8.

    Maintenant, considérons un programme donc la partie critique du code fait 30KB. Il n'a donc besoin que de 480 lignes de caches (=30KB/64B) pour s'exécuter à pleine vitesse . A priori, cela doit tenir et chacun des 64 groupes devra traiter 480/64 = 7.5 lignes donc moins de 8. Malheureusement, ce n'est qu'une moyenne.

    Si tout se passe bien, certains groupes auront 7 lignes et d'autres 8 lignes.

    Par contre, avec de la malchance, on peut se retrouver avec des groupes nécessitants 9 ou même 10 lignes alors que d'autres seront à seulement 5 ou 6. Le hit ratio va alors s'effondrer dans les groupes traitants plus de 8 lignes.

    Il y a une quinzaine d'année, je me rappelle avoir été confronté à un problème de ce genre dans un code Fortran. Après l'avoir optimisé au petits-oignons, je décide de changer l'ordre de 2 fonctions dans un fichier parce que .. c'était plus joli comme cela. L'ordre des appels de fonctions ne changeant pas, j'ai été très surpris de constater une dégradation notable de la vitesse d'exécution. J'ai vérifié au niveau des binaires et la seule différence était l'ordre relatif des 2 fonctions en mémoire. Tout le reste était absolument identique au bit près. Les données de profiling ont confirmé qu'en intervertissant les 2 fonctions, j'avais modifié la distribution du code dans les lignes de caches. J'ai restauré l'ordre initial pour récupérer mes perfs et atteindre mon objectif.

    En pratique, il n'y a pas grand chose à faire quand ce genre de chose arrive. Ce n'est pas vraiment contrôlable à moins de tout programmer en assembleur pour un modèle spécifique de processeur.

    
    
  • # Dans le pays plat ...

    Posté par  . En réponse au journal Ils sont devenu fous. Évalué à 9.

    Quand je vivais aux Pays-Bas entre 2000 et 2007, ma banque (ABN-AMRO) fournissait un petit lecteur de carte à puces ressemblant à une petite calculatrice de poche.

    La banque envoyait un code à 4 (ou 6?) chiffres qu'il fallait saisir sur le lecteur avec le code secret de la carte. L'appareil fournissait alors un code unique permettant de s'identifier.

    https://nl.wikipedia.org/wiki/E.dentifier

    J'avais le modèle vert sur la photo de la page wiki.

    Le lecteur était vraiment basique et ne coûtait probablement que quelques euros à fabriquer.

  • [^] # Re: J'en parlerai à mon labrador

    Posté par  . En réponse au journal Où il est question de machines libérées. Évalué à 7.

    Demain les chiens pourront nous comprendre grâce à ChatGPT, ou plutôt ChienGPT.

  • [^] # Re: J'ai également lu l'étude

    Posté par  . En réponse au journal C'était en 2020. Évalué à 5.

    PCR consiste à dupliquer l'ADN/ARM plusieurs fois pour amplifier la présence du virus.

    J'imagine que les valeurs numériques indiquent le nombre de cycles effectués avant la détection. Si c'est le cas, NEG ne signifie pas zéro mais probablement que le virus n'a pas été détecté après avoir atteint le nombre maximum de cycles (35? 40? j'imagine qu'il y a des standards).

    Au final, je n'ai pas l'expertise pour savoir si la différence entre les nombres et POS est significative. Ce qui me gêne vraiment, c'est que cela semble indiquer que les tests ont été effectués avec des procédures différentes donc probablement par des équipes différentes, sur des machines différentes et dans des lieux différents.

  • # J'ai également lu l'étude

    Posté par  . En réponse au journal C'était en 2020. Évalué à 10.

    Je ne suis pas médecin mais à l'époque j'avais également essayé de lire l'étude. J'ai un doctorat en informatique et j'ai travaillé pendant une vingtaine d'année sur divers projets en lien avec la recherche. Je suis donc assez familiarisé avec les articles scientifiques même si je dois avouer que le jargon médical m'a causé quelques soucis dans le cas présent.

    Je retrouve dans ton analyse certains des points qui m'avaient fait tiquer ; en particulier la petite taille de l'étude, le fait que le groupe contrôle soit dans des hôpitaux (et même des villes) différents et le manque de détails sur la procédure de sélection des patients.

    L'article que j'avais lu contenais aussi une table supplémentaire avec des information détaillées par patient. Je viens de la retrouver page 22 de ce pre-print https://www.medrxiv.org/content/10.1101/2020.03.16.20037135v1.full.pdf

    Dans cette table on voit que 4 des 16 patients du contrôle sont des mineurs asymptomatiques (10, 10, 12 et 14 ans). Ils me semblent difficilement comparables aux autre patients. Cela me fait donc dire que la taille utile du groupe de contrôle est plutôt 12 que 16.

    Un autre détail qui m'avait fait tiquer est le fait que pour 10 des 12 contrôles, les résultats PCR ne sont donnés qu'un jour sur deux (ND = not done) et simplement avec POS (positive). Pour les patients traités à hydroxychloroquine, les test PCR sont réalisés tout les jours et les résultat sont des valeur numériques (ou NEG qui signifie probablement 0). Ce n'est peut être pas significatif mais cela m'avait vraiment donné une impression d'inégalité dans le suivi des patients.

  • [^] # Re: Utilisation

    Posté par  . En réponse au journal SIGUSR1, SIGUSR2,..., SIGUSR_N ?. Évalué à 6.

    Afficher les stats lors de la copie d'une ISO avec dd : Sending a USR1 signal to a running 'dd' process makes it print I/O statistics to standard error and then resume copying.

  • [^] # Re: nullptr

    Posté par  . En réponse à la dépêche Nouveautés du langage C dans sa prochaine version C23. Évalué à 1. Dernière modification le 06 février 2023 à 11:52.

    Pas besoin d'aller chercher un exemple avec des fonctions variadiques puisque C++ permet l'overloading. Une macro NULL définie comme un entier ou comme un void* serait difficile à utiliser de façon consistante.

    #include <iostream>
    #include <cstdlib>
    
    void func(int x) { std::cout << "integer\n"; }
    void func(long x) { std::cout << "long\n"; }
    void func(long long x) { std::cout << "long long\n"; }
    void func(void*x) { std::cout << "void pointer\n"; }
    void func(int*x) { std::cout << "int pointer\n"; }
    void func(std::nullptr_t x) { std::cout << "nullptr\n"; }
    template <typename T> void func(T *x) { std::cout << "template pointer " << x << "\n"; }
    
    int main(void) {
      func(0);
      func(0l);
      func(0ll);
      func((void*)0);
      func((int*)0);
      func(nullptr);
      func(NULL);
      return 0;
    }
    
    

    Dans g++, NULL est une constante interne __null avec un type indéfini qui est probablement proche de long. G++ appelle donc la version 'long' pour func(NULL) avec toutefois un joli warning car il sait que ce n'est probablement pas ce que souhaite l'utilisateur.

    nullptr a son propre type nullptr_t avec ses propres règles de résolution pour affiner les règles de résolutions. Il est compatible avec tout les pointeurs mais uniquement quand il n'y a pas d'ambiguité. Dans exemple, func(nullptr) ne peut appeler func(void *) ou func(int *) que si une seule des deux fonctions est présente. Par contre 'nullptr_t' n'est pas compatible avec les types template 'T*' et les types entiers.

  • # Journal officiel

    Posté par  . En réponse au journal Piéger les démarcheurs abusifs. Évalué à 3.

    La loi interdisant le démarchage a été votée le 8 décembre. En pratique, cela signifie que le démarchage n'est pas encore illégal. Il reste une dernière étape ; la publication au journal officiel qui devrait prendre quelques semaines.

  • [^] # Re: ÉDIT

    Posté par  . En réponse au journal Retour sur Wayland Raspberry Pi OS. Évalué à 3. Dernière modification le 09 novembre 2022 à 22:21.

    c'est que l'implémentation qu'a choisi les developpeurs de raspi-os en a (j'ignore laquelle c'est)

    A priori c'est basé sur Mutter, le compositeur de Gnome.

  • # Mutter

    Posté par  . En réponse au journal Retour sur Wayland Raspberry Pi OS. Évalué à 3.

    Lu dans https://blog.desdelinux.net/en/raspberry-pi-os-2022-04-04-llega-con-soporte-inicial-de-wayland-mejoras-en-el-asistente-de-configuracion-y-mas/

    «In this new update experimental support for working with the Wayland protocol has been added to the graphics session. The use of Wayland was made possible by the transition of last year's PIXEL environment from the openbox window manager to mutter.»

    Sauf erreur de ma part, PIXEL, le desktop par défaut du Rapberry Pi OS était basé sur Openbox+LXDE. Ils ont donc remplacés OpenBox par Mutter qui sert à la fois de window-manager X11 et de compositeur Wayland dans le projet Gnome.

    Les application LXDE sont normalement en GTK-2 et ne sont donc pas compatible Wayland (sauf à utiliser XWayland). Peut être utilisent ils la version expérimental en GTK-3 https://archlinux.org/groups/x86_64/lxde-gtk3/ pour avoir des application wayland natives.

    Pour corriger les fonctionnalités qui ne fonctionnent pas, il me semble donc logique de se tourner en priorité vers la longue liste de desktops Wayland utilisant Mutter : donc Gnome … et puis … hemmmm … c'est tout je crois.

    Certains applications du monde 'wlroot/sway' fonctionnent avec Mutter mais cela dépend des protocoles utilisés.

    Franchement, je ne comprend pas pourquoi la Raspberry Pi Foundation s'est mis en tête de gérer leur propre desktop. Les environnements légers, ce n'est pas ce qui manque sous Linux.

  • [^] # Re: Eau chaude, eau froide, eau mitigée

    Posté par  . En réponse au journal économie d'electricité. Évalué à 0.

    Il faudrait plutôt des solutions intermédiaire. Par exemple, un petit ballon de 20 ou 30 litres qui ne se remplirait qu'en fonction des besoins.
    Personnellement, cela ne me dérangerait pas d'avoir à appuyer sur un bouton 5 minutes avant de faire la vaisselle ou une demi-heure avant de prendre ma douche. Cela permettrait aussi de limiter la consommation.

  • [^] # Re: Ballon d'eau chaude

    Posté par  . En réponse au journal économie d'electricité. Évalué à 6.

    Concernant le ballon d'eau chaude, il ne faut pas oublier que les déperditions de chaleurs chauffent la pièce. Si ton ballon se trouve dans une pièce habitée (typiquement la cuisine ou la salle de bain), je considère qu'il ne donc faut pas trop se soucier d'optimiser pendant l'hiver en particulier si ton chauffage est principalement électrique.

    Cette remarque est applicable à tout les appareils électriques. Il ne sert à rien de débrancher les appareils pendant la nuit si tu laisses un radiateur électrique branché.

  • [^] # Re: Suite de fibonacci en bash:

    Posté par  . En réponse à la dépêche Bash 5 : une introduction . Évalué à 5.

    Et une petite rectification: n++/94 n'est pas équivalent à n=n+1, n/94 mais à n/94, n=n+1

  • [^] # Re: Suite de fibonacci en bash:

    Posté par  . En réponse à la dépêche Bash 5 : une introduction . Évalué à 10. Dernière modification le 05 août 2022 à 20:30.

    Amusant. Bien que pratiquant le Bash fréquemment, je dois avouer avoir dû consulter le man pour le comprendre.

    SPOILER ALERT:

    a est donc un tableau contenant 4 éléments.
    a[0] --> 'a[a[n]=a[n-1]+a[n-2],n++/94]'
    a[1] --> 2
    a[2] --> 0
    a[3] --> 1

    Pour un tableau X, la syntaxe ${X[@]:i} permet d'obtenir les éléments à partir de l'indice i soit X[i] X[i+1] ...

    Ici, i correspond à l'expression n=4,a qui est alors évaluée en mode ARITHMETIQUE.

    Comme en C, l'opérateur , permet d'évaluer plusieurs expressions et retourne la valeur de la dernière. Ici, on a donc n=4 puis le résultat final a.

    Or, en Bash, une référence simple à un tableau retourne son premier élément.

    L'indice 'i' est donc équivalent à

    i --> n=4, a[a[n]=a[n-1]+a[n-2],n++/94]

    Comme n++/94 est équivalent à n=n+1, n/94 on a donc

    a[0] --> a[a[n]=a[n-1]+a[n-2],n++/94]

    a[0] --> a[a[n]=a[n-1]+a[n-2],n=n+1,n/94]

    a[0] --> a[n]=a[n-1]+a[n-2], n=n+1, a[n/94]

    Et l'indice i est donc évalué comme

    i --> n=4, a[n]=a[n-1]+a[n-2], n=n+1, a[n/94]
    i --> n=4, a[4]=a[3]+a[2], n=5, a[5/94]
    i --> n=4, a[4]=a[3]+a[2], n=5, a[0]

    On remplace alors a[0] par sa valeur pour obtenir

    i --> n=4, a[4]=a[3]+a[2], n=5, a[n]=a[n-1]+a[n-2], n=n+1, a[n/94]
    i --> n=4, a[4]=a[3]+a[2], n=5, a[5]=a[4]+a[3], n=6, a[6/94]
    i --> n=4, a[4]=a[3]+a[2], n=5, a[5]=a[4]+a[3], n=6, a[0]

    Le même processus récursif se poursuit jusqu'à ce que n soit égal à 94 et donc que a[n/94] devienne a[1].

    L'indice i est donc évalué comme

    i --> n=4, a[4]=a[3]+a[2], n=5, a[5]=a[4]+a[3], n=6, ... , a[93]=a[92]+a[91], n=94, a[1]

    La valeur finale de l'indice i est donc a[1] = 2 et le résultat final ${a[@]:i} = a[2] a[3] ... a[93], la suite de Fibonacci.

  • [^] # Re: En attendant...

    Posté par  . En réponse au journal Une idée pour économiser 2.21 gigowatts sur la bande passante de Youtube. Évalué à 5.

    La section FORMAT SELECTION est aussi disponible ici https://github.com/yt-dlp/yt-dlp#format-selection . C'est assez compliqué mais aussi assez puissant quand on a compris.

    A noter aussi l'option -g qui permet d'obtenir l'URL du stream video, audio ou video+audio sans le télécharger immédiatement. Par exemple, je regarde rarement les vidéos sur mon ordinateur portable. En général, je copie l'URL de la page web puis je lance un petit script qui extrait l'URL du stream et l'envoi au un raspberry pi connecté à ma TV avec Kodi.

    Ainsi, la commande utilisée par mon script est yt-dlp -f 'best[height<=720]/bestvideo[height<=720]/bestaudio' -g --playlist-end 1 "$URL"

    Mon rpi ne peut pas décoder en 1024p donc l'option -f demande le meilleur flux vidéo en 720p maximum avec audio et si cela n'existe pas alors une vidéo 720p sans audio et en dernier recours un flux audio sans vidéo.

    L'option --playlist-end 1 permet de ne générer qu'un seul stream quand l'URL plusieurs vidéos.

  • [^] # Re: Upgrade

    Posté par  . En réponse au journal Firefox, il m'énerve. Évalué à 1.

    Ubuntu? Si c'est le cas alors apt remove unattended-upgrades

  • [^] # Re: moi ce qui m'énerve...

    Posté par  . En réponse au journal Firefox, il m'énerve. Évalué à 1.

    Je doute que Firefox sur Ubuntu se mette à jour de lui même car cela n'est normalement possible que si Firefox a été installé manuellement par l'utilisateur (donc pas par un package de l'OS).
    Sauf erreur de ma part, les mises à jour automatiques dans Ubuntu sont causées par le package unattended-upgrades. Cela m'avait causé bien des soucis avec mon Raspberry Pi. J'avais bidouillé le boot-loader et unattended-upgrades rendait régulièrement mon Pi unbootable en relançant grub-config.

  • [^] # Re: taper une adresse ne passe normalement pas par le moteur de recherche

    Posté par  . En réponse au journal Firefox, il m'énerve. Évalué à 1.

    J'ai Firefox 102 et cela ne le fait pas. Je viens de faire de nombreux essais, y compris avec des phrases complètes, et il fait toujours une recherche par domaine.
    Il doit y avoir quelque chose de différent dans ma config.

  • [^] # Re: Perso j'ai un peu de mal ...

    Posté par  . En réponse au journal Uxn : un langage assembleur axé sur la frugalité. Évalué à 3.

    Je pense qu'il ne faux pas y chercher une véritable utilité. Au pire, c'est un projet un peu farfelu et au mieux c'est éducatif pour ceux qui voudraient apprendre à développer un écosystème atypique.

    Ou alors c'est une cabale judéo-maçonnique pour détrôner MultiDeskOS.

  • [^] # Re: Fausse Bonne Idée ?

    Posté par  . En réponse au journal Un nouveau message pour les extra-terrestres. Évalué à 6.

  • [^] # Re: Noms de domaines

    Posté par  . En réponse au journal Quand la DGFiP (les impôts) donne des conseils de sécurité.... Évalué à 3.

    Ameli, c'est l'assurance maladie donc un service public:
    https://www.service-public.fr/particuliers/vosdroits/R3049

    En fait, ta remarque illustre bien le problème. Il n'est pas toujours facile de classer les «services publics» dans de jolis petits groupes bien délimités.

    Par exemple, il y a 100 ans La Poste était clairement un service public et une administration. De fait, jusqu'à la fin des années 90, il existait un ministres des postes et communications dans le gouvernement.

    Aujourd'hui, La Poste est une société anonyme française détenue en majorité par l'État Français. Est ce encore un service public? une administration? Cela se plaide mais la réponse est loin d'être simple.