IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Débats sur le développement - Le Best Of Discussion :

Les langages de programmation que vous détestez


Sujet :

Débats sur le développement - Le Best Of

  1. #301
    Membre émérite
    Avatar de white_tentacle
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    1 505
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 1 505
    Points : 2 799
    Points
    2 799
    Par défaut
    Normalement, le GC demande au système des pools mémoire et les gère lui-même. Il ne fera donc pas plusieurs appels à free comme tu sembles le penser.

    De plus, si le GC est bien foutu, il inclue des optimisation pour la désallocation de masse, ce que tu ne peux pas faire via des appels successifs à free.
    Sauf à utiliser un small object allocator. C'est pour ça que je dis que généralement, les benchs qui donnent le GC gagnant le font sur des codes qui, justement, nécessiteraient l'emploi d'un tel allocateur.

    Par contre, Frank a effectivement raison sur le point de la fragmentation mémoire (encore que les os récents (au moins les kernels linux récents) supportant la défragmentation de la mémoire, je serais curieux de voir ce qu'il en est maintenant).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Program 	Compile 			Compile Time 	Run 				Run Time
    D wc 		gdc -O2 -frelease -o wc wc.d 	0.326 		wc alice30.txt > /dev/null 	0.041
    D wc 		dmd wc -O -release 		0.235 		wc alice30.txt > /dev/null 	0.041
    C++ wccpp1 	g++ -O2 -o wccpp1 wccpp1.cc 	2.874 		wccpp1 alice30.txt > /dev/null 	0.086
    C++ wccpp2 	g++ -O2 -o wccpp2 wccpp2.cc 	2.886 		wccpp2 alice30.txt > /dev/null 	0.095
    Tu as les codes sur la page. Il n'y a franchement pas d'aberrations dans el code C++ (il y en a deux versions).

    L'option de compile release en D permet d'obtenir un exécutable non managé (pas de runtime check). On peut donc se prendre un seg fault dans les dents mais on tourne à pleine vitesse.
    J'ai pas trouvé wccpp1. Par contre, wccpp2 est une vaste plaisanterie : il parcourt deux fois le buffer, 1 fois pour compter les lignes, une autre fois pour compter les mots. C'est fou, c'est plus long que le programme D qui ne fait qu'un seul parcours .

  2. #302
    Membre émérite
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 537
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 537
    Points : 2 548
    Points
    2 548
    Par défaut
    C'est pas supposé être deux fois plus long. Tu parcours deux fois le machin, mais tu fais deux fois moins d'opération à chaque fois.

    Normalement tu es pas supposé te retrouver avec un truc plus de deux fois plus long.

  3. #303
    Inactif  
    Avatar de Mac LAK
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    3 893
    Détails du profil
    Informations personnelles :
    Âge : 50
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 3 893
    Points : 4 846
    Points
    4 846
    Par défaut
    Tiens, juste un point de remarque :

    Citation Envoyé par Franck SORIANO Voir le message
    Avec un GC, la mémoire aurait pû être dégramentée et libérée plus tôt.
    Bien sûr dans ce cas, j'ai écrit l'appli pour illustrer le phénomène. Mais j'ai des applis en production, qui bien que parfaitement écrites (enfin au niveau mémoire) sans memory leak consomme jusqu'à trois fois plus de mémoire que ce quelles utilisent réellement (si on compare la mémoire allouée auprès du gestionnaire de mémoire, à celle allouée auprès de l'OS).
    C'est pour réduire ce phénomène que l'on peut utiliser, sous Windows, les tas privés... La destruction d'un tas libère, bien sûr, l'intégralité des pointeurs alloués dessus d'un seul coup (attention, les pointeurs deviennent alors invalides bien entendu, ils ne passent pas magiquement à NULL / Nil).

    On garde donc le tas par défaut pour les données cruciales de l'application (qui doivent perdurer toute la vie de l'application), et des tas privés pour les machins infects qui fragmentent à tout va OU pour récupérer brutalement et rapidement de la mémoire, en évitant des libérations massives en chaîne.

    Cela permet de résoudre le cas que tu cites, en tout cas.

  4. #304
    Membre éprouvé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2006
    Messages
    519
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Septembre 2006
    Messages : 519
    Points : 1 105
    Points
    1 105
    Par défaut
    Citation Envoyé par deadalnix Voir le message
    C'est pas supposé être deux fois plus long. Tu parcours deux fois le machin, mais tu fais deux fois moins d'opération à chaque fois.

    Normalement tu es pas supposé te retrouver avec un truc plus de deux fois plus long.
    En une fois, à chaque itération :
    • Comparaison
    • Comparaison
    • Incrémentation


    En deux fois :
    • Comparaison
    • Incrémentation


    Le faire en une fois résulte en moins d'opérations puisque l'incrémentation se fait n fois où n est la longueur de la chaîne, contre 2*n.

    La différence n'est peut-être pas énorme, mais elle existe

  5. #305
    Membre émérite
    Avatar de white_tentacle
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    1 505
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 1 505
    Points : 2 799
    Points
    2 799
    Par défaut
    Tu as les codes sur la page. Il n'y a franchement pas d'aberrations dans el code C++ (il y en a deux versions).
    Oh, j'oubliais, mais passer par un istreabuf_iterator pour tout copier dans un vector de char, c'est une belle aberration .

    C'est pénible, mais les benchs faits par les éditeurs de langage, j'en ai jamais vu de corrects...

  6. #306
    Membre émérite
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 537
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 537
    Points : 2 548
    Points
    2 548
    Par défaut
    Citation Envoyé par spidermario Voir le message
    Le faire en une fois résulte en moins d'opérations puisque l'incrémentation se fait n fois où n est la longueur de la chaîne, contre 2*n.

    La différence n'est peut-être pas énorme, mais elle existe
    Bien sur. Cela explique que le programme wccpp2 soit plus long. Cela n'explique cependant pas un tel retard. Il semble que le lien wccpp1 soit mort :/ c'est dommage.

  7. #307
    Membre éprouvé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2006
    Messages
    519
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Septembre 2006
    Messages : 519
    Points : 1 105
    Points
    1 105
    Par défaut
    Citation Envoyé par deadalnix Voir le message
    Bien sur. Cela explique que le programme wccpp2 soit plus long. Cela n'explique cependant pas un tel retard.
    Et la réponse de white_tentacle ?

  8. #308
    Membre actif
    Inscrit en
    Juin 2008
    Messages
    189
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 189
    Points : 268
    Points
    268
    Par défaut
    Citation Envoyé par white_tentacle Voir le message
    Le problème de la libération de la mémoire en C++ est un faux problème. Le vrai problème, c'est que les programmeurs codent sans réfléchir à la durée de vie de leurs objets. Les langages avec ramasse-miette permettent effectivement cela. C++, non. En C++, il faut réfléchir à la durée de vie de ses objets, et à la responsabilité des objets (ie, qui tient la ressource).
    A quand un débat sur le garbage collector où on suppose que les développeurs ne sont pas complètement nases et ignorants ?

    Car oui, face à de mauvais programmeurs, n'importe quel langage a des inconvénients décuplés. A partir de là, on peut un peu tout dire.

  9. #309
    Membre émérite
    Avatar de white_tentacle
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    1 505
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 1 505
    Points : 2 799
    Points
    2 799
    Par défaut
    Citation Envoyé par Jack Sparrow Voir le message
    A quand un débat sur le garbage collector où on suppose que les développeurs ne sont pas complètement nases et ignorants ?
    Je crois que le message de Frank correspond bien à ça.

    Car oui, face à de mauvais programmeurs, n'importe quel langage a des inconvénients décuplés. A partir de là, on peut un peu tout dire.
    Comme dire que c++ ne sert qu'à faire des programmes troués de partout, qui fuient de la mémoire et font des buffer overflow tout le temps .

  10. #310
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par deadalnix Voir le message
    C'est pas supposé être deux fois plus long. Tu parcours deux fois le machin, mais tu fais deux fois moins d'opération à chaque fois.
    Bah justement, si le nombre de mots à compter est grand, on devient memory-bound très vite et ce raisonnement ne tient plus vraiment. Il est donc normal que le programme qui parcoure une seule fois une zone mémoire aille à peu près 2x plus vite que celui qui la parcoure deux fois. Une partie des opérations elle-même devient "gratuite" du coup. Enfin, c'est un benchmark un peu publicitaire quoi...

    Sinon deadalnix quand tu dis que le GC fait des pools automatiquement selon le type d'objet, tu l'as constaté avec quels GC ? Ca à l'air intéressant.

  11. #311
    Expert éminent sénior
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    6 805
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Décembre 2007
    Messages : 6 805
    Points : 32 095
    Points
    32 095
    Par défaut
    Citation Envoyé par Jack Sparrow Voir le message
    A quand un débat sur le garbage collector où on suppose que les développeurs ne sont pas complètement nases et ignorants ?

    Car oui, face à de mauvais programmeurs, n'importe quel langage a des inconvénients décuplés. A partir de là, on peut un peu tout dire.
    Et moi je vais jouer l'avocat du diable.

    Parce que des incompétents, il y en a 30% dans tous les métiers. Le développement ne fait pas exception à la règle. Et on peut toujours être suivi par un incompétent, voire, l'être soi-même par moments(je l'ai parfois été, et je suppose que chacun dans ce thread l'a été au moins une fois).

    La question, je la retournerais : comment programmer pour que même une huitre ne sabote pas tout? Quel langage est assez solide pour résister à des tanches, tout en étant assez puissant pour permettre des architectures évolutives et adaptées? Je n'ai pas la réponse. Mais il me semble que C/C++, sans GC ni aucun filet, pardonne beaucoup moins que C# avec son GC. Et que, donc, dans un environnement professionnel vaste, avec plein de gens qui vont repasser sur le code, sans tous être des spécialiste, n'est pas forcément un choix optimal.

    Après, ça dépend, comme toujours, de ce que l'on fait. Pour de l'embarqué, la question ne se pose même pas : on alloue tout au début, et c'est tout, ça se dés-alloue quand on appuie sur OFF..... GC ou pas, ça ne change pas grand chose. Inversement, pour une appli de gestion lourde, spécialement en transactionnel, le choix est fondamental. Perso, je serais partisan du GC, tout simplement parce que la perfection n'est pas de ce monde. Et qu'il suffit d'un stagiaire peu au fait de ces problématiques spécifiques, ou d'un ancien reconverti en vitesse à ce nouveau langage, pour que la catastrophe advienne. Évidemment, si on a le budget pour une triple revue de chaque code, on peut chercher la perfection, mais est-ce fréquent?

  12. #312
    Membre actif
    Inscrit en
    Juin 2008
    Messages
    189
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 189
    Points : 268
    Points
    268
    Par défaut
    Citation Envoyé par el_slapper Voir le message
    Parce que des incompétents, il y en a 30% dans tous les métiers. Le développement ne fait pas exception à la règle. Et on peut toujours être suivi par un incompétent, voire, l'être soi-même par moments(je l'ai parfois été, et je suppose que chacun dans ce thread l'a été au moins une fois).
    Je ne dis pas que le débat n'est pas intéressant. Mais j'aurai tendance à penser que ce sont, au fond, 2 débats différents (ou il faut séparer les 2 cas)

  13. #313
    Invité
    Invité(e)
    Par défaut
    Perso le GC a pas mal changé ma manière de programmer (j'espère pour le mieux).

    Avant j'essayais d'éviter les problème d'ownership compliqués en mettant clairement un "propriétaire" ou un manager en charge de la destruction.

    Maintenant, un objet qui a besoin de quelque chose le référence (directement ou pas), que ca soit de la mémoire, une librarie, ou une ressource quelconque. Les seuls problème proviennent d'une destruction qui n'a pas eu lieu dans le bon ordre, donc d'une dépendance qu'on a oubliée. Ca ressemble à écrire un makefile

    Ce qu'il ne faut pas oublier c'est que les solutions comme les smart pointers C++ ne permettent pas de faire des cycles, ce qui fait que les problèmes de fuites mémoires et d'ownership ne sont pas complètement réglés. Et des questions se posent comme : "Quel smart pointer vais-je mettre à NULL dans cette structure compliquée pour qu'elle soit effectivement libérée ?".

    C'est peut-être pas toujours adéquat ou efficace, mais je ne pense pas que ça conduise à du bloat. On peut sortir de ce schéma quand on veux.

  14. #314
    Membre expert Avatar de jabbounet
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juin 2009
    Messages
    1 909
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 909
    Points : 3 284
    Points
    3 284
    Par défaut
    Citation Envoyé par ponce Voir le message
    Ce qu'il ne faut pas oublier c'est que les solutions comme les smart pointers C++ ne permettent pas de faire des cycles, ce qui fait que les problèmes de fuites mémoires et d'ownership ne sont pas complètement réglés. Et des questions se posent comme : "Quel smart pointer vais-je mettre à NULL dans cette structure compliquée pour qu'elle soit effectivement libérée ?".
    Au risque de lancer un autre débat, mon opinion et que au moins 80%, (dans l'ideal 100%) des problèmes doivent être réglé lors des phases spécifications/conception.

    j'ai trop souvent vu des objets super compliqué pour résoudre des problèmes simples parceque que les gens qui avait fait l'évolution de l'application ne s'était pas suffisamment réuni autour d'une table pour discuter du problème avant de pondre leur code.

  15. #315
    Membre émérite
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 537
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 537
    Points : 2 548
    Points
    2 548
    Par défaut
    Citation Envoyé par ponce Voir le message
    Sinon deadalnix quand tu dis que le GC fait des pools automatiquement selon le type d'objet, tu l'as constaté avec quels GC ? Ca à l'air intéressant.
    Le GC de D ne le fait pas, mais celui de java le fait par exemple.

  16. #316
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par el_slapper Voir le message
    La question, je la retournerais : comment programmer pour que même une huitre ne sabote pas tout? Quel langage est assez solide pour résister à des tanches, tout en étant assez puissant pour permettre des architectures évolutives et adaptées?
    Le meilleur moyen, c'est de ne pas embaucher la personne, de la virer quand elle commence à devenir nuisible, ou, s'il ne s'agit que d'un état transitoire (on a tous été "apprenants" à un moment) de ne pas lui confier des tâches où elle risque de faire des dégats. C'est un problème de management, pas de technique.

    Choisir un environnement de développement pour pallier les lacunes d'une politique d'embauche, ça ne me parait pas très bon signe pour l'entreprise...

    Mais c'est malheureusement une tendance lourde : au fil des années, on fait davantage évoluer les langages pour les protéger des mauvais informaticiens que pour servir les besoins des bons.

    Je pense qu'il y a des arguments en faveur des GC. En particulier, l'idée que dans un grand nombre de cas, la gestion de la mémoire n'est pas un problème crucial, et qu'un système automatique, même imparfait, fait gagner suffisament de temps de développement pour en valoir la peine.

    L'idée qu'ils protègent des mauvais informaticiens ne me parait pas très bonne (d'autant plus qu'un vrai mauvais, c'est capable de planter n'importe quoi!)

    Francois

  17. #317
    Membre émérite
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 537
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 537
    Points : 2 548
    Points
    2 548
    Par défaut
    Citation Envoyé par fcharton Voir le message
    Choisir un environnement de développement pour pallier les lacunes d'une politique d'embauche, ça ne me parait pas très bon signe pour l'entreprise...
    Et pourtant, on est en plein de dedans. Le concept est simple :
    1/ En langage managé, un incompétent va te faire un blob lourd et peu réactif.
    2/ En langage non managé, ça ne va tout simplement pas marcher.

    Et la, tu as comprit le succès de C#, java ou autres.

    Maintenant, ce n'est pas forcement idiot : un programmeur moins compétant, on peut le payer moins cher, le former plus vite, et si les commerciaux arrivent à vendre le truc, il n'y a pas de raisons de s'en priver.

    Bien sur, éthiquement, je n'adhère pas mais d'un point de vue 100% business, ça se tiens très bien.

    Alors attention, de mon point de vue, tous les codes non critiques devraient être fait en langage managé. Tout simplement parce que même un bon programmeur fait des erreurs.

    Souvent, c'est moins de 10% du code dans lequel passe plus de 90% de temps. Seuls ces 10% de code devraient être en natif. Pour le reste, c'est juste une prise de risque inutile.

    Un langage managé ne dispense pas un programmeur de savoir ce qu'il fait (afin d'éviter de terminer avec un blob horriblement lourd) mais au moins, ça apporte un sécurité. Ce n'est pas parce qu'on conduit bien qu'on devrait le faire sans ceinture, et enlever l'airbag de sa voiture.

  18. #318
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par deadalnix Voir le message
    Maintenant, ce n'est pas forcement idiot : un programmeur moins compétant, on peut le payer moins cher, le former plus vite, et si les commerciaux arrivent à vendre le truc, il n'y a pas de raisons de s'en priver.
    Je ne suis pas certain que ce soit vrai. Un programmeur incompétent n'est pas forcément moins cher, il est toujours plus lent, et ses programmes sont moins maintenables. Dans un environnement de type SSII, où l'on est payé au compteur, et si la concurrence n'est pas trop forte, ca peut être rentable.

    Chez un éditeur de logiciel, ou dans un environnement un peu compétitif, je n'y crois pas trop... En fait, quand une boite atteint un certain taux d'incompétents parmi ses devs, elle est généralement condamnée à assez court terme...

    Citation Envoyé par deadalnix Voir le message
    Alors attention, de mon point de vue, tous les codes non critiques devraient être fait en langage managé. Tout simplement parce que même un bon programmeur fait des erreurs.
    Le managé soit la seule solution. Personnellement, je n'en fais jamais (et j'écris un C++ relativement "casse gueule" en général), mais sur tout le code "facile" (en gros, tout que qui n'a pas besoin d'aller vite, ni d'être très intelligent, parce que de toutes façons, on le refera trois fois avant la fin de l'année), je sais utiliser des outils 'sans risque' (STL ou équivalent fourni par le framework, avec des conteneurs et algorithmes très basiques, et aucune prétention à l'élégance).

    Même dans des langages réputés délicats, il y a moyen de programmer "safe" et un bon développeur saura le faire.

    Et puis, les erreurs de mémoire, je trouve que c'est un peu un fantasme d'hier. Tous les compilateurs modernes sont fournis avec des outils pour les détecter et les pister, et pas mal de suites de test ou de profiling offrent des systèmes très poussés. Un bon programmeur fera des erreurs, mais il saura les corriger rapidement, parce qu'il dispose d'outils qu'il sait utiliser...

    Une fois de plus, le managé est d'autant plus nécessaire qu'on a dans l'équipe des gens qui croient que le debug, ca se fait à coup de traces, et qui se mettent à pleurer quand le truc leur saute à la figure en disant segfault...

    Francois

  19. #319
    Membre émérite
    Avatar de white_tentacle
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    1 505
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 1 505
    Points : 2 799
    Points
    2 799
    Par défaut
    Citation Envoyé par fcharton Voir le message
    Je ne suis pas certain que ce soit vrai. Un programmeur incompétent n'est pas forcément moins cher, il est toujours plus lent, et ses programmes sont moins maintenables. Dans un environnement de type SSII, où l'on est payé au compteur, et si la concurrence n'est pas trop forte, ca peut être rentable.

    Chez un éditeur de logiciel, ou dans un environnement un peu compétitif, je n'y crois pas trop... En fait, quand une boite atteint un certain taux d'incompétents parmi ses devs, elle est généralement condamnée à assez court terme...
    Ca résume très bien la réalité. En SSII, faire de la merde vendable est une option comme une autre (et vu le marché, à priori plutôt rentable). En édition logicielle, ça n'est pas tenable.

  20. #320
    Membre expérimenté Avatar de yann2
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2004
    Messages
    897
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2004
    Messages : 897
    Points : 1 635
    Points
    1 635
    Par défaut


    Et, souvent, il y a des "incompétents" parce que les "compétents" ne savent pas faire un passage de connaissance. Ou, encore pire, certains sont tout simplement considérés "incompétent" donc on ne leur parle pas, ça pourrait les instruire ("Mais non ! T'as pas besoin de connaitre l'architecture du système, code juste cette méthode !").

    Un peu HS mais, relisez vous parce que ça fait peur !

    Un nain con pétant.

Discussions similaires

  1. Réponses: 31
    Dernier message: 01/08/2012, 23h34
  2. Quelle est la plus grosse erreur de programmation que vous ayez jamais commise ?
    Par Katleen Erna dans le forum Débats sur le développement - Le Best Of
    Réponses: 138
    Dernier message: 03/08/2011, 23h38
  3. Réponses: 15
    Dernier message: 15/12/2010, 00h38
  4. Les langages de programmation logique
    Par hanou88 dans le forum Autres langages
    Réponses: 2
    Dernier message: 28/12/2009, 02h31

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo