Le fait que memcheck puisse lancer gdb lorsqu'il détecte un problème le classe dans la catégorie des front end de débuggeurs, au moins.
Batchyx a écrit 1074 commentaires
-
[^] # Re: Choix multiples

-
[^] # Re: HAHA

Linus n'a jamais dit que ces patches étaient foireux, juste qu'ils sont bien trop spécifiques et trop chiants pour être upstream.
Franchement, on peut faire les mêmes critiques à tout les patches que les gens écrivent pour un besoin particulier sans considération pour être intégrés upstream. C'est le cas à chaque fois que des développeurs utilisent le noyau Linux pour faire autre chose qu'un noyau généraliste.
-
[^] # Re: Ouam

Saloperie de faits qui viennent factuellement dire que Mme Michu, qui n'est qu'un reflet statistique, veut ça.
Ce n'est pas parce que Mme Michu achête plus facilement quelque chose qu'elle le fait de manière consciente et de son plein gré.
Parce que sinon, c'est comme si tu accusait Mme Michu de préférer les produits dont on fait la publicité partout, alors que c'est précisément le rôle de la publicité de manipuler les gens.
-
[^] # Re: /boot/config-* ?

L'option
CONFIG_IKCONFIG_PROCn'est pas activée sous Debian. donc pas de/proc/config.gz. -
[^] # Re: publirédactionnel

Iceweasel afficherait une page "attention, ce site contient des pubs, si vous cliquez sur continuer, vous accéderez au contenu, mais êtes exposés à la pub".
Personnellement, ça me pose pas de problème. Aujourd'hui, il n'y a pas de moyen de savoir, simplement en regardant un lien, si le site viens avec de la pub ou non. Si je ne veux pas de pub, j'ai le choix entre toutes les bloquer ou ne visiter aucun site. Au moins, avec cette méthode, je pourrais surfer uniquement sur le web non-commercial.
Ça ne fait que restorer la sémantique d'un l'achat classique: tu me propose quelque chose en échange de publicités, mais j'ai le droit de refuser.
La seule petite amélioration que je verrais, c'est que cette page me décrive ce qu'est le site ("Youtube est une plateforme de partage de vidéo"), pour quand je tombe sur un lien vers un site que je ne connais pas.
-
[^] # Re: Quelques éléments

Ce qui est chiant avec les cellules photo-voltaiques, c'est que si on les utilise bêtement, elles n'ont pas le meilleur rendement possible.
Les cellules sont des générateurs de courants, dont l'intensité du courant varie en fonction de l'éclairement. La tension limite au delà de laquelle le générateur s'éffondre (le courant baisse) augmente aussi un peu en fonction de l'éclairement.
Donc si tu le fait fonctionner à tension constante, ton courant va varier fortement, surtout si tu est autour de la tension limite pour ton éclairement. Si tu l'utilise comme un générateur de courant constant, c'est plus stable. Mais dans les deux cas, tu sous-utilise ta cellule.
Pour maximiser U×I sur un générateur à courant constant, il faut en gros se placer à la tension la plus haute avant que l'intensité ne s'éffondre de trop, donc à la tension limite. Qui varie en fonction de l'éclairement et des caractéristiques de ta cellule.
La plupart des vendeurs de cellules vendent aussi le circuit adapté à la cellule pour utiliser le meilleur régime possible et convertir ça en une tension constante utilisable.
-
[^] # Re: Une bonne chose

Chez moi il me pose la question. Suffit juste de choisir la bonne priorité debconf ;)
-
[^] # Re: Non, mais ...

