Projet 2016 · Analyse de flux Facebook

Objectifs
L'objectif de ce projet est de vérifier que vous maîtrisez les principes vus en cours de programmation avancée comme les structures de données complexes, lecture / écriture de fichiers, compilation séparée et automatique, utilisation de gestionnaire de version...

Ce dépôt GIT contient le sujet et les données utiles pour la réalisation du petit projet du module de Programmation Avancée.

Résumé

L’objectif de ce projet est de vérifier que vous maîtrisez les principes vus en cours de programmation avancée: structures de données complexes, lecture / écriture de fichiers, compilation séparée et automatique, utilisation de gestionnaires de version…

Pour cela, le travail demandé est de réaliser une application d’analyse de flux facebook. La récupération de flux a été préalablement faite et stockée dans des fichiers texte (au format yaml). Vous êtes donc en charge de finaliser l’application: charger les fichiers de données et les analyser.

Contexte

Pour la majorité d’entre vous, vous avez certainement vécu votre première campagne BDE à Polytech et vous connaissez l’équipe gagnante (i.e. Poly’Eagles). Il peut être intéressant d’analyser la corrélation entre le dynamisme d’une liste et le résultat final. Étant donné que les équipes communiquent beaucoup sur facebook, il est possible d’estimer le dynamisme d’une équipe avec le nombre de messages postés et sa popularité avec le nombre de “likes” obtenus.

facebook offre aux développeurs la possibilité d’extraire automatiquement, via une API (Application Program Interface), les données publiques pour réaliser de nouvelles applications ou pour faire du traitement statistique sur ces données. Cette API n’étant pas disponible en langage C, cette étape a été préalablement faite: les flux d’activités ont été extraits et ont été stockés au format yaml sur ce dépôt GIT. Le format yaml est un format simple et léger de représentation des données (voir les explications sur la syntaxe en annexe). Voici une partie de fichier yaml extrait:

-
  id: "552296884937956_1095145150538262"
  created_time: "2016-03-03T14:13:12+0000"
  story: "Les Razmotech added an event."
  name: "SOIREE LE NETWORK - Les Razmotech"
  description: "SOIREE LE NETWORK - Les Razmotech"
  likes:
    -
      id: 10207749038100142
      name: "Léa"
    -
      id: 191654097869736
      name: "Pauline"
    -
      id: 10204272633399945
      name: "Lorene"
    -
      id: 10205638972085656
      name: "Sophie"
-
  id: 552296884937956_553430121491299
  created_time: "2016-03-03T10:24:43+0000"
  messsage: "*** FLASH INFO ***Pas de chasse au trésor aujourd'hui mais ne vous inquiétez pas ! De nombreux lots seront à gagner lors des activités !<3 Bisous ! <3"
  likes:
    -
      id: 10207749038100142
      name: "Léa"

Sur ce fichier, 2 posts du flux sont présents. Chaque post possède un identifiant id, une date de création created_time, la liste des personnes qui ont liké le post (avec leur nom name et leur identifiant id) et le contenu du post: avec uniquement un champ message s’il s’agit de text soit sous forme d’une histoire (photo, événement) avec un champ story, un champ name et un champ description.

Important: même si les données extraites sont des données publiques (et donc accessible par n’importe qui), les noms de famille des personnes qui ont liké les posts ont été volontairement supprimés pour anonymiser partiellement les données. Pour la même raison les commentaires, également accessibles via l’API, n’ont pas été extraits.

Via le contenu de ses fichiers, il est donc possible d’analyser l’activité de la liste (nombre de messages, nombre d’événements…) et d’estimer la popularité en comptant le nombre de likes.

Cahier des charges

Il vous est demandé de réaliser un programme qui charge les fichiers de données extraits par l’API de facebook et analyse les données contenues. Un utilisateur de votre programme doit par exemple pouvoir afficher le nombre de posts d’une liste, le nombre total de likes, le nombre moyen de likes par posts, quel est le post qui a été le plus liké… De même il doit être également possible d’afficher quels ont été les posts likés par une personne donnée, de lister les personnes qui ont liké des posts dans les deux listes… Comme vous pouvez le constater, un grand nombre de requêtes sont possibles. A minima votre programme devra:

