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

 Delphi Discussion :

Nos petits trucs utiles de développeurs


Sujet :

Delphi

  1. #181
    Expert éminent sénior
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 627
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 627
    Points : 10 551
    Points
    10 551
    Par défaut
    Citation Envoyé par retwas Voir le message
    Je connaissait pas le OutputDebugString, merci
    Bien franchement il ne faut pas le connaitre

    C'est une vielle m^rd^ héritée des années 90 sans formatage de chaîne (*), qui est noyé dans les logs Windows (**) et qui est lent (***) (et spécifique à Windows cela va de soi)


    Édit: il y a aussi le formatage automatique de ton log. Par exemple un OutputDebugStringW(L"One log..."); donne "Debug Output: One log.... Process XXX.exe (1111)"
    Tu y vois que dalle

    Et enfin, avec C++ Builder, ce log apparait dans la fenêtre Event Log qui n'apparait que lorsque tu exécutes ton application. Sinon elle est fermée et tu dois aller dans le menu pour l'ouvrir


    * -> si tu veux afficher une variable il faut le faire manuellement et donc avoir 2 à 5 lignes de code par log

    ** -> Sous Android tu avais un filtre. Mais une fois les logs filtrés, tu ne voyais plus les exceptions passées

    *** -> Cela peut aussi venir du formatage de bourrin que je fais

  2. #182
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 671
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 671
    Points : 13 065
    Points
    13 065
    Par défaut
    J'utilise également actuellement CodeSite mais ai longtemps utilisé OutputDebugString (qu'en debug cela va s'en dire).

    Je ne trouvais pas cela si mal que ça. Ca fonctionne en 32 et 64 bits et avec l'aide de DebugView, on a nos logs sans installer d'outils lourds (DebugView permet même du Remote "Log").

  3. #183
    Membre expérimenté Avatar de guillemouze
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    876
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Novembre 2004
    Messages : 876
    Points : 1 448
    Points
    1 448
    Par défaut
    Citation Envoyé par foetus Voir le message
    Bien franchement il ne faut pas le connaitre

    C'est une vielle m^rd^ héritée des années 90 sans formatage de chaîne (*), qui est noyé dans les logs Windows (**) et qui est lent (***) (et spécifique à Windows cela va de soi)


    Édit: il y a aussi le formatage automatique de ton log. Par exemple un OutputDebugStringW(L"One log..."); donne "Debug Output: One log.... Process XXX.exe (1111)"
    Tu y vois que dalle

    Et enfin, avec C++ Builder, ce log apparait dans la fenêtre Event Log qui n'apparait que lorsque tu exécutes ton application. Sinon elle est fermée et tu dois aller dans le menu pour l'ouvrir


    * -> si tu veux afficher une variable il faut le faire manuellement et donc avoir 2 à 5 lignes de code par log

    ** -> Sous Android tu avais un filtre. Mais une fois les logs filtrés, tu ne voyais plus les exceptions passées

    *** -> Cela peut aussi venir du formatage de bourrin que je fais
    Interessant de dénigrer un outil sans proposer d'alternative !
    Je ne connais pas codesite (si c'est avec lui que tu compare outputdebugstring), mais outputdebugstring est dispo sur mon D7, je sais pas si codesite l'est.
    PS:
    * -> qu'est ce qui t’empêche d'utiliser la fonction Format dans le paramètre ?
    ** -> click droit > propriétés, et tu peux choisir les messages à afficher dans la fenêtre Event Log

    Bref, je vais regarder ce qu'est ce codesite, ca a l'air intéressant

  4. #184
    Expert éminent sénior
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 627
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 627
    Points : 10 551
    Points
    10 551
    Par défaut
    Citation Envoyé par guillemouze Voir le message
    Interessant de dénigrer un outil sans proposer d'alternative !
    ...

    * -> qu'est ce qui t’empêche d'utiliser la fonction Format dans le paramètre ?
    Très simple mais hyper hyper très très simple:

    En C++ (oui je travaille en C++ ), si tu codes une application fenêtrée avec la VCL toutes les sorties (printf et std::cout) sont désactivées (*)
    Et la méthode System::UnicodeString::Format utilise des TVarRec que je n'ai jamais réussi à utiliser sans que cela plante de partout.

    Donc OutputDebugString c'est ta seule solution parce que les points d'arrêt c'est mignon, mais ce sont des points d'arrêt. Il y a des fois tu ne veux pas arrêter ton programme (surtout avec les threads) et loguer sur la console tout ce qui peut d'aider déjà au moins pour mettre en place les engrenages de ton application.

    Ou alors mettre des TMemos sur toutes tes fenêtres.

    La solution c'est de faire un log en réseau et une fenêtre qui affiche ces messages. Tout cela parce que tu ne peux pas faire printf() qui existe depuis 30 ans


    Sinon je découvre DebugView ... qui rejoint ce que je dis et que j'ai codé en VCL très succinctement (<- encore un truc potentiellement inutile)



    * -> À moins que tu saches ce que je fais de mal

  5. #185
    Membre expérimenté Avatar de guillemouze
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    876
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Novembre 2004
    Messages : 876
    Points : 1 448
    Points
    1 448
    Par défaut
    Citation Envoyé par foetus Voir le message
    Et la méthode System::UnicodeString::Format utilise des TVarRec que je n'ai jamais réussi à utiliser sans que cela plante de partout.
    en delphi, c'est assez simple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    OutputDebugString(PChar(Format('mon message "%s" valeur=%d', ['test', Self.Count])));
    Citation Envoyé par foetus Voir le message
    Donc OutputDebugString c'est ta seule solution parce que les points d'arrêt c'est mignon, mais ce sont des points d'arrêt. Il y a des fois tu ne veux pas arrêter ton programme (surtout avec les threads) et loguer sur la console tout ce qui peut d'aider déjà au moins pour mettre en place les engrenages de ton application.
    (je suis en D7) Click droit sur le point d’arrêt, décocher "arrêter", et dans avancée, mettre par exemple Self.Count dans Evaluer l'expression, et tu obtiens dans le journal d'evenements
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Expression point d'arrêt Self.Count: 42 Processus MonApp.exe (8860)
    Citation Envoyé par foetus Voir le message
    * -> À moins que tu saches ce que je fais de mal
    Il me semble que tu peux activer la console dans une application windows (je crois me souvenir d'un message de Paul Toth à ce sujet sur ce forum), une variable globale stdout ou un truc du genre. Sinon peut etre avec AllocConsole.

  6. #186
    Membre chevronné
    Avatar de Droïde Système7
    Homme Profil pro
    Inscrit en
    Septembre 2003
    Messages
    2 262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 2 262
    Points : 1 928
    Points
    1 928
    Par défaut Sauter sur la première (bonne ?) idée...


    Ce thread dormant depuis un certain temps, je tente de le réveiller un peu

    Voici un petit truc tout bête mais qui au fil du temps, se révèle très intéressant à ne pas négliger.

    Je m'explique :

    Vous développez une appli de quelques milliers de lignes, et logiquement/régulièrement se pose une question d'algo qui potentiellement peut chambouler toute son architecture et potentiellement poser de sérieux problèmes en cours de prod.

    Mais presque à chaque fois vous trouvez la solution paraissant claire et nette... Et ensuite l'appliquez en ajoutant les lignes de code idoines.

    C'est à ce point précis que je souhaite placer le focus !

    Facile de sauter sur l'occasion afin de continuer le développement avec un petit "ouf" de soulagement, l'air de dire : "Bon... je peux continuer, puisque j'ai passé cette étape".

    Si quelques heures, ou pire, quelques jours plus tard, confronté à un petit souci d'effet de bord ou d'interrogation, vous vous apercevez que votre dernière idée d'algo pouvait avoir des variantes peut-être plus pertinentes ; là est tout le point auquel je souhaite placer ce focus.

    DS7

  7. #187
    Membre confirmé Avatar de Galet
    Homme Profil pro
    Consultant/Programmeur Robotique industrielle
    Inscrit en
    Mars 2010
    Messages
    323
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Consultant/Programmeur Robotique industrielle

    Informations forums :
    Inscription : Mars 2010
    Messages : 323
    Points : 483
    Points
    483
    Par défaut
    Bonjour à tous, et merci à Droïde pour cette idée...

    BUT : En plein travail, je dois m'absenter ou bien fermer mon PC, etc., comment retouver rapidement l'endroit exact de ma dernière écriture de code lors de la réouverture de mon EDI ?

    Simplement de taper n'importe quel caractère juste à l'endroit que vous étiez avant de passer à autre chose. Suffit en reprenant votre travail de lancer la compil, le compilateur vous indiquera gentiment l'endroit exact en question.
    J'utilise cette même méthode pour "planter mon code" sur une procédure en cours de rédaction.

    Pour le versionning, j'ai utilisé, par le passé TortoiseSVN, sinon, de manière plus simple, un répertoire "Sauve" dans chaque répertoire projet pour faire un bête Copier coller dans un répertoire daté après chaque jour ou etape importante.

    Pour le traçage, une unité comprenant un objet (Origine, Type, Criticité, message...) et une liste qui permet d'y écrire à la volée des messages ou information. Pour limiter le côté Fourre-tout, le stockage est fait suivant la valeur d'un integer, dont chaque Bit permet de filtrer les origines. Ainsi, en fin de projet, il suffit de mettre cet integer à 0 pour ne plus rien logger.

    A l'affichage, une fenetre ou un tPageControl dont la visue est annulée par un simple boolean. Pour certains codes, j'active dynamiquement ce boolean par une touche de fonction dans un menu ou fenètre rarement ouvert (configuration, Apropos...) ainsi, le mode Debug n'est pas actif en permanence mais est toujours, en cas de besoin, disponible...

    Bien l'bonjour chez vous...
    Windows 10 / Delphi Tokyo
    "Les choses ne changent pas. Change ta façon de les voir, cela suffit" Lao Tseu

  8. #188
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 430
    Points
    28 430
    Par défaut
    quand je modifie un code de façon assez profonde et potentiellement foireuse, je mets toutes mes modifs dans des $IFDEF / $ELSE / $ENDIF

    ça peut donner des choses comme ça par exemple (dernier bug TLS introduit par la mise à jour Windows !)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    {$IFDEF INDY}
      HTTP := TidHTTP.Create(Self);
    {$IFDEF INDY_SSL}
      SSL := TIdSSLIOHandlerSocketOpenSSL.Create(Self);
      SSL.SSLOptions.SSLVersions := [sslvTLSv1_2];
    {$ELSE}
      SSL := TIdSSLIOHandlerSocketSChannel.Create(Self);
    {$ENDIF}
      HTTP.IOHandler := SSL;
    {$ELSE}
      HTTP := THTTPClient.Create;
    {$ENDIF}
    avec quelques DEFINE je passe de TIdHTTP (avec ou sans OpenSSL) à THTTPClient...ça demande une recompilation, mais au moins je peux facilement basculer d'un comportement à l'autre.

    si la modif implique un composant visuel (dernièrement j'ai remplacé un DBGrid par un composant perso qui ne dépend pas d'un DataSet mais d'une requête JSON) je peux avoir des choses comme

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    {$IFDEF JSON}
      DBGrid.Hide;
      MyComponent.Visible := True;
      MyComponent.Align := alClient;
    {$ELSE}
      MyComponent.Hide;
      DBGrid.Visible := True;
      DBGrid.Align := alClient;
    {$ENDIF}
    ça rend parfois les choses un peu complexes avec pas mal de IFDEF mais ça reste plus flexible que du versioning car on n'a pas besoin de changer les sources mais juste d'activer/désactive des DEFINE
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  9. #189
    Membre chevronné
    Avatar de Droïde Système7
    Homme Profil pro
    Inscrit en
    Septembre 2003
    Messages
    2 262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 2 262
    Points : 1 928
    Points
    1 928
    Par défaut
    Paul

    Moi à ta place je réalise tout bêtement une copie sur des clés USB

    Au moins si le code devient foireux, pas de prise de tête ; simplement un échange de dossier et basta en moins d'une minute l'affaire est résolue.

    Tiens, justement niveau sauvegarde : perso le soir je sauvegarde au moins sur trois clés USB le dossier en cours de développement.

    Ma méthode est ainsi :

    1Appli
    2Appli
    3Appli
    etc.

    Bien entendu la synchro sur les différentes clés ne sont pas concordantes, mais au moins si un truc part carrément en vrille, je sais qu'en piochant dans mes clés, je trouverai à coup sûr la version qui remplacera l'ancienne qui partait en vrille.

    DS7

  10. #190
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 430
    Points
    28 430
    Par défaut
    ah non, ça je ne fais plus de copie, après t'en as partout et tu ne sais plus quoi en faire

    en local j'utilise GIT pour versionner mes sources, et je synchronise avec un GIT en ligne pour les sauvegardes.

    et de temps à autre je fais une image de mon disque dur sur un disque externe pour avoir une copie complète de ma machine.
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  11. #191
    Membre expert
    Avatar de pprem
    Homme Profil pro
    MVP Embarcadero - formateur&développeur Delphi, PHP et JS
    Inscrit en
    Juin 2013
    Messages
    1 876
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : MVP Embarcadero - formateur&développeur Delphi, PHP et JS
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 876
    Points : 3 611
    Points
    3 611
    Par défaut
    Citation Envoyé par Droïde Système7 Voir le message
    Bien entendu la synchro sur les différentes clés ne sont pas concordantes, mais au moins si un truc part carrément en vrille, je sais qu'en piochant dans mes clés, je trouverai à coup sûr la version qui remplacera l'ancienne qui partait en vrille.
    Tu devrais peut-être (re)découvrir Beyond Compare et leur fonction de synchronisation d'arborescence (en miroir ou simple copie). en plus il y a un mode script.

    Ca fait un bail que je ne l'avais pas installé. M'en suis servi cette quinzaine pour faire une archive de mon NAS et de sa multitude de dossiers en filtrant les fichiers gonflants du Mac (.DS_Store) et de Windows (Thumbs.db) après quelques essais et plantages systématiques avec le Finder du Mac qui semble infichu de copier une arborescence d'un disque réseau vers un disque externe même sur la dernière version de l'OS dès qu'il y a beaucoup de fichiers ou des dossiers "archives" comme des VM. et autant dire que des plantages après 2 jours de copie, ça saoule...

    BC, quelques changements de dossiers selon mes besoins et en une semaine les 10To d'archives et ordinateurs se sont retrouvés (à priori correctement) sur le disque de backup du moment.

    Pour le travail d'une manière générale, je ne bosse que dans des VM Windows jetables. Une à chaque nouvelle version de Delphi sauf besoin spécifique.
    (les licences MVP ont l'avantage de ne pas nous gonfler avec l'incrément d'activation, tout le monde ne peut pas faire pareil)

    Côté organisation sur les projets :
    - un stockage dans un dépôt Git sur mon NAS via Gitea (paquet "maintenu" sur Asustor pour ça) pour les projets privés/clients, GitHub pour les projets publics,
    - un dossier de travail local "jetable" sur la VM en cours,
    - une archive en ZIP du projet à chaque version + stockage sous forme de fichiers/dossiers des trucs que je n'inclus pas dans le dépôt (clés de chiffrement, mots de passe, paramètres "release")

    Du temps où je bougeais je passais mon temps à galérer à synchroniser ce que je faisais sur une machine ou une autre. Désormais je déplace la VM de travail actuelle et/ou je me contente d'utiliser le dépôt pour synchroniser les changements.

    Les systèmes de gestion de sources (dont "git"), c'est quand même génial (m'en sers que depuis 2 ans après 20 ans à me prendre la tête). On ne le dira jamais assez : mettez-vous y, avec ou sans logiciel d'interface côté client ou serveur.

    Git a l'avantage de gérer les dépôts "serveur" comme il le fait avec les dépôts "clients" sans avoir besoin de vrai serveur, un simple dossier avec la bonne commande pour l'activer suffit. On peut créer un dépôt principal dans un dossier, le dupliquer en local dans un autre dossier, faire ce qu'on veut, le synchroniser ou le jeter, ... Mettez-Vous y !

    (et faites des backups de vos dépôts comme de vos autres données : on n'est pas à l'abri d'une corruption de l'arborescence et de la DB de git, et si on dépend de ça, on est cuit)

  12. #192
    Membre chevronné
    Avatar de Droïde Système7
    Homme Profil pro
    Inscrit en
    Septembre 2003
    Messages
    2 262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 2 262
    Points : 1 928
    Points
    1 928
    Par défaut
    Patrick

    Encore un coup de GIT

    Je ne connaissais pas du tout.

    Serait intéressant de connaitre l'impression d'un ou plusieurs développeurs idem ; ne connaissant pas et qu'ils tentent cette méthode.

    J'ai connu les débuts de l'informatique et les fameuses disquettes d'une lenteur légendaire.

    Ensuite l'avènement des clés USB, et depuis j'avoue non sans rougir que toute autre solution me paraît des plus alambiquée. Mais ce n'est que mon opinion et oui j'en ai honte

    DS7

  13. #193
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 429
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 429
    Points : 24 794
    Points
    24 794
    Par défaut
    Si l'on veut coupler les directives avec simplicité sans avoir un code qui devient illisible, je le sais bien pour le faire aussi comme Paul Toth, surtout durant une migration.

    C'est d'utiliser une classe avec des méthodes virtuelles, voire même abstraite, et via une Factory dont le code est géré par les directives, l'implémentation est différent, cela peut être une dépendance comme Indy justement.
    D'ailleurs, ça devient presque une pattern Strategy

    le code de Paul est pile dans ce cas
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    HTTP  := THTTPFactory.GetInstance();
    {$IFDEF INDY}
    SSL := TIdSSLIOHandlerSocketFactory.GetInstance(HTTP);
    {$ENDIF}
    syntaxe approximative, oui c'est long mais si c'est du code beaucoup invoqué, on gagne sur la simplicité d'appel

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    type
      THTTPFactory = class
      public
         class function GetInstance(): {$IFDEF INDY}TidHTTP{$ELSE}THTTPClient{$ENDIF};
      end;
      TIdSSLIOHandlerSocketFactory = class
      public
         class function GetInstance(AHTTP: TidHTTP): {$IFDEF INDY_SSL}TIdSSLIOHandlerSocketOpenSSL{$ELSE}TIdSSLIOHandlerSocketSChannel{$ENDIF};
      end;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    class function THTTPFactory.GetInstance(): {$IFDEF INDY}TidHTTP{$ELSE}THTTPClient{$ENDIF};
    begin
      Resut := {$IFDEF INDY}TidHTTP{$ELSE}THTTPClient{$ENDIF}.Create({$IFDEF INDY}Self{$ENDIF});
    end;
     
    class function TIdSSLIOHandlerSocketFactory .GetInstance(AHTTP: TidHTTP): {$IFDEF INDY_SSL}TIdSSLIOHandlerSocketOpenSSL{$ELSE}TIdSSLIOHandlerSocketSChannel{$ENDIF};
    begin
      Resut  :=  {$IFDEF INDY_SSL}TIdSSLIOHandlerSocketOpenSSL{$ELSE}TIdSSLIOHandlerSocketSChannel{$ENDIF}.Create(AHTTP);
      {$IFDEF INDY_SSL}
      Resut.SSLOptions.SSLVersions := [sslvTLSv1_2];
      {$ENDIF}
      AHTTP.IOHandler := Result;
    end;

    Et encore, là c'est un cas statique, on peut pousser le vice ensuite avec un RegisterClass(class of) pour améliorer encore plus la patten ... on peut en trouver des tas dans FMX pour instancier les implémentations selon la cible .
    En D7, j'ai beaucoup pratiqué cela... mais personne ne comprenait qu'en ajoutant un uses cela changeait complètement une application.
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

Discussions similaires

  1. Thread "Nos petits trucs utiles de.." cadenassé
    Par Droïde Système7 dans le forum Débuter
    Réponses: 8
    Dernier message: 22/02/2012, 12h45
  2. Petit truc utile que j'ai découvert $.each
    Par SpaceFrog dans le forum jQuery
    Réponses: 12
    Dernier message: 27/08/2010, 03h12
  3. Petit truc tout simple que je comprend pas
    Par Olaf MENJI dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 29/11/2005, 17h56

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