Unité IN3S02 - TP4
Enoncé

Durée : 3 h

1- OBJECTIFS


2- TRAVAIL A REALISER

Nota : le travail demandé doit être terminé, en séance ou en hors séance.

2.1- Créer un répertoire de travail


Créer un répertoire IN3S02-tp4 à la racine de votre compte. C'est dans ce répertoire que devront être stockés tous les programmes Java et exercices relevant de ce tp.

2.2- Découvrir l'outil de mise au point (debugger)

 

Lors de la mise au point d'un programme, il est essentiel de pouvoir visualiser les valeurs des variables mises en oeuvre et leur évolution. C'est ce que permet l'outil de mise au point (debugger) intégré dans BlueJ. Cet outil offre les fonctionnalités fondamentales de tout debugger : installation de points d'arrêt, exécution du programme pas à pas (i.e. instruction par instruction), consultation du contenu des variables.

 

2.2.0- Préparer l'environnement de travail

 

Lancer BlueJ et charger le projet debugdemo qui se trouve dans le répertoire .../bluej/examples

Afin de ne pas modifier l'original de ce projet, nous allons travailler sur une copie : enregistrer ce projet dans le répertoire IN3S02-tp4, créé préalablement, sous le nom debugdemo2

2.2.1- Découvrir l'outil de mise au point

 

Le petit projet debugdemo2a pour seul objectif d'aider à présenter les fonctionnalités de l'outil de mise au point. Il n'a pas de sens en lui même.

