Outils pour utilisateurs

Outils du site


issue143:c_c

Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Les deux révisions précédentesRévision précédente
Prochaine révision
Révision précédente
issue143:c_c [2019/04/10 09:34] auntieeissue143:c_c [2019/04/10 10:24] (Version actuelle) auntiee
Ligne 164: Ligne 164:
 Cinquième étape - Test suivant Cinquième étape - Test suivant
  
-L'étape ci-dessus a été entièrement consacrée à la réussite de mon test « test_load_singleLine_sgf ». Je l'ai fait ainsi car c'était comme une preuve de la conception et pour affiner les différentes fonctions pour l'analyse des données. Ceci signifie que la seule chose qui me restait à faire était la mise à niveau de la fonction d'analyse de mon fichier pour qu'elle ne plante pas quand toutes les métadonnées ne sont pas sur une seule ligne. L'existence d'éléments supplémentaires n'a pas d'importance, car la regex ne récupérera que ce que je cherche. Ensuite, j'ai créé un nouveau test « test_load_multiLine_sgf » et l'ai fait charger un jeu de OGS, qui était découpé sur plusieurs lignes.+L'étape ci-dessus a été entièrement consacrée à la réussite de mon test « test_load_singleLine_sgf ». Je l'ai fait ainsi car c'était comme une preuve de la conception et pour affiner les différentes fonctions pour l'analyse des données. Cela signifie que la seule chose qui me restait à faire était la mise à niveau de la fonction d'analyse de mon fichier pour qu'elle ne plante pas quand toutes les métadonnées ne sont pas sur une seule ligne. L'existence d'éléments supplémentaires n'a pas d'importance, car la regex ne récupérera que ce que je cherche. Ensuite, j'ai créé un nouveau test « test_load_multiLine_sgf » et l'ai fait charger un jeu de OGS, qui était découpé sur plusieurs lignes.
  
-Le premier but était à nouveau de charger les données des joueurs proprement (les noirs comme les blancs), ce qui a nécessité que j'élabore un contrôle si les données étaient sur plusieurs lignes ou non. J'ai ouvert un testeur de regex en ligne, mis quelques données de test et testé un moment jusqu'à ce que je trouve une regex qui semble marcher+Le premier but était à nouveau de charger les données des joueurs proprement (les noirs comme les blancs), ce qui a nécessité que j'élabore un contrôle si les données étaient sur plusieurs lignes ou non. J'ai ouvert un testeur de regex en ligne, mis quelques données de test et testé un moment jusqu'à ce que je trouve une regex qui semblait fonctionner
  
 **The entire checkMultiline function ended up looking like this: **The entire checkMultiline function ended up looking like this:
Ligne 188: Ligne 188:
        return False        return False
  
-Ce que fait la regex est de chercher tous les caractères (en majuscules et en minuscules) qui précèdent le crochet, certains caractères, un crochet fermant et une nouvelle ligne. Je n'étais pas trop inquiet de ne correspondre exactement qu'aux lignes de métadonnées, car je ne lisais jamais tout le fichier (je sors de la boucle une fois que je trouve toute l'information dont j'ai besoin) et la regex secondaire ne sera pas affectée. La vérification est utilisée dans ma fonction readSGF et toutes les lignes qui correspondent à la vérification des lignes multiples sont chaînées en une ligne unique (sans retour à la ligne) qui transite par les diverses fonctions. +Ce que fait la regex est de chercher tous les caractères (en majuscules ou en minuscules) qui précèdent le crochet, certains caractères, un crochet fermant et une nouvelle ligne. Je n'étais pas trop inquiet de ne correspondre exactement qu'aux lignes de métadonnées, car je ne lisais jamais tout le fichier (je sors de la boucle une fois que je trouve toute l'information dont j'ai besoin) et la regex secondaire ne sera pas affectée. La vérification est utilisée dans ma fonction readSGF et toutes les lignes qui correspondent à la vérification des lignes multiples sont chaînées en une ligne unique (sans retour à la ligne) qui est envoyée aux diverses fonctions. 
  
 **This worked fine for OGS (except reviews) files, and then I tested it on Pandanet (IGS) files, where it promptly broke. The reason it broke was simple - Pandanet added a Copyright value into the metadata, and spread it over 4 or 5 lines (depending on where the SGF was created). I put Pandanet in a separate test, and focused only on that test. Running a single test in Python is as simple as: **This worked fine for OGS (except reviews) files, and then I tested it on Pandanet (IGS) files, where it promptly broke. The reason it broke was simple - Pandanet added a Copyright value into the metadata, and spread it over 4 or 5 lines (depending on where the SGF was created). I put Pandanet in a separate test, and focused only on that test. Running a single test in Python is as simple as:
Ligne 196: Ligne 196:
 I quickly concluded that using regex for this particular case was going to be tricky, as the number of lines wasn’t always uniform. Instead, I decided to adapt my readSGF function to simply not process the following lines when it discovers the Copyright value.** I quickly concluded that using regex for this particular case was going to be tricky, as the number of lines wasn’t always uniform. Instead, I decided to adapt my readSGF function to simply not process the following lines when it discovers the Copyright value.**
  
