rapport.tex 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136
  1. \documentclass[a4paper, 8pt]{article}
  2. \usepackage[utf8]{inputenc}
  3. \usepackage[T1]{fontenc}
  4. \usepackage[francais, english]{babel}
  5. \usepackage[a4paper]{geometry}
  6. \geometry{hmargin=2.5cm,vmargin=1.5cm}
  7. \usepackage{amssymb, amsmath,amsfonts,amsthm,mathrsfs}
  8. \usepackage{hyperref}
  9. \sloppy
  10. \title{\vspace{-2cm}Rapport du projet de \emph{Web Data Management}}
  11. \author{Shendan Jin \& Olivier Marty}
  12. \date\today
  13. \begin{document}
  14. \maketitle
  15. \section{Présentation du projet}
  16. Le but de ce projet est d'utiliser différentes sources d'informations sur
  17. internet qui concernent l'état d'un moyen de transport (lignes de
  18. métro, de train, stations vélo vide ou pleine, ou encore un bouchon sur
  19. l'autoroute (non implémenté)) afin de prévenir l'utilisateur lorsque celui-ci va
  20. les utiliser.
  21. Pour cela on se connecte à son agenda (Google Calendar), et on analyse ses emails
  22. (Gmail) pour prévoir ses déplacements, mais d'autres sources pourrait être
  23. ajoutées, de façon modulaire.
  24. Pour chaque événement, on géolocalise l'adresse avec l'API d'OpenStreetMap,
  25. puis on cherche les moyens de transport utile pour ce rendre à ces coordonnées~:
  26. lignes passant par une station proche, stations de vélos proches...
  27. En cas de problème sur l'un de ces moyens de transport, l'utilisateur est
  28. notifié par le medium de son choix (email, ou sms via l'API de free mobile).
  29. \section{Description globale}
  30. Le projet est divisé en trois principales composantes :
  31. \subsection{La classe Event}
  32. Cette classe représente un événement auquel l'utilisateur va se rendre.
  33. Elle présente quatre attributs : id, date, location, et description.
  34. Les instances sont produites à partir de deux sources : Google Calendar et
  35. Gmail.
  36. Les seuls mails aboutissant à la détection d'un événement sont ceux de la forme :\\
  37. "Rendez-vous\\
  38. le 22/02/2016 08h45\\
  39. à Université Paris Diderot\\
  40. pour le cours de WDM"
  41. \subsection{La classe Source}
  42. Cette classe représente une information provenant d'internet et qui concerne
  43. l'état d'un moyen de transport.
  44. Chaque instance doit fournir la méthode problem() (renvoie true si le moyen de
  45. transport encontre un problème), et les attributs id (identifiant de la source)
  46. et message (descriptif du problème).
  47. Nous avons implémenté plusieurs sources~: l'état des lignes de la RATP, du
  48. Transilien, et le nombre de vélos et de places libres dans les stations de
  49. jcdecaux\_vls (vélos en libre service disponibles dans de nombreuses villes).
  50. \paragraph{ratp\_trafic} Les données sont récupérées en scrapant l'url
  51. \url{http://ratp.fr/meteo/}.
  52. En effet la ratp ne fournit aucune API publique dynamique (l'API statique a
  53. cependant été utilisée pour obtenir la localisation des stations et les lignes
  54. les traversant).
  55. \paragraph{transilien} Les données sont récupérées en scrapant l'url \url{http://www.transilien.com/info-trafic/temps-reel}.
  56. La SNCF fournit une API pour chercher des itinéraires, ou avoir les prochains
  57. horaires, mais pas, à notre connaissance, pour avoir des informations de trafic.
  58. \paragraph{jcdecaux\_vls} Les données sont récupérées via l'API de jcdecaux\_vls
  59. (voir \url{https://developer.jcdecaux.com/#/opendata/vls}).
  60. \paragraph{} L'analyse des fichiers HTML ou JSON téléchargés est effectuée à
  61. l'aide de la bibliothèque Python
  62. \href{http://www.crummy.com/software/BeautifulSoup/bs4/doc/}{BeautifulSoup4}.
  63. Nous avions en premier lieu écrit des transformateurs en xquery pour formatter
  64. toutes les données dans un schéma commun, mais l'utilisation d'un logiciel
  65. externe (Saxon) rendait chaque requête très lente, d'autant que le résultat
  66. n'était pas un objet natif Python.
  67. \subsection{La boucle principale}
  68. Cette boucle articule les différents modules entre eux.
  69. Elle fonctionne à l'aide d'un tas qui contient des instances de la classe Event
  70. représentant les prochains événements dont le programme a connaissance.
  71. De temps en temps, elle appelle les générateurs d'événements (module event) pour
  72. vérifier si de nouveaux événements sont connus.
  73. Lorsqu'un un événement arrive à échéance (dans l'état actuel du code on vérifie une
  74. demi-heure avant l'échéance), on cherche la localisation de l'événement, puis
  75. une liste d'identifiants de sources qui peuvent être utiles pour ce rendre à cet
  76. événement (lignes passant auprès du lieu, stations vélos proches).
  77. Pour cela elle trie les sources pas distance croissante, prend les deux meilleures
  78. ainsi que celles qui sont à une distance comparable (au plus 100 mètres de plus
  79. que la plus petite distance),
  80. puis ne garde que celles qui sont moins de $2$km.
  81. Le module source récolte alors les informations, et si un problème est soulevé
  82. par l'une des sources, une notification est envoyée.
  83. \section{Fichiers python}
  84. Afin d'éxecuter un programme, il faut lancer la commande
  85. \texttt{python3 fichier.py}.
  86. Il faudra peut-être installer les dépendances python :
  87. \texttt{pip3 install -r requirements.txt}
  88. \paragraph{main.py} C'est le programme principal. Lors du premier lancement,
  89. il demandera l'autorisation de se connecter aux API Google Calendar et Gmail.
  90. \paragraph{demo.py} Lance une démonstration qui ignore les événements mais donne les
  91. notifications à partir d'une adresse. Il faut souvent appuyer sur
  92. \texttt{<enter>}
  93. \paragraph{find.py} Ce fichier fournit une aide
  94. pour trouver les identifiants utilisé en interne pour désigner une source.
  95. Il propose une recherche interactive dans les listes téléchargées depuis les
  96. différentes API.
  97. \paragraph{ratp\_preprocessing.py} Les données statiques fournies par la ratp
  98. n'était pas dans un format qui nous convenait, en plus de peser plus de 500Mo~!
  99. Ce fichier extrait de ces données la liste des stations et les lignes les
  100. traversant, le fichier final ne pesant que 500Ko.
  101. L'url ou l'on peut trouver les données brut est indiqué en
  102. commentaire.\\\\
  103. \small{Note: Après l'oral nous avons changé la démo pour afficher une carte avec un marqueur par
  104. source.}
  105. \end{document}