Anthony Jaguenaud a écrit 1958 commentaires

  • [^] # Re: une solution ?

    Posté par  . En réponse au message renommage de fichiers en masse. Évalué à 3.

    Tu as oublié de traiter le cas :

    int ret = iconv(conv, &pin, &ol, &pout, &dl);
    $ man 3 iconv
    ICONV(3)                                                                                                                       Linux Programmer's Manual                                                                                                                      ICONV(3)
    
    NAME
           iconv - perform character set conversion
    
    SYNOPSIS
           #include <iconv.h>
    
           size_t iconv(iconv_t cd,
                        char **inbuf, size_t *inbytesleft,
                        char **outbuf, size_t *outbytesleft);
    
    DESCRIPTION
           The  iconv()  function converts a sequence of characters in one character encoding to a sequence of characters in another character encoding.  The cd argument is a conversion descriptor, previously created by a call to iconv_open(3); the conversion descriptor defines the
           character encodings that iconv() uses for the conversion.  The inbuf argument is the address of a variable that points to the first character of the input sequence; inbytesleft indicates the number of bytes in that buffer.  The outbuf argument is the address of  a  vari‐
           able that points to the first byte available in the output buffer; outbytesleft indicates the number of bytes available in the output buffer.
    
           The  main  case  is  when inbuf is not NULL and *inbuf is not NULL.  In this case, the iconv() function converts the multibyte sequence starting at *inbuf to a multibyte sequence starting at *outbuf.  At most *inbytesleft bytes, starting at *inbuf, will be read.  At most
           *outbytesleft bytes, starting at *outbuf, will be written.
    
           The iconv() function converts one multibyte character at a time, and for each character conversion it increments *inbuf and decrements *inbytesleft by the number of converted input bytes, it increments *outbuf and decrements *outbytesleft by the number of converted  out‐
           put  bytes,  and  it  updates the conversion state contained in cd.  If the character encoding of the input is stateful, the iconv() function can also convert a sequence of input bytes to an update to the conversion state without producing any output bytes; such input is
           called a shift sequence.  The conversion can stop for four reasons:
    
           1. An invalid multibyte sequence is encountered in the input.  In this case, it sets errno to EILSEQ and returns (size_t) -1.  *inbuf is left pointing to the beginning of the invalid multibyte sequence.
    
           2. The input byte sequence has been entirely converted, that is, *inbytesleft has gone down to 0.  In this case, iconv() returns the number of nonreversible conversions performed during this call.
    
           3. An incomplete multibyte sequence is encountered in the input, and the input byte sequence terminates after it.  In this case, it sets errno to EINVAL and returns (size_t) -1.  *inbuf is left pointing to the beginning of the incomplete multibyte sequence.
    
           4. The output buffer has no more room for the next converted character.  In this case, it sets errno to E2BIG and returns (size_t) -1.
    
           A different case is when inbuf is NULL or *inbuf is NULL, but outbuf is not NULL and *outbuf is not NULL.  In this case, the iconv() function attempts to set cd's conversion state to the initial state and store a corresponding shift sequence at *outbuf.   At  most  *out‐
           bytesleft bytes, starting at *outbuf, will be written.  If the output buffer has no more room for this reset sequence, it sets errno to E2BIG and returns (size_t) -1.  Otherwise, it increments *outbuf and decrements *outbytesleft by the number of bytes written.
    
           A third case is when inbuf is NULL or *inbuf is NULL, and outbuf is NULL or *outbuf is NULL.  In this case, the iconv() function sets cd's conversion state to the initial state.
    
    RETURN VALUE
           The iconv() function returns the number of characters converted in a nonreversible way during this call; reversible conversions are not counted.  In case of error, it sets errno and returns (size_t) -1.
    
    ERRORS
           The following errors can occur, among others:
    
           E2BIG  There is not sufficient room at *outbuf.
    
           EILSEQ An invalid multibyte sequence has been encountered in the input.
    
           EINVAL An incomplete multibyte sequence has been encountered in the input.
    
    VERSIONS
           This function is available in glibc since version 2.1.
    
    ATTRIBUTES
           For an explanation of the terms used in this section, see attributes(7).
    
           ┌──────────┬───────────────┬─────────────────┐
           │Interface │ Attribute     │ Value           │
           ├──────────┼───────────────┼─────────────────┤
           │iconv()   │ Thread safety │ MT-Safe race:cd │
           └──────────┴───────────────┴─────────────────┘
           The iconv() function is MT-Safe, as long as callers arrange for mutual exclusion on the cd argument.
    
    CONFORMING TO
           POSIX.1-2001, POSIX.1-2008.
    
    NOTES
           In each series of calls to iconv(), the last should be one with inbuf or *inbuf equal to NULL, in order to flush out any partially converted input.
    
           Although  inbuf  and  outbuf are typed as char **, this does not mean that the objects they point can be interpreted as C strings or as arrays of characters: the interpretation of character byte sequences is handled internally by the conversion functions.  In some encod‐
           ings, a zero byte may be a valid part of a multibyte character.
    
           The caller of iconv() must ensure that the pointers passed to the function are suitable for accessing characters in the appropriate character set.  This includes ensuring correct alignment on platforms that have tight restrictions on alignment.
    
    SEE ALSO
           iconv_close(3), iconv_open(3), iconvconfig(8)
    
    COLOPHON
           This page is part of release 5.10 of the Linux man-pages project.  A description of the project, information about reporting bugs, and the latest version of this page, can be found at https://www.kernel.org/doc/man-pages/.
  • [^] # Re: Presque le même parcours…

    Posté par  . En réponse au journal Comparaison entre Manjaro et Debian Sid. Évalué à 2.

    Il y a vingt ans, je ne me souviens plus trop…
    RedHat -> Mandrake -> Suze -> debian (stable -> sid)(2003) -> gentoo (±14 ans) -> debian stable.

    Maintenant, debian stable est suffisant pour moi, sauf peut-être pour avoir des versions récentes de blender… Mais pour ça, j’utilise la version dans steam :-p

  • [^] # Re: Retour d'erreur ?

    Posté par  . En réponse au message renommage de fichiers en masse. Évalué à 4. Dernière modification le 23 février 2022 à 10:32.

    Quand j’ai testé le code chez moi hier soir, j’avais un retour d’erreur sur iconv. Après, c’est peut-être lié à mon terminal qui n’était peut-être pas en UTF8, mais ton programme doit toujours vérifier tous les codes de retour qui peuvent échouer.

    Quand je ne vérifie pas un code de retour volontairement, par exemple printf, je le cast :

    void exemple(char * str)
    {
        (void) printf("Str : %s\n",str);
    }

    Je sais que printf n’est pas c++, mais c’est l’exemple qui m’est venu immédiatement en tête. ;-)

  • # Retour d'erreur ?

    Posté par  . En réponse au message renommage de fichiers en masse. Évalué à 6. Dernière modification le 22 février 2022 à 22:53.

    Salut,
    Tu ne teste pas les retours de tes fonctions, c’est mal.

    man 3 iconv
    
    RETURN VALUE
    … -1 on error.
    

    Même chose pour iconv_open.
    Rajoute la gestion des erreurs, ça t’aidera à trouver ce qui cloche.

  • # Le code ?

    Posté par  . En réponse au message renommage de fichiers en masse. Évalué à 2.

    Salut,
    Tu devrais mettre le code tel que tu l’as écrit jusque là, on pourra peut-être t’aider à adapter, debugguer.

  • # Aucune option

    Posté par  . En réponse au sondage Développeur Libristes, oui ! mais macOS, Visual Studio et Azure ?. Évalué à 3.

    Salut,
    Dans mon cas, pour le boulot, le PC est sous Windows, je ne développe pas d’application libre. On m’impose Visual.

    Pour le perso, mon ordi à la maison est 100% sous Linux depuis 2003 (c’est là que je n’ai joué qu’avec une compatibilité wine), donc j’utilise emacs, vim, kdevelop ou qtcreator.

  • # S’il pouvait tenir parole…

    Posté par  . En réponse au journal Grosse déception cette semaine. Évalué à 4.

    Ce ne serait pas si mal, on pourrait créer toi-et-tes-amis.fr, ou même retrouver ses anciens copains, les copains d’avant quoi :-p

    Hélas, ils menacent, mais l’argent récolté grâce à la pub les empêchera de mettre leurs menaces à exécution.

  • [^] # Re: Le RGPD ne t'aidera pas

    Posté par  . En réponse au journal RGPD et adresse mail. Évalué à 4.

    En quoi cette complexité est elle inutile ?

  • [^] # Re: OpenCL, portabilité et performance en général

    Posté par  . En réponse à la dépêche OpenCL sous Linux : l’état des pilotes AMD est désormais pire que ce qu’il était à l’époque de fglrx. Évalué à 2.

    Ah, après vérification, je n'ai pas d'APU… </me sifflote en prenant la porte>

  • [^] # Re: OpenCL, portabilité et performance en général

    Posté par  . En réponse à la dépêche OpenCL sous Linux : l’état des pilotes AMD est désormais pire que ce qu’il était à l’époque de fglrx. Évalué à 2.

    Merci, bon il ne me détecte que ma Mi1080… il y a quelque chose à installer pour activer l'APU ?

  • [^] # Re: OpenCL, portabilité et performance en général

    Posté par  . En réponse à la dépêche OpenCL sous Linux : l’état des pilotes AMD est désormais pire que ce qu’il était à l’époque de fglrx. Évalué à 2.

    en fait personne n'utilise des GPU AMD dans mon entourage !

    Ça me fait penser à une question… sur mon ordi, j’ai un Ryzen avec un APU (sans écran), et une carte graphique Nvidia, peut-on faire de l’openCL sur l’APU ?
    Peut-on utiliser le back-end amdgpu de llvm ?

  • # Il y a une limite de temps

    Posté par  . En réponse au message Répondre à une discussion ; Aide ?. Évalué à 6.

    Pour les très vieux contenus (3 mois ?) on ne peut plus poster de commentaire.

  • # Heu…

    Posté par  . En réponse au lien How not to learn TypeScript. Évalué à 2.

    Hello,
    Si je comprends bien, c’est une ode au non-typage… Je trouve l’exemple « mistake 2 » particulièrement laid.
    Avoir trois structures avec des champs ayant le même nom et que ça marche… je comprends pourquoi certains préfère le typescript pour avoir un meilleur système de typage.

  • # setitimer

    Posté par  . En réponse au message probleme pour faire un timer précis de l'ordre de la milliseconde. Évalué à 6.

    Salut,
    Je me suis tenté une implémentation avec setitimer…

    #define _POSIX_C_SOURCE 199309L
    
    #include <stdio.h>
    //    #include <sys/timerfd.h>
        #include <errno.h>
        #include <string.h>
        #include <stdlib.h>
    //  #include <unistd.h>
        #include <sys/mman.h>
    
    //#include <time.h>
    #include <unistd.h>
    #include <threads.h>
    #include <signal.h>
    #include <sys/time.h>
    
    
        #define COUNT 10001
        #define PERIODE 1000000 //1ms (in ns)
    
    mtx_t myLock;
    void (*old_handler)(int); // sighandler_t don't work !!! :-(
    
    void alarm_callback(int sig)
    {
      // Unlock du mutex pour continuer la boucle.
      (void) mtx_unlock(&myLock);
         if ((old_handler = signal(SIGALRM, alarm_callback)) == SIG_ERR)
        {
          fprintf(stderr,"Error setting SIGALARM in alarm_callback\n");
          return ;
        }
    
    
    }
    
        int main(int argc, char const *argv[])
        {
          if (mtx_init(&myLock, mtx_plain ) ==  thrd_error)
        {
          fprintf(stderr,"Error creating mutex\n");
          return -1;
        }
    
          // Lock one time to init locked. First loop must unlock
          if (mtx_lock(&myLock) == thrd_error)
        {
          fprintf(stderr,"Error locking mutex first time\n");
          return -1;
        }
    
          if ((old_handler = signal(SIGALRM, alarm_callback)) == SIG_ERR)
        {
          fprintf(stderr,"Error setting SIGALARM\n");
          return -1;
        }
    
    
    
           struct itimerval setTimer, oldTimer;
    
           setTimer.it_interval.tv_sec = 0;
           // Warning, c’est des us.
           setTimer.it_interval.tv_usec = PERIODE / 1000;
           // First period start in 1s
           setTimer.it_value.tv_sec = 1;
           setTimer.it_value.tv_usec = 0;
           //       Timer values are defined by the following structures:
           //
           //           struct itimerval {
           //               struct timeval it_interval; /* Interval for periodic timer */
           //               struct timeval it_value;    /* Time until next expiration */
           //           };
           //
           //           struct timeval {
           //               time_t      tv_sec;         /* seconds */
           //               suseconds_t tv_usec;        /* microseconds */
           //           };
    
    
           if (setitimer(ITIMER_REAL,&setTimer, &oldTimer) == -1)
         {
           fprintf(stderr,"Setitimer initialization failed\n");
           return -1;
         }
            struct timespec now, previous;
            long somme = 0;
            long peak = PERIODE, base = PERIODE;
            long tabTimer[COUNT];
            __uint64_t ret;
    
    
            if (clock_gettime(CLOCK_MONOTONIC,&previous ) < 0 )
            {
                printf("error clock_gettime : %s\n", strerror(errno));
                return -1;
            }
    
            for (size_t i = 0; i < COUNT; i++)
          {
          // Wait for sync
            if (mtx_lock(&myLock) == thrd_error)
              {
            fprintf(stderr,"Error lock in loop number %d\n",i);
            return -1;
              }
          clock_gettime(CLOCK_MONOTONIC,&now );
                tabTimer[i] = (now.tv_sec - previous.tv_sec) * 1000000000 + now.tv_nsec - previous.tv_nsec;
                previous = now;
    
            }
    
        const long high_10 = PERIODE + PERIODE / 10;
        const long low_10 = PERIODE - PERIODE / 10;
        int higher = 0;
        int lower = 0;
        int normal = 0;
            //we write results
            for (size_t i = 1; i < COUNT; i++)
            {
          //      printf("[%2d] = %ld\n",i,tabTimer[i]);
                somme += tabTimer[i];
                if( tabTimer[i] > peak)
                {
                    peak = tabTimer[i];
                }
                if( tabTimer[i] < base)
                {
                    base = tabTimer[i];
                }
            if (tabTimer[i] > high_10)
              {
            higher++;
              }
            else if (tabTimer[i] < low_10)
              {
            lower++;
              }
            else
              {
            normal++;
              }
            }
    
        int total = lower + higher + normal;
            printf("average en ns = %ld, peak = %ld(+%2.2f%%), base = %ld(-%2.2f%%)\n", somme/(COUNT - 1), peak, (((float)peak/PERIODE) - 1) * 100, base, (1. - ((float)base)/PERIODE)*100);
        printf(" Total : %d,\n"
               "\t- lower : %6d (%2.2f%%)\n"
               "\t- normal: %6d (%2.2f%%)\n"
               "\t- higher: %6d (%2.2f%%)\n",
               total,
               lower, 100. * ((float) lower)/total,
               normal, 100.* ((float)normal)/total,
               higher, 100.* ((float)higher)/total);
    
            return 0;
        }

    Pour le sigalarm, il faut le recabler à chaque fois.
    Voici quelques stats, j’y ai ajouté le nombre de fois ou on a un écart de plus de 10%. De plus, si on déborde sur un cycle, la différence entre les deux sera forcément très inférieur sur le cycle suivant. D’où la relative symétrie (+ou- 1) entre les higher et les lower.

    $ ./a.out 
    average en ns = 999998, peak = 1057467(+5.75%), base = 944193(-5.58%)
     Total : 10000,
            - lower :      0 (0.00%)
            - normal:  10000 (100.00%)
            - higher:      0 (0.00%)
    $ ./a.out 
    average en ns = 1000098, peak = 2083044(+108.30%), base = 603560(-39.64%)
     Total : 10000,
            - lower :      1 (0.01%)
            - normal:   9997 (99.97%)
            - higher:      2 (0.02%)
    $ ./a.out 
    average en ns = 999998, peak = 1206658(+20.67%), base = 796835(-20.32%)
     Total : 10000,
            - lower :      2 (0.02%)
            - normal:   9997 (99.97%)
            - higher:      1 (0.01%)
    $ ./a.out 
    average en ns = 999997, peak = 1107952(+10.80%), base = 894580(-10.54%)
     Total : 10000,
            - lower :      1 (0.01%)
            - normal:   9998 (99.98%)
            - higher:      1 (0.01%)
    $ su 
    Mot de passe : 
    ####################
    # En Temps Réel
    ####################
    .../Linuxfr/TR# chrt 50 ./a.out 
    average en ns = 999997, peak = 1009857(+0.99%), base = 978338(-2.17%)
     Total : 10000,
            - lower :      0 (0.00%)
            - normal:  10000 (100.00%)
            - higher:      0 (0.00%)
    .../Linuxfr/TR# chrt 50 ./a.out 
    average en ns = 999997, peak = 1011019(+1.10%), base = 979650(-2.03%)
     Total : 10000,
            - lower :      0 (0.00%)
            - normal:  10000 (100.00%)
            - higher:      0 (0.00%)
    .../Linuxfr/TR# chrt 50 ./a.out 
    average en ns = 999997, peak = 1009547(+0.95%), base = 976955(-2.30%)
     Total : 10000,
            - lower :      0 (0.00%)
            - normal:  10000 (100.00%)
            - higher:      0 (0.00%)
    .../Linuxfr/TR# chrt 50 ./a.out 
    average en ns = 999997, peak = 1015868(+1.59%), base = 979951(-2.00%)
     Total : 10000,
            - lower :      0 (0.00%)
            - normal:  10000 (100.00%)
            - higher:      0 (0.00%)
    .../SSD/C++/Linuxfr/TR#

    Un essai supplémentaire sur 2 minutes (2 × 60 × 1000 = 120 000ms)

    $ ./a.out 
    average en ns = 999999, peak = 1425844(+42.58%), base = 585376(-41.46%)
     Total : 120000,
            - lower :     22 (0.02%)
            - normal: 119955 (99.96%)
            - higher:     23 (0.02%)
    $ su 
    Mot de passe : 
    .../Linuxfr/TR# chrt 50 ./a.out 
    average en ns = 999999, peak = 1030337(+3.03%), base = 968720(-3.13%)
     Total : 120000,
            - lower :      0 (0.00%)
            - normal: 120000 (100.00%)
            - higher:      0 (0.00%)
    # Ajout d'une affinité CPU
    .../Linuxfr/TR# taskset 1 chrt 50 ./a.out 
    average en ns = 999999, peak = 1272574(+27.26%), base = 727705(-27.23%)
     Total : 120000,
            - lower :     10 (0.01%)
            - normal: 119981 (99.98%)
            - higher:      9 (0.01%)
    .../C++/Linuxfr/TR#

    En forçant l’affinité sur un CPU, on augmente l’erreur… ça ma surpris. Il faudrait voir si on peut interdire un CPU à tout le monde sauf un processus ;-)
    Après, j'avais choisi le CPU 0, peut-être que en prenant le 3…

    Linuxfr/TR# taskset 4 chrt 50 ./a.out 
    average en ns = 999999, peak = 1018414(+1.84%), base = 971595(-2.84%)
     Total : 120000,
            - lower :      0 (0.00%)
            - normal: 120000 (100.00%)
            - higher:      0 (0.00%)
    .../Linuxfr/TR#

    C’est mieux… est-ce le hazard, ou les IT sont cablé sur le premier CPU sous Linux ?

    Voilà pour mes tests du soir.

    Bonne nuit

  • [^] # Re: Paramètre de timerfd_create

    Posté par  . En réponse au message probleme pour faire un timer précis de l'ordre de la milliseconde. Évalué à 2.

    Le get_clocktime aussi a le paramètre CLOCK_REALTIME.

    Sinon, tu peux utiliser la fonction setitimer. Par contre, c'est un peu plus complexe, il faut intercepter le signal SIGALARM, dans la fonction callback, tu libères un sémaphore (mutex). Et dans ton code, tu bloques le sémaphores.

    Autre chose, le temps réel, ça veut dire arrivé à temps… donc si malgré les erreurs tu arrives à finir ton algo avant la deadline, pourquoi chercher à réagir plus vite ? Néanmoins j’avoue que l’écart type d’erreur laisse songeur. ;-)

  • # Paramètre de timerfd_create

    Posté par  . En réponse au message probleme pour faire un timer précis de l'ordre de la milliseconde. Évalué à 4.

    Re,
    Dans le man timerfd_create,
    il y a ce passage :

           CLOCK_REALTIME
                  A settable system-wide real-time clock.
    
           CLOCK_MONOTONIC
                  A nonsettable monotonically increasing clock that measures time from some unspecified point in the past that does not change after system startup.
    
    

    As-tu essayé avec REALTIME ?

  • # Set affinity ?

    Posté par  . En réponse au message probleme pour faire un timer précis de l'ordre de la milliseconde. Évalué à 3.

    Hello,
    Tu n’indiques pas comment tu lances ton programme.
    En mode temps réel sur un noyau standard, la seule chose plus prioritaire, c’est le noyau.

    Une solution pourrait-être de forcer ton processus sur un cœur, et d’interdire ce cœur au noyau.

    Sinon, le réveil un peu plus tôt puis boucle active peut-être viable, et vraiment précis.

  • # BitWarden

    Posté par  . En réponse à la dépêche Passbolt, le gestionnaire de mots de passe pour équipe, lance ses applications mobiles. Évalué à 7.

    Hello,
    J’ai installé sur un yunohost.org l’application bitwarden.

    L’application mobile se comporte aussi très bien avec la biométrie pour se déverrouiller. Je peux également, partager des mots de passe avec ma famille (les autres membres de mon instance).

    Quelles sont les différences/avantages/inconvénients entre les deux ?

  • [^] # Re: Habilitation

    Posté par  . En réponse au message [Offre d'emploi][Résolue] Développeur Linux C++ temps-réel pour observatoire astronomique.. Évalué à 2.

    Hello,
    Pour la définition du temps réel autant je suis d’accord que ça ne veut pas dire instantané, mais pour moi, ma façon de l’exprimer : « c’est répondre à une contrainte de temps et savoir détecter si une contrainte n’est pas respectée. »
    Que la contrainte de temps soit de 1ms ou de 1h ne change pas grand chose. C’est pour ça, que je privilégie les algos à temps constant quand je fais du TR, car s’ils passent en tests, ils passeront tout le temps.
    Si une contrainte n’est pas respectée, la conséquence sera en fonction de la criticité… pour l’écran d’un avion de ligne, l’écran se verra mettre en erreur (un gros F) à la place de l’affichage en cas de détection de panne hardware.
    Dans certains cas, on peut gérer un dépassement, mais souvent, ce n’est pas envisageable.

  • # Erreur ?

    Posté par  . En réponse au message probleme de compréhension sur les rvalue et std::move. Évalué à 2. Dernière modification le 14 janvier 2022 à 15:55.

    Salut, je vais sans doute écrire des bêtises…
    dans la dernière partie tu utilises V[1] alors qu’il n’y a que l’élément 0.

    Si a la place de ….data() tu utilises ….c_str() ? Ça change quelque chose ? (normalement non.)

    Après, le move est fait pour éviter des grosses copies, ici on peut copier avec juste une copie de 64bits. Avec une très longue chaîne, c’est pareil ?

    Le push_back doit également allouer la mémoire, si tu fait un vector.resize(8) avant le push_back, est-ce que ça se comporte pareil ?

    Pas d’idée supplémentaire.

  • [^] # Re: Pourquoi j'ai voté pour la série de John Harrison....

    Posté par  . En réponse au sondage Mon adaptation de Dune préférée. Évalué à 5.

    Le style des livres évolue avec l’auteur aussi. Le messie n’est pas le plus intéressant. L’empereur Dieu de Dune est passionnant, mais c’est surtout une analyse politique et sociétale. Après, ça devient un peu cul, sans doute le vieillissement de Franck.

    J’ai aussi aimé ce que le fils à fait : La trilogie du jihad butlerien 10 000 ans avant Dune, la trilogie juste avant, qui explique les trois maisons en conflit dans Dune, ce que j’ai moins aimé, c’est la fin de la saga… même si on retrouve des liens avec le jihad butlerien, les personnages sont un peu lourds.

  • [^] # Re: Yureh était mieux dans le film de Lynch

    Posté par  . En réponse au sondage Mon adaptation de Dune préférée. Évalué à 3.

    Oui, son conditionnement n’est pas visible dans le film de Villeneuve. De même que le manta est transparent.

    J’ai voté Lynch, car même s’il ne respecte pas bien le livre, c’est ce film qui m’a fait lire l’ensemble de l’œuvre. Je suis néanmoins impatient de voir la suite.

  • [^] # Re: pages man en couleur

    Posté par  . En réponse au message utilisation du "man". Évalué à 2. Dernière modification le 12 janvier 2022 à 11:18.

    Je ne m’étais jamais posé la question…
    Merci de m’avoir créé un besoin, et de l’avoir comblé instantanément.

  • [^] # Re: arte aussi…

    Posté par  . En réponse au journal Vidéo de qualitay sur l'histoire du mouvement anti-vaxx. Évalué à 2.

    Le problème des bivalves, c’est qu’ils sont ahémisphère… ;-)

  • [^] # Re: Norbert est partout

    Posté par  . En réponse au lien Le télétravail en 1985 . Évalué à 4.

    À la fin : « Les charmes de la vie de bureau… » avec le mec qui fume. Heureusement que certaines choses ont évoluées.