fearan a écrit 7448 commentaires

  • [^] # Re: Performance

    Posté par  . En réponse au journal Moi, expert C++, j'abandonne le C++. Évalué à 1.

    Il y a certaines fonctionnalités que je ne trouve pas alors

    Tu peux donner des exemples ? car à part l'introspection, j'ai du mal a voir ce qu'il manque par rapport au java (au niveau des capacités du langage)

    Moi ce qui me manque quand je change de langage (généralement java), c'est la non maitrise des const, impossibilité de choisir entre valeur/référence/pointeur, impossible de redéfinir les opérateurs (simplification d'interface), les template…

    Ça m'est totalement obscur. Voir ça en 2019 m'a fortement déçu sur l'évolution de C++ et de son écosystème. Et le bout de code en exemple, je l'ai trouvé sur le net. Tout seul je n'aurais pas su l'écrire,

    Je t'invites a écrire sans aide un appel de java vers c++, ou java vers ada, ou ada vers pascal !

    Clairement le morceau de code que tu as donné est un interfaçage de C vers C++; et je dirais même un mauvais interfaçage; on récupère un pointeur de pointeurs et on va stocker les pointeurs (probablement des chaine de caractères) dans un vector, le tout sans aucun commentaire sur l'ownership (qui libère quand comment) (ici j'ai l'impression que c'est la bibliothèque qui le fait, mais ça ne dispense pas d'un commentaire); bref, si je suis relecteur de ce code c'est un rejet direct.

    Il ne faut pas décorner les boeufs avant d'avoir semé le vent

  • [^] # Re: Je hais le C++

    Posté par  . En réponse au journal Moi, expert C++, j'abandonne le C++. Évalué à 2.

    Le programme a un comportement indéfini, et contient donc un bug.

    Je ne dis pas le contraire, j'aurais probablement expliquer plus en détail ma première réponse.

    Le fait que ça affiche le bon résultat pour toi n'est que par chance. Sso ou pas.

    La chance n'a rien à voir la dedans; c'est la façon dont est implémenté la stl dans g++; clang; si , par exemple te fait une erreur à la compilation. Et je peux relancer le programme 1010 fois, j'aurais toujours le même résultat.

    C'est typiquement ce genre de bout de code qui peut tourner 20 ans sans broncher, passer les versions de compilos, parce que quelqu'un à voulu faire du printf debugging, et n'a jamais remis le tout sur une ligne, et planter royalement le jour où tu rajoute 3 caractères dans un fichier de conf.

    Si une version avec une "chaine vraiment trop longue pour rentrer dans la short string optimisation" là donner le 'bon' résultat est du à la chance.

    Il ne faut pas décorner les boeufs avant d'avoir semé le vent

  • [^] # Re: Je hais le C++

    Posté par  . En réponse au journal Moi, expert C++, j'abandonne le C++. Évalué à 2. Dernière modification le 06 juin 2019 à 13:58.

    Comme je le dis tu continue de changer l'énoncé au fil du fil.

    Il ne faut pas décorner les boeufs avant d'avoir semé le vent

  • [^] # Re: Je hais le C++

    Posté par  . En réponse au journal Moi, expert C++, j'abandonne le C++. Évalué à 2. Dernière modification le 05 juin 2019 à 22:23.

    La uClibc++ n'a pas 20 ans. Mais j'imagine que t'as encore des excuses ridicules en stock pour justifier ta médiocrité en C++ ?>

    Prendre comme exemple une lib incomplète ? T'en a d'autre pour justifier ton manque de préparation pour tes tests ? ;)

    Il ne faut pas décorner les boeufs avant d'avoir semé le vent

  • [^] # Re: Je hais le C++

    Posté par  . En réponse au journal Moi, expert C++, j'abandonne le C++. Évalué à 2.

    tu ne réutilises jamais un pointeur sur un objet désalloué

    On est bien d'accord; mais tu as demandé la sortie de ton morceau de code; je te la donne, et je t'explique pourquoi ton code est prévisible; on est dans un comportement indéfini très bien défini du moment que la sso est présente ; j'y peux rien si tu ressors les exemples d'il y a 20 ans sans te soucier de voir si ils sont d'actualité.

    tu peux avoir une interruption qui va modifier la stack entre-temps

    Dans ton programme ? Je demande à voir!

    tu peux avoir ta bibliothèque qui va effacer la zone mémoire pour des raisons de sécurité

    Tu continues de changer l'énoncé au fil de l'eau ;) Tu peux aussi avoir une bibliothèque qui ne recouvre pas la mémoire.

    CC sur Solaris, il y 15 ans t'aurais donné le même résultat; on a même du code critique qui a tournée pendant des années avec des comportements indéfini, et ne c'est pas propre au C++ …

    {
      [...]
      char *b = a
      // 
      free (a);
      return b
    }

    On s'est rendu compte de la blague en passant sous linux + gcc, que des chaines vides à la place des résultats ;); le pire c'est que le code de duplication avait été commenté en disant qu'il ne servait à rien…

    Tu peux aussi redéfinir tes new/delete

    Il ne faut pas décorner les boeufs avant d'avoir semé le vent

  • [^] # Re: c'est un peu vague comme énoncé

    Posté par  . En réponse au message Logiciel pour remplacer mots. Évalué à 2.

    Honnêtement, ça aide beaucoup de connaitre le besoin (en plus d'écarter les éventuels 'faites mes devoirs', ou 'faites mon job')

    Une autre solutions (sans ligne de commande), c'est ouvrir tous les fichiers dans un éditeur et de faire un remplacer dans tous les fichiers; certains éditeurs le permettent, mais ça va dépendre du nombre de fichiers et de leur taille ;)

    Il ne faut pas décorner les boeufs avant d'avoir semé le vent

  • [^] # Re: Dépêchisable je pense en effet !

    Posté par  . En réponse au journal Moi, expert C++, j'abandonne le C++. Évalué à 3. Dernière modification le 05 juin 2019 à 10:15.

    LinuxFr a toujours été un lieu de débat philosophique, de discussion sur les licences et autres sujets liés (DRM…), de moto, de bronsonisation… en plus de la dernière version de Fedora avec une liste de numéros de version des logiciels.

    Tu oublie cinéma (https://linuxfr.org/tags/cinema/public) et la cuisine cuisine (https://linuxfr.org/tags/recette/public)

    Traitre !!!

    Et puis on parle aussi de boulangère et parfois - hem - politique  ;)

    Il ne faut pas décorner les boeufs avant d'avoir semé le vent

  • [^] # Re: Je hais le C++

    Posté par  . En réponse au journal Moi, expert C++, j'abandonne le C++. Évalué à 2. Dernière modification le 05 juin 2019 à 09:34.

    Tu pose une question, je répond, va pas changer l'énoncé ensuite, même valgrind ne bronche pas sur le premier exemple.

    D'un point de vue technique (norme) le pointeur renvoyé c_str() (ou data()) reste valide tant que la chaine initiale n'est pas modifié. La chaine est détruite à la fin de la ligne const char *c1= s.substr(2).c_str(); , et la ligne suivante donne donc théoriquement un comportement indéfini;

    cependant au vu de la taille de la chaine résultante, "123", on est dans le cas de la short string optimisation, ce qui fait que la totalité de la string est stocké sur la pile; non partagé avec qui que ce soit; et donc en absence de nouvelle allocation locale, on y touche pas; donc la mémoire est toujours valide ;) Ce qui fait que ton cas est parfaitement prévisible ;)

    évidemment, si on agrandi la chaine résultante pour ne plus bénéficier de la short string optimisation, on n'alloue plus sur la pile mais le tas, et là tu vas faire broncher valgrind ;)

    Ensuite du C dans du C++, c'est fréquent; par contre je le redis : on ne passe en char* qu'au dernier moment ;)

    Il ne faut pas décorner les boeufs avant d'avoir semé le vent

  • [^] # Re: Je hais le C++

    Posté par  . En réponse au journal Moi, expert C++, j'abandonne le C++. Évalué à 2.

    tu as tout faux, même si ton compilateur en a tiré qq chose

    Je connais le problème des pointeur / référence sur temporaire; il se trouve que dans un environnement simple ton test donnée ne va jamais planter parce que le recouvrement de mémoire n'est pas fait, même valgrind ne râle pas, c'est pour dire! :P

    Le vrai soucis c'est que tu combine du C (stdio.h) avec du C++. normalement, tu ne passe en c_str qu'au dernier moment.

    En C moi j'ai eu ça

    int calculJour(int i )
    {
       static int *tab=NULL;
       [...]
       if ( taille insuffisante)
         tab=realloc(...);
       tab[n]=calculJour(n)
       [...]
       return x;
    }

    Il ne faut pas décorner les boeufs avant d'avoir semé le vent

  • [^] # Re: En France d'ailleurs

    Posté par  . En réponse au message Plateforme équivalente . Évalué à 3.

    j'aurais dis /. mais ça fait longtemps que je n'ai pas été y faire un tour ;)

    Il ne faut pas décorner les boeufs avant d'avoir semé le vent

  • [^] # Re: Je hais le C++

    Posté par  . En réponse au journal Moi, expert C++, j'abandonne le C++. Évalué à 4.

    Toi ça ne te choque pas qu'un paramètre par défaut soit modifié à chaque appel ?

    Il ne faut pas décorner les boeufs avant d'avoir semé le vent

  • [^] # Re: c'est un peu vague comme énoncé

    Posté par  . En réponse au message Logiciel pour remplacer mots. Évalué à 7. Dernière modification le 04 juin 2019 à 16:37.

    rapidement

    sed -r 's/monNomDeDomaine[.]fr/monNouveauNomDeDomaine.org/g' -i.old $(find -iname '*html' -or -iname '*md')

    en gros va remplacer toutes les chaines monNomDeDomaine[.]fr par monNouveauNomDeDomaine.org dans tous les fichier se terminant par html ou md.

    dans le cas où tu aurais des / dans les noms à repplacer, il vaut mieux uiliser # comme séparateur de champs, donc

    sed -r 's#monNomDeDomaine[.]fr#monNouveauNomDeDomaine.org#g' -i.old $(find -iname '*html' -or -iname '*md')

    le -i.old permet de ne pas perdre les fichier d'origines, ils seront simplement renommé en .old

    -i tout court va modifier les fichiers sans sauvegarde :)

    le [.] dans la première partie permet de ne pas interpréter le . (dans une regEx, le . désigne n'importe quel caractère ) ou plus précisément [.] prends un caractère dans la liste des caractères entre les [] ici il n'y a que le . certains utilisent ., mais ça devient vite le bordel, notamment quand on inclue des chaines de caractères dans les autres.

    Il ne faut pas décorner les boeufs avant d'avoir semé le vent

  • [^] # Re: Je hais le C++

    Posté par  . En réponse au journal Moi, expert C++, j'abandonne le C++. Évalué à 2. Dernière modification le 04 juin 2019 à 15:14.

    l'un de mes préféré en java (valable au moins jusqu'au 8, je ne sais pas pour les suivant)

    Je meuble un peu pour l'indentation :P

    Integer a = new Integer(126);
    Integer b = new Integer(126);
    if ( a==b ) 
      System.out.println("1  : a==b")
    a++;
    b++
    if ( a==b ) 
      System.out.println("2 : a==b")
    a++;
    b++;
    if ( a==b ) 
      System.out.println("3 : a==b")

    Que donne ce petit bout de fonction ?

    et ce qui fait que je hais le java

    class Pika
    {
      void accept(Collection<String>   plop) { [...]}
      void accept(Collection<Integer>  plop) { [...]}
    
    }

    Ne peut pas compiler car il n'existe pas de type Collection<Truc>, en fait on a que des collection d'objet!

    Il ne faut pas décorner les boeufs avant d'avoir semé le vent

  • [^] # Re: Je hais le C++

    Posté par  . En réponse au journal Moi, expert C++, j'abandonne le C++. Évalué à 4.

    pour le 1, rien de plus que ce qu'on pourrait penser

    123
    123
    123

    le pointeur retourné par c_str() reste valide tant qu'il n'est pas invalidé par une fonction modifiant la string d'origine ;)

    Le deuxième cas est plus compliqué tu as d'ailleurs joué avec une variable globale pour éviter un bon gros warning de compilation (voir une erreur) (pour cet exemple); il t'affiche

    A
    B

    pour ceux qui n'auraient pas compris la blague B(b) est interprété comme B b; une déclaration d'une variable b de type B. Mais bon c'est quoi ton langage préféré ? parce que des blagues de ce genre j'en ai en java, python, C, perl, bash…

    si il avait déclaré une variable locale ou en tant que paramètre

    void fun( int b)
    {
            B(b);
    }

    Il aurait eu une joli erreur de compilation

    plop2.cc:17:5: error: la déclaration de « B b » masque un paramètre

    Il ne faut pas décorner les boeufs avant d'avoir semé le vent

  • # c'est un peu vague comme énoncé

    Posté par  . En réponse au message Logiciel pour remplacer mots. Évalué à 3.

    Tu pourrais être plus précis sur l'exercice : format de fichier en entré, exemple de cas (exemple quoi)

    Car la simplement comme logiciel :

    on a emacs qui fait tout

    perl si tu veux un truc plus user friendly ;)

    ou comme dit plus haut une articulation bash autour de sed

    Il ne faut pas décorner les boeufs avant d'avoir semé le vent

  • [^] # Re: Go ou Rust?

    Posté par  . En réponse au journal Moi, expert C++, j'abandonne le C++. Évalué à 5. Dernière modification le 04 juin 2019 à 12:02.

    Yep, c'est ce qui se disais aussi ici, le temps d'exec on s'en fout, sauf qu'on a passé la limite critique de temps de calculs, notamment pour la coordination européenne, les gens ont tellement codé comme des porcs, qu'en à peine 1 journée de boulot, on est passé de 1h de traitement à 30 minutes, un calcul mal placé. Mais régulièrement on fait 2 ou 3 recherche dans les map, là où une seule suffit.

    Les gens oublient que le insert en c++ n'insert rien si l'objet est déjà présent (et renvoi une paire (itérateur de l'élément dans la map (nouveau ou ancien), booleen d'insertion), et font des recherche/ajout,

    Alors ce genre de petits détails peut ne pas impacter l'appli, quand tu les fais en plein milieu des calculs ça commence à impacter sérieusement les perfs. De même utiliser un vector pour une liste d'éléments dans laquelle on supprime et ajoute des éléments n'est pas non plus optimal.

    Je ne parle même pas des allocations dynamique là où une variable locale suffit.

    C'est clair qu'une mise-à-jour du matériel est moins chère.

    Yep c'est ce que le client pensait aussi, sauf qu'en codant avec des complexité en O(K * N²), le K a 3 ou 4 il commence à faire mal lors des calculs intensifs; si à cela tu ajoute que souvent on est en n3 au et que pas mal de n² pourraient être en n * log(n), le coût du matériel commence à se faire vraiment sentir, et qui dit serveur de plus (on fait du calcul distribué), dit aussi maintenance en plus.

    Y'a quelques années j'avais aussi gagné un facteur 3 sur un ensemble de calculs (une bonne semaine de boulot, factorisation des calculs identique)

    Bref optimiser à fond, traquer le point qui fait perdre 3ms, aucun intérêt; par contre timer le code voir où on perd le plus de temps, voir si c'est normal, et dans le cas contraire s'en occuper est indispensable.

    Plus récemment, j'ai trouvé dans le code une recherche d'élément dans une map qui ne cherche pas par la clé (problème de jouer avec plusieurs identifiants); le tout dans uns boucle, schématiquement c'est

    for( auto pika : lstElement )
    {
      if ( grosConteneur.getFromSecondary(pika)   // O(n)
           ||  grosConteneur.get(pika)  )         // O(log(n)) 
      {
         Choux bruxelle = grosConteneur.getFromSecondary(pika);
         if( !bruxelle )
           bruxelle = grosConteneur.get(pika);
         [...]
      }
    }

    Le stict minimum, c'est d'avoir une durée qui n'explose pas dès qu'on augment un peu la volumétrie; sinon c'est tous les 2 mois qu'il faut racheter des serveurs, multiplie ça par le nombre de lieu où c'est déployé (5-6 en France, et d'autre à l'étranger), l'achat de serveur n'est pas toujours la bonne solution.

    Il ne faut pas décorner les boeufs avant d'avoir semé le vent

  • [^] # Re: Mon avis (professionnel)

    Posté par  . En réponse au journal Moi, expert C++, j'abandonne le C++. Évalué à 3.

    yep j'aime beaucoup celle qui permet de ne même pas avoir d'allocation dynamique sur les petite chaines ;)

    Il ne faut pas décorner les boeufs avant d'avoir semé le vent

  • [^] # Re: Performance

    Posté par  . En réponse au journal Moi, expert C++, j'abandonne le C++. Évalué à 4.

    ton application C++ en 30ans tu l'a réécrite 2 fois au moins (une fois pour prendre en compte C++98 et une pour C++11) si tu t'en es bien sorti. Oui tu as aussi dû réécrire ton application python pour passer à python3 on est d'accord. C'est juste pour dire que la maintenance de ce genre de code même en C++ ce n'est pas trivial du tout.

    If it works, don't fix it !!!

    Le code entre C++ 98 (ou 2003), est compatible avec le C++11, mise à part quelques cas marginaux comme des using namespace std et using boost::shared_ptr, pas besoin de mettre à jour le code. Lors de modifications de code (évolution), il est tout à fait possible de faire la mise à jour du code dans le cadre de l'évolution.

    il est beaucoup plus simple d'écrire des tests, mais vraiment beaucoup.

    il y a pas mal de composant de test (cppunit, google test suit) qui rendent l'écriture de test très aisée.

    Il ne faut pas décorner les boeufs avant d'avoir semé le vent

  • [^] # Re: Mon avis (professionnel)

    Posté par  . En réponse au journal Moi, expert C++, j'abandonne le C++. Évalué à 2.

    Quelques pistes à m'indiquer ?

    Je vais essayer de faire succin ;)

    • l'intégration de pas mal de fonctionnalité de boost comme les pointeurs intelligents, les regex…
    • les lambda function (permettre la définition d'une fonction lambda, très utile pour tout ce qu'il y a dans std::algorithm
    • le mot clé auto (en gros déduction par le compilateur du type de la variable; très pratique pour les itérateurs :) )
    • variadic template, ou template a nombre variable d'argument (si tu as utilisé le make_shared de boost et regardé sa définition (pré c++ 2011) tu peux comprendre rapidement l'intérêt)
    • la spécialisation partielle de template
    • Plus avancé mais un gros travail sur les rvalue/lvalue, de nouveau type de constructeur (déplacement)
    • de grosses facilité pour l'écriture de template (enable_if<>…)
    • static_assert

    Il ne faut pas décorner les boeufs avant d'avoir semé le vent

  • [^] # Re: Réunion des développeurs C++ anonymes ;)

    Posté par  . En réponse au journal Moi, expert C++, j'abandonne le C++. Évalué à 3.

    ça dépend; tu as des VN en python, tu as des casses briques en java (oui oui minecraft rentre dans le domaine casse-briques); tu as un paquet de jeux en html+js (twine assez souvent), tu en a aussi en html5, ou en flash.

    Tu as même pleins de remake des jeux des années 1990 dans le navigateur (lemmings, doom… )

    Par contre la majorité 'gros' jeux (Skyrim, Fallout4…) sont en C++; pour ces deux là tu as un langage de script associé (papyrus) qui permet de d'interfacer les quêtes/sorts/actions et rendent le système plus flexible.

    Il ne faut pas décorner les boeufs avant d'avoir semé le vent

  • [^] # Re: Mon avis (professionnel)

    Posté par  . En réponse au journal Moi, expert C++, j'abandonne le C++. Évalué à 3.

    mouais c'est pas pour ça qu'on a les scoped_lock ?

    parce que le jour où on rajoute un truc qui pète en dehors du try, on est dans la mouise ;) Surtout que là on a masqué l'exception, ça peut être justifié, ça dépend du contexte ;)

    Il ne faut pas décorner les boeufs avant d'avoir semé le vent

  • [^] # Re: Mon avis (professionnel)

    Posté par  . En réponse au journal Moi, expert C++, j'abandonne le C++. Évalué à 4.

    M'en parle pas on est en c++ 2003 ici, et je tombe sur du copier/coller ou des macro là où fonction ou template suffirait, je retrouve jusqu'à 6 passage identique dans un même fichier (3*2), trois fois la même chose, dont certains élément à l'intérieur se répètent eux même.

    Il n'est pas rare de retrouver le même bloc de 6 lignes répétées 15 fois… Je ne compte plus les

    if ( mapDeTruc.find(pika) == mapDeTruc.end() ){
       mapDeTruc[pika]=vector<plop>();
    }
    mapDeTruc[pika].push_back(choux);

    ou les find juste avant les insert. Bref même pour des morceaux de langage vieux de 20 ans les gens ne regardent pas la doc. (pour info seule une seule ligne ci-dessus est nécessaire, la dernière;

    Il ne faut pas décorner les boeufs avant d'avoir semé le vent

  • [^] # Re: nope

    Posté par  . En réponse au message X11 et le vol par capture d'images. Évalué à 2.

    Ce doit être plus compliqué que ça…

    • keylogger ( par exemple https://www.macrorecorder.com/ ou sous Linux yum install xev (ou dnf install xev , ou urpmi xev selon la distrib ), puis xev -id fenêtre )
    • pour le presse papier, sous windows tu as quick atlas qui te traduit le contenu du presse papier, ou office qui te conserve jusqu’à un certain nombre de copier, sous Linux klipper sous kde, fait la même chose qu'office (depuis plus longtemps ;) )
    • lecture/écriture sur disque, n'importe quelle appli le permet, suffit de modifier la conf pour s'en rendre compte ;)

    Car si faille il y a, alors elle est sans doute exploitées.

    Ce ne sont pas des failles, pas en tant que telle, normalement ce qui tourne sur ton poste est contrôlé, c'est toi qui est maitre de ce qui tourne, et avant html5, ce que permettait un navigateur était assez limité, d'où la présence de flash/java qui permettaient de faire plus, le premier étant plus limitant que le second.

    Avec l'arrivé du html5, ces deux dinosaures finiront par tomber dans l'oubli, mais la maitrise de ce qui tourne est plus compliqué, si on pouvait activer/désactive ces deux antiquités, html5, lui, n'est pas désactivable.

    Il ne faut pas décorner les boeufs avant d'avoir semé le vent

  • [^] # Re: peertube / docker

    Posté par  . En réponse au journal projet s2s. Évalué à 3.

    C'est une bonne question. À partir de quand la loi va considérer que c'est ou non la même instance (typiquement une nouvelle adresse vers laquelle on est redirigé (en plus du changement de charte graphique). Ça seul un juge sera capable de le dire…

    Il ne faut pas décorner les boeufs avant d'avoir semé le vent

  • [^] # Re: L'avenir des cryptomonnaies ?

    Posté par  . En réponse au journal La Banque du futur. Évalué à 5.

    Ah ben oui, pourquoi pas. Donc comme j'écrivais au-dessus: s'il m'arrive quelque chose, tu vas demander à ma femme de:[…]

    Je crois que tu as zappé l'usufruit… Globalement l'idée pour éviter d'augmenter le traumatisme de perdre un proche, tu gardes l'usage des biens possédés, mais pas leur propriété, le tout sans taxe. Cela évite de devoir vendre pour payer les droits de succession, et si tu veux à nouveau léger ta maison/entreprise/fauteuil louis XVI, tu rachète à l'état la propriété.

    Pareillement pour ma fille si elle atteint ses 18ans et qu'elle perd ses parents:

    Pareil, cela rentre dans l'usufruit détaillé plus haut.

    Tout comme 0 taxe sur le pécule hérité en propriété - dont le seuil reste à définir, mais doit rester bas.

    Je pense que tes idées sur l'héritage ont été bien peu confrontées au monde réel.

    J'ai surtout l'impression que tu n'avais pas lu ma réponse :P

    Notre maison est uniquement à mon nom, et c'est une idée… de ma femme! L'idée est que si on investit en immobilier, sa côte de crédit à elle sera encore bonne puisque l'hypothèque de la maison est à mon nom uniquement.

    Moui, toutes ces raisons sont de la manipulation et du contournement, j'ai rien contre, mais râler ensuite parce que cela se retourne contre toi… Tu veux les gains sans les risques.

    Il ne faut pas décorner les boeufs avant d'avoir semé le vent