Si tu donnes un poisson à un homme, ce soir il sera rassasié;
Si tu lui apprends à pécher, toute sa vie il sera rassasié.
L’objectif de ce cours est de vous amener au plus vite à l’autonomie face à l’outil informatique, de façon à ce que vous puissiez:
Vaste programme? Pas tant que ça en fait, à partir du moment où
Il y aura en tout 3 ou 4 TPs qui seront à rendre à dates régulières: je les regarderais pour voir quelles difficultés vous avez pu rencontrer et, le cas échéant, vous donner un coup de main. Ils ne seront pas notés. Certains de ces TPs sont longs, de façon à donner du grain à moudre à ceux qui ont déjà une certaine expérience. Essayez d’en faire le maximum, mais ne vous inquiétez pas outre mesure si vous n’arrivez pas à les terminer.
Dans les dernières séances, vous travaillerez sur un questionnaire et sur un projet de programmation que vous finirez dans les semaines qui suivent. Votre note sera établie en fonction de la qualité du document contenant vos réponses et sur ce projet. Comme les niveaux de chacun sont très hétérogènes, j’essayerais de tenir compte des progrès effectués autant que du niveau réel.
Les premiers TP seront effectués en java, sous GNU/Linux. Par la suite, vous pourrez utiliser le langage et l’environnement de programmation de votre choix, du moment que ce choix est motivé, et fait en connaissance de cause. Personnellement, mon environnement de programmation préféré est actuellement:
Vous aurez deviné qu’en dehors de ces cours je suis aussi un défenseur des logiciels libres, mais ceci ne doit pas fausse"r votre réflexion propre.
Nous allons fixer un ensemble de règles et de conventions dans la façon d’écrire d’organiser les programmes que vous nous rendrez dans le cadre des TP et des projets d’informatique du DESS, pour les modules Outils Informatique, Remise à Niveau Informatique et Système et Réseaux. Les TP et projets qui ne suivent pas ces règles seront rejetés.
Le but de ces règles est d’une part d’obtenir des programmes plus faciles à relire, à modifier et à déboguer, et d’autre part de simplifier les échanges de programmes, entre vous, et entre vous et nous. L’objectif est avant tout de vous faire prendre de bonnes habitudes de programmation, ce qui vous fera gagner beaucoup de temps à l’usage.
Attention, nous n’affirmons certainement pas que ces règles sont uniques et les meilleures au monde; certaines de ces conventions sont en effet purement arbitraires. Toute communauté de développeurs se créé, par nécessité, de telles conventions pour rendre possible le travail en équipe. Dans certain cas, ces règles sont précisément codifiées dans un document (en anglais un Coding Standard). Dans d’autres cas, il s’agit plutôt d’un folklore oral informel. Dans tous les cas, il est important au moment d’intégrer une équipe d’apprendre et de suivre les règles qui y ont cours. Ceci n’a d’ailleurs rien de bien spécifique à l’informatique: «à Rome, agit comme les romains». Bien entendu, il est toujours possible de proposer des améliorations de ces règles, une fois que l’on en a bien compris les motivations! Aussi, n’hésitez-pas non plus à demander le pourquoi du comment de ces règles.
Certaines de ces règles nécessitent des outils que vous n’avez probablement jamais utilisés auparavant. Pas de panique, il n’y a rien de bien difficile, et on vous expliquera au fur et à mesure comment s’en servir. En particulier, on vous montrera comment automatiser la plupart des tâches.
À part la toute première séance, vous utilisez systématiquement le logiciel CVS pour gérer les versions de vos programmes.
Vous rendrez vos TPs et projets sous la forme d’une archive au format .tar.gz de votre répertoire de travail, que vous recopierez dans le répertoire ~nthiery/TP/nomDuTP/. Le répertoire de travail lui-même sera architecturé comme suit:
README: Descriptif de l’archive
Makefile: Descriptif des règles de compilation
rapport.html ou rapport.pdf: Compte rendu
bla.java: Sources du programme
...
Dans le cas contraire, le fichier README spécifie explicitement comment faire à la main les actions correspondantes.
À rendre pour le mercredi 01/10/2003.
Il existe sur internet pleins de bons sites de référence sur l’utilisation d’UNIX. Voir par exemple, en français, http://www.eleves.ens.fr/tuteurs/, http://lea-linux.org (et en particulier http://lea-linux.org/admin/shell.php3), ou http://www.newtolinux.org.uk/tutorials/shell_fr.shtml.
Voici un texte de «propagande» que j’avais écrit aux US pour un tutoriel que j’y avais donné sur CVS:
Have you ever made a modification to a document, and later wondered if it was not better before? Have you ever broken a working program, without knowing how to undo your changes? Have you ever told your sponsor "That’s really too bad, we cannot make you a demonstration. We are right now in an experimental phase, and our program is not working". Or simply, have you ever destroyed accidentally an article just before the deadline (of course it was Sunday, and there was no system administrator around to get a backup) ?
If you answered yes to any of those questions, spending one hour right now to learn how to use CVS might save you many hours and headaches in the future. CVS means Concurrent Version System; it is a version control system which can record the history of your files (usually, but not always, source code). CVS only stores the differences between versions, instead of every version of every file you’ve ever created. CVS also keeps a log of who, when and why changes occurred, among other aspects.
On commence par définir la variable d’environnement CVSROOT qui indique à CVS l’emplacement de son archive: ici on a choisi le sous-répertoire CVSROOT du répertoire utilisateur. La façon de faire dépends du système:
En fait, sur les machines Linux de Gerland, cvs devrait déjà être configuré convenablement! Vous pouvez faire echo $CVSROOT pour vérifier.
La toute première fois, il faut initialiser l’archive avec: cvs init
Pour créer un nouveau module, le plus simple est de créer un répertoire avec le nom du module dans l’archive avec: mkdir $CVSROOT/essai. C’est la seule fois où vous modifierez l’archive directement, le reste du temps c’est cvs qui s’en chargera! En fait, même là on serait sensé utiliser cvs pour créer le module avec la commande cvs import, mais nous ne rentrerons pas dans ces détails.
Pour utiliser ce module, il faut en créer une copie de travail avec: cvs checkout essai (en bref cvs co essai). Maintenant vous pouvez travailler dans le répertoire essai comme dans tout répertoire. Vous remarquerez qu’il contient un sous-répertoire CVS qui contient des informations utiles pour cvs. Normalement on a jamais besoin d’y toucher! Lorsque l’on a fini son travail, c’est une bonne habitude de détruire la copie de travail après l’avoir archivé. Cela se fait avec: cvs release -d essai depuis le répertoire parent.
Allez dans la copie de travail de essai, et créez-y quelques fichiers texte avec votre éditeur préféré.
Très rapidement, la copie de travail sera encombré de fichiers temporaires qui n’ont pas besoin d’être archivés (machin.class,…). Il faut donc indiquer à cvs la liste des fichiers à archiver. Cela se fait avec la commande: cvs add fichier; vous pouvez donner un descriptif au fichier avec cvs add -m’Source de la classe Bidule’ Bidule.java. La même commande sert à ajouter des sous-répertoires. Si, plus tard, un fichier devient inutile, vous pouvez l’indiquer à cvs avec la commande cvs remove fichier. Il faut avoir détruit le fichier au préalable!
Aussi souvent que vous le souhaitez, vous pouvez demander à cvs d’archiver la version courante d’un fichier avec: cvs commit fichier (en bref cvs ci fichier). cvs vous demande alors de rentrer un descriptif des modifications. Vous pouvez archiver tout les fichiers dans le répertoire courant d’un seul coup avec: cvs commit (en bref cvs ci).
Quand archiver ? Idéalement:
C’est pas toujours facile à faire, et il peut arriver que l’on ait besoin de faire des compromis.
C’est bien d’archiver des versions, mais encore faut-il pouvoir utiliser cette archive!
Vous pouvez demander les informations sur un fichier avec cvs log fichier. Pour demander les différences par rapport à une ancienne révision: cvs diff -r1.2 fichier. C’est une des commandes les plus importantes de cvs: si vous avez fait des modifications et vous remarquez qu’il y a un nouveau bogue, vous avez immédiatement la liste exacte des modifications; cela permet de localiser très finement les sources potentielles du bogue.
À tout moment, vous pouvez revenir à une ancienne révision avec: cvs update -r1.2 fichier. C’est utile pour faire une démonstration lorsque la version courante est cassée! Il est possible d’apporter des modifications à une telle ancienne version, mais cela demande de créer une nouvelle branche de révisions; nous ne rentrerons pas dans ces détails ici. Pour revenir à la toute dernière version, tapez: cvs update -A fichier. Si vous voulez juste consulter une ancienne révision vous pouvez aussi faire: cvs update -r1.2 -p fichier | less.
Lorsqu’une version vous paraît importante, vous pouvez lui donner un nom avec la commande cvs tag essai-1_0. Vous pouvez ensuite utiliser ce nom dans toutes les commandes au lieu du numéro de révision. C’est d’autant plus pratique que ce numéro de révision varie d’un fichier à l’autre. Par exemple, vous pouvez créer une copie de travail fraîche avec la version 1.0 de votre logiciel avec: cvs checkout -r essai-1_0 essai.
Ce ne sont que les commandes essentielles de cvs. Il y a beaucoup d’autres commandes qui sont bien utiles. En particulier, un des atouts de cvs est de faciliter le travail de plusieurs personnes sur le même projet. Je recommande de consulter, par exemple, les références suivantes:
Soyez curieux, allez voir le contenu des répertoires CVS et de l’archive dans CVSROOT!
Créez deux fichiers bla1 et bla2 avec votre éditeur favori (par exemple emacs). Utilisez la commande cat pour concaténer les deux fichiers, et mettre le résultat dans bla. Rajoutez une ligne contenant coucou à la fin fichier bla, (indication: utiliser >>).
Récupérez un gros fichier de texte (cf. par exemple sur http://www.promo.net/pg/ http://www.promo.net/pg/). Comptez le nombre de lignes et de mots dans le texte; comptez le nombre d’occurrences d’un mot clef de votre choix (indication: utilisez grep et wc; on pourra se contenter de compter le nombre de lignes contenant le mot clef). Regardez le contenu du fichier avec la commande less (indication: h donne accès à l’aide de less); à l’intérieur de less, utilisez /mot pour recherchez les mots clefs.
Explorez le système de fichier. Par exemple, visualisez le contenu du fichier /etc/passwd, listez tous les programmes dans /usr/local/bin, ou recherchez toutes les images au format gif du système (indication: utilisez locate).
Suivez le tutoriel http://lea-linux.org/dev/shell_script.php3 pour écrire de petits scripts.
Récupérez l’archive suivante, et décompressez-la (indication: utilisez les commandes gunzip et tar).
http://lapcs.univ-lyon1.fr/~nthiery/DESS/Notes/Exemples/OI-TP1-Nicolas.Thiery-1.0.tar.gz
Vous obtenez un répertoire de la forme OI-TP1-Nicolas.Thiery. Entrez dedans, et essayez les différentes commandes make, make demo, make check, make doc. Utilisez votre navigateur préféré pour visualiser les fichiers .html créés. De même, utilisez kdvi (par exemple) pour visualiser les fichiers .dvi, et gv pour les fichier .ps, et .pdf. Enfin, utilisez make clean, pour faire le nettoyage.
Toutes ces commandes utilisent le fichier Makefile. Regardez son contenu, et essayez de reproduire les commandes qu’il contient à la main.
Maintenant, vous allez personnaliser ce répertoire. Faites en une copie sous le nom OI-TP1-Prenom.Nom-1.0 (OI pour Outil Informatique) dans votre répertoire principal (Indication: utiliser cp -p). Utiliser votre éditeur préféré pour modifier le contenu des fichiers Makefile et README de façon conforme au cahier des charges. Faites aussi quelques modifications aux fichiers LATEX (avec votre éditeur), et L-.1667em.25emY-.125emX (avec lyx).
Vous allez passer ce répertoire sous CVS, afin de pouvoir archiver les différentes versions au fur et à mesure. Créez un module DESS, et demandez en à CVS une copie de travail dans ~/DESS. Déplacez le répertoire dans cette copie de travail sous le nom OI-TP1. Enregistrez le avec cvs add, ainsi que tous les fichiers importants dedans. Enfin utilisez cvs commit, pour tout archiver. Travaillez encore un peu dessus, archivez la nouvelle version, utilisez cvs diff pour voir les différences, etc.
Quand tout est fini, utilisez tar et gzip pour fabriquer une archive OI-TP1-<Prenom>.<Nom>-<Version>.tar.gz de votre répertoire de travail.
Enfin copiez cette archive dans le répertoire ~nthiery/TP/OI-TP1/.
Deux petites notes:
À rendre pour le 06/10/2003.
Récupérez l’archive suivante, et décompressez-la avec les commandes gunzip et tar:http://lapcs.univ-lyon1.fr/~nthiery/DESS/Notes/Exemples/OI-TP2-Daniel.Tounissoux-Nicolas.Thiery-1.0.tar.gz. Entrez dans le répertoire créé, et essayez les différentes commandes make, make demo, make check, make doc. Le sujet du TP est dans le fichier sujet.pdf.
Correction:
Références:
À rendre pour le 14/10/2003.
Ce TP classe s’appuie sur les utilitaires standard de java, et en particulier java.util.ArrayList. Voir la documentation de référence. Voilà un micro résumé des commandes java qui vous seront utiles:
l=new ArrayList() // crée un nouveau tableau
l.add(1); // rajoute un élément à la fin
l.size(); // la taille du tableau
l.get(0); // le premier élément du tableau
l.set(0,new Integer(3)); // rentre la valeur 3 dans le premier élément du tableau
i=new Integer(3);
j=new Integer(4);
i.compareTo(j); // renvoie un nombre négatif
j.compareTo(i); // renvoie un nombre positif
i.compareTo(i); // renvoie 0
Dans la vraie vie, vous aurez régulièrement besoin d’apprendre par vous-même de nouveaux langages de programmation, de nouveaux logiciels. L’objectif de ce TP est de vous entraîner à cela. Vous allez choisir un langage de programmation que vous ne connaissez pas (perl, par exemple), chercher un tutoriel sur le web, et le suivre. Pour le 6 novembre, vous rendrez comme d’habitude une archive .tar.gz contenant les programmes que vous aurez écrit.
Pour la semaine prochaine, répondez aux questions marquées d’une étoile (*) dans le questionnaire.
Première version à rendre pour le mercredi 26 novembre. Version définitive pour le 10 décembre.
L’objectif de ce projet est d’implanter des joueurs automatiques pour le jeu de Hex.
On demande au minimum d’implanter les joueurs suivants:
Pour aller plus loin:
Le squelette du projet, contenant entre autres une interface graphique, est fourni: http://lapcs.univ-lyon1.fr/~nthiery/DESS/Notes/Exemples/OI-Projet-Nicolas.Thiery-1.0.tar.gz
Première version à rendre pour le mercredi 26 novembre, version définitive pour le 10 décembre.
La suite de ce document est composé de questions, groupées par thèmes. Cette liste est susceptible d’évoluer. Beaucoup vous paraîtront au premier abord difficile, voire absconses. Ne vous fiez pas à votre première réaction; en vous documentant, et avec un petit coup de main de temps en temps, vous devriez être capable d’y apporter une réponse personnelle. J’insiste sur personnelle. Selon vos goûts, vos sensibilités, certaines des questions peuvent avoir des réponses différentes, l’important étant que vos réponses soient étayées. Typiquement, chaque réponse devrait prendre quelques lignes et comporter un exemple simple et une ou plusieurs références.
J’encourage très fortement le travail en grand groupe, afin de partager le travail de recherche, de vous entraider, et de débattre les questions. Mais une fois ce travail de fond en commun effectué, l’objectif est que vous apportiez vous-même une réponse personnelle et détaillée à chacune des questions. Vous me rendrez donc un document pour au maximum deux personnes. Techniquement, ce document sera composé d’une archive .tar.gz contenant un (ou plusieurs) fichier(s) HTML. Ne lésinez pas sur les références et les exemples dans vos réponses: ce document est avant tout pour vous; j’espère bien qu’il vous resservira!
Certains concepts ne sont pas évidents! Si vous avez épuisé vos ressources sans trouver suffisamment d’éléments pour étayer votre propre réflexion, je me ferais un plaisir de vous guider. Alors, profitez de ma présence!