SlideShare une entreprise Scribd logo
1  sur  10
Crowl the World
INSTAGRAM
Projet final ISN 3ème année ESILV
Groupe 18:
BIZERAY Jeritiana
DEEL Absalon
GHEUNG Nicolas
HARBEMONT Benoît
RUI Alessandro
• Multithreading C# - Visual Studio
• Classes InstaSharp
• Système de Gestion de Base de Donnée – Langage MySQL
• Classes et méthodes génériques (Templates)
• Fenêtres WPF en C#
• Travail d’équipe via mise en place d’un TFS(Team Foundation Server) - Visual Studio
Crowl the World
Technologies Utilisées
Groupe 18
Crowl the World
Démarche suivie
• Découpage en 10 parties pour
plus de rapidité (10 comptes
Instagram)
Zoom sur une partie du
traitement.
• Coordonnées de Paris
• Discrétisation de la ville pour
récupérations de Localisations et
Medias
Groupe 18
FONCTIONNEMENT D’UN THREAD POUR RECHERCHE
LOCATIONS OU MEDIAS (BALAYAGES)
API
Thread
Recherche
Instagram Authentification
(Via InstaSharp)
Defini les coordonnées à utiliser pour
faire la racherche
Recherche envoyée à instagram
Coordonnées
GPS
2
0
20 résultats
retournés
Mise des resultats dans un buffer
Buffer de type
HashSet<>
IEqualityComparer
Thread Mise
en BD
Récupération de 40 médias selon une
fréquence dépendant de la taille du
buffer
Connexion base de donnée
Mise des resultats dans
la BD
Sleep Variable en
fonction de la
taille du HashSet
Réatribution des
nouvelles
coordonnées
SQL
Server
Locations
iD:BIGINT
Name:TEXT
Latitude:DOUBLE
Longitude:DOUBLE
Media
iD_Media:LONGTEXT, iD_Media(255)
iD_Locations:BIGINT
latitude_Locations:DOUBLE
longitude_Locations:DOUBLE
user_Name:TEXT
Groupe 18
40 résultats
FONCTIONNEMENT D’UN THREAD POUR RECHERCHE
MEDIAS OU USERS (LECTURE TXT)
API
Thread
Recherche
Instagram Authentification
(Via InstaSharp)
Lecture dans le fichier texte de la
coordonnée ou du UserName
Recherche envoyée à instagram
Coordonnées
GPS
2
0
20 résultats
retournés
Mise des resultats dans un buffer
Buffer de type
HashSet<>
IEqualityComparer
Thread Mise
en BD
Récupération de 40 médias selon une
fréquence dépendant de la taille du
buffer
40 résultats
SQL
Server
Connexion base de donnée
Mise des resultats dans
la BD
Sleep Variable en
fonction de la
taille du HashSet
Réatribution des
nouvelles
coordonnées ou
nouveau
userName
Users
iD_User:BIGINT
user_name:TEXT
full_name:TEXT
Media
iD_Media:LONGTEXT, iD_Media(255)
iD_Locations:BIGINT
latitude_Locations:DOUBLE
longitude_Locations:DOUBLE
user_Name:TEXT
Groupe 18
MODELE VUE CONTROLEUR
Instagram API (Abstraite)
Locations
…
+Locations(InstagramConfig config)
+Search(double latitude, double longitude, double? distance):
Task<LocationsResponse>
Medias
+Medias(InstagramConfig config)
+Search(double latitude, double longitude, int? distance):
Task<MediasResponse>
Users
+Users(InstagramConfig config)
+SearchSearch(string searchTerm, int? count)
Task<UsersResponse>
InstagramConfig
+InstagramConfig(string clientId, string clientSecret, string
redirectUri, string callbackUri)
Authentification
+ Authentification(string iden) ex isn1,isn2,isn10…
EndPoints
Crowl the World
Groupe 18
MODELE VUE CONTROLEUR
Model_Comparer(Abstraite)
LocationComparer
…
+public LocationComparer()
+Equals(Location l1, Location
l2):bool
+GetHashCode(Location l):int
MediaComparer
+public MediaComparer()
+Equals(Media l1, Media
l2):bool
+GetHashCode(Media l):int
UserComparer
+public UserComparer()
+Equals(User l1, User
l2):bool
+GetHashCode(User l):int
IEqualityComparer<User>IEqualityComparer<Media>
IEqualityComparer<Location>
Model_Pers(Abstraite)
…
Location
+Id:int
+Latitude:decimal
+Longitude:decimal
+Name:String
Media
+ID:string
+Location :Location
+User:string
+Type : string
…
UserInfo
+fullname:string
+id:string
+username:string
Crowl the World
Groupe 18
MODELE VUE CONTROLEUR
RequeteAPI (Abstraite)
-compteur:int
-g1:Gestion_BD
-synchro:object
-threadEnCours:int
-threadBuffer:Thread
+public RequeteAPI(int threadEnCours)
Balayage_Generique<type, typecomparer>
where type : InstaSharp.Models.Model_Pers
where typecomparer : IEqualityComparer<type>, new()
-latitudemin, latitudemax:double
-longitudemin, longitudemax:double
-variationCoordonees:double
-rayon:double
-bufferListeLM: HashSet<type>
+public public Balayage_Generique(string city,
double rayon, double variationCoordonees, int
threadEnCours) : base(threadEnCours)
+RetourneNombreDeBoucles(), RetournePasDeDeplacement:double
+DistanceFromCoordinates(double latitude1, double longitude1,
double latitude2, double longitude2):double
+AjouterDansLeBuffer(double longi, double lati,
InstaSharp.Endpoints.InstagramApi metadonnee)
+SauvegardeBalayage(double longi, double lati)
+Balayage(Authentification a, CoordonneesDepart c)
+ BufferToBD()
+TotalTourBoucle()
LectureTXT_Generique<type, typecomparer>
where type : InstaSharp.Models.Model_Pers
where typecomparer : IEqualityComparer<type>, new()
-bufferListeMU: HashSet<type>
+public LectureTXT_Generique(int threadEnCours) : base(threadEnCours)
+RecupererToutLesIdLocationsEtUserNames(int nbThreadsDispos)
+RequeteMedia(long id, string place, double latitude, double
longitude, InstaSharp.Endpoints.Media muAPIwR)
+RequeteUser(string userName, InstaSharp.Endpoints.Users
muAPIwR)
+MettreDansLeBuffer(List<type> resultListeMU)
+NombresDeBoucles():long
+RecueillirMediaUserEtMetDansLeHashSet(InstaSharp.Endpoints.Ins
tagramApi mediauser)
+ChargerSauvegardeMediaPuisRepartir(StreamReader
monStreamReaderFichierSource, string ligneFichierSource,
InstaSharp.Endpoints.InstagramApi mediauser)
+ChargerSauvegardeUserPuisRepartir(StreamReader
monStreamReaderFichierSource, string ligneFichierSource,
InstaSharp.Endpoints.InstagramApi mediauser)
+BufferToBD()
+FaireRequeteMediaUser(Authentification a)
GestionBD
-connection: MySqlConnection
+task { location, media, user }: enum
+ public GestionBD()
+ TryCreateTable(string nomDeLaTable, string arguments)
+ NombreLigneBD(string table)
+ CreationFichier(MySqlDataReader reader, int thread, task todo)
+ FaireRequeteSQLPourCreationTXT(string TOSELECT, string TABLE,
int nbThreadsDispos, task toDo)
+ InsertMedia(HashSet<InstaSharp.Models.Media> list)
+ InsertLocation(HashSet<InstaSharp.Models.Location> list)
+ InsertUser(HashSet<InstaSharp.Models.User> list)
+ InsertGenerique<TypeInserer>(HashSet<TypeInserer> list)
where TypeInserer : InstaSharp.Models.Model_Pers
Crowl the World
Groupe 18
MODELE VUE CONTROLEUR
• Entièrement réalisé en C#
• Un button par compte Instagram
• Une barre de progression par compte
Gérés par des dictionnaires: Dictionary<int, Button> dicoButton,Dictionary<int, ProgressBar> dicoProgressBar
Où int représente le numéro de compte(thread) à lancer
Crowl the World
Groupe 18
RÉSULTATS
Points Photos des 5 derniers jours
(⋍12000)
Localisations (⋍220.000 en BD, 45.000
représentées ici)
Crowl the World
Groupe 18