Le volume de données est relativement important, par conséquent un soin particulier devra être apporté aux structures de données utilisées et à la rapidité d’exécution de votre programme. Les choix algorithmiques devront obligatoirement être expliqués et justifiés dans votre rapport.

Déliverables

La date de fin de projet est le dimanche 19 juin 2016 23:59 CEST. Tout retard entraînera des pénalités.

Vous n’avez rien à imprimer, ni des documents à envoyer par e-mail. Il faudra donner l’accès du dépôt à votre correcteur et celui-ci corrigera à partir de la dernière version du dépôt ou de la branche release (si elle existe) avant la date limite. Les push suivants ne seront pas considérés.

Sur votre dépôt devront figurer :

Annexes

Pour démarrer

Pour commencer à travailler, vous pouvez récupérer le dépôt qui contient le fichier README.md que vous êtes en train de lire ainsi que les données via la commande:

git clone https://archives.plil.fr/jdequidt/ima3_tutorat_pa_2016.git

Ensuite vous pouvez créer un nouveau dépôt sur https://archives.plil.fr, les explications sont très détaillées pour savoir comment créer soit un projet vide, soit créer un projet qui se base sur ima3_tutorat_pa_2016.git. Ne pas oublier d’ajouter votre correcteur dans la liste des personnes ayant accès à votre dépôt (menu Settings à droite puis Menu Members puis bouton New Projet Member).

On rappelle brièvement les commandes GIT que vous serez amené à utiliser:

N’hésitez pas à vous référer au polycopié de programmation avancée pour les détails de chacune des commandes.

Quelques indications

Comme vous l’aurez remarqué, ce projet repose beaucoup sur la manipulation de chaînes de caractères. Vous pouvez utiliser toutes les fonctions de string.h, en particulier :

#include <string.h>

size_t  strlen(const char *s); // la taille
char*   strcpy(char *restrict dst, const char *restrict src); // copie
int     strcmp(const char *s1, const char *s2); // comparaison
char*   strcat(char *restrict s1, const char *restrict s2); // concaténation
char*   strpbrk(const char *s1, const char *s2); // détecter des caractères
char*   strtok(char *restrict str, const char *restrict sep); // couper une chaîne suivant des séparateurs

Pour chacune de ces fonctions, n’hésitez pas à consulter l’aide dans le terminal via la commande man nom_de_la_fonction.

Enfin on rappelle les caractères spéciaux que vous êtes susceptibles de rencontrer:

Fichiers yaml

Une documentation complète est disponible ici ou .

Grille d’évaluation

Dépôt GIT

Critère \ Maîtrise D C B A
Travail réparti Un seul membre du binôme a travaillé (malus pour l’autre membre du binôme)     Les deux binômes ont travaillé ensemble sur le projet
Travail régulier Pas de commits Un seul commit en fin de projet Moins de 5 commits Commits réguliers pendant et hors séances de projet
Qualité du dépôt Pas de structuration, fichiers temporaires, produits de compilation, fichiers identiques multipliés, ni branches / ni tags Structuré mais fichiers parasites et 0 tags / branches Structuré sans fichiers parasites, pas de tags Structuré, sans fichiers parasites, avec tags et/ou branches

Makefile

Critère \ Maîtrise D C B A
Présence / Utilité Pas de Makefile ou script bash Makefile incomplet (manque de cibles, d’options) Makefile presque complet mais mal / peu commenté Makefile complet et commenté
Structuration Pas de structuration / pas d’options À peu près structuré mais pas d’options Structuré mais pas d’option de compilation, factorisation perfectible Bien structuré et factorisé, choix de compilation (debug vs release)
Variables Pas de variables Quelques Variables externes Quelques variables internes et variables externes Utilisation de variables internes et externes

Compilation / Exécution

Critère \ Maîtrise D C B A
Compilation Ne compile pas (erreurs) Compile avec warnings Compile avec warnings (en -Wall uniquement) Compile sans Warning avec Wall activé
Exécution Ne s’exécute pas S’exécute avec un segfault à la fin S’exécute partiellement S’exécute correctement
README.MD Pas présent sur le dépôt Présent mais au mauvais format (txt…) Présent, au bon format mais pas clair Présent et explique clairement l’utilisation du programme

