2ème séquence : création d'un interpréteur de commandes en Ruby

Objectifs pédagogiques :

  • découvrir un outil bien pratique pour les personnes faisant de la programmation
  • réviser les structures de bases
  • manipuler des fichiers
  • prendre conscience de l’arborescence machine et du système d’exploitation
  • peut-être qu’on revera aussi de l’objet

Les apprenantes votent très majoritairement pour des groupes de 3.
Le groupe est donc séparé en groupes de 3 et un groupe de 2 :

Tout le monde développera en Ruby.

Les projets :

Les projets n’ont pas tourné d’une semaine à l’autre.

Il y a des projets annexes qui apparaissent

29 octobre : plénière sur les éditeurs de texte (et un peu le terminal)

Chacune présente son éditeur de texte qu’elle utilise pour coder.

Atom

Nicolas présente Atom sous Windows, l’éditeur officiel de GitHub, et un logiciel graphique aussi issu de GitHub pour gérer Git.

@laurine présente une version sublimée de Atom, avec des petites icônes qui nous indiquent le langage des fichiers source listés sur la gauche. À droite de l’écran ça montre une version « vue de loin » de l’intégratlité du fichier qui est en cours d’édition. Elle explique qu’on peut installer des greffons (plug-ins) pour améliorer le comportement de l’éditeur.

Adriel

Adriel présente vim. Mais avant, il nous montre une ligne de commande avec xrandr qui permet de gérer l’affichage sur plusieurs écrans (ici : xrandr --output LVDS1 --auto --output HDMI1 --auto --above-of LVDS1). Dans vim Adriel nous montre la combinaison de touches Ctrl-a qui permet d’incrémenter un nombre automatiquement.

On regarde rapidement gvim, la version graphique de vim avec une fenêtre, des boutons clickables, etc. On revient rapidement à vim qu’Adriel maitrise mieux.

Pour ouvrir un fichier avec vim, on tape : vim nom_du_fichier. On fait un détour pour montrer que dans un terminal vim est une commande au même titre que firefox qui lance le navigateur du même nom.

Le problème de vim c’est qu’il est peu intuitif au début et difficile à apprendre.

Adriel nous fait un petit historique : vim (Vi IMproved) est le successeur de vi (VIsual editor), qui est le successeur de ed (standard EDitor).

On voit la coloration syntaxique dans vim avec un exemplde code Processin du projet précédent.

Par défaut dans vim quand on appuie sur des lettres il n’écrit pas forcément. C’est parce qu’on a trois mode dans vim : insertion, visuel et normal. Pour écrire il faut être en mode insertion.

Par rapport à l’éditeur Processing qui nous montrait directemnet nos erreurs potentielles, vim ne le fait pas. Mais depuis vim on peut exécuter Processing pour tester le code.

Adrien montre le multifenêtrage dans vim, on peut séparer l’écran et voir plusieurs fichier. Il explique qu’il préfère utiliser les buffer de vim, où on peut avoir plusieurs fichiers ouverts sans forcément tous les afficher à la fois.

On fait un détour par cmatrix et hollywood, deux programmes pour afficher des choses impressionnantes mais insensées

Geany

@Mohamed nous le présente, l’interface est similaire à Atom : coloration syntaxique, listage des fichiers sur la gauche. On peut exécuter notre progreamme dans un terminal automatiquement depuis l’environnement de développement Geany (IDE).

Emacs

@kheops présente emacs très rapidement, pour savoir que ça existe que c’est un peu l’autre grande faction, historiquement, face aux utilisatrices de vim.

Autres

D’autres éditeurs sont aussi mentionnés dans la discussion : sublimetext, notepad++, visual studio, eclipse, intelliJ…

Journal du 29 octobre 2019

