IFT1010 Programmation I

Département d'informatique et de
recherche opérationnelle

Hiver 2002


Accueil

Professeurs et
Démonstrateurs

Horaires et locaux

Notes de cours

Démonstrations
et devoirs

Examens

Liens utiles

Au sujet du
livre de cours

Consultez vos notes

Foire aux questions
(FAQ)

Devoir 2: mini moteur de recherche sur le web

Ce devoir est à faire en équipe de deux.
Les noms et codes d'usagers doivent être indiqués en commentaires dans tous les fichiers remis.

I- Objet du devoir

Votre programme (MonMoteur) doit réaliser un moteur de recherche très simplifié qui obéit au scénario suivant:

L'utilisateur a un besoin d'information qu'il formule par une requète (suite de caractères). Elle ou il a de plus une idée de l'endroit sur le web (page html) où trouver cette information (nous appelons cette page la page frontale).

Votre programme doit analyser la page frontale pour y rechercher la requête, puis afficher le contexte dans lequel la requête apparaît, dans le cas où cette requête apparaît effectivement dans le texte. Éventuellement, votre programme analyse les pages liées à la page frontale pour aller y chercher la requête.

Exemple:

Un utilisateur recherche de l'information sur Java 2 Platform: c'est la requête faite à votre programme. Il a l'idée que cette requête devrait exister sur une des pages web accessibles depuis votre page préféree: http://java.sun.com; cette page consistue la page frontale.

Votre programme va donc analyser la page frontale (et éventuellement les pages web qui y sont référencées) pour y chercher le contexte d'occurrence de la requête.

Note

Dans ce travail, vous devez faire certains traitements sur des pages html accessibles à travers le web. Une classe vous permettant d'accéder facilement à une page disponible sur le web vous est fournie pour simplifier votre travail.

II- Instructions générales

Un certain nombre d'informations sont demandées à ou spécifiées par l'utilisateur; certaines de ces informations sont obligatoires, d'autres sont facultatives et possèdent des valeurs par défaut:
  • la requête [imposée]
  • la page frontale [imposée]
  • le nombre d'occurrences à afficher (au plus) [facultatif, défaut=10] (dans la suite désigné par MAX)
  • la recherche doit-elle être faite en ignorant les différences de casse (majuscule/minuscule)? [facultatif, défaut=oui]
  • nombre maximum de pages analysées [facultatif, défaut=20]
Votre programme doit fonctionner dans les deux modes suivants:
  • Mode interactif: votre programme demande à l'utilisateur en premier lieu sa requête (utilisez la classe Keyboard) pour récupérer la réponse de l'utilisateur, puis demande ensuite une page frontale. Les informations facultatives sont ensuite demandées une à une, la valeur par défaut est affichée et l'utilisateur peut simplement la valider en entrant une chaîne vide: un ou plusieurs espaces puis ENTER.

  • Mode ligne de commande: l'utilisateur spécifie son besoin directement lors du lancement de votre programme. Voici quelques exemples de lancement en mode ligne de commande:
    • java MonMoteur "java simplement" http://www.ensta.fr/java/java_simple.html
      L'utilisateur souhaite les 10 (défaut) premières occurrences (au plus) de la requête à partir du frontal spécifié en analysant au plus 20 pages (défaut) accessibles depuis la page frontale. Il souhaite que la recherche de la requête se fasse indépendamment de la casse (défaut).
    • java MonMoteur "java simplement" http://www.ensta.fr/java/java_simple.html 100 false 1000
      L'utilisateur souhaite les 100 premières occurrences (au plus) de la requête à partir du frontal spécifié en analysant au plus 1000 pages accessibles depuis la page frontale. Il souhaite que la recherche de la requête se fasse verbatim ("java Simplement" n'est pas une occurrence de "java simplement").

Note:

Pour décider si votre programme doit fonctionner en mode interactif ou en mode ligne de commande, vous pouvez par exemple consulter le nombre d'arguments donnés à la ligne de commande. Si ce nombre est nul, alors votre programme fonctionne en mode interactif, s'il est au moins égal à deux, votre programme fonctionne en mode ligne de commande; sinon, votre programme affiche un message d'erreur et explique à l'utilisateur comment utiliser le programme.

III - Instructions spécifiques

Notion de contexte d'occurrence

Nous appelons contexte d'occurrence une fenêtre de texte dans laquelle apparaît la requête. Par exemple, à la requête "java est simple" depuis la page frontale http://www.ensta.fr/java/java_simple.html correspond au moins le contexte suivant (la requête est indiquée en rouge); on a demandé ici un recherche ne dépend pas de la casse.

Le code source en JAVA est simple. Il n'y a plus de preprocesseur, plus de #define, de typedef, plus de recours aux fichiers header, car JAVA permet la définition d'autres classes et de leurs méthodes.

Dans ce projet, le contexte est définit comme la requête plus les 100 caractères (au plus) qui précèdent la requête et les 100 caractères qui suivent (au plus) la requête dans la page.

Ce que votre programme doit afficher:

