 Vous m'entendez bien ? De toute façon, j'ai une grosse voix, donc il n'y a pas de problème là-dessus. Pourquoi est-ce que je vais faire ce petit talk, si ? Normalement, oui, t'inquiète, j'ai un gros compteur ici, d'ailleurs, je l'active. Ce n'est pas la première fois que j'en fais. C'est simplement que je suis consultant d'informatique, et principalement expert en piton, et j'ai beaucoup de personnes en dessous de moi que je dois souvent former justement aux bonnes pratiques de développement. Et le problème, c'est que parfois, ils utilisent des vieilles méthodologies de travail pour pouvoir le faire. Alors, je vais d'abord me présenter. Ce n'est pas à moi, donc je viens de découvrir le bouton, voilà. Ça, c'était moi l'année dernière au Paicon de Canada à Toronto, où j'ai fait une petite présentation. Je suis un fou amoureux de piton depuis au moins 20 ans. Donc, bien que certains ne sont pas encore nés, voilà, j'étais avant vous. Je suis membre de la PSF. Donc, la PSF, c'est la Fondation Piton. En fait, je suis membre honorifique de la PSF en même temps que Mathieu, qui doit se balader quelque part là-bas au fond. Le gars en vert avec une casquette et des lunettes qui est superbe. Donc, voilà. En gros, il y a eu une nomination, j'ai été dedans et voilà, j'étais pris. En même temps, je suis membre organisateur de l'Europe Highton. Donc, c'est 1200 personnes. Ça se déroule pendant une semaine. Un peu partout en Europe, on se choisit un lieu, on y va, etc. Il y a pendant une semaine des talks. Il y a 200 à 300 talks. Je suis aussi l'organisateur du Python Fossedem. Donc, en Belgique, on a un événement qui s'appelle le Fossedem, qui se déroule une fois par an. C'est 8000 personnes. Et dedans, j'ai une room où on a 600 personnes. Donc, voilà. Et en même temps, je suis contributeur de ces Python. Donc, je donne à coup de main au développeur, au cordet, etc. Et voilà, voilà. Donc, j'écris ma petite société. Et rien que pour l'événement, je viens directement de Belgique. Comme on l'a entendu tout à l'heure. Je peux faire l'accent en bas, je le ferai, mais bon, c'est tout. Je vais pas le faire plus loin. Sinon, on va me sortir l'accent québécois, j'ai pas envie. Donc, voilà. Alors, qui est-ce qui adore développer ? Levez un peu la main, là. Normalement, ok, ça va. Qui est-ce qui adore débugger ? C'est un peu moins. Qui est-ce qui adore utiliser un print ? Shame on you. Qui est-ce qui adore utiliser le logging ? Le module logging. C'est encore pire, quoi. Ça fait mal au cul. Wow. Ben, effectivement, j'ai été comme vous, en une époque, voilà. En fait, cette époque-là, elle est révolue depuis trois mois. Donc, je vais pas faire le malin, mais c'est comme ça que ça fonctionne. Quand on a compris un truc, on le présente comme talk. Et voilà, c'est comme ça que ça fonctionne à la majorité du temps. Mais ce qu'il y a aussi, c'est que, comme je le disais tout à l'heure, j'ai des équipes en dessous de moi et je dois les former. Parce que je suis payé pour autant aller les chercher les bonnes informations. Et un débugger, d'habitude, on n'aime pas trop l'utiliser. Et j'ai compris que c'était très utile dans beaucoup de cas. Alors, le débugger de Piton, parce que Piton vient directement avec un débugger. Il s'appelle PDB, il n'est pas bien méchant, il est très gentil. Il ne bouffe personne, ne vous inquiétez pas. Il n'est pas avec des grosses dents, etc. Bon, bien que c'est du Piton, ça ressemble à un gros serpent, il pourrait vous manger tout cru, ce n'est pas le cas. C'est une belle petite bébête, suffit de la lancer correctement. Et ça aide pour trouver pas mal de choses. Alors, une petite description que j'ai mis sur la slide, c'est simplement... Mais je vais la lire, c'est simplement Piton débugger et l'outil natif pour aider les développeurs à trouver et corriger leurs bugs. Les bugs de leur logiciel fétiche. Et entre parenthèses, je dis où celui qu'on récupère d'un ancien collègue ou d'un vieux prestataire. Vous voyez, vous avez un vieux code tout pourri que vous aviez donné à quelqu'un. Tout pourri. Il manquait des petits tests ou quelque chose, mais on vous l'a rendu encore plus pourri. Et vous vous demandez comment débugger. Et donc, le gars s'est dit, tiens, je vais peut-être rajouter des prints à gauche et à droite. J'ai déjà vu en prod sur un serveur des prints à la volée, comme ça. On s'est demandé, mais où est-ce qu'il a été me chercher ce truc-là ? Il connaît pas le débugger. La majorité du temps, à 90%, c'est non. Les mecs, ils ne connaissent pas le débugger. C'est pas une blague. Et je ne sais pas pour vous, mais en Belgique, on n'est pas forcément des as de la programmation. C'est pour ça que je suis payé, d'ailleurs. Mais bon. Alors, comme je le disais, effectivement, PDB vient directement avec Piton. Donc, ce n'est pas un truc à installer sur le côté. C'est vraiment bulletin. Il y a une hybrérie dans Piton, etc., qui le permet, et ainsi de suite. Alors, comment est-ce que ça fonctionne, ce machin ? C'est assez simple. J'ai donné un exemple. Si je ne montre pas cet exemple-là, les gars qui se trouvent là-bas et qui s'amusent à utiliser un print, ça devrait être en train de se demander, mais comment on fait ? Il suffit de faire ça. Donc, PDB, comme je le disais, c'est une hybrérie. Il suffit de l'importer. Donc, c'est import PDB, PDB, cette trace. Il n'y a que ça à faire pour le moment. C'est-à-dire que PDB, cette trace, l'utilisation de ce truc-là, comment l'utiliser, on arrive sur un bout de code qui nous semble un petit peu chaotique, rocambolesque et autres. Et on se dit, tiens, je vais mettre le debugger à cet endroit-là. Et de cette manière, on va pouvoir commencer à regarder au moment d'exécution toutes les petites valeurs. Alors, il y a des manières plus faciles de l'utiliser. On peut utiliser PyCharm ou d'autres outils ou tout est déjà intégré, etc. Mais ici, on est un peu à la dure. Un PyCharm, d'habitude, ça ne se trouve pas sur un serveur. Donc, on va faire de cette manière-là. Alors, ici, c'est un tout petit exemple. J'ai simplement une petite fonction, etc. Et je demande d'habitude, tiens, qu'est-ce qu'elle fait cette fonction-là ? Et les gens disent, bon, elle doit faire ça. Mais en fait, elle ne fait rien du tout. Sauf que moi, dans mon cas, avec le PDB, on va directement aller en mode debug. Et ça va me permettre de pouvoir aller plus loin. Donc, cet exemple-ci, donc, importe PDB et PDB, cette trace. Le PDB, cette trace se trouve juste là. C'est la majorité des cas que vous allez utiliser. C'est comme ça que vous allez l'utiliser. Ça va ? Qui est-ce qu'il a déjà utilisé de cette manière-là ? Waouh ! Eh ben, ça fait peur, hein. Ben, ben, heureusement, je suis bien là. Ça va. Donc, voilà, ça, il n'y a pas de souci. Alors, il y a d'autres exemples. On peut se dire, comme on le disait tout à l'heure, notre cher ami, c'est qu'il y a possibilité de faire un post mortem. Qu'est-ce que c'est qu'un post mortem ? Ben, vous lancez votre exécution et donnez que vous avez un beau crash. Le beau crash, ben, vous êtes un petit peu ennuyé. Comment est-ce que je peux retourner sur l'exception qui a posé le problème, etc., et ainsi de suite. Eh ben, en fait, on va faire simplement un petit try-accept dans lequel on récupère une exception. Et ensuite, on va faire PDB post mortem. Le post mortem, ce qu'il va faire, c'est simplement récupérer la stack trace et retrouver, retourner à la ligne qui a posé l'exception. Ça va jusque-là ? Donc, on passe d'un état un peu... Tiens, je vais essayer de trouver le problème en mettant à cette trace et à une solution où le post mortem va nous dire, tiens mon gars, c'est ici qu'il y a le problème. C'est là que tu dois les fixer, c'est pas ailleurs. Ça va ? Donc, l'exemple, eh ben, il tout bête. Ici, j'ai mon petit code qui est juste là. Je l'exécute. Et à partir de l'exception, donc j'ai une exception qui est lancée et j'ai un break point qui est juste là qui est balancé à un back trace. Pardon, pas un break point, sorry. Alors, on a le back trace et à partir de là, je peux voir la stack trace qui a été exécutée par l'interprèteur. Et après, je peux commencer à regarder et ainsi de suite. La petite flèche que vous voyez, c'est simplement le curseur, le curseur, l'instruction sur laquelle on se trouve dans l'exécution du software. Ça va ? Alors, il y a beaucoup de personnes qui s'amusent donc à faire les deux exemples que j'ai montrés. Un pour PDB, PDB cette trace ou PDB post mortem. Ça, c'est très bien, mais ce n'est pas très bien non plus. Il y a du pour et du contre. Pourquoi ? Parce qu'on est obligé de modifier le script. Donc, on a un outil, on a déjà recodé, etc. Et on est obligé de modifier. Et parfois, ce n'est pas forcément très intéressant. Donc, ce qu'on peut faire aussi, on peut lancer, par exemple, PDB directement sur la ligne de commande comme étant un module Python. Pour faire cela, il suffit de faire Python tirer M, PDB et le script Python, bien évidemment. Sinon, ça ne fonctionnera pas. Donc, si vous faites cela, à partir de là, vous allez directement rentrer dans un mode post mortem. Vous avez un gros script. Je ne sais pas moi. Ici, il y a un gars qui s'amuse à travailler sur du Odu. Toi. Personne ne connaît Odu. C'est un petit RP écrit en Python où il y a à peu près 7 millions d'utilisateurs qui l'utilisent. Il y a près 200 millions de codes, etc. Donc, c'est un petit outil. C'est principalement pour les entreprises. Et quand l'outil crache, mais forcément, des fois, on doit chipoter. C'est la même chose avec une application de Django ou autre chose. Le problème, c'est qu'il n'y a pas de debugger intégré dans cet outil-là. Et donc, on peut se dire, maintenant, je pourrais être un peu plus malin en utilisant Python tirer M, PDB. Automatiquement, quand j'aurai un crash, il va s'arrêter au bon endroit. Ça nous évite, s'il y a 50 appels dans la stack trace, on trouve directement l'endroit où on veut aller. C'est tout. C'est le but. Alors, le deuxième appel, c'est simplement, j'ai PDB-Command. Ça, j'expliquerai un petit peu. C'est-à-dire qu'en fait, vous voyez un petit peu dans PDB quand vous lancez quelques commandes à la maintien, BT, NX, machin, etc. Vous pouvez faire la même chose ici directement. C'est-à-dire que vous pouvez donner des ordres à PDB dès le lancement de l'application. Donc, ça peut être un exemple. J'ai 10 000 links. Je dois bien que tu ailles mettre un breakpoint automatiquement sur la ligne 500. On met breakpoint 500. C'est tout. Le système va le faire automatiquement. Est-ce que vous le saviez ? Personne ? Ah ben, j'ai bien fait de faire 6 000 kilomètres pour réussir. Voilà. Alors, ça, c'est un petit exemple. C'est un tout petit exemple qui fonctionne bien. J'ai pas eu à aller chercher un gros exemple de 100 000 lignes. Là, c'est un truc qui fait une vingtaine de lignes et c'est tout. J'ai une petite liste d'événements. Pas plus simple. On dit toujours qu'on comprend mieux quand c'est très simple. La seule différence, c'est que j'ai un petit yield qui est là. Pas bien compliqué. Donc, j'ai ma classe. J'ai une classe qui va représenter les événements. J'ai une petite fonction qui va aller chercher mes événements. Et j'ai mon main qui va aller lire un fichier CSV. Le fichier CSV, le voici. Il n'est pas très difficile. Il y a quelques lignes, etc. Ça va ? Donc, l'exemple est assez simple. Le seul problème, c'est qu'à un moment, moi, je le sais, c'est qu'à gauche, j'ai le nom de l'événement. À droite, j'ai directement la date de l'événement. Sauf dans le dernier cas où j'ai un X. On va essayer de poser le problème et on va y arriver. Alors, on va lancer un petit peu l'exécution du script. Et bien évidemment, moi, je le sais, parce que je l'ai fait exprès de cracher le système. Je vais avoir ici une stack trace. Ça va ? Jusqu'à là, il n'y a pas de problème ? D'accord. Alors, normalement, j'ai une petite démo à vous montrer. Alors, la petite démo, elle n'est pas bien compliquée. Et j'ai besoin aussi d'une troisième main, tu vois. C'est assez amusant, mais bon, voilà, un petit réfrège. J'ai pris le temps de la faire un peu à l'avance il y a deux mois, donc voilà. Donc ici, j'ai mon fichier CSV qui est là. J'affiche le code, blablabla. Je l'exécute avec IPDB. Donc, il y a deux demoiselles là qui travaillent sur IPDB. C'est pour elle que j'ai fait ça. Et donc là, on s'amuse à afficher le code. Je fais une pause. Merci. Donc, PDB, là, je vous montre un petit peu. Après, j'ai toutes les commandes dans des tailles, etc. Ne t'inquiète pas, j'ai le temps. J'ai toutes les commandes qui vont venir, etc. La première, c'est le break. Le break, en fait, permet de lister les breakpoints qui sont dans l'instance du debugger. Donc, si vous ne savez pas, ben voilà. Maintenant, vous pouvez vous amuser avec ça. Le break9, ben en fait, là, j'ai une ligne 9. La ligne 9 avec serve date, pendulum, parse. En fait, quand on fait break9, on va aller me poser un breakpoint. On va aller le mettre. Ce qui veut dire qu'à chaque fois qu'on va réexécuter le code, le script, automatiquement, il va laisser arrêter dessus, ça va ? Après, je peux recommencer avec la commande break. Et automatiquement, il va me dire, voilà, tu as un breakpoint qui se trouve, ben c'est le numéro 1 déjà, et il se trouve sur va débuguer ton piton, comment dire, à la ligne 9 du fichier events.py, ça va ? Donc, vous pouvez mettre des breakpoints un petit peu partout dans votre code. Il n'y a pas de souci. Alors, juste un petit peu avant, il y avait une commande qui s'appelle LL, c'est l'onglet, c'est un piton. Ça, ils sont amusés à dire, voilà. On a la commande continue qui permet de continuer un petit peu dans un stack trace, jouer, passer du code, etc. Ça va ? Alors, qu'est-ce qu'on a d'autre pour le moment ? Ouais, avec le continue, ben en fait, comme on peut commencer à se déplacer dans un stack trace, à un moment, on se dit, tiens, je voudrais bien remonter, voir un petit peu l'état de mes variables de ma stack et ainsi de suite. Donc, on va avoir des commandes du style up, down et ainsi de suite. Si on se dit, tiens, je me balade dans mon code, j'ai par exemple ici dans la fonction qui est getEvents, qui est défini là, juste ici à droite, j'ai ce bout de code, si. Donc là, j'ai le stream et j'ai row. Mais je voudrais bien savoir un petit peu quel est le type de row. Donc, il y a une fonction qui s'appelle whatIs. Avec whatIs, automatiquement, on pouvait savoir le type. Ça va ? Donc voilà. Parce que ce que j'ai dit à vue, c'est des gens qui s'amusent avec le print, qui vont aller à la ligne en question, qui vont faire un print, qui vont lancer le script. Ils disent, j'ai pas assez d'informations, mais je vais encore modifier mon script, je vais rajouter un deuxième print avec le type et je vais me faire encore ainsi, ainsi, ainsi, jusqu'à ce que j'arrive à trouver toutes les informations. Nombre de personnes qui le font, je pense qu'ici, on est à plus de la moitié qui le font. C'est vrai ou c'est faux ? Oui, j'ai raison. Merci beaucoup. Voilà. Je vous dis, je l'ai fait. Donc, si moi, je l'ai fait, il doit... voilà. Alors, ben oui, si je l'ai fait, c'est que tout le monde l'a fait. J'apprends les trucs en dernier. Donc, je me dis, tiens. Alors, si on veut voir le contenu d'une row, il suffit de faire P row, simplement P row, print row. C'est simplement ça. Donc, là, on peut commencer à voir un peu le contenu de l'élément. Alors, bla, bla. Oui, le down. Tout à l'heure, j'ai montré le up. J'ai montré le down. Alors, il faut savoir, donc, on peut se balader dans une stack trace. Tout à l'heure, je voyais, il y avait des gars, donc, au sprint qui s'amusait avec JDB, à montrer un peu de code, etc. Et ils s'amusaient à se balader dans la stack trace. Et à chaque fois, c'était up, up, up, up, down, down, down, down. Depuis Python, en fait, on s'est amusé à mettre un paramètre supplémentaire qui dit, tiens, je veux descendre de deux niveaux ou de quatre niveaux, ou de remonter de six, et ainsi de suite. Donc, on peut vraiment se balader dans la stack trace assez facilement. J'ai découvert ça il y a trois semaines. Ça va. Alors, bla, bla, bla, bla, bla, bla, bla, bla. Oui, alors, avec le P, on peut donner toutes les fonctions que l'on veut. Donc, on a le Pd, le Pself, et on peut aller chercher le dictionnaire du self. Ça va? Donc, tout ce qui est dictionnaire et ainsi de suite. Donc, on l'affiche et voilà. On voit qu'on peut faire pas mal de choses. Tchoup, tchoup, tchoup. Alors, on a le printdir. Donc, le dire, comme vous avez l'habitude de faire dans l'interprèteur, ça va afficher directement toutes les méthodes qui se trouvent dedans. Si on fait un pp, c'est le pretty print. Donc, il va s'amuser à tout afficher correctement, tout joliment pour que ça soit super sexy ainsi de suite. Et on a aussi une fonction qui s'appelle args, une commande args qui va afficher les différents arguments qui sont utilisés par la fonction, par la méthode. Donc, on peut commencer à s'amuser à débugger. Donc, je reviens avec mon petit wadis avec... Ah oui, on a le petit disable, blah, blah. Je leur mets un peu... voilà. De tout à l'heure, j'ai montré avec les breakpoints. Donc, on peut créer un breakpoint, mais on peut s'amuser à désactiver. Si on peut le désactiver, on peut le réactiver. Et aussi, on peut s'amuser à le supprimer. Donc, ça, il n'y a pas de souci. On peut jouer là-dessus. C'est-à-dire qu'en gros, blah, blah, blah, ça, cette partie-là est assez intéressante. Voilà. Donc, je disais avec les breakpoints, on met un breakpoint à un moment dans le code. On se dit, voilà, il va être actif. Quand je vais repasser dans la fonction, il va être encore actif. Mais le problème, c'est que si on se trouve dans une boucle et que la boucle, elle fait un million d'iterration, ça va être très vite ennuyant. Le breakpoint, par exemple, on peut lui dire, tiens, je vais te mettre une condition ou je vais simplement désactiver. Ou je voudrais bien, par exemple, quand je vais passer sur le breakpoint, ça rajouter des commandes. C'est-à-dire que si j'arrive dans une... Allez, vous êtes en train de débugger, par exemple, une raquette Django, vous récupérez toujours le paramètre request. Et vous voulez, à chaque fois que vous arrivez dans cette fonction-là, c'est à ficher automatiquement le statut de la request. Quelle est la méthode, donc quelle est le verbe, etc. Il y a un coup qui... Est-ce qu'il y a une session et ainsi de suite. Donc, par exemple, avec commands, l'identifiant qui est juste à sa droite, donc là-bas, c'est juste là, c'est simplement le numéro du breakpoint. Donc automatiquement, quand on va arriver sur le breakpoint 1, automatiquement, il va afficher la date et le nom. Tout de suite. C'est quand même plus simple que de s'amuser avec des printes à gauche et à droite. Voilà. Donc là... On voit qu'ici, justement, c'est amusé à ficher les informations que je vais demander. C'est tout. Alors, dans PDB, on peut aussi s'amuser à créer des alias. Donc là, je suis en train d'en faire. Blah, blah. Oui, des fois, je tape très lentement. Voilà. Alors, qu'est-ce que c'est qu'un alias ? C'est un alias comme en shell. Dans un shell script, il n'y a pas de problème. Donc la commande, c'est simplement alias. Le nom de l' alias. Et après, ici, une expression piton. Et si vous regardez, moi, dans mon cas, c'est même du piton 3.6. Parce que j'utilise les f-strings. Ça va ? Donc tout ce que vous faites sur la droite, c'est directement du pur piton. Ça va ? Ça peut être aussi... Je vais interroger une base de données. Vous pouvez chercher le temps sur un serveur de temps, ou la météo, ou j'utilise un chatbot ou autre. Ça va ? C'est des idées. On peut faire beaucoup de choses avec ce tool. Voilà. Alors, bla bla. On va aller un peu plus loin. Alors, l'exemple ici, et je crée un deuxième alias qui utilise le premier alias qui a été défini juste là. Et je lui donne un paramètre. Alors, si vous regardez un petit peu, il y a un pourcent 1. Certains savent que d'habitude, quand on voit un dollar 1 ou un pourcent 1, ça correspond au premier argument pour soi. Donc ici, quand je vais faire pourcent 1, mais en fait, le ps self, le self devient le pourcent 1. Donc, il y a eu automatiquement une substitution. Donc, on peut commencer à généraliser certains alias pour les rendre plus intelligents. Donc, voilà. Mon breakpoint numéro 1, je pose qu'il va rajouter des conditions. Style. J'ai envie que tu exploses simplement quand date égale x. Ça va ? Est-ce que vous saviez ça ? Cool. Si je m'amène ici, que tout le monde sait déjà tout, ça s'arrête que je vienne. Donc, non, sérieusement, l'an s'amuse simplement à dire si jamais date égale x, automatiquement, tu te lances. Dans l'autre cas, je veux que tu t'arrêtes et que tu ne fasses rien du tout. Que tu laisses passer avec code. Donc, voilà. Là, je m'amuse à quitter. Alors, pdb vient aussi avec un truc qui s'appelle un fichier de configuration. Ça va ? Donc, le fichier de configuration pouvait mettre tout ce voulet. Moi, si j'ai mis pd égale pp2 d'hier lock, c'est pour afficher les locales. Print dict, c'est la petite fonctionnalité que j'ai montrée aussi. Non, ça, je ne veux pas l'annoncer, mais c'est print dict. Parce qu'en français, ça fait autre chose. J'aurais dû choisir un autre nom. Et ph, c'est pour afficher l'aide d'une commande, etc. Ça va ? Alors, la petite démo, la voici. On l'a faite. Me remet-la. Oui, c'est bon. Oui, parce que je regarde un petit peu, ça fonctionne. Donc, ici, cette partie-là, je vais la passer un petit peu vite fait, bien fait, dans le sens où ça reprend exactement tout ce que j'ai fait. Donc, je liste mon code avec la fonction L et LL. J'avance d'une ligne avec le next. Là, je me balade. Donc ça, je vais montrer un petit peu tout à l'heure vite fait. On saute dans le code. Donc, on peut utiliser le mode step. Donc, je rentre dans les fonctions. On peut encore se balader, etc. On a le next, le LL. Donc, on commence à voir pas mal de choses. On a les break points. On peut les lister avec la command break. On peut les ajouter. Donc, break 9, comme j'ai dit tout à l'heure. Donc, là, on voit un peu le statut. On peut désactiver avec disable. Bien évidemment, on peut les activer avec le enable. Donc, on voit le statut qui change. Là, il est activé alors que, juste là, il était désactivé. Donc, ça, on peut voir le statut à chaque fois. On a le continue. On peut examiner. On a les nouvelles commandes, etc. Donc, ça, j'ai montré tout à l'heure. On a aussi la réutilisation des aliases, les break points et une action. Donc, je reviens avec le command. On a le numéro de break point et on fait ce que l'on veut désire. Alors, PDB, là, les récapitulatives des commandes, on a le help. Ça, le help, il faut vraiment le dire. Ça vaut la peine. Il fait 4 à 5 pages. Mais, en fait, il explique tout ce que je viens de dire. Donc, je n'ai pas été plus intelligent que vous à part lire la doc. C'est tout. On dit toujours, valir la doc en premier, ce que j'ai fait pour une fois. Je suis payé très cher pour aller lire de la doc. Donc, voilà. Alors, on a d'autres paramètres. On a examiné et ainsi de suite. C'est vrai que les gens, ils n'ont pas beaucoup de temps pour vraiment lire de la doc. Ils doivent faire du code, faire du code et faire du code. Et, de temps en temps, débugger. Et moi, je ne dois pas faire de code. Je dois lire beaucoup et je ne peux pas débugger. Donc, voilà. Alors, pour naviguer, on s'amuse avec le next, etc. Les break points, on les a vus. Alors, on a aussi... Donc, les break points, on peut s'amuser sur un numéro de ligne. On peut s'amuser sur un numéro de ligne plus une condition. On peut s'amuser sur un fichier complet. Donc, il donne un fichier avec le numéro de la ligne ou avec une fonction, voire une méthode, ce genre de choses. Et, on a aussi un truc qui est assez amusant. C'est le T-break. Le T-break, c'est un break point temporaire. Une fois qu'il est atteint, on s'arrête. Alors, ça, c'est pour activer, désactiver les break points. Là, c'est les petites expressions. Par exemple, point d'exclamation extra, c'est simplement vraiment pour faire des expressions piton, pure et dure. Donc, là, c'est vraiment je vais aller modifier l'interprateur piton, par exemple. Genre de choses. Voilà. Donc, ça, c'est mon petit fichier. Conf et ainsi de suite. Alors, il y a un truc amusant. C'est que tout ça fonctionne aussi avec IPDB. Que les deux demoiselles qui sont là s'amusent. Donc, c'est complètement compatible. Alors, il y a des alternatives à PDB. Il me reste combien ? Un six minutes ? Oui, ça va aller. Il me reste encore 30 slides. C'est bon. Après, on est à boire une bonne biaise. Je crois que ça nous fera du bien parce qu'on est tous crevés. Alors, on a l'autocompression. On a la collaboration. C'est un taxi. On a des commandes supplémentaires, etc. Si vous ne l'avez jamais utilisées, allez l'utiliser. Ça vaut la peine. Alors, dans les alternatives, on a PUDB. C'est un truc un peu plus sexy. Ce qui est amusant, c'est que celui-là, par exemple, on peut lui mettre un signal ou lui dire simplement quand je suis contrôlé, automatiquement, tu te lances. Et donc, là, on a une belle commande. On a une belle interface en curse sur laquelle on peut dire, tiens, à droite, j'ai ma variable. Là, j'ai ma stack dans laquelle je peux me balader. Je peux remonter, redescendre, remonter, redescendre. Ici, je peux m'amuser à activer, désactiver des breakpoints. Oui, dis-moi. Oui. Oui. Oui. Il est con. Hier, on m'a posé une question. Est-ce que je peux m'amuser à lancer JDB sur un processus Python ? Oui, oui. Est-ce que ça va l'arrêter ? Oui. Le trait principal va être arrêté. Oh, oh. Ok. C'est comme ça. Par contre, si tu as un trait sur le côté, les autres traits vont continuer à travailler. Mais majoritairement, dans un script Python, on n'utilise qu'un seul trait. Donc, si tu fais de la synchro et que tu t'amuses avec ça, c'est fini, quoi. C'est bizarre, mais mon serveur est un peu bloqué. Comment ça se fait ? Il y a 100 000 utilisateurs, il y a personne qui fonctionne. Il y a un gars qui s'éclate là-dessus. Alors, tout à l'heure, je disais, il est un peu difficile de faire du débugage en remote avec PDB. En fait, c'est un peu faux. C'est vrai et c'est faux. Dans le sens, ici, c'est un petit script où on ouvre simplement une soquette, on map directement les STD et les STD out correctement et ensuite, on donne la possibilité de se connecter. Donc, la seule chose à faire, ici c'est un exemple, mais on peut se connecter, par exemple, sur le port 4444. Et à partir de là, on a une session PDB. On peut commencer à débugger. Le problème de ça, c'est qu'on est en train de bloquer le process principal. Ce n'est pas très sexy, mais au moins, ça fonctionne. On ne sait pas tout avoir. Soit on a un langage scripté, soit on a un langage compilé, donc c'est rapide, ou c'est très lent. Enfin bref, à vous de voir. On a aussi WDB qui lui permet, par exemple, de pouvoir avoir une interface web. C'est un peu plus joli des fois. Mais il y a des petits problèmes de sécurité, quand même. On a PDB-PP. Alors le PP, c'est pour plus-plus. On avait inventé le C. On a inventé le C++. On a inventé PDB. Il y en a qui s'est dit, tiens, je fais PDB plus-plus. Il y en a qui se casse vraiment la tête pour trouver des noms, quand même. Alors, on a PDB ou PDB. Tout à l'heure, ce que je disais, il y a des petits plugins en plus qu'on peut utiliser. Mais si on veut s'amuser à débugger directement à Django ou à n'importe quel autre script, on fait simplement PDB. Ça fonctionne aussi pour IPDB, PUDB, voilà. Alors, dernier truc avec PDB, dernière version de PDB, toi, tout à l'heure, tu as utilisé la version 2.7 de PDB. Avec la version 3.7, il y a un nouveau truc. C'est-à-dire qu'on a une nouvelle fonction, bulletin, qui s'appelle Breakpoint. Plus d'un s'amuser directement à faire un port PDB, PDB7 trace ou PIDB, etc. On fait Breakpoint. Et automatiquement, quand on va exécuter le code, c'est comme un skip-java-skip. Ça va s'arrêter pile-poil à la ligne où il y a un problème. Voilà. Et ça, vous ne saviez pas du tout. Oui, dis-moi. Je ne pense pas. Ça serait bien, oui. Il faut regarder la pep, parce qu'en fait, il y a une pep. S'il y a des paramètres style variable, environnemental, oui, on pourrait s'amuser. Mais je ne pense pas. Alors, est-ce que je continue ? Il me reste combien de temps ? Il est mort, lui. Il me reste... Allez, 3 minutes, 5. Je peux le faire. Je l'ai déjà fait. Allez. Alors, JDB, c'est également nommé JDB, etc. Debugger standard du projet Gnu. Ça, c'est super, mais en fait, ça permet surtout de faire du piton. Alors, le petit JDB, le BBJDB, qui est maintenant 7 ans, 7 ans, il a la version 7 et calc. Il propose directement quelques petites fonctionnalités. Donc, il n'y a pas de 3D, pas de BtFull, pas de Liz, pas de Prints, pas de Locals, pas de Hub, pas de Don. C'est la même chose que ce qu'on vient de voir, à part que là, c'est fait dans JDB. Donc, on peut mixer directement la stack trace du C avec la stack trace de piton. Ça va ? Donc ici, c'est un petit exemple. J'ai un bout de code et qui va commencer à louper. J'ai simplement besoin du PID. À partir de là, mais avec JDB, je peux me connecter directement sur le process ID, donc sur le process un peu ce qui se passe. Donc si j'ai des multithrèdes ou autres, je peux m'amuser à les débugger là-dedans. Chose qu'on ne sait pas forcément faire avec PDB. Ici, on peut le faire gentiment avec JDB. Ça, c'est cool quand même. Des choses qu'on peut faire. Mais qu'est-ce qu'on se fait chier, c'est de les faire quand même. Alors, on n'a pas une liste qui nous affiche le code. On a vu tout à l'heure, liste, LL, etc. Ça fait la même chose. On a la trace back, donc ce n'est pas bété. On ne sait pas casser la tête, avance des bétés, mais non, ce n'est pas bété. On a bété full. Ça, c'est une chose qui est très intéressante. C'est parce qu'on a l'espace mémoire et on a aussi les adresses mémoires et on a aussi le numéro de la frame, ce qui va nous permettre de pouvoir aller regarder toutes les informations de la frame, donc directement dans l'interprète au piton. Les gens qui ont des problèmes avec, par exemple, avec un psychopégé ou autres, ils disent, psychopégé, ce n'est pas bon. En fait, là, vous pouvez aller voir toutes les informations et au lieu de dire que c'est un problème de psychopégé, vous pourrez vous engueuler en disant, c'est encore moi qui lui fait une bourde. Non, non, mais j'en ai vu. Ce n'est pas mon code, c'est le code de l'autre. Non, c'est le tiers, mon gars. Ok. Alors examiner une frame, ça, c'est un peu plus, pas bété full, c'est les frames, etc. Voilà. Alors, on a eu le pie down, le pie up, le pie down, encore, comme tout à l'heure. Et ça, c'est une stack trace, oui, une stack trace. Oh, c'est horrible. C'est horrible. Il y en a qui adore voir ça. Vous savez, quand Matrix est sorti, Matrix est sorti, ils sont dit, c'est super, on a un screenshot, ça va montrer. Il y en a qui s'éclatent à ça, c'est comme ça. Alors, on peut s'amuser à afficher tous les trades, comme on est en monoprocess et en monotrade, on a qu'à se le trade qui fonctionne. Donc, par rapport à ce que je disais tout à l'heure, on va directement le loquer. Alors, on a 2 MPD stack trace, donc on peut s'amuser, par exemple, à faire trade, apply, all, pie bété et on a toutes les informations. Alors, on peut aussi s'amuser à des buggy à distance. On a GDB server, on lui dit, tiens, je voudrais bien que tu m'écoutes sur le tel interface et tel port et on peut le lancer comme ça. On va se connecter, ce qui nous permet de pouvoir configurer le client GDB, se connecter dessus et commencer à des buggy à distance. Vous le saviez ? Moi, oui. Non, je déconne, j'ai appris ça il y a 3 mois aussi. Alors, est-ce que c'est extensible ? Ouais, tout à fait. Il y a des mecs qui ont développé ce truc-là. C'est du GDB de base. C'est très joli, c'est très sexy. Donc, là, on a directement le code source, on a le code assembleur, en piton, on s'en moque un peu, mais on a différents trucs. On a la liste des trades, on a un registre, on a l'état de la mémoire et l'historique des commandes et la stack. Alors, est-ce qu'il y a des alternatives ? Ouais, quand même. Un truc qui s'appelle GDB GUI. C'est vraiment un truc super. Vous lancez le serveur sur le côté. Ça fonctionne par des petites web sockets et ça valait directement s'interface avec GDB. Et donc, on pouvait taper à distance, etc. Imaginez un petit peu, vous mettez du SSL, un VPN, n'importe ce que vous voulez là-dessus, mais c'est secure. Et surtout, ça ne va pas bloquer le machin. Donc, voilà. Moi, ce que j'avais dit, c'est tout. J'ai fini et j'avais gagné mon temps. C'est ça ? Merci. Voilà. Est-ce que vous avez des questions ? De bugger en live ou aller modifier directement des informations ? Alors, oui et non. Oui et non. Avec GDB, tu as moyen de pouvoir l'éditer directement. Je peux l'éditer le code source ? Ça oui. Le seul problème, c'est qu'il faut que ta méthode soit rechargée. Il faut que tu t'amuses à le refaire. Le seul problème, c'est que tu as des erreurs, des références, des enseignements. Ouais, qui veut les boirents bières ? Deux ? Merci. D'accord.