\documentclass[a4paper, 8pt]{article}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage[francais, english]{babel}
\usepackage[a4paper]{geometry}
\geometry{hmargin=2.5cm,vmargin=1.5cm}
\usepackage{amssymb, amsmath,amsfonts,amsthm,mathrsfs}
\usepackage{hyperref}
\sloppy

\title{\vspace{-2cm}Rapport du projet de \emph{Web Data Management}}
\author{Shendan Jin \& Olivier Marty}
\date\today

\begin{document}

\maketitle

\section{Présentation du projet}

Le but de ce projet est d'utiliser différentes sources d'informations sur
internet qui concernent l'état d'un moyen de transport (lignes de
métro, de train, stations vélo vide ou pleine, ou encore un bouchon sur
l'autoroute (non implémenté)) afin de prévenir l'utilisateur lorsque celui-ci va
les utiliser.

Pour cela on se connecte à son agenda (Google Calendar), et on analyse ses emails
(Gmail) pour prévoir ses déplacements, mais d'autres sources pourrait être
ajoutées, de façon modulaire.
Pour chaque événement, on géolocalise l'adresse avec l'API d'OpenStreetMap,
puis on cherche les moyens de transport utile pour ce rendre à ces coordonnées~:
lignes passant par une station proche, stations de vélos proches...
En cas de problème sur l'un de ces moyens de transport, l'utilisateur est
notifié par le medium de son choix (email, ou sms via l'API de free mobile).

\section{Description globale}

Le projet est divisé en trois principales composantes :

\subsection{La classe Event}

Cette classe représente un événement auquel l'utilisateur va se rendre.
Elle présente quatre attributs : id, date, location, et description.
Les instances sont produites à partir de deux sources : Google Calendar et
Gmail.

Les seuls mails aboutissant à la détection d'un événement sont ceux de la forme :\\
"Rendez-vous\\
le 22/02/2016 08h45\\
à Université Paris Diderot\\
pour le cours de WDM"


\subsection{La classe Source}

Cette classe représente une information provenant d'internet et qui concerne
l'état d'un moyen de transport.
Chaque instance doit fournir la méthode problem() (renvoie true si le moyen de
transport encontre un problème), et les attributs id (identifiant de la source)
et message (descriptif du problème).

Nous avons implémenté plusieurs sources~: l'état des lignes de la RATP, du
Transilien, et le nombre de vélos et de places libres dans les stations de
jcdecaux\_vls (vélos en libre service disponibles dans de nombreuses villes).

\paragraph{ratp\_trafic} Les données sont récupérées en scrapant l'url
\url{http://ratp.fr/meteo/}.
En effet la ratp ne fournit aucune API publique dynamique (l'API statique a
cependant été utilisée pour obtenir la localisation des stations et les lignes
les traversant).

\paragraph{transilien} Les données sont récupérées en scrapant l'url \url{http://www.transilien.com/info-trafic/temps-reel}.
La SNCF fournit une API pour chercher des itinéraires, ou avoir les prochains
horaires, mais pas, à notre connaissance, pour avoir des informations de trafic.

\paragraph{jcdecaux\_vls} Les données sont récupérées via l'API de jcdecaux\_vls
(voir \url{https://developer.jcdecaux.com/#/opendata/vls}).

\paragraph{} L'analyse des fichiers HTML ou JSON téléchargés est effectuée à
l'aide de la bibliothèque Python
\href{http://www.crummy.com/software/BeautifulSoup/bs4/doc/}{BeautifulSoup4}.
Nous avions en premier lieu écrit des transformateurs en xquery pour formatter
toutes les données dans un schéma commun, mais l'utilisation d'un logiciel
externe (Saxon) rendait chaque requête très lente, d'autant que le résultat
n'était pas un objet natif Python.

\subsection{La boucle principale}

Cette boucle articule les différents modules entre eux.
Elle fonctionne à l'aide d'un tas qui contient des instances de la classe Event
représentant les prochains événements dont le programme a connaissance.
De temps en temps, elle appelle les générateurs d'événements (module event) pour
vérifier si de nouveaux événements sont connus.
Lorsqu'un un événement arrive à échéance (dans l'état actuel du code on vérifie une
demi-heure avant l'échéance), on cherche la localisation de l'événement, puis
une liste d'identifiants de sources qui peuvent être utiles pour ce rendre à cet
événement (lignes passant auprès du lieu, stations vélos proches).
Pour cela elle trie les sources pas distance croissante, prend les deux meilleures
ainsi que celles qui sont à une distance comparable (au plus 100 mètres de plus
que la plus petite distance),
puis ne garde que celles qui sont moins de $2$km.
Le module source récolte alors les informations, et si un problème est soulevé
par l'une des sources, une notification est envoyée.


\section{Fichiers python}

Afin d'éxecuter un programme, il faut lancer la commande
\texttt{python3 fichier.py}.
Il faudra peut-être installer les dépendances python :
\texttt{pip3 install -r requirements.txt}

\paragraph{main.py} C'est le programme principal. Lors du premier lancement,
il demandera l'autorisation de se connecter aux API Google Calendar et Gmail.

\paragraph{demo.py} Lance une démonstration qui ignore les événements mais donne les
notifications à partir d'une adresse. Il faut souvent appuyer sur
\texttt{<enter>}

\paragraph{find.py} Ce fichier fournit une aide
pour trouver les identifiants utilisé en interne pour désigner une source.
Il propose une recherche interactive dans les listes téléchargées depuis les
différentes API.

\paragraph{ratp\_preprocessing.py} Les données statiques fournies par la ratp
n'était pas dans un format qui nous convenait, en plus de peser plus de 500Mo~!
Ce fichier extrait de ces données la liste des stations et les lignes les
traversant, le fichier final ne pesant que 500Ko.
L'url ou l'on peut trouver les données brut est indiqué en
commentaire.\\\\


\small{Note: Après l'oral nous avons changé la démo pour afficher une carte avec un marqueur par
source.}

\end{document}
