--- layout: post title: "TP1 de programmation objet interprétée - Entrée en matière" categories: ruby-2a --- # Entrée en matière Ce TP a pour but de vous faire pratiquer les bases du langage Ruby, en particulier : * Prendre en main l'environnement * Bases de la bibliothèque standard * Méthodes * Hash et Map * Une façon de tester * Apprendre à mélanger intuition et parcours de la documentation pour découvrir le Ruby que l'on ignore encore Ruby est un langage 100% objet, tout est objet, même nil (null) ! Mais avant de se lancer dans de la programmation objet, assurons nous d'avoir bien les bases : Amusons avec des scripts classiques, Ruby permet ça aussi ! ## Outils 1. Votre éditeur de texte/IDE préféré! Pas de guerre de religion ici! (Liste non exhaustive en bas). 2. *irb* : le débogueur ruby. Idéal pour tester directement des commandes. Peut aussi servir à déboguer. 3. *pry*: irb, en mieux: avec debogueur et couleurs. Installable comme une gemmme (cf. votre cours). 3. *rspec* sera utile pour ce TP. C'est un outil de tests unitaires (ils vous sont fournis cette semaine). 3. *ri*: l'aide locale de ruby, plus rapide que le réseau mais moins jolie (exemple `ri String#scan`) 4. Une ancienne version d'un bon livre sur ruby a été ouverte. Vous la trouverez [là](http://ruby-doc.com/docs/ProgrammingRuby/). Elle ne couvre pas tous les ajouts récents mais toute la base du langage est toujours bonne, et bien expliquée. 5. Doc de référence: l'officielle sur [ruby-doc.org](https://ruby-doc.org/core-2.6/). Barre de recherche en haut à droite. 6. Un [cours de programmation](http://evc-cit.info/cit020/beginning-programming/index.html) écrit avec Ruby comme langage support. Une rapide présentation des IDE ruby est disponible à la fin de ce document... Si vous avez un IDE préféré, il devrait faire l'affaire. ## 1 - Katas marrants Télécharger les fichiers de ce répertoire (sujet, ainsi que les tests unitaires et fichiers de données nécessaires). >De la même manière que pour un pratiquant d'art martiaux, les katas sont des exercices que font les développeurs pour améliorer leurs compétences via répétition et entraînement. Vous devez éditer le fichier `katas.rb` qui contient une liste de fonctions à écrire. Vous pouvez vérifier vos katas au fur et à mesure de votre dev avec les tests unitaires écrits pour cet usage. Pour cela, ouvrez un terminal, allez dans le dossier de votre projet et tapez simplement `rspec`. Si il n'est pas installé, regardez la section suivante ### Installation de `rspec` On installe la gemme: `gem install --user-install rspec` On cherche le répertoire d'exécutables à ajouter au PATH: ~~~ find ~/.gem -name bin -type d /home/delobel/.gem/ruby/2.7.0/bin ~~~ On ajoute le chemin au PATH dans le .bashrc (attention, vous n'avez pas forcément la même version de ruby). `echo 'PATH="$PATH:/home/delobel/.gem/ruby/2.7.0/bin"' >> ~/.bashrc` On relit le fichier de conf: `source ~/.bashrc` ## 2 - Calcul de fréquences ### Consignes Le but de cet application, c'est de prendre un nom de fichier en paramètre et de ressortir les fréquences (nombre d'occurence d'un mot par rapport au nombre de mots total) des 20 mots les plus courants du fichier, en ignorant les mots de moins de 3 caractères et bien sûr les ponctuations. On veut donc pouvoir la lancer comme suit sur le fichier exemple `french_text.txt`: ```sh $>ruby frequency.rb french_text.txt ``` Et avoir le résultat suivant : ``` corbeau: 0.029 que: 0.022 vous: 0.022 tes: 0.022 tre: 0.015 bec: 0.015 fromage: 0.015 renard: 0.015 peu: 0.015 monsieur: 0.015 sans: 0.015 votre: 0.015 ces: 0.015 sur: 0.007 arbre: 0.007 perch: 0.007 tenait: 0.007 son: 0.007 par: 0.007 odeur: 0.007 ``` Attention, si on ne passe aucun paramètre au programme, un message d'erreur doit s'afficher sur le flux d'erreur (`$stderr`). Exemple : ``` $>ruby frequency.rb usage: frequency.rb ``` ### Quelques pistes... L'utilisation de [Hash](https://docs.ruby-lang.org/en/2.0.0/Hash.html) pour le comptage des mots est particulièrement utile. Surtout si vous l'initialisez avec une valeur par défaut en cas de clef absente... On ne peut que vous conseiller de séparer l'application en plusieurs responsabilités : * Lecture du fichier texte * Nettoyage du texte (pour la ponctuation par exemple) * Séparation du texte en mots * Comptage des occurences des mots * Calcul des fréquences (normalisation des occurences) * Tri et affichage des 20 premiers résultats * Programme principal qui associe les différentes responsabilités ensemble Pour nettoyer le texte, vous pouvez regarder ce que fait `String#gsub(motif, remplacement)`. Un motif peut être une expression rationnelle Ruby (`/^lapino?s/` par exemple). Cela vous permettra d'écrire plusieurs petites fonctions que vous pourrez tester au fur et à mesure. N'hésitez pas à vous référer aux katas écrits avant. ### Variante (si vous avez été très rapide sur le précédent) Ajoutez une option -l à votre programme qui permet de calculer la fréquence des différentes lettres du texte. ## 3 - Détection de langues On vous fournit un fichier JSON `stop_words.json` qui contient les [mots vides](https://fr.wikipedia.org/wiki/Mot_vide) (ou *stopwords*) les plus courants dans les langues les plus courantes. Les mots sont au format qui suit : ```json { "