Lorsqu'une occurrence de la requête est trouvée dans une page, vous devez afficher: 1) son contexte, 2) l'adresse de la page où cette occurrence a été trouvée (ex: http://www.ensta.fr/java/java_simple.html).

Principe de la recherche

Rechercher les occurrences d'une requête doit se faire comme suit:
  1. pageCourante est la page frontale
  2. Aller chercher dans la page courante pageCourante toutes les occurrences (jusqu'à concurrence du nombre maximum d'occurrences spécifié au lancement de la recherche) et les afficher. Prenez note qu'il se peut très bien qu'aucune occurrence de la recherche ne soit dans la page courante.
  3. Si le nombre d'occurrences trouvées est égal à MAX, alors la recherche est terminée. Aller en 6.
  4. Si le nombre maximum de pages à analyser est atteint, la recherche est terminée. Aller en 6.
  5. Sinon, pageCourante est mis au premier lien accessible depuis la page. Aller en 2.
  6. Afficher le nombre total de pages différentes visitées ainsi que le nombre total d'occurrences affichées.

Comment trouver une page accessible depuis une page ?

Il vous faut pour cela rechercher le tag html suivant où la chaine entre guillemets est une page html: <a href="lien vers une page html">

Il est très possible (et cela fait partie de votre travail de le gérer) qu'un lien soit spécifié sur autre chose qu'une page html (vous rechercherez donc les liens se terminant par l'extension .html ou encore .htm. De même, un lien peut très bien être fait sur la même page que celle qui contient le lien (ex: <a href="#label"> qui spécifie d'aller dans la même page à l'étiquette label); dans ce dernier cas, votre programme pourrait rentrer dans une boucle non désirée.

Les éléments jouent contre-vous: il est possible qu'un lien soit exprimé à l'aide d'une adresse html et d'une étiquète (ex: <a href="toto.html#label"> qui indique au navigateur d'aller à l'étiquette label de la page web toto.html.

IV - JAVA et le web

En langage web, URL est un acronyme pour Uniform Resource Locator. Une page web accessible sur le web est une de ces ressources; une image ou votre chanson mp3 préférée sont d'autres exemples de ressources. On vous demande dans ce devoir de vous intéresser uniquement aux ressources: pages html.

Afin de faciliter votre travail, nous vous fournissons une classe URLReader qui permet de manière transparente d'aller lire une URL dont le nom est spécifié. Vous accéder alors au texte de la page html en invoquant la méthode que cette classe vous offre.

La classe URLReader est installée (c'est à dire compilée) dans le répertoire habituel auquel vous avez accès (voir démo 1 :-) et dans lequel se trouvent les classes comme KeyboardGrille que vous avez déjà eu l'occasion d'utiliser. Encore une fois, c'est avec le code que j'ai et non avec une de vos versions modifiées de ces codes que vos programmes seront testés (=> le source de ces classes n'est là que pour faciliter la tâche des personnes qui travaillent depuis chez elles, ce serait une très mauvaise idée de modifier ce code pour les besoins de vos travaux).

Au sujet de la classe URLReader

La classe URLReader vous permet d'aller lire n'importe quel document sur le web dont vous avez l'adresse internet, pour autant que ce document soit un document textuel (les documents html le sont).

Pour utiliser cette classe, il suffit de créer un objet de cette classe en spécifiant l'adresse internet de la page. Votre TP peut aller lire le contenu de n'importe quelle page sur internet à l'aide de cette classe.

En pratique, lorsque vous mettrez au point votre TP, vous préférerez sans doute utiliser des documents dans votre répertoire plutôt que d'aller les chercher sur internet (ce qui prend plus de temps à l'exécution, et nécessite un accès à l´internet). La classe URLReader permet également d'aller lire des documents locaux (voir URLTest.java pour un exemple concret).

Voici un exemple qui utilise la classe URLReader pour aller lire, ligne par ligne le texte d'un document se trouvant sur la page web du cours: URLTest.java

V - Remise

Vous devez remettre électroniquement un ou plusieurs fichiers java. La contrainte (tant pis pour vous si vous ne la suivez pas) est la suivante: le fichier qui contient la méthode principale (main) doit porter le nom de MonMoteur.java.

Tous vos fichiers doivent obligatoirement contenir en commentaire les noms et les codes d'usagers des deux auteurs.
Aucun ajout de coéquipier ne sera accepté après la remise.

La commande pour la remise est: remise ift1010 tp2 MonMoteur.java autres fichiers (éventuellement)

Si vous avez un doute, utilisez la commande de vérification pour vérifier l'état de votre remise (relire le cas échéant la démo 1).

VI - Critères de correction

Tout n'est pas spécifié complétement dans l'énoncé (l'énoncé est déjà beaucoup long que la taille du programme que nous vous demandons d'écrire :-) et nous attendons de vous de faire preuve d'initiative, voire de créativité. Mettez-vous dans la peau de l'utilisateur !

Nous vous conseillons de rédiger un mini rapport qui figurera en entête de votre programme et qui spécifiera tous les points saillants de votre programme.

La notation de ce projet dépendra aussi bien de la qualité de votre code, de son bon découpage (et autres critères habituels) que de la pertinence de la réalisation finale. Notez qu'il vous est tout à fait possible de remettre un programme qui fonctionne bien, mais qui parce qu'il n'est pas bien pensé ne vous donnera pas la note maximale.

VII - Bonus

De nombreuses améliorations de ce projet sont possibles. Voici par exemple quelques suggestions:
  • Récupérez toutes les adresses email disponibles dans les pages visitées. Ceci vous permettrait par exemple de les utiliser pour envoyer automatiquement des messages inutiles (spam) à toutes les personnes concernées (ne le faite pas, merci :-).
  • Plutôt que d'aller chercher uniquement le premier lien sur une page html, vous pouvez explorer systématiquement l'arborescence des pages accessibles depuis le frontal.
  • Votre programme pourrait de même dresser la liste de toutes les pages accessibles depuis le frontal
  • Votre programme pourrait tolérer plus d'options (exemple: taille du contexte à l'affichage).
  • Si vous êtes vraiment créatifs, proposez vos améliorations à google ou d'autres compagnies du même genre...


Dernière mise à jour : Mon Apr 15 08:28:04 EDT 2002
dift1010@iro.umontreal.ca