Florian - laurine - B3RRY

  • Florian a codé un chatbot rudimentaire. Il réagit aux phrases qu’on lui donne d’une manière humoristique.
  • Le programme utilise la fonction sleep(second) pour mettre le programme en pause.
  • Florian a appris la fonction gets qui permet de demander à l’utilisateur ce qu’il faut mettre dans une variable sous la forme variable = gets.méthode.
  • \n c’est le caractère de saut de ligne. Pour éviter de le récupérer avec gets, elles ont utilisé la méthode .strip! pour supprimer tous les « white spaces ».
  • On a aussi appris que le ! à la fin d’une méthode dans Ruby signifie qu’elle va modifier l’état d’une variable.
  • Problèmes d’indentation avec Vim.
  • On s’est servi de until qui est l’inverse de while. Au lieu de lui dire « Tant que tu as tel résultat, continue », tu lui dis « Tant que tu N’as Pas tel résultat, tu continues ». Ça permet de clarifier des problèmes avec les priorités des portes logiques (|| dans un not).
  • Marine s’est un peu familiarisé avec la « POO ». Ruby semble plus facile que Processing. Elle a aussi téléchargé et commencé à utiliser l’éditeur de texte Atom.
  • Marine et Laurine ont suivi des tutoriels ruby.
  • Florian a ajouté #!/usr/bin/ruby au début de son fichier pour l’exécuter directement.
  • Laurine a suive le tuto ruby sur sololearn et va sûrement le finir ce soir.

Wara - Nicolas - Gwenaelle

  • Nicolas utilise l’outil FileUtils. Il a écrit un man. Pour créer une fonction, il faut associer la classe à une variable.
  • Il peut utiliser l’interpréteur pour créer un fichier (create), ajouter un caractère (append), compter le nombre de ligne (count_line), etc,
  • Il a créé un menu interactif pour naviguer dans les pages du manuel de l’interpréteur.
  • Nicolas a implémenté ls
  • Wara a appris l’\n dans Ruby, il n’y a pas de déclaration de variable, les blocs de code se terminent par end. elle a appris à un peu mieux utiliser Vim, pour faire de la magie.
  • Gwen a appris qu’elle pouvait finalement utiliser Ruby sur son pc (!!), et elle a compris qu’elle ne peut utiliser que le terminal sous peine de faire planter le PC.

Zakia - Adriel

cf Les notes de Philippe.

Mohamed - Lydia - Fayal

  • Mohamed a approfondis le ruby, en suivant des tutos. Il a compris que le Ruby a beaucoup de similitudes avec le python. Il est vraiment simplifié par rapport au Processing ou au C où il faut être très rigoureux
  • Il a intégré un Terminal, et git dans Atom pour pouvoir tout faire en passant par l’éditeur de texte.
  • Lydia a suivi le tuto proposé sur le site [ruby.org]. Elles ont pu faire le tuto ensemble, ce qui permettait l’entraide.
  • Elle est allée sur sololearn pour se familiariser avec Ruby et peut-être quelques connaissances ?
  • Elle a tenté de relire, déchiffrer, le code de Nicolas avec l’aide de KheOps, Wara et Zakia.

Adriel :

  • l’auteur de « hello quant » (eloquent) Ruby a beaucoup d’humour.
  • Ruby est très pragmatique
  • Le mot idiomatique
  • super souple : sans parenthèse, do end à la place d’accolades.
  • ruby -n : lance en boucle un programme

@Zakia :

  • j’ai choisit atom comme éditeur de texte pour me faciliter la vie.
  • j’ai lu le code de Nicolas, relu en groupe

Nicolas : je pense la façon de la plus efficace d’apprendre c’est de commencer par un petit code simple puis chercher sur internet.

30 octobre : plénière sur les boucles

On regarde les syntaxes de boucles en Processing (Java) et en Ruby.

Boucle for en Java : on l’a vue dans le projet GameOfLife et on revoit un exemple simple :

for (int x = 1 /* initialisation */; x < 10 /* condition d'arrêt */; x++ /* itération */)
{
  println ("Coucou: ", x);
}

Ceci affiche « Coucou: 1 » puis « Coucou: 2 » etc. jusqu’à 9. Si on enlève le x++ la boucle ne s’arrête jamais car x vaut toujours 1.

En Ruby on n’utilise pas la construction for. Une boucle sert à parcourir une liste d’objets. On parcourt par exemple une liste d’entiers avec :

list = [1, 2, 3, 5, 7, 9]
list.each { |élément_de_la_liste| p élément_de_la_liste }

Ce code va afficher 1, puis2 puis 3 puis 5 puis puis 7 puis 9.

On voit aussi :

list.map { |e| e+=1 }

En suite list vaut [2, 4 ,6, 8, 10].

On voit aussi list.count qui donne le nombre d’éléments dans la liste. On peut aussi compter dans i les éléments d’une liste avec :
i = 0; list.each { |e| i = i + 1 }

Boucle while : « while » signifie « tant que » et on voit qu’une boucle while peut être équivalent strictement à une boucle for :