Contenu connexe

Similaire à Presentation

Environnement de développement de bases de données
Environnement de développement de bases de donnéesEnvironnement de développement de bases de données
Environnement de développement de bases de donnéesISIG
 
PostGIS @ Pgday.eu 2009
PostGIS @ Pgday.eu 2009PostGIS @ Pgday.eu 2009
PostGIS @ Pgday.eu 2009Oslandia
 
Partie1 TypeScript
Partie1 TypeScriptPartie1 TypeScript
Partie1 TypeScriptHabib Ayad
 
Hands on lab Elasticsearch
Hands on lab ElasticsearchHands on lab Elasticsearch
Hands on lab ElasticsearchDavid Pilato
 
Des mises à jour? Emmenez votre application Stitch encore plus loin grâce aux...
Des mises à jour? Emmenez votre application Stitch encore plus loin grâce aux...Des mises à jour? Emmenez votre application Stitch encore plus loin grâce aux...
Des mises à jour? Emmenez votre application Stitch encore plus loin grâce aux...MongoDB
 
Présentation Google Dataflow
Présentation Google DataflowPrésentation Google Dataflow
Présentation Google DataflowGeoffrey Garnotel
 
Node.js, le pavé dans la mare
Node.js, le pavé dans la mareNode.js, le pavé dans la mare
Node.js, le pavé dans la mareValtech
 
