Sommaire

  1. Lundi
  2. Jeudi

Lundi

   1 (14:00:29) olivier.larcheveque: 
   2 On reprends avec la présentation de Davin sur la programmation Python https://wiki.auf.org/wikiteki/Projet/SemaineTech/Ateliers/ProgrammationPython
   3 (14:00:32) semainetech@reunion.auf.org: willy a changé le sujet en : ☞ Le salon de la Semaine Tech ☜  Atelier "Programmation python" https://wiki.auf.org/wikiteki/Projet/SemaineTech/Ateliers/ProgrammationPython
   4 (14:00:46) davin.baragiotta: ---------- DÉBUT : Atelier : Programmation Python ----------------
   5 (14:00:51) davin.baragiotta: INTRODUCTION
   6 (14:00:55) davin.baragiotta: Bonjour à tous!
   7 (14:01:00) davin.baragiotta: 
   8 La documentation complète de Python se trouve ici :
   9 http://www.python.org/doc/
  10 (14:01:07) davin.baragiotta: 
  11 Vous y trouverez notamment un tutoriel (que j'aurais aimé suivre mais c'est trop long) :
  12 http://docs.python.org/tutorial/
  13 (14:01:16) davin.baragiotta: 
  14 ... et aussi la documentation de la librarie (bibliothèque) standard venant avec le langage (on y reviendra) :
  15 http://docs.python.org/library/
  16 (14:01:20) davin.baragiotta: Aujourd'hui, on va programmer en Python.
  17 (14:01:21) davin.baragiotta: :D
  18 (14:01:27) davin.baragiotta: Dans cet atelier :
  19 * on va coder dans l'interpréteur et explorer les bases du langage
  20 * on va écrire un script qu'on fera exécuter par l'interpréteur
  21 * on va explorer du vrai code et modifier celui-ci pour créer un bot jabber!!!!
  22 (14:01:39) davin.baragiotta: ENVIRONNEMENT
  23 (14:01:50) davin.baragiotta: Vous devriez avoir un éditeur texte sous la main, configuré comme demandé dans la page wiki.
  24 (14:01:57) davin.baragiotta: Vous devriez avoir installé l'interpréteur ipython.
  25 (14:02:05) davin.baragiotta: 
  26 Vous devriez avoir téléchargé l'archive code.tar.gz :
  27 https://wiki.auf.org/wikiteki/Projet/SemaineTech/Ateliers/ProgrammationPython?action=AttachFile&do=view&target=code.tar.gz
  28 (14:02:13) davin.baragiotta: Ouvrez un terminal et déplacez vous dans le répertoire où vous avez extrait l'archive :
  29 cd code/
  30 (14:02:21) davin.baragiotta: C'est parti!
  31 (14:02:36) davin.baragiotta: INTERPRÉTEUR
  32 (14:03:00) davin.baragiotta: L'interpréteur python par défaut se lance avec la commande: 
  33 python
  34 (14:03:06) davin.baragiotta: il vient avec le langage....
  35 (14:03:14) davin.baragiotta: mais nous on va travailler avec ipython qui se lance avec la commande.... : 
  36 ipython
  37 (14:03:21) davin.baragiotta: ipython permet une introspection plus aisée (on y reviendra)
  38 (14:03:28) davin.baragiotta: lancez dans votre terminal ipython :
  39 ipython
  40 (14:03:50) davin.baragiotta: Quand on code en Python, on utilise l'interpréteur pour explorer interactivement le code.
  41 (14:03:57) davin.baragiotta: Mais l'édition directement dans l'interpréteur peut être pénible.
  42 (14:04:04) davin.baragiotta: C'est pourquoi nous mettons le "code qui marche" et éditons le code plus complexe dans un script.
  43 (14:04:14) davin.baragiotta: C'est ce que nous ferons après. Explorons d'abord dans l'interpréteur.
  44 (14:04:19) davin.baragiotta: PYTHON : QUELQUES BASES
  45 (14:04:28) davin.baragiotta: Toute programmation repose sur des conventions syntaxiques... En Python, on a de la chance, la syntaxe est très simple et intuitive.
  46 (14:04:37) davin.baragiotta: Les commentaires se font avec # :
  47 # ceci est un commentaire
  48 (14:04:44) davin.baragiotta: Les variables se déclarent sans $ devant ou autre fioriture.
  49 (14:04:52) davin.baragiotta: Les instructions ne se terminent pas avec des ;
  50 (14:05:00) davin.baragiotta: Les blocs de code ne sont pas structurés avec des { } mais par l'indentation.
  51 (14:05:09) davin.baragiotta: 
  52 Les conventions pour le style de code en Python sont définies dans la PEP 8 (genre de norme) :
  53 http://www.python.org/dev/peps/pep-0008/
  54 (14:05:24) davin.baragiotta: PYTHON : QUELQUES BASES : LES TYPES
  55 (14:05:34) davin.baragiotta: Voici les principaux types de base fournis avec le langage :
  56 n = None        # NoneType : type spécial voulant dire... rien
  57 b = True        # bool : booléen... True ou False n'oubliez pas les majuscules
  58 
  59 i = 15          # int : entier
  60 f = 15.5        # float : décimal
  61 
  62 s = "chaine"    # str : chaine de caractère, instancié avec "" ou ''
  63 u = u"chaîne"   # unicode : chaîne de caractère unicode, instancié avec u"" ou u''
  64 
  65 l = []          # list : liste d'objets
  66 t = ()          # tuple : liste immuable d'objets
  67 d = {}          # dict : dictionnaire de données
  68 (14:06:10) davin.baragiotta: PYTHON : QUELQUES BASES : OBJETS ET NAMESPACES
  69 (14:06:20) davin.baragiotta: En Python, tout est un "objet". Concrètement, ça veut dire que chaque "chose" qu'on manipule a:
  70 * un nom
  71 * des attributs (variables) accessibles "derrière"
  72 * des méthodes (fonctions) accessibles "derrière"
  73 (14:06:34) davin.baragiotta: Les attributs et méthodes ont des noms aussi.
  74 (14:06:41) davin.baragiotta: Mais ils se trouvent dans l' "espace de nom" de l'objet.
  75 (14:06:48) davin.baragiotta: Ils sont accessibles en utilisant un point pour séparer les noms :
  76 objet.attribut
  77 objet.methode()
  78 (14:06:58) davin.baragiotta: On peut chaîner les noms avec les points :
  79 objet.attribut.methode_attribut()
  80 (14:07:07) davin.baragiotta: Assez la théorie. Codons.
  81 (14:07:08) davin.baragiotta: :D
  82 (14:07:15) davin.baragiotta: INTROSPECTION
  83 (14:07:22) davin.baragiotta: Dans votre interpréteur déclarez une chaîne de caractères unicode :
  84 prenom = u"Davin"
  85 (14:07:42) davin.baragiotta: L'idée de l'introspection est de : voir en interrogeant l'objet ce qu'on peut faire avec
  86 (14:07:51) davin.baragiotta: ipython nous offre une façon simple de regarder ça
  87 (14:07:58) davin.baragiotta: après le nom de votre variable... tapez '.' puis 'tab'
  88 prenom. [+ tab]
  89 (14:08:10) davin.baragiotta: vous voyez tous les noms (attributs et méthodes) accessibles sur cet objet unicode
  90 (14:08:17) davin.baragiotta: ('enter' pour voir plus, 'q' pour sortir de la liste)
  91 (14:08:29) davin.baragiotta: tous les noms qui commencent avec __* sont des noms systèmes.
  92 (14:08:38) davin.baragiotta: Le nom seul n'est parfois pas suffisant pour savoir quoi faire avec...
  93 (14:08:46) davin.baragiotta: on va interroger l'interpréteur pour qu'il nous donne de l'info sur le nom
  94 (14:08:59) davin.baragiotta: derrière n'importe quel nom, on peut mettre '?' et taper 'enter'
  95 prenom.upper?
  96 (14:09:12) davin.baragiotta: ooooouuah! la partie docstring est carrément la documentation de la méthode!
  97 (14:09:14) davin.baragiotta: :D
  98 (14:09:52) davin.baragiotta: si c'est la méthode qu'on veut
  99 (14:09:52) davin.baragiotta: on l'exécute :
 100 prenom.upper()
 101 (14:10:10) davin.baragiotta: note : l'objet prenom n'en est pas modifié...
 102 (14:10:14) davin.baragiotta: tapez :
 103 prenom
 104 (14:10:31) davin.baragiotta: Les fonctions built-in Python suivantes servent aussi à l'introspection :
 105 type(objet)             # retourne le type de l'objet
 106 dir(objet)              # retourne les noms derrière l'objet
 107 help(objet)             # retourne l'aide
 108 callable(objet)         # dit si un objet est appelable, exécutable...
 109 isinstance(objet, Type) # teste le classe (ou type) d'un objet
 110 ...
 111 (14:10:46) davin.baragiotta: exemple :
 112 type(prenom)
 113 (14:11:19) davin.baragiotta: l'objet prenom est bien de type unicode car on l'a instancié avec u"" (un u devant)
 114 (14:11:23) davin.baragiotta: Des questions?
 115 (14:11:47) olivier.larcheveque: non pas de questions
 116 (14:12:01) davin.baragiotta: ok cool
 117 (14:12:30) davin.baragiotta: on peut jouer un peu dans l'interpréteur avant de regarder un script
 118 (14:12:49) davin.baragiotta: nom = u"Baragiotta"
 119 (14:12:53) davin.baragiotta: l = []
 120 (14:12:59) davin.baragiotta: l. + tab
 121 (14:13:15) davin.baragiotta: on utiliserait quoi pour ajouter notre nom et prenom à la liste vide?
 122 (14:13:37) davin.baragiotta: l.append?
 123 (14:13:45) davin.baragiotta: l.append(prenom)
 124 (14:13:50) davin.baragiotta: l.append(nom)
 125 (14:13:55) davin.baragiotta: tapez :
 126 l
 127 (14:14:18) davin.baragiotta: si vous voulez itérer : for
 128 (14:14:33) davin.baragiotta: for item in liste :
 129     print item.upper()
 130 (14:14:37) davin.baragiotta: ach
 131 (14:14:42) davin.baragiotta: 
 132 for item in liste :
 133     print item.upper()
 134 (14:15:11) davin.baragiotta: Questions?
 135 (14:15:14) olivier.larcheveque: REMARQUE de JC sur l'encodage : attention au piège de la saisie Unicode dans iPython : prenom = u"Céline" ne marchera pas, ça vous donnera la chaîne Unicode u'C\xc3\xa9line', qui est incorrecte (c'est de l'UTF-8), au lieu de u'C\xe9line', qui est ce qu'on attendait ; pour obtenir le résultat correct en direct dans iPython il faut taper ceci : prenom = unicode("Céline", 'utf-8')
 136 (14:15:44) olivier.larcheveque: autrement pas de questions
 137 (14:16:04) davin.baragiotta: oui, pour les questions d'encodage, python est mieux... mais en codant ce qu'on a fait dans un script et en l'exécutant... on devrait pas avoir à passer par unicode()
 138 (14:16:06) davin.baragiotta: okay
 139 (14:16:17) davin.baragiotta: SCRIPTS
 140 (14:16:19) olivier.larcheveque: les apprenants te font remarquer une erreur ;)
 141 (14:16:23) davin.baragiotta: ah?
 142 (14:16:36) olivier.larcheveque: c'est correct! ;)
 143 (14:16:37) davin.baragiotta: mais vous mentez, c'est mal...
 144 (14:16:40) davin.baragiotta: l = []
 145 (14:16:41) davin.baragiotta: ;)
 146 (14:16:48) davin.baragiotta: 
 147 
 148 (09:12:53) davin.baragiotta: l = []
 149 (14:16:50) davin.baragiotta: :D
 150 (14:17:24) davin.baragiotta: SCRIPTS
 151 (14:17:28) davin.baragiotta: Comme on le disait, c'est pas top coder dans l'interpréteur. Alors on va faire un script.
 152 (14:17:33) davin.baragiotta: il s'agit d'inclure du code dans un fichier et demander à l'interpréteur d'exécuter le code
 153 (14:17:41) davin.baragiotta: ouvrez dans un éditeur le fichier script.py :
 154 code/script.py
 155 (14:17:49) davin.baragiotta: la première ligne s'appelle shebang
 156 (14:17:55) davin.baragiotta: c'est pour dire au système que ce qui suit est du python
 157 (14:18:03) davin.baragiotta: ligne 2 : dit que c'est encodé en UTF-8 : ça nous permet d'écrire avec caractères accentués (notamment texte et commentaires)
 158 (14:18:13) davin.baragiotta: ligne 7 : un peu obscure, cette ligne se lit comme ça :
 159 si le nom de ce script est __main__ (ce qui est son nom par défaut quand lancé dans un interpréteur) alors exécute ce qui suit
 160 (14:18:25) davin.baragiotta: c'est là qu'on met les instructions du script pour les cas où on le lance avec un interpréteur
 161 (14:18:47) davin.baragiotta: lançons le script avec ipython :
 162 run script
 163 ou 
 164 run script.py
 165 (14:18:58) davin.baragiotta: (avec l'interpréteur normal ce serait juste : python script.py )
 166 (14:19:33) davin.baragiotta: Voilà pour la partie théorique... il resterait beaucoup à dire
 167 (14:19:39) davin.baragiotta: mais je vous laisse explorer par vous même
 168 (14:19:45) davin.baragiotta: les if... par exemple...
 169 (14:20:03) davin.baragiotta: on peut regarder rapidement la syntaxe de la fonction
 170 (14:20:10) davin.baragiotta: ligne 4 de script.py
 171 (14:20:33) davin.baragiotta: en fait ce qui est remarquable ici = pas d'accolades, pas de ;
 172 (14:20:44) davin.baragiotta: une indentation de 4 esapces (pas de tabs dans vos scripts svp ;) )
 173 (14:21:07) davin.baragiotta: on peut faire plein de trucs avec les types de bases... mais c'est facile à explorer
 174 (14:21:18) davin.baragiotta: C'est la semaine tech, jouons maintenant! ;)
 175 (14:21:25) davin.baragiotta: Regardons du code plus intense
 176 (14:21:26) davin.baragiotta: ;)
 177 (14:21:33) davin.baragiotta: MODULES : BOT JABBER
 178 (14:21:44) davin.baragiotta: l'idée générale = créer un robot qui puisse être dans un salon jabber et interagir avec les users connectés
 179 (14:21:56) davin.baragiotta: ah, des questions?
 180 (14:23:09) davin.baragiotta: ouvrez et éditez le fichier bot/conf.py.edit et sauvegardez le dans :
 181 bot/conf.py
 182 (14:23:10) davin.baragiotta: 
 183 assurez-vous que :
 184 CHATROOM = "test@reunion.auf.org"
 185 (14:23:10) davin.baragiotta: si vous n'avez pas de username et de password pour votre bot :
 186 (14:23:10) davin.baragiotta: 
 187 https://register.jabber.org/
 188 (14:24:10) davin.baragiotta: tout le monde a créé un conf.py dans le répertoire bot?
 189 (14:24:50) davin.baragiotta: vous pouvez vous rendre dans le salon test
 190 (14:25:32) olivier.larcheveque: QUESTION: quel est l'intérêt de mettre un if __name__=='__main__' et de mettre son code au lieu de l'inclure une fois sans mettre cette ligne ?
 191 REPONSE : on peut utiliser le fichier comme un module dans avoir à lancer le script
 192 (14:25:40) olivier.larcheveque: ça permet d'importer des parties du script sans obligatoirement en exécuter le contenu
 193 (14:26:25) davin.baragiotta: ok je vais lancer mon bot
 194 (14:26:51) olivier.larcheveque: REMARQUE : davin.baragiotta n'a pas explicité comment on se rend dans le salon après avoir modifié la config
 195 (14:27:04) davin.baragiotta: ok mon bot s'appelle barabotta et est présent dans le salon test
 196 (14:27:09) davin.baragiotta: pour lancer votre bot :
 197 (14:27:16) davin.baragiotta: 
 198 run bot/bot.py
 199 (14:28:04) davin.baragiotta: donc maintenant, vous (comme user) devriez être dans le salon test (de la même façon que vous avez fait pour vous rendre ici) ;)
 200 (14:28:07) davin.baragiotta: et votre bot aussi
 201 (14:28:29) davin.baragiotta: cool, y'a plein de bot
 202 (14:29:00) davin.baragiotta: ok je vais montrer des commandes du bot et on regardera le code qui l'exécute avant que vous le modifiez
 203 (14:29:01) davin.baragiotta: :D
 204 (14:31:29) davin.baragiotta: on a regardé quelques commandes du bot
 205 (14:31:33) davin.baragiotta: regardons les sources
 206 (14:31:50) davin.baragiotta: ouvrez dans un éditeur le fichier 
 207 bot/bot.py
 208 (14:32:38) davin.baragiotta: en haut du fichier, on connait maintenant : shebang et encoding
 209 (14:32:39) davin.baragiotta: cool
 210 (14:32:45) davin.baragiotta: lignes 4 à 8
 211 (14:32:50) davin.baragiotta: mesdames et messieurs...
 212 (14:32:57) davin.baragiotta: c'est toute la puissance de Python devant vous
 213 (14:33:07) davin.baragiotta: les import !!!!
 214 (14:33:17) davin.baragiotta: le but du jeu, quand on code... c'est de ne pas réinventer la roue
 215 (14:33:34) davin.baragiotta: pour ce faire, on importe le code qui règle déjà nos problèmes...
 216 (14:33:41) davin.baragiotta: ligne 4
 217 (14:33:51) davin.baragiotta: from datetime import datetime
 218 (14:34:19) davin.baragiotta: ça veut dire que : du module (standard) datetime on veut importer le nom datetime
 219 (14:34:40) davin.baragiotta: en gros : datetime.datetime
 220 (14:34:56) davin.baragiotta: vous voulez en savoir plus sur ce module?
 221 (14:35:07) davin.baragiotta: 
 222 voir la doc officielle :
 223 http://docs.python.org/library/
 224 (14:35:16) davin.baragiotta: cherchez datetime
 225 (14:35:21) davin.baragiotta: 
 226 http://docs.python.org/library/datetime.html
 227 (14:35:23) davin.baragiotta: lisez ;)
 228 (14:35:44) davin.baragiotta: sinon, importez le module dans interpréteur et introspectez!!! :
 229 import datetime
 230 (14:35:51) davin.baragiotta: continuons
 231 (14:36:08) davin.baragiotta: import re = import du module d'expressions régulière
 232 (14:36:24) davin.baragiotta: en fait... tous les messages échangés nous arrivent comme des lignes de texte....
 233 (14:36:47) davin.baragiotta: on veut pouvoir chercher des mots dans les lignes pour trouver les commandes données au bot!
 234 (14:36:59) davin.baragiotta: re = regex = regular expression
 235 (14:37:09) davin.baragiotta: 
 236 http://docs.python.org/library/re.html
 237 (14:37:17) davin.baragiotta: un petit monde en soit au niveau de la syntaxe
 238 (14:37:20) davin.baragiotta: on continue
 239 (14:37:39) davin.baragiotta: après mes imports de la librairie standard
 240 (14:37:59) davin.baragiotta: j'importe les modules particuliers installés dans mon système...
 241 (14:38:22) davin.baragiotta: jabberbot est accessible car vous l'avez installé via un paquet Debian avant l'atelier
 242 (14:38:33) davin.baragiotta: il est accessible par son nom de module python
 243 (14:39:03) davin.baragiotta: y'a 2 façons d'importer :
 244 from...
 245 import
 246 (14:39:25) davin.baragiotta: import re , par exemple, charge tout le module re
 247 (14:39:53) davin.baragiotta: ils sont accessible dans le code en préfixant les objets du module par le nom du module
 248 (14:39:58) davin.baragiotta: ex.: ligne 38
 249 (14:40:08) davin.baragiotta: j'utilise compile de re en faisant re.compile
 250 (14:40:13) davin.baragiotta: from : 
 251 (14:40:32) davin.baragiotta: charge seulement des noms spécifiques... accessibles directement
 252 (14:40:52) davin.baragiotta: ex.: MUCJabberBot ligne 10
 253 (14:40:55) davin.baragiotta: chargé à la ligne 8
 254 (14:41:09) davin.baragiotta: ligne 8 : muc vient d'où?
 255 (14:41:16) davin.baragiotta: il vient de *mon* module bot
 256 (14:41:28) davin.baragiotta: le répertoire bot est lui même un module
 257 (14:41:53) davin.baragiotta: on l'a pas installé sur notre système... mais il est accessible dans le contexte
 258 (14:42:08) davin.baragiotta: pour importer des éléments d'un autre script
 259 (14:42:16) davin.baragiotta: créez un module
 260 (14:42:18) davin.baragiotta: comment ?
 261 (14:42:31) davin.baragiotta: en mettant un fichier __init__.py dans un répertoire
 262 (14:42:43) davin.baragiotta: grace à bot/__init__.py
 263 (14:43:01) davin.baragiotta: on peut importer du contenu de ce répertoire
 264 (14:43:06) davin.baragiotta: preuve
 265 (14:43:20) davin.baragiotta: ligne 8 importe du fichier bot/muc.py
 266 (14:43:25) davin.baragiotta: Des questions sur l'import?
 267 (14:43:32) davin.baragiotta: après on personnalise votre bot
 268 (14:43:50) davin.baragiotta: Questions?
 269 (14:44:15) olivier.larcheveque: Non pas de questions
 270 (14:44:40) olivier.larcheveque: (quelques petits soucis avec les versions de jabberbot)
 271 (14:45:23) davin.baragiotta: ok puor ceux qui ont un bot qui marche, ont va le personnaliser
 272 (14:45:58) davin.baragiotta: copiez la ligne 38 et collez dessous en ligne 39
 273 (14:46:17) davin.baragiotta: modifiez le mot dans le "bière" dans le regex
 274 (14:46:43) davin.baragiotta: exemple :
 275 
 276         self.re_biere = re.compile(u'.*(?P<biere>bi[eè]re).*')
 277         self.re_biere = re.compile(u'.*(?P<hourra>hourra).*')
 278 (14:46:53) willy: QUESTION: que signifie exactement @botcmd ?
 279 (14:46:58) davin.baragiotta: avec ça, un surveille le mot hourra dans les chaine
 280 (14:47:07) davin.baragiotta: botcmd est un décorateur
 281 (14:47:15) davin.baragiotta: une fonction qui s'exécute avant une fonction
 282 (14:47:30) davin.baragiotta: mais globalement, ici, ça veut dire que la fonction qui suit
 283 (14:47:34) davin.baragiotta: est une "commande du bot"
 284 (14:47:48) davin.baragiotta: donc en tapant ce mot : la fonction codée s'exécute
 285 (14:48:00) davin.baragiotta: il y a 2 approches pour l'interaction du bot :
 286 (14:48:17) davin.baragiotta: une commande
 287 ou
 288 il cherche un mot par regex
 289 (14:48:29) davin.baragiotta: ici on va personnaliser en mettant un mot dans regex
 290 (14:48:47) davin.baragiotta: je continue mon exemple perso avec hourra (mettez ce que vous voulez pour vous)
 291 (14:49:00) davin.baragiotta: donc on a ligne 39 cloné et modifié la ligne 38
 292 (14:49:31) davin.baragiotta: ligne 50 et 51 : copier et coller dessous
 293 (14:50:05) davin.baragiotta: ah zut... il faut modifier le nom d'attribut en ligne 39 aussi :
 294 (14:50:14) davin.baragiotta: 38 et 39 :
 295 
 296         self.re_biere = re.compile(u'.*(?P<biere>bi[eè]re).*')
 297         self.re_hourra = re.compile(u'.*(?P<hourra>hourra).*')
 298 (14:50:31) davin.baragiotta: 50 et 51 :
 299         if self.re_biere.match(message):
 300             self.biere(mess)
 301         if self.re_hourra.match(message):
 302             self.hourra(mess)
 303 
 304 (14:50:57) davin.baragiotta: avec ça on vient de dire si le message match le pattern (regex) écrit dans self.re_hourra
 305 (14:51:14) davin.baragiotta: alors on exécute la méthode (fonction) hourra...
 306 (14:51:15) davin.baragiotta: mais elle n'existe pas encore : créons là
 307 (14:51:35) davin.baragiotta: copipez-collez def biere au grand complet, jusqu'au return
 308 (14:51:48) davin.baragiotta: et modifier tout pour personnaliser
 309 (14:52:21) davin.baragiotta: en fait, faut juste modifier le nom de la méthode (derrière le def) et éditer la réponse
 310 (14:52:22) davin.baragiotta: ex.:
 311 (14:52:38) davin.baragiotta: 
 312         
 313     def biere(self, mess):
 314         """Aux messages relatifs à la bière, choisit une de ses réponses prédéfinies"""
 315         username = self.get_sender_username(mess)
 316         if username != self.username and username != self.nickname:
 317             response = 'St-Ambroise!'
 318             self.send_simple_reply(mess, response)
 319         
 320     def hourra(self, mess):
 321         """Aux messages relatifs à la bière, choisit une de ses réponses prédéfinies"""
 322         username = self.get_sender_username(mess)
 323         if username != self.username and username != self.nickname:
 324             response = 'Non... pas hourra.'
 325             self.send_simple_reply(mess, response)
 326 (14:52:57) davin.baragiotta: pour tester le nouveau comportement du bot :
 327 (14:53:11) davin.baragiotta: fermer dans votre terminal le bot en core :
 328 Ctrl + C
 329 (14:53:13) davin.baragiotta: *en cours
 330 (14:53:27) davin.baragiotta: et attendre qu'il sorte du salon test (peut être un peu long)
 331 (14:53:42) davin.baragiotta: puis après relancer le bot :
 332 run bot/bot.py
 333 (14:55:29) davin.baragiotta: bon j'attends toujours la déconnexion de mon bot barabotta... :(
 334 (14:56:34) olivier.larcheveque: (Il reste 5min si les gens ont des questions)
 335 (14:56:36) progfou: reviens avec une autre "resource" pour ne pas perdre de temps...
 336 (14:56:38) davin.baragiotta: vous pouvez personnaliser, évidemment, en modifiant seulement les lignes de réponse pour les méthodes biere et sieste
 337 (14:58:43) davin.baragiotta: ok
 338 (14:58:50) davin.baragiotta: vous pouvez essayez mon hourra ;)
 339 (14:58:54) davin.baragiotta: questions?
 340 MR 20110829T13:57:54Z 000 <davin.baragiotta> fermez les bots
 341 MR 20110829T13:57:58Z 000 <davin.baragiotta> avec ctrl + c
 342 MR 20110829T13:58:03Z 000 <davin.baragiotta> si boucle sans fin
 343 MR 20110829T13:58:05Z 000 <davin.baragiotta> ;)
 344 MR 20110829T13:58:44Z 000 <olivier.larcheveque> -----------------------FIN : ATELIER : programmation Python -----------------------
 345 MI 20110829T14:00:17Z 002 willy has set the topic to: ☞ Le salon de la Semaine Tech ☜ 
 346 Atelier "Django"
 347 https://wiki.auf.org/wikiteki/Projet/SemaineTech/Ateliers/Django
 348 MR 20110829T14:03:21Z 000 <davin.baragiotta> petit interlude entre ateliers
 349 MR 20110829T14:03:34Z 000 <davin.baragiotta> on a eu dans test... là où vivent encore nos bots
 350 MR 20110829T14:03:37Z 000 <davin.baragiotta> un boucle sans fin
 351 MR 20110829T14:04:12Z 000 <davin.baragiotta> ça arrive quand un bot réagit à un mot... et retourne ce même
 352 MR 20110829T14:04:23Z 000 <davin.baragiotta> on peut éviter en vérifiant qu'on ne se répond pas à soit
 353 MR 20110829T14:04:24Z 000 <davin.baragiotta> mais
 354 MR 20110829T14:04:54Z 000 <davin.baragiotta> si un bot réagit à hourra et répondant hourra... et qu'un autre bot fait pareil : réagit à hourra en disant hourra
 355 MR 20110829T14:05:14Z 000 <davin.baragiotta> même si chaque bot s'ignore soit même... ben...
 356 MR 20110829T14:05:31Z 000 <davin.baragiotta> il répond à l'autre qui lui répond qui fait répodnre l'autre qui...
 357 MR 20110829T14:05:36Z 000 <davin.baragiotta> un boucle *entre* les bot
 358 MR 20110829T14:05:57Z 000 <davin.baragiotta> en gros... c'est en testant qu'on blinde son code ;)
 359 MR 20110829T14:06:01Z 000 <davin.baragiotta> fin de l'interlude
 360 MR 20110829T14:06:45Z 001 <davin.baragiotta> progfou faisant remarquer :
 361 (10:06:13) progfou: et en fait même, plus généralement, qu'un bot ne devrait pas traiter des messages sans préfixe déterminé (son nom, un '!', ...)
 362 MR 20110829T14:06:57Z 000 <davin.baragiotta> c'est une solution... mais ça enlève son côté humain ;)
 363 MR 20110829T14:07:13Z 000 <progfou> ouaip, ça en fait un bot ;-)
 364 MR 20110829T14:07:18Z 000 <davin.baragiotta> :D
 365 MR 20110829T14:08:17Z 000 <progfou> Olivier, si tu es prêt n'attendons pas, ce n'est pas bon de s'éloigner des horaires (certaines personnes peuvent avoir prévu autre chose après, à l'heure pile, et d'autres auront envie de dormir, suivez mon regard...)
 366 MR 20110829T14:08:54Z 000 <olivier.larcheveque> ok on y va