Euh… sur tes 4 points, les deux qui ne sont pas normales me semblent être une bonne pratique. C'est un peu comme si tu disais qu'avec Java t'es obligé (je ne suis même plus sûr de savoir si c'est une obligation ou de si ça pète juste un warning) de déclarer une seules classe par fichier (sans compter les hinners classes), ça me semble être une bonne pratique.
C'est sans doute une bonne pratique en Java (on y est un peu obligé), mais en C++ c'est totalement artificiel, vu que la bibliothèque standard ne respecte pas cette convention, et heureusement. Personne ne s'amuserait à créer un fichier pour y mettre uniquement
# include <implementation_detail/binary_operator> namespace std { template <typename T> struct less : std::__implementation_detail::binary_operator<bool, T,T> { bool operator()(const T& a, const T& b) const { return a < b; } }; }et à faire ça 6 fois pour les opérateurs relationnels sans parler de la centaines de classes/fonctions de la bibliothèque standard qui s'implémentent en moins de dix lignes ou qui ne sont que des alias/typedef.
Non, la bonne pratique en C++ c'est d'activer son cerveau et de distinguer les grosses classes/fonctions à mettre dans un fichier séparé des petites classes/fonctions que l'on peut regrouper intelligemment dans un seul fichier si ça a un sens de les mettre ensemble. Sachant que, bien entendu, les petites classes sont préférables aux grosses (il faut mieux casser des grosses classes pour les remplacer par un typedef d'amas de petites classes templates).
Pareil pour les namespaces; La bibliothèque standard ne met pas tout ses includes dans
std/. Et les namespaces de boost ne correspondent pas forcement aux répertoires dans lequel se trouvent les includes.Enfin bref: "Apply common sense".
Pour comparer avec le C++, tu dois remplacer Toto par TotoProvider et le package 2 fois chacun (une fois pour l'entête et une fois pour le corps). Puis changer les directives d'include conditionnelle dans le corps (à 2 endroits au moins, personnellement je préfère aussi le mettre en commentaire à la suite de la fin du if). Pareil je parle pour une classe qui n'est pas utilisée.
C'est certes plus de boulot, mais toutes ces opérations impliquent uniquement d'utiliser son éditeur de texte. C'est beaucoup plus confortable que de devoir créer un répertoire et y déplacer ses fichiers.
Et tu te retrouve avec un dossier src qui contient en vrac différents namespace.
Mauvaise idée, vaut mieux faire le contraire: les namespaces en C++ ne servent pas à catégoriser les classes ou a limiter leur visibilité comme en Java, mais uniquement à éviter les conflits de noms. Utiliser un ou deux namespaces par projet est suffisant (exemple: la bibliothèque standard, encore une fois…), il n'y a pas de raison d'en avoir plus si tu ne compte pas avoir de conflits de noms (les principaux types de conflits étant ceux liés à la recherche dépendant des paramètres). Et même lorsque tu à besoin d'un namespace, tu peux toujours le planquer en utilisant un typedef ou autre.
Absolument rien ne t'empêche de simplement séparer tes fichiers dans des répertoires différents en gardant le même namespace.
Les imports à « grains fin » (tu peut utiliser des wildcard, mais je n'aime pas)
Le compilo non plus, ça augmente ses temps de compilations, mais pas autant qu'une compilation C++.
permettent de voir ce qui est utilisé ou non dans la classe. Là encore à comparer au C++, il va falloir ajouter des includes qui vont bien, les modifier ou pas va dépendre de comment tu organise tes classes.
Si tu sépare des classes intelligemment, tu n'a pas plus de problème qu'avec des wilcards en Java. Parce que les imports à grain fin, en plus de rentre inintelligible la liste de ce que tu utilise, t'oblige à la maintenir avec un IDE. Une liste d'include est plus courte et mieux catégorisée.
Tu entends quoi par là ? La javadoc, me paraît tout à fait lisible (et immédiatement à jour par rapport à cppreference ou cplusplus ()j'apprécie beaucoup ces 2 sites là n'est pas la question) qui sont moins à jour et qui, dans le cas de cppreference, se contente de décrire l'API (Java à ce genre de choses). Après je trouve qu'il mange des chose, j'aimerais bien avoir dans la javadoc la complexité de certaines fonctions et indiquer de manière systématique si une méthode est thread-safe ou non.
Gahh, des frames, en 2013. Passons, j'ai pris une classe au hasard: AbstractQueue: http://docs.oracle.com/javase/7/docs/api/java/util/AbstractQueue.html
J'ai :
- de l'information bateau qui m'intéresse pas forcement (savoir de quoi ça hérite, qui l'implémente …) mais qui se trouve au début, donc c'est ce qui s'affichera en premier dans une petite fenêtre
- La doc (normal)
- Les constructeurs/méthodes de la classe avec leur description courtes (normal)
- Un trop bref résumés des méthodes héritées des classes mères, alors que pourtant, elles font partie de l'API.
- Le détail des méthodes, qui prend une place absolument folle.La plupart des programmeurs Java que je vois préfèrent naviguer dans les méthodes et leur documentations dans leur IDE (ou son autocompléteur de code) que regarder la javadoc. Il y a peut-être une raison. Bizarrement, les IDE ne planquent pas les méthodes héritées, et n'affichent les hiérarchies de classe que dans la doc.
Excuse-moi de revenir à C++, mais c'est le langage le plus proche que je connaisse. Peut être que Objective-C ou un autre langage fait mieux.
Je fais du C++ avec vim. Et j'ai pas absolument besoin de ses fonctionnalités d'IDE les plus avancées (elles ne font qu'augmenter ma productivité). Des windowsiens utilisent des éditeurs plus pauvres comme notepad++ pour des petits projets C/C++, et ça ne semble pas les gêner pas tant que ça.
Mais en Java, je n'ai jamais vu quelqu'un utiliser un IDE moins lourd que netbeans ou eclipse, même pour des petits projets de 3 classes. C'est juste impossible de programmer sans.
-
[^] # Re: Non, mais ...

Quiconque ayant déjà renommé une classe Java et changé son
namespacepackage à la main te dira que c'est Java qui nécessite un IDE et non le contraire.(je parle pas de changer le code des utilisateurs de la classe hein, juste de changer le nom et le package d'une classe).
Pour information, pour ceux qui ne pratiquent pas java, voilà ce que le langage impose de faire si je veux renommer une classe
Toto(pas encore utilisée) dans le namespace par défaut encom.bloat.providers.TotoProvider:- Remplacer
Toto par TotoProviderdans le fichier (normal). - Rajouter
package com.bloat.providers;(normal). - Créer le répertoire
com/bloat/providers(mkdir -pest ton ami, avec une GUI tu crève). - Déplacer
Toto.javadanscom/bloat/providers, et le renommer enTotoProvider.java, en pensant au gestionnaire de version.
Autrement dit, tu va retaper
Totodeux fois,com.bloat.providersau moins trois fois etTotoProviderdeux fois, et t'a pas intérêt à faire une typo quelque part, sinon ça va être coton à savoir ou.Enfin bref, c'est super chiant, et tu ne fera jamais ça plus d'une fois dans la journée.
Java à besoin d'un IDE pour renommer une classe, même si elle n'est pas utilisée.Après on peut parler des
ìmportà grain trop fin, de la javadoc illisible par défaut, ou des bibliothèques bloats qui sont inutilisables sans autocompléteur/générateur de code. - Remplacer
-
[^] # Re: Ou pas

Il existe aussi des cas ou les débuggeurs n'existent pas ou n'ont pas d'équivalent faciles à mettre en place.
-
# man iptables-extensions

iptables -t nat -A OUTPUT -p tcp --dport 40000 -j REDIRECToptionnellement avec l'option
--to-portspour rediriger vers un port local différent de 40000 (ça sert si ton numéro de port est inférieur à 1024). -
[^] # Re: C'est désespérant.

De loin, ça à l'air d'être une bonne idée. Sauf que
ipévolue bien plus lentement queiw, parce que globalement, si IPv4/IPv6 n'a pas trop changé en 10 ans, Wi-Fi à juste eu trois révision complète de la norme, sans parler du nombre d'amendements.Et surtout, en pratique, les mainteneurs de
iwet de la couche Wi-Fi du noyau préfèrent refourger toutes les responsabilités précédemment dans le noyau àwpasupplicant, et du coup, décourager l'utilisation simple d'iw, puisque le noyau seul n'a pas toutes les fonctionnalités dewpasupplicant. -
[^] # Re: C'est désespérant.

Parce que tes outils sont déjà cassés dès que tu essaye de les utiliser pour des configurations un tant soit peu avancées. Et que les couches de compatibilitées sont tellement grosses qu'elles sont obligées de mentir, surtout pour
iwconfig(notamment sa qualité de signal…), maisifconfigetroutene sont pas épargnés dès que l'on met plusieurs adresses par interfaces, ce qui est normal en IPv6…Franchement, on ne peut plus faire confiance a la sortie de ces outils : ils ne montrent pas toutes les informations, ils mentent et leur utilisations peuvent péter une conf réseau qui aurait marché avec
ip/iw/netlink, a cause de ces petites options qui font la différence entre un réseau qui marche et un réseau qui marche pas.Tes outils sont cassés et tu ne t'en est pas encore rendu compte.
-
[^] # Re: NetworkManager

NetworkManager s'adapte à toutes les situations, du simple utilisateurs de base qui veut se connecter de partout à l'alpha-geek qui souhaite une configuration IPv6 poussée
Est-ce que NM supporte enfin l'autodétection ARP a la guessnet ? Parce que sinon, ça reste très moyen pour l'alphageek que je suis…
-
# C'est désespérant.

Plus de 150 personnes utilisent encore
iwconfig/ifconfig, alors que les deux sont carrément obsolète sous linux, surtout le premier.Certes, ce choix inclus peut-être des utilisateurs de BSD qui n'ont pas vu que
iwconfign'existait pas sur leur système, mais quand même. Les utilisateurs de Linux devraient apprendre à se servir d'ipetiwà la place. -
[^] # Re: Le support Dell

Il est (presque) interdit de vendre un produit avec du plomb en Europe, depuis les directives RoHS.
-
[^] # Re: Parisiens !

Indice: c'est pas à Paris.
-
[^] # Re: Trollons

Tu dois dezipper un fichier de 1gb, tu preferes quoi:
Un processus à part, avec qui tu communique, et sur lequel tu à bien plus de contrôle que sur un thread. Tu peut définir plus finement sa priorité, ce que tu partage avec lui, et, point bonus, si jamais ton imbécile d'utilisateur idiot change d'avis, tu peux tuer ton processus et l'oublier, pas comme avec les threads ou tu est obligé de faire des hacks foireux.
-
[^] # Re: Attention aux canaux WiFi

Si tu à un moyen automatisé pour détecter de manière certaine que ton AP à été acheté en France et qu'ils fonctionne avec les canaux français avec le firmware de base (le constructeur à sans doute testé son matos final avec la régulation française lui-même), je pense qu'ils seront intéressés.
Le problème est dans le « certain ».
-
[^] # Re: Attention aux canaux WiFi

Le problème est plus complexe que ça, et c'est pas comme si le sujet revenait pas tout les mois sur certaines mailing lists.
Ce qu'il y a dans l'EEPROM, ça indique (entre autres) pour quelle régulations la carte à été testée. Si la carte n'a pas été testée avec les régulations françaises, personne ne peut garantir que la carte, lorsque tu la met sur ton canal 13, ne va pas se mettre à déborder sur les bandes de fréquences à coté ou, de manière générale, à foutre le boxon chez les autres. Pareil avec des puissances plus élevée.
Du coup, ce n'est pas en disant à la carte de se mettre sur telle fréquence avec telle puissance d'émission autorisée en France que la carte va respecter la législation française. Et étant donné que les fabriquants et les développeurs de pilotes sont térrorisés par tout ce qui est légal, il n'y a pas vraiment d'autres solutions que de ne pas autoriser le canal 13 sur ces cartes.
Mais après, ça soulève une autre question: qui à déjà vu des ath testés avec les régulations françaises ? Moi pas.
-
[^] # Re: un inconvénient des templates

Je vois pas ce qu'il y a d'illisible dans ton code. Ce n'est pas parce qu'on connais pas sa bibliothèque standard¹ que c'est forcément illisible.
Après si il y a ça sur trente lignes dans une seule fonction, son code est illisible, et il faut séparer ça en plusieurs fonctions. Tu ferais la même chose si tu voulais traduire ce code en C.
¹ Toutes les fonctionnalités de boost utilisées dans cette ligne sont dans C++11.
-
[^] # Re: C++ 2011 ?

Si tu utilise GCC ou Clang, compile avec
-Woverloaded-virtual. Ça générera des warnings dans ce cas. Peut-être même un peu trop. -
[^] # Re: De la réinvention de la roue.

Boost::Variant, c'est une « union »¹ et un entier pour dire quel type est actuellement utilisé, rien d'extrêmement compliqué. C'est comme la réimplémentation du RTTI avec un énum, sauf que c'est vérifié par le compilo, qu'il n'y a pas d'héritage et que ça permet d'utiliser des templates dans le visiteur. Et en plus, le code est déjà écrit (sinon au pire c'est pas bien compliqué à réimplémenter pour des cas spécifiques).
¹ Pas vraiment une union, car Boost::Variant supporte aussi les types avec des destructeurs et des constructeurs par copie qui lancent des exceptions, de manière assez poilue.
-
# De la réinvention de la roue.

Moi si on me disait aujourd'hui que je devais représenter une structure arborescente, et que je ne peux pas faire autrement (genre par exemple, j'ai vu des arborescences compliquées parcourues par des visiteurs, sauf que l'arborescence était statique…), je me poserait pas trop la question :
boost::variantetboost::apply_visitor. Si quelqu'un à une autre méthode où le visiteur peut gérer plusieurs types avec une méthode template, je prend.Après reste la question de comment l'utiliser: un
boost::variant<A,B,C...>avec A, B, C contenant des pointeurs vers des variants, ouboost::variant<std::unique_ptr<A>, std::unique_ptr<B>, std::unique_ptr<C> >. Chacun ayant ses inconvénients.Parce que bon, le coup de forcer ses types à être polymorphiques pour utiliser la RTTI ou de la réimplementer avec des énums, c'est un peu limite quand même.
-
[^] # Re: C++ 2011 ?

C'est la même chose qu'en Java: ça sert à détecter les surcharges involontaires. Par exemple
struct Base { virtual void traiter_truc(Truc& truc); }; struct Derived : Base { virtual void traiter_truc(Truc* truc); };Ça compile parfaitement, mais
Derived::traiter_truc()ne redéfinit pasBase::traiter_truc(), et si on active pas les warnings qui vont bien dans son compilateur (qui sont chiants car parfois, c'est voulu), on s'en rend compte qu'à l'exécution… ou pas.Si
Derived::traiter_trucétait marqué en override, il y aurai une erreur de compilation.