-Ceci fonctionnait bien pour les fichiers OGS (sauf les revues) ; je l'ai testé ensuite sur les fichiers Pandanet (IGS), où elle a rapidement échoué. La raison de l'échec est simple - Pandanet ajoute une valeur de Copyright dans les métadonnées, et la répartit sur 4 ou 5 lignes (suivant l'endroit où le SGF a été créé). J'ai mis Pandanet dans un test séparé et je me suis concentré uniquement sur ce test. Lancer un test unique dans Python est aussi simple que :+Cela fonctionnait bien pour les fichiers OGS (sauf les revues) ; je l'ai testé ensuite sur les fichiers Pandanet (IGS), où elle a rapidement échoué. La raison de l'échec est simple - Pandanet a ajouté une valeur de Copyright dans les métadonnées, et l'a répartie sur 4 ou 5 lignes (selon l'endroit où le SGF a été créé). J'ai mis Pandanet dans un test séparé et je me suis concentré uniquement sur ce test. Lancer un test unique dans Python est aussi simple que :
  
-python _test.py SGFItemTests.test_load_pandanet_sgf+python _test.py SGFItemTests.test_load_pandanet_sgf 
  
-J'en ai rapidement conclu que l'utilisation d'une regex dans ce cas particulier allait être délicate, car le nombre de lignes n'était pas toujours uniforme. À la place, j'ai décidé d'adapter ma fonction readSGF pour simplement ne pas traiter les lignes qui suivent quand je découvre la valeur du Copyright.+J'en ai rapidement conclu que l'utilisation d'une regex dans ce cas particulier allait être délicate, car le nombre de lignes n'était pas toujours uniforme. À la place, j'ai décidé d'adapter ma fonction readSGF pour qu'elle ne traite tout simplement pas les lignes qui suivent quand elle découvre la valeur du Copyright.
  
 **I do this by initializing a tempCount at 0, and setting it to a value of 6 when I can find “CoPyright[\n” in the string. I also added an ‘if’ to see if tempCount is greater than 0, and when it is, the counter is reduced by one and the loop follows the “continue” directive (where it jumps to the next item in the loop). This effectively skips the plain english lines of text, removing the problems. I also noticed that some SGF files had a CP[] copyright line (such as the OGS review files), which was shorter than CoPyright. As such, I simply initialized tempCount at 5, instead of 6, which worked fine. The only reason I could do this was that the copyright notices always appeared before the game information, which means I didn’t need to take that into consideration. **I do this by initializing a tempCount at 0, and setting it to a value of 6 when I can find “CoPyright[\n” in the string. I also added an ‘if’ to see if tempCount is greater than 0, and when it is, the counter is reduced by one and the loop follows the “continue” directive (where it jumps to the next item in the loop). This effectively skips the plain english lines of text, removing the problems. I also noticed that some SGF files had a CP[] copyright line (such as the OGS review files), which was shorter than CoPyright. As such, I simply initialized tempCount at 5, instead of 6, which worked fine. The only reason I could do this was that the copyright notices always appeared before the game information, which means I didn’t need to take that into consideration.
Ligne 206: Ligne 206:
 I realize that this last section can be confusing to read. However, this is pretty much the final file, so viewing the links below should help clarify things. There were a few steps afterwards (such as when a file had no date), but they were simple enough to catch and solve when listening to the tests and batch running the file.** I realize that this last section can be confusing to read. However, this is pretty much the final file, so viewing the links below should help clarify things. There were a few steps afterwards (such as when a file had no date), but they were simple enough to catch and solve when listening to the tests and batch running the file.**
  
-Je fais ceci en initialisant un compteur temporaire tempCount à 0, puis en le réglant à une valeur de 6 quand je veux trouver « CoPyright[\n » dans la chaîne. J'ai ajouté aussi un « if » pour voir si tempCount est plus grand que 0et quand il l'est, je le réduis de 1 et la boucle suit la directive « continue » (quand elle saute à l'élément suivant de la boucle). Ceci saute effectivement les lignes de texte anglais brut, supprimant les problèmes. J'ai aussi noté que certains fichiers SGF ont une ligne de copyright CP[] (comme dans les fichiers de revue OGS), qui était plus courte que CoPyright. De ce fait, j'ai simplement initialisé tempCount à 5, au lieu de 6, ce qui marchait bien. Le seule raison pour laquelle je pouvais faire ça était que les notes de copyright apparaissaient toujours avant les informations sur le jeu, ce qui signifie que je n'avais pas besoin de le prendre en considération.+Je fais ceci en initialisant un compteur temporaire tempCount à 0, puis en le réglant à une valeur de 6 quand je veux trouver « CoPyright[\n » dans la chaîne. J'ai ajouté aussi un « if » pour voir si tempCount est plus grand que 0 etquand il l'est, je le réduis de 1 et la boucle suit la directive « continue » (quand elle saute à l'élément suivant de la boucle). Cela saute effectivement les lignes de texte anglais brut, supprimant les problèmes. J'ai aussi noté que certains fichiers SGF avaient une ligne de copyright CP[] (comme dans les fichiers de revue OGS), qui était plus courte que CoPyright. De ce fait, j'ai simplement initialisé tempCount à 5, au lieu de 6, ce qui marchait bien. Le seule raison pour laquelle je pouvais le faire était que les notes de copyright apparaissaient toujours avant les informations sur le jeu, ce qui signifie que je n'avais pas besoin de les prendre en considération.
  
-Je réalise que cette dernière section peut être confuse à la lecture. Cependant, c'est à peu près le fichier final ; donc, la lecture des contenus des liens ci-dessous devrait clarifier les choses. Il y avait quelques étapes à la suite (comme quand un fichier n'a pas de date)  mais elles étaient suffisament simples pour se les approprier et pour résoudre les retours des tests et lancer le fichier par lot.+Je réalise que cette dernière section peut être confuse à la lecture. Cependant, c'est à peu près le fichier final ; donc, la lecture des contenus des liens ci-dessous devrait clarifier les choses. Il y avait quelques étapes à la suite (comme quand un fichier n'a pas de date)mais elles étaient suffisament simples pour les voir et les résoudre quand je vérifiais les tests et lançais le fichier par lot.
  
 **Conclusion **Conclusion
Ligne 218: Ligne 218:
 Conclusion Conclusion
  
-Tous ceux qui suivront le lien vers Gist noteront certains points. D'abord, j'ai nettoyé les fichiers de test pour enlever toute information d'identification. Particulièrement parce que les lecteurs n'auront pas mes fichiers de test et auront ainsi besoin d'adapter les tests. J'ai trouvé pratique d'étiqueter les informations avec des noms génériques. Deuxièmement, un fichier bash est inclus. Ceci a une raison simple - je ne veux pas installer le script en python dans un dossier de mon $PATH, car il pourrait contenir aussi d'autres fichiers et casser les tests. À la place, j'ai écrit le script bash dans mon $PATH, qui ajoute le chemin complet aux fichiers et, ensuite, lance le script en python dans son vrai dossier avec les chemins absolus. Vous aurez à adapter le chemin vers main.py sur votre propre système.+Tous ceux qui suivront le lien vers Gist remarqueront certains points. D'abord, j'ai nettoyé les fichiers de test pour enlever toute information d'identification. Particulièrement parce que les lecteurs n'auront pas mes fichiers de test et auront ainsi besoin d'adapter les tests, j'ai trouvé utile d'étiqueter les informations avec des noms génériques. Deuxièmement, un fichier bash est inclus. Cela a une raison simple - je ne voulais pas installer le script en python dans un dossier de mon $PATH, car il pourrait contenir aussi d'autres fichiers et casser les tests. À la place, j'ai écrit le script bash dans mon $PATH, qui ajoute le chemin complet aux fichiers et, ensuite, lance le script en python dans son vrai dossier avec les chemins absolus. Vous aurez à adapter le chemin vers main.py sur votre propre système.
  
-J'espère que cet aperçu de mon processus TDD pourra donner l'idée à quelques lecteurs de l'essayer, tout comme j'ai été inspiré par d'autres. Aussi, s'il se trouve des joueurs de Go aux alentours, vous trouverez peut-être  cet outil utile pour organiser vos propres fichiers SGF. Si vous avez des questions, suggestions ou commentaires, vous pouvez me les adresser à lswest34+fcm@gmail.com.+J'espère que cet aperçu de mon processus TDD pourra donner l'idée à quelques lecteurs de l'essayer, tout comme j'ai été inspiré par d'autres. Aussi, s'il se trouve des joueurs de Go aux alentours, vous trouverez peut-être cet outil utile pour organiser vos propres fichiers SGF. Si vous avez des questions, suggestions ou commentaires, vous pouvez me les adresser à lswest34+fcm@gmail.com.
  
 **Homework (Optional) **Homework (Optional)
Ligne 234: Ligne 234:
 Travail personnel (Optionnel) Travail personnel (Optionnel)
  
-Mon but personnel pour ce script est de l'étendre avec le temps. Ma première révision devrait être  pour ajouter un système de calcul de statistiques, qui me donnera l'ensemble des statistiques sur tous les serveurs sur lesquels je joue (peut-être même avec des détails sur mes victoires sur des adversaires plus ou moins forts que moi). Si des lecteurs se sentent aussi intéressés, qu'ils n'hésitent pas à s'emparer de cette suggestion et à la mettre en pratique par eux-mêmes !+Mon but personnel pour ce script est de l'étendre avec le temps. Ma première révision serait l'ajout d'un système de calcul de statistiques, qui me donnera l'ensemble des statistiques sur tous les serveurs sur lesquels je joue (peut-être même avec des détails sur mes victoires sur des adversaires plus ou moins forts que moi). Si des lecteurs se sentent aussi intéressés, qu'ils n'hésitent pas à s'emparer de cette suggestion et à l'utiliser comme exercice eux-mêmes !
  
 Pour aller plus loin Pour aller plus loin
issue143/c_c.1554881654.txt.gz · Dernière modification : 2019/04/10 09:34 de auntiee