Editer la classe Demo, en prendre connaissance, et la compiler. Poser un point d'arrêt sur la boucle for de la méthode loop en cliquant dans la colonne de gauche de l'éditeur du texte à hauteur de la ligne for (le point d'arrêt est posé quand apparaît une icône rouge stop à cet endroit). Créer un objet de la classe Demo et appeler la méthode loop avec un paramètre de valeur 10. Dès que le point d'arrêt est atteint, la fenêtre d'édition contenant la ligne courante apparaît, suivie par la fenêtre de mise au point :

  • La fenêtre de mise au point visualise, à droite, les valeurs de toutes les variables consultables depuis l'endroit où se trouve le point d'arrêt : attributs de la classe (aucun dans ce cas), attributs de l'objet courant (name et answer dans ce cas), variables locales de la méthode courante (sum et count dans ce cas et pour l'instant) ; elle visualise aussi, à gauche,  la séquence des appels (un seul appel dans ce cas : celui de la méthode loop de la classe Demo).
  • La fenêtre d'édition indique en vidéo inverse la prochaine instruction à exécuter. L'exécution a donc été arrêtée juste avant l'instruction sur laquelle a été positionné le point d'arrêt.

  • Poursuivre l'exécution en pas à pas en activant le bouton Step de la fenêtre de mise au point : on peut suivre l'avancement de l'exécution instruction par instruction dans la fenêtre d'édition et l'évolution des valeurs des variables dans la fenêtre de mise au point. On peut notamment remarquer l'apparition d'une nouvelle variable locale : le compteur de boucle i, qui est une variable locale à la boucle et qui donc n'avait / n'aura pas d'existence en dehors de la boucle.

    Nota 1. Autres commandes de l'outil de mise au point :

  • La commande StepInto permet d'avancer en pas à pas y compris dans les méthodes appelées. Les commandes Step et StepInto se comportent de la même manière si la ligne courante ne contient pas d'appel de méthode.
  • La commande Continue relance normalement l'exécution du programme
  • La commande Terminate met fin définitivement à l'exécution du programme
  • Nota 2. L'exécution d'un programme peut parfois sembler bien longue, au point que la question de son bon fonctionnement peut se poser. Il est possible à tout instant d'interrompre l'exécution d'un programme en activant automatiquement le debugger. Pour cela, il suffit de : 1) cliquer sur la barre en rotation dans la fenêtre principale de BlueJ (la rotation de cette barre signale que la machine virtuelle Java travaille, c'est-à-dire qu'un programme est en cours d'exécution) ; 2) dans la fenêtre de mise au point qui apparaît, cliquer sur le bouton Halt / Stop.

    2.3- Exercice : projet "weblog-analyzer"

     

    Les serveurs web maintiennent habituellement des fichiers d'historique des accès aux pages web qu'ils supportent. Ces fichiers sont appelés fichiers log. L'analyse de ces fichiers permet d'obtenir des informations utiles comme : quelles sont les pages les plus consultées, quelles sont les périodes de consultation les plus chargées, ... . Le projet weblog-analyzer sur lequel nous allons travailler est un programme qui réalise une analyse élémentaire d'un fichier log simplifié. C'est dans ce cadre que nous créerons et gérerons des tableaux.

     

    2.3.0- Préparer l'environnement de travail

     

    Créer un répertoire weblog-analyzer dans le répertoire temporaire C:/Temp/IN3S02-tp4.

    Hors BlueJ, charger le fichier weblog-analyzer.zip lié à cet énoncé (cliquer sur le lien), et l'enregistrer sous ce nom dans le répertoire IN3S02-tp4/weblog-analyzer. Ouvrir le fichier IN3S02-tp4/weblog-analyzer/weblog-analyzer.zip. Il contient quatre fichiers sources java ( LogAnalyzer.java, LogEntry.java, LogfileReader.java et LogLineTokenizer.java) et un fichier texte (weblog.txt). Les en extraire (bouton Extract) et les enregistrer dans le répertoire IN3S02-tp4/weblog-analyzer

    Dans BlueJ, fermer s'il y a lieu le projet debugdemo2 de l'exercice précédent, et ouvrir, en tant que projet non Bluej, le répertoire IN3S02-tp4/weblog-analyzer (et non IN3S02-tp4/weblog-analyzer/weblog-analyzer.zip !!) [ menu Project, choix Open Non BlueJ ... , en veillant à bien rester à l'extérieur du répertoire weblog-analyzer et à ne pas y descendre].

     

    2.3.1- Prendre connaissance du projet weblog-analyzer

     

    Le projet weblog-analyzer est composé de 4 classes. Nous nous intéresserons essentiellement à la classe LogAnalyzer. Ce programme réalise une analyse temporelle d'un petit fichier log.

    Le fichier log analysé par ce projet est un fichier log simplifié. Nommé weblog.txt, il se trouve maintenant dans le répertoire IN3S02-tp4/weblog-analyzer2.Il contient une suite de dates au format "année mois jour heure minute", chaque ligne étant censée correspondre à un accès à une page web du serveur. Visualiser le contenu de ce fichier et en prendre connaissance.

    Editer et prendre connaissance de la classe LogAnalyzer. La méthode analyzeHourlyData compte combien d'accès ont été réalisés dans chaque tranche horaire pendant toute la durée couverte par le log. Le résultat est mémorisé dans le tableau hourCounts.

    Créer un objet de la classe LogAnalyzer et exécuter la méthode analyzeHourlyData puis la méthode printHourlyCounts. Quels sont les moments les plus chargés et les moins chargés d'une journée ?

    2.3.2- Etendre la classe LogAnalyzer

     

    On se propose d'ajouter à la classe LogAnalyzer de nouvelles méthodes d'analyse. Aucune de ces méthodes ne devra comporter d'instruction d'affichage. 

  • Ecrire et tester une fonction numberOfAccesses qui, en sommant les éléments du tableau hourCounts, renvoie le nombre d'accès enregistrés dans le fichier log.
  • Ecrire une fonction busiestHour qui, en analysant le tableau hourCounts, renvoie la première tranche horaire la plus chargée.
  • Ecrire une fonction quiestHour qui, en analysant le tableau hourCounts, renvoie la première tranche horaire non vide la moins chargée. Vérifier notamment le bon fonctionnement de cette méthode dans le cas d'un tableau  hourCounts contenant plusieurs zéros, en particulier au début.
  • Ecrire une fonction entière busiestTwoHours qui, en analysant le tableau hourCounts, détermine la première période de 2 heures la plus chargée.
  • Ecrire une fonction rankHours qui, en analysant le tableau hourCounts, renvoie un tableau des tranches horaires classées par valeurs décroissantes de compteur.
  • - Contraintes : un seul tableau mono-dimensionnel temporaire est nécessaire ; toutes les autres méthodes doivent continuer à fonctionner normalement après exécution de rankHours (essayer par exemple printHourlyCounts).
    - Exemple :

       Supposons que le tableau hourCounts suivant :

    Elément    45    12     8    72    45    3    75    80    10    12    33    80
    Indice         0      1      2     3      4     5     6      7      8      9     10    11

       Le résultat de rankHours serait le tableau suivant :

    Elément     7    11    6    3    0     4    10    1    9    8     2      5
    Indice         0     1     2    3    4     5     6     7    8    9   10    11

  • rankHours2 similaire à celle de la fonction précédente et respectant les mêmes contraintes, mais dont le résultat soit un tableau d'associations heure-compte.
  • - Définir dans le projet weblog-analyzer une nouvelle classe de nom HourCount, comportant deux champs : un entier hour et un entier count, de constructeur HourCount(int hour, int count), et offrant deux méthodes d'accès : getHour() et getCount().
    - Dans la classe LogAnalyzer, définir une deuxième fonction rankHours2 qui, en analysant le tableau hourCounts, renvoie un tableau de type HourCount[] des tranches horaires classées par valeurs décroissantes de compteur.

     

    2.3.3- Terminer l'exercice

     

    Sauvegarder le projet weblog-analyzer et le fermer.

     

    2.4- Terminer la séance

     

    Si pas fait antérieurement, sauvegarder les projets ouverts, puis fermer BlueJ.

    Si besoin, envoyer par mél à votre binôme, en fichiers attachés, tous les programmes *.java développés sous IN3S02-tp4.

    Se déloger.