int x = 0;
while (x <= 10) {
   println("X: ", x);
   x++;
}
/* équivalent à ça : */
for (x = 0; x <= 10; x++) { println("X: ", x); }

Exemple en Ruby, où c’est uniquement des différences syntaxiques :

x = 0
while x <= 10 do 
   p x
   x+=1
end

On peut utiliser des parenthèses, mais elles sont optionnelles, par exemple :

while (x <= 30) do 
   p x
   x+=1
end

On voit une pratique à ne jamais faire, utiliser goto et if pour avoir un comportement équivalent à while. En C, ça donnerait :

recommence:
if (x <= 10) {
  println ("X: ", x);
  x++;
  goto recommence;
}

En Ruby on a aussi une boucle until (« jusqu’à »).

Il y a aussi unless (« à moins que ») qui est équivalent à if not.

On voit pour finir une syntaxe Java très peu utilisée, la boule do…while :

int x = 11;
do {
println ("X: ", x);
x++;
} while (x <= 10);

C’est équivalent à une boucle while avec une différence : le code à l’intérieur de la boucle sera exécuté une fois même si la condition du while n’est pas respectée.

Laurine :

  • j’ai appris à gérer les fichiers, les bouger, changer les droits, rajouter des lignes directement dans les fichiers.
  • j’ai appris à créer des fonctions pour créer un fichier, le supprimer.
  • je galère encore sur les changements de droits.

Aujourd’hui : projet perso de todo app de choses à faire en html, css et un peu de javascript. J’ai essayé d’adapter l’affichage à la taille de la fenêtre. Je procède élément par élément (bouton, liste). J’ai un grand rectangle qui détache. J’utilise des media-query qui changent les règles css en fonction de la taille de l’écran.

Florian :

  • J’ai codé un jeu vidéo aujourd’hui. J’ai des bugs à fixer.
  • J’ai exploré la création de classes
  • appris les variables d’instances @
  • j’ai appris la séparation des classes
  • j’ai appris beaucoup de petites choses comme l’interpolation dans les chaînes de caractères, la fonction rand

Marine :

  • j’ai appris les classes les boucles, les méthodes.
  • j’ai appris sur quoi il fallait accentuer pour bosser pour devenir data scientist.

Adriel : j’ai appris :

  • l’intérêt de require_relative qui va chercher les bibliothèques par un chemin relatif.
  • le concept de canard en plastique humain, quand tu expliques ta démarche, ce que tu fait.
  • l’équivalence des raccourcis vim pour un plugin bepo
  • load pour relire tout le contenu d’un script en Ruby

Zakia :

  • tuto avec Lydia, Wara supervisé par Agathe sur les principales commandes unix.
  • commencé à faire des tuto et de les suivre à la maison
  • appris plein de petites choses tant ce matin que l’après-midi avec Agathe.

Nicolas :

  • au début je voulais faire de la data science en Ruby
  • puis exécuter du Python en Ruby
  • puis faire du Python

J’ai volé l’idée de Florian pour faire un jeu vidéo :

  • chomp c’est très utile
  • j’ai ouvert des images, des exécutables, des vidéos à partir d’un code Ruby.

Wara :

  • Ctr-S dans le terminal le met en pause.
  • Pour sortir de cette pause, il faut faire Ctr-Q
  • J’ai réaffirmé mes acquis sur les commandes basiques du terminal
  • J’ai utilisé pwd et touch
  • J’ai appris ces commandes

Lydia :

  • solo learn pour apprendre Ruby
  • pwd : le chemin courant à un moment donné.
  • revu rapidement et plus doucement certaines commandes du terminal

Fayal :

  • tuto de Ruby sur sololearn
  • basic, control, collection et méthode. Pas encore assimilé correctement. Ca viendra dans les exercices. Les projets commenceront la semaine prochaine.
  • J’essaie de comprendre le bout de texte écrit et ce qui est noté en jaune pour ensuite passé à l’exercice. Je procède par analogie. Je ne comprends pas tout de l’anglais.

Bout de code de la présentation de l’interpréteur de Yannick

Laurine

  • reprise du projet de Flo : un jeu où il faut affronter des monstres
  • changement de la couleur de l’écriture du terminal (et d’autres styles comme le gras et l’italique)
  • ajout de monstres à travers des nouvelles classes
  • ajustement des variables pour équilibre le jeu
  • gestion des conditions si choix non présent dans la liste
  • on a appris à mettre l’interface en plein écran system(clear) et 'system(cls)`
  • objectif de la journée : mettre de la musique dans le jeu mais ça ne marche pas :smiley:
  • on a mis un lien vers une video youtube mais le navigateur passait par dessus le terminal