Jeudi

   1 (13:10:26) davin.baragiotta: ---------- DÉBUT : Atelier : Programmation Python ----------------
   2 (13:10:35) davin.baragiotta: 
   3 ### REMARQUE : cet atelier présente le même contenu que l'atelier de lundi dernier
   4 ### Si vous avez participé lundi et souhaitez aller plus loin, 
   5 ### un exercice vous a été fourni par courriel sur : discussion-technique@auf.org
   6 ### Sujet : [Semaine tech] Atelier : Programmation Python : EXERCICE
   7 ###
   8 ### Les liens vers les solutionnaires seront donnés ici, sous la forme :
   9 ### EXERCICE : solution ...
  10 (13:11:57) davin.baragiotta: INTRODUCTION
  11 (13:12:02) davin.baragiotta: Bonjour à tous!
  12 (13:12:08) davin.baragiotta: 
  13 La documentation complète de Python se trouve ici :
  14 http://www.python.org/doc/
  15 (13:12:17) davin.baragiotta: 
  16 Vous y trouverez notamment un tutoriel (que j'aurais aimé suivre mais c'est trop long) :
  17 http://docs.python.org/tutorial/
  18 (13:12:27) davin.baragiotta: 
  19 ... et aussi la documentation de la librarie (bibliothèque) standard venant avec le langage (on y reviendra) :
  20 http://docs.python.org/library/
  21 (13:12:38) davin.baragiotta: Aujourd'hui, on va programmer en Python.
  22 (13:12:40) davin.baragiotta: :D
  23 (13:12:47) davin.baragiotta: Dans cet atelier :
  24 * on va coder dans l'interpréteur et explorer les bases du langage
  25 * on va écrire un script qu'on fera exécuter par l'interpréteur
  26 * on va explorer du vrai code et modifier celui-ci pour créer un bot jabber!!!!
  27 (13:13:00) davin.baragiotta: ENVIRONNEMENT
  28 (13:13:06) davin.baragiotta: Vous devriez avoir un éditeur texte sous la main, configuré comme demandé dans la page wiki.
  29 (13:13:12) davin.baragiotta: Vous devriez avoir installé l'interpréteur ipython.
  30 (13:13:22) davin.baragiotta: 
  31 Vous devriez avoir téléchargé l'archive code.tar.gz :
  32 https://wiki.auf.org/wikiteki/Projet/SemaineTech/Ateliers/ProgrammationPython?action=AttachFile&do=view&target=code.tar.gz
  33 (13:13:28) davin.baragiotta: Ouvrez un terminal et déplacez vous dans le répertoire où vous avez extrait l'archive :
  34 cd code/
  35 (13:13:35) davin.baragiotta: C'est parti!
  36 (13:13:41) davin.baragiotta: INTERPRÉTEUR
  37 (13:13:49) davin.baragiotta: L'interpréteur python par défaut se lance avec la commande: 
  38 python
  39 (13:13:56) davin.baragiotta: il vient avec le langage....
  40 (13:14:01) davin.baragiotta: mais nous on va travailler avec ipython qui se lance avec la commande.... : 
  41 ipython
  42 (13:14:06) davin.baragiotta: ipython permet une introspection plus aisée (on y reviendra)
  43 (13:14:12) davin.baragiotta: lancez dans votre terminal ipython :
  44 ipython
  45 (13:14:18) davin.baragiotta: Quand on code en Python, on utilise l'interpréteur pour explorer interactivement le code.
  46 (13:14:24) davin.baragiotta: Mais l'édition directement dans l'interpréteur peut être pénible.
  47 (13:14:31) davin.baragiotta: C'est pourquoi nous mettons le "code qui marche" et éditons le code plus complexe dans un script.
  48 (13:14:38) davin.baragiotta: C'est ce que nous ferons après. Explorons d'abord dans l'interpréteur.
  49 (13:14:44) davin.baragiotta: PYTHON : QUELQUES BASES
  50 (13:14:49) davin.baragiotta: Toute programmation repose sur des conventions syntaxiques... En Python, on a de la chance, la syntaxe est très simple et intuitive.
  51 (13:14:56) davin.baragiotta: Les commentaires se font avec # :
  52 # ceci est un commentaire
  53 (13:15:01) davin.baragiotta: Les variables se déclarent sans $ devant ou autre fioriture.
  54 (13:15:06) davin.baragiotta: Les instructions ne se terminent pas avec des ;
  55 (13:15:11) davin.baragiotta: Les blocs de code ne sont pas structurés avec des { } mais par l'indentation.
  56 (13:15:18) davin.baragiotta: 
  57 Les conventions pour le style de code en Python sont définies dans la PEP 8 (genre de norme) :
  58 http://www.python.org/dev/peps/pep-0008/
  59 (13:15:25) davin.baragiotta: PYTHON : QUELQUES BASES : LES TYPES
  60 (13:15:33) davin.baragiotta: Voici les principaux types de base fournis avec le langage :
  61 n = None        # NoneType : type spécial voulant dire... rien
  62 b = True        # bool : booléen... True ou False n'oubliez pas les majuscules
  63 
  64 i = 15          # int : entier
  65 f = 15.5        # float : décimal
  66 
  67 s = "chaine"    # str : chaine de caractère, instancié avec "" ou ''
  68 u = u"chaîne"   # unicode : chaîne de caractère unicode, instancié avec u"" ou u''
  69 
  70 l = []          # list : liste d'objets
  71 t = ()          # tuple : liste immuable d'objets
  72 d = {}          # dict : dictionnaire de données
  73 (13:16:02) davin.baragiotta: PYTHON : QUELQUES BASES : OBJETS ET NAMESPACES
  74 (13:16:08) davin.baragiotta: En Python, tout est un "objet". Concrètement, ça veut dire que chaque "chose" qu'on manipule a:
  75 * un nom
  76 * des attributs (variables) accessibles "derrière"
  77 * des méthodes (fonctions) accessibles "derrière"
  78 (13:16:20) davin.baragiotta: Les attributs et méthodes ont des noms aussi.
  79 (13:16:26) davin.baragiotta: Mais ils se trouvent dans l' "espace de nom" de l'objet.
  80 (13:16:31) davin.baragiotta: Ils sont accessibles en utilisant un point pour séparer les noms :
  81 objet.attribut
  82 objet.methode()
  83 (13:16:40) davin.baragiotta: On peut chaîner les noms avec les points :
  84 objet.attribut.methode_attribut()
  85 (13:16:47) davin.baragiotta: Assez la théorie. Codons.
  86 (13:16:49) davin.baragiotta: :D
  87 (13:16:56) davin.baragiotta: INTROSPECTION
  88 (13:17:02) davin.baragiotta: Dans votre interpréteur déclarez une chaîne de caractères unicode :
  89 prenom = u"Davin"
  90 (13:17:13) davin.baragiotta: L'idée de l'introspection est de : interroger l'objet pour voir ce qu'on peut faire avec
  91 (13:17:21) davin.baragiotta: ipython nous offre une façon simple de regarder ça
  92 (13:17:28) davin.baragiotta: après le nom de votre variable... tapez '.' puis 'tab'
  93 prenom. [+ tab]
  94 (13:17:39) davin.baragiotta: vous voyez tous les noms (attributs et méthodes) accessibles sur cet objet unicode
  95 (13:17:50) davin.baragiotta: ('enter' pour en voir plus, 'q' pour sortir de la liste)
  96 (13:17:55) davin.baragiotta: tous les noms qui commencent avec __* sont des noms systèmes.
  97 (13:18:02) davin.baragiotta: Le nom seul n'est parfois pas suffisant pour savoir quoi faire avec...
  98 (13:18:10) davin.baragiotta: on va interroger l'interpréteur pour qu'il nous donne de l'info sur le nom
  99 (13:18:16) davin.baragiotta: derrière n'importe quel nom, on peut mettre '?' et taper 'enter'
 100 prenom.upper?
 101 (13:18:23) davin.baragiotta: ooooouuah! la partie docstring est carrément la documentation de la méthode!
 102 (13:18:25) davin.baragiotta: :D
 103 (13:18:34) davin.baragiotta: si on a trouvé la méthode qu'on voulait, on peut la tester :
 104 prenom.upper()
 105 (13:18:42) davin.baragiotta: note : l'objet prenom n'en est pas modifié... pour preuve, tapez :
 106 prenom
 107 (13:18:53) davin.baragiotta: Les fonctions built-in Python suivantes servent aussi à l'introspection :
 108 type(objet)             # retourne le type de l'objet
 109 dir(objet)              # retourne les noms derrière l'objet
 110 help(objet)             # retourne l'aide
 111 callable(objet)         # dit si un objet est appelable, exécutable...
 112 isinstance(objet, Type) # teste le classe (ou type) d'un objet
 113 ...
 114 (13:19:07) davin.baragiotta: Des questions?
 115 (13:19:27) olivier.larcheveque: Non tu peux continuer
 116 (13:19:38) davin.baragiotta: okay!
 117 (13:19:42) davin.baragiotta: PYTHON : QUELQUES BASES : APPELER UNE MÉTHODE
 118 (13:19:55) davin.baragiotta: Jouons un peu dans l'interpréteur avant de regarder un script
 119 nom = u"Baragiotta"     # on créer une autre variable unicode
 120 l = []                  # on crée une liste vide
 121 l. + tab                # on introspecte la liste vide...
 122 (13:20:05) davin.baragiotta: on utiliserait quoi pour ajouter notre nom et prenom à la liste vide?
 123 (13:20:16) davin.baragiotta: l.append?
 124 (13:20:31) davin.baragiotta: 
 125 l.append(prenom)
 126 l.append(nom)
 127 (13:20:38) davin.baragiotta: tapez :
 128 l
 129 (13:20:51) davin.baragiotta: Questions?
 130 (13:21:03) olivier.larcheveque: toujours pas c'est bon
 131 (13:21:05) davin.baragiotta: PYTHON : QUELQUES BASES : ITÉRATION
 132 (13:21:11) davin.baragiotta: Si vous voulez itérer, une structure de langage fort simple : for
 133 (13:21:31) davin.baragiotta: Exemple :
 134 for item in l:
 135     print item.upper()
 136 (13:21:42) davin.baragiotta: remarquez l'indentation de 4 espaces : pas de { } autour des instructions.
 137 (13:21:50) davin.baragiotta: pas de tabs dans vos scripts svp, on indente avec esapces : voir PEP 8 ;)
 138 (13:22:07) davin.baragiotta: Des questions?
 139 (13:22:12) olivier.larcheveque: 
 140 QUESTION: PKOI mettre u"string", a quoi sert le 'u'
 141 (13:22:28) davin.baragiotta: il existe 3 types de chaines de caractères en Python
 142 (13:22:34) davin.baragiotta: string, unicode et raw
 143 (13:22:50) davin.baragiotta: elles se déclarent différemment avec :
 144 ''
 145 u''
 146 r''
 147 respectivement
 148 (13:23:06) davin.baragiotta: u'' = chaîne unicode, permet donc les caractères accentués
 149 (13:23:12) davin.baragiotta: sinon, '' = ascii
 150 (13:23:17) davin.baragiotta: on continue?
 151 (13:23:24) olivier.larcheveque: oui
 152 (13:23:28) davin.baragiotta: SCRIPTS
 153 (13:23:33) davin.baragiotta: Comme on le disait, c'est pas top coder dans l'interpréteur. Alors on va faire un script.
 154 (13:23:41) davin.baragiotta: il s'agit d'inclure du code dans un fichier et demander à l'interpréteur d'exécuter le code
 155 (13:23:47) davin.baragiotta: ouvrez dans un éditeur le fichier script.py :
 156 code/script.py
 157 (13:23:58) davin.baragiotta: la première ligne s'appelle shebang
 158 (13:24:02) davin.baragiotta: c'est pour dire au système que ce qui suit est du python
 159 (13:24:08) davin.baragiotta: ligne 2 : dit que c'est encodé en UTF-8 : ça nous permet d'écrire avec caractères accentués (notamment texte et commentaires)
 160 (13:24:21) davin.baragiotta: ligne 7 : un peu obscure, cette ligne se lit comme ça :
 161 si le nom de ce script est __main__ (ce qui est son nom par défaut quand lancé dans un interpréteur) alors exécute ce qui suit
 162 (13:24:38) davin.baragiotta: c'est là qu'on met les instructions du script pour les cas où on le lance avec un interpréteur
 163 (13:24:45) davin.baragiotta: lançons le script avec ipython :
 164 run script
 165 ou 
 166 run script.py
 167 (13:24:56) davin.baragiotta: avec l'interpréteur normal ce serait juste :
 168 python script.py
 169 (13:25:04) davin.baragiotta: Questions?
 170 (13:25:14) olivier.larcheveque: non
 171 (13:25:15) davin.baragiotta: PYTHON : QUELQUES BASES : FONCTIONS
 172 (13:25:23) progfou: si tu me permets un détour (rapide) sur les accents
 173 (13:25:23) davin.baragiotta: Les fonctions sont du code qui reçoivent des paramètres.... et retournent un résultat
 174 (13:25:31) davin.baragiotta: progfou : je t'en prie
 175 (13:25:54) progfou: juste pour dire que la différence entre '' (str) et u'' (unicode) n'est pas le fait de pouvoir gérer les accents
 176 (13:26:20) progfou: la différence est que '' (str) va gérer des octets, alors que u'' (unicode) va gérer des caractères
 177 (13:26:25) progfou: un exemple pour finir :
 178 (13:27:16) progfou: si vous faites 'andré'.upper(), ça va vous donner n'importe quoi, car l'octet 'é' ne sera pas considéré comme le caractère 'é' mais comme une suite de 2 octets UTF-8
 179 (13:27:30) progfou: tandis que u'andré'.upper() donnera bien u'ANDRÉ'
 180 (13:27:30) progfou: fini
 181 (13:27:43) davin.baragiotta: merci progfou pour ces précisions
 182 (13:27:50) davin.baragiotta: nous continuons avec les fonctions
 183 (13:27:57) davin.baragiotta: Une fonction est définie ici à la ligne 4 de script.py
 184 * def : pour déclarer une fonction ou une méthode (une méthode étant une fonction déclaré dans une classe)
 185 * les instructions de la fonction sont indentées : une indentation de 4 espaces
 186 * en fait ce qui est remarquable ici = pas d'accolades, pas de ;
 187 (13:28:18) davin.baragiotta: Voilà pour la partie théorique... il resterait beaucoup à dire
 188 (13:28:23) davin.baragiotta: mais les fonctionnalités Python sont faciles à explorer
 189 (13:28:30) davin.baragiotta: je vous laisse donc explorer par vous même : 
 190 * avec la doc officielle
 191 * interactivement dans ipython
 192 (13:28:40) davin.baragiotta: C'est la semaine tech, jouons maintenant! ;)
 193 (13:28:48) davin.baragiotta: 
 194 ### EXERCICE : solution pour le script intermédiaire : 
 195 http://paste.pocoo.org/show/467931/
 196 (13:29:19) davin.baragiotta: okay!
 197 (13:29:20) davin.baragiotta: MODULES : BOT JABBER : DEMO
 198 (13:29:27) davin.baragiotta: l'idée générale = créer un robot qui puisse être dans un salon jabber et interagir avec les users connectés
 199 (13:29:35) davin.baragiotta: ouvrez et éditez le fichier bot/conf.py.edit et sauvegardez le dans :
 200 bot/conf.py
 201 (13:29:51) davin.baragiotta: 
 202 assurez-vous que :
 203 CHATROOM = "test@reunion.auf.org"
 204 (13:29:58) davin.baragiotta: 
 205 si vous n'avez pas de username et de password pour votre bot :
 206 https://register.jabber.org/
 207 (13:30:09) davin.baragiotta: tout le monde a créé un conf.py dans le répertoire bot?
 208 (13:30:46) davin.baragiotta: connectez vous (votre user normal humain, ex.: davin.baragiotta) au salon test de reunion.auf.org
 209 (comme vous avez fait pour vous connecter à ce salon-ci ;) )
 210 (13:30:58) davin.baragiotta: je vais lancer mon bot qui se nomme 'barabotta', il va rejoindre le salon test
 211 (13:31:28) davin.baragiotta: je vous recommande de lancer votre bot avec l'interpréteur python normal :
 212 cd code/
 213 python bot/bot.py
 214 (13:31:34) davin.baragiotta: sinon avec ipython, c'est :
 215 run bot/bot.py
 216 (13:31:40) davin.baragiotta: je vais montrer des commandes du bot et on regardera le code qui l'exécute avant que vous le modifiez
 217 (13:33:39) davin.baragiotta: on a regardé quelques commandes du bot
 218 (13:33:45) davin.baragiotta: regardons les sources
 219 (13:33:52) davin.baragiotta: MODULES : BOT JABBER : SOURCES
 220 (13:33:59) davin.baragiotta: ouvrez dans un éditeur le fichier 
 221 bot/bot.py
 222 (13:34:07) davin.baragiotta: en haut du fichier, on connait maintenant : shebang et encoding
 223 (13:34:12) davin.baragiotta: lignes 4 à 8
 224 (13:34:16) davin.baragiotta: mesdames et messieurs...
 225 (13:34:21) davin.baragiotta: c'est toute la puissance de Python devant vous
 226 (13:34:25) davin.baragiotta: les import !!!!
 227 (13:34:30) davin.baragiotta: :D
 228 (13:34:35) davin.baragiotta: PYTHON : QUELQUES BASES : IMPORTS
 229 (13:34:45) davin.baragiotta: le but du jeu, quand on code... c'est de ne pas réinventer la roue
 230 (13:34:51) davin.baragiotta: pour ce faire, on importe le code qui règle déjà nos problèmes...
 231 (13:35:05) davin.baragiotta: ligne 4
 232 from datetime import datetime
 233 (13:35:10) davin.baragiotta: ça se lit comme suit : 
 234 du module (standard) datetime on veut importer le nom datetime
 235 (13:35:15) davin.baragiotta: en gros, rend accessible dans le code : datetime.datetime
 236 (13:35:23) davin.baragiotta: 
 237 vous voulez en savoir plus sur ce module?
 238 voir la doc officielle :
 239 http://docs.python.org/library/
 240 (13:35:33) davin.baragiotta: 
 241 cherchez datetime :
 242 http://docs.python.org/library/datetime.html
 243 (13:35:39) davin.baragiotta: lisez ;)
 244 (13:35:46) davin.baragiotta: sinon, importez le module dans interpréteur et introspectez!!! :
 245 import datetime
 246 datetime. [+ tab]
 247 datetime.datetime? [+ tab]
 248 (13:36:04) davin.baragiotta: continuons
 249 (13:36:12) davin.baragiotta: import re = import du module d'expressions régulières
 250 (13:36:18) davin.baragiotta: en fait... tous les messages échangés via jabber nous arrivent comme des lignes de texte....
 251 (13:36:24) davin.baragiotta: on veut pouvoir chercher des mots dans les lignes pour trouver les commandes données au bot!
 252 (13:36:33) davin.baragiotta: 
 253 
 254 re = regex = regular expression
 255 http://docs.python.org/library/re.html
 256 (13:36:41) davin.baragiotta: (regex = un petit monde en soit au niveau de la syntaxe)
 257 (13:36:51) davin.baragiotta: on continue
 258 (13:36:57) davin.baragiotta: après mes imports de la librairie standard
 259 (13:37:01) davin.baragiotta: j'importe les modules particuliers installés sur mon système...
 260 (13:37:16) davin.baragiotta: jabberbot est accessible car vous l'avez installé via un paquet Debian avant l'atelier
 261 (13:37:17) davin.baragiotta: il est accessible par son nom de module python
 262 (13:37:21) davin.baragiotta: il y a 2 façons d'importer :
 263 from ...
 264 import ...
 265 (13:37:37) davin.baragiotta: PYTHON : QUELQUES BASES : IMPORTS : IMPORT
 266 (13:37:57) davin.baragiotta: import re , par exemple, charge tout le module re
 267 (13:38:06) davin.baragiotta: les objets du modules sont accessibles dans le code en les préfixant par le nom du module
 268 (13:38:12) davin.baragiotta: ex.: ligne 38 j'utilise compile de re en codant : 
 269 re.compile
 270 (13:38:28) davin.baragiotta: PYTHON : QUELQUES BASES : IMPORTS : FROM
 271 (13:38:33) davin.baragiotta: from charge seulement des noms spécifiques... accessibles directement, sans préfixer
 272 (13:38:42) davin.baragiotta: ex.: ligne 10 j'utilise MUCJabberBot de muc en codant :
 273 MUCJabberBot
 274 (n'est pas préfixée par muc : muc.MUCJabberBot)
 275 (13:38:55) davin.baragiotta: PYTHON : QUELQUES BASES : MODULES
 276 (13:39:00) davin.baragiotta: ligne 8 : j'importe MUCJabberBot de muc... mais on n'a pas installé muc sur notre système...
 277 (13:39:07) davin.baragiotta: ... mais il est accessible dans le contexte (puisqu'on l'importe) : muc vient d'où?
 278 (13:39:15) davin.baragiotta: il vient de *notre* module bot
 279 (13:39:21) davin.baragiotta: c'est que le répertoire bot est en soi un module python
 280 (13:39:31) davin.baragiotta: comment créer un module?
 281 (13:39:39) davin.baragiotta: tout simplement en ajoutant un fichier (vide) nommé __init__.py dans un répertoire
 282 (13:39:49) davin.baragiotta: grâce à bot/__init__.py, on peut importer du contenu d'un fichier .py (de ce répertoire) dans un autre fichier .py
 283 (13:39:56) davin.baragiotta: preuve :
 284 bot.py import à la ligne 8 MUCJabberBot en provenant de 
 285 muc.py
 286 (13:40:09) davin.baragiotta: Des questions?
 287 (13:40:41) olivier.larcheveque: 
 288  QUESTION: quel lien pour tester notre compte de jabber? (J'ai su oublié mon mot de passe)
 289 (13:40:57) davin.baragiotta: 
 290 https://register.jabber.org/
 291 (13:41:04) davin.baragiotta: je crois on peut modifier mdp ;)
 292 (13:41:12) davin.baragiotta: pas sûr
 293 (13:41:17) olivier.larcheveque: 
 294 ok pas d'autres questions autrement
 295 (13:41:25) davin.baragiotta: Codons, codons, codons
 296 (13:41:27) davin.baragiotta: MODULES : BOT JABBER : PERSONNALISER SON BOT PAR UNE SIMPLE MODIF
 297 (13:41:34) davin.baragiotta: Pour ceux qui ont un bot qui marche, on va le personnaliser
 298 (13:41:41) davin.baragiotta: il y a 2 approches pour l'interaction du bot :
 299 * une commande
 300 * une recherche de mot-clé par regex
 301 (13:41:48) davin.baragiotta: on va commencer par personnaliser en mettant un mot dans regex
 302 (13:41:56) davin.baragiotta: copiez la ligne 38 et collez la dessous, en ligne 39
 303 (13:42:04) davin.baragiotta: modifiez la ligne 39 :
 304 * le nom de l'attribut de self : ex.: par self.re_hourra
 305 * la chaîne de caractère dans le regex : ex.: par u'.*(?P<hourra>hourra).*'
 306 (13:42:17) davin.baragiotta: exemple :
 307         self.re_biere = re.compile(u'.*(?P<biere>bi[eè]re).*')
 308         self.re_hourra = re.compile(u'.*(?P<hourra>hourra).*')
 309 (13:42:25) davin.baragiotta: avec ça, on le patron regex pour trouver le mot hourra dans une chaine de caractères
 310 (13:42:44) davin.baragiotta: ensuite
 311 (13:42:47) davin.baragiotta: ligne 50 et 51 : copiez et collez dessous
 312 (13:42:52) davin.baragiotta: modifiez les lignes 52 et 53 :
 313 * en remplaçant 'biere' par 'hourra'
 314 (13:42:59) davin.baragiotta: exemple :
 315         if self.re_biere.match(message):
 316             self.biere(mess)
 317         if self.re_hourra.match(message):
 318             self.hourra(mess)
 319 (13:43:09) davin.baragiotta: avec ça on vient de dire : 
 320 si le message matche le pattern (regex) écrit dans self.re_hourra
 321 alors on exécute la méthode (fonction) hourra sur self (le bot lui-même)...
 322 (13:43:21) davin.baragiotta: mais on n'a pas encore déclaré la méthode self.hourra() : créons la
 323 (13:43:32) davin.baragiotta: copiez def biere au grand complet (lignes 84 à 89)...
 324 ... et collez le code dessous
 325 (13:43:42) davin.baragiotta: on modifie :
 326 * le nom de la méthode définie
 327 * la réponse retournée par cette méthode du bot
 328 (13:43:51) davin.baragiotta: exemple :
 329     def biere(self, mess):
 330         """Aux messages relatifs à la bière, choisit une de ses réponses prédéfinies"""
 331         username = self.get_sender_username(mess)
 332         if username != self.username and username != self.nickname:
 333             response = 'St-Ambroise!'
 334             self.send_simple_reply(mess, response)
 335         
 336     def hourra(self, mess):
 337         """Aux messages relatifs à la bière, choisit une de ses réponses prédéfinies"""
 338         username = self.get_sender_username(mess)
 339         if username != self.username and username != self.nickname:
 340             response = 'Non... je ne suis pas de bonne humeur.'
 341             self.send_simple_reply(mess, response)
 342 (13:44:07) davin.baragiotta: on vient de rendre sensible notre bot au mot 'hourra' où qu'il soit dans un message...
 343 ... afin qu'il réponde :
 344 'Non... je ne suis pas de bonne humeur.'
 345 (13:44:22) davin.baragiotta: Pour tester le nouveau comportement du bot :
 346 * fermer dans votre terminal le bot en cours : Ctrl + C
 347 * si il traine dans le salon trop longtemps encore, dans le salon : /kick monbot
 348 * relancer le bot :
 349 python bot/bot.py
 350 (13:46:16) davin.baragiotta: on est dans le salon test à tester nos bots modifiés
 351 (13:47:20) davin.baragiotta: ok on continue
 352 (13:47:30) davin.baragiotta: MODULES : BOT JABBER : PIMPER SON BOT PAR L'AJOUT DE COMMANDE
 353 (13:47:39) davin.baragiotta: 
 354 ### EXERCICE : solution pour la commande finale du bot : 
 355 http://paste.pocoo.org/show/467932/
 356 (13:48:09) davin.baragiotta: L'autre approche pour l'interaction est la commande.
 357 (13:48:15) davin.baragiotta: Les commandes sont des méthodes "décorées" par le décorateur : @botcmd
 358 (13:48:23) davin.baragiotta: Un décorateur est une fonction qui s'exécute avant une fonction.
 359 (13:48:30) davin.baragiotta: Pour utiliser une commande, tapez simplement son nom dans le salon, suivi des paramètres qu'elle accepte.
 360 (13:48:44) davin.baragiotta: Exemple, comme vu dans la démo avec :
 361 redmine #123
 362 (13:48:52) davin.baragiotta: Pour que seul votre bot réponde, vous pouvez préfixer le tout de son nom :
 363 barabotta redmine #123
 364 (13:49:00) davin.baragiotta: Pour créer votre propre commande...
 365 * copiez la commande sieste : lignes 61 à 64... n'oubliez pas le décorateur
 366 * collez le code dessous
 367 * modifiez le nom de la commande
 368 * modifiez le contenu de la réponse : variable 'reply'
 369 (13:49:17) davin.baragiotta: Tester la commande dans le salon
 370 * fermer dans votre terminal le bot en cours : Ctrl + C
 371 * si il traine dans le salon trop longtemps encore, dans le salon : /kick monbot
 372 * relancer le bot :
 373 python bot/bot.py
 374 (13:49:35) davin.baragiotta: Des questions?
 375 (13:49:47) olivier.larcheveque: 
 376 non
 377 (13:50:41) davin.baragiotta: ok, j'ai terminé
 378 (13:50:57) davin.baragiotta: on pourrait parler des boucles sans fin de lundi
 379 (13:51:11) davin.baragiotta: barabotta est encore "armé" pour faire une boucle sans fin ;)
 380 (13:51:37) davin.baragiotta: mais il manque un peu d'activité dans le salon test : c'est plein d'humains et peu de bot ;)
 381 (14:00:14) davin.baragiotta: maitenant, c'est plein de vie
 382 (14:00:16) davin.baragiotta: :D
 383 (14:00:32) davin.baragiotta: ---------- FIN : Atelier : Programmation Python ----------------

Projet/SemaineTech/2011/Ateliers/ProgrammationPython/Conversation (dernière édition le 2012-04-02 15:13:18 par VictorBruneau)