Stage de fin d’études – dotcloud
Stage de fin d’études – dotcloudStage de fin d’études – dotcloud
Stage de fin d’études – dotcloudJoffrey Fu Hrer
 
Stage de fin d’études – dotcloud
Stage de fin d’études – dotcloudStage de fin d’études – dotcloud
Stage de fin d’études – dotcloudJoffrey Fu Hrer
 
XebiCon'16 : GraphQL et Falcor, un nouveau regard sur les architectures REST ...
XebiCon'16 : GraphQL et Falcor, un nouveau regard sur les architectures REST ...XebiCon'16 : GraphQL et Falcor, un nouveau regard sur les architectures REST ...
XebiCon'16 : GraphQL et Falcor, un nouveau regard sur les architectures REST ...Publicis Sapient Engineering
 
Fork / Join, Parallel Arrays, Lambdas : la programmation parallèle (trop ?) f...
Fork / Join, Parallel Arrays, Lambdas : la programmation parallèle (trop ?) f...Fork / Join, Parallel Arrays, Lambdas : la programmation parallèle (trop ?) f...
Fork / Join, Parallel Arrays, Lambdas : la programmation parallèle (trop ?) f...Normandy JUG
 
SPA avec Angular et SignalR (FR)
SPA avec Angular et SignalR (FR)SPA avec Angular et SignalR (FR)
SPA avec Angular et SignalR (FR)Rui Carvalho
 
Créer des applications Java avec MongoDB
Créer des applications Java avec MongoDBCréer des applications Java avec MongoDB
Créer des applications Java avec MongoDBMongoDB
 
Webinaire 4 de la série Retour aux fondamentaux : Indexation avancée, index d...
Webinaire 4 de la série Retour aux fondamentaux : Indexation avancée, index d...Webinaire 4 de la série Retour aux fondamentaux : Indexation avancée, index d...
Webinaire 4 de la série Retour aux fondamentaux : Indexation avancée, index d...MongoDB
 
201303 - Java8
201303 - Java8201303 - Java8
201303 - Java8lyonjug
 