Marine

  • relecture du code avec Florian
  • inspiration du jeu pour créer un bout de code qui crée une classe Film et qui présente les attributs de chaque film
  • on apprend beaucoup mieux en faisant
  • objectif de création de base de données avec tous les films de SF et de fonction qui puisse extraire tous les films de cette base
  • j’ai surmonté ma peur et j’ai commencé à coder
  • j’ai appris ce qu’était un cdv
  • trier mes idées
  • faire un code propre
  • prendre mon temps
  • approfondissement de git avec la présentation de Yannick

Fayal

  • commencer mon propre code, j’avais des difficultés pour savoir par où commencer
  • définir des termes pour le terminal et exécuter une commande en fonction de ce qui a été entré dans le terminal
  • mettre un bloc en commentaire dans Ruby
  • révision de GitHub et meilleure compréhension

Lydia

  • impression que c’était plus compliqué de faire des recherches sur Ruby que sur Processing, mais qu’il fallait persévérer
  • avec Philippe, j’ai appris comment faire mes premières lignes
  • j’ai appris à déchiffrer les erreurs

Adriel

  • réflexions sur le déroulement du temps avec les enfants que j’encadre, sur comment les mener plus loin que Scratch
  • ils sont bien plus malins que ce qu’on croit pour des 8-10 ans
  • j’ai assisté à la présentation du code de Yannick et je suis en accord avec sa vision
  • je ne connaissais pas les principes de l’informatique et leurs acronymes
  • création de demoshell qui recrée des commandes de terminal et peuvent s’appeler entre elles
  • ces commandes sont chacune déclarées dans un fichier à part portant leur nom
  • ctrl-d équivaut à EOF (end of file) et c’est pour ça que ça quitte le terminal
  • j’ai appris à utiliser begin/rescue qui permet de gérer les erreurs
  • j’ai appris à faire des threads dans Ruby (des actions qui s’exécutent en même temps)
  • puts sans argument fait un retour à la ligne
  • un point d’interrogation à la fin d’une fonction renvoie true/false
  • raise déclenche une erreur
  • j’aime beaucoup le ruby

Nicolas

  • on a remarqué un problème avec le code qui est dû à la lecture d’un fichier. Le chemin relatif ne marchait pas et allait chercher dans un autre dossier. On ne pouvait pas indiquer un chemin absolu parce que le script ne marcherait pas sur toutes les machines. On a donc rajouté une ligne de code qui va chercher le chemin du fichier qui est exécuté et on le rajoute au nom du fichier.
  • le script récupère un nom de film dans un fichier, l’affiche dans le terminal et le retire du fichier. On peut relancer le script pour qu’il nous donne le nom d’un autre film sans retirer la première suggestion.

Wara

  • j’ai appris ce que faisait % : le reste d’une division euclidienne
  • je n’ai pas encore saisi où on pourrait l’utiliser (exemple : trouver si un chiffre est pair ou impair)
  • j’ai appris =begin et =end pour commenter un bloc en ruby
  • j’ai assisté Nicolas
1 J'aime

:raised_hands::muscle::tada:

1 J'aime

À propos de ma discussion de ce matin (mardi matin), j’ai parlé des sites

  • Lean X In Y Minutes pour découvrir des exemples de syntaxe dans la plupart des langages de programmation, cela évite d’avoir à l’apprendre :slight_smile: À noter que c’est un projet sous licence libre, et que vous pouvez donc participer : https://github.com/adambard/learnxinyminutes-docs

  • RosettaCode est un wiki qui référence la résolution d’un problème écrit dans différent langage. Ça permet d’avoir des éléments de comparaison. Si je connais JavaScript, et que je souhaite faire du C++, je peux regarder dans Rosetta un programme (au hasard ?) et comparer les deux versions, ça m’apportera des connaissances sur la syntaxe en C++

  • Paradigme de programmation, sur cette page wikipedia, on retrouve une liste des (nombreux) paradigmes existant. Pas la peine de tous les connaître ! :slight_smile:

  • YAGNI

  • KISS

  • DRY

  • SOLID et l’article qui explique de façon « illustré » en français, les principes solid Principe SOLID dans la vie de tous les jours

  • Design Pattern