extracttweets - lirmm
TRANSCRIPT
Rapport de projet
ExtractTweets
Etudiants :Stephen BAROANFlorian MASIPSuzy NZINGOULAAbdoul SY
Encadrants :JĂ©rĂŽme AZĂ
Pascal PONCELETJulien RABATEL
Master 1 Informatique (AIGLE â IMAGINA)
28 Janvier 2015 â 25 Mai 2015
Remerciements
Nous avons eu la chance, dans le cadre de notre formation en master informatique, dâĂȘtre engagĂ©s dansla rĂ©alisation dâun projet enrichissant et instructif.
Nous tenons Ă remercier toutes les personnes impliquĂ©es dans la mise en place de ce projet. En particu-lier, nous souhaitons tĂ©moigner notre reconnaissance Ă nos encadrants : JĂ©rĂŽme AzĂ©, Pascal Poncelet etJulien Rabatel pour la confiance quâils nous ont accordĂ©e pour la rĂ©alisation de ce projet. Nous voudrionsĂ©galement les remercier pour leur aide, leur Ă©coute, ainsi que leur soutien devant toutes les difficultĂ©sauxquelles nous avons pu ĂȘtre confrontĂ©s tout au long de ce projet.
Nous souhaitons Ă©galement remercier Mr Bourreau qui, lors de ses enseignements sur la gestion deprojet nous a inspirĂ© sur lâorganisation Ă mettre en place au sein de notre groupe et avec nos encadrants.
Table des matiĂšres
Remerciements . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51 Cahier des charges . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
1.1 Contexte . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71.2 Généralités . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71.3 Les principaux éléments en jeu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
1.3.1 ScĂ©nario dâutilisation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91.3.2 La base de donnĂ©es . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91.3.3 Lâinterface utilisateur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91.3.4 Le systĂšme de rĂ©cupĂ©ration et de stockage des tweets . . . . . . . . . . . 10
1.4 Les interactions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 101.5 Les contraintes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
2 Rapport technique . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 112.1 Analyse du projet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
2.1.1 Analyse des besoins, analyse du domaine et analyse applicative . . . . . . 112.1.2 Diagramme de cas dâutilisation . . . . . . . . . . . . . . . . . . . . . . . . 112.1.3 Diagramme UML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
2.2 Technologies utilisées . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 132.3 Conception base de données . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 142.4 Conception interface . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 152.5 Mécanisme global du site . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
2.5.1 Structure du site . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 192.5.2 GĂ©nĂ©ration des vues . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 202.5.3 Traitement des requĂȘtes dâun utilisateur . . . . . . . . . . . . . . . . . . . 212.5.4 Traitement des requĂȘtes utilisateurs avec AJAX . . . . . . . . . . . . . . 222.5.5 Communication entre lâinterface Web et lâapplication Java . . . . . . . . 22
2.6 Conception application Java . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 232.6.1 UML Application Java . . . . . . . . . . . . . . . . . . . . . . . . . . . . 242.6.2 ModalitĂ©s dâaccĂšs Ă Twitter . . . . . . . . . . . . . . . . . . . . . . . . . . 242.6.3 Connexion Ă lâAPI Twitter avec twitter4j . . . . . . . . . . . . . . . . . . 252.6.4 RĂ©cupĂ©ration des tweets . . . . . . . . . . . . . . . . . . . . . . . . . . . . 252.6.5 Connexion et insertion dans la base de donnĂ©es . . . . . . . . . . . . . . . 28
2.7 Analyse/Statistiques des tweets . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 292.7.1 Nuages de mots . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 292.7.2 Ăvolution du nombre de tweets en fonction du temps . . . . . . . . . . . 31
2.8 IdĂ©es abandonnĂ©es et amĂ©liorations envisagĂ©es . . . . . . . . . . . . . . . . . . . . 333 Rapport dâactivitĂ© . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
3.1 MĂ©thode de gestion de projet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 343.1.1 PrĂ©sentation de la mĂ©thode . . . . . . . . . . . . . . . . . . . . . . . . . . 343.1.2 Bilan dâutilisation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
3.2 Planification . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 353.2.1 Planning prévu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 353.2.2 Planning réel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35
Conclusion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36Bibliographie/Sitographie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37
3
Table des figures
1 Exemple de Tweet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62 Vue gĂ©nĂ©rale des composants du projet ExtractTweets . . . . . . . . . . . . . . . . . . . . 83 Diagramme de cas dâutilisation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 124 Diagramme UML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 135 Page de lancement dâune recherche . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 156 Page affichage des resultats . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 167 Interface web lancement dâune recherche . . . . . . . . . . . . . . . . . . . . . . . . . . . . 178 Interface Web ajout dâune bounding box . . . . . . . . . . . . . . . . . . . . . . . . . . . . 179 Interface Web partie resultats . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1810 Architecture MVC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1911 UML application java . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2412 Parser un fichier Json en un objet java . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2613 RĂ©cupĂ©ration tweets gĂ©olocalisĂ©s avec lâAPI REST . . . . . . . . . . . . . . . . . . . . . . 2614 RĂ©cupĂ©ration des codes dâaccĂšs Twitter Developers Ă partir de la base de donnĂ©es . . . . . 2715 Authentification au service twitter . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2716 Connexion Ă la base de donnĂ©es . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2817 Apercu dâun nuage de mots . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3018 Apercu des graphes de lâĂ©volution du nombre de tweets en fonction du temps . . . . . . . 32
Table des Annexes
Annexe A - La classe vue (PHP) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38Annexe B - MĂ©canisme de routage de lâaction demandĂ©e par lâutilisateur (PHP) . . . . . . . . . . . 39Annexe C - RĂ©cupĂ©ration des donnĂ©es du formulaire de recherche (Javascript) . . . . . . . . . . . . 40Annexe D - Envoi des donnĂ©es avec AJAX . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41Annexe E - Fonction de validation dâune recherche (PHP) . . . . . . . . . . . . . . . . . . . . . . . 42Annexe F - Fonction dâexĂ©cution de lâapplication Java (PHP) . . . . . . . . . . . . . . . . . . . . . 43Annexe G - Une insertion dans la table des tweets (Java) . . . . . . . . . . . . . . . . . . . . . . . 44Annexe H - Planning prĂ©visionnel - Liste des tĂąches . . . . . . . . . . . . . . . . . . . . . . . . . . 45Annexe I - Planning prĂ©visionnel - Attribution des tĂąches dans le temps . . . . . . . . . . . . . . . 46Annexe J - Planning rĂ©el . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47Annexe K - Manuel dâutilisation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48
4
Introduction
De nos jours, les rĂ©seaux sociaux tiennent une place majeure dans la diffusion de lâactualitĂ©. Ils sontdâailleurs parfois acteurs de cette actualitĂ© de par la mobilisation quâils peuvent amener. Notre utilisationdes rĂ©seaux sociaux a beaucoup changĂ© ces dix derniĂšres annĂ©es. Ils sont en effet devenus omniprĂ©sentsau fil du temps et contribuent au dĂ©veloppement dâune nouvelle forme dâexpression. Expression quisâaccompagne souvent de comportements dĂ©complexĂ©s face Ă lâĂ©cran. Ces interfaces sociales sont devenuesun moyen dâexpression plus libre et plus accessible pour beaucoup de personnes. LâĂ©tude de ces rĂ©seauxpeut donc apporter de nombreuses informations Ă la fois sur la mise en place dâune pensĂ©e collective maisĂ©galement sur des messages plus singuliers et ponctuels.
Lâapplication de ces Ă©tudes peut se retrouver dans divers domaines, notamment dans la dĂ©tection dessuicides ou des situations de harcĂšlement.
Une autre application de lâĂ©tude des flux de statuts sur les rĂ©seaux sociaux est lâĂ©tude de la propagationou lâĂ©tendue des Ă©pidĂ©mies comme la grippe.
Ce genre dâoutils peut Ă©galement servir Ă suivre les tendances politiques selon les rĂ©gions par exemple.
Tous ces exemples montrent bien lâutilitĂ© du dĂ©veloppement dâoutils accessibles pour lâĂ©tude et le suivi desstatuts sur les rĂ©seaux sociaux. Ils peuvent ĂȘtre dâune grande utilitĂ© dans les recherches comportementalesdes sociĂ©tĂ©s.
Twitter 1, de lâanglais « gazouiller », « jaser » est lâun des rĂ©seaux les plus en vogue depuis ces cinqderniĂšres annĂ©es. FondĂ© en 2006 par Jack Dorsey, Evan Williams, Biz Stone et Noah Glass, Twitter peutĂȘtre vu comme le mĂ©lange dâun blog, dâun tchat public, dâun rĂ©seau social et dâune plateforme dâĂ©changede SMS. Le principe est de poster de maniĂšre publique (par dĂ©faut) et asymĂ©trique, des statuts dâunetaille maximum de 140 caractĂšres appelĂ©s des tweets (voir un exemple figure 1). Chaque utilisateur a lapossibilitĂ© de sâabonner aux personnes quâil souhaite suivre, il verra donc sur son mur dâactualitĂ©s tousles postes de ces personnes.
1. https ://twitter.com/
5
Figure 1 â Exemple de Tweet
Twitter est une application trĂšs facile Ă utiliser, il est pris en main mĂȘme par les plus jeunes. Parce biais, il est possible dâacceder Ă la publication de nombreuses donnĂ©es mises Ă disposition du publicpar dĂ©faut. De ce fait, Twitter est une vĂ©ritable source dâinformations qui peut apporter de nouvellesconnaissances sur la sociĂ©tĂ© dans diffĂ©rents domaines dâĂ©tudes.
Une API a Ă©tĂ© mise en place par Twitter, permettant dâinterroger sa base de donnĂ©es, de rĂ©cupĂ©rer desinformations concernant les tweets et de poster des tweets. Deux mĂ©thodes principales sont utilisĂ©es dansce cadre, on parlera de lâAPI REST qui permet de faire des requĂȘtes sur les tweets dĂ©jĂ prĂ©sents dansla base de donnĂ©es, et de lâAPI STREAMING qui permet dâaccĂ©der au flux de tweets en temps rĂ©el demaniĂšre continue.
Notre projet a pour but le dĂ©veloppement dâun outil assistant lâĂ©tude du flux de statuts circulantsur Twitter. Plus prĂ©cisĂ©ment, notre but est la rĂ©alisation dâune plateforme dâextraction de tweets, quipermettra ensuite lâanalyse de ces derniers.
Pour prĂ©senter ce projet, nous dĂ©taillerons dans un premier temps les diffĂ©rents objectifs ainsi queles contraintes liĂ©es Ă la diversitĂ© des outils utilisĂ©s. Dans un second temps, nous dĂ©taillerons lâaspecttechnique de chaque partie de la conception. Puis dans un troisiĂšme temps, nous nous pencherons surlâorganisation mise en place autour du projet.
6
1 Cahier des charges
1.1 Contexte
Le LIRMM (Laboratoire dâInformatique, de Robotique et de MicroĂ©lectronique de Montpellier) futcrĂ©Ă© en 1992, et rĂ©sulte dâun projet commun entre le CNRS et lâUniversitĂ© de Montpellier. A dominanceinformatique, le laboratoire se divise en plusieurs Ă©quipes opĂ©rant dans divers domaines tels que lâoptimi-sation des calculs, des algorithmes, ou encore le gĂ©nie logiciel. Lâune des Ă©quipes du LIRMM, ADVANSE(ADVanced Analytics for data SciencE) sâintĂ©resse en particulier Ă la fouille de donnĂ©es et Ă lâextractionde connaissances, en axant ses recherches autour de la santĂ© et lâenvironnement. Quelques-uns des projetsde lâĂ©quipe concernent notamment les rĂ©seaux sociaux, par exemple les projets Web Report portant surla dĂ©tection des catastrophes naturelles dans les tweets et Polop qui sâintĂ©resse aux Ă©changes de tweetssur les diffĂ©rents partis politiques. Autre exemple, la rĂ©alisation dâun dĂ©monstrateur de suivi du virus dela grippe. Tous ces projets impliquent la rĂ©cupĂ©ration, le suivi et lâanalyse de donnĂ©es massives.
Câest dans ce contexte que sâintĂšgre notre projet permettant lâextraction dâune grande quantitĂ© de donnĂ©esainsi que leur analyse afin de pouvoir les prĂ©senter de façon exploitable. Notre support, le rĂ©seau socialTwitter, est un choix stratĂ©gique car il est trĂšs populaire et rĂ©actif.
Lâutilisation massive de Twitter en fait un vĂ©ritable outil dâĂ©tudes sur les sociĂ©tĂ©s dans divers domaines.En effet, Twitter permet de se tenir informĂ© en temps rĂ©el de ce qui se passe, le service est trĂšs utilisĂ©par les journalistes car chacun peut y raconter ce dont il est tĂ©moin, ces journalistes y rĂ©percutent lesinformations vĂ©rifiĂ©es plus rapidement que sur les mĂ©dias traditionnels. Bien entendu, la prudence et lavĂ©rification des sources sâimposent car il y a aussi des cas de propagations de rumeurs.
Twitter permet de suivre un sujet ou un centre dâintĂ©rĂȘt prĂ©cis, dâĂȘtre tenu informĂ© des derniĂšres nou-veautĂ©s, des derniers articles parus, des projets en cours. . . On peut ainsi rĂ©aliser une veille ciblĂ©e, sur lesproblĂ©matiques diverses, en participant Ă une analyse collective faite par des personnes intĂ©ressĂ©es par lesujet.
Notre projet consiste donc Ă fournir un outil permettant la rĂ©cupĂ©ration et lâanalyse de tweets selondiffĂ©rents critĂšres. Il pourra servir par exemple, Ă lâanalyse des Ă©motions grĂące Ă des outils dĂ©veloppĂ©s auLIRMM. Nous allons explorer les gĂ©nĂ©ralitĂ©s concernant le cĆur du projet ExtractTweet.
1.2 Généralités
Le but de ce projet est de mettre au point une application indĂ©pendante par laquelle il sera possibledâentrer des critĂšres de recherche (exemples : mots-clĂ©s, gĂ©olocalisation etc..) parmi le flux de tweetsdiffusĂ©s en temps rĂ©el, et de visualiser de façon claire et pertinente, les rĂ©sultats de cette recherche. Cetteapplication devra permettre de crĂ©er un compte pour chaque utilisateur avec une base de donnĂ©es et desrecherches propres Ă chacun.
Ce projet peut ĂȘtre dĂ©coupĂ© en deux grandes parties. Une premiĂšre partie concernant la rĂ©cupĂ©ration detweets Ă partir de critĂšres choisis par lâutilisateur, et une seconde partie consistant Ă prĂ©senter les tweetsrĂ©cupĂ©rĂ©s pour en tirer des informations pertinentes et les prĂ©senter de la façon la plus utile possible.
La premiĂšre Ă©tape consistera donc Ă mettre au point une interface permettant Ă lâutilisateur dâentrer lescritĂšres de recherche quâil souhaite.
7
La rĂ©cupĂ©ration des tweets nĂ©cessite une communication avec lâAPI Twitter, ce dialogue sera gĂ©rĂ© parune application mise en place Ă cet effet et codĂ©e en Java. Une fois les tweets rĂ©cupĂ©rĂ©s, il est importantde pouvoir les stocker.
Comme nous le verrons plus loin, la base de données tient un rÎle central car elle coordonne à la fois lescritÚres de recherche, les informations à récupérer et les résultats à renvoyer.
Figure 2 â Vue gĂ©nĂ©rale des composants du projet ExtractTweets
La figure 2 décrit les différents modules mis en place dans ce projet. Nous allons voir que ces modulessont tous inter-connectés et interagissent à plusieurs niveaux.
1.3 Les principaux éléments en jeu
Afin de mieux comprendre le but et lâutilitĂ© de lâapplication dĂ©veloppĂ©e, nous avons Ă©tabli un cas dâuti-lisation concret. Nous reviendrons ensuite sur le rĂŽle jouĂ© par chacun des modules prĂ©sentĂ©s sur la figure2.
8
1.3.1 ScĂ©nario dâutilisation
Un utilisateur souhaite connaĂźtre lâopinion publique Ă propos de Nicolas Sarkozy en France et faire lacomparaison avec les USA. Il dĂ©cide donc de se servir de lâapplication que nous avons dĂ©veloppĂ©e. LapremiĂšre Ă©tape est de sâenregistrer sur le site Twitter Developpers afin dâacquĂ©rir les codes dâaccĂšs requispour lâinterrogation de la base donnĂ©es de Twitter.
Une fois les codes dâaccĂšs acquis, lâutilisateur peut maintenant se crĂ©er un compte sur notre applicationen fournissant un login et un mot de passe. Une fois enregistrĂ© dans notre base de donnĂ©es, lâutilisateurpeut lancer une recherche en choisissant lâAPI REST avec par exemple pour mot-clĂ© Sarkozy et pourgĂ©olocalisation la France. Pour la gĂ©olocalisation, lâutilisateur crĂ©e une âBounding Boxâ (zone dĂ©finissantles rĂ©gions du monde) qui sera enregistrĂ©e sur lâinterface et pourra ĂȘtre rĂ©utilisĂ©e ultĂ©rieurement. Il peutensuite lancer une deuxiĂšme recherche en changeant uniquement la gĂ©olocalisation qui sera cette fois auxUSA.
Par la suite, lâutilisateur se rend sur lâonglet rĂ©sultats pour observer les recherches lancĂ©es. Lâobservationdu nuage de mots le renseigne sur la tendance des avis, il peut ainsi comparer les termes les plus utilisĂ©sconcernant Nicolas Sarkozy et se faire une idĂ©e de sa popularitĂ© au sein des Tweeteurs. Lâobservation desgraphiques peut Ă©galement le renseigner sur lâĂ©volution du nombre de tweets en fonction du temps surce sujet. Il pourra ainsi se rendre compte de lâintĂ©rĂȘt de la population en France comme aux USA, pourNicolas Sarkozy.
Voyons maintenant le rĂŽle de chaque module.
1.3.2 La base de données
La base de donnĂ©es est le pivot central permettant de coordonner les autres Ă©lĂ©ments. En effet, lorsqueles tweets sont rĂ©cupĂ©rĂ©s depuis lâapplication Twitter, ils sont ensuite insĂ©rĂ©s dans la base de donnĂ©es.Dans un second temps lorsque lâon souhaite consulter les rĂ©sultats dâune recherche, ces rĂ©sultats sontextraits de la base de donnĂ©es.
La base de donnĂ©es doit ĂȘtre pensĂ©e de façon Ă pouvoir rĂ©pondre aux exigences suivantes :â elle doit permettre de rĂ©aliser suffisamment de recherches possibles pour couvrir les besoins dâuti-
lisateurs diffĂ©rents. En effet, lâapplication sera utilisĂ©e par diffĂ©rentes Ă©quipes et donc diffĂ©rentsdomaines dâĂ©tudes. Certains travailleront sur les aspects gĂ©olocalisation, dâautres plutĂŽt sur lâĂ©vo-lution de lâutilisation de mots-clĂ©s/hashtags, dâautres encore sur les liens following/followed entreutilisateurs de Twitter, etc
â elle doit permettre le stockage dâun maximum dâinformations car on ne peut pas faire beaucoupdâhypothĂšses a priori sur ce qui sera important pour lâutilisateur
1.3.3 Lâinterface utilisateur
Il sâagit dâune interface Web chargĂ©e de rĂ©cupĂ©rer les choix de lâutilisateur parmi les paramĂštres derecherche Ă remplir. Lâinterface doit avoir un graphisme simple et clair permettant une prise en main ra-pide. Pour la partie rĂ©sultats elle doit permettre dâaccĂ©der rapidement Ă diffĂ©rents types dâinformations,de classements. Ces informations seront exploitĂ©es Ă des fins diverses, il faut donc pouvoir sâadapter Ă chaque type de requĂȘtes. Lâinterface permettra Ă©galement Ă lâutilisateur de crĂ©er son propre compte et degĂ©rer les recherches associĂ©es Ă celui-ci.
9
1.3.4 Le systÚme de récupération et de stockage des tweets
Lâobjectif ici est de trouver une solution permettant de rĂ©cupĂ©rer toutes les donnĂ©es pouvant ĂȘtreextraites des tweets et les insĂ©rer dans la base de donnĂ©es.Pour combler ce besoin, nous avons rĂ©alisĂ© une application Java utilisant la librairie twitter4j que nousdĂ©crirons plus loin. Cette librairie nous permet, grĂące aux codes dâaccĂšs dĂ©livrĂ©s par Twitter, dâaccĂ©derau flux continu de tweets diffusĂ©s sur la toile. Le systĂšme doit donc se charger de filtrer ses rĂ©sultats etdâen tirer les informations Ă stocker dans la base de donnĂ©es.
1.4 Les interactions
Comme le montre la figure n°2 les interactions se font Ă diffĂ©rents niveaux, que lâon peut voir de maniĂšrechronologique dans le cas gĂ©nĂ©ral :
â Interface utilisateur (cĂŽtĂ© critĂšres) - Base de donnĂ©esâ Interface utilisateur (cĂŽtĂ© critĂšres) - SystĂšme de rĂ©cupĂ©ration des tweetsâ SystĂšme de rĂ©cupĂ©ration (application Java) - Twitter)â SystĂšme de rĂ©cupĂ©ration (application Java) - Base de donnĂ©esâ Base de donnĂ©es - Interface utilisateur (cĂŽtĂ© rĂ©sultats)
Lâinterface utilisateur est la premiĂšre vue en jeu lors de lâutilisation de lâapplication. Cette derniĂšre doittransmettre les critĂšres sĂ©lectionnĂ©s au systĂšme de rĂ©cupĂ©ration des tweets. Cette transmission se fait Ă lâaide dâun fichier Ă©crit dans un format particulier et contenant lâensemble des paramĂštres de recherchechoisis par lâutilisateur.
Le systĂšme de rĂ©cupĂ©ration de tweets doit quant Ă lui communiquer avec Twitter afin de pouvoir rĂ©cupĂ©rerles informations demandĂ©es dans le fichier transmit par lâinterface utilisateur. Le systĂšme de rĂ©cupĂ©rationsâoccupe ensuite du stockage des informations dans la base de donnĂ©es.
Enfin, lorsque lâutilisateur veut voir les rĂ©sultats de sa recherche, lâinterface les rĂ©cupĂšre depuis la basede donnĂ©es pour ensuite les prĂ©senter de la façon la plus ergonomique et utile possible.
1.5 Les contraintes
Les contraintes de ce projet rĂ©sident essentiellement dans la multitude des outils utilisĂ©s ce qui aboutitbien souvent Ă des problĂšmes de compatibilitĂ© parfois difficiles Ă gĂ©rer. En effet, chacun des modulesprĂ©sentĂ©s sur la figure n°2 nĂ©cessite lâutilisation de langages et dâoutils diffĂ©rents. Cependant chacun desmodules est interconnectĂ© avec les autres, il a donc fallu Ă plusieurs niveaux gĂ©rer ces interactions.
10
2 Rapport technique
Le rapport technique qui suit vous permettra dâavoir davantage de dĂ©tails quant Ă la conception delâapplication. Vous trouver, en complĂ©ment de cette section, un manuel dâutilisation de lâapplication enannexe K.
2.1 Analyse du projet
2.1.1 Analyse des besoins, analyse du domaine et analyse applicative
Ătant la premiĂšre Ă©tape de rĂ©alisation du projet, lâanalyse des besoins a Ă©tĂ© dĂ©terminante pour la bonnecomprĂ©hension des enjeux du projet, pour notre organisation, et surtout pour la conception du projet.En effet, cette phase nous a permis de poser les bases de notre projet.
Le projet consistait Ă mettre en place une plate-forme dâextraction de tweets servant Ă extraire des tweetsfourni par Twitter et effectuer des statistiques sur les donnĂ©es rĂ©cupĂ©rĂ©es. Ă lâissue de cette analyse, nousavons effectuĂ© le diagramme de cas dâutilisation et le diagramme de classes UML (qui servira Ă mettreen place la base de donnĂ©es).
2.1.2 Diagramme de cas dâutilisation
AprĂšs avoir bien compris le sujet du projet, nous avons entamĂ© sa conception par la mise en place denotre diagramme de cas dâutilisation. Celui-ci est reprĂ©sentĂ© par la figure ci-dessous :
Comme vous pouvez le constater sur ce diagramme, lâacteur principal pour notre application est lâuti-lisateur. En effet, il peut :
â Sâinscrireâ Se connecterâ Ajouter un compte âTwitter Developersâ en prĂ©cisant les codes dâaccĂšs qui serviront pour effectuer
les diffĂ©rentes recherchesâ Ajouter un compte âTwitter Developersâ en prĂ©cisant les codes dâaccĂšs qui serviront pour effectuer
les diffĂ©rentes recherchesâ Effectuer des recherches Ă©tant connectĂ© en prĂ©cisant les mots clĂ©s, hashtag et/ou autres critĂšres,
lâAPI de recherche ; câest-Ă -dire lâAPI Twitter qui servira Ă la recherche (REST ou STREAMING),le compte « Twitter Developers » et Ă©ventuellement prĂ©ciser le nombre maximum de tweets et/oula plage horaire des tweets pour la recherche
â Consulter les rĂ©sultats des recherches quâil a effectuĂ©es et sâil le souhaite, afficher la positiongĂ©ographique des tweets qui sont gĂ©olocalisĂ©s.
Les diffĂ©rents types de recherches sont : la recherche de tweets gĂ©olocalisĂ©s et la recherche de tweetsdâun utilisateur (Ă©ventuellement des tweets dâun utilisateur rĂ©pondant Ă un autre).
11
Figure 3 â Diagramme de cas dâutilisation
2.1.3 Diagramme UML
à la suite de quelques réunions entre les membres du groupe et les encadrants, nous avons établi undiagramme de classe UML qui a évolué au cours du développement du projet. Le diagramme final seprésente comme suit :
Ce diagramme contient :â Une classe UserApp qui contient les informations sur lâutilisateurâ Une classe InfoUserApp qui contient les informations sur les comptes âTwitter Developersâ que
lâutilisateur a ajoutĂ©â Une classe SearchParameters qui contient les critĂšres de rechercheâ Les classes Keyword et Hashtag qui sont liĂ©es Ă la classe SearchParameters car ce sont des
critĂšres de recherche et qui contiennent respectivement les mots clĂ©s et les âhashtagsâ. Ces classesont Ă©tĂ© mises en place afin dâĂ©viter les duplications. En effet plusieurs recherches peuvent ĂȘtrelancĂ©es avec un mĂȘme mot clĂ©/hashtag (qui sera donc liĂ© Ă chacune des ces recherches Ă traversson id)
â Une classe BoundingBox qui contient les informations nĂ©cessaires Ă la recherche de tweets gĂ©o-localisĂ©s
â Une classe Tweet qui contient les informations nĂ©cessaires dâun tweetâ Une classe UserTweet qui est liĂ©e Ă la classe Tweet car elle contient les informations sur lâutili-
sateur ayant postĂ© le tweetâ Une classe Place qui est aussi liĂ©e Ă la classe Tweet. Elle contient les informations de gĂ©olocalisation
du tweet
12
Figure 4 â Diagramme UML
2.2 Technologies utilisées
Pour la rĂ©alisation du projet, nous avons dĂ©cidĂ© avec les conseils de nos encadrants dâutiliser les diffĂ©rentsoutils suivants :
Interface Web
â HTML5 : Le HTML5 est le langage utilisĂ© pour la reprĂ©sentation des pages Web. Le HTML5comprend de nouvelles balises et de nouveaux attributs pour les pages Web et ouvre de nouvellespossibilitĂ©s de dĂ©veloppement pour les sites mobiles.
â CSS3 : Le CSS3 est utilisĂ© pour la mise en forme des pages HTML.â Bootstrap : Pour la rĂ©alisation de lâinterface utilisateur, nous avons utilisĂ© ce framework CSS
permettant lâutilisation de classes prĂ©dĂ©finies, utilisant nativement JQuery pour crĂ©er par exempledes menus animĂ©s. Cet outil nous a Ă©tĂ© dâune grande aide pour une mise en forme propre et rapideĂ rĂ©aliser.
â PHP : Du cĂŽtĂ© de lâinterface, pour gĂ©rer la connexion et lâenvoi des requĂȘtes SQL Ă la base dedonnĂ©es, nous avons utilisĂ© lâextension Pg (PostgreSql) de PHP.
â JavaScript/JQuery : Pour adapter notre interface dynamiquement selon les choix de lâutilisateurnous avons utilisĂ© la bibliothĂšque JQuery, nous permettant dâaccĂ©der Ă tous les objets du DOM dela page et nous permettant de les manipuler (utilisation autorisĂ©e ou non, adaptation du contenu).
â AJAX : Afin de rester dans notre optique dâune interface dynamique, nous avons utilisĂ© la mĂ©thodeAjax de Javascript (Ă partir de JQuery) qui permet une communication de maniĂšre asynchroneentre le serveur et la page sans avoir Ă la recharger.
â Xampp : Ce logiciel dâassistance au dĂ©veloppement de site Web nous permet de tester notre siteWeb contenant du code PHP sans utiliser un serveur distant.
Base de données
â PgAdmin : Câest la plateforme dâadministration et de dĂ©veloppement libre la plus populaire etla plus riche pour PostgreSQL. Elle nous permet de gĂ©rer notre base de donnĂ©es.
13
Application Récupération de tweets
â Java : Pour gĂ©rer la rĂ©cupĂ©ration des tweets et les diffĂ©rentes insertions dans la base de donnĂ©es.
2.3 Conception base de données
Nous avions dĂ©cidĂ© dâutiliser MySQL comme systĂšme de gestion de base de donnĂ©es mais suite Ă quelques contraintes, nous nous sommes redirigĂ©s vers PostgreSQL qui est un systĂšme de gestion de basede donnĂ©es relationnelle et objet (SGBDRO).
Pour la création de la base de données, nous nous sommes basés sur le diagramme de classes UML. Cequi donne un modÚle relationnel qui se présente comme suit :
â UserApp(id_ut, first_name, last_name, login, password, date_of_registration,language)â InfoUserApp(id_iua, consumer_key, consumer_secret, access_token, acces_token_secret, ac-
count_name)â SearchParameters(id_sp, search_title, hour_min, hour_max, search_date, nb_retweet_min,
nb_retweet_max, nb_tweet,user_list, in_reply_to, all_info)â Keyword(id_kw, language, word)â Hashtag(id_ht, hashtag)â BoundingBox(id_bb, title, longitude1, latitude1, longitude2, latitude2, radius, unit, center_longitude,
center_latitude)â Tweet(id_tweet, date_tweet,current_user_retweeted_id, favorite_count, longitude, latitude,
in_reply_to_status_id, in_reply_to_user_id, language, retweeted_count, text,is_retweet, is_retweeted,is_retweeted_by_me, is_truncated, all_info, scope, id_place,user_id)
â Place(id_place, bounding_box_coordinates, geometry_coordinates, bounding_box_type, geo-metry_type, country, fullname, country_code, name, place_type, street_adress, url)
â UserTweet(id_user, created_at,description, favorites_count, followers_count, friend_count, lis-ted_count, location, name, screen_name, is_geo_enabled, is_veridied)
â Location(sp_id, bb_id)â Contain(sp_id, kw_id) : cette relation associe les mots clĂ©s aux recherchesâ Contain1(sp_id, ht_id) : cette relation associe les hashtags aux recherches. Elle ressemble Ă la
relation prĂ©cĂ©dente (dâoĂč le nom Contain1).â Search(tweet_id, sp_id)â Search1(iua_id, ut_id, sp_id,process) : cette relation permet de spĂ©cifier quâun utilisateur ef-
fectue une recherche avec son compte et le compte «Twitter Developers » (dâoĂč le nom Search1).Lâattribut âprocessâ contient le pid du processus de lâapplication java associĂ© Ă une recherche.
Ce modÚle relationnel a permis de créer les différentes tables de la base de données qui serviront au bonfonctionnement des différentes branches du projet.
14
2.4 Conception interface
Pour dĂ©buter la conception de lâinterface nous avons dâabord rĂ©alisĂ© des maquettes de chaque page Ă lâaide du logiciel de modĂ©lisation balsamiq 2. Plusieurs maquettes ont Ă©tĂ© proposĂ©es, aprĂšs nĂ©gociationsavec nos encadrant nous avons dĂ©cidĂ© de conserver les modĂšles prĂ©sentĂ©s ci-dessous.
Les principales pages de lâapplication Web sont :
â la page de lancement dâune recherche (cf. figure 5)
Figure 5 â Page de lancement dâune recherche
2. https ://balsamiq.com/
15
Cette page permettra Ă lâutilisateur de rentrer les critĂšres de son choix, une fois la sĂ©lection faite, envalidant, une recherche est lancĂ©e et ainsi enregistrĂ©e dans la base de donnĂ©es.
â la page de consultation des rĂ©sultats (cf. figure 6)
Figure 6 â Page affichage des resultats
Cette page doit comprendre lâaffichage de toutes les recherches lancĂ©es par lâutilisateur ainsi quâunevisualisation des rĂ©sultats (tweets) et des outils permettant dâanalyser les informations liĂ©es Ă leur contenupar exemple.
Lâobjectif principal pour chaque page Ă©tait de centraliser toutes les informations pour avoir un aperçuglobal et pour pouvoir par exemple, pour la page rĂ©sultats, analyser les diffĂ©rentes donnĂ©es et les comparerentre elles.
Avec lâutilisation du framework Bootstrap croisĂ©e avec JQuery, il a Ă©tĂ© possible dâintĂ©grer de nombreusesfonctionnalitĂ©s aussi pratiques quâesthĂ©tiques. Pour ce qui est de la page de lancement dâune recherche,de nombreuses modifications ont Ă©tĂ© effectuĂ©es au fur et Ă mesure de lâavancement du projet. En effetcette partie de lâinterface est Ă©troitement liĂ©e avec la base de donnĂ©es et lâapplication Java, plusieurschangements ont donc eu lieu en parallĂšle de lâĂ©volution de ces diffĂ©rents acteurs.
16
Voici la version finale de la partie lancement de recherche :
Figure 7 â Interface web lancement dâune recherche
Parmi ces fonctionnalitĂ©s, lâutilisation de zones prĂ©dĂ©finies (Bounding Box) pour la gĂ©olocalisation anĂ©cessitĂ© une attention particuliĂšre. En effet, nous avons, pour cet outil, fait appel Ă la librairie, dĂ©velop-pĂ©e par Google, utilisant GoogleMap qui permet de pouvoir sĂ©lectionner une zone gĂ©ographique de formerectangulaire ou circulaire sur le globe.
Cette zone est définie par ses coordonnées latitudinales et longitudinales, voir figure ci-dessous :
Figure 8 â Interface Web ajout dâune bounding box
17
Pour ce qui est de la partie rĂ©sultats, comme le montre la figure 9, lâinterface sâest complexifiĂ©e du faitde la quantitĂ© dâĂ©lĂ©ments Ă afficher et de lâexploitation des donnĂ©es en sortie. En effet, le but ici est dâavoirun maximum dâinformations avec un minimum de manipulations. Le but Ă©tant que les informations soientpresque toutes visibles du premier coup dâĆil, et pour celles qui ne le sont pas quâelles soient accessiblestrĂšs facilement.
Figure 9 â Interface Web partie resultats
Pour cette partie de lâinterface, la plus grande difficultĂ© fut la gestion de lâespace. Pour cela nous avonsusĂ© de plusieurs astuces. Par exemple, le panneau latĂ©ral est rĂ©tractable et permet de lister lâensemble desrecherches lancĂ©es et leur Ă©tat (en cours ou terminĂ©es). De mĂȘme, la partie centrale contient les tweetsrĂ©cupĂ©rĂ©s qui sont classĂ©s par page que lâon peut faire dĂ©filer Ă notre convenance. Autre exemple, lamise en place dâun nuage de mots permettant de mettre en Ă©vidence les thĂšmes les plus abordĂ©s liĂ©s Ă larecherche sĂ©lectionnĂ©e. Le graphique quant Ă lui donne une information pertinente sur la rĂ©partition destweets dans le temps.
2.5 MĂ©canisme global du site
Nous avons dĂ©cidĂ© dâutiliser le pattern MVC (Model View Controller) pour avoir un code clair et bienstructurĂ©. En effet le MVC a pour rĂŽle principal de sĂ©parer la logique du code en 3 parties distinctes :
â Le modĂšle, cette partie gĂšre les donnĂ©es. Son rĂŽle est dâaller rĂ©cupĂ©rer les informations « brutes» dans la base de donnĂ©es, de les organiser et de les assembler pour quâelles puissent ensuite ĂȘtretraitĂ©es par le contrĂŽleur. On y trouve donc les requĂȘtes SQL.
â La vue, cette partie se concentre sur lâaffichage. Elle ne fait presque aucun calcul et se contentede rĂ©cupĂ©rer des variables pour savoir ce quâelle doit afficher. On y trouve essentiellement du codeHTML mais aussi quelques boucles et conditions PHP trĂšs simples, pour afficher par exemple laliste des recherches dâun utilisateur.
18
â Le contrĂŽleur , cette partie gĂšre la logique du code qui prend des dĂ©cisions. Câest en quelquessortes lâintermĂ©diaire entre le modĂšle et la vue : le contrĂŽleur va demander au modĂšle les donnĂ©es,les analyser, prendre des dĂ©cisions et renvoyer le texte Ă afficher Ă la vue. Le contrĂŽleur contientexclusivement du PHP. Câest notamment lui qui dĂ©termine si le visiteur a le droit de voir la pageou non (gestion des droits dâaccĂšs).
Figure 10 â Architecture MVC
Comme lâillustre ce schĂ©ma (figure 10), lâutilisateur sâadresse au contrĂŽleur du site. Le contrĂŽleur vainterroger le modĂšle qui se chargera de lui renvoyer les informations adĂ©quates. Le contrĂŽleur retourneensuite Ă la vue les informations demandĂ©es par lâutilisateur.
Nous avons Ă©galement dĂ©cidĂ© dâutiliser la programmation orientĂ©e objet en PHP pour tirer parti desavantages quâelle nous offre tels que lâencapsulation, lâhĂ©ritage . . . Cela permettra lors dâune Ă©volutionfuture de notre site une meilleure gestion du code. En effet, si des fonctionnalitĂ©s doivent ĂȘtre ajoutĂ©es,il suffira de crĂ©er de nouvelles classes qui sâappuieront sur les services communs de classes dĂ©jĂ prĂ©sentes.
Nous avons donc combiné Architecture MVC et Programmation Objet lors de ce projet.
2.5.1 Structure du site
Le dossier racine du site sera composĂ© de plusieurs dossiers :â Un dossier Models qui comportera tous les fichiers PHP du ou des modĂšle(s) :
â Model.php, qui est une classe abstraite, elle possĂšde lâensemble des mĂ©thodes permettant laconnexion Ă la base de donnĂ©es, les mĂ©thodes permettant de prĂ©parer et dâexĂ©cuter des requĂȘtes.
â Search.php extends Model.php possĂšde lâensemble des requĂȘtes utiles pour rĂ©cupĂ©rer, afficher,modifier et insĂ©rer des recherches.
â BoundingBox.php extends Models.php possĂšde lâensemble des requĂȘtes utiles pour rĂ©cupĂ©rer,afficher, modifier et insĂ©rer des Bounding Box.
â Tweet.php extends Models.php possĂšde lâensemble des requĂȘtes utiles pour recuperer les in-formations sur un tweet.
19
â InfoUserApp.php possĂšde lâensemble des requĂȘtes utiles pour rĂ©cupĂ©rer, afficher, modifier etinsĂ©rer des informations sur les comptes «Twitter Developers» des utilisateurs.
â UserApp.php possĂšde lâensemble des requĂȘtes utiles pour rĂ©cupĂ©rer, afficher, modifier et in-sĂ©rer des comptes utilisateur pour lâinterface Web.
â Un dossier Controlers pour les fichiers PHP destinĂ©s aux contrĂŽleurs :
â Controler.php qui est une classe abstraite, elle permettra de dĂ©marrer une session php(session_start()), elle possĂšde un attribut qui sera la vue, ainsi quâune mĂ©thode permettant lagĂ©nĂ©ration dâerreur.
â ControlerUser.php, extends Controler.php, possĂšde lâensemble des mĂ©thodes utiles pourlâinscription, la connexion et dĂ©connexion dâun utilisateur, Ă©galement pour crĂ©er, afficher etrĂ©cupĂ©rer des recherches dĂ©sirĂ©es par un utilisateur. Ces mĂ©thodes interagissent avec le Modelpour rĂ©cupĂ©rer les donnĂ©es voulues et ensuite les envoyer Ă la vue de lâutilisateur.
â Un dossier Views pour lâensemble des vues du site :
â gabarit.php : Regroupe lâensemble des Ă©lĂ©ments commun Ă toutes les pagesâ Vue.php : La classe vueâ VueHeader.php : lâentĂȘte du site.â VueResults.php : la vue qui affiche les rĂ©sultats des recherches.â VueRecherche : la vue permettant de crĂ©er des recherches.â VueInscription.php : la vue pour lâinscription dâun utilisateur.
â Un dossier Public contenant les fichiers tels que les feuilles de style CSS, les scripts JavaScripts,les bibliothĂšques.
â Un dossier SSAFJavaAppli qui contiendra le fichier exĂ©cutable (jar) de lâapplication Java.
â Un dossier Admin2015 qui contiendra les logs de lâapplication Java.
â Un fichier config.PHP qui contiendra toutes nos variables globales.
2.5.2 Génération des vues
La gĂ©nĂ©ration des vues se fait grĂące Ă une factorisation du contenu global des pages. Nous avons ungabarit qui centralise les Ă©lĂ©ments dâaffichage communs aux diffĂ©rentes pages, et des variables PHP pourinsĂ©rer des Ă©lĂ©ments spĂ©cifiques tel que le titre de la page par exemple.
Le constructeur de Vue reçoit comme paramĂštre le fichier Vue Ă utiliser. La mĂ©thode genererFichier()encapsule lâutilisation de require et permet en outre de vĂ©rifier lâexistence du fichier vue Ă afficher. CettemĂ©thode utilise la fonction extract afin que la vue puisse accĂ©der aux variables PHP requises, ces variablessont rassemblĂ©es dans le tableau associatif $donnees (cf. annexe A).
20
La mĂ©thode generer() a pour rĂŽle principal de gĂ©nĂ©rer la partie spĂ©cifique de la vue afin de dĂ©finir parexemple son titre (attribut $titre) , son contenu ($contenu). Ce mĂ©canisme permet donc dâinitialiser legabarit en fonction de lâaction demandĂ©e par lâutilisateur.
2.5.3 Traitement des requĂȘtes dâun utilisateur
Toute personne entrant pour la premiĂšre fois sur notre site passe par lâindex PHP qui se situe Ă la racinede notre site. Notre index PHP redirige lâutilisateur vers lâaccueil grĂące Ă lâappel dâune mĂ©thode du Contro-leurUser « afficherAccueil () » header(âlocation : Controlers/ControleurUser.php ?action=afficherAccueilâ) ;
Comment ce contrĂŽleur se charge-t-il de rĂ©cupĂ©rer lâaction demandĂ©e par lâutilisateur prĂ©sent sur le site ?
Lâaction est envoyĂ©e dans lâURL par la mĂ©thode GET, le tableau $_GET est analysĂ© dans notre contrĂŽ-leur (user). Si $_GET[âactionâ] est bien dĂ©fini, le contrĂŽleur est instanciĂ©. Il reste maintenant Ă vĂ©rifierque lâaction demandĂ©e existe dans les mĂ©thodes du contrĂŽleur, si elle existe, elle est alors appelĂ©e vianotre instance de contrĂŽleur.
Il arrive dâavoir besoin en plus de lâaction, dâun identifiant pouvant reprĂ©senter une recherche ou unutilisateur. Il Ă©tait donc prĂ©fĂ©rable de rĂ©cupĂ©rer cette donnĂ©e via la mĂ©thode GET et de lancer lâaction(la mĂ©thode) dans notre contrĂŽleur avec, comme paramĂštre, la donnĂ©e envoyĂ©e par GET, comme le montrele fragment de code suivant (cf. annexe B).
21
2.5.4 Traitement des requĂȘtes utilisateurs avec AJAX
Pour gérer la communication avec la base de données en AJAX nous avons créé dans notre contrÎleur,les méthodes permettant de récupérer les informations nécessaires aux différentes pages. Ces méthodessont ensuite appelées avec des méthodes javascripts associées.
Pour rĂ©cupĂ©rer les diffĂ©rents critĂšres de recherche et les envoyer Ă la mĂ©thode PHP qui sâoccupe du trai-tement, nous avons dĂ©veloppĂ© deux fonctions javascript :
â une fonction permettant de rĂ©cupĂ©rer les valeurs entrĂ©es dans le formulaire (cf. annexe C)
Les valeurs de chaque champ sont rĂ©cupĂ©rĂ©es en y accĂ©dant grĂące au constructeur dâobjet JQuery$(id html de lâobjet). Une fois lâobjet rĂ©cupĂ©rĂ© on applique dessus la fonction permettant de rĂ©cu-pĂ©rer le contenu $(id html de lâobjet).val().
â une fonction utilisant AJAX pour la communication au serveur PHP (cf. annexe D)
Cette fonction utilise la premiÚre pour récupérer les valeurs et communique le tableau résultantainsi que le titre de la recherche à la méthode PHP traitant les données.
La réponse retournée par la méthode PHP est ensuite récupérée pour vérifier si la recherche a bien étécréé ou non.
2.5.5 Communication entre lâinterface Web et lâapplication Java
Nous avons dĂ» trouver une solution pour transmettre les paramĂštres de recherche Ă lâapplication Java,nous avons donc dĂ©cidĂ© que la communication entre lâinterface Web et lâapplication java se fera grĂące Ă un fichier JSON qui stockera les paramĂštres dâune recherche dâun utilisateur.
Le choix dâun fichier JSON a Ă©tĂ© le plus judicieux car il sert Ă faire communiquer des applications dans unenvironnement hĂ©tĂ©rogĂšne. Il est frĂ©quemment utilisĂ© comme langage de transport de donnĂ©es par AJAXet les services Web. Il permet de reprĂ©senter de lâinformation structurĂ©e.
Lâensemble des critĂšres de recherches Ă©tant prĂ©alablement traitĂ©s et formatĂ©s par le javascript , il estensuite rĂ©ceptionnĂ© par le controlerUser qui se charge dâĂ©crire ces donnĂ©es dans un fichier JSON (cf.annexe E), le fichier a pour nom le titre de la recherche prĂ©fixĂ© par le pseudo de lâutilisateur et suffixĂ© delâextension .JSON. exemple â login_search1.jsonâ.
Une fois le fichier crĂ©Ă©, lâapplication Java est lancĂ©e via une fonction qui prend en paramĂštre la ligne decommande de lancement de lâapplication Java suivie du nom du fichier (cf. annexe F).
Il est important de prĂ©ciser quâil nous a fallu lancer lâapplication en mode non bloquant, câest-Ă -dire nepas attendre la fin de lâapplication pour pouvoir continuer lâexĂ©cution du code PHP et Javascript. Eneffet lors dâune recherche Streaming, la recherche peut sâĂ©tendre sur plusieurs jours, il est donc importantde lancer lâapplication sans attendre la fin de son exĂ©cution.
Le fichier JSON sert donc de relais entre lâinterface et lâapplication Java. Pour lâĂ©tape suivante câestdonc lâapplication Java qui se charge de faire le lien avec Twitter.
22
2.6 Conception application Java
Lâapplication Java a pour but de rĂ©cupĂ©rer Ă la fois les tweets mais Ă©galement les informations concer-nant les tweeteurs (personnes qui postent les tweets), la gĂ©olocalisation etc. Cependant lorsque les tweetssont rĂ©cupĂ©rĂ©s, ils doivent ĂȘtre âdissĂ©quĂ©sâ afin de pouvoir en tirer les informations attendues. En effet,nous avons vu plus haut que la table tweet de la base de donnĂ©es contient de nombreux attributs que nousdevons extraire des tweets. Par exemple, la date du tweet, sa langue, ou encore le nombre de retweets.
23
2.6.1 UML Application Java
La figure suivante prĂ©sente la structure globale de lâapplication que nous avons implĂ©mentĂ©e :
Figure 11 â UML application java
2.6.2 ModalitĂ©s dâaccĂšs Ă Twitter
Lâapplication Java que nous avons mise en place a pour but de rĂ©cupĂ©rer des tweets selon des critĂšresdonnĂ©s et dâinsĂ©rer ces tweets dans une base de donnĂ©es afin de pouvoir les rĂ©utiliser. Pour avoir accĂšsaux donnĂ©es de Twitter, il faut impĂ©rativement avoir un compte Twitter et enregistrer une applicationsur le site https ://apps.twitter.com/.
24
Une fois lâapplication enregistrĂ©e, quatre codes dâaccĂšs sont fournis :
â Consumer Keyâ Consumer Secretâ Access Tokenâ Access Token Secret
Ces codes dâaccĂšs permettent de pouvoir envoyer des requĂȘtes sur le flux de tweets circulant via uneapplication Twitter et dâavoir des rĂ©sultats conformes Ă la requĂȘte demandĂ©e.
Il faut maintenant trouver un moyen de mettre en place ces requĂȘtes et les envoyer vers notre application.Pour cela, nous avons utilisĂ© la librairie twitter4j.
2.6.3 Connexion Ă lâAPI Twitter avec twitter4j
Différentes API sont fournies et permettent de réaliser des projets, des applications ainsi que des sitesWeb interagissant avec le site Twitter.
Dans le cadre de notre projet, nous avons utilisĂ© :â LâAPI REST : qui fournit des rĂ©sultats pertinents aux requĂȘtes des utilisateurs Ă partir dâun cor-
pus restreint de tweets rĂ©cents. Les rĂ©sultats dâune requĂȘte sont fournis instantanĂ©ment et peuventcontenir des tweets dont la date de publication peut ĂȘtre antĂ©rieure (jusquâĂ une semaine) Ă ladate du lancement de la recherche.
â LâAPI STREAMING : qui permet de rĂ©cupĂ©rer les tweets correspondant Ă une requĂȘte entemps rĂ©el (au moment oĂč ils sont publiĂ©s), de suivre les tweets dâun utilisateur etc. Les rĂ©sultatsdâune requĂȘte ne contiennent que des tweets publiĂ©s Ă partir du lancement de cette requĂȘte et tantque la requĂȘte nâest pas stoppĂ©e, des tweets sont fournis.
Il existe pour la plupart des langages de programmation, des librairies telles que twitter4j en Java (quenous avons utilisĂ©e) ou twitcurl en C++, permettant dâutiliser ces diffĂ©rentes API.
Twitter4j est une bibliothĂšque Java qui permet facilement dâintĂ©grer le service Twitter Ă une applicationJava.
2.6.4 Récupération des tweets
La rĂ©cupĂ©ration des tweets a Ă©tĂ© gĂ©rĂ©e en deux parties distinctes :â La premiĂšre partie consiste Ă rĂ©cupĂ©rer les diffĂ©rents critĂšres de recherche Ă travers un fichier au
format JSON crĂ©e Ă partir de lâinterface. En effet ce fichier est parcouru grĂące Ă la librairie Json-simple disponible sur le site https ://code.google.com/p/json-simple/. Le code suivant (cf. figure12) permet de transformer le fichier JSON en un objet Java de type âJSONObjectâ qui facilite larĂ©cupĂ©ration des diffĂ©rentes valeurs.
25
Figure 12 â Parser un fichier Json en un objet java
Les diffĂ©rents critĂšres que nous avons pu gĂ©rer avec lâapplication sont :â La recherche de tweets avec mots clĂ©s et/ou Hashtags : Ces mots clĂ©s et hashtags sont rĂ©cupĂ©rĂ©s
via le fichier JSON
â Recherche des tweets de diffĂ©rent(s) utilisateur(s) contenant (ou pas) des mots clĂ©s et/ou ha-shtags, rĂ©pondant Ă un(des) utilisateur(s) : la librairie twitter4j permet de rĂ©cupĂ©rer les tweetsdâun utilisateur soit avec lâAPI REST (qui fournit au maximum 200 tweets rĂ©cents dâun uti-lisateur), soit avec lâAPI STREAMING (qui permet de suivre les tweets dâun utilisateur encontinu).
â Recherche de tweets avec gĂ©olocalisation contenant des mots clĂ©s et/ou hashtags : Twitter4Jpermet dâeffectuer des requĂȘtes qui fournissent des tweets gĂ©olocalisĂ©s mais elle ne permet pasde rĂ©cupĂ©rer des tweets qui sont gĂ©olocalisĂ©s et qui contiennent des mots clĂ©s spĂ©cifiĂ©s parlâutilisateur. Nous avons donc dĂ» appliquer un traitement supplĂ©mentaire aux rĂ©sultats obte-nus aprĂšs gĂ©olocalisation. Pour ĂȘtre sĂ»r de rĂ©cupĂ©rer des tweets geolocalisĂ©s qui contiennentles mots clĂ©s et hashtags dĂ©finis, nous rĂ©cupĂ©rons les tweets gĂ©olocalisĂ©s et nous effectuons unfiltrage sur les diffĂ©rents mots-clĂ©s ou hashtags.
â En ce qui concerne le filtrage, nous avons mis en place diffĂ©rentes mĂ©thodes qui permettent detester si un tweet contient un mot clĂ©, un hashtag ou si le tweet rĂ©pond Ă un utilisateur.
â Pour une recherche avec lâAPI REST, il faut dĂ©finir un cercle avec un centre (longitude etlatitude du centre) et un rayon (cf. figure 13). Tandis que, pour une recherche avec lâAPISTREAMING, il faut dĂ©finir un rectangle avec la longitude et la latitude des deux coins op-posĂ©s.
Figure 13 â RĂ©cupĂ©ration tweets gĂ©olocalisĂ©s avec lâAPI REST
Les requĂȘtes sont diffĂ©rentes dâune API Ă une autre, il a donc fallu faire une classe pour chacunedâelles ainsi quâune classe principale dĂ©terminant lâappel Ă lâune ou lâautre. Chacune des deux APIa donc sa propre classe, ainsi que ses propres mĂ©thodes diffĂ©rentes pour chacun des critĂšres. Deplus, certains critĂšres sont accessibles pour une des API (REST le plus souvent) mais pas pourlâautre. Ce qui rend la tĂąche difficile pour la mise en place de lâinterface Web, il fallait que le menuchange en fonction de lâAPI sĂ©lectionnĂ©e par lâutilisateur.
26
â La seconde partie concerne lâauthentification, câest-Ă -dire lâenregistrement du compte « TwitterDevelopers » avec lequel les requĂȘtes seront effectuĂ©es. Pour utiliser notre application, lâutilisateurdevra possĂ©der un compte sur « Twitter Developers », ce qui lui permettra dâavoir les codesdâaccĂšs nĂ©cessaires au lancement des requĂȘtes. Ces codes dâaccĂšs seront ensuite enregistrĂ©s dansnotre base de donnĂ©es. Lâapplication Java se chargera de rĂ©cupĂ©rer ces codes dâaccĂšs afin dâeffectuerlâauthentification pour lâaccĂšs au site Twitter.
La figure 14 nous montre comment les codes dâaccĂšs sont rĂ©cupĂ©rĂ©s depuis la base de donnĂ©es.
Figure 14 â RĂ©cupĂ©ration des codes dâaccĂšs Twitter Developers Ă partir de la base de donnĂ©es
Voyons maintenant lâauthentification du cĂŽtĂ© Twitter, cf figure 15.
Figure 15 â Authentification au service twitter
Un objet ConfigurationBuilder est crĂ©Ă© et nous permet lâaccĂšs aux donnĂ©es de Twitter via les codesdâaccĂšs. Une fois cette authentification rĂ©alisĂ©e, il est possible de lancer des requĂȘtes.
27
2.6.5 Connexion et insertion dans la base de données
La connexion Ă la base de donnĂ©es du cĂŽtĂ© de lâapplication Java est gĂ©rĂ©e par le driver PostgreSQLJDBC qui est disponible sur le site https ://jdbc.postgresql.org/download.html .
Cette connexion est réalisée de la façon suivante (figure 16) :
Figure 16 â Connexion Ă la base de donnĂ©es
La fonction getConnection (String url, String user, String password) Ă©tabli une connexion avec la basede donnĂ©es. Elle prend en paramĂštres lâurl, lâutilisateur (propriĂ©taire), et le mot de passe de la base dedonnĂ©es. Nous avons mis en place un fichier âconfig.propertiesâ qui contient les informations nĂ©cessaires(le numĂ©ro de port, lâhĂŽte. . .) pour la connexion Ă la base de donnĂ©es. La ligne de code SetAutoCommit(false) permet de ne pas valider les transactions automatiquement. Ceci est important car cela permet dene pas insĂ©rer dans la base de donnĂ©es dans le cas oĂč une erreur se produit. Pour valider une transaction,la mĂ©thode Commit() doit ĂȘtre appelĂ©e sur lâinstance de la connexion.
Une fois la connexion Ă©tablie, les insertions et les requĂȘtes sont gĂ©rĂ©es par la classe Java java.sql.Statementque lâapplication emploie pour transmettre des instructions Ă la base, elle reprĂ©sente une requĂȘte SQL.Cette classe contient les mĂ©thodes suivantes :
â public abstract boolean execute() throws SQLException : qui permet dâexĂ©cuter une re-quĂȘte et renvoie true si lâexĂ©cution renvoie un ResultSet (classe qui symbolise un ensemble derĂ©sultats dans la base de donnĂ©es et autorise lâaccĂšs aux rĂ©sultats dâune requĂȘte rangĂ©e par ran-gĂ©e).
â public abstract ResultSet executeQuery() throws SQLException : qui permet aussi dâexĂ©-cuter une requĂȘte et renvoie un ResultSet.
â public abstract int executeUpdate() throws SQLException : qui permet dâexĂ©cuter unemise Ă jour et renvoie le nombre dâattributs concernĂ©es.
La figure situĂ©e en annexe G montre une requĂȘte sur la table âTweetâ et une insertion dans cette mĂȘmetable.
Les insertions sont gĂ©rĂ©es en fonction des dĂ©pendances entre les tables. Par exemple, lors de la rĂ©cupĂ©-ration dâun tweet, lâinsertion dans la table âUserTweetâ sâeffectue avant lâinsertion dans la table âTweetâparce que la table âTweetâ contient une clĂ© Ă©trangĂšre qui possĂšde une rĂ©fĂ©rence vers lâid de la tableâUserTweetâ.
Une fois les tweets rĂ©cupĂ©rĂ©s et insĂ©rer correctement dans la base de donnĂ©es, il faut maintenant quâilssoient exploitables dâune maniĂšre pratique par lâutilisateur, nous allons voir de quelle maniĂšre cet aspecta Ă©tĂ© mis en place.
28
2.7 Analyse/Statistiques des tweets
Nous nous situons ici dans la partie rĂ©sultats de lâinterface utilisateur. Dans cette partie, la page Webse distingue en trois modules :
â une colonne Ă gauche pour lâaffichage et la gestion des recherches en coursâ un module central pour la visualisation de lâensemble des tweets recueillisâ un module droit comprenant des donnĂ©es statistiques
La section du rapport qui suit se consacre au troisiĂšme module de la page de rĂ©sultats et se dĂ©cline endeux types dâĂ©lĂ©ments, les nuages de mots et les graphiques.
2.7.1 Nuages de mots
Le premier module mis en place pour étudier le contenu des tweets est un nuage de mots mettant enévidence les mots les plus utilisés dans le contenu récupéré.
Le nuage doit ĂȘtre modulable, pour :â afficher les mots des tweets ayant Ă©tĂ© postĂ©s pendant une pĂ©riode choisie (intervalle de dates)â afficher un nombre limitĂ© de mots dans le cas oĂč le nombre de tweets et donc le nombre de mots
serait Ă©levĂ©â afficher seulement les mots ayant une frĂ©quence comprise dans un intervalle prĂ©dĂ©fini
Plusieurs nuages indĂ©pendants peuvent ĂȘtre ajoutĂ©s pour permettre de comparer diffĂ©rentes configura-tions entre elles.
Pour ce qui est des fonctions utilisĂ©es nous avons dans un premier temps une fonction PHP qui rĂ©cu-pĂšre tous les tweets associĂ©s Ă une recherche et qui filtre et dĂ©compose leur contenu textuel pour crĂ©erun tableau Ă deux dimensions [mot, frĂ©quence]. Cette fonction est appelĂ©e par une fonction javascriptutilisant AJAX qui rĂ©cupĂšre le tableau de mots et sâoccupe de lâafficher dans le bloc de contenu du module.
Pour lâaffichage, nous avons utilisĂ© la librairie tagcloud.js qui, en lâappliquant sur un Ă©lĂ©ment HTMLpossĂ©dant un attribut numĂ©rique donnĂ© (rel="valeur"), redimensionne automatiquement lâĂ©lĂ©ment HTMLen fonction de cette valeur. Ici la valeur est donc la frĂ©quence du mot et lâĂ©lĂ©ment HTML le bloc contenantle mot <span rel="frĂ©quence">mot</span>.
29
Figure 17 â Apercu dâun nuage de mots
30
2.7.2 Ăvolution du nombre de tweets en fonction du temps
Le second module dĂ©veloppĂ© est un graphique reprĂ©sentant la rĂ©partition des tweets postĂ©s dans letemps. On retrouve dans le module le choix dâun intervalle de date pour analyser une pĂ©riode prĂ©ciseainsi que le choix de lâunitĂ© de temps. Ainsi, il est possible de voir le nombre de tweets postĂ©s chaqueheure ou chaque jour dans lâintervalle choisi. Il est aussi possible dâen ajouter plusieurs sur la page afinde les comparer.
Pour réaliser ce module nous avons utilisé la librairie Chart.js permettant de configurer différents typesde graphique en javascript.
Nous avons en parallĂšle dĂ©veloppĂ© une fonction PHP qui selon lâunitĂ© de temps fournie, calcule avec lecontenu de notre base de donnĂ©es le nombre de tweets postĂ©s Ă chaque intervalle et retourne un tableau Ă deux dimensions contenant les paires de valeurs [abscisses, ordonnĂ©es]. Ce tableau est rĂ©cupĂ©rĂ© avec unefonction javascript utilisant AJAX qui le transforme pour configurer le graphique crĂ©Ă© avec Chart.js.
31
Figure 18 â Apercu des graphes de lâĂ©volution du nombre de tweets en fonction du temps
32
2.8 Idées abandonnées et améliorations envisagées
Lâun des avantages que nous avons pour ce projet est quâil nâest pas figĂ©, et nous permet de resterautonomes et entreprenants sur certains aspects.
Pour lâapplication Java par exemple, aprĂšs lâĂ©tude de toutes les informations que Twitter permet de rĂ©cu-pĂ©rer grĂące Ă ces deux API (REST et STREAMING) nous avons sĂ©lectionnĂ© les critĂšres nous paraissantpertinents. Nous gardons donc la possibilitĂ© dâajouter des critĂšres, comme la recherche de tweets par datedâinscription des utilisateurs.
Lâinterface utilisateur reste le module pour lequel nous avions le plus de libertĂ©s, tout dâabord sur lâoutilde conception. Lâutilisation de Bootstrap nous a permis de façonner cette interface de maniĂšre pratiqueet plutĂŽt esthĂ©tique. De mĂȘme que pour les critĂšres de recherche il a fallu choisir quelles informationsprĂ©senter. GuidĂ©s par nos encadrants nous avons donc sĂ©lectionnĂ© les informations les plus pertinentes.Cependant nous avions des choix Ă faire sur la maniĂšre de prĂ©senter ces rĂ©sultats, et de nombreusesamĂ©liorations sont possibles Ă ce niveau. Pour le nuage de mots par exemple, il pourrait sâaccompagnerdâune liste regroupant les mots quâon ne voudrait pas voir apparaĂźtre. Les mots de ce nuage pourraientĂ©galement ĂȘtre cliquables et permettre leurs visualisations sur le site de Twitter ou encore de lancerautomatiquement une nouvelle recherche basĂ©e sur ces mots.
AprĂšs avoir vu en dĂ©tails lâaspect technique du projet, nous allons explorer le cĂŽtĂ© organisationnel misen place.
33
3 Rapport dâactivitĂ©
Dans cette partie nous abordons diffĂ©rents points autour de lâorganisation mise en place pour le projet.Nous parlerons dans un premier temps de la mĂ©thode de gestion de projet gĂ©nĂ©rale utilisĂ©e. Puis, dansun second temps, nous nous attarderons sur la planification prĂ©vue et rĂ©alisĂ©e.
3.1 MĂ©thode de gestion de projet
3.1.1 Présentation de la méthode
La mĂ©thode mise en place pour notre projet sâest construite selon un procĂ©dĂ© qui peut ĂȘtre assimilĂ©aux mĂ©thodes Agiles et plus particuliĂšrement Ă la mĂ©thode SCRUM. Nous nous sommes en effet servisdes prĂ©ceptes de bases de ces mĂ©thodes sans pour autant en appliquer chaque principe Ă la lettre.
Nous avons avant tout essayĂ© de privilĂ©gier certaines valeurs telles que :â Les individus et leurs interactionsâ La collaboration entre dĂ©veloppeurs et commanditairesâ Lâadaptation au changement
Nous voyons maintenant comment ces concepts ont pu ĂȘtre appliquĂ©s Ă notre projet.
3.1.2 Bilan dâutilisation
Les méthodes Agiles se basent également sur un principe de développement itératif, dont nous noussommes inspirés, ce qui a permis au groupe de mener le projet de maniÚre assez dynamique et réactive.
Pour ce qui est de la communication entre le groupe et les commanditaires, nous avons privilĂ©giĂ© lesĂ©changes en face Ă face qui facilitent amplement la comprĂ©hension et lâĂ©change de diffĂ©rents points devue. Nous avons donc mis en place un rendez-vous hebdomadaire Ă la demande de nos encadrants. LesrĂ©unions se tenaient tous les mercredis et un compte rendu Ă©tait fait lors de chacune des rĂ©unions afin degarder une trace des modifications Ă faire et des problĂšmes rencontrĂ©s.
Ces entretiens permettaient Ă lâĂ©quipe de mettre en avant les travaux rĂ©alisĂ©s et de les prĂ©senter aux com-manditaires qui par la suite faisaient leurs retours. Câest ainsi, que de nouveaux objectifs sâinstallaientdans le groupe pour les rĂ©unions suivantes. Cette façon de procĂ©der permettait aux enacdrants dâavoirune meilleure visibilitĂ© sur lâavancement des travaux, de tester les fonctionnalitĂ©s du logiciel au fil de sacrĂ©ation, de dĂ©tecter les risques au plus tĂŽt et dâen faire part.
En plus de ces rĂ©unions avec nos tuteurs, le groupe se rĂ©unissait quelques fois durant la semaine poursâentraider sur les problĂšmes et difficultĂ©s rencontrĂ©s.
La gestion sâest faite au fur et Ă mesure de lâavancĂ©e du projet. Bien quâun planning prĂ©visionnel ait Ă©tĂ©rĂ©alisĂ©, il y a eu tout au long du projet des changements auxquels nous avons dĂ» nous conformer pouravancer plus rapidement dans le programme et pouvoir tenir les Ă©chĂ©ances plus facilement.
34
3.2 Planification
La planification est essentielle dans la gestion dâun projet. Cette planification commence bien souventpar la mise en place dâun planning dit prĂ©visionnel servant Ă donner une idĂ©e des dĂ©lais Ă suivre pourles diffĂ©rentes tĂąches. En gĂ©nĂ©ral ce planning fait lâobjet de changements au cours du dĂ©veloppement duprojet. VoilĂ pourquoi nous allons Ă©galement prĂ©senter le planning rĂ©el du projet. Ces plannings ont Ă©tĂ©rĂ©alisĂ©s Ă lâaide du logiciel OpenProj.
3.2.1 Planning prévu
La figure situĂ©e en annexe H nous permet de voir au mieux lâensemble des tĂąches prĂ©vues au dĂ©but duprojet.
La figure située en annexe I nous permet de visualiser la répartition des tùches au sein du groupedurant toute la durée du projet.
Dans un souci dâanticipation, le planning indiquait que le dĂ©veloppement devait ĂȘtre terminĂ© dĂ©butmai afin de pouvoir prendre en compte les Ă©ventuels retours et les derniĂšres modifications et ajouts.
3.2.2 Planning réel
La figure situĂ©e en annexe J nous montre le planning rĂ©el, les changements subis sont de naturesdiverses, nĂ©anmoins on peut voir que dans lâensemble les dĂ©lais Ă©tablis ont Ă©tĂ© respectĂ©s. Cependant, lesdifficultĂ©s rencontrĂ©es notamment au niveau de la connexion PHP â Java, ont pu engendrer un retard surla mise en place de la partie rĂ©sultats de lâinterface Web.
35
Conclusion
GrĂące Ă la rĂ©alisation du projet ExtractTweet, nous avons appris Ă aller au bout dâun projet, en respec-tant les objectifs fixĂ©s, dans un temps limitĂ©. Cela nous a Ă©normĂ©ment apportĂ© tant au niveau techniquequâau niveau du travail dâĂ©quipe. Ce projet nous a permis de mettre en pratique les connaissances acquiseslors des enseignements de ces derniĂšres annĂ©es. Il est trĂšs intĂ©ressant pour nous de voir dans quels cadrespeuvent sâintĂ©grer les notions enseignĂ©es.
De plus, lâoriginalitĂ© du sujet nous a tout de suite plu car le support utilisĂ© (Twitter), est trĂšs populaire.Ce projet nous a permis de connaĂźtre une autre utilisation dâun site que nous connaissons dĂ©jĂ assez bien.
Concernant lâaspect technique, ce projet a Ă©tĂ© particuliĂšrement enrichissant pour chacun dâentre nousde part la diversitĂ© des outils utilisĂ©s. En effet pour chacun des modules prĂ©sentĂ©s nous avons mis enapplication certains outils dĂ©jĂ connus, mais nous avons surtout appris Ă nous familiariser avec de nouvellestechnologies. Câest un point important et trĂšs apprĂ©ciable pour nous car il nous sera trĂšs souvent demandĂ©durant notre future carriĂšre dâĂȘtre capable de nous adapter Ă diffĂ©rents supports, outils et technologies.La polyvalence est une des compĂ©tences largement attendue en sortant dâune telle formation. Ainsi, ceprojet nous a amenĂ© Ă faire preuve dâadaptation notamment par la prise en main rapide des diffĂ©rentsoutils.
Nous avons pu remplir les objectifs fixĂ©s en dĂ©but de projet, cependant Ă lâissue de ce dernier nousavons pour motivation de continuer Ă amĂ©liorer la plateforme, notamment la partie Web avec lâajout decertaines fonctionnalitĂ©s .
36
Bibliographie/Sitographie
â WikipĂ©dia : http ://fr.wikipedia.org/wiki/Twitterâ http ://lewebpedagogique.com/devanssay/files/2014/07/twitexpose.pdfâ openClassRooms : http ://openclassrooms.com/â Stackoverflow : http ://stackoverflow.com/â developpez.com : http ://www.developpez.com/
37
Annexe A - La classe vue (PHP)
<?phpclass Vue{
protected $fichier ; // nom fichier de la vueprotected $titre ; // le titre de la page ;protected $headinfos ; // le bouton inscription dans le cas de qquns non connecter / le ââ©
pseudo dans le cas d ' une personne connectépublic f u n c t i o n __construct ( $action ){
// nom du fichier a partir de l ' action$thisâ>fichier = ROOT . "/ Views / Vue " . $action . " . php " ;
}
// GénÚre un fichier vue et renvoie le résultat produitf u n c t i o n g e n e r e r F i c h i e r ( $fichier , $donnees ){
i f ( file_exists ( $fichier ) ){
// Rend les Ă©lĂ©ments du tableau $donnees accessibles dans la vueextract ( $donnees ) ;// DĂ©marrage de la t e m p o r i s a t i o n de sortieob_start ( ) ;// Inclut le fichier vue// Son rĂ©sultat est placĂ© dans le tampon de sortierequire $fichier ;// ArrĂȘt de la t e m p o r i s a t i o n et renvoi du tampon de sortier e t u r n ob _ge t_c lea n ( ) ;
}e l s e{
throw new Exception ( " Fichier ' $ f i c h i e r ' introuvable " ) ;}
}
// GénÚre et affiche la vuepublic f u n c t i o n generer ( $donnees ){// Génération de la partie spécifique de la vue
$contenu = $thisâ>g e n e r e r F i c h i e r ( $thisâ>fichier , $donnees ) ; // generation du contenu// GĂ©nĂ©ration du gabarit commun utilisant la partie spĂ©cifique
$vue = $thisâ>g e n e r e r F i c h i e r ( ROOT . ' / Views / gabarit . php ' ,array ( ' t i t r e ' => $thisâ>titre , ' contenu ' => $contenu ) ) ;
// Renvoi de la vue au navigateurecho $vue ;
}
}
?>
38
Annexe B - MĂ©canisme de routage de lâaction demandĂ©e par lâuti-lisateur (PHP)
<?php
i f ( isset ( $_GET [ " action " ] ) ) // si action est pas vide{
$instance = new C o n t r o l e u r U s e r ( ) ;// on verifie que l ' action / la methode existe
i f ( m e t h o d _ e x i s t s ( $instance , $_GET [ " action " ] ) ){
i f ( isset ( $_GET [ " donnee " ] ) ){
i f ( isset ( $_GET [ " donnee2 " ] ) ){
i f ( isset ( $_GET [ " donnee3 " ] ) ) {$instanceâ>$_GET [ " action " ] ( $_GET [ " donnee " ] , $_GET [ " donnee2 " ] ,
$_GET [ " donnee3 " ] ) ;}e l s e{
instanceâ>$_GET [ " action " ] ( $_GET [ " donnee " ] , $_GET [ " donnee2 " ] ) ;}
}e l s e{
$instanceâ>$_GET [ " action " ] ( $_GET [ " donnee " ] ) ;}
}e l s e{
$instanceâ>$_GET [ " action " ] ( ) ;}
}e l s e{
$instanceâ>erreur ( " Cette page n ' existe pas " ) ;exit ( ) ;
}
}?>
39
Annexe C - Récupération des données du formulaire de recherche(Javascript)
f u n c t i o n g e t _ f o r m _ v a l u e s ( ){var date = new Date ( ) ;var timestamp = new Date ( Date . UTC ( date . getFullYear ( ) , date . getMonth ( ) , date . getDate ( ) , date .ââ©
getHours ( ) , date . getMinutes ( ) , date . getSeconds ( ) , date . g e t M i l l i s e c o n d s ( ) ) ) ;
var name = $ ( '#search_name ' ) . val ( ) ;var api ;var nb_results ;var dt ;var hft ;
i f ( $("# use_rest " ) . is ( ' : checked ' ) ) {api = $("# use_rest " ) . val ( ) ;
i f ( $ ( '#date ' ) . val ( ) ! = " " ) { dt = $ ( '#date ' ) . val ( ) }hft = $ ( '#h o u r s _ s l i d e r ' ) . g e t S l i d e r V a l u e s ( ) ;}
e l s e{ // si ce n ' est pas l ' un , c ' est l ' autreapi = $("# u s e _ s t r e a m i n g " ) . val ( ) ;}
i f ( $ ( '#r e s u l t s _ l i m i t ' ) . val ( ) ! = " " ){nb_results = $ ( '#r e s u l t s _ l i m i t ' ) . val ( ) ;}
var lang ;i f ( $ ( '#language ' ) . val ( ) !=" default " ) { lang = $ ( '#language ' ) . val ( ) }var rts ;i f ( $ ( '#r e t w e e t s ' ) . val ( ) !=" default " ){
var tmp = $ ( '#r e t w e e t s ' ) . val ( ) . split ( 'â ' ) ;rts = [ ]rts [0 ]= parseInt ( tmp [ 0 ] ) ;rts [1 ]= parseInt ( tmp [ 1 ] ) ;
}
var values ;i f ( name ! = " " ) {values = {
search_name : name ,s e a r c h _ t i m e s t a m p : timestamp ,
API : api ,re sul t_l imi t : nb_results ,compte_API : $ ( '#api_account ' ) . val ( ) ,keywords : lists [ ' keyword_l ist ' ] ,language : lang ,
r e t w e e t s _ f r o m _ t o : rts ,date : dt ,ho ur_ fro m_t o : hft ,answer_to : lists [ ' answer_to_l ist ' ] ,users : lists [ ' u s e r _ l i s t ' ] ,bo und ing _bo x : lists [ ' bounding_box_list ' ]}
}
var json_values = JSON . stringify ( values ) ;r e t u r n json_values ;
}
40
Annexe D - Envoi des données avec AJAX
f u n c t i o n c r e a t e _ s e a r c h ( ){var new_search = g e t _ f o r m _ v a l u e s ( ) ;var titreRe = $("# search_name " ) . val ( ) ;
i f ( new_search != n u l l ){
$ . ajax ({type : " POST " ,url : " . . / Controlers / C o n t r o l e u r U s e r . php ? action=v a l i d e r R e c h e r c h e " ,data : {search : new_search ,titreR : titreRe} ,e r r o r : f u n c t i o n ( ) { alert ( " erreur ! " ) ; } ,
success : f u n c t i o n ( retour ) {console . l o g ( retour ) ;alert ( retour ) ;location . reload ( ) ;
}}) ;
}e l s e {console . l o g ( " erreur " ) ;}
}
41
Annexe E - Fonction de validation dâune recherche (PHP)
// Fonction de recherche , cree un fichier avec les paramatres de recherchespublic f u n c t i o n v a l i d e r R e c h e r c h e ( ){
i f ( isset ( $_POST [ ' s ea r c h ' ] ) ) {
$fp = fopen ( ' recherche_ ' . $_POST [ ' t i t r e R ' ] . ' . json ' , 'w ' ) ;f w r i t e ( $fp , $_POST [ ' s ea r ch ' ] ) ;f c l o s e ( $fp ) ;
}$file = ' recherche_ ' . $_POST [ ' t i t r e R ' ] . ' . json ' ;$thisâ>e x e c I n B a c k g r o u n d ( " java âjar . . / S S A F J a v a A p p l i / JavaApp . jar " . $file ) ;sleep ( 1 ) ;
$ r e s u l t L a u n c h S e a r c h = $thisâ>searchâ>e x i s t _ s e a r c h _ t i t l e ( " " . $_POST [ ' t i t r e R ' ] ) ;i f ( $ r e s u l t L a u n c h S e a r c h == true ){
echo " Recherche envoyée " ;}e l s e
echo " Erreur Recherche non envoyĂ©e , veuillez consulter le fichier l o g pour plus d 'ââ©in for mat io ns " ;
}}
42
Annexe F - Fonction dâexĂ©cution de lâapplication Java (PHP)
public f u n c t i o n e x e c I n B a c k g r o u n d ( $cmd ) {i f ( substr ( php_uname ( ) , 0 , 7) == " Windows " ) {pclose ( popen ( " start /B " . $cmd , " r " ) ) ;}e l s e {$hr=popen ( $cmd . " > / dev / n u l l &" ," r " ) ;}}
43
Annexe G - Une insertion dans la table des tweets (Java)
sql2 = " SELECT â FROM \" tweet \" WHERE id_tweet = ' "+ S t r i n g . valueOf ( s . g e t I d ( ) )+" ' " ;rs = stmt . ex ecu teQ uer y ( sql2 ) ;i f ( ! rs . next ( ) ){sql =" INSERT INTO \" tweet \ " ( id_tweet , date_tweet , current_user_retweet_id , favorite_count ,ââ©
longitude , latitude "+ " , in_reply_to_screen_name , in_reply_to_status_id , in_reply_to_user_id ,ââ©user_id , lang , retweet_count , text , is_retweet , is_retweeted , i s _ r e t w e e t e d _ b y _ m e "+ " ,ââ©is_truncated , scopes , all_info , place_id , i d _ t w e e t _ r e t w e e t e d ) VALUESââ©( ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? ) " ;
smt = connexion . p r e p a r e S t a t e m e n t ( sql ) ;smt . setString ( 1 , String . valueOf ( s . getId ( ) ) ) ;smt . se tTi mes tam p ( 2 , new java . sql . Timestamp ( s . ge tCr eat edA t ( ) . getTime ( ) ) ) ;smt . setLong ( 3 , s . g e t C u r r e n t U s e r R e t w e e t I d ( ) ) ;smt . setInt ( 4 , s . g e t F a v o r i t e C o u n t ( ) ) ;i f ( s . g e t G e o L o c a t i o n ( ) != n u l l ){smt . setDouble ( 5 , s . g e t G e o L o c a t i o n ( ) . ge tLo ngi tud e ( ) ) ;smt . setDouble ( 6 , s . g e t G e o L o c a t i o n ( ) . getLatitude ( ) ) ;}e l s e{smt . setDouble ( 5 , 0) ;smt . setDouble ( 6 , 0) ;}smt . setString ( 7 , s . g e t I n R e p l y T o S c r e e n N a m e ( ) ) ;smt . setString ( 8 , String . valueOf ( s . g e t I n R e p l y T o S t a t u s I d ( ) ) ) ;smt . setLong ( 9 , s . g e t I n R e p l y T o U s e r I d ( ) ) ;smt . setLong (10 , s . getUser ( ) . getId ( ) ) ;smt . setString (11 , s . getLang ( ) ) ;smt . setInt (12 , s . g e t R e t w e e t C o u n t ( ) ) ;smt . setString (13 , s . getText ( ) ) ;smt . setBoolean (14 , s . isRetweet ( ) ) ;smt . setBoolean (15 , s . isRetweeted ( ) ) ;smt . setBoolean (16 , s . i s R e t w e e t e d B y M e ( ) ) ;smt . setBoolean (17 , s . isTruncated ( ) ) ;i f ( s . getScopes ( ) != n u l l )smt . setString (18 , Arrays . toString ( s . getScopes ( ) . getPlaceIds ( ) ) ) ;e l s esmt . setString (18 , n u l l ) ;smt . setString (19 , T w i t t e r O b j e c t F a c t o r y . getRawJSON ( s ) ) ;i f ( s . getPlace ( ) != n u l l )smt . setString (20 , s . getPlace ( ) . getId ( ) ) ;e l s esmt . setString (20 , n u l l ) ;i f ( s . isRetweet ( ) )smt . setString (21 , String . valueOf ( s . g e t R e t w e e t e d S t a t u s ( ) . getId ( ) ) ) ;e l s e {smt . setString (21 , n u l l ) ;}smt . e x e c u t e U p d a t e ( ) ;}
44
Annexe H - Planning prévisionnel - Liste des tùches
45
Annexe I - Planning prévisionnel - Attribution des tùches dansle temps
46
Annexe J - Planning réel
47
Annexe K - Manuel dâutilisation
1 - Ouverture dâun compte utilisateur
Pour se servir de lâapplication, lâutilisateur doit crĂ©er un compte. Sâil nâest pas dĂ©jĂ connectĂ© il y estautomatiquement invitĂ©. Tous les champs sont obligatoires avec des contraintes sur certains dâentre eux.
â lâadresse mail doit ĂȘtre correctement formatĂ©eâ le mot de passe doit ĂȘtre de six caractĂšres minimum
Une fois inscrit, le formulaire de connexion accessible grĂące au bouton du menu principal permet dâac-cĂ©der Ă lâapplication.
2 - Enregistrement Compte Twitter Developers
Une fois connectĂ©, vous arrivez sur la page de lancement de recherche. Ajoutez un compte TwitterDevelopers avec vos codes dâaccĂšs. Pour cela cliquez sur âAjouter un compteâ. Un menu âen accordĂ©onâapparaĂźt dans lequel vous pourrez donner un nom Ă votre compte et insĂ©rer vos codes dâaccĂšs.
48
Pour avoir un compte âTwitter Developersâ cliquez sur ce lien https ://apps.twitter.com/ et enregistrezune application.
3 - CrĂ©ation dâune recherche
Pour créer/lancer une recherche avec des critÚres, vous devez :
â Choisir lâAPI de recherche (REST pour une recherche de tweets dĂ©jĂ prĂ©sents dans la base dedonnĂ©es de Twitter ou STREAMING pour une recherche de tweets en temps rĂ©el) et un compte(sachant quâil est impossible dâavoir deux recherches en cours utilisant le mĂȘme compte)
â Remplir le champ âTitre de la rechercheââ Ajouter un ou plusieurs mots clĂ©s et hashtags(mot commençant par #) en saisissant le mot et
en cliquant sur le bouton â+â. Ceci nâest pas obligatoire au cas ou vous recherchez des tweetsgĂ©olocalisĂ©s ou les tweets dâun utilisateur Twitter
â Ăventuellement choisir la langue des tweets rĂ©sultants de la recherche ; choisir lâintervalle du nombrede retweets
â Ăventuellement choisir (pour une recherche avec lâAPI REST) la plage horaire et la date minimumdes tweets
49
â Ăventuellement choisir des auteurs, des pseudo auxquels ces auteurs rĂ©pondent
â Ajouter des Bounding Box (zone dĂ©finissant les rĂ©gions du monde) si vous recherchez des tweetsgĂ©olocalisĂ©s en sĂ©lectionnant le nom et en cliquant sur â+â
â Vous pouvez dĂ©finir vos propres Bounding Box. Il suffit de cliquer sur le bouton âAjouter une boun-ding boxâ, puis de donner un nom Ă votre Bounding Box et ensuite de sĂ©lectionner le type (cerclepour les recherches avec lâAPI REST et rectangle pour les recherches avec lâAPI STREAMING) etenfin, de cliquer sur la map. Un rectangle ou un cercle que vous pouvez dĂ©limiter apparaĂźt. Cliquersur âajouterâ pour effectuer lâajout. La figure suivante vous montre un aperçu
50
â Enfin cliquer sur le bouton âValider rechercheâUn popup apparaĂźt avec ârecherche envoyĂ©eâ si lâenvoi de la recherche a Ă©tĂ© effectuĂ© avec succĂšs.
4 - Visualisation des résultats
Cliquer sur le menu âRĂ©sultatsâ en haut Ă droite pour accĂ©der Ă la page de rĂ©sultats.Sur la gauche de la page de rĂ©sultats se trouve la liste des recherches lancĂ©es.
51
Le premier menu contient une liste de filtres permettant de nâafficher que les recherche ayant des critĂšresprĂ©cis, ainsi quâune option de tri (Par date de lancement et/ou par nombres de rĂ©sultats).Un indicateur montre lâĂ©tat de chaque recherche (terminĂ©e ou en cours) [ 1 ].Le bouton â+â Ă droite permet dâafficher les dĂ©tails dâune recherche [ 2 ].
Sur la gauche du menu, se trouvent les boutons permettant :â dâexporter les tweets associĂ©s Ă une recherche [ 3 ]â de stopper ou supprimer une recherche [ 4 ]
Une fois la recherche sélectionnée, différents modules se mettent en place.
Premier module - visualisation des tweets
La partie gauche du contenu de la page affiche les tweets triĂ©s par pages. Il est possible de les affichertous ou de choisir dâafficher seulement les tweets gĂ©olocalisĂ©s [ 1 ].Un lien vers le tweet est disponible [ 2 ].Pour afficher la position du tweet sur le module Google Map, cocher la checkbox [ 3 ].Les boutons associĂ©s au module Google permettent de sĂ©lectionner tous les tweets rĂ©cupĂ©rĂ©s dans larecherche ou seulement les tweets contenus dans la page actuellement affichĂ©e [ 4 ].
52
DeuxiĂšme module - nuage de mots
Ce module permet dâafficher les mots clĂ©s utilisĂ©s dans les tweets.Les filtres comprennent :
â deux sĂ©lecteurs de dates pour considĂ©rer les tweets postĂ©s au cours dâune pĂ©riode prĂ©cise [ 1 ]â la sĂ©lection dâune plage de frĂ©quences [ 2 ] et une limite dâaffichage [ 3 ] pour afficher seulement
une partie des mots
Pour valider les filtres, utiliser le bouton â .Un lien permet dâafficher le nuage de mots complet sur une nouvelle page [ 4 ]. Il est possible dâajouterplusieurs nuages de mots sur la page Ă lâaide du bouton â+â situĂ© sous le module.
53
TroisiÚme module - granularité temporelle
Ce module permet dâafficher une courbe reprĂ©sentant la rĂ©partition des tweets dans le temps.Les filtres comprennent :
â deux sĂ©lecteurs de dates reprĂ©sentant la borne infĂ©rieure et supĂ©rieure de lâaxe des abscisses [ 1 ]â la sĂ©lection dâune unitĂ© dâintervalle pour cet axe [ 2 ]
Pour valider les filtres, utiliser le bouton â .Le survol de la courbe avec la souris permet dâafficher la date et le nombre de tweets postĂ©s entre ce pointet lâintervalle prĂ©cĂ©dent. Lâajout de plusieurs graphiques est possible Ă lâaide du bouton â+â situĂ© sous lemodule.
54