Comment passer de SEO à SEO + data
Comment passer de SEO à SEO + dataComment passer de SEO à SEO + data
Comment passer de SEO à SEO + dataSEO CAMP
 

Similaire à Presentation (20)

Environnement de développement de bases de données
Environnement de développement de bases de donnéesEnvironnement de développement de bases de données
Environnement de développement de bases de données
 
PostGIS @ Pgday.eu 2009
PostGIS @ Pgday.eu 2009PostGIS @ Pgday.eu 2009
PostGIS @ Pgday.eu 2009
 
Partie1 TypeScript
Partie1 TypeScriptPartie1 TypeScript
Partie1 TypeScript
 
Hands on lab Elasticsearch
Hands on lab ElasticsearchHands on lab Elasticsearch
Hands on lab Elasticsearch
 
Des mises à jour? Emmenez votre application Stitch encore plus loin grâce aux...
Des mises à jour? Emmenez votre application Stitch encore plus loin grâce aux...Des mises à jour? Emmenez votre application Stitch encore plus loin grâce aux...
Des mises à jour? Emmenez votre application Stitch encore plus loin grâce aux...
 
Présentation Google Dataflow
Présentation Google DataflowPrésentation Google Dataflow
Présentation Google Dataflow
 
Node.js, le pavé dans la mare
Node.js, le pavé dans la mareNode.js, le pavé dans la mare
Node.js, le pavé dans la mare
 
Pensez objets avec java
Pensez objets avec javaPensez objets avec java
Pensez objets avec java
 
Stage de fin d’études – dotcloud
Stage de fin d’études – dotcloudStage de fin d’études – dotcloud
Stage de fin d’études – dotcloud
 
Stage de fin d’études – dotcloud
Stage de fin d’études – dotcloudStage de fin d’études – dotcloud
Stage de fin d’études – dotcloud
 
La parallélisation au service de l'optimisation
La parallélisation au service de l'optimisationLa parallélisation au service de l'optimisation
La parallélisation au service de l'optimisation
 
XebiCon'16 : GraphQL et Falcor, un nouveau regard sur les architectures REST ...
XebiCon'16 : GraphQL et Falcor, un nouveau regard sur les architectures REST ...XebiCon'16 : GraphQL et Falcor, un nouveau regard sur les architectures REST ...
XebiCon'16 : GraphQL et Falcor, un nouveau regard sur les architectures REST ...
 
Fork / Join, Parallel Arrays, Lambdas : la programmation parallèle (trop ?) f...
Fork / Join, Parallel Arrays, Lambdas : la programmation parallèle (trop ?) f...Fork / Join, Parallel Arrays, Lambdas : la programmation parallèle (trop ?) f...
Fork / Join, Parallel Arrays, Lambdas : la programmation parallèle (trop ?) f...
 
SPA avec Angular et SignalR (FR)
SPA avec Angular et SignalR (FR)SPA avec Angular et SignalR (FR)
SPA avec Angular et SignalR (FR)
 
Cours de Génie Logiciel / ESIEA 2016-17
Cours de Génie Logiciel / ESIEA 2016-17Cours de Génie Logiciel / ESIEA 2016-17
Cours de Génie Logiciel / ESIEA 2016-17
 
Créer des applications Java avec MongoDB
Créer des applications Java avec MongoDBCréer des applications Java avec MongoDB
Créer des applications Java avec MongoDB
 
Webinaire 4 de la série Retour aux fondamentaux : Indexation avancée, index d...
Webinaire 4 de la série Retour aux fondamentaux : Indexation avancée, index d...Webinaire 4 de la série Retour aux fondamentaux : Indexation avancée, index d...
Webinaire 4 de la série Retour aux fondamentaux : Indexation avancée, index d...
 
Python profiling
Python profilingPython profiling
Python profiling
 
201303 - Java8
201303 - Java8201303 - Java8
201303 - Java8
 
Comment passer de SEO à SEO + data
Comment passer de SEO à SEO + dataComment passer de SEO à SEO + data
Comment passer de SEO à SEO + data
 