Code : remarques générales

Critère \ Maîtrise D C B A
Lisibilité Code non indenté, magic numbers, noms pas explicites, pas de commentaires Code partiellement indenté, peu de commentaires Code indenté avec commentaires, variables / fonctions peu explicites et magic numbers Code bien indenté, lisible, pas de magic numbers, variables / fonctions explicites / commentaires
Structuration un seul fichier, structuration partielle en fonctions plusieurs fichiers, structuration partielle en fonction plusieurs fichiers, structuration en fonctions, duplication de code Plusieurs fichiers, structurés, code bien factorisé
Localité des variables Beaucoup de variables globales, scope trop large Peu de variable globales (et justifiées quand il y en a), scope des variables trop large Pas de variables globales, scope des variables locales trop large Pas de variables globales (ou alors présence justifiée), scope des variables adapté
Initialisation des variables Aucune initialisation Quelques pointeurs initialisés Tous les pointeurs sont initialisés et quelques variables Pointeurs et variables sont correctement initialisés
Code de retours des fonctions Ne teste aucun code de retours Quelques codes de retours sont testés Les codes de retours des fonctions systèmes sont testés (malloc, fopen,…) Toutes les codes de retours de fonctions sont testés
Gestion de la mémoire Aucun free de la mémoire allouée dynamiquement Quelques free La majorité de la mémoire dynamique est libérée Toute la mémoire allouée dynamiquement est libérée
Gestion des fichiers Les fichiers ne sont pas bien ouverts et pas fermés Les fichiers ne sont pas ouvert dans le bon mode et certains ne sont pas fermés Les fichiers sont ouverts dans le bon mode et la majorité sont fermés Les fichiers sont ouverts dans le bon mode et bien fermés après utilisation

Code : remarques spécifiques

Critère \ Maîtrise D C B A
Structures de données Structures de données inadaptées et mauvaise implémentation Structures de données inadaptées mais bien implémentées Structures de données pertinentes mais implémentation perfectible Structures de données pertinentes et bien implementées
Lecture de fichier et remplissage de la SD Ne fonctionne pas Lecture partiellement OK et remplissage très incomplet de la SD Lecture OK certaines lignes sont mal analysées (caractères spéciaux par exemple) Lecture OK, tous les éléments sont bien analysés
Cahier des Charges - Q1 (comptage) Ne fonctionne pas Comptage faux Comptage OK mais algorithmes inutilement complexe (trop de boucles…) Comptage des posts et Likes OK
Cahier des Charges - Q2 (recherche) Ne fonctionne pas Fonctionne partiellement (résultat faux) Recherche OK mais non-optimale (SD pas adaptée) Recherche OK et efficace
Cahier des Charges - Q3 (recherche multiple) Ne fonctionne pas Fonctionne partiellement (résultat faux) Recherche OK mais non-optimale (SD pas adaptée, mauvaise gestion des doublons) Recherche OK et efficace
Cahier des Charges - Q4 (intersection) Ne fonctionne pas Fonctionne partiellement (résultat faux) Intersection OK mais non-optimale (SD pas adaptée, mauvaise gestion des doublons) Intersection OK et efficace
Cahier des Charges - Q5 (évaluation) Non traitée   Traitée mais pas pertinente Traitée et pertinente

Rapport

Critère \ Maîtrise D C B A
Format et taille Autre que PDF   PDF mais non respect de la limite de pages PDF et respect du nombre de pages
Structuration en partie Pas de structure Structure mais pas de plan au début Plan OK mais structuration non pertinente (résolution avant explication de la SD par exemple) Structuré et découpage cohérent
Intro / Conclusion Aucun des deux L’un ou l’autre   Intro et Conclusion
Précisions du CdC Pas mentionnées Adaptations contraires au CdC Adaptations OK avec le CdC mais non justifiées Mentionnées et justifiées
Justifications SD et algos ne sont pas justifiés SD justifiées mais pas algos SD justifiées et partiellement pour les algos SD et algos clairement justifiés
Limitations Limitations existantes ne sont pas mentionnées Certaines limitations sont mentionnées Limitations évoquées Limitations évoquées et pistes de résolutions proposées