Presentation

  • 1. Crowl the World INSTAGRAM Projet final ISN 3ème année ESILV Groupe 18: BIZERAY Jeritiana DEEL Absalon GHEUNG Nicolas HARBEMONT Benoît RUI Alessandro
  • 2. • Multithreading C# - Visual Studio • Classes InstaSharp • Système de Gestion de Base de Donnée – Langage MySQL • Classes et méthodes génériques (Templates) • Fenêtres WPF en C# • Travail d’équipe via mise en place d’un TFS(Team Foundation Server) - Visual Studio Crowl the World Technologies Utilisées Groupe 18
  • 3. Crowl the World Démarche suivie • Découpage en 10 parties pour plus de rapidité (10 comptes Instagram) Zoom sur une partie du traitement. • Coordonnées de Paris • Discrétisation de la ville pour récupérations de Localisations et Medias Groupe 18
  • 4. FONCTIONNEMENT D’UN THREAD POUR RECHERCHE LOCATIONS OU MEDIAS (BALAYAGES) API Thread Recherche Instagram Authentification (Via InstaSharp) Defini les coordonnées à utiliser pour faire la racherche Recherche envoyée à instagram Coordonnées GPS 2 0 20 résultats retournés Mise des resultats dans un buffer Buffer de type HashSet<> IEqualityComparer Thread Mise en BD Récupération de 40 médias selon une fréquence dépendant de la taille du buffer Connexion base de donnée Mise des resultats dans la BD Sleep Variable en fonction de la taille du HashSet Réatribution des nouvelles coordonnées SQL Server Locations iD:BIGINT Name:TEXT Latitude:DOUBLE Longitude:DOUBLE Media iD_Media:LONGTEXT, iD_Media(255) iD_Locations:BIGINT latitude_Locations:DOUBLE longitude_Locations:DOUBLE user_Name:TEXT Groupe 18 40 résultats
  • 5. FONCTIONNEMENT D’UN THREAD POUR RECHERCHE MEDIAS OU USERS (LECTURE TXT) API Thread Recherche Instagram Authentification (Via InstaSharp) Lecture dans le fichier texte de la coordonnée ou du UserName Recherche envoyée à instagram Coordonnées GPS 2 0 20 résultats retournés Mise des resultats dans un buffer Buffer de type HashSet<> IEqualityComparer Thread Mise en BD Récupération de 40 médias selon une fréquence dépendant de la taille du buffer 40 résultats SQL Server Connexion base de donnée Mise des resultats dans la BD Sleep Variable en fonction de la taille du HashSet Réatribution des nouvelles coordonnées ou nouveau userName Users iD_User:BIGINT user_name:TEXT full_name:TEXT Media iD_Media:LONGTEXT, iD_Media(255) iD_Locations:BIGINT latitude_Locations:DOUBLE longitude_Locations:DOUBLE user_Name:TEXT Groupe 18
  • 6. MODELE VUE CONTROLEUR Instagram API (Abstraite) Locations … +Locations(InstagramConfig config) +Search(double latitude, double longitude, double? distance): Task<LocationsResponse> Medias +Medias(InstagramConfig config) +Search(double latitude, double longitude, int? distance): Task<MediasResponse> Users +Users(InstagramConfig config) +SearchSearch(string searchTerm, int? count) Task<UsersResponse> InstagramConfig +InstagramConfig(string clientId, string clientSecret, string redirectUri, string callbackUri) Authentification + Authentification(string iden) ex isn1,isn2,isn10… EndPoints Crowl the World Groupe 18
  • 7. MODELE VUE CONTROLEUR Model_Comparer(Abstraite) LocationComparer … +public LocationComparer() +Equals(Location l1, Location l2):bool +GetHashCode(Location l):int MediaComparer +public MediaComparer() +Equals(Media l1, Media l2):bool +GetHashCode(Media l):int UserComparer +public UserComparer() +Equals(User l1, User l2):bool +GetHashCode(User l):int IEqualityComparer<User>IEqualityComparer<Media> IEqualityComparer<Location> Model_Pers(Abstraite) … Location +Id:int +Latitude:decimal +Longitude:decimal +Name:String Media +ID:string +Location :Location +User:string +Type : string … UserInfo +fullname:string +id:string +username:string Crowl the World Groupe 18
  • 8. MODELE VUE CONTROLEUR RequeteAPI (Abstraite) -compteur:int -g1:Gestion_BD -synchro:object -threadEnCours:int -threadBuffer:Thread +public RequeteAPI(int threadEnCours) Balayage_Generique<type, typecomparer> where type : InstaSharp.Models.Model_Pers where typecomparer : IEqualityComparer<type>, new() -latitudemin, latitudemax:double -longitudemin, longitudemax:double -variationCoordonees:double -rayon:double -bufferListeLM: HashSet<type> +public public Balayage_Generique(string city, double rayon, double variationCoordonees, int threadEnCours) : base(threadEnCours) +RetourneNombreDeBoucles(), RetournePasDeDeplacement:double +DistanceFromCoordinates(double latitude1, double longitude1, double latitude2, double longitude2):double +AjouterDansLeBuffer(double longi, double lati, InstaSharp.Endpoints.InstagramApi metadonnee) +SauvegardeBalayage(double longi, double lati) +Balayage(Authentification a, CoordonneesDepart c) + BufferToBD() +TotalTourBoucle() LectureTXT_Generique<type, typecomparer> where type : InstaSharp.Models.Model_Pers where typecomparer : IEqualityComparer<type>, new() -bufferListeMU: HashSet<type> +public LectureTXT_Generique(int threadEnCours) : base(threadEnCours) +RecupererToutLesIdLocationsEtUserNames(int nbThreadsDispos) +RequeteMedia(long id, string place, double latitude, double longitude, InstaSharp.Endpoints.Media muAPIwR) +RequeteUser(string userName, InstaSharp.Endpoints.Users muAPIwR) +MettreDansLeBuffer(List<type> resultListeMU) +NombresDeBoucles():long +RecueillirMediaUserEtMetDansLeHashSet(InstaSharp.Endpoints.Ins tagramApi mediauser) +ChargerSauvegardeMediaPuisRepartir(StreamReader monStreamReaderFichierSource, string ligneFichierSource, InstaSharp.Endpoints.InstagramApi mediauser) +ChargerSauvegardeUserPuisRepartir(StreamReader monStreamReaderFichierSource, string ligneFichierSource, InstaSharp.Endpoints.InstagramApi mediauser) +BufferToBD() +FaireRequeteMediaUser(Authentification a) GestionBD -connection: MySqlConnection +task { location, media, user }: enum + public GestionBD() + TryCreateTable(string nomDeLaTable, string arguments) + NombreLigneBD(string table) + CreationFichier(MySqlDataReader reader, int thread, task todo) + FaireRequeteSQLPourCreationTXT(string TOSELECT, string TABLE, int nbThreadsDispos, task toDo) + InsertMedia(HashSet<InstaSharp.Models.Media> list) + InsertLocation(HashSet<InstaSharp.Models.Location> list) + InsertUser(HashSet<InstaSharp.Models.User> list) + InsertGenerique<TypeInserer>(HashSet<TypeInserer> list) where TypeInserer : InstaSharp.Models.Model_Pers Crowl the World Groupe 18
  • 9. MODELE VUE CONTROLEUR • Entièrement réalisé en C# • Un button par compte Instagram • Une barre de progression par compte Gérés par des dictionnaires: Dictionary<int, Button> dicoButton,Dictionary<int, ProgressBar> dicoProgressBar Où int représente le numéro de compte(thread) à lancer Crowl the World Groupe 18
  • 10. RÉSULTATS Points Photos des 5 derniers jours (⋍12000) Localisations (⋍220.000 en BD, 45.000 représentées ici) Crowl the World Groupe 18